@adatechnology/game-audio 0.3.6 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -0
- package/assets/sfx/CREDITOS.md +1046 -0
- package/assets/sfx/ambiente/ambience_city_day_01.ogg +0 -0
- package/assets/sfx/ambiente/ambience_city_day_02.ogg +0 -0
- package/assets/sfx/ambiente/ambience_construction_01.ogg +0 -0
- package/assets/sfx/ambiente/ambience_night_01.ogg +0 -0
- package/assets/sfx/ambiente/ambience_room_tone_01.ogg +0 -0
- package/assets/sfx/ambiente/ambience_room_tone_02.ogg +0 -0
- package/assets/sfx/ambiente/ambience_rural_day_01.ogg +0 -0
- package/assets/sfx/ambiente/ambience_rural_day_02.ogg +0 -0
- package/assets/sfx/ambiente/rain_loop_01.ogg +0 -0
- package/assets/sfx/ambiente/water_river_loop_01.ogg +0 -0
- package/assets/sfx/ambiente/water_river_loop_02.ogg +0 -0
- package/assets/sfx/ambiente/water_river_loop_03.ogg +0 -0
- package/assets/sfx/ambiente/water_splash_01.ogg +0 -0
- package/assets/sfx/ambiente/water_splash_02.ogg +0 -0
- package/assets/sfx/ambiente/water_splash_03.ogg +0 -0
- package/assets/sfx/ambiente/water_splash_04.ogg +0 -0
- package/assets/sfx/ambiente/water_splash_05.ogg +0 -0
- package/assets/sfx/ambiente/water_splash_06.ogg +0 -0
- package/assets/sfx/ambiente/water_splash_07.ogg +0 -0
- package/assets/sfx/ambiente/water_splash_08.ogg +0 -0
- package/assets/sfx/ambiente/water_splash_09.ogg +0 -0
- package/assets/sfx/ambiente/water_splash_10.ogg +0 -0
- package/assets/sfx/ambiente/water_splash_11.ogg +0 -0
- package/assets/sfx/ambiente/water_splash_12.ogg +0 -0
- package/assets/sfx/ambiente/water_splash_13.ogg +0 -0
- package/assets/sfx/ambiente/water_splash_14.ogg +0 -0
- package/assets/sfx/ambiente/water_splash_15.ogg +0 -0
- package/assets/sfx/armas/bolt_lift_medium_01.ogg +0 -0
- package/assets/sfx/armas/bolt_lift_medium_02.ogg +0 -0
- package/assets/sfx/armas/bolt_lift_medium_03.ogg +0 -0
- package/assets/sfx/armas/bolt_lift_medium_04.ogg +0 -0
- package/assets/sfx/armas/bolt_lift_medium_05.ogg +0 -0
- package/assets/sfx/armas/bolt_lock_medium_01.ogg +0 -0
- package/assets/sfx/armas/bolt_lock_medium_02.ogg +0 -0
- package/assets/sfx/armas/bolt_lock_medium_03.ogg +0 -0
- package/assets/sfx/armas/bolt_lock_medium_04.ogg +0 -0
- package/assets/sfx/armas/bolt_lock_medium_05.ogg +0 -0
- package/assets/sfx/armas/bolt_pull_heavy_01.ogg +0 -0
- package/assets/sfx/armas/bolt_pull_medium_01.ogg +0 -0
- package/assets/sfx/armas/bolt_pull_medium_02.ogg +0 -0
- package/assets/sfx/armas/bolt_pull_medium_03.ogg +0 -0
- package/assets/sfx/armas/bolt_pull_medium_04.ogg +0 -0
- package/assets/sfx/armas/bolt_pull_medium_05.ogg +0 -0
- package/assets/sfx/armas/bolt_pull_medium_06.ogg +0 -0
- package/assets/sfx/armas/bolt_push_heavy_01.ogg +0 -0
- package/assets/sfx/armas/bolt_push_medium_01.ogg +0 -0
- package/assets/sfx/armas/bolt_push_medium_02.ogg +0 -0
- package/assets/sfx/armas/bolt_push_medium_03.ogg +0 -0
- package/assets/sfx/armas/bolt_push_medium_04.ogg +0 -0
- package/assets/sfx/armas/bolt_push_medium_05.ogg +0 -0
- package/assets/sfx/armas/bolt_push_medium_06.ogg +0 -0
- package/assets/sfx/armas/casing_drop_concreto_01.ogg +0 -0
- package/assets/sfx/armas/casing_drop_concreto_02.ogg +0 -0
- package/assets/sfx/armas/casing_drop_concreto_03.ogg +0 -0
- package/assets/sfx/armas/casing_drop_metal_01.ogg +0 -0
- package/assets/sfx/armas/casing_drop_metal_02.ogg +0 -0
- package/assets/sfx/armas/casing_drop_metal_03.ogg +0 -0
- package/assets/sfx/armas/casing_drop_terra_01.ogg +0 -0
- package/assets/sfx/armas/casing_drop_terra_02.ogg +0 -0
- package/assets/sfx/armas/casing_drop_terra_03.ogg +0 -0
- package/assets/sfx/armas/charging_handle_pull_light_01.ogg +0 -0
- package/assets/sfx/armas/charging_handle_pull_light_02.ogg +0 -0
- package/assets/sfx/armas/charging_handle_pull_light_03.ogg +0 -0
- package/assets/sfx/armas/charging_handle_pull_light_04.ogg +0 -0
- package/assets/sfx/armas/charging_handle_pull_medium_01.ogg +0 -0
- package/assets/sfx/armas/charging_handle_pull_medium_02.ogg +0 -0
- package/assets/sfx/armas/charging_handle_pull_medium_03.ogg +0 -0
- package/assets/sfx/armas/charging_handle_pull_medium_04.ogg +0 -0
- package/assets/sfx/armas/charging_handle_pull_medium_05.ogg +0 -0
- package/assets/sfx/armas/charging_handle_release_medium_01.ogg +0 -0
- package/assets/sfx/armas/charging_handle_release_medium_02.ogg +0 -0
- package/assets/sfx/armas/charging_handle_release_medium_03.ogg +0 -0
- package/assets/sfx/armas/charging_handle_release_medium_04.ogg +0 -0
- package/assets/sfx/armas/charging_handle_release_medium_05.ogg +0 -0
- package/assets/sfx/armas/cylinder_close_light_01.ogg +0 -0
- package/assets/sfx/armas/cylinder_close_light_02.ogg +0 -0
- package/assets/sfx/armas/cylinder_close_light_03.ogg +0 -0
- package/assets/sfx/armas/cylinder_close_light_04.ogg +0 -0
- package/assets/sfx/armas/cylinder_close_light_05.ogg +0 -0
- package/assets/sfx/armas/cylinder_eject_light_01.ogg +0 -0
- package/assets/sfx/armas/cylinder_eject_light_02.ogg +0 -0
- package/assets/sfx/armas/cylinder_eject_light_03.ogg +0 -0
- package/assets/sfx/armas/cylinder_open_light_01.ogg +0 -0
- package/assets/sfx/armas/cylinder_open_light_02.ogg +0 -0
- package/assets/sfx/armas/cylinder_open_light_03.ogg +0 -0
- package/assets/sfx/armas/cylinder_open_light_04.ogg +0 -0
- package/assets/sfx/armas/cylinder_open_light_05.ogg +0 -0
- package/assets/sfx/armas/lever_close_medium_01.ogg +0 -0
- package/assets/sfx/armas/lever_close_medium_02.ogg +0 -0
- package/assets/sfx/armas/lever_open_medium_01.ogg +0 -0
- package/assets/sfx/armas/lever_open_medium_02.ogg +0 -0
- package/assets/sfx/armas/mag_out_heavy_01.ogg +0 -0
- package/assets/sfx/armas/mag_out_heavy_02.ogg +0 -0
- package/assets/sfx/armas/mag_out_light_01.ogg +0 -0
- package/assets/sfx/armas/mag_out_light_02.ogg +0 -0
- package/assets/sfx/armas/mag_out_light_03.ogg +0 -0
- package/assets/sfx/armas/mag_out_light_04.ogg +0 -0
- package/assets/sfx/armas/mag_out_medium_01.ogg +0 -0
- package/assets/sfx/armas/mag_out_medium_02.ogg +0 -0
- package/assets/sfx/armas/mag_out_medium_03.ogg +0 -0
- package/assets/sfx/armas/mag_seat_heavy_01.ogg +0 -0
- package/assets/sfx/armas/mag_seat_heavy_02.ogg +0 -0
- package/assets/sfx/armas/mag_seat_light_01.ogg +0 -0
- package/assets/sfx/armas/mag_seat_light_02.ogg +0 -0
- package/assets/sfx/armas/mag_seat_light_03.ogg +0 -0
- package/assets/sfx/armas/mag_seat_light_04.ogg +0 -0
- package/assets/sfx/armas/mag_seat_light_05.ogg +0 -0
- package/assets/sfx/armas/mag_seat_light_06.ogg +0 -0
- package/assets/sfx/armas/mag_seat_medium_01.ogg +0 -0
- package/assets/sfx/armas/mag_seat_medium_02.ogg +0 -0
- package/assets/sfx/armas/mag_seat_medium_03.ogg +0 -0
- package/assets/sfx/armas/pistol_22lr_close_01.ogg +0 -0
- package/assets/sfx/armas/pistol_22lr_close_02.ogg +0 -0
- package/assets/sfx/armas/pistol_22lr_far_01.ogg +0 -0
- package/assets/sfx/armas/pistol_22lr_far_02.ogg +0 -0
- package/assets/sfx/armas/pistol_22lr_far_03.ogg +0 -0
- package/assets/sfx/armas/pistol_22lr_far_04.ogg +0 -0
- package/assets/sfx/armas/pistol_45_close_01.ogg +0 -0
- package/assets/sfx/armas/pistol_45_close_02.ogg +0 -0
- package/assets/sfx/armas/pistol_45_close_03.ogg +0 -0
- package/assets/sfx/armas/pistol_45_close_04.ogg +0 -0
- package/assets/sfx/armas/pistol_45_close_05.ogg +0 -0
- package/assets/sfx/armas/pistol_45_far_01.ogg +0 -0
- package/assets/sfx/armas/pistol_45_far_02.ogg +0 -0
- package/assets/sfx/armas/pistol_45_far_03.ogg +0 -0
- package/assets/sfx/armas/pistol_45_far_04.ogg +0 -0
- package/assets/sfx/armas/pistol_9mm_close_01.ogg +0 -0
- package/assets/sfx/armas/pistol_9mm_close_02.ogg +0 -0
- package/assets/sfx/armas/pistol_9mm_close_03.ogg +0 -0
- package/assets/sfx/armas/pistol_9mm_close_04.ogg +0 -0
- package/assets/sfx/armas/pistol_9mm_close_05.ogg +0 -0
- package/assets/sfx/armas/pistol_9mm_close_06.ogg +0 -0
- package/assets/sfx/armas/pistol_9mm_far_01.ogg +0 -0
- package/assets/sfx/armas/pistol_9mm_far_02.ogg +0 -0
- package/assets/sfx/armas/pistol_9mm_far_03.ogg +0 -0
- package/assets/sfx/armas/pistol_9mm_far_04.ogg +0 -0
- package/assets/sfx/armas/pump_back_heavy_01.ogg +0 -0
- package/assets/sfx/armas/pump_back_heavy_02.ogg +0 -0
- package/assets/sfx/armas/pump_back_heavy_03.ogg +0 -0
- package/assets/sfx/armas/pump_back_heavy_04.ogg +0 -0
- package/assets/sfx/armas/pump_back_heavy_05.ogg +0 -0
- package/assets/sfx/armas/pump_forward_heavy_01.ogg +0 -0
- package/assets/sfx/armas/pump_forward_heavy_02.ogg +0 -0
- package/assets/sfx/armas/pump_forward_heavy_03.ogg +0 -0
- package/assets/sfx/armas/revolver_38_357_close_01.ogg +0 -0
- package/assets/sfx/armas/revolver_38_357_close_02.ogg +0 -0
- package/assets/sfx/armas/revolver_38_357_close_03.ogg +0 -0
- package/assets/sfx/armas/revolver_38_357_close_04.ogg +0 -0
- package/assets/sfx/armas/revolver_38_357_far_01.ogg +0 -0
- package/assets/sfx/armas/revolver_38_357_far_02.ogg +0 -0
- package/assets/sfx/armas/revolver_38_357_far_03.ogg +0 -0
- package/assets/sfx/armas/revolver_38_357_far_04.ogg +0 -0
- package/assets/sfx/armas/rifle_308_3006_close_01.ogg +0 -0
- package/assets/sfx/armas/rifle_308_3006_close_02.ogg +0 -0
- package/assets/sfx/armas/rifle_308_3006_close_03.ogg +0 -0
- package/assets/sfx/armas/rifle_308_3006_close_04.ogg +0 -0
- package/assets/sfx/armas/rifle_308_3006_close_05.ogg +0 -0
- package/assets/sfx/armas/rifle_308_3006_close_06.ogg +0 -0
- package/assets/sfx/armas/rifle_308_3006_far_01.ogg +0 -0
- package/assets/sfx/armas/rifle_308_3006_far_02.ogg +0 -0
- package/assets/sfx/armas/rifle_308_3006_far_03.ogg +0 -0
- package/assets/sfx/armas/rifle_308_3006_far_04.ogg +0 -0
- package/assets/sfx/armas/rifle_308_3006_far_05.ogg +0 -0
- package/assets/sfx/armas/rifle_308_3006_far_06.ogg +0 -0
- package/assets/sfx/armas/rifle_5_56_close_01.ogg +0 -0
- package/assets/sfx/armas/rifle_5_56_close_02.ogg +0 -0
- package/assets/sfx/armas/rifle_5_56_close_03.ogg +0 -0
- package/assets/sfx/armas/rifle_5_56_close_04.ogg +0 -0
- package/assets/sfx/armas/rifle_5_56_close_05.ogg +0 -0
- package/assets/sfx/armas/rifle_5_56_far_01.ogg +0 -0
- package/assets/sfx/armas/rifle_5_56_far_02.ogg +0 -0
- package/assets/sfx/armas/rifle_5_56_far_03.ogg +0 -0
- package/assets/sfx/armas/rifle_5_56_far_04.ogg +0 -0
- package/assets/sfx/armas/rifle_7_62x39_close_01.ogg +0 -0
- package/assets/sfx/armas/rifle_7_62x39_close_02.ogg +0 -0
- package/assets/sfx/armas/rifle_7_62x39_close_03.ogg +0 -0
- package/assets/sfx/armas/rifle_7_62x39_close_04.ogg +0 -0
- package/assets/sfx/armas/rifle_7_62x39_close_05.ogg +0 -0
- package/assets/sfx/armas/rifle_7_62x39_close_06.ogg +0 -0
- package/assets/sfx/armas/rifle_7_62x39_close_07.ogg +0 -0
- package/assets/sfx/armas/rifle_7_62x39_close_08.ogg +0 -0
- package/assets/sfx/armas/rifle_7_62x39_close_09.ogg +0 -0
- package/assets/sfx/armas/rifle_7_62x39_close_10.ogg +0 -0
- package/assets/sfx/armas/rifle_7_62x39_close_11.ogg +0 -0
- package/assets/sfx/armas/rifle_7_62x39_close_12.ogg +0 -0
- package/assets/sfx/armas/rifle_7_62x39_far_01.ogg +0 -0
- package/assets/sfx/armas/rifle_7_62x39_far_02.ogg +0 -0
- package/assets/sfx/armas/rifle_7_62x39_far_03.ogg +0 -0
- package/assets/sfx/armas/shell_insert_heavy_01.ogg +0 -0
- package/assets/sfx/armas/shell_insert_heavy_02.ogg +0 -0
- package/assets/sfx/armas/shell_insert_heavy_03.ogg +0 -0
- package/assets/sfx/armas/shell_insert_heavy_04.ogg +0 -0
- package/assets/sfx/armas/shell_insert_heavy_05.ogg +0 -0
- package/assets/sfx/armas/shell_insert_heavy_06.ogg +0 -0
- package/assets/sfx/armas/shell_insert_heavy_07.ogg +0 -0
- package/assets/sfx/armas/shell_insert_heavy_08.ogg +0 -0
- package/assets/sfx/armas/shell_insert_heavy_09.ogg +0 -0
- package/assets/sfx/armas/shotgun_12_close_01.ogg +0 -0
- package/assets/sfx/armas/shotgun_12_close_02.ogg +0 -0
- package/assets/sfx/armas/shotgun_12_close_03.ogg +0 -0
- package/assets/sfx/armas/shotgun_12_close_04.ogg +0 -0
- package/assets/sfx/armas/shotgun_12_close_05.ogg +0 -0
- package/assets/sfx/armas/shotgun_12_close_06.ogg +0 -0
- package/assets/sfx/armas/shotgun_12_far_01.ogg +0 -0
- package/assets/sfx/armas/shotgun_12_far_02.ogg +0 -0
- package/assets/sfx/armas/shotgun_12_far_03.ogg +0 -0
- package/assets/sfx/armas/shotgun_12_far_04.ogg +0 -0
- package/assets/sfx/armas/shotgun_12_far_05.ogg +0 -0
- package/assets/sfx/armas/shotgun_12_far_06.ogg +0 -0
- package/assets/sfx/armas/slide_release_light_01.ogg +0 -0
- package/assets/sfx/armas/slide_release_light_02.ogg +0 -0
- package/assets/sfx/armas/slide_release_light_03.ogg +0 -0
- package/assets/sfx/armas/slide_release_light_04.ogg +0 -0
- package/assets/sfx/armas/slide_release_light_05.ogg +0 -0
- package/assets/sfx/armas/slide_release_light_06.ogg +0 -0
- package/assets/sfx/armas/slide_release_medium_01.ogg +0 -0
- package/assets/sfx/armas/slide_release_medium_02.ogg +0 -0
- package/assets/sfx/armas/slide_release_medium_03.ogg +0 -0
- package/assets/sfx/armas/slide_release_medium_04.ogg +0 -0
- package/assets/sfx/armas/sniper_338_300wm_close_01.ogg +0 -0
- package/assets/sfx/armas/sniper_338_300wm_close_02.ogg +0 -0
- package/assets/sfx/armas/sniper_338_300wm_close_03.ogg +0 -0
- package/assets/sfx/armas/sniper_338_300wm_close_04.ogg +0 -0
- package/assets/sfx/armas/sniper_338_300wm_close_05.ogg +0 -0
- package/assets/sfx/armas/sniper_338_300wm_close_06.ogg +0 -0
- package/assets/sfx/armas/sniper_338_300wm_close_07.ogg +0 -0
- package/assets/sfx/armas/sniper_338_300wm_far_01.ogg +0 -0
- package/assets/sfx/armas/sniper_338_300wm_far_02.ogg +0 -0
- package/assets/sfx/armas/sniper_338_300wm_far_03.ogg +0 -0
- package/assets/sfx/armas/sniper_338_300wm_far_04.ogg +0 -0
- package/assets/sfx/armas/sniper_338_300wm_far_05.ogg +0 -0
- package/assets/sfx/armas/sniper_338_300wm_far_06.ogg +0 -0
- package/assets/sfx/armas/speedloader_light_01.ogg +0 -0
- package/assets/sfx/armas/speedloader_light_02.ogg +0 -0
- package/assets/sfx/armas/speedloader_light_03.ogg +0 -0
- package/assets/sfx/armas/speedloader_light_04.ogg +0 -0
- package/assets/sfx/armas/speedloader_light_05.ogg +0 -0
- package/assets/sfx/armas/speedloader_light_06.ogg +0 -0
- package/assets/sfx/armas/speedloader_light_07.ogg +0 -0
- package/assets/sfx/armas/speedloader_light_08.ogg +0 -0
- package/assets/sfx/armas/suppressed_pistol_close_01.ogg +0 -0
- package/assets/sfx/armas/suppressed_pistol_close_02.ogg +0 -0
- package/assets/sfx/armas/suppressed_pistol_close_03.ogg +0 -0
- package/assets/sfx/armas/suppressed_pistol_close_04.ogg +0 -0
- package/assets/sfx/armas/suppressed_pistol_close_05.ogg +0 -0
- package/assets/sfx/armas/suppressed_pistol_far_01.ogg +0 -0
- package/assets/sfx/armas/suppressed_pistol_far_02.ogg +0 -0
- package/assets/sfx/armas/suppressed_pistol_far_03.ogg +0 -0
- package/assets/sfx/armas/suppressed_pistol_far_04.ogg +0 -0
- package/assets/sfx/armas/suppressed_pistol_far_05.ogg +0 -0
- package/assets/sfx/armas/suppressed_rifle_close_01.ogg +0 -0
- package/assets/sfx/armas/suppressed_rifle_close_02.ogg +0 -0
- package/assets/sfx/armas/suppressed_rifle_close_03.ogg +0 -0
- package/assets/sfx/armas/suppressed_rifle_close_04.ogg +0 -0
- package/assets/sfx/armas/suppressed_rifle_far_01.ogg +0 -0
- package/assets/sfx/armas/suppressed_rifle_far_02.ogg +0 -0
- package/assets/sfx/armas/suppressed_rifle_far_03.ogg +0 -0
- package/assets/sfx/armas/suppressed_rifle_far_04.ogg +0 -0
- package/assets/sfx/explosoes-fogo/debris_rain_mixed_01.ogg +0 -0
- package/assets/sfx/explosoes-fogo/debris_rain_mixed_02.ogg +0 -0
- package/assets/sfx/explosoes-fogo/debris_rain_mixed_03.ogg +0 -0
- package/assets/sfx/explosoes-fogo/debris_rain_mixed_04.ogg +0 -0
- package/assets/sfx/explosoes-fogo/debris_rain_mixed_05.ogg +0 -0
- package/assets/sfx/explosoes-fogo/debris_rain_mixed_06.ogg +0 -0
- package/assets/sfx/explosoes-fogo/debris_rain_mixed_07.ogg +0 -0
- package/assets/sfx/explosoes-fogo/debris_rain_stone_01.ogg +0 -0
- package/assets/sfx/explosoes-fogo/debris_rain_stone_02.ogg +0 -0
- package/assets/sfx/explosoes-fogo/debris_rain_stone_03.ogg +0 -0
- package/assets/sfx/explosoes-fogo/debris_rain_stone_04.ogg +0 -0
- package/assets/sfx/explosoes-fogo/debris_rain_stone_05.ogg +0 -0
- package/assets/sfx/explosoes-fogo/debris_rain_stone_06.ogg +0 -0
- package/assets/sfx/explosoes-fogo/debris_rain_stone_07.ogg +0 -0
- package/assets/sfx/explosoes-fogo/debris_rain_stone_08.ogg +0 -0
- package/assets/sfx/explosoes-fogo/debris_rain_stone_09.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_big_01.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_big_02.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_big_03.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_big_04.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_big_05.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_car_01.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_car_02.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_car_03.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_car_04.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_far_close_01.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_far_close_02.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_far_close_03.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_far_close_04.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_flashbang_01.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_flashbang_02.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_grenade_01.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_grenade_02.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_grenade_03.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_grenade_04.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_grenade_05.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_grenade_06.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_small_bang_01.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_small_bang_02.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_small_bang_03.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_small_bang_04.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_small_bang_05.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_small_bang_06.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_small_bang_07.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_small_bang_08.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_small_bang_09.ogg +0 -0
- package/assets/sfx/explosoes-fogo/explosion_small_bang_10.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_crackle_01.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_crackle_02.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_crackle_03.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_crackle_05.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_crackle_07.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_extinguish_01.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_extinguish_02.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_ignite_01.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_ignite_02.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_ignite_03.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_ignite_04.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_loop_01.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_loop_03.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_loop_04.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_loop_small_01.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_pop_01.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_pop_02.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_pop_03.ogg +0 -0
- package/assets/sfx/explosoes-fogo/flamethrower_loop_01.ogg +0 -0
- package/assets/sfx/explosoes-fogo/gas_leak_01.ogg +0 -0
- package/assets/sfx/explosoes-fogo/molotov_break_ignite_01.ogg +0 -0
- package/assets/sfx/explosoes-fogo/molotov_break_ignite_02.ogg +0 -0
- package/assets/sfx/impactos/ceramic_hit_close_01.ogg +0 -0
- package/assets/sfx/impactos/concrete_block_drag_close_01.ogg +0 -0
- package/assets/sfx/impactos/concrete_block_drag_close_02.ogg +0 -0
- package/assets/sfx/impactos/concrete_block_drag_close_03.ogg +0 -0
- package/assets/sfx/impactos/concrete_block_drag_close_04.ogg +0 -0
- package/assets/sfx/impactos/concrete_block_drag_close_05.ogg +0 -0
- package/assets/sfx/impactos/concrete_block_drag_close_06.ogg +0 -0
- package/assets/sfx/impactos/concrete_block_drag_close_07.ogg +0 -0
- package/assets/sfx/impactos/crack_close_01.ogg +0 -0
- package/assets/sfx/impactos/crack_close_02.ogg +0 -0
- package/assets/sfx/impactos/crack_close_03.ogg +0 -0
- package/assets/sfx/impactos/crack_close_04.ogg +0 -0
- package/assets/sfx/impactos/crack_close_05.ogg +0 -0
- package/assets/sfx/impactos/crack_close_06.ogg +0 -0
- package/assets/sfx/impactos/crack_close_07.ogg +0 -0
- package/assets/sfx/impactos/crack_close_08.ogg +0 -0
- package/assets/sfx/impactos/crack_close_09.ogg +0 -0
- package/assets/sfx/impactos/crack_close_10.ogg +0 -0
- package/assets/sfx/impactos/crumble_close_01.ogg +0 -0
- package/assets/sfx/impactos/crumble_close_02.ogg +0 -0
- package/assets/sfx/impactos/crumble_close_03.ogg +0 -0
- package/assets/sfx/impactos/crumble_close_04.ogg +0 -0
- package/assets/sfx/impactos/crumble_close_05.ogg +0 -0
- package/assets/sfx/impactos/flesh_fruit_splat_close_01.ogg +0 -0
- package/assets/sfx/impactos/flesh_fruit_splat_close_02.ogg +0 -0
- package/assets/sfx/impactos/flesh_fruit_splat_close_03.ogg +0 -0
- package/assets/sfx/impactos/furniture_push_wood_close_01.ogg +0 -0
- package/assets/sfx/impactos/glass_blunt_heavy_close_01.ogg +0 -0
- package/assets/sfx/impactos/glass_blunt_heavy_close_02.ogg +0 -0
- package/assets/sfx/impactos/glass_blunt_heavy_close_03.ogg +0 -0
- package/assets/sfx/impactos/glass_blunt_heavy_close_04.ogg +0 -0
- package/assets/sfx/impactos/glass_blunt_heavy_close_05.ogg +0 -0
- package/assets/sfx/impactos/glass_blunt_light_close_01.ogg +0 -0
- package/assets/sfx/impactos/glass_blunt_light_close_02.ogg +0 -0
- package/assets/sfx/impactos/glass_blunt_light_close_03.ogg +0 -0
- package/assets/sfx/impactos/glass_blunt_light_close_04.ogg +0 -0
- package/assets/sfx/impactos/glass_blunt_light_close_05.ogg +0 -0
- package/assets/sfx/impactos/glass_blunt_medium_close_01.ogg +0 -0
- package/assets/sfx/impactos/glass_blunt_medium_close_02.ogg +0 -0
- package/assets/sfx/impactos/glass_blunt_medium_close_03.ogg +0 -0
- package/assets/sfx/impactos/glass_blunt_medium_close_04.ogg +0 -0
- package/assets/sfx/impactos/glass_blunt_medium_close_05.ogg +0 -0
- package/assets/sfx/impactos/glass_bottle_break_close_01.ogg +0 -0
- package/assets/sfx/impactos/glass_debris_fall_close_01.ogg +0 -0
- package/assets/sfx/impactos/glass_debris_fall_close_02.ogg +0 -0
- package/assets/sfx/impactos/glass_debris_fall_close_03.ogg +0 -0
- package/assets/sfx/impactos/glass_debris_fall_close_04.ogg +0 -0
- package/assets/sfx/impactos/glass_shatter_close_01.ogg +0 -0
- package/assets/sfx/impactos/glass_shatter_close_02.ogg +0 -0
- package/assets/sfx/impactos/glass_shatter_close_03.ogg +0 -0
- package/assets/sfx/impactos/glass_shatter_close_04.ogg +0 -0
- package/assets/sfx/impactos/glass_shatter_close_05.ogg +0 -0
- package/assets/sfx/impactos/glass_shatter_close_06.ogg +0 -0
- package/assets/sfx/impactos/glass_shatter_close_07.ogg +0 -0
- package/assets/sfx/impactos/glass_shatter_close_08.ogg +0 -0
- package/assets/sfx/impactos/glass_shatter_close_09.ogg +0 -0
- package/assets/sfx/impactos/gravel_hit_close_21.ogg +0 -0
- package/assets/sfx/impactos/gravel_hit_close_22.ogg +0 -0
- package/assets/sfx/impactos/gravel_hit_close_23.ogg +0 -0
- package/assets/sfx/impactos/gravel_hit_close_24.ogg +0 -0
- package/assets/sfx/impactos/gravel_hit_close_25.ogg +0 -0
- package/assets/sfx/impactos/gravel_hit_close_26.ogg +0 -0
- package/assets/sfx/impactos/gravel_hit_close_27.ogg +0 -0
- package/assets/sfx/impactos/gravel_hit_close_28.ogg +0 -0
- package/assets/sfx/impactos/gravel_hit_close_29.ogg +0 -0
- package/assets/sfx/impactos/impact_generic_light_close_01.ogg +0 -0
- package/assets/sfx/impactos/impact_generic_light_close_02.ogg +0 -0
- package/assets/sfx/impactos/impact_generic_light_close_03.ogg +0 -0
- package/assets/sfx/impactos/impact_generic_light_close_04.ogg +0 -0
- package/assets/sfx/impactos/impact_generic_light_close_05.ogg +0 -0
- package/assets/sfx/impactos/masonry_blunt_close_01.ogg +0 -0
- package/assets/sfx/impactos/masonry_blunt_close_02.ogg +0 -0
- package/assets/sfx/impactos/masonry_blunt_close_03.ogg +0 -0
- package/assets/sfx/impactos/masonry_blunt_close_04.ogg +0 -0
- package/assets/sfx/impactos/masonry_blunt_close_05.ogg +0 -0
- package/assets/sfx/impactos/masonry_blunt_close_06.ogg +0 -0
- package/assets/sfx/impactos/masonry_blunt_close_07.ogg +0 -0
- package/assets/sfx/impactos/masonry_bullet_close_01.ogg +0 -0
- package/assets/sfx/impactos/masonry_bullet_close_02.ogg +0 -0
- package/assets/sfx/impactos/masonry_bullet_close_03.ogg +0 -0
- package/assets/sfx/impactos/masonry_bullet_close_04.ogg +0 -0
- package/assets/sfx/impactos/masonry_bullet_close_05.ogg +0 -0
- package/assets/sfx/impactos/masonry_bullet_close_21.ogg +0 -0
- package/assets/sfx/impactos/masonry_bullet_close_22.ogg +0 -0
- package/assets/sfx/impactos/masonry_bullet_close_23.ogg +0 -0
- package/assets/sfx/impactos/masonry_bullet_close_24.ogg +0 -0
- package/assets/sfx/impactos/masonry_bullet_close_25.ogg +0 -0
- package/assets/sfx/impactos/masonry_bullet_close_26.ogg +0 -0
- package/assets/sfx/impactos/masonry_bullet_close_27.ogg +0 -0
- package/assets/sfx/impactos/masonry_bullet_close_28.ogg +0 -0
- package/assets/sfx/impactos/metal_blunt_close_01.ogg +0 -0
- package/assets/sfx/impactos/metal_blunt_close_02.ogg +0 -0
- package/assets/sfx/impactos/metal_blunt_close_03.ogg +0 -0
- package/assets/sfx/impactos/metal_blunt_close_04.ogg +0 -0
- package/assets/sfx/impactos/metal_blunt_close_05.ogg +0 -0
- package/assets/sfx/impactos/metal_blunt_heavy_close_01.ogg +0 -0
- package/assets/sfx/impactos/metal_blunt_heavy_close_02.ogg +0 -0
- package/assets/sfx/impactos/metal_blunt_heavy_close_03.ogg +0 -0
- package/assets/sfx/impactos/metal_blunt_heavy_close_04.ogg +0 -0
- package/assets/sfx/impactos/metal_blunt_heavy_close_05.ogg +0 -0
- package/assets/sfx/impactos/metal_blunt_light_close_01.ogg +0 -0
- package/assets/sfx/impactos/metal_blunt_light_close_02.ogg +0 -0
- package/assets/sfx/impactos/metal_blunt_light_close_03.ogg +0 -0
- package/assets/sfx/impactos/metal_blunt_light_close_04.ogg +0 -0
- package/assets/sfx/impactos/metal_blunt_light_close_05.ogg +0 -0
- package/assets/sfx/impactos/metal_blunt_medium_close_01.ogg +0 -0
- package/assets/sfx/impactos/metal_blunt_medium_close_02.ogg +0 -0
- package/assets/sfx/impactos/metal_blunt_medium_close_03.ogg +0 -0
- package/assets/sfx/impactos/metal_blunt_medium_close_04.ogg +0 -0
- package/assets/sfx/impactos/metal_blunt_medium_close_05.ogg +0 -0
- package/assets/sfx/impactos/metal_bullet_close_01.ogg +0 -0
- package/assets/sfx/impactos/metal_bullet_close_02.ogg +0 -0
- package/assets/sfx/impactos/metal_bullet_close_03.ogg +0 -0
- package/assets/sfx/impactos/metal_bullet_close_04.ogg +0 -0
- package/assets/sfx/impactos/metal_bullet_close_05.ogg +0 -0
- package/assets/sfx/impactos/metal_bullet_close_06.ogg +0 -0
- package/assets/sfx/impactos/metal_bullet_close_21.ogg +0 -0
- package/assets/sfx/impactos/metal_bullet_close_22.ogg +0 -0
- package/assets/sfx/impactos/metal_bullet_close_23.ogg +0 -0
- package/assets/sfx/impactos/metal_bullet_close_24.ogg +0 -0
- package/assets/sfx/impactos/metal_bullet_close_25.ogg +0 -0
- package/assets/sfx/impactos/metal_bullet_close_26.ogg +0 -0
- package/assets/sfx/impactos/metal_bullet_close_27.ogg +0 -0
- package/assets/sfx/impactos/metal_bullet_close_28.ogg +0 -0
- package/assets/sfx/impactos/metal_bullet_close_29.ogg +0 -0
- package/assets/sfx/impactos/metal_bullet_close_30.ogg +0 -0
- package/assets/sfx/impactos/metal_bullet_close_31.ogg +0 -0
- package/assets/sfx/impactos/metal_bullet_close_32.ogg +0 -0
- package/assets/sfx/impactos/metal_bullet_close_33.ogg +0 -0
- package/assets/sfx/impactos/metal_bullet_close_34.ogg +0 -0
- package/assets/sfx/impactos/metal_fall_close_01.ogg +0 -0
- package/assets/sfx/impactos/metal_fall_close_02.ogg +0 -0
- package/assets/sfx/impactos/metal_fall_close_03.ogg +0 -0
- package/assets/sfx/impactos/metal_fall_close_04.ogg +0 -0
- package/assets/sfx/impactos/metal_fall_close_05.ogg +0 -0
- package/assets/sfx/impactos/metal_fall_close_06.ogg +0 -0
- package/assets/sfx/impactos/metal_fall_close_07.ogg +0 -0
- package/assets/sfx/impactos/metal_fall_close_08.ogg +0 -0
- package/assets/sfx/impactos/metal_fall_close_09.ogg +0 -0
- package/assets/sfx/impactos/metal_fall_close_10.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_01.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_02.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_03.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_04.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_05.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_06.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_07.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_08.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_09.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_10.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_11.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_12.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_13.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_14.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_15.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_16.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_17.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_18.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_19.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_20.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_21.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_22.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_23.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_24.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_25.ogg +0 -0
- package/assets/sfx/impactos/metal_thin_close_26.ogg +0 -0
- package/assets/sfx/impactos/paper_tear_close_01.ogg +0 -0
- package/assets/sfx/impactos/paper_tear_close_02.ogg +0 -0
- package/assets/sfx/impactos/plastic_hit_close_01.ogg +0 -0
- package/assets/sfx/impactos/plastic_hit_close_02.ogg +0 -0
- package/assets/sfx/impactos/plastic_hit_close_03.ogg +0 -0
- package/assets/sfx/impactos/plastic_hit_close_04.ogg +0 -0
- package/assets/sfx/impactos/ricochet_metal_close_21.ogg +0 -0
- package/assets/sfx/impactos/ricochet_metal_close_22.ogg +0 -0
- package/assets/sfx/impactos/ricochet_metal_close_23.ogg +0 -0
- package/assets/sfx/impactos/ricochet_metal_close_24.ogg +0 -0
- package/assets/sfx/impactos/ricochet_metal_close_25.ogg +0 -0
- package/assets/sfx/impactos/ricochet_metal_close_26.ogg +0 -0
- package/assets/sfx/impactos/ricochet_metal_close_27.ogg +0 -0
- package/assets/sfx/impactos/ricochet_metal_close_28.ogg +0 -0
- package/assets/sfx/impactos/rubble_falling_close_01.ogg +0 -0
- package/assets/sfx/impactos/rubble_falling_close_02.ogg +0 -0
- package/assets/sfx/impactos/rubble_falling_close_03.ogg +0 -0
- package/assets/sfx/impactos/rubble_falling_close_04.ogg +0 -0
- package/assets/sfx/impactos/rubble_falling_close_05.ogg +0 -0
- package/assets/sfx/impactos/rubble_falling_close_06.ogg +0 -0
- package/assets/sfx/impactos/rubble_falling_close_07.ogg +0 -0
- package/assets/sfx/impactos/rubble_falling_close_08.ogg +0 -0
- package/assets/sfx/impactos/rubble_falling_close_09.ogg +0 -0
- package/assets/sfx/impactos/soft_bullet_close_01.ogg +0 -0
- package/assets/sfx/impactos/soft_bullet_close_02.ogg +0 -0
- package/assets/sfx/impactos/soft_bullet_close_03.ogg +0 -0
- package/assets/sfx/impactos/soft_bullet_close_04.ogg +0 -0
- package/assets/sfx/impactos/soft_bullet_close_05.ogg +0 -0
- package/assets/sfx/impactos/soft_bullet_close_06.ogg +0 -0
- package/assets/sfx/impactos/soft_bullet_close_07.ogg +0 -0
- package/assets/sfx/impactos/soft_bullet_close_08.ogg +0 -0
- package/assets/sfx/impactos/soft_bullet_close_09.ogg +0 -0
- package/assets/sfx/impactos/soft_bullet_close_10.ogg +0 -0
- package/assets/sfx/impactos/soil_bullet_close_21.ogg +0 -0
- package/assets/sfx/impactos/soil_bullet_close_22.ogg +0 -0
- package/assets/sfx/impactos/soil_bullet_close_23.ogg +0 -0
- package/assets/sfx/impactos/wood_blunt_heavy_close_01.ogg +0 -0
- package/assets/sfx/impactos/wood_blunt_heavy_close_02.ogg +0 -0
- package/assets/sfx/impactos/wood_blunt_heavy_close_03.ogg +0 -0
- package/assets/sfx/impactos/wood_blunt_heavy_close_04.ogg +0 -0
- package/assets/sfx/impactos/wood_blunt_heavy_close_05.ogg +0 -0
- package/assets/sfx/impactos/wood_blunt_light_close_01.ogg +0 -0
- package/assets/sfx/impactos/wood_blunt_light_close_02.ogg +0 -0
- package/assets/sfx/impactos/wood_blunt_light_close_03.ogg +0 -0
- package/assets/sfx/impactos/wood_blunt_light_close_04.ogg +0 -0
- package/assets/sfx/impactos/wood_blunt_light_close_05.ogg +0 -0
- package/assets/sfx/impactos/wood_blunt_medium_close_01.ogg +0 -0
- package/assets/sfx/impactos/wood_blunt_medium_close_02.ogg +0 -0
- package/assets/sfx/impactos/wood_blunt_medium_close_03.ogg +0 -0
- package/assets/sfx/impactos/wood_blunt_medium_close_04.ogg +0 -0
- package/assets/sfx/impactos/wood_blunt_medium_close_05.ogg +0 -0
- package/assets/sfx/impactos/wood_fall_close_01.ogg +0 -0
- package/assets/sfx/impactos/wood_fall_close_02.ogg +0 -0
- package/assets/sfx/impactos/wood_fall_close_03.ogg +0 -0
- package/assets/sfx/impactos/wood_fall_close_04.ogg +0 -0
- package/assets/sfx/impactos/wood_fall_close_05.ogg +0 -0
- package/assets/sfx/impactos/wood_fall_close_06.ogg +0 -0
- package/assets/sfx/impactos/wood_fall_close_07.ogg +0 -0
- package/assets/sfx/impactos/wood_fall_close_08.ogg +0 -0
- package/assets/sfx/impactos/wood_fall_close_09.ogg +0 -0
- package/assets/sfx/impactos/wood_hit_close_01.ogg +0 -0
- package/assets/sfx/impactos/wood_hit_close_02.ogg +0 -0
- package/assets/sfx/impactos/wood_hit_close_03.ogg +0 -0
- package/assets/sfx/impactos/wood_hit_close_04.ogg +0 -0
- package/assets/sfx/impactos/wood_hit_close_05.ogg +0 -0
- package/assets/sfx/impactos/wood_hit_close_06.ogg +0 -0
- package/assets/sfx/impactos/wood_hit_close_07.ogg +0 -0
- package/assets/sfx/impactos/wood_hit_close_08.ogg +0 -0
- package/assets/sfx/impactos/wood_hit_close_09.ogg +0 -0
- package/assets/sfx/impactos/wood_hit_close_10.ogg +0 -0
- package/assets/sfx/impactos/wood_hit_close_11.ogg +0 -0
- package/assets/sfx/impactos/wood_hit_close_12.ogg +0 -0
- package/assets/sfx/impactos/wood_hit_close_13.ogg +0 -0
- package/assets/sfx/impactos/wood_hit_close_14.ogg +0 -0
- package/assets/sfx/impactos/wood_hit_close_21.ogg +0 -0
- package/assets/sfx/impactos/wood_hit_close_22.ogg +0 -0
- package/assets/sfx/impactos/wood_hit_close_23.ogg +0 -0
- package/assets/sfx/impactos/wood_hit_close_24.ogg +0 -0
- package/assets/sfx/impactos/wood_hit_close_25.ogg +0 -0
- package/assets/sfx/impactos/wood_hit_close_26.ogg +0 -0
- package/assets/sfx/impactos/wood_hit_close_27.ogg +0 -0
- package/assets/sfx/itens-portas/backpack_open_shut_01.ogg +0 -0
- package/assets/sfx/itens-portas/backpack_open_shut_02.ogg +0 -0
- package/assets/sfx/itens-portas/backpack_open_shut_03.ogg +0 -0
- package/assets/sfx/itens-portas/backpack_open_shut_04.ogg +0 -0
- package/assets/sfx/itens-portas/backpack_open_shut_05.ogg +0 -0
- package/assets/sfx/itens-portas/backpack_open_shut_06.ogg +0 -0
- package/assets/sfx/itens-portas/book_open_shut_01.ogg +0 -0
- package/assets/sfx/itens-portas/book_open_shut_02.ogg +0 -0
- package/assets/sfx/itens-portas/book_open_shut_03.ogg +0 -0
- package/assets/sfx/itens-portas/book_open_shut_04.ogg +0 -0
- package/assets/sfx/itens-portas/book_open_shut_05.ogg +0 -0
- package/assets/sfx/itens-portas/book_open_shut_06.ogg +0 -0
- package/assets/sfx/itens-portas/book_open_shut_07.ogg +0 -0
- package/assets/sfx/itens-portas/book_open_shut_08.ogg +0 -0
- package/assets/sfx/itens-portas/book_open_shut_09.ogg +0 -0
- package/assets/sfx/itens-portas/book_open_shut_10.ogg +0 -0
- package/assets/sfx/itens-portas/book_open_shut_11.ogg +0 -0
- package/assets/sfx/itens-portas/door_creak_01.ogg +0 -0
- package/assets/sfx/itens-portas/door_creak_02.ogg +0 -0
- package/assets/sfx/itens-portas/door_creak_03.ogg +0 -0
- package/assets/sfx/itens-portas/door_creak_06.ogg +0 -0
- package/assets/sfx/itens-portas/door_creak_07.ogg +0 -0
- package/assets/sfx/itens-portas/door_glass_sliding_01.ogg +0 -0
- package/assets/sfx/itens-portas/door_glass_sliding_02.ogg +0 -0
- package/assets/sfx/itens-portas/door_glass_sliding_03.ogg +0 -0
- package/assets/sfx/itens-portas/door_glass_sliding_04.ogg +0 -0
- package/assets/sfx/itens-portas/door_knock_01.ogg +0 -0
- package/assets/sfx/itens-portas/door_lock_unlock_01.ogg +0 -0
- package/assets/sfx/itens-portas/door_lock_unlock_02.ogg +0 -0
- package/assets/sfx/itens-portas/door_lock_unlock_03.ogg +0 -0
- package/assets/sfx/itens-portas/door_lock_unlock_04.ogg +0 -0
- package/assets/sfx/itens-portas/door_lock_unlock_05.ogg +0 -0
- package/assets/sfx/itens-portas/door_lock_unlock_06.ogg +0 -0
- package/assets/sfx/itens-portas/door_lock_unlock_07.ogg +0 -0
- package/assets/sfx/itens-portas/door_lock_unlock_08.ogg +0 -0
- package/assets/sfx/itens-portas/door_lock_unlock_09.ogg +0 -0
- package/assets/sfx/itens-portas/door_lock_unlock_10.ogg +0 -0
- package/assets/sfx/itens-portas/door_lock_unlock_11.ogg +0 -0
- package/assets/sfx/itens-portas/door_locked_rattle_01.ogg +0 -0
- package/assets/sfx/itens-portas/door_locked_rattle_02.ogg +0 -0
- package/assets/sfx/itens-portas/door_locked_rattle_03.ogg +0 -0
- package/assets/sfx/itens-portas/door_metal_open_shut_01.ogg +0 -0
- package/assets/sfx/itens-portas/door_metal_open_shut_02.ogg +0 -0
- package/assets/sfx/itens-portas/door_metal_open_shut_03.ogg +0 -0
- package/assets/sfx/itens-portas/door_metal_open_shut_04.ogg +0 -0
- package/assets/sfx/itens-portas/door_metal_open_shut_05.ogg +0 -0
- package/assets/sfx/itens-portas/door_metal_open_shut_06.ogg +0 -0
- package/assets/sfx/itens-portas/door_metal_open_shut_07.ogg +0 -0
- package/assets/sfx/itens-portas/door_slam_wood_01.ogg +0 -0
- package/assets/sfx/itens-portas/door_slam_wood_02.ogg +0 -0
- package/assets/sfx/itens-portas/door_slam_wood_03.ogg +0 -0
- package/assets/sfx/itens-portas/door_slam_wood_04.ogg +0 -0
- package/assets/sfx/itens-portas/door_wood_open_01.ogg +0 -0
- package/assets/sfx/itens-portas/door_wood_open_02.ogg +0 -0
- package/assets/sfx/itens-portas/door_wood_open_03.ogg +0 -0
- package/assets/sfx/itens-portas/door_wood_open_04.ogg +0 -0
- package/assets/sfx/itens-portas/door_wood_shut_01.ogg +0 -0
- package/assets/sfx/itens-portas/door_wood_shut_02.ogg +0 -0
- package/assets/sfx/itens-portas/door_wood_shut_03.ogg +0 -0
- package/assets/sfx/itens-portas/door_wood_shut_04.ogg +0 -0
- package/assets/sfx/itens-portas/door_wood_shut_05.ogg +0 -0
- package/assets/sfx/itens-portas/door_wood_shut_06.ogg +0 -0
- package/assets/sfx/itens-portas/door_wood_shut_07.ogg +0 -0
- package/assets/sfx/itens-portas/door_wood_shut_08.ogg +0 -0
- package/assets/sfx/itens-portas/drawer_open_01.ogg +0 -0
- package/assets/sfx/itens-portas/drawer_open_02.ogg +0 -0
- package/assets/sfx/itens-portas/drawer_shut_01.ogg +0 -0
- package/assets/sfx/itens-portas/drawer_shut_02.ogg +0 -0
- package/assets/sfx/itens-portas/item_drop_bag_01.ogg +0 -0
- package/assets/sfx/itens-portas/item_drop_bag_02.ogg +0 -0
- package/assets/sfx/itens-portas/item_drop_glass_01.ogg +0 -0
- package/assets/sfx/itens-portas/item_drop_metal_01.ogg +0 -0
- package/assets/sfx/itens-portas/item_drop_metal_02.ogg +0 -0
- package/assets/sfx/itens-portas/item_drop_metal_03.ogg +0 -0
- package/assets/sfx/itens-portas/item_drop_metal_04.ogg +0 -0
- package/assets/sfx/itens-portas/item_drop_metal_05.ogg +0 -0
- package/assets/sfx/itens-portas/item_drop_paper_01.ogg +0 -0
- package/assets/sfx/itens-portas/item_pickup_coins_01.ogg +0 -0
- package/assets/sfx/itens-portas/item_pickup_coins_02.ogg +0 -0
- package/assets/sfx/itens-portas/item_pickup_generic_01.ogg +0 -0
- package/assets/sfx/itens-portas/item_pickup_generic_02.ogg +0 -0
- package/assets/sfx/itens-portas/item_pickup_generic_03.ogg +0 -0
- package/assets/sfx/itens-portas/item_pickup_generic_04.ogg +0 -0
- package/assets/sfx/itens-portas/item_pickup_leather_01.ogg +0 -0
- package/assets/sfx/itens-portas/item_pickup_leather_02.ogg +0 -0
- package/assets/sfx/itens-portas/item_pickup_leather_03.ogg +0 -0
- package/assets/sfx/itens-portas/item_pickup_leather_04.ogg +0 -0
- package/assets/sfx/itens-portas/item_pickup_leather_05.ogg +0 -0
- package/assets/sfx/itens-portas/item_setdown_01.ogg +0 -0
- package/assets/sfx/itens-portas/item_setdown_02.ogg +0 -0
- package/assets/sfx/itens-portas/keys_jingle_01.ogg +0 -0
- package/assets/sfx/itens-portas/keys_jingle_02.ogg +0 -0
- package/assets/sfx/itens-portas/keys_jingle_03.ogg +0 -0
- package/assets/sfx/itens-portas/keys_jingle_04.ogg +0 -0
- package/assets/sfx/itens-portas/keys_jingle_05.ogg +0 -0
- package/assets/sfx/itens-portas/keys_jingle_06.ogg +0 -0
- package/assets/sfx/itens-portas/keys_jingle_07.ogg +0 -0
- package/assets/sfx/itens-portas/lever_pull_01.ogg +0 -0
- package/assets/sfx/itens-portas/lever_pull_02.ogg +0 -0
- package/assets/sfx/itens-portas/lever_pull_03.ogg +0 -0
- package/assets/sfx/itens-portas/lever_pull_04.ogg +0 -0
- package/assets/sfx/itens-portas/lever_pull_05.ogg +0 -0
- package/assets/sfx/itens-portas/lever_pull_06.ogg +0 -0
- package/assets/sfx/itens-portas/metal_latch_01.ogg +0 -0
- package/assets/sfx/itens-portas/metal_latch_02.ogg +0 -0
- package/assets/sfx/itens-portas/plates_hit_01.ogg +0 -0
- package/assets/sfx/itens-portas/plates_hit_02.ogg +0 -0
- package/assets/sfx/itens-portas/plates_hit_03.ogg +0 -0
- package/assets/sfx/itens-portas/plates_hit_04.ogg +0 -0
- package/assets/sfx/itens-portas/plates_hit_05.ogg +0 -0
- package/assets/sfx/itens-portas/plates_hit_06.ogg +0 -0
- package/assets/sfx/itens-portas/plates_hit_07.ogg +0 -0
- package/assets/sfx/itens-portas/plates_hit_08.ogg +0 -0
- package/assets/sfx/itens-portas/plates_hit_09.ogg +0 -0
- package/assets/sfx/itens-portas/plates_hit_10.ogg +0 -0
- package/assets/sfx/itens-portas/plates_slide_01.ogg +0 -0
- package/assets/sfx/itens-portas/plates_slide_02.ogg +0 -0
- package/assets/sfx/itens-portas/plates_slide_03.ogg +0 -0
- package/assets/sfx/itens-portas/plates_slide_04.ogg +0 -0
- package/assets/sfx/itens-portas/saw_wood_01.ogg +0 -0
- package/assets/sfx/itens-portas/switch_click_01.ogg +0 -0
- package/assets/sfx/itens-portas/switch_click_02.ogg +0 -0
- package/assets/sfx/itens-portas/switch_click_03.ogg +0 -0
- package/assets/sfx/itens-portas/switch_click_04.ogg +0 -0
- package/assets/sfx/itens-portas/toilet_flush_01.ogg +0 -0
- package/assets/sfx/itens-portas/tools_handling_01.ogg +0 -0
- package/assets/sfx/itens-portas/tools_handling_02.ogg +0 -0
- package/assets/sfx/itens-portas/tools_handling_03.ogg +0 -0
- package/assets/sfx/itens-portas/tools_handling_04.ogg +0 -0
- package/assets/sfx/itens-portas/tools_handling_05.ogg +0 -0
- package/assets/sfx/itens-portas/tools_handling_06.ogg +0 -0
- package/assets/sfx/itens-portas/tools_handling_07.ogg +0 -0
- package/assets/sfx/itens-portas/tools_handling_08.ogg +0 -0
- package/assets/sfx/itens-portas/tools_handling_09.ogg +0 -0
- package/assets/sfx/itens-portas/tools_handling_10.ogg +0 -0
- package/assets/sfx/itens-portas/tools_handling_11.ogg +0 -0
- package/assets/sfx/itens-portas/tools_handling_12.ogg +0 -0
- package/assets/sfx/itens-portas/tools_handling_13.ogg +0 -0
- package/assets/sfx/itens-portas/tools_handling_14.ogg +0 -0
- package/assets/sfx/itens-portas/tools_handling_15.ogg +0 -0
- package/assets/sfx/itens-portas/tools_handling_16.ogg +0 -0
- package/assets/sfx/itens-portas/water_drip_01.ogg +0 -0
- package/assets/sfx/itens-portas/water_drip_02.ogg +0 -0
- package/assets/sfx/itens-portas/water_drip_03.ogg +0 -0
- package/assets/sfx/itens-portas/water_drip_04.ogg +0 -0
- package/assets/sfx/itens-portas/water_faucet_01.ogg +0 -0
- package/assets/sfx/itens-portas/water_faucet_02.ogg +0 -0
- package/assets/sfx/itens-portas/water_faucet_03.ogg +0 -0
- package/assets/sfx/itens-portas/water_faucet_04.ogg +0 -0
- package/assets/sfx/itens-portas/water_faucet_05.ogg +0 -0
- package/assets/sfx/itens-portas/water_faucet_06.ogg +0 -0
- package/assets/sfx/itens-portas/water_faucet_07.ogg +0 -0
- package/assets/sfx/itens-portas/water_faucet_08.ogg +0 -0
- package/assets/sfx/itens-portas/water_faucet_09.ogg +0 -0
- package/assets/sfx/itens-portas/water_faucet_10.ogg +0 -0
- package/assets/sfx/manifest.json +11959 -0
- package/assets/sfx/personagem/axe_chop_01.ogg +0 -0
- package/assets/sfx/personagem/axe_chop_02.ogg +0 -0
- package/assets/sfx/personagem/blunt_hit_metal_01.ogg +0 -0
- package/assets/sfx/personagem/blunt_hit_metal_02.ogg +0 -0
- package/assets/sfx/personagem/blunt_hit_metal_03.ogg +0 -0
- package/assets/sfx/personagem/blunt_hit_metal_04.ogg +0 -0
- package/assets/sfx/personagem/blunt_hit_metal_05.ogg +0 -0
- package/assets/sfx/personagem/body_fall_01.ogg +0 -0
- package/assets/sfx/personagem/body_fall_02.ogg +0 -0
- package/assets/sfx/personagem/body_fall_03.ogg +0 -0
- package/assets/sfx/personagem/body_fall_04.ogg +0 -0
- package/assets/sfx/personagem/body_fall_05.ogg +0 -0
- package/assets/sfx/personagem/cloth_rustle_01.ogg +0 -0
- package/assets/sfx/personagem/cloth_rustle_02.ogg +0 -0
- package/assets/sfx/personagem/cloth_rustle_03.ogg +0 -0
- package/assets/sfx/personagem/cloth_rustle_04.ogg +0 -0
- package/assets/sfx/personagem/cloth_rustle_05.ogg +0 -0
- package/assets/sfx/personagem/cloth_rustle_06.ogg +0 -0
- package/assets/sfx/personagem/cloth_rustle_07.ogg +0 -0
- package/assets/sfx/personagem/cloth_rustle_08.ogg +0 -0
- package/assets/sfx/personagem/cloth_rustle_09.ogg +0 -0
- package/assets/sfx/personagem/cloth_rustle_10.ogg +0 -0
- package/assets/sfx/personagem/cloth_rustle_11.ogg +0 -0
- package/assets/sfx/personagem/cloth_rustle_12.ogg +0 -0
- package/assets/sfx/personagem/cloth_rustle_13.ogg +0 -0
- package/assets/sfx/personagem/cloth_rustle_14.ogg +0 -0
- package/assets/sfx/personagem/drink_gulp_01.ogg +0 -0
- package/assets/sfx/personagem/drink_gulp_02.ogg +0 -0
- package/assets/sfx/personagem/drink_gulp_03.ogg +0 -0
- package/assets/sfx/personagem/footstep_carpet_alt_01.ogg +0 -0
- package/assets/sfx/personagem/footstep_carpet_alt_02.ogg +0 -0
- package/assets/sfx/personagem/footstep_carpet_alt_03.ogg +0 -0
- package/assets/sfx/personagem/footstep_carpet_alt_04.ogg +0 -0
- package/assets/sfx/personagem/footstep_carpet_alt_05.ogg +0 -0
- package/assets/sfx/personagem/footstep_concrete_alt_01.ogg +0 -0
- package/assets/sfx/personagem/footstep_concrete_alt_02.ogg +0 -0
- package/assets/sfx/personagem/footstep_concrete_alt_03.ogg +0 -0
- package/assets/sfx/personagem/footstep_concrete_alt_04.ogg +0 -0
- package/assets/sfx/personagem/footstep_concrete_alt_05.ogg +0 -0
- package/assets/sfx/personagem/footstep_concrete_run_01.ogg +0 -0
- package/assets/sfx/personagem/footstep_concrete_run_02.ogg +0 -0
- package/assets/sfx/personagem/footstep_concrete_run_03.ogg +0 -0
- package/assets/sfx/personagem/footstep_concrete_run_04.ogg +0 -0
- package/assets/sfx/personagem/footstep_concrete_run_05.ogg +0 -0
- package/assets/sfx/personagem/footstep_concrete_walk_01.ogg +0 -0
- package/assets/sfx/personagem/footstep_concrete_walk_02.ogg +0 -0
- package/assets/sfx/personagem/footstep_concrete_walk_03.ogg +0 -0
- package/assets/sfx/personagem/footstep_concrete_walk_04.ogg +0 -0
- package/assets/sfx/personagem/footstep_concrete_walk_05.ogg +0 -0
- package/assets/sfx/personagem/footstep_dirt_run_01.ogg +0 -0
- package/assets/sfx/personagem/footstep_dirt_run_02.ogg +0 -0
- package/assets/sfx/personagem/footstep_dirt_run_03.ogg +0 -0
- package/assets/sfx/personagem/footstep_dirt_run_04.ogg +0 -0
- package/assets/sfx/personagem/footstep_dirt_run_05.ogg +0 -0
- package/assets/sfx/personagem/footstep_dirt_walk_01.ogg +0 -0
- package/assets/sfx/personagem/footstep_dirt_walk_02.ogg +0 -0
- package/assets/sfx/personagem/footstep_dirt_walk_03.ogg +0 -0
- package/assets/sfx/personagem/footstep_dirt_walk_04.ogg +0 -0
- package/assets/sfx/personagem/footstep_dirt_walk_05.ogg +0 -0
- package/assets/sfx/personagem/footstep_generic_alt_01.ogg +0 -0
- package/assets/sfx/personagem/footstep_generic_alt_02.ogg +0 -0
- package/assets/sfx/personagem/footstep_generic_alt_03.ogg +0 -0
- package/assets/sfx/personagem/footstep_generic_alt_04.ogg +0 -0
- package/assets/sfx/personagem/footstep_generic_alt_05.ogg +0 -0
- package/assets/sfx/personagem/footstep_generic_alt_06.ogg +0 -0
- package/assets/sfx/personagem/footstep_generic_alt_07.ogg +0 -0
- package/assets/sfx/personagem/footstep_generic_alt_08.ogg +0 -0
- package/assets/sfx/personagem/footstep_generic_alt_09.ogg +0 -0
- package/assets/sfx/personagem/footstep_generic_alt_10.ogg +0 -0
- package/assets/sfx/personagem/footstep_grass_alt2_01.ogg +0 -0
- package/assets/sfx/personagem/footstep_grass_alt2_02.ogg +0 -0
- package/assets/sfx/personagem/footstep_grass_alt2_03.ogg +0 -0
- package/assets/sfx/personagem/footstep_grass_alt2_04.ogg +0 -0
- package/assets/sfx/personagem/footstep_grass_alt_01.ogg +0 -0
- package/assets/sfx/personagem/footstep_grass_alt_02.ogg +0 -0
- package/assets/sfx/personagem/footstep_grass_alt_03.ogg +0 -0
- package/assets/sfx/personagem/footstep_grass_alt_04.ogg +0 -0
- package/assets/sfx/personagem/footstep_grass_alt_05.ogg +0 -0
- package/assets/sfx/personagem/footstep_grass_run_01.ogg +0 -0
- package/assets/sfx/personagem/footstep_grass_run_02.ogg +0 -0
- package/assets/sfx/personagem/footstep_grass_run_03.ogg +0 -0
- package/assets/sfx/personagem/footstep_grass_run_04.ogg +0 -0
- package/assets/sfx/personagem/footstep_grass_run_05.ogg +0 -0
- package/assets/sfx/personagem/footstep_grass_walk_01.ogg +0 -0
- package/assets/sfx/personagem/footstep_grass_walk_02.ogg +0 -0
- package/assets/sfx/personagem/footstep_grass_walk_03.ogg +0 -0
- package/assets/sfx/personagem/footstep_grass_walk_04.ogg +0 -0
- package/assets/sfx/personagem/footstep_grass_walk_05.ogg +0 -0
- package/assets/sfx/personagem/footstep_hard_alt_01.ogg +0 -0
- package/assets/sfx/personagem/footstep_hard_alt_02.ogg +0 -0
- package/assets/sfx/personagem/footstep_hard_alt_03.ogg +0 -0
- package/assets/sfx/personagem/footstep_hard_alt_04.ogg +0 -0
- package/assets/sfx/personagem/footstep_hard_alt_05.ogg +0 -0
- package/assets/sfx/personagem/footstep_hard_alt_06.ogg +0 -0
- package/assets/sfx/personagem/footstep_hard_alt_07.ogg +0 -0
- package/assets/sfx/personagem/footstep_hard_alt_08.ogg +0 -0
- package/assets/sfx/personagem/footstep_hard_alt_09.ogg +0 -0
- package/assets/sfx/personagem/footstep_metal_run_01.ogg +0 -0
- package/assets/sfx/personagem/footstep_metal_run_02.ogg +0 -0
- package/assets/sfx/personagem/footstep_metal_run_03.ogg +0 -0
- package/assets/sfx/personagem/footstep_metal_run_04.ogg +0 -0
- package/assets/sfx/personagem/footstep_metal_run_05.ogg +0 -0
- package/assets/sfx/personagem/footstep_metal_walk_01.ogg +0 -0
- package/assets/sfx/personagem/footstep_metal_walk_02.ogg +0 -0
- package/assets/sfx/personagem/footstep_metal_walk_03.ogg +0 -0
- package/assets/sfx/personagem/footstep_metal_walk_04.ogg +0 -0
- package/assets/sfx/personagem/footstep_metal_walk_05.ogg +0 -0
- package/assets/sfx/personagem/footstep_snow_alt_01.ogg +0 -0
- package/assets/sfx/personagem/footstep_snow_alt_02.ogg +0 -0
- package/assets/sfx/personagem/footstep_snow_alt_03.ogg +0 -0
- package/assets/sfx/personagem/footstep_snow_alt_04.ogg +0 -0
- package/assets/sfx/personagem/footstep_snow_alt_05.ogg +0 -0
- package/assets/sfx/personagem/footstep_snow_run_01.ogg +0 -0
- package/assets/sfx/personagem/footstep_snow_run_02.ogg +0 -0
- package/assets/sfx/personagem/footstep_snow_run_03.ogg +0 -0
- package/assets/sfx/personagem/footstep_snow_run_04.ogg +0 -0
- package/assets/sfx/personagem/footstep_snow_run_05.ogg +0 -0
- package/assets/sfx/personagem/footstep_snow_walk_01.ogg +0 -0
- package/assets/sfx/personagem/footstep_snow_walk_02.ogg +0 -0
- package/assets/sfx/personagem/footstep_snow_walk_03.ogg +0 -0
- package/assets/sfx/personagem/footstep_snow_walk_04.ogg +0 -0
- package/assets/sfx/personagem/footstep_snow_walk_05.ogg +0 -0
- package/assets/sfx/personagem/footstep_wood_alt_01.ogg +0 -0
- package/assets/sfx/personagem/footstep_wood_alt_02.ogg +0 -0
- package/assets/sfx/personagem/footstep_wood_alt_03.ogg +0 -0
- package/assets/sfx/personagem/footstep_wood_alt_04.ogg +0 -0
- package/assets/sfx/personagem/footstep_wood_alt_05.ogg +0 -0
- package/assets/sfx/personagem/footstep_wood_run_01.ogg +0 -0
- package/assets/sfx/personagem/footstep_wood_run_02.ogg +0 -0
- package/assets/sfx/personagem/footstep_wood_run_03.ogg +0 -0
- package/assets/sfx/personagem/footstep_wood_run_04.ogg +0 -0
- package/assets/sfx/personagem/footstep_wood_run_05.ogg +0 -0
- package/assets/sfx/personagem/footstep_wood_walk_01.ogg +0 -0
- package/assets/sfx/personagem/footstep_wood_walk_02.ogg +0 -0
- package/assets/sfx/personagem/footstep_wood_walk_03.ogg +0 -0
- package/assets/sfx/personagem/footstep_wood_walk_04.ogg +0 -0
- package/assets/sfx/personagem/footstep_wood_walk_05.ogg +0 -0
- package/assets/sfx/personagem/frying_pan_hit_01.ogg +0 -0
- package/assets/sfx/personagem/frying_pan_hit_02.ogg +0 -0
- package/assets/sfx/personagem/frying_pan_hit_03.ogg +0 -0
- package/assets/sfx/personagem/grab_01.ogg +0 -0
- package/assets/sfx/personagem/kick_hit_01.ogg +0 -0
- package/assets/sfx/personagem/kick_hit_02.ogg +0 -0
- package/assets/sfx/personagem/kick_hit_03.ogg +0 -0
- package/assets/sfx/personagem/kick_hit_04.ogg +0 -0
- package/assets/sfx/personagem/kick_hit_05.ogg +0 -0
- package/assets/sfx/personagem/knife_draw_01.ogg +0 -0
- package/assets/sfx/personagem/knife_draw_02.ogg +0 -0
- package/assets/sfx/personagem/knife_draw_03.ogg +0 -0
- package/assets/sfx/personagem/knife_scrape_01.ogg +0 -0
- package/assets/sfx/personagem/knife_slash_01.ogg +0 -0
- package/assets/sfx/personagem/knife_slash_02.ogg +0 -0
- package/assets/sfx/personagem/land_concrete_01.ogg +0 -0
- package/assets/sfx/personagem/land_concrete_02.ogg +0 -0
- package/assets/sfx/personagem/land_dirt_01.ogg +0 -0
- package/assets/sfx/personagem/land_dirt_02.ogg +0 -0
- package/assets/sfx/personagem/land_grass_01.ogg +0 -0
- package/assets/sfx/personagem/land_grass_02.ogg +0 -0
- package/assets/sfx/personagem/land_metal_01.ogg +0 -0
- package/assets/sfx/personagem/land_metal_02.ogg +0 -0
- package/assets/sfx/personagem/land_snow_01.ogg +0 -0
- package/assets/sfx/personagem/land_snow_02.ogg +0 -0
- package/assets/sfx/personagem/land_wood_01.ogg +0 -0
- package/assets/sfx/personagem/land_wood_02.ogg +0 -0
- package/assets/sfx/personagem/player_breath_run_01.ogg +0 -0
- package/assets/sfx/personagem/player_breath_run_02.ogg +0 -0
- package/assets/sfx/personagem/player_breath_run_03.ogg +0 -0
- package/assets/sfx/personagem/player_breath_run_04.ogg +0 -0
- package/assets/sfx/personagem/player_breath_run_05.ogg +0 -0
- package/assets/sfx/personagem/player_death_female_01.ogg +0 -0
- package/assets/sfx/personagem/player_death_female_02.ogg +0 -0
- package/assets/sfx/personagem/player_death_female_03.ogg +0 -0
- package/assets/sfx/personagem/player_death_female_04.ogg +0 -0
- package/assets/sfx/personagem/player_death_female_05.ogg +0 -0
- package/assets/sfx/personagem/player_death_female_06.ogg +0 -0
- package/assets/sfx/personagem/player_death_female_07.ogg +0 -0
- package/assets/sfx/personagem/player_death_female_08.ogg +0 -0
- package/assets/sfx/personagem/player_death_male_01.ogg +0 -0
- package/assets/sfx/personagem/player_death_male_02.ogg +0 -0
- package/assets/sfx/personagem/player_death_male_03.ogg +0 -0
- package/assets/sfx/personagem/player_death_male_04.ogg +0 -0
- package/assets/sfx/personagem/player_death_male_05.ogg +0 -0
- package/assets/sfx/personagem/player_death_male_06.ogg +0 -0
- package/assets/sfx/personagem/player_death_male_07.ogg +0 -0
- package/assets/sfx/personagem/player_death_male_08.ogg +0 -0
- package/assets/sfx/personagem/player_effort_01.ogg +0 -0
- package/assets/sfx/personagem/player_effort_02.ogg +0 -0
- package/assets/sfx/personagem/player_effort_03.ogg +0 -0
- package/assets/sfx/personagem/player_effort_04.ogg +0 -0
- package/assets/sfx/personagem/player_hurt_female_01.ogg +0 -0
- package/assets/sfx/personagem/player_hurt_female_02.ogg +0 -0
- package/assets/sfx/personagem/player_hurt_female_03.ogg +0 -0
- package/assets/sfx/personagem/player_hurt_female_04.ogg +0 -0
- package/assets/sfx/personagem/player_hurt_female_05.ogg +0 -0
- package/assets/sfx/personagem/player_hurt_female_06.ogg +0 -0
- package/assets/sfx/personagem/player_hurt_male_01.ogg +0 -0
- package/assets/sfx/personagem/player_hurt_male_02.ogg +0 -0
- package/assets/sfx/personagem/player_hurt_male_03.ogg +0 -0
- package/assets/sfx/personagem/player_hurt_male_04.ogg +0 -0
- package/assets/sfx/personagem/player_hurt_male_05.ogg +0 -0
- package/assets/sfx/personagem/player_hurt_male_06.ogg +0 -0
- package/assets/sfx/personagem/punch_hit_alt_01.ogg +0 -0
- package/assets/sfx/personagem/punch_hit_alt_02.ogg +0 -0
- package/assets/sfx/personagem/punch_hit_alt_03.ogg +0 -0
- package/assets/sfx/personagem/punch_hit_alt_04.ogg +0 -0
- package/assets/sfx/personagem/punch_hit_alt_05.ogg +0 -0
- package/assets/sfx/personagem/punch_hit_alt_06.ogg +0 -0
- package/assets/sfx/personagem/punch_hit_alt_07.ogg +0 -0
- package/assets/sfx/personagem/punch_hit_alt_08.ogg +0 -0
- package/assets/sfx/personagem/punch_hit_alt_09.ogg +0 -0
- package/assets/sfx/personagem/punch_hit_alt_10.ogg +0 -0
- package/assets/sfx/personagem/punch_hit_body_01.ogg +0 -0
- package/assets/sfx/personagem/punch_hit_body_02.ogg +0 -0
- package/assets/sfx/personagem/punch_hit_body_03.ogg +0 -0
- package/assets/sfx/personagem/punch_hit_body_04.ogg +0 -0
- package/assets/sfx/personagem/punch_hit_body_05.ogg +0 -0
- package/assets/sfx/personagem/punch_hit_body_06.ogg +0 -0
- package/assets/sfx/personagem/punch_hit_face_01.ogg +0 -0
- package/assets/sfx/personagem/punch_hit_face_02.ogg +0 -0
- package/assets/sfx/personagem/punch_hit_face_03.ogg +0 -0
- package/assets/sfx/personagem/punch_hit_face_04.ogg +0 -0
- package/assets/sfx/personagem/punch_hit_face_05.ogg +0 -0
- package/assets/sfx/personagem/punch_swing_01.ogg +0 -0
- package/assets/sfx/personagem/punch_swing_02.ogg +0 -0
- package/assets/sfx/personagem/punch_swing_03.ogg +0 -0
- package/assets/sfx/personagem/punch_swing_04.ogg +0 -0
- package/assets/sfx/personagem/punch_swing_05.ogg +0 -0
- package/assets/sfx/personagem/punch_swing_06.ogg +0 -0
- package/assets/sfx/personagem/punch_swing_07.ogg +0 -0
- package/assets/sfx/personagem/punch_swing_08.ogg +0 -0
- package/assets/sfx/personagem/scream_01.ogg +0 -0
- package/assets/sfx/personagem/scream_02.ogg +0 -0
- package/assets/sfx/personagem/scream_03.ogg +0 -0
- package/assets/sfx/personagem/scream_04.ogg +0 -0
- package/assets/sfx/personagem/slap_01.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_01.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_02.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_03.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_04.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_05.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_06.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_07.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_08.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_09.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_10.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_11.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_12.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_13.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_14.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_15.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_16.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_17.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_18.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_19.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_20.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_21.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_22.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_23.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_24.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_25.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_26.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_27.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_28.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_29.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_30.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_31.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_32.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_33.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_34.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_35.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_36.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_37.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_38.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_39.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_40.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_41.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_42.ogg +0 -0
- package/assets/sfx/personagem/swing_whoosh_alt_43.ogg +0 -0
- package/assets/sfx/personagem/zombie_creature_01.ogg +0 -0
- package/assets/sfx/personagem/zombie_creature_02.ogg +0 -0
- package/assets/sfx/personagem/zombie_creature_03.ogg +0 -0
- package/assets/sfx/personagem/zombie_death_01.ogg +0 -0
- package/assets/sfx/personagem/zombie_death_02.ogg +0 -0
- package/assets/sfx/personagem/zombie_death_03.ogg +0 -0
- package/assets/sfx/personagem/zombie_death_04.ogg +0 -0
- package/assets/sfx/personagem/zombie_death_05.ogg +0 -0
- package/assets/sfx/personagem/zombie_death_06.ogg +0 -0
- package/assets/sfx/personagem/zombie_death_07.ogg +0 -0
- package/assets/sfx/personagem/zombie_death_08.ogg +0 -0
- package/assets/sfx/personagem/zombie_groan_01.ogg +0 -0
- package/assets/sfx/personagem/zombie_groan_02.ogg +0 -0
- package/assets/sfx/personagem/zombie_groan_03.ogg +0 -0
- package/assets/sfx/personagem/zombie_groan_04.ogg +0 -0
- package/assets/sfx/personagem/zombie_groan_05.ogg +0 -0
- package/assets/sfx/personagem/zombie_groan_06.ogg +0 -0
- package/assets/sfx/personagem/zombie_groan_07.ogg +0 -0
- package/assets/sfx/personagem/zombie_groan_08.ogg +0 -0
- package/assets/sfx/personagem/zombie_groan_09.ogg +0 -0
- package/assets/sfx/personagem/zombie_groan_10.ogg +0 -0
- package/assets/sfx/personagem/zombie_groan_11.ogg +0 -0
- package/assets/sfx/veiculos/car_door_open_01.ogg +0 -0
- package/assets/sfx/veiculos/car_door_shut_01.ogg +0 -0
- package/assets/sfx/veiculos/car_gear_shift_01.ogg +0 -0
- package/assets/sfx/veiculos/car_trunk_shut_01.ogg +0 -0
- package/assets/sfx/veiculos/car_window_01.ogg +0 -0
- package/assets/sfx/veiculos/car_window_02.ogg +0 -0
- package/assets/sfx/veiculos/engine_loop_car_high_01.ogg +0 -0
- package/assets/sfx/veiculos/engine_loop_car_idle_01.ogg +0 -0
- package/assets/sfx/veiculos/engine_start_run_stop_01.ogg +0 -0
- package/assets/sfx/veiculos/engine_start_run_stop_02.ogg +0 -0
- package/dist/chunk-7TLFY7VO.js +4170 -0
- package/dist/chunk-7TLFY7VO.js.map +1 -0
- package/dist/index.d.ts +228 -603
- package/dist/index.global.js +2958 -463
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +1088 -2044
- package/dist/index.js.map +1 -1
- package/dist/locale-BugSe8dA.d.ts +1071 -0
- package/dist/testing.d.ts +82 -0
- package/dist/testing.js +19 -0
- package/dist/testing.js.map +1 -0
- package/package.json +13 -6
|
@@ -0,0 +1,1071 @@
|
|
|
1
|
+
import { Vec3, DeferredQueue, TestableModule } from '@adatechnology/game-contracts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Sound recipes are data. A recipe says which nodes a sound has and which numbers drive them; ranges are drawn when the sound is planned, in
|
|
5
|
+
* the order the fields are written (see `planSound`), so a recipe ported from a team routine draws its random numbers in the routine's order.
|
|
6
|
+
*/
|
|
7
|
+
declare const BUS_IDS: readonly ["weapons", "voices", "world", "ambience", "weather", "ui"];
|
|
8
|
+
type BusId = (typeof BUS_IDS)[number];
|
|
9
|
+
/** A named number: from `PlayOptions.params` or the recipe's `vars`, times `scale`, plus `add`. */
|
|
10
|
+
type ParamRef = {
|
|
11
|
+
readonly param: string;
|
|
12
|
+
readonly scale?: number;
|
|
13
|
+
readonly add?: number;
|
|
14
|
+
};
|
|
15
|
+
/** A number, a `[min, max]` drawn uniformly (`min + random × (max − min)`), or a named number. */
|
|
16
|
+
type Range = number | readonly [min: number, max: number] | ParamRef;
|
|
17
|
+
/** Seconds from the layer start: a range, the layer `'duration'`, or `'0.6d'` (0.6 × the layer duration). */
|
|
18
|
+
type Time = Range | 'duration' | `${number}d`;
|
|
19
|
+
type Curve = 'linear' | 'exp';
|
|
20
|
+
/**
|
|
21
|
+
* How an AudioParam moves:
|
|
22
|
+
* - `{ set }` assigns `.value`;
|
|
23
|
+
* - `{ set, to, curve, over }` assigns `.value`, then ramps to `to` at `over`;
|
|
24
|
+
* - `{ from }` calls `setValueAtTime(from)` at the start; with `to`, `curve` and `over` it then ramps to `to` (`'from'` is the value drawn for `from`: the art scene ramps a tone back to its own start when it gives no end).
|
|
25
|
+
*/
|
|
26
|
+
type Automation = {
|
|
27
|
+
readonly set: Range;
|
|
28
|
+
readonly to?: Range | 'from';
|
|
29
|
+
readonly curve?: Curve;
|
|
30
|
+
readonly over?: Time;
|
|
31
|
+
} | {
|
|
32
|
+
readonly from: Range;
|
|
33
|
+
readonly to?: Range | 'from';
|
|
34
|
+
readonly curve?: Curve;
|
|
35
|
+
readonly over?: Time;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* One gain point: time (seconds, or `'0.6d'`), value and how it is reached (`set` = `setValueAtTime`, or a ramp). The value is multiplied by the
|
|
39
|
+
* layer level (volume, distance and layer gain) except when the fourth item is `'fixed'` (the floor a ramp falls to, such as 0.001).
|
|
40
|
+
*/
|
|
41
|
+
type EnvelopePoint = readonly [time: number | `${number}d`, value: number, curve: 'set' | Curve] | readonly [time: number | `${number}d`, value: number, curve: 'set' | Curve, fixed: 'fixed'];
|
|
42
|
+
type Envelope = readonly EnvelopePoint[];
|
|
43
|
+
type FilterSpec = {
|
|
44
|
+
readonly type: BiquadFilterType;
|
|
45
|
+
readonly frequency: Automation;
|
|
46
|
+
readonly q?: Range;
|
|
47
|
+
/** The BiquadFilter gain (shelf and peaking types). */
|
|
48
|
+
readonly gain?: Range;
|
|
49
|
+
/** A gain node after the filter, for a parallel bank where each band has its own level (the game's scream formants). */
|
|
50
|
+
readonly level?: Range;
|
|
51
|
+
};
|
|
52
|
+
type FilterBank = {
|
|
53
|
+
readonly mode: 'serial' | 'parallel';
|
|
54
|
+
readonly bank: readonly FilterSpec[];
|
|
55
|
+
};
|
|
56
|
+
/** An LFO. `depth` is absolute, or a factor of the source start frequency. With `base`, gain modulation goes through its own gain stage (the game rotor). */
|
|
57
|
+
type Modulator = {
|
|
58
|
+
readonly target: 'gain' | 'frequency';
|
|
59
|
+
/** Left out, the oscillator keeps its default (sine) and no type is set. */
|
|
60
|
+
readonly wave?: OscillatorType;
|
|
61
|
+
readonly rate: Range;
|
|
62
|
+
readonly depth: Range | {
|
|
63
|
+
readonly scaleOf: 'frequency';
|
|
64
|
+
readonly factor: number;
|
|
65
|
+
};
|
|
66
|
+
readonly base?: number;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Noise from the engine's seeded buffer. `offset` is where playback starts in it: `'random'` (random × `offsetScale`, default 1), `'fit'`
|
|
70
|
+
* (random × (buffer length − duration)) or seconds. `loop` sets the source to loop (the art scene sets it on every noise source).
|
|
71
|
+
*/
|
|
72
|
+
type NoiseSource = {
|
|
73
|
+
readonly kind: 'noise';
|
|
74
|
+
readonly offset?: 'random' | 'fit' | number;
|
|
75
|
+
readonly offsetScale?: number;
|
|
76
|
+
readonly loop?: boolean;
|
|
77
|
+
};
|
|
78
|
+
type OscSource = {
|
|
79
|
+
readonly kind: 'osc';
|
|
80
|
+
readonly wave: OscillatorType;
|
|
81
|
+
readonly frequency: Automation;
|
|
82
|
+
};
|
|
83
|
+
/** The art scene's `voice`: an oscillator with vibrato through formant bands, plus a band of breath noise, summed and boosted. */
|
|
84
|
+
type FormantVoiceSource = {
|
|
85
|
+
readonly kind: 'formant_voice';
|
|
86
|
+
readonly wave: OscillatorType;
|
|
87
|
+
readonly frequency: Automation;
|
|
88
|
+
/** Vibrato rate, and depth as a factor of the start frequency. */
|
|
89
|
+
readonly vibrato: {
|
|
90
|
+
readonly rate: Range;
|
|
91
|
+
readonly depth: number;
|
|
92
|
+
};
|
|
93
|
+
readonly formants: readonly {
|
|
94
|
+
readonly frequency: Range;
|
|
95
|
+
readonly q: number;
|
|
96
|
+
}[];
|
|
97
|
+
readonly breath: {
|
|
98
|
+
readonly frequency: Range;
|
|
99
|
+
readonly q: number;
|
|
100
|
+
readonly gain: Range;
|
|
101
|
+
};
|
|
102
|
+
readonly mix: number;
|
|
103
|
+
};
|
|
104
|
+
type LayerSource = NoiseSource | OscSource | FormantVoiceSource;
|
|
105
|
+
type Layer = {
|
|
106
|
+
/** Start, seconds after the sound starts. */
|
|
107
|
+
readonly at?: Range;
|
|
108
|
+
/** Overrides the recipe duration for this layer. */
|
|
109
|
+
readonly duration?: Range;
|
|
110
|
+
/** Seconds the source keeps running after the duration (the `+ 0.05` of the team routines). Default: the recipe's, else 0.05. */
|
|
111
|
+
readonly tail?: number;
|
|
112
|
+
/** The layer played `count` times, `spacing` seconds apart (the game's animal calls). */
|
|
113
|
+
readonly repeat?: {
|
|
114
|
+
readonly count: number;
|
|
115
|
+
readonly spacing: number;
|
|
116
|
+
};
|
|
117
|
+
/** Layer level before distance. Default 1. */
|
|
118
|
+
readonly gain?: Range;
|
|
119
|
+
/** Send to the reverb, 0..1 or more (the art scene uses up to 1.2). */
|
|
120
|
+
readonly wet?: number;
|
|
121
|
+
readonly source: LayerSource;
|
|
122
|
+
readonly filters?: FilterBank;
|
|
123
|
+
readonly modulators?: readonly Modulator[];
|
|
124
|
+
readonly envelope: Envelope;
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* Distance falloff of a sound's level:
|
|
128
|
+
* - `inverse_square`: `volume / (1 + d² × k)`; `cutoffK` also divides every lowpass cutoff by `1 + d × cutoffK` (the game's muffling);
|
|
129
|
+
* - `linear`: `max(0, 1 − d / range)`, silent at or below `minGain`;
|
|
130
|
+
* - `none`: no distance.
|
|
131
|
+
* `scale` multiplies the level (the game's boom is 1.4 at the source), and below `minGain` the sound is not played.
|
|
132
|
+
*/
|
|
133
|
+
type Falloff = {
|
|
134
|
+
readonly model: 'inverse_square';
|
|
135
|
+
readonly k: number;
|
|
136
|
+
readonly minGain?: number;
|
|
137
|
+
readonly cutoffK?: number;
|
|
138
|
+
readonly scale?: number;
|
|
139
|
+
} | {
|
|
140
|
+
readonly model: 'linear';
|
|
141
|
+
readonly range: number;
|
|
142
|
+
readonly minGain?: number;
|
|
143
|
+
readonly scale?: number;
|
|
144
|
+
} | {
|
|
145
|
+
readonly model: 'none';
|
|
146
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* The order the realizer creates and wires the nodes in. Each one is the order of the team routine it reproduces, so the trace of the SDK
|
|
149
|
+
* matches the trace of the team code node for node:
|
|
150
|
+
* - `layered` (default): the art scene's `sNoise`, `sTone` and `voice`; every layer has its own output stage (distance gain, pan, reverb send);
|
|
151
|
+
* - `burst`: the game's `sfx` (jogo L62089);
|
|
152
|
+
* - `scream`: the game's `grito` (L62128);
|
|
153
|
+
* - `groan`: the game's `voz` (L62143);
|
|
154
|
+
* - `boom`: the game's `boom` (L68278);
|
|
155
|
+
* - `static`: the game's `chiado` (L69998);
|
|
156
|
+
* - `chord`: the game's `buzina` (L70272);
|
|
157
|
+
* - `calls`: the game's `bichoSom` (L66625);
|
|
158
|
+
* - `siren`: the art scene's `siren` (L1369);
|
|
159
|
+
* - `weapon`: the weapon audio of the kit (`weapons-three`): per layer a filtered noise burst or an oscillator, then its own gain, chained to the bus.
|
|
160
|
+
* Every order but `layered` puts the level into the envelope and connects straight to the bus.
|
|
161
|
+
*/
|
|
162
|
+
declare const BUILD_ORDERS: readonly ["layered", "burst", "scream", "groan", "boom", "static", "chord", "calls", "siren", "weapon"];
|
|
163
|
+
type BuildOrder = (typeof BUILD_ORDERS)[number];
|
|
164
|
+
type SoundRecipe = {
|
|
165
|
+
readonly id: string;
|
|
166
|
+
readonly bus: BusId;
|
|
167
|
+
readonly order?: BuildOrder;
|
|
168
|
+
/** Named numbers drawn first, in the order written; layers read them with `{ param }`. */
|
|
169
|
+
readonly vars?: Readonly<Record<string, Range>>;
|
|
170
|
+
readonly duration?: Range;
|
|
171
|
+
readonly tail?: number;
|
|
172
|
+
readonly layers: readonly Layer[];
|
|
173
|
+
readonly falloff?: Falloff;
|
|
174
|
+
/** Stereo pan from the listener (the art scene's `panFor`). Only the `layered` order has an output stage to pan. */
|
|
175
|
+
readonly pan?: boolean;
|
|
176
|
+
/** Voice group for the limiter (`undead_voice`...). */
|
|
177
|
+
readonly group?: string;
|
|
178
|
+
/** Limiter priority; default from the bus (weapons > voices > world > ambience). */
|
|
179
|
+
readonly priority?: number;
|
|
180
|
+
/**
|
|
181
|
+
* The team routine creates nodes before it checks the level (the game's `bichoSom` creates its gain and filter first): a silent sound is kept as
|
|
182
|
+
* a plan with `silent: true` so the realizer repeats those nodes. Off by default.
|
|
183
|
+
*/
|
|
184
|
+
readonly keepSilent?: boolean;
|
|
185
|
+
/** Where the numbers come from: `"jogo:L62128"`, `"cena:L1342"`, or `"sdk"` for values the kit chose. */
|
|
186
|
+
readonly sources: readonly string[];
|
|
187
|
+
};
|
|
188
|
+
/**
|
|
189
|
+
* The order the loop realizer creates the nodes in:
|
|
190
|
+
* - `game_loop`: the game's `loopSet` (L62109): gain and filter first, nodes created the first time the volume passes `startAbove`, gain from 0;
|
|
191
|
+
* - `chain_loop`: the art scene's loops in `initAudio` (L1314–1316): source, filters, gain at its starting volume, created when the loop opens.
|
|
192
|
+
*/
|
|
193
|
+
type LoopOrder = 'game_loop' | 'chain_loop';
|
|
194
|
+
type LoopRecipe = {
|
|
195
|
+
readonly id: string;
|
|
196
|
+
readonly bus: BusId;
|
|
197
|
+
readonly order?: LoopOrder;
|
|
198
|
+
/** An oscillator loop may leave the frequency out: it starts at the default and `set({ frequency })` glides it (the game's motor). */
|
|
199
|
+
readonly source: (NoiseSource & {
|
|
200
|
+
readonly loop: true;
|
|
201
|
+
}) | {
|
|
202
|
+
readonly kind: 'osc';
|
|
203
|
+
readonly wave: OscillatorType;
|
|
204
|
+
readonly frequency?: Automation;
|
|
205
|
+
readonly loop: true;
|
|
206
|
+
};
|
|
207
|
+
readonly filters?: FilterBank;
|
|
208
|
+
readonly modulators?: readonly Modulator[];
|
|
209
|
+
/** `setTargetAtTime` time constants (jogo L62125–62126: 0.15 for the volume, 0.08 for the frequency). */
|
|
210
|
+
readonly smoothing?: {
|
|
211
|
+
readonly volume: number;
|
|
212
|
+
readonly frequency: number;
|
|
213
|
+
};
|
|
214
|
+
/** Nodes are created the first time the volume reaches this (jogo L62112: 0.002). */
|
|
215
|
+
readonly startAbove?: number;
|
|
216
|
+
/** Volume the gain starts at when the loop opens (`chain_loop`). */
|
|
217
|
+
readonly volume?: number;
|
|
218
|
+
/**
|
|
219
|
+
* Distance falloff of the loop, applied each time `set` gives a `position` (an engine, a fire, a skid heard from where it is). Left out, the loop is
|
|
220
|
+
* heard at the listener, as the team loops are. `cutoffK` also lowers the first filter's cutoff with the distance, as it does for one-shots.
|
|
221
|
+
*/
|
|
222
|
+
readonly falloff?: Falloff;
|
|
223
|
+
/** Stereo pan from the listener, from the `position` of each `set` (a panner after the gain). Off by default. */
|
|
224
|
+
readonly pan?: boolean;
|
|
225
|
+
readonly sources: readonly string[];
|
|
226
|
+
};
|
|
227
|
+
/**
|
|
228
|
+
* One id that plays one of several recipes (the takes of a footstep, of a punch): `play(id)` draws a variant, never the one it played last time (unless
|
|
229
|
+
* `repeat`), and plays it at a rate drawn from `rate` (1.04 is 4% higher and 4% shorter; see `retunePlan`), so ten footsteps never sound like one.
|
|
230
|
+
*/
|
|
231
|
+
type SoundSet = {
|
|
232
|
+
readonly id: string;
|
|
233
|
+
/** Recipe ids, at least one. */
|
|
234
|
+
readonly variants: readonly string[];
|
|
235
|
+
/** `[min, max]` of the playback rate (pitch and speed together). Default `[1, 1]`. */
|
|
236
|
+
readonly rate?: readonly [min: number, max: number];
|
|
237
|
+
/** Allow the same variant twice in a row (default false). */
|
|
238
|
+
readonly repeat?: boolean;
|
|
239
|
+
};
|
|
240
|
+
type SoundBank = {
|
|
241
|
+
readonly id: string;
|
|
242
|
+
readonly sounds?: readonly SoundRecipe[];
|
|
243
|
+
readonly loops?: readonly LoopRecipe[];
|
|
244
|
+
readonly sets?: readonly SoundSet[];
|
|
245
|
+
/** Sounds played from recorded files (see `sample.ts`). A sample and a recipe may share an id: the sample plays once its files are loaded. */
|
|
246
|
+
readonly samples?: readonly SampleSound[];
|
|
247
|
+
};
|
|
248
|
+
/** One take: a file and its own trim (linear gain, default 1). */
|
|
249
|
+
type SampleRef = {
|
|
250
|
+
readonly url: string;
|
|
251
|
+
readonly gain?: number;
|
|
252
|
+
};
|
|
253
|
+
/** Where a sound happens: a closed room rings short and dense, the open field long and thin. */
|
|
254
|
+
type SampleEnvironment = 'indoor' | 'outdoor';
|
|
255
|
+
/** Where the near take hands over to the far one: all near up to `from` metres, all far from `to`, an equal-power crossfade between. */
|
|
256
|
+
type SampleCrossover = {
|
|
257
|
+
readonly from: number;
|
|
258
|
+
readonly to: number;
|
|
259
|
+
};
|
|
260
|
+
type SampleTail = {
|
|
261
|
+
readonly indoor?: readonly SampleRef[];
|
|
262
|
+
readonly outdoor?: readonly SampleRef[];
|
|
263
|
+
/** Level of the tail against the dry take (default 0.6). */
|
|
264
|
+
readonly gain?: number;
|
|
265
|
+
/** Seconds after the start (default 0: the tail file carries its own pre-delay). */
|
|
266
|
+
readonly at?: number;
|
|
267
|
+
};
|
|
268
|
+
/**
|
|
269
|
+
* A set of takes for a strength of the action (criterion C7: a light blow, a heavy one, a car at 10 or 60 km/h): from `from` (0..1) up, these takes
|
|
270
|
+
* replace `close` and `far`. The tier played is the last one whose `from` is at or below `PlayOptions.intensity`.
|
|
271
|
+
*/
|
|
272
|
+
type SampleTier = {
|
|
273
|
+
readonly name: string;
|
|
274
|
+
readonly from: number;
|
|
275
|
+
readonly close: readonly SampleRef[];
|
|
276
|
+
readonly far?: readonly SampleRef[];
|
|
277
|
+
};
|
|
278
|
+
type SampleSound = {
|
|
279
|
+
readonly id: string;
|
|
280
|
+
readonly bus: BusId;
|
|
281
|
+
/** The takes heard near; at least one (the criteria ask four for a sound heard all the time). */
|
|
282
|
+
readonly close: readonly SampleRef[];
|
|
283
|
+
/** The takes heard far; without them the near take plays at every distance (muffled by the lowpass). */
|
|
284
|
+
readonly far?: readonly SampleRef[];
|
|
285
|
+
/** Takes by strength (light, medium, heavy), in rising `from`; without `intensity` the near takes above play. */
|
|
286
|
+
readonly tiers?: readonly SampleTier[];
|
|
287
|
+
/** Default `{ from: 30, to: 80 }`. */
|
|
288
|
+
readonly crossover?: SampleCrossover;
|
|
289
|
+
readonly tail?: SampleTail;
|
|
290
|
+
/** ± fraction of the playback rate drawn per play (default 0.04: ±4 %, inside the 3–5 % of the criteria). 0 plays every take at its pitch. */
|
|
291
|
+
readonly pitch?: number;
|
|
292
|
+
/** Level of the sound (default 1). */
|
|
293
|
+
readonly gain?: number;
|
|
294
|
+
/** Default `{ model: 'inverse_square', k: 0.002, minGain: 0.002 }`: a recorded take already sounds near or far, so the curve is gentler than a recipe's. */
|
|
295
|
+
readonly falloff?: Falloff;
|
|
296
|
+
/** The lowpass cutoff is `20000 / (1 + d × cutoffK)` Hz (default 0.01: 10 kHz at 100 m). 0 turns the distance lowpass off. */
|
|
297
|
+
readonly cutoffK?: number;
|
|
298
|
+
/** Stereo pan from the listener (default true). */
|
|
299
|
+
readonly pan?: boolean;
|
|
300
|
+
readonly group?: string;
|
|
301
|
+
readonly priority?: number;
|
|
302
|
+
/**
|
|
303
|
+
* At most `voices` plays of this sound ring at once: a new one fades the oldest out in `fade` seconds (default 0.03) at its own start. Rapid fire
|
|
304
|
+
* then stays shot by shot instead of a wall of overlapping takes (criterion C9). Without it every play rings to its end.
|
|
305
|
+
*/
|
|
306
|
+
readonly choke?: {
|
|
307
|
+
readonly voices: number;
|
|
308
|
+
readonly fade?: number;
|
|
309
|
+
};
|
|
310
|
+
/**
|
|
311
|
+
* A continuous sound (fire, rain, an engine idling) that `engine.loop(id)` plays: the near takes chained without a seam, each crossed into the next
|
|
312
|
+
* in `crossfade` seconds (default 0.25, equal power), never the same take twice in a row. While the files load, the recipe loop of `fallback`
|
|
313
|
+
* (or of the same id) plays. `play(id)` still plays one take as a one-shot.
|
|
314
|
+
*/
|
|
315
|
+
readonly loop?: boolean | {
|
|
316
|
+
readonly crossfade?: number;
|
|
317
|
+
};
|
|
318
|
+
/** A recipe id the engine plays while the files are not loaded yet (or failed): the synthesized sound stays as the fallback. */
|
|
319
|
+
readonly fallback?: string;
|
|
320
|
+
/** Where each file came from: `"freesound:123456 autor CC0"`, or `"sdk"` for files the kit made. */
|
|
321
|
+
readonly sources: readonly string[];
|
|
322
|
+
};
|
|
323
|
+
|
|
324
|
+
/** Where the ears are. `yaw` turns around y like a three.js camera: the right ear points at `(cos yaw, 0, −sin yaw)`. */
|
|
325
|
+
type Listener = {
|
|
326
|
+
readonly position: Vec3;
|
|
327
|
+
readonly yaw: number;
|
|
328
|
+
};
|
|
329
|
+
type DistanceMode = 'xz' | '3d';
|
|
330
|
+
declare const DEFAULT_LISTENER: Listener;
|
|
331
|
+
/** The art scene clamps the pan to ±0.85 and never divides by less than 2 m (cena L1319). */
|
|
332
|
+
declare const PAN_LIMIT = 0.85;
|
|
333
|
+
declare const PAN_MIN_DISTANCE = 2;
|
|
334
|
+
/** Distance from the listener: on the ground (`xz`, the teams' choice) or in 3D. */
|
|
335
|
+
declare function listenerDistance(listener: Listener, position: Vec3, mode?: DistanceMode): number;
|
|
336
|
+
/** The art scene's `panFor`: the side the sound is on, −0.85 (left) to 0.85 (right). No HRTF, for cost. */
|
|
337
|
+
declare function panFor(listener: Listener, position: Vec3): number;
|
|
338
|
+
|
|
339
|
+
/** How an AudioParam moves, with every number resolved and every time in seconds from the layer start. */
|
|
340
|
+
type PlannedAutomation = {
|
|
341
|
+
/** Assigned to `.value`. */
|
|
342
|
+
readonly value?: number;
|
|
343
|
+
/** `setValueAtTime(from)` at the layer start. */
|
|
344
|
+
readonly from?: number;
|
|
345
|
+
/** Ramp target, reached `at` seconds after the layer start. */
|
|
346
|
+
readonly to?: number;
|
|
347
|
+
readonly curve?: Curve;
|
|
348
|
+
readonly at?: number;
|
|
349
|
+
};
|
|
350
|
+
type PlannedFilter = {
|
|
351
|
+
readonly type: BiquadFilterType;
|
|
352
|
+
readonly frequency: PlannedAutomation;
|
|
353
|
+
readonly q?: number;
|
|
354
|
+
readonly gain?: number;
|
|
355
|
+
readonly level?: number;
|
|
356
|
+
};
|
|
357
|
+
type PlannedModulator = {
|
|
358
|
+
readonly target: 'gain' | 'frequency';
|
|
359
|
+
readonly wave?: OscillatorType;
|
|
360
|
+
readonly rate: number;
|
|
361
|
+
readonly depth: number;
|
|
362
|
+
readonly base?: number;
|
|
363
|
+
};
|
|
364
|
+
type PlannedSource = {
|
|
365
|
+
readonly kind: 'noise';
|
|
366
|
+
readonly offset: number;
|
|
367
|
+
readonly loop: boolean;
|
|
368
|
+
} | {
|
|
369
|
+
readonly kind: 'osc';
|
|
370
|
+
readonly wave: OscillatorType;
|
|
371
|
+
readonly frequency: PlannedAutomation;
|
|
372
|
+
} | {
|
|
373
|
+
readonly kind: 'formant_voice';
|
|
374
|
+
readonly wave: OscillatorType;
|
|
375
|
+
readonly frequency: PlannedAutomation;
|
|
376
|
+
readonly vibrato: {
|
|
377
|
+
readonly rate: number;
|
|
378
|
+
readonly depth: number;
|
|
379
|
+
};
|
|
380
|
+
readonly formants: readonly {
|
|
381
|
+
readonly frequency: number;
|
|
382
|
+
readonly q: number;
|
|
383
|
+
}[];
|
|
384
|
+
readonly breath: {
|
|
385
|
+
readonly frequency: number;
|
|
386
|
+
readonly q: number;
|
|
387
|
+
readonly gain: number;
|
|
388
|
+
readonly offset: number;
|
|
389
|
+
};
|
|
390
|
+
readonly mix: number;
|
|
391
|
+
};
|
|
392
|
+
type PlannedEnvelopePoint = {
|
|
393
|
+
readonly time: number;
|
|
394
|
+
readonly value: number;
|
|
395
|
+
readonly curve: 'set' | Curve;
|
|
396
|
+
};
|
|
397
|
+
type PlannedLayer = {
|
|
398
|
+
readonly at: number;
|
|
399
|
+
readonly duration: number;
|
|
400
|
+
readonly tail: number;
|
|
401
|
+
/** Layer gain × the sound's level: in the envelope for every order but `layered`, in the output stage for `layered`. */
|
|
402
|
+
readonly level: number;
|
|
403
|
+
readonly wet?: number;
|
|
404
|
+
readonly source: PlannedSource;
|
|
405
|
+
readonly filters?: {
|
|
406
|
+
readonly mode: 'serial' | 'parallel';
|
|
407
|
+
readonly bank: readonly PlannedFilter[];
|
|
408
|
+
};
|
|
409
|
+
readonly modulators: readonly PlannedModulator[];
|
|
410
|
+
readonly envelope: readonly PlannedEnvelopePoint[];
|
|
411
|
+
};
|
|
412
|
+
/** A sound with every number decided: what the realizer builds, what goldens compare and what the bench sheet prints. */
|
|
413
|
+
type SoundPlan = {
|
|
414
|
+
readonly id: string;
|
|
415
|
+
readonly bus: BusId;
|
|
416
|
+
readonly order: BuildOrder;
|
|
417
|
+
readonly group?: string;
|
|
418
|
+
readonly priority: number;
|
|
419
|
+
/** The level from volume and distance, before layer gains. */
|
|
420
|
+
readonly level: number;
|
|
421
|
+
readonly distance: number;
|
|
422
|
+
readonly pan?: number;
|
|
423
|
+
/** Too quiet to hear, kept only for a recipe with `keepSilent`. */
|
|
424
|
+
readonly silent: boolean;
|
|
425
|
+
/** Seconds until the last source stops. */
|
|
426
|
+
readonly length: number;
|
|
427
|
+
readonly layers: readonly PlannedLayer[];
|
|
428
|
+
};
|
|
429
|
+
type PlanInput = {
|
|
430
|
+
/** Where the numbers are drawn from. Default: a fresh stream with seed 1. */
|
|
431
|
+
readonly random?: () => number;
|
|
432
|
+
readonly volume?: number;
|
|
433
|
+
/** Distance in meters; overrides `position`. */
|
|
434
|
+
readonly distance?: number;
|
|
435
|
+
readonly position?: Vec3;
|
|
436
|
+
readonly listener?: Listener;
|
|
437
|
+
readonly distanceMode?: DistanceMode;
|
|
438
|
+
readonly params?: Readonly<Record<string, number>>;
|
|
439
|
+
/** 0..1 from the host's occlusion callback: gain × (1 − 0.5 × o), lowpass cutoffs × (1 − 0.6 × o). */
|
|
440
|
+
readonly occlusion?: number;
|
|
441
|
+
/** Length of the noise buffer, for `offset: 'fit'`. Default 1.5. */
|
|
442
|
+
readonly noiseSeconds?: number;
|
|
443
|
+
};
|
|
444
|
+
/**
|
|
445
|
+
* Turns a recipe into a plan: pure, Node-safe, the same plan for the same `random`. Numbers are drawn in this order: `vars` (in the order written),
|
|
446
|
+
* `duration`, then each layer in the order its fields are written, the noise start point last in its layer. A sound below its falloff's `minGain`
|
|
447
|
+
* gives `null` (or a silent plan with `keepSilent`) before any number is drawn.
|
|
448
|
+
*/
|
|
449
|
+
declare function planSound(recipe: SoundRecipe, input?: PlanInput): SoundPlan | null;
|
|
450
|
+
|
|
451
|
+
/**
|
|
452
|
+
* Sounds made of recorded files (`.ogg`), as data. A `SampleSound` lists the takes of each layer: `close` (the sound as heard near, the only one
|
|
453
|
+
* required), `far` (the same event heard from far away: a muffled bang with its echo) and the tail of the place it happens in (`indoor` / `outdoor`).
|
|
454
|
+
* `planSample` decides, from a seeded stream, which take plays (round-robin: never the same take twice in a row), the pitch (± a fraction), how the
|
|
455
|
+
* near and far layers cross over with the distance, the level, the pan and the distance lowpass. It is pure, so it runs in Node and in tests; the
|
|
456
|
+
* WebAudio layer (`realizeSample`) plays the plan from decoded buffers.
|
|
457
|
+
*/
|
|
458
|
+
|
|
459
|
+
declare const SAMPLE_ENVIRONMENTS: readonly ["indoor", "outdoor"];
|
|
460
|
+
/** The role of a layer in a plan. */
|
|
461
|
+
type SampleLayerRole = 'close' | 'far' | 'tail';
|
|
462
|
+
declare const DEFAULT_SAMPLE_FALLOFF: Falloff;
|
|
463
|
+
declare const DEFAULT_CROSSOVER: SampleCrossover;
|
|
464
|
+
declare const DEFAULT_SAMPLE_PITCH = 0.04;
|
|
465
|
+
declare const DEFAULT_TAIL_GAIN = 0.6;
|
|
466
|
+
declare const DEFAULT_SAMPLE_CUTOFF_K = 0.01;
|
|
467
|
+
/** The open lowpass: at or above it the realizer leaves the filter out. */
|
|
468
|
+
declare const OPEN_CUTOFF = 20000;
|
|
469
|
+
/** A layer quieter than this is left out of the plan. */
|
|
470
|
+
declare const LAYER_FLOOR = 0.001;
|
|
471
|
+
/** One file to play: which take, at what level (already times the sound level), rate and start. */
|
|
472
|
+
type PlannedSampleLayer = {
|
|
473
|
+
readonly role: SampleLayerRole;
|
|
474
|
+
readonly url: string;
|
|
475
|
+
/** Index of the take in its list. */
|
|
476
|
+
readonly take: number;
|
|
477
|
+
readonly gain: number;
|
|
478
|
+
readonly rate: number;
|
|
479
|
+
readonly at: number;
|
|
480
|
+
};
|
|
481
|
+
type SamplePlan = {
|
|
482
|
+
readonly kind: 'sample';
|
|
483
|
+
readonly id: string;
|
|
484
|
+
readonly bus: BusId;
|
|
485
|
+
readonly level: number;
|
|
486
|
+
readonly distance: number;
|
|
487
|
+
readonly pan?: number;
|
|
488
|
+
/** Lowpass cutoff in Hz (`OPEN_CUTOFF` = no filter). */
|
|
489
|
+
readonly cutoff: number;
|
|
490
|
+
/** Playback rate of every layer (the pitch drawn for this play). */
|
|
491
|
+
readonly rate: number;
|
|
492
|
+
readonly environment: SampleEnvironment;
|
|
493
|
+
/** The tier played (`undefined` without tiers or intensity). */
|
|
494
|
+
readonly tier?: string;
|
|
495
|
+
/** 0 = all near, 1 = all far. */
|
|
496
|
+
readonly farMix: number;
|
|
497
|
+
readonly layers: readonly PlannedSampleLayer[];
|
|
498
|
+
readonly priority: number;
|
|
499
|
+
readonly group?: string;
|
|
500
|
+
};
|
|
501
|
+
/** The last take each sound layer played (`<id>/<role>` → index), so the next play never repeats it. Keep one per engine or channel. */
|
|
502
|
+
type SampleMemory = Map<string, number>;
|
|
503
|
+
type SamplePlanInput = {
|
|
504
|
+
readonly random: () => number;
|
|
505
|
+
readonly listener?: Listener;
|
|
506
|
+
readonly distanceMode?: DistanceMode;
|
|
507
|
+
readonly position?: Vec3;
|
|
508
|
+
/** Metres; overrides `position` for the distance (not for the pan). */
|
|
509
|
+
readonly distance?: number;
|
|
510
|
+
readonly volume?: number;
|
|
511
|
+
/** Default `outdoor`. */
|
|
512
|
+
readonly environment?: SampleEnvironment;
|
|
513
|
+
/** 0 (clear) to 1 (behind a wall): lowers the level and closes the lowpass. */
|
|
514
|
+
readonly occlusion?: number;
|
|
515
|
+
/** Round-robin memory; without it each plan is drawn on its own (and may repeat). */
|
|
516
|
+
readonly memory?: SampleMemory;
|
|
517
|
+
/** Limiter priority when the sound has none. */
|
|
518
|
+
readonly priority?: number;
|
|
519
|
+
/** 0 (light) to 1 (heavy): picks the tier (see `SampleTier`). */
|
|
520
|
+
readonly intensity?: number;
|
|
521
|
+
};
|
|
522
|
+
/**
|
|
523
|
+
* Round-robin without repeat: a take drawn among all but the last one played. With one take it is always 0; without `last` any take may come.
|
|
524
|
+
* One random number per call.
|
|
525
|
+
*/
|
|
526
|
+
declare function pickTake(count: number, last: number | undefined, random: () => number): number;
|
|
527
|
+
/** 0 at or below `from`, 1 at or beyond `to`, linear between. */
|
|
528
|
+
declare function farMixAt(crossover: SampleCrossover, distance: number): number;
|
|
529
|
+
/** Equal-power gains of the near and far layers for a far mix (so the crossover has no dip in loudness). */
|
|
530
|
+
declare function crossGains(farMix: number): {
|
|
531
|
+
readonly close: number;
|
|
532
|
+
readonly far: number;
|
|
533
|
+
};
|
|
534
|
+
/** The distance lowpass, closed further behind a wall (an occluded sound loses its highs first). */
|
|
535
|
+
declare function sampleCutoff(cutoffK: number, distance: number, occlusion?: number): number;
|
|
536
|
+
/** Every file a sound may play (to load before its first play). */
|
|
537
|
+
declare function sampleUrls(sound: SampleSound): string[];
|
|
538
|
+
/** The tier for an intensity: the last whose `from` is at or below it. */
|
|
539
|
+
declare function tierFor(sound: SampleSound, intensity: number | undefined): SampleTier | undefined;
|
|
540
|
+
/**
|
|
541
|
+
* The plan of one play, or `null` when the sound is too far to be heard. Random numbers, in order: the pitch, the near take, the far take, the
|
|
542
|
+
* tail take (each drawn only when that layer has more than zero takes and is heard).
|
|
543
|
+
*/
|
|
544
|
+
declare function planSample(sound: SampleSound, input: SamplePlanInput): SamplePlan | null;
|
|
545
|
+
|
|
546
|
+
/**
|
|
547
|
+
* Decoded sample buffers by url. Files load once (concurrent asks share the same promise), decode on the engine's context and stay until `clear`.
|
|
548
|
+
* The bytes come from a `SampleLoader`: `fetch` by default, or anything else (a single-file page passes the files inlined as base64).
|
|
549
|
+
*/
|
|
550
|
+
/** Gets the bytes of a file. */
|
|
551
|
+
type SampleLoader = (url: string) => Promise<ArrayBuffer>;
|
|
552
|
+
type SampleStatus = 'none' | 'loading' | 'ready' | 'failed';
|
|
553
|
+
type SampleLoadReport = {
|
|
554
|
+
readonly loaded: readonly string[];
|
|
555
|
+
readonly failed: readonly {
|
|
556
|
+
readonly url: string;
|
|
557
|
+
readonly error: string;
|
|
558
|
+
}[];
|
|
559
|
+
};
|
|
560
|
+
type SampleStore = {
|
|
561
|
+
status(url: string): SampleStatus;
|
|
562
|
+
/** The decoded buffer, once ready. */
|
|
563
|
+
buffer(url: string): AudioBuffer | undefined;
|
|
564
|
+
/** Whether every url is ready. */
|
|
565
|
+
ready(urls: readonly string[]): boolean;
|
|
566
|
+
load(urls: readonly string[], context: BaseAudioContext): Promise<SampleLoadReport>;
|
|
567
|
+
/** Seconds of the decoded file, or `undefined` while not ready. */
|
|
568
|
+
seconds(url: string): number | undefined;
|
|
569
|
+
clear(): void;
|
|
570
|
+
};
|
|
571
|
+
/** `fetch` relative to `baseUrl` (default the page). */
|
|
572
|
+
declare function fetchLoader(baseUrl?: string): SampleLoader;
|
|
573
|
+
/** Bytes of files given inline as base64 (or `data:` urls), by url. */
|
|
574
|
+
declare function inlineLoader(files: Readonly<Record<string, string>>): SampleLoader;
|
|
575
|
+
declare function createSampleStore(loader?: SampleLoader): SampleStore;
|
|
576
|
+
|
|
577
|
+
type BusSetting = {
|
|
578
|
+
readonly gain?: number;
|
|
579
|
+
readonly muted?: boolean;
|
|
580
|
+
};
|
|
581
|
+
/**
|
|
582
|
+
* A mixing chain. `master` → (compressor) → (limiter) → output; with `reverb`, a wet bus → convolver (an impulse from the engine's seed) → master. `noise` is
|
|
583
|
+
* the shared noise buffer: its length, and whether it is made with the chain (`eager`, the art scene) or by the first sound that needs it (`lazy`,
|
|
584
|
+
* the game). Buses sit under the master and have no node until one is changed.
|
|
585
|
+
*/
|
|
586
|
+
type MixProfile = {
|
|
587
|
+
readonly id: string;
|
|
588
|
+
readonly master: number;
|
|
589
|
+
readonly compressor?: {
|
|
590
|
+
readonly threshold: number;
|
|
591
|
+
readonly ratio: number;
|
|
592
|
+
readonly knee?: number;
|
|
593
|
+
readonly attack?: number;
|
|
594
|
+
readonly release?: number;
|
|
595
|
+
};
|
|
596
|
+
readonly reverb?: {
|
|
597
|
+
readonly seconds: number;
|
|
598
|
+
readonly decay: number;
|
|
599
|
+
readonly wet: number;
|
|
600
|
+
};
|
|
601
|
+
/**
|
|
602
|
+
* A last stage after the compressor that keeps every peak under `ceiling` dBFS: below `knee` dBFS the sound passes untouched, above it the peak
|
|
603
|
+
* bends smoothly toward the ceiling (a soft clipper, no lookahead and no delay), so a blast with its debris and a fire catching all at once never
|
|
604
|
+
* clips the output. `range` is the loudest input it shapes, as a factor of full scale (default 4, +12 dB); louder is held at the ceiling.
|
|
605
|
+
*/
|
|
606
|
+
readonly limiter?: {
|
|
607
|
+
readonly ceiling: number;
|
|
608
|
+
readonly knee: number;
|
|
609
|
+
readonly range?: number;
|
|
610
|
+
};
|
|
611
|
+
readonly noise: {
|
|
612
|
+
readonly seconds: number;
|
|
613
|
+
readonly create: 'lazy' | 'eager';
|
|
614
|
+
};
|
|
615
|
+
readonly buses?: Readonly<Partial<Record<BusId, BusSetting>>>;
|
|
616
|
+
readonly sources: readonly string[];
|
|
617
|
+
};
|
|
618
|
+
/** The two team chains: `game` (master 0.5, jogo L62080) and `art_scene` (compressor and reverb, cena L1305–1313). */
|
|
619
|
+
declare const MIX_PROFILES: Readonly<Record<string, MixProfile>>;
|
|
620
|
+
/** Q1: the kit plays through the art scene chain (compressor and reverb) with a limiter at the end (`kit`); `mix: 'art_scene'` is the page as it was, `mix: 'game'` the game's. */
|
|
621
|
+
declare const DEFAULT_MIX = "kit";
|
|
622
|
+
/** A profile by id from `profiles`, or the profile itself. */
|
|
623
|
+
declare function resolveMix(mix: string | MixProfile, profiles?: Readonly<Record<string, MixProfile>>): MixProfile;
|
|
624
|
+
/** The gain a bus plays at: 0 when muted, its gain (default 1) otherwise. */
|
|
625
|
+
declare function busGain(setting: BusSetting | undefined): number;
|
|
626
|
+
|
|
627
|
+
type DeepPartial<TValue> = TValue extends readonly unknown[] ? TValue : TValue extends object ? {
|
|
628
|
+
readonly [Key in keyof TValue]?: DeepPartial<TValue[Key]>;
|
|
629
|
+
} : TValue;
|
|
630
|
+
/** Every sound and loop the engine knows, by id. Banks register in order; a later bank replaces an earlier recipe with the same id. */
|
|
631
|
+
type SoundRegistry = {
|
|
632
|
+
register(bank: SoundBank): void;
|
|
633
|
+
/** Merged into the recipe by id (objects merge, arrays such as `layers` are replaced); an unknown id is ignored. */
|
|
634
|
+
patch(id: string, patch: DeepPartial<SoundRecipe> | DeepPartial<LoopRecipe> | DeepPartial<SampleSound>): void;
|
|
635
|
+
remove(id: string): void;
|
|
636
|
+
sound(id: string): SoundRecipe | undefined;
|
|
637
|
+
loop(id: string): LoopRecipe | undefined;
|
|
638
|
+
/** The set an id names (`SoundBank.sets`), if any; a recipe with the same id wins in `play`. */
|
|
639
|
+
set(id: string): SoundSet | undefined;
|
|
640
|
+
sample(id: string): SampleSound | undefined;
|
|
641
|
+
soundIds(): string[];
|
|
642
|
+
setIds(): string[];
|
|
643
|
+
loopIds(): string[];
|
|
644
|
+
sampleIds(): string[];
|
|
645
|
+
/** Which bank each id came from. */
|
|
646
|
+
bankOf(id: string): string | undefined;
|
|
647
|
+
};
|
|
648
|
+
declare function createSoundRegistry(banks?: readonly SoundBank[]): SoundRegistry;
|
|
649
|
+
|
|
650
|
+
/**
|
|
651
|
+
* Rules for a group of voices (`undead_voice`...). A request passes when every rule passes:
|
|
652
|
+
* - `maxConcurrent`: at most this many of the group play at once (`steal` replaces the group's oldest instead of refusing);
|
|
653
|
+
* - `cooldown`: seconds after an accepted voice before the next one (the game's `groanBudget`, jogo L66986 and L70472);
|
|
654
|
+
* - `maxDistance`: only voices nearer than this (the game's `d < 40`).
|
|
655
|
+
*/
|
|
656
|
+
type VoiceGroup = {
|
|
657
|
+
readonly maxConcurrent?: number;
|
|
658
|
+
readonly cooldown?: number;
|
|
659
|
+
readonly maxDistance?: number;
|
|
660
|
+
readonly steal?: boolean;
|
|
661
|
+
readonly sources?: readonly string[];
|
|
662
|
+
};
|
|
663
|
+
/** `undead_voice`: the art scene's five at once with the game's 0.25 s cooldown and 40 m. */
|
|
664
|
+
declare const VOICE_GROUPS: Readonly<Record<string, VoiceGroup>>;
|
|
665
|
+
/** Q7: weapons > voices > world > ambience; the interface above all, weather with the ambience. */
|
|
666
|
+
declare const BUS_PRIORITY: Readonly<Record<BusId, number>>;
|
|
667
|
+
declare const DEFAULT_MAX_VOICES = 32;
|
|
668
|
+
declare function busPriority(bus: BusId): number;
|
|
669
|
+
type VoiceRequest = {
|
|
670
|
+
readonly group?: string;
|
|
671
|
+
readonly priority: number;
|
|
672
|
+
/** Planned level; the global cap drops the lowest `priority × gain`. */
|
|
673
|
+
readonly gain: number;
|
|
674
|
+
readonly distance?: number;
|
|
675
|
+
/** Seconds the voice lasts. */
|
|
676
|
+
readonly length: number;
|
|
677
|
+
};
|
|
678
|
+
type VoiceRefusal = 'cooldown' | 'distance' | 'group_full' | 'global_full';
|
|
679
|
+
type VoiceDecision = {
|
|
680
|
+
readonly accepted: true;
|
|
681
|
+
readonly id: number;
|
|
682
|
+
readonly evicted: readonly number[];
|
|
683
|
+
} | {
|
|
684
|
+
readonly accepted: false;
|
|
685
|
+
readonly reason: VoiceRefusal;
|
|
686
|
+
};
|
|
687
|
+
type VoiceStats = {
|
|
688
|
+
readonly active: number;
|
|
689
|
+
readonly peak: number;
|
|
690
|
+
readonly dropped: number;
|
|
691
|
+
readonly maxVoices: number;
|
|
692
|
+
};
|
|
693
|
+
type VoiceManager = {
|
|
694
|
+
request(request: VoiceRequest): VoiceDecision;
|
|
695
|
+
/** Ends a voice early (stopped by the host). */
|
|
696
|
+
release(id: number): void;
|
|
697
|
+
/** Sets how long an accepted voice lasts (the engine admits a voice before its random length is drawn). */
|
|
698
|
+
setLength(id: number, seconds: number): void;
|
|
699
|
+
/** Moves time on: cooldowns count down and finished voices leave. Returns the ids that ended. */
|
|
700
|
+
advance(dt: number): number[];
|
|
701
|
+
setGroup(id: string, group: VoiceGroup | undefined): void;
|
|
702
|
+
stats(): VoiceStats;
|
|
703
|
+
};
|
|
704
|
+
type VoiceManagerOptions = {
|
|
705
|
+
/** Default `VOICE_GROUPS`. */
|
|
706
|
+
readonly groups?: Readonly<Record<string, VoiceGroup>>;
|
|
707
|
+
readonly maxVoices?: number;
|
|
708
|
+
};
|
|
709
|
+
/** The voice limiter: per-group rules, a global cap and priority dropping. Pure and time-driven (`advance`), so goldens script it frame by frame. */
|
|
710
|
+
declare function createVoiceManager(options?: VoiceManagerOptions): VoiceManager;
|
|
711
|
+
|
|
712
|
+
/**
|
|
713
|
+
* What one `set` changes. `volume` and `frequency` glide as in the team loops. `position` places the loop: with a recipe `falloff` the level falls
|
|
714
|
+
* with the distance from the listener (and the cutoff with `cutoffK`), with `pan` it goes to the listener's side. `cutoff` glides the first filter
|
|
715
|
+
* (an engine opening up under load, a skid getting brighter).
|
|
716
|
+
*/
|
|
717
|
+
type LoopSet = {
|
|
718
|
+
readonly volume?: number;
|
|
719
|
+
readonly frequency?: number;
|
|
720
|
+
readonly position?: Vec3;
|
|
721
|
+
readonly cutoff?: number;
|
|
722
|
+
};
|
|
723
|
+
/** A continuous sound: `set` glides the volume and, for an oscillator, the frequency; `stop` tears the nodes down. */
|
|
724
|
+
type AudioLoopHandle = {
|
|
725
|
+
set(state: LoopSet): void;
|
|
726
|
+
stop(): void;
|
|
727
|
+
};
|
|
728
|
+
type LoopEntry = {
|
|
729
|
+
rewire(): void;
|
|
730
|
+
stop(): void;
|
|
731
|
+
readonly created: boolean;
|
|
732
|
+
};
|
|
733
|
+
|
|
734
|
+
type StartQueueOptions = {
|
|
735
|
+
/** Most milliseconds of main-thread work one task spends building voices (at least one voice is always built). Default 2. */
|
|
736
|
+
readonly budgetMs?: number;
|
|
737
|
+
/** A voice still waiting after this many milliseconds is dropped instead of starting late. Default 250. */
|
|
738
|
+
readonly maxLatencyMs?: number;
|
|
739
|
+
};
|
|
740
|
+
|
|
741
|
+
type PlayOptions = {
|
|
742
|
+
readonly position?: Vec3;
|
|
743
|
+
/** Meters; overrides `position` for the distance (not for the pan). */
|
|
744
|
+
readonly distance?: number;
|
|
745
|
+
readonly volume?: number;
|
|
746
|
+
readonly params?: Readonly<Record<string, number>>;
|
|
747
|
+
/** This sound's own stream: same seed, same sound. */
|
|
748
|
+
readonly seed?: number;
|
|
749
|
+
/** Seconds from now. */
|
|
750
|
+
readonly delay?: number;
|
|
751
|
+
/** Built now instead of waiting in the engine's deferred start queue: for a sound that has to land on the frame the player sees it (a blow's
|
|
752
|
+
* contact, a heel strike, a landing). The queue builds a voice on the next frame budget and drops it after its latency, which at a low frame
|
|
753
|
+
* rate is late or silent. Default false. */
|
|
754
|
+
readonly urgent?: boolean;
|
|
755
|
+
/** A named stream of the engine (`streamFor(seed, name)`), so one subject never shifts another's sounds. */
|
|
756
|
+
readonly channel?: string;
|
|
757
|
+
/** The tail a sample sound plays (default the engine's, see `setEnvironment`). */
|
|
758
|
+
readonly environment?: SampleEnvironment;
|
|
759
|
+
/** 0 (light) to 1 (heavy): the tier of takes a sample sound plays (criterion C7). */
|
|
760
|
+
readonly intensity?: number;
|
|
761
|
+
/** 0 (clear) to 1 (behind a wall) for this play, over the engine's `occlusion` (a test bench puts a wall in between). Sample sounds only. */
|
|
762
|
+
readonly occlusion?: number;
|
|
763
|
+
};
|
|
764
|
+
/** A playing voice: a recipe (`kind: 'recipe'`, the plan of the synthesized sound) or files (`kind: 'sample'`). */
|
|
765
|
+
type VoiceHandle = {
|
|
766
|
+
readonly id: number;
|
|
767
|
+
readonly kind: 'recipe';
|
|
768
|
+
readonly plan: SoundPlan;
|
|
769
|
+
stop(): void;
|
|
770
|
+
} | {
|
|
771
|
+
readonly id: number;
|
|
772
|
+
readonly kind: 'sample';
|
|
773
|
+
readonly plan: SamplePlan;
|
|
774
|
+
stop(): void;
|
|
775
|
+
};
|
|
776
|
+
/**
|
|
777
|
+
* A voice that started, for measuring (criterion C1: the event against the start of the sound). Times are the context clock, in seconds:
|
|
778
|
+
* `requestedAt` when `play` was called, `startAt` when the first sample of the sound leaves the engine; `outputLatency` is what the device adds
|
|
779
|
+
* after that (`baseLatency + outputLatency` of the context, 0 when unknown).
|
|
780
|
+
*/
|
|
781
|
+
type VoiceStartEvent = {
|
|
782
|
+
readonly id: string;
|
|
783
|
+
readonly kind: 'recipe' | 'sample';
|
|
784
|
+
/** The sample sound this recipe stood in for while its files were not loaded. */
|
|
785
|
+
readonly fallbackOf?: string;
|
|
786
|
+
readonly requestedAt: number;
|
|
787
|
+
readonly startAt: number;
|
|
788
|
+
readonly outputLatency: number;
|
|
789
|
+
readonly level: number;
|
|
790
|
+
readonly distance: number;
|
|
791
|
+
readonly pan?: number;
|
|
792
|
+
/** The files a sample voice plays, by layer. */
|
|
793
|
+
readonly layers?: readonly {
|
|
794
|
+
readonly role: string;
|
|
795
|
+
readonly url: string;
|
|
796
|
+
readonly take: number;
|
|
797
|
+
readonly rate: number;
|
|
798
|
+
}[];
|
|
799
|
+
/** The tier of takes a sample voice played (criterion C7). */
|
|
800
|
+
readonly tier?: string;
|
|
801
|
+
};
|
|
802
|
+
type SampleOptions = {
|
|
803
|
+
/** Gets the bytes of a file (default `fetch`, relative to `baseUrl`). */
|
|
804
|
+
readonly loader?: SampleLoader;
|
|
805
|
+
readonly baseUrl?: string;
|
|
806
|
+
/** Load a sound's files the first time it is played (default true); the fallback plays meanwhile. */
|
|
807
|
+
readonly autoLoad?: boolean;
|
|
808
|
+
/**
|
|
809
|
+
* The peak limiter every sample voice of a bus goes through before the bus (criteria C6 and C9: no sound and no burst goes over −1 dBFS): linear
|
|
810
|
+
* up to `knee` (default 0.5, −6 dBFS), then bent smoothly to `ceiling` (default 0.891, −1 dBFS), with no delay. `false` leaves it out.
|
|
811
|
+
*/
|
|
812
|
+
readonly limiter?: false | {
|
|
813
|
+
readonly knee?: number;
|
|
814
|
+
readonly ceiling?: number;
|
|
815
|
+
};
|
|
816
|
+
};
|
|
817
|
+
/** A subject's own random stream; `ownNoise` also gives it its own noise buffer, filled from that stream (the order `createWeaponAudio` uses). */
|
|
818
|
+
type AudioChannel = {
|
|
819
|
+
readonly random: () => number;
|
|
820
|
+
play(id: string, options?: PlayOptions): VoiceHandle | null;
|
|
821
|
+
plan(id: string, options?: PlayOptions): SoundPlan | null;
|
|
822
|
+
};
|
|
823
|
+
type AudioStats = {
|
|
824
|
+
readonly context: 'none' | AudioContextState;
|
|
825
|
+
readonly voices: number;
|
|
826
|
+
readonly peak: number;
|
|
827
|
+
readonly dropped: number;
|
|
828
|
+
readonly maxVoices: number;
|
|
829
|
+
readonly loops: number;
|
|
830
|
+
};
|
|
831
|
+
type AudioEngineOptions = {
|
|
832
|
+
/** Seeds the engine stream: the noise, the reverb impulse and every sound played without its own seed or channel. Default 1. */
|
|
833
|
+
readonly seed?: number;
|
|
834
|
+
/** Default `art_scene` (Q1). */
|
|
835
|
+
readonly mix?: string | MixProfile;
|
|
836
|
+
readonly profiles?: Readonly<Record<string, MixProfile>>;
|
|
837
|
+
readonly banks?: readonly SoundBank[];
|
|
838
|
+
readonly maxVoices?: number;
|
|
839
|
+
readonly groups?: Readonly<Record<string, VoiceGroup>>;
|
|
840
|
+
readonly distance?: DistanceMode;
|
|
841
|
+
/** 0 (clear) to 1 (behind a wall) for a sound at a point; without it there is no occlusion (Q8). */
|
|
842
|
+
readonly occlusion?: (point: Vec3) => number;
|
|
843
|
+
readonly createContext?: () => AudioContext | null;
|
|
844
|
+
/** Build voices in timed slices between frames instead of inside `play` (a sound starts a few ms late; a burst never costs a frame). Off by default. */
|
|
845
|
+
readonly deferredStart?: StartQueueOptions;
|
|
846
|
+
/** Where sample sounds get their files. */
|
|
847
|
+
readonly samples?: SampleOptions;
|
|
848
|
+
/** The tail sample sounds play when `play` names none (default `outdoor`). */
|
|
849
|
+
readonly environment?: SampleEnvironment;
|
|
850
|
+
/** Called when a voice is built (recipe or sample): the measuring hook of the criteria. */
|
|
851
|
+
readonly onVoiceStart?: (event: VoiceStartEvent) => void;
|
|
852
|
+
};
|
|
853
|
+
type AudioEngine = {
|
|
854
|
+
readonly registry: SoundRegistry;
|
|
855
|
+
register(bank: SoundBank): void;
|
|
856
|
+
/** Pure: the plan a sound would play with, from `options.seed` or the engine seed; draws nothing from the live streams. */
|
|
857
|
+
plan(id: string, options?: PlayOptions): SoundPlan | null;
|
|
858
|
+
/** Pure: the plan a sample sound would play with (no round-robin memory), from `options.seed` or the engine seed. */
|
|
859
|
+
planSample(id: string, options?: PlayOptions): SamplePlan | null;
|
|
860
|
+
/** Loads the files of these sample sounds (default all registered). Creates the context; resolves when every file is decoded or failed. */
|
|
861
|
+
loadSamples(ids?: readonly string[]): Promise<SampleLoadReport>;
|
|
862
|
+
/** `ready` when every file of the sound is decoded. */
|
|
863
|
+
sampleStatus(id: string): SampleStatus;
|
|
864
|
+
/** The tail sample sounds play from now on. */
|
|
865
|
+
setEnvironment(environment: SampleEnvironment): void;
|
|
866
|
+
/** The node everything is mixed into before the speakers (to record or meter the whole output), or `null` before the context exists. */
|
|
867
|
+
output(): AudioNode | null;
|
|
868
|
+
/** Another place files come from: urls `accepts` takes go to `loader`, the rest to the engine's own (a bench lends its calibration takes). */
|
|
869
|
+
addSampleSource(accepts: (url: string) => boolean, loader: SampleLoader): void;
|
|
870
|
+
/** Follows every voice built from now on (as `onVoiceStart` does); returns the unsubscribe function. */
|
|
871
|
+
watchVoices(listener: (event: VoiceStartEvent) => void): () => void;
|
|
872
|
+
play(id: string, options?: PlayOptions): VoiceHandle | null;
|
|
873
|
+
playPlan(plan: SoundPlan, options?: {
|
|
874
|
+
readonly delay?: number;
|
|
875
|
+
}): VoiceHandle | null;
|
|
876
|
+
loop(id: string, options?: {
|
|
877
|
+
readonly volume?: number;
|
|
878
|
+
}): AudioLoopHandle;
|
|
879
|
+
channel(options: {
|
|
880
|
+
readonly seed?: number;
|
|
881
|
+
readonly random?: () => number;
|
|
882
|
+
readonly ownNoise?: boolean;
|
|
883
|
+
}): AudioChannel;
|
|
884
|
+
setListener(listener: Listener): void;
|
|
885
|
+
setBus(id: BusId, setting: BusSetting): void;
|
|
886
|
+
setMix(mix: string | MixProfile): void;
|
|
887
|
+
/** The master volume of the current chain and of any later one (0 to 1). */
|
|
888
|
+
setMaster(gain: number): void;
|
|
889
|
+
/** Creates the context and the mixing chain if needed and resumes it; call from a click or a key. */
|
|
890
|
+
unlock(): void;
|
|
891
|
+
/** Creates the context, the mixing chain (reverb impulse included) and the shared noise buffer now, so the first sound does not pay for them inside a frame. Returns false without a context. */
|
|
892
|
+
warmUp(): boolean;
|
|
893
|
+
stats(): AudioStats;
|
|
894
|
+
/** RMS (0 to 1) of what a bus carries now, read from an analyser the first time you ask; sounds started before that do not reach it. 0 without a context. */
|
|
895
|
+
level(bus: BusId): number;
|
|
896
|
+
/**
|
|
897
|
+
* The voice start queue as a `DeferredQueue` for a shared frame budget (`budget.register` attaches it and the queue stops scheduling its own tasks), or `null`
|
|
898
|
+
* without `deferredStart`. Asking for it changes nothing.
|
|
899
|
+
*/
|
|
900
|
+
deferredQueue?(): DeferredQueue | null;
|
|
901
|
+
dispose(): void;
|
|
902
|
+
};
|
|
903
|
+
/** The limiter's transfer curve over ±`range`: linear up to `knee`, then a tanh bend that never passes `ceiling`. */
|
|
904
|
+
declare function limiterCurve(knee: number, ceiling: number, range: number, points?: number): Float32Array<ArrayBuffer>;
|
|
905
|
+
/**
|
|
906
|
+
* The sound engine: plans recipes and builds them on a lazily created AudioContext through one of the team mixing chains. Without an AudioContext
|
|
907
|
+
* (Node, workers) every call except `plan` does nothing.
|
|
908
|
+
*/
|
|
909
|
+
declare function createAudioEngine(options?: AudioEngineOptions): AudioEngine;
|
|
910
|
+
|
|
911
|
+
/**
|
|
912
|
+
* The measuring harness of the sound criteria (C1–C10 of the sound checklist). Each criterion plays the sound through a real engine on an
|
|
913
|
+
* `OfflineAudioContext` (the same mix, limiter and realizer the game uses, rendered faster than real time), and measures the rendered output: when it
|
|
914
|
+
* starts against the event, how loud and bright it is at each distance, which side, how many takes, how it ends. Runs in a browser (or anything with
|
|
915
|
+
* an `OfflineAudioContext`); C10 is the owner's ear, so it is left open with a recording to listen to (`recordOutput`).
|
|
916
|
+
*/
|
|
917
|
+
|
|
918
|
+
declare const CRITERIA: readonly ["C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "C10"];
|
|
919
|
+
type CriterionId = (typeof CRITERIA)[number];
|
|
920
|
+
/** The targets of the checklist, as numbers the harness compares with. */
|
|
921
|
+
declare const CRITERIA_TARGETS: {
|
|
922
|
+
/** C1: event to the first sample, and onset to the peak (one 60 fps frame). */
|
|
923
|
+
readonly syncMs: 20;
|
|
924
|
+
readonly peakAfterOnsetMs: number;
|
|
925
|
+
/** C3: distances measured, metres. */
|
|
926
|
+
readonly distances: readonly number[];
|
|
927
|
+
/** C5: plays, distinct takes and the pitch range (fraction). */
|
|
928
|
+
readonly plays: 10;
|
|
929
|
+
readonly minTakes: 4;
|
|
930
|
+
readonly pitch: readonly [0.03, 0.05];
|
|
931
|
+
/** C6: the highest peak, dBFS. */
|
|
932
|
+
readonly peakDb: -1;
|
|
933
|
+
/** C8: the end of each file against its peak, dB. */
|
|
934
|
+
readonly endDropDb: -40;
|
|
935
|
+
/** C9: a burst of rapid fire. */
|
|
936
|
+
readonly burst: 20;
|
|
937
|
+
readonly burstSpacing: 0.06;
|
|
938
|
+
};
|
|
939
|
+
type CriterionResult = {
|
|
940
|
+
readonly id: CriterionId;
|
|
941
|
+
/** `null`: not decided by the harness (C10, the owner's ear). */
|
|
942
|
+
readonly pass: boolean | null;
|
|
943
|
+
/** What was measured, short (the bench prints it). */
|
|
944
|
+
readonly value: string;
|
|
945
|
+
readonly target: string;
|
|
946
|
+
readonly data?: Readonly<Record<string, unknown>>;
|
|
947
|
+
};
|
|
948
|
+
/** One action of the game and the sound it must play (C2). */
|
|
949
|
+
type ActionCheck = {
|
|
950
|
+
readonly action: string;
|
|
951
|
+
readonly play: string;
|
|
952
|
+
readonly expect: string;
|
|
953
|
+
readonly options?: PlayOptions;
|
|
954
|
+
};
|
|
955
|
+
type MeasureOptions = {
|
|
956
|
+
/** The sample sound measured. */
|
|
957
|
+
readonly sound: string;
|
|
958
|
+
readonly banks: readonly SoundBank[];
|
|
959
|
+
readonly loader: SampleLoader;
|
|
960
|
+
/** The mixing chain the game uses (default the engine's default). */
|
|
961
|
+
readonly mix?: string | MixProfile;
|
|
962
|
+
readonly sampleRate?: number;
|
|
963
|
+
/** `new OfflineAudioContext(...)` by default. */
|
|
964
|
+
readonly createOfflineContext?: (channels: number, length: number, sampleRate: number) => OfflineAudioContext;
|
|
965
|
+
/** The live context's `baseLatency` (s), added to the rendered delay for C1. */
|
|
966
|
+
readonly baseLatency?: number;
|
|
967
|
+
/** The device's `outputLatency` (s), reported with C1 but not counted (it is the speakers', not the game's). */
|
|
968
|
+
readonly outputLatency?: number;
|
|
969
|
+
/** C2: the actions to check (default the sound for itself). */
|
|
970
|
+
readonly actions?: readonly ActionCheck[];
|
|
971
|
+
/** C6: sound ids loudest first, the order the buses must keep (tiro > explosão > impacto > passo). */
|
|
972
|
+
readonly loudnessOrder?: readonly string[];
|
|
973
|
+
};
|
|
974
|
+
/** Runs the criteria (all by default) and returns one result each, in order. C10 is always open: it is the owner's ear on a recording. */
|
|
975
|
+
declare function measureCriteria(options: MeasureOptions, only?: readonly CriterionId[]): Promise<CriterionResult[]>;
|
|
976
|
+
/**
|
|
977
|
+
* Records what the engine outputs while `act` plays, `seconds` long (the C10 recording): a `MediaRecorder` on a stream tapped from the master. Returns
|
|
978
|
+
* `null` where there is no recorder or no context.
|
|
979
|
+
*/
|
|
980
|
+
declare function recordOutput(engine: AudioEngine, seconds: number, act: () => void): Promise<Blob | null>;
|
|
981
|
+
|
|
982
|
+
/**
|
|
983
|
+
* The sounds a game needs, by category, as the sound checklist lists them (generic, real-world names: a 9 mm pistol, a wooden door): the id a file
|
|
984
|
+
* takes, its priority and the synthesized sound it replaces today (`current`, the A of an A/B). A sound is "file" once a bank registers a sample under
|
|
985
|
+
* its id; "synth" while only `current` exists; "missing" when neither does. Data only: a game adds, renames or drops entries without touching the engine.
|
|
986
|
+
*/
|
|
987
|
+
declare const SFX_CATEGORIES: readonly ["armas", "impactos", "explosoes-fogo", "personagem", "veiculos", "itens-portas", "ambiente"];
|
|
988
|
+
type SfxCategory = (typeof SFX_CATEGORIES)[number];
|
|
989
|
+
type SfxPriority = 1 | 2 | 3;
|
|
990
|
+
type SfxEntry = {
|
|
991
|
+
readonly id: string;
|
|
992
|
+
readonly category: SfxCategory;
|
|
993
|
+
readonly priority: SfxPriority;
|
|
994
|
+
/** The synthesized sound playing in its place today (a recipe id of some bank), if any. */
|
|
995
|
+
readonly current?: string;
|
|
996
|
+
};
|
|
997
|
+
declare const SFX_CATALOG: readonly SfxEntry[];
|
|
998
|
+
/** The materials of the impact matrix, with the group whose synthesized sound plays for them today. */
|
|
999
|
+
declare const SFX_MATERIALS: readonly [readonly ["steel", "metal"], readonly ["aluminium", "metal"], readonly ["wood", "wood"], readonly ["plywood", "wood"], readonly ["mdf", "wood"], readonly ["glass", "glass"], readonly ["tempered_glass", "glass"], readonly ["ceramic", "glass"], readonly ["concrete", "masonry"], readonly ["brick", "masonry"], readonly ["plaster", "masonry"], readonly ["plastic", "soft"], readonly ["fabric", "soft"], readonly ["paper", "soft"], readonly ["foliage", "soft"], readonly ["soil", "soft"], readonly ["flesh", "soft"]];
|
|
1000
|
+
type SfxMaterial = (typeof SFX_MATERIALS)[number][0];
|
|
1001
|
+
declare const SFX_BLOWS: readonly ["bullet", "blunt", "blade", "break", "drag"];
|
|
1002
|
+
type SfxBlow = (typeof SFX_BLOWS)[number];
|
|
1003
|
+
/** The id a file of the matrix takes: `impact_<material>_<blow>` (`impact_concrete_bullet`). */
|
|
1004
|
+
declare const impactSoundId: (material: SfxMaterial, blow: SfxBlow) => string;
|
|
1005
|
+
/** The impact matrix as entries (the `impactos` category of the catalogue). */
|
|
1006
|
+
declare const SFX_IMPACTS: readonly SfxEntry[];
|
|
1007
|
+
/** Where an entry stands in an engine: a file registered (`file`), only the synthesized sound (`synth`), or nothing (`missing`). */
|
|
1008
|
+
type SfxState = 'file' | 'synth' | 'missing';
|
|
1009
|
+
declare function sfxState(entry: SfxEntry, has: {
|
|
1010
|
+
sample(id: string): unknown;
|
|
1011
|
+
sound(id: string): unknown;
|
|
1012
|
+
}): SfxState;
|
|
1013
|
+
|
|
1014
|
+
/**
|
|
1015
|
+
* Two probe sounds of the bench itself (a ping and a hiss), so panning, distance and the seed can be heard on something that has no subject. They are
|
|
1016
|
+
* made by the kit, not delivered by any team (`sdk` in the sources).
|
|
1017
|
+
*/
|
|
1018
|
+
declare const BENCH_BANK: SoundBank;
|
|
1019
|
+
type AudioTestModuleOptions = {
|
|
1020
|
+
/** The engine to test (default: the one the host lends in `host.audio`, else a new one of the module's own). */
|
|
1021
|
+
engine?: AudioEngine;
|
|
1022
|
+
/** Banks registered in the engine besides the bench's probes (default the game's noise classes and the library). */
|
|
1023
|
+
banks?: readonly SoundBank[];
|
|
1024
|
+
locale?: string;
|
|
1025
|
+
/** Text of a sound or loop id (`sound.glass`) in the game's words; without it the bench shows the bank and the id. */
|
|
1026
|
+
translate?: (key: string, locale: string) => string | undefined;
|
|
1027
|
+
seed?: number;
|
|
1028
|
+
/** First sound chosen (default `bench_ping`). */
|
|
1029
|
+
sound?: string;
|
|
1030
|
+
/**
|
|
1031
|
+
* Draws the thing the probe stands for, where the sound comes from with the `probe` source (for example a portable radio of `game-items-three`). The module
|
|
1032
|
+
* draws nothing of its own: without it the area has no probe and the sounds come from the bench settings.
|
|
1033
|
+
*/
|
|
1034
|
+
probe?: (THREE: unknown) => unknown;
|
|
1035
|
+
};
|
|
1036
|
+
/** What the scenarios use of the context the test room passes. */
|
|
1037
|
+
interface AudioScenarioLike {
|
|
1038
|
+
expect(condition: boolean, label: string, data?: Record<string, unknown>): void;
|
|
1039
|
+
}
|
|
1040
|
+
type AudioTestModule = TestableModule<AudioScenarioLike> & {
|
|
1041
|
+
/** The engine in use: the host's when it lent one, the module's own otherwise. */
|
|
1042
|
+
readonly engine: AudioEngine;
|
|
1043
|
+
/** The resolved plan of the chosen sound as text (the S3 view: every number decided). */
|
|
1044
|
+
sheet(): string;
|
|
1045
|
+
/** Plays the chosen sound as the bench is set. */
|
|
1046
|
+
play(): VoiceHandle | null;
|
|
1047
|
+
};
|
|
1048
|
+
/**
|
|
1049
|
+
* The sound area of a test room, written against the generic contracts only: it plays any sound of an engine at a distance and bearing from the listener
|
|
1050
|
+
* (or from a probe standing in the area), runs loops, throws a storm of voices at the limiter, switches the mixing chain and its parts, reads the
|
|
1051
|
+
* level of each bus and prints the resolved plan. The engine is the host's (`host.audio`) when lent, else the module's own.
|
|
1052
|
+
*/
|
|
1053
|
+
declare function createAudioTestModule(options?: AudioTestModuleOptions): AudioTestModule;
|
|
1054
|
+
|
|
1055
|
+
type AudioBenchText = {
|
|
1056
|
+
readonly group: string;
|
|
1057
|
+
readonly name: string;
|
|
1058
|
+
readonly probe: string;
|
|
1059
|
+
readonly controls: Readonly<Record<'sound' | 'distance' | 'bearing' | 'volume' | 'mix' | 'seed' | 'play' | 'voice_storm' | 'loop' | 'loop_level' | 'loop_pitch' | 'source', string>>;
|
|
1060
|
+
readonly hints: Readonly<Record<'distance' | 'bearing' | 'mix' | 'seed' | 'voice_storm' | 'loop_pitch' | 'source', string>>;
|
|
1061
|
+
readonly options: Readonly<Record<'none' | 'bench' | 'probe', string>>;
|
|
1062
|
+
readonly layers: Readonly<Record<'reverb' | 'compressor' | 'panning' | 'muffling', string>>;
|
|
1063
|
+
readonly metrics: Readonly<Record<'voices' | 'peak' | 'dropped' | 'loops' | 'context' | 'plan_length' | 'plan_level' | 'plan_pan' | 'level_weapons' | 'level_voices' | 'level_world' | 'level_ambience' | 'level_weather' | 'level_ui', string>>;
|
|
1064
|
+
readonly scenarios: Readonly<Record<'panning' | 'distance' | 'determinism' | 'limiter', string>>;
|
|
1065
|
+
readonly mixes: Readonly<Record<string, string>>;
|
|
1066
|
+
/** Text of a sound or loop id when the game has one; the bench falls back to the id. */
|
|
1067
|
+
readonly sheet: Readonly<Record<'title' | 'level' | 'distance' | 'pan' | 'length' | 'silent' | 'layer' | 'none', string>>;
|
|
1068
|
+
};
|
|
1069
|
+
declare const audioBenchTextOf: (locale: string) => AudioBenchText;
|
|
1070
|
+
|
|
1071
|
+
export { LAYER_FLOOR as $, type AudioLoopHandle as A, type BusId as B, CRITERIA as C, type CriterionId as D, type CriterionResult as E, type Falloff as F, type Curve as G, DEFAULT_CROSSOVER as H, DEFAULT_LISTENER as I, DEFAULT_MAX_VOICES as J, DEFAULT_MIX as K, type LoopRecipe as L, type MixProfile as M, DEFAULT_SAMPLE_CUTOFF_K as N, DEFAULT_SAMPLE_FALLOFF as O, type ParamRef as P, DEFAULT_SAMPLE_PITCH as Q, type Range as R, type SampleSound as S, DEFAULT_TAIL_GAIN as T, type DeepPartial as U, type DistanceMode as V, type Envelope as W, type EnvelopePoint as X, type FilterBank as Y, type FilterSpec as Z, type FormantVoiceSource as _, type SampleLoader as a, createSoundRegistry as a$, type LayerSource as a0, type Listener as a1, type LoopOrder as a2, type LoopSet as a3, MIX_PROFILES as a4, type MeasureOptions as a5, type Modulator as a6, type NoiseSource as a7, OPEN_CUTOFF as a8, type OscSource as a9, type SampleTail as aA, type SampleTier as aB, type SfxBlow as aC, type SfxCategory as aD, type SfxEntry as aE, type SfxMaterial as aF, type SfxPriority as aG, type SfxState as aH, type SoundRegistry as aI, type StartQueueOptions as aJ, type Time as aK, VOICE_GROUPS as aL, type VoiceDecision as aM, type VoiceGroup as aN, type VoiceHandle as aO, type VoiceManager as aP, type VoiceManagerOptions as aQ, type VoiceRefusal as aR, type VoiceRequest as aS, type VoiceStartEvent as aT, type VoiceStats as aU, audioBenchTextOf as aV, busGain as aW, busPriority as aX, createAudioEngine as aY, createAudioTestModule as aZ, createSampleStore as a_, PAN_LIMIT as aa, PAN_MIN_DISTANCE as ab, type PlanInput as ac, type PlannedAutomation as ad, type PlannedEnvelopePoint as ae, type PlannedFilter as af, type PlannedLayer as ag, type PlannedModulator as ah, type PlannedSampleLayer as ai, type PlannedSource as aj, type PlayOptions as ak, SAMPLE_ENVIRONMENTS as al, SFX_BLOWS as am, SFX_CATALOG as an, SFX_CATEGORIES as ao, SFX_IMPACTS as ap, SFX_MATERIALS as aq, type SampleEnvironment as ar, type SampleLayerRole as as, type SampleLoadReport as at, type SampleMemory as au, type SampleOptions as av, type SamplePlanInput as aw, type SampleRef as ax, type SampleStatus as ay, type SampleStore as az, type SampleCrossover as b, createVoiceManager as b0, crossGains as b1, farMixAt as b2, fetchLoader as b3, impactSoundId as b4, inlineLoader as b5, limiterCurve as b6, listenerDistance as b7, measureCriteria as b8, panFor as b9, pickTake as ba, planSample as bb, planSound as bc, recordOutput as bd, resolveMix as be, sampleCutoff as bf, sampleUrls as bg, sfxState as bh, tierFor as bi, type SoundBank as c, type SoundRecipe as d, type Layer as e, type SoundSet as f, type SoundPlan as g, type SamplePlan as h, type LoopEntry as i, type AudioEngine as j, type ActionCheck as k, type AudioBenchText as l, type AudioChannel as m, type AudioEngineOptions as n, type AudioScenarioLike as o, type AudioStats as p, type AudioTestModule as q, type AudioTestModuleOptions as r, type Automation as s, BENCH_BANK as t, BUILD_ORDERS as u, BUS_IDS as v, BUS_PRIORITY as w, type BuildOrder as x, type BusSetting as y, CRITERIA_TARGETS as z };
|