Add configurable manifest-driven race audio system

This commit is contained in:
larssand
2026-08-28 13:29:27 +02:00
parent 3f3b410869
commit 5f79228941
22 changed files with 1133 additions and 109 deletions

View File

@@ -1,66 +1,91 @@
{
"format": {
"sample_rate": 48000,
"channels": 1,
"pcm": "16-bit",
"recommended_runtime_gain_db": -6
},
"format": { "sample_rate": 48000, "channels": 1, "pcm": "16-bit", "recommended_runtime_gain_db": -6 },
"effects": [
"fastest_lap_trophy.wav",
"final_lap.wav",
"personal_best.wav",
"position_gain.wav",
"position_loss.wav",
"race_finish.wav",
"start_beep.wav",
"track_record_fanfare.wav",
"transponder_pass.wav",
"warning.wav"
"fastest_lap_trophy.wav", "final_lap.wav", "personal_best.wav", "position_gain.wav", "position_loss.wav",
"race_finish.wav", "start_beep.wav", "track_record_fanfare.wav", "transponder_pass.wav", "warning.wav"
],
"events": {
"start_tone": { "effect": "effects/start_beep.wav" },
"transponder_pass": { "effect": "effects/transponder_pass.wav" },
"transponder_detected": { "effect": "effects/transponder_pass.wav" },
"entering_pits": { "effect": "effects/transponder_pass.wav" },
"leaving_pits": { "effect": "effects/transponder_pass.wav" },
"personal_best": { "effect": "effects/personal_best.wav" },
"fastest_lap": { "effect": "effects/fastest_lap_trophy.wav" },
"track_record": { "effect": "effects/track_record_fanfare.wav" },
"position_gain": { "effect": "effects/position_gain.wav" },
"position_loss": { "effect": "effects/position_loss.wav" },
"final_lap": { "effect": "effects/final_lap.wav" },
"race_finished": { "effect": "effects/race_finish.wav" },
"qualifying_finished": { "effect": "effects/race_finish.wav" },
"race_winner": { "effect": "effects/fastest_lap_trophy.wav" },
"heat_winner": { "effect": "effects/fastest_lap_trophy.wav" },
"overall_winner": { "effect": "effects/fastest_lap_trophy.wav" },
"race_10_seconds": { "effect": "effects/warning.wav" },
"ten_seconds_remaining": { "effect": "effects/warning.wav" },
"time_expired": { "effect": "effects/warning.wav" },
"track_call": { "effect": "effects/warning.wav" },
"yellow_flag": { "effect": "effects/warning.wav" },
"red_flag": { "effect": "effects/warning.wav" },
"false_start": { "effect": "effects/warning.wav" },
"race_paused": { "effect": "effects/warning.wav" },
"marshal_warning": { "effect": "effects/warning.wav" },
"marshal_required": { "effect": "effects/warning.wav" },
"penalty": { "effect": "effects/warning.wav" },
"stop_and_go": { "effect": "effects/warning.wav" },
"drive_through": { "effect": "effects/warning.wav" },
"disqualified": { "effect": "effects/warning.wav" },
"pit_speed_warning": { "effect": "effects/warning.wav" },
"timing_disconnected": { "effect": "effects/warning.wav" },
"unknown_transponder": { "effect": "effects/warning.wav" },
"audio_test": { "effect": "effects/start_beep.wav" }
},
"voice_events": {
"en": {
"race_1_minute": "Race starts in one minute.",
"race_30_seconds": "Thirty seconds to start.",
"drivers_ready": "Drivers, stand by.",
"start_phrase": "Starting on the sound of the tone.",
"personal_best": "Personal best!",
"fastest_lap": "Fastest lap!",
"track_record": "New track record!",
"new_leader": "We have a new race leader.",
"one_minute_remaining": "One minute remaining.",
"thirty_seconds_remaining": "Thirty seconds remaining.",
"final_lap": "Final lap.",
"time_expired": "Time has expired. Finish the lap you are on.",
"race_finished": "Race is finished.",
"race_winner": "Race winner!"
"grid_open": "The starting grid is open.", "grid_closed": "The starting grid is closed.",
"race_1_minute": "Race starts in one minute.", "race_30_seconds": "Thirty seconds to start.", "race_10_seconds": "Ten seconds to start.",
"drivers_ready": "Drivers, stand by.", "start_sequence": "Starting on the sound of the tone.", "false_start": "False start.", "restart_race": "Prepare to restart the race.",
"personal_best": "Personal best. {driverName}. {lapTime}.", "fastest_lap": "Fastest lap. {driverName}. {lapTime}.",
"track_record": "New track record. {driverName}. {lapTime}.", "new_leader": "New race leader. {driverName}.",
"final_lap": "Final lap.", "one_minute_remaining": "One minute remaining.", "thirty_seconds_remaining": "Thirty seconds remaining.",
"ten_seconds_remaining": "Ten seconds remaining.", "time_expired": "Time has expired. Finish the lap you are on.", "race_finished": "Race is finished.",
"track_call": "Track call. Track call.", "track_clear": "Track is clear.", "yellow_flag": "Yellow flag.", "red_flag": "Red flag. Stop all cars.",
"race_paused": "Race paused.", "race_resumed": "Race resumed.", "marshal_warning": "Marshal warning.",
"marshal_required": "Marshal required at post {marshalPost}.", "penalty": "Penalty for {driverName}.",
"stop_and_go": "Stop and go penalty for {driverName}.", "drive_through": "Drive through penalty for {driverName}.", "disqualified": "{driverName} is disqualified.",
"pit_lane_open": "Pit lane is open.", "pit_lane_closed": "Pit lane is closed.", "pit_speed_warning": "Pit lane speed warning for {driverName}.",
"qualifying_start": "Qualifying is starting.", "qualifying_remaining": "Qualifying time remaining: {time}.", "qualifying_finished": "Qualifying is finished.",
"provisional_pole": "Provisional pole. {driverName}.", "pole_position": "Pole position. {driverName}.",
"race_winner": "Race winner. {driverName}.", "second_place": "Second place. {driverName}.", "third_place": "Third place. {driverName}.",
"podium": "Podium: {podium}.", "heat_winner": "Heat winner. {driverName}.", "overall_winner": "Overall winner. {driverName}.",
"timing_connected": "Timing system connected.", "timing_disconnected": "Timing system disconnected.",
"unknown_transponder": "Unknown transponder {transponder}.", "audio_test": "Race audio test."
},
"sv": {
"race_1_minute": "Start om en minut.",
"race_30_seconds": "Trettio sekunder till start.",
"drivers_ready": "Förare, gör er redo.",
"start_phrase": "Start på signalen.",
"personal_best": "Personbästa!",
"fastest_lap": "Snabbaste varv!",
"track_record": "Nytt banrekord!",
"new_leader": "Vi har en ny ledare.",
"one_minute_remaining": "En minut kvar.",
"thirty_seconds_remaining": "Trettio sekunder kvar.",
"final_lap": "Sista varvet.",
"time_expired": "Tiden är slut. Slutför pågående varv.",
"race_finished": "Racet är avslutat.",
"race_winner": "Segrare!"
"grid_open": "Startfältet är öppet.", "grid_closed": "Startfältet är stängt.",
"race_1_minute": "Start om en minut.", "race_30_seconds": "Trettio sekunder till start.", "race_10_seconds": "Tio sekunder till start.",
"drivers_ready": "Förare, gör er redo.", "start_sequence": "Start på signalen.", "false_start": "Felaktig start.", "restart_race": "Förbered omstart.",
"personal_best": "Personbästa. {driverName}. {lapTime}.", "fastest_lap": "Snabbaste varv. {driverName}. {lapTime}.",
"track_record": "Nytt banrekord. {driverName}. {lapTime}.", "new_leader": "Ny ledare. {driverName}.",
"final_lap": "Sista varvet.", "one_minute_remaining": "En minut kvar.", "thirty_seconds_remaining": "Trettio sekunder kvar.",
"ten_seconds_remaining": "Tio sekunder kvar.", "time_expired": "Tiden är slut. Slutför pågående varv.", "race_finished": "Racet är avslutat.",
"track_call": "Stopp på banan. Stopp på banan.", "track_clear": "Banan är fri.", "yellow_flag": "Gul flagg.", "red_flag": "Röd flagg. Stoppa alla bilar.",
"race_paused": "Racet är pausat.", "race_resumed": "Racet fortsätter.", "marshal_warning": "Varning till banvakt.",
"marshal_required": "Banvakt behövs vid post {marshalPost}.", "penalty": "Bestraffning för {driverName}.",
"stop_and_go": "Stop and go för {driverName}.", "drive_through": "Drive through för {driverName}.", "disqualified": "{driverName} är diskvalificerad.",
"pit_lane_open": "Depån är öppen.", "pit_lane_closed": "Depån är stängd.", "pit_speed_warning": "Varning för hög fart i depån för {driverName}.",
"qualifying_start": "Kvalet startar.", "qualifying_remaining": "Kvaltid kvar: {time}.", "qualifying_finished": "Kvalet är avslutat.",
"provisional_pole": "Preliminär pole. {driverName}.", "pole_position": "Pole position. {driverName}.",
"race_winner": "Segrare. {driverName}.", "second_place": "Andra plats. {driverName}.", "third_place": "Tredje plats. {driverName}.",
"podium": "Prispall: {podium}.", "heat_winner": "Heatsegrare. {driverName}.", "overall_winner": "Totalsegrare. {driverName}.",
"timing_connected": "Tidtagningen är ansluten.", "timing_disconnected": "Tidtagningen är frånkopplad.",
"unknown_transponder": "Okänd transponder {transponder}.", "audio_test": "Test av raceljud."
}
},
"runtime": {
"start_delay_seconds": {
"min": 1.0,
"max": 4.0,
"randomize": true
},
"passing_sound": "effects/transponder_pass.wav",
"start_sound": "effects/start_beep.wav",
"fastest_lap_sound": "effects/fastest_lap_trophy.wav",
"track_record_sound": "effects/track_record_fanfare.wav",
"finish_sound": "effects/race_finish.wav"
"start_delay_seconds": { "min": 1.0, "max": 4.0, "randomize": true },
"passing_sound": "effects/transponder_pass.wav", "passing_sound_pool": ["pass_01.wav", "pass_02.wav", "pass_03.wav", "pass_04.wav", "pass_05.wav", "pass_06.wav", "pass_07.wav", "pass_08.wav"],
"start_sound": "effects/start_beep.wav", "fastest_lap_sound": "effects/fastest_lap_trophy.wav",
"track_record_sound": "effects/track_record_fanfare.wav", "finish_sound": "effects/race_finish.wav"
}
}
}