@adatechnology/game-audio 0.6.1 → 0.8.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.
Files changed (1064) hide show
  1. package/README.md +44 -1
  2. package/assets/sfx/CREDITOS.md +2 -2
  3. package/dist/{chunk-KBTUANNG.js → chunk-C2K7XN2K.js} +294 -31
  4. package/dist/chunk-C2K7XN2K.js.map +1 -0
  5. package/dist/index.d.ts +113 -3
  6. package/dist/index.global.js +606 -205
  7. package/dist/index.global.js.map +1 -1
  8. package/dist/index.js +179 -8
  9. package/dist/index.js.map +1 -1
  10. package/dist/{locale-CJfDpWnI.d.ts → locale-BJMhMT0G.d.ts} +47 -1
  11. package/dist/testing.d.ts +4 -4
  12. package/dist/testing.js +1 -1
  13. package/package.json +2 -2
  14. package/assets/sfx/ambiente/ambience_city_day_01.ogg +0 -0
  15. package/assets/sfx/ambiente/ambience_city_day_02.ogg +0 -0
  16. package/assets/sfx/ambiente/ambience_construction_01.ogg +0 -0
  17. package/assets/sfx/ambiente/ambience_night_01.ogg +0 -0
  18. package/assets/sfx/ambiente/ambience_room_tone_01.ogg +0 -0
  19. package/assets/sfx/ambiente/ambience_room_tone_02.ogg +0 -0
  20. package/assets/sfx/ambiente/ambience_rural_day_01.ogg +0 -0
  21. package/assets/sfx/ambiente/ambience_rural_day_02.ogg +0 -0
  22. package/assets/sfx/ambiente/rain_loop_01.ogg +0 -0
  23. package/assets/sfx/ambiente/water_river_loop_01.ogg +0 -0
  24. package/assets/sfx/ambiente/water_river_loop_02.ogg +0 -0
  25. package/assets/sfx/ambiente/water_river_loop_03.ogg +0 -0
  26. package/assets/sfx/ambiente/water_splash_01.ogg +0 -0
  27. package/assets/sfx/ambiente/water_splash_02.ogg +0 -0
  28. package/assets/sfx/ambiente/water_splash_03.ogg +0 -0
  29. package/assets/sfx/ambiente/water_splash_04.ogg +0 -0
  30. package/assets/sfx/ambiente/water_splash_05.ogg +0 -0
  31. package/assets/sfx/ambiente/water_splash_06.ogg +0 -0
  32. package/assets/sfx/ambiente/water_splash_07.ogg +0 -0
  33. package/assets/sfx/ambiente/water_splash_08.ogg +0 -0
  34. package/assets/sfx/ambiente/water_splash_09.ogg +0 -0
  35. package/assets/sfx/ambiente/water_splash_10.ogg +0 -0
  36. package/assets/sfx/ambiente/water_splash_11.ogg +0 -0
  37. package/assets/sfx/ambiente/water_splash_12.ogg +0 -0
  38. package/assets/sfx/ambiente/water_splash_13.ogg +0 -0
  39. package/assets/sfx/ambiente/water_splash_14.ogg +0 -0
  40. package/assets/sfx/ambiente/water_splash_15.ogg +0 -0
  41. package/assets/sfx/armas/bolt_lift_medium_01.ogg +0 -0
  42. package/assets/sfx/armas/bolt_lift_medium_02.ogg +0 -0
  43. package/assets/sfx/armas/bolt_lift_medium_03.ogg +0 -0
  44. package/assets/sfx/armas/bolt_lift_medium_04.ogg +0 -0
  45. package/assets/sfx/armas/bolt_lift_medium_05.ogg +0 -0
  46. package/assets/sfx/armas/bolt_lock_medium_01.ogg +0 -0
  47. package/assets/sfx/armas/bolt_lock_medium_02.ogg +0 -0
  48. package/assets/sfx/armas/bolt_lock_medium_03.ogg +0 -0
  49. package/assets/sfx/armas/bolt_lock_medium_04.ogg +0 -0
  50. package/assets/sfx/armas/bolt_lock_medium_05.ogg +0 -0
  51. package/assets/sfx/armas/bolt_pull_heavy_01.ogg +0 -0
  52. package/assets/sfx/armas/bolt_pull_medium_01.ogg +0 -0
  53. package/assets/sfx/armas/bolt_pull_medium_02.ogg +0 -0
  54. package/assets/sfx/armas/bolt_pull_medium_03.ogg +0 -0
  55. package/assets/sfx/armas/bolt_pull_medium_04.ogg +0 -0
  56. package/assets/sfx/armas/bolt_pull_medium_05.ogg +0 -0
  57. package/assets/sfx/armas/bolt_pull_medium_06.ogg +0 -0
  58. package/assets/sfx/armas/bolt_push_heavy_01.ogg +0 -0
  59. package/assets/sfx/armas/bolt_push_medium_01.ogg +0 -0
  60. package/assets/sfx/armas/bolt_push_medium_02.ogg +0 -0
  61. package/assets/sfx/armas/bolt_push_medium_03.ogg +0 -0
  62. package/assets/sfx/armas/bolt_push_medium_04.ogg +0 -0
  63. package/assets/sfx/armas/bolt_push_medium_05.ogg +0 -0
  64. package/assets/sfx/armas/bolt_push_medium_06.ogg +0 -0
  65. package/assets/sfx/armas/casing_drop_concreto_01.ogg +0 -0
  66. package/assets/sfx/armas/casing_drop_concreto_02.ogg +0 -0
  67. package/assets/sfx/armas/casing_drop_concreto_03.ogg +0 -0
  68. package/assets/sfx/armas/casing_drop_metal_01.ogg +0 -0
  69. package/assets/sfx/armas/casing_drop_metal_02.ogg +0 -0
  70. package/assets/sfx/armas/casing_drop_metal_03.ogg +0 -0
  71. package/assets/sfx/armas/casing_drop_terra_01.ogg +0 -0
  72. package/assets/sfx/armas/casing_drop_terra_02.ogg +0 -0
  73. package/assets/sfx/armas/casing_drop_terra_03.ogg +0 -0
  74. package/assets/sfx/armas/charging_handle_pull_light_01.ogg +0 -0
  75. package/assets/sfx/armas/charging_handle_pull_light_02.ogg +0 -0
  76. package/assets/sfx/armas/charging_handle_pull_light_03.ogg +0 -0
  77. package/assets/sfx/armas/charging_handle_pull_light_04.ogg +0 -0
  78. package/assets/sfx/armas/charging_handle_pull_medium_01.ogg +0 -0
  79. package/assets/sfx/armas/charging_handle_pull_medium_02.ogg +0 -0
  80. package/assets/sfx/armas/charging_handle_pull_medium_03.ogg +0 -0
  81. package/assets/sfx/armas/charging_handle_pull_medium_04.ogg +0 -0
  82. package/assets/sfx/armas/charging_handle_pull_medium_05.ogg +0 -0
  83. package/assets/sfx/armas/charging_handle_release_medium_01.ogg +0 -0
  84. package/assets/sfx/armas/charging_handle_release_medium_02.ogg +0 -0
  85. package/assets/sfx/armas/charging_handle_release_medium_03.ogg +0 -0
  86. package/assets/sfx/armas/charging_handle_release_medium_04.ogg +0 -0
  87. package/assets/sfx/armas/charging_handle_release_medium_05.ogg +0 -0
  88. package/assets/sfx/armas/cylinder_close_light_01.ogg +0 -0
  89. package/assets/sfx/armas/cylinder_close_light_02.ogg +0 -0
  90. package/assets/sfx/armas/cylinder_close_light_03.ogg +0 -0
  91. package/assets/sfx/armas/cylinder_close_light_04.ogg +0 -0
  92. package/assets/sfx/armas/cylinder_close_light_05.ogg +0 -0
  93. package/assets/sfx/armas/cylinder_eject_light_01.ogg +0 -0
  94. package/assets/sfx/armas/cylinder_eject_light_02.ogg +0 -0
  95. package/assets/sfx/armas/cylinder_eject_light_03.ogg +0 -0
  96. package/assets/sfx/armas/cylinder_open_light_01.ogg +0 -0
  97. package/assets/sfx/armas/cylinder_open_light_02.ogg +0 -0
  98. package/assets/sfx/armas/cylinder_open_light_03.ogg +0 -0
  99. package/assets/sfx/armas/cylinder_open_light_04.ogg +0 -0
  100. package/assets/sfx/armas/cylinder_open_light_05.ogg +0 -0
  101. package/assets/sfx/armas/lever_close_medium_01.ogg +0 -0
  102. package/assets/sfx/armas/lever_close_medium_02.ogg +0 -0
  103. package/assets/sfx/armas/lever_open_medium_01.ogg +0 -0
  104. package/assets/sfx/armas/lever_open_medium_02.ogg +0 -0
  105. package/assets/sfx/armas/mag_out_heavy_01.ogg +0 -0
  106. package/assets/sfx/armas/mag_out_heavy_02.ogg +0 -0
  107. package/assets/sfx/armas/mag_out_light_01.ogg +0 -0
  108. package/assets/sfx/armas/mag_out_light_02.ogg +0 -0
  109. package/assets/sfx/armas/mag_out_light_03.ogg +0 -0
  110. package/assets/sfx/armas/mag_out_light_04.ogg +0 -0
  111. package/assets/sfx/armas/mag_out_medium_01.ogg +0 -0
  112. package/assets/sfx/armas/mag_out_medium_02.ogg +0 -0
  113. package/assets/sfx/armas/mag_out_medium_03.ogg +0 -0
  114. package/assets/sfx/armas/mag_seat_heavy_01.ogg +0 -0
  115. package/assets/sfx/armas/mag_seat_heavy_02.ogg +0 -0
  116. package/assets/sfx/armas/mag_seat_light_01.ogg +0 -0
  117. package/assets/sfx/armas/mag_seat_light_02.ogg +0 -0
  118. package/assets/sfx/armas/mag_seat_light_03.ogg +0 -0
  119. package/assets/sfx/armas/mag_seat_light_04.ogg +0 -0
  120. package/assets/sfx/armas/mag_seat_light_05.ogg +0 -0
  121. package/assets/sfx/armas/mag_seat_light_06.ogg +0 -0
  122. package/assets/sfx/armas/mag_seat_medium_01.ogg +0 -0
  123. package/assets/sfx/armas/mag_seat_medium_02.ogg +0 -0
  124. package/assets/sfx/armas/mag_seat_medium_03.ogg +0 -0
  125. package/assets/sfx/armas/pistol_22lr_close_01.ogg +0 -0
  126. package/assets/sfx/armas/pistol_22lr_close_02.ogg +0 -0
  127. package/assets/sfx/armas/pistol_22lr_far_01.ogg +0 -0
  128. package/assets/sfx/armas/pistol_22lr_far_02.ogg +0 -0
  129. package/assets/sfx/armas/pistol_22lr_far_03.ogg +0 -0
  130. package/assets/sfx/armas/pistol_22lr_far_04.ogg +0 -0
  131. package/assets/sfx/armas/pistol_45_close_01.ogg +0 -0
  132. package/assets/sfx/armas/pistol_45_close_02.ogg +0 -0
  133. package/assets/sfx/armas/pistol_45_close_03.ogg +0 -0
  134. package/assets/sfx/armas/pistol_45_close_04.ogg +0 -0
  135. package/assets/sfx/armas/pistol_45_close_05.ogg +0 -0
  136. package/assets/sfx/armas/pistol_45_far_01.ogg +0 -0
  137. package/assets/sfx/armas/pistol_45_far_02.ogg +0 -0
  138. package/assets/sfx/armas/pistol_45_far_03.ogg +0 -0
  139. package/assets/sfx/armas/pistol_45_far_04.ogg +0 -0
  140. package/assets/sfx/armas/pistol_9mm_close_01.ogg +0 -0
  141. package/assets/sfx/armas/pistol_9mm_close_02.ogg +0 -0
  142. package/assets/sfx/armas/pistol_9mm_close_03.ogg +0 -0
  143. package/assets/sfx/armas/pistol_9mm_close_04.ogg +0 -0
  144. package/assets/sfx/armas/pistol_9mm_close_05.ogg +0 -0
  145. package/assets/sfx/armas/pistol_9mm_close_06.ogg +0 -0
  146. package/assets/sfx/armas/pistol_9mm_far_01.ogg +0 -0
  147. package/assets/sfx/armas/pistol_9mm_far_02.ogg +0 -0
  148. package/assets/sfx/armas/pistol_9mm_far_03.ogg +0 -0
  149. package/assets/sfx/armas/pistol_9mm_far_04.ogg +0 -0
  150. package/assets/sfx/armas/pump_back_heavy_01.ogg +0 -0
  151. package/assets/sfx/armas/pump_back_heavy_02.ogg +0 -0
  152. package/assets/sfx/armas/pump_back_heavy_03.ogg +0 -0
  153. package/assets/sfx/armas/pump_back_heavy_04.ogg +0 -0
  154. package/assets/sfx/armas/pump_back_heavy_05.ogg +0 -0
  155. package/assets/sfx/armas/pump_forward_heavy_01.ogg +0 -0
  156. package/assets/sfx/armas/pump_forward_heavy_02.ogg +0 -0
  157. package/assets/sfx/armas/pump_forward_heavy_03.ogg +0 -0
  158. package/assets/sfx/armas/revolver_38_357_close_01.ogg +0 -0
  159. package/assets/sfx/armas/revolver_38_357_close_02.ogg +0 -0
  160. package/assets/sfx/armas/revolver_38_357_close_03.ogg +0 -0
  161. package/assets/sfx/armas/revolver_38_357_close_04.ogg +0 -0
  162. package/assets/sfx/armas/revolver_38_357_far_01.ogg +0 -0
  163. package/assets/sfx/armas/revolver_38_357_far_02.ogg +0 -0
  164. package/assets/sfx/armas/revolver_38_357_far_03.ogg +0 -0
  165. package/assets/sfx/armas/revolver_38_357_far_04.ogg +0 -0
  166. package/assets/sfx/armas/rifle_308_3006_close_01.ogg +0 -0
  167. package/assets/sfx/armas/rifle_308_3006_close_02.ogg +0 -0
  168. package/assets/sfx/armas/rifle_308_3006_close_03.ogg +0 -0
  169. package/assets/sfx/armas/rifle_308_3006_close_04.ogg +0 -0
  170. package/assets/sfx/armas/rifle_308_3006_close_05.ogg +0 -0
  171. package/assets/sfx/armas/rifle_308_3006_close_06.ogg +0 -0
  172. package/assets/sfx/armas/rifle_308_3006_far_01.ogg +0 -0
  173. package/assets/sfx/armas/rifle_308_3006_far_02.ogg +0 -0
  174. package/assets/sfx/armas/rifle_308_3006_far_03.ogg +0 -0
  175. package/assets/sfx/armas/rifle_308_3006_far_04.ogg +0 -0
  176. package/assets/sfx/armas/rifle_308_3006_far_05.ogg +0 -0
  177. package/assets/sfx/armas/rifle_308_3006_far_06.ogg +0 -0
  178. package/assets/sfx/armas/rifle_5_56_close_01.ogg +0 -0
  179. package/assets/sfx/armas/rifle_5_56_close_02.ogg +0 -0
  180. package/assets/sfx/armas/rifle_5_56_close_03.ogg +0 -0
  181. package/assets/sfx/armas/rifle_5_56_close_04.ogg +0 -0
  182. package/assets/sfx/armas/rifle_5_56_close_05.ogg +0 -0
  183. package/assets/sfx/armas/rifle_5_56_far_01.ogg +0 -0
  184. package/assets/sfx/armas/rifle_5_56_far_02.ogg +0 -0
  185. package/assets/sfx/armas/rifle_5_56_far_03.ogg +0 -0
  186. package/assets/sfx/armas/rifle_5_56_far_04.ogg +0 -0
  187. package/assets/sfx/armas/rifle_7_62x39_close_01.ogg +0 -0
  188. package/assets/sfx/armas/rifle_7_62x39_close_02.ogg +0 -0
  189. package/assets/sfx/armas/rifle_7_62x39_close_03.ogg +0 -0
  190. package/assets/sfx/armas/rifle_7_62x39_close_04.ogg +0 -0
  191. package/assets/sfx/armas/rifle_7_62x39_close_05.ogg +0 -0
  192. package/assets/sfx/armas/rifle_7_62x39_close_06.ogg +0 -0
  193. package/assets/sfx/armas/rifle_7_62x39_close_07.ogg +0 -0
  194. package/assets/sfx/armas/rifle_7_62x39_close_08.ogg +0 -0
  195. package/assets/sfx/armas/rifle_7_62x39_close_09.ogg +0 -0
  196. package/assets/sfx/armas/rifle_7_62x39_close_10.ogg +0 -0
  197. package/assets/sfx/armas/rifle_7_62x39_close_11.ogg +0 -0
  198. package/assets/sfx/armas/rifle_7_62x39_close_12.ogg +0 -0
  199. package/assets/sfx/armas/rifle_7_62x39_far_01.ogg +0 -0
  200. package/assets/sfx/armas/rifle_7_62x39_far_02.ogg +0 -0
  201. package/assets/sfx/armas/rifle_7_62x39_far_03.ogg +0 -0
  202. package/assets/sfx/armas/shell_insert_heavy_01.ogg +0 -0
  203. package/assets/sfx/armas/shell_insert_heavy_02.ogg +0 -0
  204. package/assets/sfx/armas/shell_insert_heavy_03.ogg +0 -0
  205. package/assets/sfx/armas/shell_insert_heavy_04.ogg +0 -0
  206. package/assets/sfx/armas/shell_insert_heavy_05.ogg +0 -0
  207. package/assets/sfx/armas/shell_insert_heavy_06.ogg +0 -0
  208. package/assets/sfx/armas/shell_insert_heavy_07.ogg +0 -0
  209. package/assets/sfx/armas/shell_insert_heavy_08.ogg +0 -0
  210. package/assets/sfx/armas/shell_insert_heavy_09.ogg +0 -0
  211. package/assets/sfx/armas/shotgun_12_close_01.ogg +0 -0
  212. package/assets/sfx/armas/shotgun_12_close_02.ogg +0 -0
  213. package/assets/sfx/armas/shotgun_12_close_03.ogg +0 -0
  214. package/assets/sfx/armas/shotgun_12_close_04.ogg +0 -0
  215. package/assets/sfx/armas/shotgun_12_close_05.ogg +0 -0
  216. package/assets/sfx/armas/shotgun_12_close_06.ogg +0 -0
  217. package/assets/sfx/armas/shotgun_12_far_01.ogg +0 -0
  218. package/assets/sfx/armas/shotgun_12_far_02.ogg +0 -0
  219. package/assets/sfx/armas/shotgun_12_far_03.ogg +0 -0
  220. package/assets/sfx/armas/shotgun_12_far_04.ogg +0 -0
  221. package/assets/sfx/armas/shotgun_12_far_05.ogg +0 -0
  222. package/assets/sfx/armas/shotgun_12_far_06.ogg +0 -0
  223. package/assets/sfx/armas/slide_release_light_01.ogg +0 -0
  224. package/assets/sfx/armas/slide_release_light_02.ogg +0 -0
  225. package/assets/sfx/armas/slide_release_light_03.ogg +0 -0
  226. package/assets/sfx/armas/slide_release_light_04.ogg +0 -0
  227. package/assets/sfx/armas/slide_release_light_05.ogg +0 -0
  228. package/assets/sfx/armas/slide_release_light_06.ogg +0 -0
  229. package/assets/sfx/armas/slide_release_medium_01.ogg +0 -0
  230. package/assets/sfx/armas/slide_release_medium_02.ogg +0 -0
  231. package/assets/sfx/armas/slide_release_medium_03.ogg +0 -0
  232. package/assets/sfx/armas/slide_release_medium_04.ogg +0 -0
  233. package/assets/sfx/armas/sniper_338_300wm_close_01.ogg +0 -0
  234. package/assets/sfx/armas/sniper_338_300wm_close_02.ogg +0 -0
  235. package/assets/sfx/armas/sniper_338_300wm_close_03.ogg +0 -0
  236. package/assets/sfx/armas/sniper_338_300wm_close_04.ogg +0 -0
  237. package/assets/sfx/armas/sniper_338_300wm_close_05.ogg +0 -0
  238. package/assets/sfx/armas/sniper_338_300wm_close_06.ogg +0 -0
  239. package/assets/sfx/armas/sniper_338_300wm_close_07.ogg +0 -0
  240. package/assets/sfx/armas/sniper_338_300wm_far_01.ogg +0 -0
  241. package/assets/sfx/armas/sniper_338_300wm_far_02.ogg +0 -0
  242. package/assets/sfx/armas/sniper_338_300wm_far_03.ogg +0 -0
  243. package/assets/sfx/armas/sniper_338_300wm_far_04.ogg +0 -0
  244. package/assets/sfx/armas/sniper_338_300wm_far_05.ogg +0 -0
  245. package/assets/sfx/armas/sniper_338_300wm_far_06.ogg +0 -0
  246. package/assets/sfx/armas/speedloader_light_01.ogg +0 -0
  247. package/assets/sfx/armas/speedloader_light_02.ogg +0 -0
  248. package/assets/sfx/armas/speedloader_light_03.ogg +0 -0
  249. package/assets/sfx/armas/speedloader_light_04.ogg +0 -0
  250. package/assets/sfx/armas/speedloader_light_05.ogg +0 -0
  251. package/assets/sfx/armas/speedloader_light_06.ogg +0 -0
  252. package/assets/sfx/armas/speedloader_light_07.ogg +0 -0
  253. package/assets/sfx/armas/speedloader_light_08.ogg +0 -0
  254. package/assets/sfx/armas/suppressed_pistol_close_01.ogg +0 -0
  255. package/assets/sfx/armas/suppressed_pistol_close_02.ogg +0 -0
  256. package/assets/sfx/armas/suppressed_pistol_close_03.ogg +0 -0
  257. package/assets/sfx/armas/suppressed_pistol_close_04.ogg +0 -0
  258. package/assets/sfx/armas/suppressed_pistol_close_05.ogg +0 -0
  259. package/assets/sfx/armas/suppressed_pistol_far_01.ogg +0 -0
  260. package/assets/sfx/armas/suppressed_pistol_far_02.ogg +0 -0
  261. package/assets/sfx/armas/suppressed_pistol_far_03.ogg +0 -0
  262. package/assets/sfx/armas/suppressed_pistol_far_04.ogg +0 -0
  263. package/assets/sfx/armas/suppressed_pistol_far_05.ogg +0 -0
  264. package/assets/sfx/armas/suppressed_rifle_close_01.ogg +0 -0
  265. package/assets/sfx/armas/suppressed_rifle_close_02.ogg +0 -0
  266. package/assets/sfx/armas/suppressed_rifle_close_03.ogg +0 -0
  267. package/assets/sfx/armas/suppressed_rifle_close_04.ogg +0 -0
  268. package/assets/sfx/armas/suppressed_rifle_far_01.ogg +0 -0
  269. package/assets/sfx/armas/suppressed_rifle_far_02.ogg +0 -0
  270. package/assets/sfx/armas/suppressed_rifle_far_03.ogg +0 -0
  271. package/assets/sfx/armas/suppressed_rifle_far_04.ogg +0 -0
  272. package/assets/sfx/explosoes-fogo/debris_rain_mixed_01.ogg +0 -0
  273. package/assets/sfx/explosoes-fogo/debris_rain_mixed_02.ogg +0 -0
  274. package/assets/sfx/explosoes-fogo/debris_rain_mixed_03.ogg +0 -0
  275. package/assets/sfx/explosoes-fogo/debris_rain_mixed_04.ogg +0 -0
  276. package/assets/sfx/explosoes-fogo/debris_rain_mixed_05.ogg +0 -0
  277. package/assets/sfx/explosoes-fogo/debris_rain_mixed_06.ogg +0 -0
  278. package/assets/sfx/explosoes-fogo/debris_rain_mixed_07.ogg +0 -0
  279. package/assets/sfx/explosoes-fogo/debris_rain_stone_01.ogg +0 -0
  280. package/assets/sfx/explosoes-fogo/debris_rain_stone_02.ogg +0 -0
  281. package/assets/sfx/explosoes-fogo/debris_rain_stone_03.ogg +0 -0
  282. package/assets/sfx/explosoes-fogo/debris_rain_stone_04.ogg +0 -0
  283. package/assets/sfx/explosoes-fogo/debris_rain_stone_05.ogg +0 -0
  284. package/assets/sfx/explosoes-fogo/debris_rain_stone_06.ogg +0 -0
  285. package/assets/sfx/explosoes-fogo/debris_rain_stone_07.ogg +0 -0
  286. package/assets/sfx/explosoes-fogo/debris_rain_stone_08.ogg +0 -0
  287. package/assets/sfx/explosoes-fogo/debris_rain_stone_09.ogg +0 -0
  288. package/assets/sfx/explosoes-fogo/explosion_big_01.ogg +0 -0
  289. package/assets/sfx/explosoes-fogo/explosion_big_02.ogg +0 -0
  290. package/assets/sfx/explosoes-fogo/explosion_big_03.ogg +0 -0
  291. package/assets/sfx/explosoes-fogo/explosion_big_04.ogg +0 -0
  292. package/assets/sfx/explosoes-fogo/explosion_big_05.ogg +0 -0
  293. package/assets/sfx/explosoes-fogo/explosion_car_01.ogg +0 -0
  294. package/assets/sfx/explosoes-fogo/explosion_car_02.ogg +0 -0
  295. package/assets/sfx/explosoes-fogo/explosion_car_03.ogg +0 -0
  296. package/assets/sfx/explosoes-fogo/explosion_car_04.ogg +0 -0
  297. package/assets/sfx/explosoes-fogo/explosion_far_close_01.ogg +0 -0
  298. package/assets/sfx/explosoes-fogo/explosion_far_close_02.ogg +0 -0
  299. package/assets/sfx/explosoes-fogo/explosion_far_close_03.ogg +0 -0
  300. package/assets/sfx/explosoes-fogo/explosion_far_close_04.ogg +0 -0
  301. package/assets/sfx/explosoes-fogo/explosion_flashbang_01.ogg +0 -0
  302. package/assets/sfx/explosoes-fogo/explosion_flashbang_02.ogg +0 -0
  303. package/assets/sfx/explosoes-fogo/explosion_grenade_01.ogg +0 -0
  304. package/assets/sfx/explosoes-fogo/explosion_grenade_02.ogg +0 -0
  305. package/assets/sfx/explosoes-fogo/explosion_grenade_03.ogg +0 -0
  306. package/assets/sfx/explosoes-fogo/explosion_grenade_04.ogg +0 -0
  307. package/assets/sfx/explosoes-fogo/explosion_grenade_05.ogg +0 -0
  308. package/assets/sfx/explosoes-fogo/explosion_grenade_06.ogg +0 -0
  309. package/assets/sfx/explosoes-fogo/explosion_small_bang_01.ogg +0 -0
  310. package/assets/sfx/explosoes-fogo/explosion_small_bang_02.ogg +0 -0
  311. package/assets/sfx/explosoes-fogo/explosion_small_bang_03.ogg +0 -0
  312. package/assets/sfx/explosoes-fogo/explosion_small_bang_04.ogg +0 -0
  313. package/assets/sfx/explosoes-fogo/explosion_small_bang_05.ogg +0 -0
  314. package/assets/sfx/explosoes-fogo/explosion_small_bang_06.ogg +0 -0
  315. package/assets/sfx/explosoes-fogo/explosion_small_bang_07.ogg +0 -0
  316. package/assets/sfx/explosoes-fogo/explosion_small_bang_08.ogg +0 -0
  317. package/assets/sfx/explosoes-fogo/explosion_small_bang_09.ogg +0 -0
  318. package/assets/sfx/explosoes-fogo/explosion_small_bang_10.ogg +0 -0
  319. package/assets/sfx/explosoes-fogo/fire_crackle_01.ogg +0 -0
  320. package/assets/sfx/explosoes-fogo/fire_crackle_02.ogg +0 -0
  321. package/assets/sfx/explosoes-fogo/fire_crackle_03.ogg +0 -0
  322. package/assets/sfx/explosoes-fogo/fire_crackle_05.ogg +0 -0
  323. package/assets/sfx/explosoes-fogo/fire_crackle_07.ogg +0 -0
  324. package/assets/sfx/explosoes-fogo/fire_extinguish_01.ogg +0 -0
  325. package/assets/sfx/explosoes-fogo/fire_extinguish_02.ogg +0 -0
  326. package/assets/sfx/explosoes-fogo/fire_ignite_01.ogg +0 -0
  327. package/assets/sfx/explosoes-fogo/fire_ignite_02.ogg +0 -0
  328. package/assets/sfx/explosoes-fogo/fire_ignite_03.ogg +0 -0
  329. package/assets/sfx/explosoes-fogo/fire_ignite_04.ogg +0 -0
  330. package/assets/sfx/explosoes-fogo/fire_loop_01.ogg +0 -0
  331. package/assets/sfx/explosoes-fogo/fire_loop_03.ogg +0 -0
  332. package/assets/sfx/explosoes-fogo/fire_loop_04.ogg +0 -0
  333. package/assets/sfx/explosoes-fogo/fire_loop_gas_01.ogg +0 -0
  334. package/assets/sfx/explosoes-fogo/fire_loop_gas_02.ogg +0 -0
  335. package/assets/sfx/explosoes-fogo/fire_loop_gas_03.ogg +0 -0
  336. package/assets/sfx/explosoes-fogo/fire_loop_gas_04.ogg +0 -0
  337. package/assets/sfx/explosoes-fogo/fire_loop_liquid_01.ogg +0 -0
  338. package/assets/sfx/explosoes-fogo/fire_loop_liquid_02.ogg +0 -0
  339. package/assets/sfx/explosoes-fogo/fire_loop_liquid_03.ogg +0 -0
  340. package/assets/sfx/explosoes-fogo/fire_loop_plastic_01.ogg +0 -0
  341. package/assets/sfx/explosoes-fogo/fire_loop_plastic_02.ogg +0 -0
  342. package/assets/sfx/explosoes-fogo/fire_loop_plastic_03.ogg +0 -0
  343. package/assets/sfx/explosoes-fogo/fire_loop_plastic_04.ogg +0 -0
  344. package/assets/sfx/explosoes-fogo/fire_loop_small_01.ogg +0 -0
  345. package/assets/sfx/explosoes-fogo/fire_pop_01.ogg +0 -0
  346. package/assets/sfx/explosoes-fogo/fire_pop_02.ogg +0 -0
  347. package/assets/sfx/explosoes-fogo/fire_pop_03.ogg +0 -0
  348. package/assets/sfx/explosoes-fogo/flamethrower_loop_01.ogg +0 -0
  349. package/assets/sfx/explosoes-fogo/gas_leak_01.ogg +0 -0
  350. package/assets/sfx/explosoes-fogo/molotov_break_ignite_01.ogg +0 -0
  351. package/assets/sfx/explosoes-fogo/molotov_break_ignite_02.ogg +0 -0
  352. package/assets/sfx/impactos/ceramic_hit_close_01.ogg +0 -0
  353. package/assets/sfx/impactos/concrete_block_drag_close_01.ogg +0 -0
  354. package/assets/sfx/impactos/concrete_block_drag_close_02.ogg +0 -0
  355. package/assets/sfx/impactos/concrete_block_drag_close_03.ogg +0 -0
  356. package/assets/sfx/impactos/concrete_block_drag_close_04.ogg +0 -0
  357. package/assets/sfx/impactos/concrete_block_drag_close_05.ogg +0 -0
  358. package/assets/sfx/impactos/concrete_block_drag_close_06.ogg +0 -0
  359. package/assets/sfx/impactos/concrete_block_drag_close_07.ogg +0 -0
  360. package/assets/sfx/impactos/crack_close_01.ogg +0 -0
  361. package/assets/sfx/impactos/crack_close_02.ogg +0 -0
  362. package/assets/sfx/impactos/crack_close_03.ogg +0 -0
  363. package/assets/sfx/impactos/crack_close_04.ogg +0 -0
  364. package/assets/sfx/impactos/crack_close_05.ogg +0 -0
  365. package/assets/sfx/impactos/crack_close_06.ogg +0 -0
  366. package/assets/sfx/impactos/crack_close_07.ogg +0 -0
  367. package/assets/sfx/impactos/crack_close_08.ogg +0 -0
  368. package/assets/sfx/impactos/crack_close_09.ogg +0 -0
  369. package/assets/sfx/impactos/crack_close_10.ogg +0 -0
  370. package/assets/sfx/impactos/crumble_close_01.ogg +0 -0
  371. package/assets/sfx/impactos/crumble_close_02.ogg +0 -0
  372. package/assets/sfx/impactos/crumble_close_03.ogg +0 -0
  373. package/assets/sfx/impactos/crumble_close_04.ogg +0 -0
  374. package/assets/sfx/impactos/crumble_close_05.ogg +0 -0
  375. package/assets/sfx/impactos/flesh_fruit_splat_close_01.ogg +0 -0
  376. package/assets/sfx/impactos/flesh_fruit_splat_close_02.ogg +0 -0
  377. package/assets/sfx/impactos/flesh_fruit_splat_close_03.ogg +0 -0
  378. package/assets/sfx/impactos/furniture_push_wood_close_01.ogg +0 -0
  379. package/assets/sfx/impactos/glass_blunt_heavy_close_01.ogg +0 -0
  380. package/assets/sfx/impactos/glass_blunt_heavy_close_02.ogg +0 -0
  381. package/assets/sfx/impactos/glass_blunt_heavy_close_03.ogg +0 -0
  382. package/assets/sfx/impactos/glass_blunt_heavy_close_04.ogg +0 -0
  383. package/assets/sfx/impactos/glass_blunt_heavy_close_05.ogg +0 -0
  384. package/assets/sfx/impactos/glass_blunt_light_close_01.ogg +0 -0
  385. package/assets/sfx/impactos/glass_blunt_light_close_02.ogg +0 -0
  386. package/assets/sfx/impactos/glass_blunt_light_close_03.ogg +0 -0
  387. package/assets/sfx/impactos/glass_blunt_light_close_04.ogg +0 -0
  388. package/assets/sfx/impactos/glass_blunt_light_close_05.ogg +0 -0
  389. package/assets/sfx/impactos/glass_blunt_medium_close_01.ogg +0 -0
  390. package/assets/sfx/impactos/glass_blunt_medium_close_02.ogg +0 -0
  391. package/assets/sfx/impactos/glass_blunt_medium_close_03.ogg +0 -0
  392. package/assets/sfx/impactos/glass_blunt_medium_close_04.ogg +0 -0
  393. package/assets/sfx/impactos/glass_blunt_medium_close_05.ogg +0 -0
  394. package/assets/sfx/impactos/glass_bottle_break_close_01.ogg +0 -0
  395. package/assets/sfx/impactos/glass_debris_fall_close_01.ogg +0 -0
  396. package/assets/sfx/impactos/glass_debris_fall_close_02.ogg +0 -0
  397. package/assets/sfx/impactos/glass_debris_fall_close_03.ogg +0 -0
  398. package/assets/sfx/impactos/glass_debris_fall_close_04.ogg +0 -0
  399. package/assets/sfx/impactos/glass_shatter_close_01.ogg +0 -0
  400. package/assets/sfx/impactos/glass_shatter_close_02.ogg +0 -0
  401. package/assets/sfx/impactos/glass_shatter_close_03.ogg +0 -0
  402. package/assets/sfx/impactos/glass_shatter_close_04.ogg +0 -0
  403. package/assets/sfx/impactos/glass_shatter_close_05.ogg +0 -0
  404. package/assets/sfx/impactos/glass_shatter_close_06.ogg +0 -0
  405. package/assets/sfx/impactos/glass_shatter_close_07.ogg +0 -0
  406. package/assets/sfx/impactos/glass_shatter_close_08.ogg +0 -0
  407. package/assets/sfx/impactos/glass_shatter_close_09.ogg +0 -0
  408. package/assets/sfx/impactos/gravel_hit_close_21.ogg +0 -0
  409. package/assets/sfx/impactos/gravel_hit_close_22.ogg +0 -0
  410. package/assets/sfx/impactos/gravel_hit_close_23.ogg +0 -0
  411. package/assets/sfx/impactos/gravel_hit_close_24.ogg +0 -0
  412. package/assets/sfx/impactos/gravel_hit_close_25.ogg +0 -0
  413. package/assets/sfx/impactos/gravel_hit_close_26.ogg +0 -0
  414. package/assets/sfx/impactos/gravel_hit_close_27.ogg +0 -0
  415. package/assets/sfx/impactos/gravel_hit_close_28.ogg +0 -0
  416. package/assets/sfx/impactos/gravel_hit_close_29.ogg +0 -0
  417. package/assets/sfx/impactos/impact_generic_light_close_01.ogg +0 -0
  418. package/assets/sfx/impactos/impact_generic_light_close_02.ogg +0 -0
  419. package/assets/sfx/impactos/impact_generic_light_close_03.ogg +0 -0
  420. package/assets/sfx/impactos/impact_generic_light_close_04.ogg +0 -0
  421. package/assets/sfx/impactos/impact_generic_light_close_05.ogg +0 -0
  422. package/assets/sfx/impactos/masonry_blunt_close_01.ogg +0 -0
  423. package/assets/sfx/impactos/masonry_blunt_close_02.ogg +0 -0
  424. package/assets/sfx/impactos/masonry_blunt_close_03.ogg +0 -0
  425. package/assets/sfx/impactos/masonry_blunt_close_04.ogg +0 -0
  426. package/assets/sfx/impactos/masonry_blunt_close_05.ogg +0 -0
  427. package/assets/sfx/impactos/masonry_blunt_close_06.ogg +0 -0
  428. package/assets/sfx/impactos/masonry_blunt_close_07.ogg +0 -0
  429. package/assets/sfx/impactos/masonry_bullet_close_01.ogg +0 -0
  430. package/assets/sfx/impactos/masonry_bullet_close_02.ogg +0 -0
  431. package/assets/sfx/impactos/masonry_bullet_close_03.ogg +0 -0
  432. package/assets/sfx/impactos/masonry_bullet_close_04.ogg +0 -0
  433. package/assets/sfx/impactos/masonry_bullet_close_05.ogg +0 -0
  434. package/assets/sfx/impactos/masonry_bullet_close_21.ogg +0 -0
  435. package/assets/sfx/impactos/masonry_bullet_close_22.ogg +0 -0
  436. package/assets/sfx/impactos/masonry_bullet_close_23.ogg +0 -0
  437. package/assets/sfx/impactos/masonry_bullet_close_24.ogg +0 -0
  438. package/assets/sfx/impactos/masonry_bullet_close_25.ogg +0 -0
  439. package/assets/sfx/impactos/masonry_bullet_close_26.ogg +0 -0
  440. package/assets/sfx/impactos/masonry_bullet_close_27.ogg +0 -0
  441. package/assets/sfx/impactos/masonry_bullet_close_28.ogg +0 -0
  442. package/assets/sfx/impactos/metal_blunt_close_01.ogg +0 -0
  443. package/assets/sfx/impactos/metal_blunt_close_02.ogg +0 -0
  444. package/assets/sfx/impactos/metal_blunt_close_03.ogg +0 -0
  445. package/assets/sfx/impactos/metal_blunt_close_04.ogg +0 -0
  446. package/assets/sfx/impactos/metal_blunt_close_05.ogg +0 -0
  447. package/assets/sfx/impactos/metal_blunt_heavy_close_01.ogg +0 -0
  448. package/assets/sfx/impactos/metal_blunt_heavy_close_02.ogg +0 -0
  449. package/assets/sfx/impactos/metal_blunt_heavy_close_03.ogg +0 -0
  450. package/assets/sfx/impactos/metal_blunt_heavy_close_04.ogg +0 -0
  451. package/assets/sfx/impactos/metal_blunt_heavy_close_05.ogg +0 -0
  452. package/assets/sfx/impactos/metal_blunt_light_close_01.ogg +0 -0
  453. package/assets/sfx/impactos/metal_blunt_light_close_02.ogg +0 -0
  454. package/assets/sfx/impactos/metal_blunt_light_close_03.ogg +0 -0
  455. package/assets/sfx/impactos/metal_blunt_light_close_04.ogg +0 -0
  456. package/assets/sfx/impactos/metal_blunt_light_close_05.ogg +0 -0
  457. package/assets/sfx/impactos/metal_blunt_medium_close_01.ogg +0 -0
  458. package/assets/sfx/impactos/metal_blunt_medium_close_02.ogg +0 -0
  459. package/assets/sfx/impactos/metal_blunt_medium_close_03.ogg +0 -0
  460. package/assets/sfx/impactos/metal_blunt_medium_close_04.ogg +0 -0
  461. package/assets/sfx/impactos/metal_blunt_medium_close_05.ogg +0 -0
  462. package/assets/sfx/impactos/metal_bullet_close_01.ogg +0 -0
  463. package/assets/sfx/impactos/metal_bullet_close_02.ogg +0 -0
  464. package/assets/sfx/impactos/metal_bullet_close_03.ogg +0 -0
  465. package/assets/sfx/impactos/metal_bullet_close_04.ogg +0 -0
  466. package/assets/sfx/impactos/metal_bullet_close_05.ogg +0 -0
  467. package/assets/sfx/impactos/metal_bullet_close_06.ogg +0 -0
  468. package/assets/sfx/impactos/metal_bullet_close_21.ogg +0 -0
  469. package/assets/sfx/impactos/metal_bullet_close_22.ogg +0 -0
  470. package/assets/sfx/impactos/metal_bullet_close_23.ogg +0 -0
  471. package/assets/sfx/impactos/metal_bullet_close_24.ogg +0 -0
  472. package/assets/sfx/impactos/metal_bullet_close_25.ogg +0 -0
  473. package/assets/sfx/impactos/metal_bullet_close_26.ogg +0 -0
  474. package/assets/sfx/impactos/metal_bullet_close_27.ogg +0 -0
  475. package/assets/sfx/impactos/metal_bullet_close_28.ogg +0 -0
  476. package/assets/sfx/impactos/metal_bullet_close_29.ogg +0 -0
  477. package/assets/sfx/impactos/metal_bullet_close_30.ogg +0 -0
  478. package/assets/sfx/impactos/metal_bullet_close_31.ogg +0 -0
  479. package/assets/sfx/impactos/metal_bullet_close_32.ogg +0 -0
  480. package/assets/sfx/impactos/metal_bullet_close_33.ogg +0 -0
  481. package/assets/sfx/impactos/metal_bullet_close_34.ogg +0 -0
  482. package/assets/sfx/impactos/metal_fall_close_01.ogg +0 -0
  483. package/assets/sfx/impactos/metal_fall_close_02.ogg +0 -0
  484. package/assets/sfx/impactos/metal_fall_close_03.ogg +0 -0
  485. package/assets/sfx/impactos/metal_fall_close_04.ogg +0 -0
  486. package/assets/sfx/impactos/metal_fall_close_05.ogg +0 -0
  487. package/assets/sfx/impactos/metal_fall_close_06.ogg +0 -0
  488. package/assets/sfx/impactos/metal_fall_close_07.ogg +0 -0
  489. package/assets/sfx/impactos/metal_fall_close_08.ogg +0 -0
  490. package/assets/sfx/impactos/metal_fall_close_09.ogg +0 -0
  491. package/assets/sfx/impactos/metal_fall_close_10.ogg +0 -0
  492. package/assets/sfx/impactos/metal_thin_close_01.ogg +0 -0
  493. package/assets/sfx/impactos/metal_thin_close_02.ogg +0 -0
  494. package/assets/sfx/impactos/metal_thin_close_03.ogg +0 -0
  495. package/assets/sfx/impactos/metal_thin_close_04.ogg +0 -0
  496. package/assets/sfx/impactos/metal_thin_close_05.ogg +0 -0
  497. package/assets/sfx/impactos/metal_thin_close_06.ogg +0 -0
  498. package/assets/sfx/impactos/metal_thin_close_07.ogg +0 -0
  499. package/assets/sfx/impactos/metal_thin_close_08.ogg +0 -0
  500. package/assets/sfx/impactos/metal_thin_close_09.ogg +0 -0
  501. package/assets/sfx/impactos/metal_thin_close_10.ogg +0 -0
  502. package/assets/sfx/impactos/metal_thin_close_11.ogg +0 -0
  503. package/assets/sfx/impactos/metal_thin_close_12.ogg +0 -0
  504. package/assets/sfx/impactos/metal_thin_close_13.ogg +0 -0
  505. package/assets/sfx/impactos/metal_thin_close_14.ogg +0 -0
  506. package/assets/sfx/impactos/metal_thin_close_15.ogg +0 -0
  507. package/assets/sfx/impactos/metal_thin_close_16.ogg +0 -0
  508. package/assets/sfx/impactos/metal_thin_close_17.ogg +0 -0
  509. package/assets/sfx/impactos/metal_thin_close_18.ogg +0 -0
  510. package/assets/sfx/impactos/metal_thin_close_19.ogg +0 -0
  511. package/assets/sfx/impactos/metal_thin_close_20.ogg +0 -0
  512. package/assets/sfx/impactos/metal_thin_close_21.ogg +0 -0
  513. package/assets/sfx/impactos/metal_thin_close_22.ogg +0 -0
  514. package/assets/sfx/impactos/metal_thin_close_23.ogg +0 -0
  515. package/assets/sfx/impactos/metal_thin_close_24.ogg +0 -0
  516. package/assets/sfx/impactos/metal_thin_close_25.ogg +0 -0
  517. package/assets/sfx/impactos/metal_thin_close_26.ogg +0 -0
  518. package/assets/sfx/impactos/paper_tear_close_01.ogg +0 -0
  519. package/assets/sfx/impactos/paper_tear_close_02.ogg +0 -0
  520. package/assets/sfx/impactos/plastic_hit_close_01.ogg +0 -0
  521. package/assets/sfx/impactos/plastic_hit_close_02.ogg +0 -0
  522. package/assets/sfx/impactos/plastic_hit_close_03.ogg +0 -0
  523. package/assets/sfx/impactos/plastic_hit_close_04.ogg +0 -0
  524. package/assets/sfx/impactos/ricochet_metal_close_21.ogg +0 -0
  525. package/assets/sfx/impactos/ricochet_metal_close_22.ogg +0 -0
  526. package/assets/sfx/impactos/ricochet_metal_close_23.ogg +0 -0
  527. package/assets/sfx/impactos/ricochet_metal_close_24.ogg +0 -0
  528. package/assets/sfx/impactos/ricochet_metal_close_25.ogg +0 -0
  529. package/assets/sfx/impactos/ricochet_metal_close_26.ogg +0 -0
  530. package/assets/sfx/impactos/ricochet_metal_close_27.ogg +0 -0
  531. package/assets/sfx/impactos/ricochet_metal_close_28.ogg +0 -0
  532. package/assets/sfx/impactos/rubble_falling_close_01.ogg +0 -0
  533. package/assets/sfx/impactos/rubble_falling_close_02.ogg +0 -0
  534. package/assets/sfx/impactos/rubble_falling_close_03.ogg +0 -0
  535. package/assets/sfx/impactos/rubble_falling_close_04.ogg +0 -0
  536. package/assets/sfx/impactos/rubble_falling_close_05.ogg +0 -0
  537. package/assets/sfx/impactos/rubble_falling_close_06.ogg +0 -0
  538. package/assets/sfx/impactos/rubble_falling_close_07.ogg +0 -0
  539. package/assets/sfx/impactos/rubble_falling_close_08.ogg +0 -0
  540. package/assets/sfx/impactos/rubble_falling_close_09.ogg +0 -0
  541. package/assets/sfx/impactos/soft_bullet_close_01.ogg +0 -0
  542. package/assets/sfx/impactos/soft_bullet_close_02.ogg +0 -0
  543. package/assets/sfx/impactos/soft_bullet_close_03.ogg +0 -0
  544. package/assets/sfx/impactos/soft_bullet_close_04.ogg +0 -0
  545. package/assets/sfx/impactos/soft_bullet_close_05.ogg +0 -0
  546. package/assets/sfx/impactos/soft_bullet_close_06.ogg +0 -0
  547. package/assets/sfx/impactos/soft_bullet_close_07.ogg +0 -0
  548. package/assets/sfx/impactos/soft_bullet_close_08.ogg +0 -0
  549. package/assets/sfx/impactos/soft_bullet_close_09.ogg +0 -0
  550. package/assets/sfx/impactos/soft_bullet_close_10.ogg +0 -0
  551. package/assets/sfx/impactos/soil_bullet_close_21.ogg +0 -0
  552. package/assets/sfx/impactos/soil_bullet_close_22.ogg +0 -0
  553. package/assets/sfx/impactos/soil_bullet_close_23.ogg +0 -0
  554. package/assets/sfx/impactos/wood_blunt_heavy_close_01.ogg +0 -0
  555. package/assets/sfx/impactos/wood_blunt_heavy_close_02.ogg +0 -0
  556. package/assets/sfx/impactos/wood_blunt_heavy_close_03.ogg +0 -0
  557. package/assets/sfx/impactos/wood_blunt_heavy_close_04.ogg +0 -0
  558. package/assets/sfx/impactos/wood_blunt_heavy_close_05.ogg +0 -0
  559. package/assets/sfx/impactos/wood_blunt_light_close_01.ogg +0 -0
  560. package/assets/sfx/impactos/wood_blunt_light_close_02.ogg +0 -0
  561. package/assets/sfx/impactos/wood_blunt_light_close_03.ogg +0 -0
  562. package/assets/sfx/impactos/wood_blunt_light_close_04.ogg +0 -0
  563. package/assets/sfx/impactos/wood_blunt_light_close_05.ogg +0 -0
  564. package/assets/sfx/impactos/wood_blunt_medium_close_01.ogg +0 -0
  565. package/assets/sfx/impactos/wood_blunt_medium_close_02.ogg +0 -0
  566. package/assets/sfx/impactos/wood_blunt_medium_close_03.ogg +0 -0
  567. package/assets/sfx/impactos/wood_blunt_medium_close_04.ogg +0 -0
  568. package/assets/sfx/impactos/wood_blunt_medium_close_05.ogg +0 -0
  569. package/assets/sfx/impactos/wood_fall_close_01.ogg +0 -0
  570. package/assets/sfx/impactos/wood_fall_close_02.ogg +0 -0
  571. package/assets/sfx/impactos/wood_fall_close_03.ogg +0 -0
  572. package/assets/sfx/impactos/wood_fall_close_04.ogg +0 -0
  573. package/assets/sfx/impactos/wood_fall_close_05.ogg +0 -0
  574. package/assets/sfx/impactos/wood_fall_close_06.ogg +0 -0
  575. package/assets/sfx/impactos/wood_fall_close_07.ogg +0 -0
  576. package/assets/sfx/impactos/wood_fall_close_08.ogg +0 -0
  577. package/assets/sfx/impactos/wood_fall_close_09.ogg +0 -0
  578. package/assets/sfx/impactos/wood_hit_close_01.ogg +0 -0
  579. package/assets/sfx/impactos/wood_hit_close_02.ogg +0 -0
  580. package/assets/sfx/impactos/wood_hit_close_03.ogg +0 -0
  581. package/assets/sfx/impactos/wood_hit_close_04.ogg +0 -0
  582. package/assets/sfx/impactos/wood_hit_close_05.ogg +0 -0
  583. package/assets/sfx/impactos/wood_hit_close_06.ogg +0 -0
  584. package/assets/sfx/impactos/wood_hit_close_07.ogg +0 -0
  585. package/assets/sfx/impactos/wood_hit_close_08.ogg +0 -0
  586. package/assets/sfx/impactos/wood_hit_close_09.ogg +0 -0
  587. package/assets/sfx/impactos/wood_hit_close_10.ogg +0 -0
  588. package/assets/sfx/impactos/wood_hit_close_11.ogg +0 -0
  589. package/assets/sfx/impactos/wood_hit_close_12.ogg +0 -0
  590. package/assets/sfx/impactos/wood_hit_close_13.ogg +0 -0
  591. package/assets/sfx/impactos/wood_hit_close_14.ogg +0 -0
  592. package/assets/sfx/impactos/wood_hit_close_21.ogg +0 -0
  593. package/assets/sfx/impactos/wood_hit_close_22.ogg +0 -0
  594. package/assets/sfx/impactos/wood_hit_close_23.ogg +0 -0
  595. package/assets/sfx/impactos/wood_hit_close_24.ogg +0 -0
  596. package/assets/sfx/impactos/wood_hit_close_25.ogg +0 -0
  597. package/assets/sfx/impactos/wood_hit_close_26.ogg +0 -0
  598. package/assets/sfx/impactos/wood_hit_close_27.ogg +0 -0
  599. package/assets/sfx/itens-portas/backpack_open_shut_01.ogg +0 -0
  600. package/assets/sfx/itens-portas/backpack_open_shut_02.ogg +0 -0
  601. package/assets/sfx/itens-portas/backpack_open_shut_03.ogg +0 -0
  602. package/assets/sfx/itens-portas/backpack_open_shut_04.ogg +0 -0
  603. package/assets/sfx/itens-portas/backpack_open_shut_05.ogg +0 -0
  604. package/assets/sfx/itens-portas/backpack_open_shut_06.ogg +0 -0
  605. package/assets/sfx/itens-portas/book_open_shut_01.ogg +0 -0
  606. package/assets/sfx/itens-portas/book_open_shut_02.ogg +0 -0
  607. package/assets/sfx/itens-portas/book_open_shut_03.ogg +0 -0
  608. package/assets/sfx/itens-portas/book_open_shut_04.ogg +0 -0
  609. package/assets/sfx/itens-portas/book_open_shut_05.ogg +0 -0
  610. package/assets/sfx/itens-portas/book_open_shut_06.ogg +0 -0
  611. package/assets/sfx/itens-portas/book_open_shut_07.ogg +0 -0
  612. package/assets/sfx/itens-portas/book_open_shut_08.ogg +0 -0
  613. package/assets/sfx/itens-portas/book_open_shut_09.ogg +0 -0
  614. package/assets/sfx/itens-portas/book_open_shut_10.ogg +0 -0
  615. package/assets/sfx/itens-portas/book_open_shut_11.ogg +0 -0
  616. package/assets/sfx/itens-portas/door_creak_01.ogg +0 -0
  617. package/assets/sfx/itens-portas/door_creak_02.ogg +0 -0
  618. package/assets/sfx/itens-portas/door_creak_03.ogg +0 -0
  619. package/assets/sfx/itens-portas/door_creak_06.ogg +0 -0
  620. package/assets/sfx/itens-portas/door_creak_07.ogg +0 -0
  621. package/assets/sfx/itens-portas/door_glass_sliding_01.ogg +0 -0
  622. package/assets/sfx/itens-portas/door_glass_sliding_02.ogg +0 -0
  623. package/assets/sfx/itens-portas/door_glass_sliding_03.ogg +0 -0
  624. package/assets/sfx/itens-portas/door_glass_sliding_04.ogg +0 -0
  625. package/assets/sfx/itens-portas/door_knock_01.ogg +0 -0
  626. package/assets/sfx/itens-portas/door_lock_unlock_01.ogg +0 -0
  627. package/assets/sfx/itens-portas/door_lock_unlock_02.ogg +0 -0
  628. package/assets/sfx/itens-portas/door_lock_unlock_03.ogg +0 -0
  629. package/assets/sfx/itens-portas/door_lock_unlock_04.ogg +0 -0
  630. package/assets/sfx/itens-portas/door_lock_unlock_05.ogg +0 -0
  631. package/assets/sfx/itens-portas/door_lock_unlock_06.ogg +0 -0
  632. package/assets/sfx/itens-portas/door_lock_unlock_07.ogg +0 -0
  633. package/assets/sfx/itens-portas/door_lock_unlock_08.ogg +0 -0
  634. package/assets/sfx/itens-portas/door_lock_unlock_09.ogg +0 -0
  635. package/assets/sfx/itens-portas/door_lock_unlock_10.ogg +0 -0
  636. package/assets/sfx/itens-portas/door_lock_unlock_11.ogg +0 -0
  637. package/assets/sfx/itens-portas/door_locked_rattle_01.ogg +0 -0
  638. package/assets/sfx/itens-portas/door_locked_rattle_02.ogg +0 -0
  639. package/assets/sfx/itens-portas/door_locked_rattle_03.ogg +0 -0
  640. package/assets/sfx/itens-portas/door_metal_open_shut_01.ogg +0 -0
  641. package/assets/sfx/itens-portas/door_metal_open_shut_02.ogg +0 -0
  642. package/assets/sfx/itens-portas/door_metal_open_shut_03.ogg +0 -0
  643. package/assets/sfx/itens-portas/door_metal_open_shut_04.ogg +0 -0
  644. package/assets/sfx/itens-portas/door_metal_open_shut_05.ogg +0 -0
  645. package/assets/sfx/itens-portas/door_metal_open_shut_06.ogg +0 -0
  646. package/assets/sfx/itens-portas/door_metal_open_shut_07.ogg +0 -0
  647. package/assets/sfx/itens-portas/door_slam_wood_01.ogg +0 -0
  648. package/assets/sfx/itens-portas/door_slam_wood_02.ogg +0 -0
  649. package/assets/sfx/itens-portas/door_slam_wood_03.ogg +0 -0
  650. package/assets/sfx/itens-portas/door_slam_wood_04.ogg +0 -0
  651. package/assets/sfx/itens-portas/door_wood_open_01.ogg +0 -0
  652. package/assets/sfx/itens-portas/door_wood_open_02.ogg +0 -0
  653. package/assets/sfx/itens-portas/door_wood_open_03.ogg +0 -0
  654. package/assets/sfx/itens-portas/door_wood_open_04.ogg +0 -0
  655. package/assets/sfx/itens-portas/door_wood_shut_01.ogg +0 -0
  656. package/assets/sfx/itens-portas/door_wood_shut_02.ogg +0 -0
  657. package/assets/sfx/itens-portas/door_wood_shut_03.ogg +0 -0
  658. package/assets/sfx/itens-portas/door_wood_shut_04.ogg +0 -0
  659. package/assets/sfx/itens-portas/door_wood_shut_05.ogg +0 -0
  660. package/assets/sfx/itens-portas/door_wood_shut_06.ogg +0 -0
  661. package/assets/sfx/itens-portas/door_wood_shut_07.ogg +0 -0
  662. package/assets/sfx/itens-portas/door_wood_shut_08.ogg +0 -0
  663. package/assets/sfx/itens-portas/drawer_open_01.ogg +0 -0
  664. package/assets/sfx/itens-portas/drawer_open_02.ogg +0 -0
  665. package/assets/sfx/itens-portas/drawer_shut_01.ogg +0 -0
  666. package/assets/sfx/itens-portas/drawer_shut_02.ogg +0 -0
  667. package/assets/sfx/itens-portas/item_drop_bag_01.ogg +0 -0
  668. package/assets/sfx/itens-portas/item_drop_bag_02.ogg +0 -0
  669. package/assets/sfx/itens-portas/item_drop_glass_01.ogg +0 -0
  670. package/assets/sfx/itens-portas/item_drop_metal_01.ogg +0 -0
  671. package/assets/sfx/itens-portas/item_drop_metal_02.ogg +0 -0
  672. package/assets/sfx/itens-portas/item_drop_metal_03.ogg +0 -0
  673. package/assets/sfx/itens-portas/item_drop_metal_04.ogg +0 -0
  674. package/assets/sfx/itens-portas/item_drop_metal_05.ogg +0 -0
  675. package/assets/sfx/itens-portas/item_drop_paper_01.ogg +0 -0
  676. package/assets/sfx/itens-portas/item_pickup_coins_01.ogg +0 -0
  677. package/assets/sfx/itens-portas/item_pickup_coins_02.ogg +0 -0
  678. package/assets/sfx/itens-portas/item_pickup_generic_01.ogg +0 -0
  679. package/assets/sfx/itens-portas/item_pickup_generic_02.ogg +0 -0
  680. package/assets/sfx/itens-portas/item_pickup_generic_03.ogg +0 -0
  681. package/assets/sfx/itens-portas/item_pickup_generic_04.ogg +0 -0
  682. package/assets/sfx/itens-portas/item_pickup_leather_01.ogg +0 -0
  683. package/assets/sfx/itens-portas/item_pickup_leather_02.ogg +0 -0
  684. package/assets/sfx/itens-portas/item_pickup_leather_03.ogg +0 -0
  685. package/assets/sfx/itens-portas/item_pickup_leather_04.ogg +0 -0
  686. package/assets/sfx/itens-portas/item_pickup_leather_05.ogg +0 -0
  687. package/assets/sfx/itens-portas/item_setdown_01.ogg +0 -0
  688. package/assets/sfx/itens-portas/item_setdown_02.ogg +0 -0
  689. package/assets/sfx/itens-portas/keys_jingle_01.ogg +0 -0
  690. package/assets/sfx/itens-portas/keys_jingle_02.ogg +0 -0
  691. package/assets/sfx/itens-portas/keys_jingle_03.ogg +0 -0
  692. package/assets/sfx/itens-portas/keys_jingle_04.ogg +0 -0
  693. package/assets/sfx/itens-portas/keys_jingle_05.ogg +0 -0
  694. package/assets/sfx/itens-portas/keys_jingle_06.ogg +0 -0
  695. package/assets/sfx/itens-portas/keys_jingle_07.ogg +0 -0
  696. package/assets/sfx/itens-portas/lever_pull_01.ogg +0 -0
  697. package/assets/sfx/itens-portas/lever_pull_02.ogg +0 -0
  698. package/assets/sfx/itens-portas/lever_pull_03.ogg +0 -0
  699. package/assets/sfx/itens-portas/lever_pull_04.ogg +0 -0
  700. package/assets/sfx/itens-portas/lever_pull_05.ogg +0 -0
  701. package/assets/sfx/itens-portas/lever_pull_06.ogg +0 -0
  702. package/assets/sfx/itens-portas/metal_latch_01.ogg +0 -0
  703. package/assets/sfx/itens-portas/metal_latch_02.ogg +0 -0
  704. package/assets/sfx/itens-portas/plates_hit_01.ogg +0 -0
  705. package/assets/sfx/itens-portas/plates_hit_02.ogg +0 -0
  706. package/assets/sfx/itens-portas/plates_hit_03.ogg +0 -0
  707. package/assets/sfx/itens-portas/plates_hit_04.ogg +0 -0
  708. package/assets/sfx/itens-portas/plates_hit_05.ogg +0 -0
  709. package/assets/sfx/itens-portas/plates_hit_06.ogg +0 -0
  710. package/assets/sfx/itens-portas/plates_hit_07.ogg +0 -0
  711. package/assets/sfx/itens-portas/plates_hit_08.ogg +0 -0
  712. package/assets/sfx/itens-portas/plates_hit_09.ogg +0 -0
  713. package/assets/sfx/itens-portas/plates_hit_10.ogg +0 -0
  714. package/assets/sfx/itens-portas/plates_slide_01.ogg +0 -0
  715. package/assets/sfx/itens-portas/plates_slide_02.ogg +0 -0
  716. package/assets/sfx/itens-portas/plates_slide_03.ogg +0 -0
  717. package/assets/sfx/itens-portas/plates_slide_04.ogg +0 -0
  718. package/assets/sfx/itens-portas/saw_wood_01.ogg +0 -0
  719. package/assets/sfx/itens-portas/switch_click_01.ogg +0 -0
  720. package/assets/sfx/itens-portas/switch_click_02.ogg +0 -0
  721. package/assets/sfx/itens-portas/switch_click_03.ogg +0 -0
  722. package/assets/sfx/itens-portas/switch_click_04.ogg +0 -0
  723. package/assets/sfx/itens-portas/toilet_flush_01.ogg +0 -0
  724. package/assets/sfx/itens-portas/tools_handling_01.ogg +0 -0
  725. package/assets/sfx/itens-portas/tools_handling_02.ogg +0 -0
  726. package/assets/sfx/itens-portas/tools_handling_03.ogg +0 -0
  727. package/assets/sfx/itens-portas/tools_handling_04.ogg +0 -0
  728. package/assets/sfx/itens-portas/tools_handling_05.ogg +0 -0
  729. package/assets/sfx/itens-portas/tools_handling_06.ogg +0 -0
  730. package/assets/sfx/itens-portas/tools_handling_07.ogg +0 -0
  731. package/assets/sfx/itens-portas/tools_handling_08.ogg +0 -0
  732. package/assets/sfx/itens-portas/tools_handling_09.ogg +0 -0
  733. package/assets/sfx/itens-portas/tools_handling_10.ogg +0 -0
  734. package/assets/sfx/itens-portas/tools_handling_11.ogg +0 -0
  735. package/assets/sfx/itens-portas/tools_handling_12.ogg +0 -0
  736. package/assets/sfx/itens-portas/tools_handling_13.ogg +0 -0
  737. package/assets/sfx/itens-portas/tools_handling_14.ogg +0 -0
  738. package/assets/sfx/itens-portas/tools_handling_15.ogg +0 -0
  739. package/assets/sfx/itens-portas/tools_handling_16.ogg +0 -0
  740. package/assets/sfx/itens-portas/water_drip_01.ogg +0 -0
  741. package/assets/sfx/itens-portas/water_drip_02.ogg +0 -0
  742. package/assets/sfx/itens-portas/water_drip_03.ogg +0 -0
  743. package/assets/sfx/itens-portas/water_drip_04.ogg +0 -0
  744. package/assets/sfx/itens-portas/water_faucet_01.ogg +0 -0
  745. package/assets/sfx/itens-portas/water_faucet_02.ogg +0 -0
  746. package/assets/sfx/itens-portas/water_faucet_03.ogg +0 -0
  747. package/assets/sfx/itens-portas/water_faucet_04.ogg +0 -0
  748. package/assets/sfx/itens-portas/water_faucet_05.ogg +0 -0
  749. package/assets/sfx/itens-portas/water_faucet_06.ogg +0 -0
  750. package/assets/sfx/itens-portas/water_faucet_07.ogg +0 -0
  751. package/assets/sfx/itens-portas/water_faucet_08.ogg +0 -0
  752. package/assets/sfx/itens-portas/water_faucet_09.ogg +0 -0
  753. package/assets/sfx/itens-portas/water_faucet_10.ogg +0 -0
  754. package/assets/sfx/personagem/axe_chop_01.ogg +0 -0
  755. package/assets/sfx/personagem/axe_chop_02.ogg +0 -0
  756. package/assets/sfx/personagem/blunt_hit_metal_01.ogg +0 -0
  757. package/assets/sfx/personagem/blunt_hit_metal_02.ogg +0 -0
  758. package/assets/sfx/personagem/blunt_hit_metal_03.ogg +0 -0
  759. package/assets/sfx/personagem/blunt_hit_metal_04.ogg +0 -0
  760. package/assets/sfx/personagem/blunt_hit_metal_05.ogg +0 -0
  761. package/assets/sfx/personagem/body_fall_01.ogg +0 -0
  762. package/assets/sfx/personagem/body_fall_02.ogg +0 -0
  763. package/assets/sfx/personagem/body_fall_03.ogg +0 -0
  764. package/assets/sfx/personagem/body_fall_04.ogg +0 -0
  765. package/assets/sfx/personagem/body_fall_05.ogg +0 -0
  766. package/assets/sfx/personagem/cloth_rustle_01.ogg +0 -0
  767. package/assets/sfx/personagem/cloth_rustle_02.ogg +0 -0
  768. package/assets/sfx/personagem/cloth_rustle_03.ogg +0 -0
  769. package/assets/sfx/personagem/cloth_rustle_04.ogg +0 -0
  770. package/assets/sfx/personagem/cloth_rustle_05.ogg +0 -0
  771. package/assets/sfx/personagem/cloth_rustle_06.ogg +0 -0
  772. package/assets/sfx/personagem/cloth_rustle_07.ogg +0 -0
  773. package/assets/sfx/personagem/cloth_rustle_08.ogg +0 -0
  774. package/assets/sfx/personagem/cloth_rustle_09.ogg +0 -0
  775. package/assets/sfx/personagem/cloth_rustle_10.ogg +0 -0
  776. package/assets/sfx/personagem/cloth_rustle_11.ogg +0 -0
  777. package/assets/sfx/personagem/cloth_rustle_12.ogg +0 -0
  778. package/assets/sfx/personagem/cloth_rustle_13.ogg +0 -0
  779. package/assets/sfx/personagem/cloth_rustle_14.ogg +0 -0
  780. package/assets/sfx/personagem/drink_gulp_01.ogg +0 -0
  781. package/assets/sfx/personagem/drink_gulp_02.ogg +0 -0
  782. package/assets/sfx/personagem/drink_gulp_03.ogg +0 -0
  783. package/assets/sfx/personagem/footstep_carpet_alt_01.ogg +0 -0
  784. package/assets/sfx/personagem/footstep_carpet_alt_02.ogg +0 -0
  785. package/assets/sfx/personagem/footstep_carpet_alt_03.ogg +0 -0
  786. package/assets/sfx/personagem/footstep_carpet_alt_04.ogg +0 -0
  787. package/assets/sfx/personagem/footstep_carpet_alt_05.ogg +0 -0
  788. package/assets/sfx/personagem/footstep_concrete_alt_01.ogg +0 -0
  789. package/assets/sfx/personagem/footstep_concrete_alt_02.ogg +0 -0
  790. package/assets/sfx/personagem/footstep_concrete_alt_03.ogg +0 -0
  791. package/assets/sfx/personagem/footstep_concrete_alt_04.ogg +0 -0
  792. package/assets/sfx/personagem/footstep_concrete_alt_05.ogg +0 -0
  793. package/assets/sfx/personagem/footstep_concrete_run_01.ogg +0 -0
  794. package/assets/sfx/personagem/footstep_concrete_run_02.ogg +0 -0
  795. package/assets/sfx/personagem/footstep_concrete_run_03.ogg +0 -0
  796. package/assets/sfx/personagem/footstep_concrete_run_04.ogg +0 -0
  797. package/assets/sfx/personagem/footstep_concrete_run_05.ogg +0 -0
  798. package/assets/sfx/personagem/footstep_concrete_walk_01.ogg +0 -0
  799. package/assets/sfx/personagem/footstep_concrete_walk_02.ogg +0 -0
  800. package/assets/sfx/personagem/footstep_concrete_walk_03.ogg +0 -0
  801. package/assets/sfx/personagem/footstep_concrete_walk_04.ogg +0 -0
  802. package/assets/sfx/personagem/footstep_concrete_walk_05.ogg +0 -0
  803. package/assets/sfx/personagem/footstep_dirt_run_01.ogg +0 -0
  804. package/assets/sfx/personagem/footstep_dirt_run_02.ogg +0 -0
  805. package/assets/sfx/personagem/footstep_dirt_run_03.ogg +0 -0
  806. package/assets/sfx/personagem/footstep_dirt_run_04.ogg +0 -0
  807. package/assets/sfx/personagem/footstep_dirt_run_05.ogg +0 -0
  808. package/assets/sfx/personagem/footstep_dirt_walk_01.ogg +0 -0
  809. package/assets/sfx/personagem/footstep_dirt_walk_02.ogg +0 -0
  810. package/assets/sfx/personagem/footstep_dirt_walk_03.ogg +0 -0
  811. package/assets/sfx/personagem/footstep_dirt_walk_04.ogg +0 -0
  812. package/assets/sfx/personagem/footstep_dirt_walk_05.ogg +0 -0
  813. package/assets/sfx/personagem/footstep_generic_alt_01.ogg +0 -0
  814. package/assets/sfx/personagem/footstep_generic_alt_02.ogg +0 -0
  815. package/assets/sfx/personagem/footstep_generic_alt_03.ogg +0 -0
  816. package/assets/sfx/personagem/footstep_generic_alt_04.ogg +0 -0
  817. package/assets/sfx/personagem/footstep_generic_alt_05.ogg +0 -0
  818. package/assets/sfx/personagem/footstep_generic_alt_06.ogg +0 -0
  819. package/assets/sfx/personagem/footstep_generic_alt_07.ogg +0 -0
  820. package/assets/sfx/personagem/footstep_generic_alt_08.ogg +0 -0
  821. package/assets/sfx/personagem/footstep_generic_alt_09.ogg +0 -0
  822. package/assets/sfx/personagem/footstep_generic_alt_10.ogg +0 -0
  823. package/assets/sfx/personagem/footstep_grass_alt2_01.ogg +0 -0
  824. package/assets/sfx/personagem/footstep_grass_alt2_02.ogg +0 -0
  825. package/assets/sfx/personagem/footstep_grass_alt2_03.ogg +0 -0
  826. package/assets/sfx/personagem/footstep_grass_alt2_04.ogg +0 -0
  827. package/assets/sfx/personagem/footstep_grass_alt_01.ogg +0 -0
  828. package/assets/sfx/personagem/footstep_grass_alt_02.ogg +0 -0
  829. package/assets/sfx/personagem/footstep_grass_alt_03.ogg +0 -0
  830. package/assets/sfx/personagem/footstep_grass_alt_04.ogg +0 -0
  831. package/assets/sfx/personagem/footstep_grass_alt_05.ogg +0 -0
  832. package/assets/sfx/personagem/footstep_grass_run_01.ogg +0 -0
  833. package/assets/sfx/personagem/footstep_grass_run_02.ogg +0 -0
  834. package/assets/sfx/personagem/footstep_grass_run_03.ogg +0 -0
  835. package/assets/sfx/personagem/footstep_grass_run_04.ogg +0 -0
  836. package/assets/sfx/personagem/footstep_grass_run_05.ogg +0 -0
  837. package/assets/sfx/personagem/footstep_grass_walk_01.ogg +0 -0
  838. package/assets/sfx/personagem/footstep_grass_walk_02.ogg +0 -0
  839. package/assets/sfx/personagem/footstep_grass_walk_03.ogg +0 -0
  840. package/assets/sfx/personagem/footstep_grass_walk_04.ogg +0 -0
  841. package/assets/sfx/personagem/footstep_grass_walk_05.ogg +0 -0
  842. package/assets/sfx/personagem/footstep_hard_alt_01.ogg +0 -0
  843. package/assets/sfx/personagem/footstep_hard_alt_02.ogg +0 -0
  844. package/assets/sfx/personagem/footstep_hard_alt_03.ogg +0 -0
  845. package/assets/sfx/personagem/footstep_hard_alt_04.ogg +0 -0
  846. package/assets/sfx/personagem/footstep_hard_alt_05.ogg +0 -0
  847. package/assets/sfx/personagem/footstep_hard_alt_06.ogg +0 -0
  848. package/assets/sfx/personagem/footstep_hard_alt_07.ogg +0 -0
  849. package/assets/sfx/personagem/footstep_hard_alt_08.ogg +0 -0
  850. package/assets/sfx/personagem/footstep_hard_alt_09.ogg +0 -0
  851. package/assets/sfx/personagem/footstep_metal_run_01.ogg +0 -0
  852. package/assets/sfx/personagem/footstep_metal_run_02.ogg +0 -0
  853. package/assets/sfx/personagem/footstep_metal_run_03.ogg +0 -0
  854. package/assets/sfx/personagem/footstep_metal_run_04.ogg +0 -0
  855. package/assets/sfx/personagem/footstep_metal_run_05.ogg +0 -0
  856. package/assets/sfx/personagem/footstep_metal_walk_01.ogg +0 -0
  857. package/assets/sfx/personagem/footstep_metal_walk_02.ogg +0 -0
  858. package/assets/sfx/personagem/footstep_metal_walk_03.ogg +0 -0
  859. package/assets/sfx/personagem/footstep_metal_walk_04.ogg +0 -0
  860. package/assets/sfx/personagem/footstep_metal_walk_05.ogg +0 -0
  861. package/assets/sfx/personagem/footstep_snow_alt_01.ogg +0 -0
  862. package/assets/sfx/personagem/footstep_snow_alt_02.ogg +0 -0
  863. package/assets/sfx/personagem/footstep_snow_alt_03.ogg +0 -0
  864. package/assets/sfx/personagem/footstep_snow_alt_04.ogg +0 -0
  865. package/assets/sfx/personagem/footstep_snow_alt_05.ogg +0 -0
  866. package/assets/sfx/personagem/footstep_snow_run_01.ogg +0 -0
  867. package/assets/sfx/personagem/footstep_snow_run_02.ogg +0 -0
  868. package/assets/sfx/personagem/footstep_snow_run_03.ogg +0 -0
  869. package/assets/sfx/personagem/footstep_snow_run_04.ogg +0 -0
  870. package/assets/sfx/personagem/footstep_snow_run_05.ogg +0 -0
  871. package/assets/sfx/personagem/footstep_snow_walk_01.ogg +0 -0
  872. package/assets/sfx/personagem/footstep_snow_walk_02.ogg +0 -0
  873. package/assets/sfx/personagem/footstep_snow_walk_03.ogg +0 -0
  874. package/assets/sfx/personagem/footstep_snow_walk_04.ogg +0 -0
  875. package/assets/sfx/personagem/footstep_snow_walk_05.ogg +0 -0
  876. package/assets/sfx/personagem/footstep_wood_alt_01.ogg +0 -0
  877. package/assets/sfx/personagem/footstep_wood_alt_02.ogg +0 -0
  878. package/assets/sfx/personagem/footstep_wood_alt_03.ogg +0 -0
  879. package/assets/sfx/personagem/footstep_wood_alt_04.ogg +0 -0
  880. package/assets/sfx/personagem/footstep_wood_alt_05.ogg +0 -0
  881. package/assets/sfx/personagem/footstep_wood_run_01.ogg +0 -0
  882. package/assets/sfx/personagem/footstep_wood_run_02.ogg +0 -0
  883. package/assets/sfx/personagem/footstep_wood_run_03.ogg +0 -0
  884. package/assets/sfx/personagem/footstep_wood_run_04.ogg +0 -0
  885. package/assets/sfx/personagem/footstep_wood_run_05.ogg +0 -0
  886. package/assets/sfx/personagem/footstep_wood_walk_01.ogg +0 -0
  887. package/assets/sfx/personagem/footstep_wood_walk_02.ogg +0 -0
  888. package/assets/sfx/personagem/footstep_wood_walk_03.ogg +0 -0
  889. package/assets/sfx/personagem/footstep_wood_walk_04.ogg +0 -0
  890. package/assets/sfx/personagem/footstep_wood_walk_05.ogg +0 -0
  891. package/assets/sfx/personagem/frying_pan_hit_01.ogg +0 -0
  892. package/assets/sfx/personagem/frying_pan_hit_02.ogg +0 -0
  893. package/assets/sfx/personagem/frying_pan_hit_03.ogg +0 -0
  894. package/assets/sfx/personagem/grab_01.ogg +0 -0
  895. package/assets/sfx/personagem/kick_hit_01.ogg +0 -0
  896. package/assets/sfx/personagem/kick_hit_02.ogg +0 -0
  897. package/assets/sfx/personagem/kick_hit_03.ogg +0 -0
  898. package/assets/sfx/personagem/kick_hit_04.ogg +0 -0
  899. package/assets/sfx/personagem/kick_hit_05.ogg +0 -0
  900. package/assets/sfx/personagem/knife_draw_01.ogg +0 -0
  901. package/assets/sfx/personagem/knife_draw_02.ogg +0 -0
  902. package/assets/sfx/personagem/knife_draw_03.ogg +0 -0
  903. package/assets/sfx/personagem/knife_scrape_01.ogg +0 -0
  904. package/assets/sfx/personagem/knife_slash_01.ogg +0 -0
  905. package/assets/sfx/personagem/knife_slash_02.ogg +0 -0
  906. package/assets/sfx/personagem/land_concrete_01.ogg +0 -0
  907. package/assets/sfx/personagem/land_concrete_02.ogg +0 -0
  908. package/assets/sfx/personagem/land_dirt_01.ogg +0 -0
  909. package/assets/sfx/personagem/land_dirt_02.ogg +0 -0
  910. package/assets/sfx/personagem/land_grass_01.ogg +0 -0
  911. package/assets/sfx/personagem/land_grass_02.ogg +0 -0
  912. package/assets/sfx/personagem/land_metal_01.ogg +0 -0
  913. package/assets/sfx/personagem/land_metal_02.ogg +0 -0
  914. package/assets/sfx/personagem/land_snow_01.ogg +0 -0
  915. package/assets/sfx/personagem/land_snow_02.ogg +0 -0
  916. package/assets/sfx/personagem/land_wood_01.ogg +0 -0
  917. package/assets/sfx/personagem/land_wood_02.ogg +0 -0
  918. package/assets/sfx/personagem/player_breath_run_01.ogg +0 -0
  919. package/assets/sfx/personagem/player_breath_run_02.ogg +0 -0
  920. package/assets/sfx/personagem/player_breath_run_03.ogg +0 -0
  921. package/assets/sfx/personagem/player_breath_run_04.ogg +0 -0
  922. package/assets/sfx/personagem/player_breath_run_05.ogg +0 -0
  923. package/assets/sfx/personagem/player_death_female_01.ogg +0 -0
  924. package/assets/sfx/personagem/player_death_female_02.ogg +0 -0
  925. package/assets/sfx/personagem/player_death_female_03.ogg +0 -0
  926. package/assets/sfx/personagem/player_death_female_04.ogg +0 -0
  927. package/assets/sfx/personagem/player_death_female_05.ogg +0 -0
  928. package/assets/sfx/personagem/player_death_female_06.ogg +0 -0
  929. package/assets/sfx/personagem/player_death_female_07.ogg +0 -0
  930. package/assets/sfx/personagem/player_death_female_08.ogg +0 -0
  931. package/assets/sfx/personagem/player_death_male_01.ogg +0 -0
  932. package/assets/sfx/personagem/player_death_male_02.ogg +0 -0
  933. package/assets/sfx/personagem/player_death_male_03.ogg +0 -0
  934. package/assets/sfx/personagem/player_death_male_04.ogg +0 -0
  935. package/assets/sfx/personagem/player_death_male_05.ogg +0 -0
  936. package/assets/sfx/personagem/player_death_male_06.ogg +0 -0
  937. package/assets/sfx/personagem/player_death_male_07.ogg +0 -0
  938. package/assets/sfx/personagem/player_death_male_08.ogg +0 -0
  939. package/assets/sfx/personagem/player_effort_01.ogg +0 -0
  940. package/assets/sfx/personagem/player_effort_02.ogg +0 -0
  941. package/assets/sfx/personagem/player_effort_03.ogg +0 -0
  942. package/assets/sfx/personagem/player_effort_04.ogg +0 -0
  943. package/assets/sfx/personagem/player_hurt_female_01.ogg +0 -0
  944. package/assets/sfx/personagem/player_hurt_female_02.ogg +0 -0
  945. package/assets/sfx/personagem/player_hurt_female_03.ogg +0 -0
  946. package/assets/sfx/personagem/player_hurt_female_04.ogg +0 -0
  947. package/assets/sfx/personagem/player_hurt_female_05.ogg +0 -0
  948. package/assets/sfx/personagem/player_hurt_female_06.ogg +0 -0
  949. package/assets/sfx/personagem/player_hurt_male_01.ogg +0 -0
  950. package/assets/sfx/personagem/player_hurt_male_02.ogg +0 -0
  951. package/assets/sfx/personagem/player_hurt_male_03.ogg +0 -0
  952. package/assets/sfx/personagem/player_hurt_male_04.ogg +0 -0
  953. package/assets/sfx/personagem/player_hurt_male_05.ogg +0 -0
  954. package/assets/sfx/personagem/player_hurt_male_06.ogg +0 -0
  955. package/assets/sfx/personagem/punch_hit_alt_01.ogg +0 -0
  956. package/assets/sfx/personagem/punch_hit_alt_02.ogg +0 -0
  957. package/assets/sfx/personagem/punch_hit_alt_03.ogg +0 -0
  958. package/assets/sfx/personagem/punch_hit_alt_04.ogg +0 -0
  959. package/assets/sfx/personagem/punch_hit_alt_05.ogg +0 -0
  960. package/assets/sfx/personagem/punch_hit_alt_06.ogg +0 -0
  961. package/assets/sfx/personagem/punch_hit_alt_07.ogg +0 -0
  962. package/assets/sfx/personagem/punch_hit_alt_08.ogg +0 -0
  963. package/assets/sfx/personagem/punch_hit_alt_09.ogg +0 -0
  964. package/assets/sfx/personagem/punch_hit_alt_10.ogg +0 -0
  965. package/assets/sfx/personagem/punch_hit_body_01.ogg +0 -0
  966. package/assets/sfx/personagem/punch_hit_body_02.ogg +0 -0
  967. package/assets/sfx/personagem/punch_hit_body_03.ogg +0 -0
  968. package/assets/sfx/personagem/punch_hit_body_04.ogg +0 -0
  969. package/assets/sfx/personagem/punch_hit_body_05.ogg +0 -0
  970. package/assets/sfx/personagem/punch_hit_body_06.ogg +0 -0
  971. package/assets/sfx/personagem/punch_hit_face_01.ogg +0 -0
  972. package/assets/sfx/personagem/punch_hit_face_02.ogg +0 -0
  973. package/assets/sfx/personagem/punch_hit_face_03.ogg +0 -0
  974. package/assets/sfx/personagem/punch_hit_face_04.ogg +0 -0
  975. package/assets/sfx/personagem/punch_hit_face_05.ogg +0 -0
  976. package/assets/sfx/personagem/punch_swing_01.ogg +0 -0
  977. package/assets/sfx/personagem/punch_swing_02.ogg +0 -0
  978. package/assets/sfx/personagem/punch_swing_03.ogg +0 -0
  979. package/assets/sfx/personagem/punch_swing_04.ogg +0 -0
  980. package/assets/sfx/personagem/punch_swing_05.ogg +0 -0
  981. package/assets/sfx/personagem/punch_swing_06.ogg +0 -0
  982. package/assets/sfx/personagem/punch_swing_07.ogg +0 -0
  983. package/assets/sfx/personagem/punch_swing_08.ogg +0 -0
  984. package/assets/sfx/personagem/scream_01.ogg +0 -0
  985. package/assets/sfx/personagem/scream_02.ogg +0 -0
  986. package/assets/sfx/personagem/scream_03.ogg +0 -0
  987. package/assets/sfx/personagem/scream_04.ogg +0 -0
  988. package/assets/sfx/personagem/slap_01.ogg +0 -0
  989. package/assets/sfx/personagem/swing_whoosh_alt_01.ogg +0 -0
  990. package/assets/sfx/personagem/swing_whoosh_alt_02.ogg +0 -0
  991. package/assets/sfx/personagem/swing_whoosh_alt_03.ogg +0 -0
  992. package/assets/sfx/personagem/swing_whoosh_alt_04.ogg +0 -0
  993. package/assets/sfx/personagem/swing_whoosh_alt_05.ogg +0 -0
  994. package/assets/sfx/personagem/swing_whoosh_alt_06.ogg +0 -0
  995. package/assets/sfx/personagem/swing_whoosh_alt_07.ogg +0 -0
  996. package/assets/sfx/personagem/swing_whoosh_alt_08.ogg +0 -0
  997. package/assets/sfx/personagem/swing_whoosh_alt_09.ogg +0 -0
  998. package/assets/sfx/personagem/swing_whoosh_alt_10.ogg +0 -0
  999. package/assets/sfx/personagem/swing_whoosh_alt_11.ogg +0 -0
  1000. package/assets/sfx/personagem/swing_whoosh_alt_12.ogg +0 -0
  1001. package/assets/sfx/personagem/swing_whoosh_alt_13.ogg +0 -0
  1002. package/assets/sfx/personagem/swing_whoosh_alt_14.ogg +0 -0
  1003. package/assets/sfx/personagem/swing_whoosh_alt_15.ogg +0 -0
  1004. package/assets/sfx/personagem/swing_whoosh_alt_16.ogg +0 -0
  1005. package/assets/sfx/personagem/swing_whoosh_alt_17.ogg +0 -0
  1006. package/assets/sfx/personagem/swing_whoosh_alt_18.ogg +0 -0
  1007. package/assets/sfx/personagem/swing_whoosh_alt_19.ogg +0 -0
  1008. package/assets/sfx/personagem/swing_whoosh_alt_20.ogg +0 -0
  1009. package/assets/sfx/personagem/swing_whoosh_alt_21.ogg +0 -0
  1010. package/assets/sfx/personagem/swing_whoosh_alt_22.ogg +0 -0
  1011. package/assets/sfx/personagem/swing_whoosh_alt_23.ogg +0 -0
  1012. package/assets/sfx/personagem/swing_whoosh_alt_24.ogg +0 -0
  1013. package/assets/sfx/personagem/swing_whoosh_alt_25.ogg +0 -0
  1014. package/assets/sfx/personagem/swing_whoosh_alt_26.ogg +0 -0
  1015. package/assets/sfx/personagem/swing_whoosh_alt_27.ogg +0 -0
  1016. package/assets/sfx/personagem/swing_whoosh_alt_28.ogg +0 -0
  1017. package/assets/sfx/personagem/swing_whoosh_alt_29.ogg +0 -0
  1018. package/assets/sfx/personagem/swing_whoosh_alt_30.ogg +0 -0
  1019. package/assets/sfx/personagem/swing_whoosh_alt_31.ogg +0 -0
  1020. package/assets/sfx/personagem/swing_whoosh_alt_32.ogg +0 -0
  1021. package/assets/sfx/personagem/swing_whoosh_alt_33.ogg +0 -0
  1022. package/assets/sfx/personagem/swing_whoosh_alt_34.ogg +0 -0
  1023. package/assets/sfx/personagem/swing_whoosh_alt_35.ogg +0 -0
  1024. package/assets/sfx/personagem/swing_whoosh_alt_36.ogg +0 -0
  1025. package/assets/sfx/personagem/swing_whoosh_alt_37.ogg +0 -0
  1026. package/assets/sfx/personagem/swing_whoosh_alt_38.ogg +0 -0
  1027. package/assets/sfx/personagem/swing_whoosh_alt_39.ogg +0 -0
  1028. package/assets/sfx/personagem/swing_whoosh_alt_40.ogg +0 -0
  1029. package/assets/sfx/personagem/swing_whoosh_alt_41.ogg +0 -0
  1030. package/assets/sfx/personagem/swing_whoosh_alt_42.ogg +0 -0
  1031. package/assets/sfx/personagem/swing_whoosh_alt_43.ogg +0 -0
  1032. package/assets/sfx/personagem/zombie_creature_01.ogg +0 -0
  1033. package/assets/sfx/personagem/zombie_creature_02.ogg +0 -0
  1034. package/assets/sfx/personagem/zombie_creature_03.ogg +0 -0
  1035. package/assets/sfx/personagem/zombie_death_01.ogg +0 -0
  1036. package/assets/sfx/personagem/zombie_death_02.ogg +0 -0
  1037. package/assets/sfx/personagem/zombie_death_03.ogg +0 -0
  1038. package/assets/sfx/personagem/zombie_death_04.ogg +0 -0
  1039. package/assets/sfx/personagem/zombie_death_05.ogg +0 -0
  1040. package/assets/sfx/personagem/zombie_death_06.ogg +0 -0
  1041. package/assets/sfx/personagem/zombie_death_07.ogg +0 -0
  1042. package/assets/sfx/personagem/zombie_death_08.ogg +0 -0
  1043. package/assets/sfx/personagem/zombie_groan_01.ogg +0 -0
  1044. package/assets/sfx/personagem/zombie_groan_02.ogg +0 -0
  1045. package/assets/sfx/personagem/zombie_groan_03.ogg +0 -0
  1046. package/assets/sfx/personagem/zombie_groan_04.ogg +0 -0
  1047. package/assets/sfx/personagem/zombie_groan_05.ogg +0 -0
  1048. package/assets/sfx/personagem/zombie_groan_06.ogg +0 -0
  1049. package/assets/sfx/personagem/zombie_groan_07.ogg +0 -0
  1050. package/assets/sfx/personagem/zombie_groan_08.ogg +0 -0
  1051. package/assets/sfx/personagem/zombie_groan_09.ogg +0 -0
  1052. package/assets/sfx/personagem/zombie_groan_10.ogg +0 -0
  1053. package/assets/sfx/personagem/zombie_groan_11.ogg +0 -0
  1054. package/assets/sfx/veiculos/car_door_open_01.ogg +0 -0
  1055. package/assets/sfx/veiculos/car_door_shut_01.ogg +0 -0
  1056. package/assets/sfx/veiculos/car_gear_shift_01.ogg +0 -0
  1057. package/assets/sfx/veiculos/car_trunk_shut_01.ogg +0 -0
  1058. package/assets/sfx/veiculos/car_window_01.ogg +0 -0
  1059. package/assets/sfx/veiculos/car_window_02.ogg +0 -0
  1060. package/assets/sfx/veiculos/engine_loop_car_high_01.ogg +0 -0
  1061. package/assets/sfx/veiculos/engine_loop_car_idle_01.ogg +0 -0
  1062. package/assets/sfx/veiculos/engine_start_run_stop_01.ogg +0 -0
  1063. package/assets/sfx/veiculos/engine_start_run_stop_02.ogg +0 -0
  1064. package/dist/chunk-KBTUANNG.js.map +0 -1
@@ -4,6 +4,7 @@ var GameAudio = (() => {
4
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
7
8
  var __export = (target, all) => {
8
9
  for (var name in all)
9
10
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -17,6 +18,7 @@ var GameAudio = (() => {
17
18
  return to;
18
19
  };
19
20
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
20
22
 
21
23
  // src/index.ts
22
24
  var index_exports = {};
@@ -64,13 +66,19 @@ var GameAudio = (() => {
64
66
  LIBRARY_BANK: () => LIBRARY_BANK,
65
67
  LIBRARY_LOOPS: () => LIBRARY_LOOPS,
66
68
  LIBRARY_SOUNDS: () => LIBRARY_SOUNDS,
69
+ LOCAL_PACK_BANK_ID: () => LOCAL_PACK_BANK_ID,
70
+ LOCAL_PACK_LICENSES: () => LOCAL_PACK_LICENSES,
71
+ LOCAL_PACK_PREFERENCES: () => LOCAL_PACK_PREFERENCES,
67
72
  LOOP_SMOOTHING: () => LOOP_SMOOTHING,
68
73
  LOOP_START_ABOVE: () => LOOP_START_ABOVE,
74
+ LocalSoundPackError: () => LocalSoundPackError,
69
75
  MIX_PROFILES: () => MIX_PROFILES,
70
76
  OPEN_CUTOFF: () => OPEN_CUTOFF,
71
77
  PAN_LIMIT: () => PAN_LIMIT,
72
78
  PAN_MIN_DISTANCE: () => PAN_MIN_DISTANCE,
73
79
  PICKUP_CLASSES: () => PICKUP_CLASSES,
80
+ RADIO_BANK: () => RADIO_BANK,
81
+ RADIO_TRACKS: () => RADIO_TRACKS,
74
82
  SAMPLE_ENVIRONMENTS: () => SAMPLE_ENVIRONMENTS,
75
83
  SDK_LICENSES: () => SDK_LICENSES,
76
84
  SFX_BLOWS: () => SFX_BLOWS,
@@ -80,9 +88,12 @@ var GameAudio = (() => {
80
88
  SFX_LAYERS: () => SFX_LAYERS,
81
89
  SFX_MATERIALS: () => SFX_MATERIALS,
82
90
  SFX_TIERS: () => SFX_TIERS,
91
+ TRIM_FADE: () => TRIM_FADE,
83
92
  USER_SAMPLES_BANK: () => USER_SAMPLES_BANK,
84
93
  USER_SOUND_PREFIX: () => USER_SOUND_PREFIX,
85
94
  VOICE_GROUPS: () => VOICE_GROUPS,
95
+ aliasSample: () => aliasSample,
96
+ applyLocalSoundPack: () => applyLocalSoundPack,
86
97
  audioBenchTextOf: () => audioBenchTextOf,
87
98
  balanceOf: () => balanceOf,
88
99
  bufferOf: () => bufferOf,
@@ -104,6 +115,7 @@ var GameAudio = (() => {
104
115
  crossGains: () => crossGains,
105
116
  cutoffDivisor: () => cutoffDivisor,
106
117
  dbOf: () => dbOf,
118
+ defaultIdleScheduler: () => defaultIdleScheduler,
107
119
  drawBetween: () => drawBetween,
108
120
  encodeWav: () => encodeWav,
109
121
  endDropDb: () => endDropDb,
@@ -117,6 +129,7 @@ var GameAudio = (() => {
117
129
  impactSoundId: () => impactSoundId,
118
130
  inlineLoader: () => inlineLoader,
119
131
  isCalibrationUrl: () => isCalibrationUrl,
132
+ isShippableLicense: () => isShippableLicense,
120
133
  isSilent: () => isSilent,
121
134
  kitSampleBank: () => kitSampleBank,
122
135
  kitSampleDefaults: () => kitSampleDefaults,
@@ -124,17 +137,21 @@ var GameAudio = (() => {
124
137
  listenerDistance: () => listenerDistance,
125
138
  loadKitSamples: () => loadKitSamples,
126
139
  loadUserSamples: () => loadUserSamples,
140
+ localPackSamples: () => localPackSamples,
127
141
  loopCrossfade: () => loopCrossfade,
142
+ loopRate: () => loopRate,
128
143
  measureCriteria: () => measureCriteria,
129
144
  noiseClassRecipe: () => noiseClassRecipe,
130
145
  onsetIndex: () => onsetIndex,
131
146
  panFor: () => panFor,
147
+ parseLocalSoundPack: () => parseLocalSoundPack,
132
148
  parseSfxName: () => parseSfxName,
133
149
  peakIndex: () => peakIndex,
134
150
  peakOf: () => peakOf,
135
151
  pickTake: () => pickTake,
136
152
  planSample: () => planSample,
137
153
  planSound: () => planSound,
154
+ radioTrack: () => radioTrack,
138
155
  realize: () => realize,
139
156
  realizeSample: () => realizeSample,
140
157
  recordOutput: () => recordOutput,
@@ -420,16 +437,16 @@ var GameAudio = (() => {
420
437
  }
421
438
  return pending;
422
439
  }
423
- function drawLayer(layer, scope) {
440
+ function drawLayer(layer2, scope) {
424
441
  const pending = { at: 0, gain: 1, filters: [], modulators: [] };
425
- for (const key of Object.keys(layer)) {
426
- if (key === "at" && layer.at !== void 0) pending.at = draw(layer.at, scope);
427
- else if (key === "duration" && layer.duration !== void 0) pending.duration = draw(layer.duration, scope);
428
- else if (key === "gain" && layer.gain !== void 0) pending.gain = draw(layer.gain, scope);
429
- else if (key === "source" && layer.source.kind === "osc") pending.automation = drawAutomation(layer.source.frequency, scope);
430
- else if (key === "source" && layer.source.kind === "formant_voice") pending.voice = drawVoice(layer.source, scope);
431
- else if (key === "filters" && layer.filters) pending.filters = layer.filters.bank.map((spec) => drawFilter(spec, scope));
432
- else if (key === "modulators" && layer.modulators) pending.modulators = layer.modulators.map((modulator) => drawModulator(modulator, scope));
442
+ for (const key of Object.keys(layer2)) {
443
+ if (key === "at" && layer2.at !== void 0) pending.at = draw(layer2.at, scope);
444
+ else if (key === "duration" && layer2.duration !== void 0) pending.duration = draw(layer2.duration, scope);
445
+ else if (key === "gain" && layer2.gain !== void 0) pending.gain = draw(layer2.gain, scope);
446
+ else if (key === "source" && layer2.source.kind === "osc") pending.automation = drawAutomation(layer2.source.frequency, scope);
447
+ else if (key === "source" && layer2.source.kind === "formant_voice") pending.voice = drawVoice(layer2.source, scope);
448
+ else if (key === "filters" && layer2.filters) pending.filters = layer2.filters.bank.map((spec) => drawFilter(spec, scope));
449
+ else if (key === "modulators" && layer2.modulators) pending.modulators = layer2.modulators.map((modulator) => drawModulator(modulator, scope));
433
450
  }
434
451
  return pending;
435
452
  }
@@ -440,8 +457,8 @@ var GameAudio = (() => {
440
457
  if (source.offset === "fit") return scope.random() * Math.max(0, noiseSeconds - duration);
441
458
  return scope.random() * (source.offsetScale ?? 1);
442
459
  }
443
- function finishSource(layer, pending, duration, offset) {
444
- const source = layer.source;
460
+ function finishSource(layer2, pending, duration, offset) {
461
+ const source = layer2.source;
445
462
  if (source.kind === "noise") return { kind: "noise", offset, loop: source.loop === true };
446
463
  if (source.kind === "osc") return { kind: "osc", wave: source.wave, frequency: finishAutomation(pending.automation ?? {}, duration) };
447
464
  const voice2 = pending.voice;
@@ -463,23 +480,23 @@ var GameAudio = (() => {
463
480
  function finishEnvelope(envelope2, duration, level) {
464
481
  return envelope2.map(([time, value, curve, fixed2]) => ({ time: timeOf(time, duration), value: fixed2 === "fixed" ? value : value * level, curve }));
465
482
  }
466
- function planLayer(layer, scope, defaults, levelInEnvelope, soundLevel) {
467
- const pending = drawLayer(layer, scope);
483
+ function planLayer(layer2, scope, defaults, levelInEnvelope, soundLevel) {
484
+ const pending = drawLayer(layer2, scope);
468
485
  const duration = pending.duration ?? defaults.duration;
469
486
  if (duration === void 0) throw new Error("game-audio: a layer needs a duration (its own or the recipe\u2019s)");
470
- const offset = drawOffset(layer.source, duration, scope, defaults.noiseSeconds);
487
+ const offset = drawOffset(layer2.source, duration, scope, defaults.noiseSeconds);
471
488
  const level = pending.gain * soundLevel;
472
- const sourceFrequency = layer.source.kind === "noise" ? 0 : startFrequency(pending.automation ?? pending.voice?.frequency ?? {});
489
+ const sourceFrequency = layer2.source.kind === "noise" ? 0 : startFrequency(pending.automation ?? pending.voice?.frequency ?? {});
473
490
  const planned = {
474
491
  at: pending.at,
475
492
  duration,
476
- tail: layer.tail ?? defaults.tail ?? DEFAULT_TAIL,
493
+ tail: layer2.tail ?? defaults.tail ?? DEFAULT_TAIL,
477
494
  level,
478
- ...layer.wet === void 0 ? {} : { wet: layer.wet },
479
- source: finishSource(layer, pending, duration, offset),
480
- ...layer.filters ? {
495
+ ...layer2.wet === void 0 ? {} : { wet: layer2.wet },
496
+ source: finishSource(layer2, pending, duration, offset),
497
+ ...layer2.filters ? {
481
498
  filters: {
482
- mode: layer.filters.mode,
499
+ mode: layer2.filters.mode,
483
500
  bank: pending.filters.map(({ spec, frequency, q, gain, level: filterLevel }) => ({
484
501
  type: spec.type,
485
502
  frequency: finishAutomation(frequency, duration),
@@ -490,10 +507,10 @@ var GameAudio = (() => {
490
507
  }
491
508
  } : {},
492
509
  modulators: pending.modulators.map((modulator) => finishModulator(modulator, sourceFrequency)),
493
- envelope: finishEnvelope(layer.envelope, duration, levelInEnvelope ? level : 1)
510
+ envelope: finishEnvelope(layer2.envelope, duration, levelInEnvelope ? level : 1)
494
511
  };
495
- if (!layer.repeat) return [planned];
496
- return Array.from({ length: layer.repeat.count }, (_, index) => ({ ...planned, at: planned.at + index * (layer.repeat?.spacing ?? 0) }));
512
+ if (!layer2.repeat) return [planned];
513
+ return Array.from({ length: layer2.repeat.count }, (_, index) => ({ ...planned, at: planned.at + index * (layer2.repeat?.spacing ?? 0) }));
497
514
  }
498
515
  function scaleAutomation(automation, divisor) {
499
516
  const scale = (value) => value === void 0 ? void 0 : value / divisor;
@@ -501,12 +518,12 @@ var GameAudio = (() => {
501
518
  for (const key of ["value", "from", "to"]) if (automation[key] !== void 0) scaled[key] = scale(automation[key]);
502
519
  return scaled;
503
520
  }
504
- function muffle(layer, divisor) {
505
- if (divisor === 1 || !layer.filters) return layer;
506
- const bank = layer.filters.bank.map((filter) => filter.type === "lowpass" ? { ...filter, frequency: scaleAutomation(filter.frequency, divisor) } : filter);
507
- return { ...layer, filters: { ...layer.filters, bank } };
521
+ function muffle(layer2, divisor) {
522
+ if (divisor === 1 || !layer2.filters) return layer2;
523
+ const bank = layer2.filters.bank.map((filter) => filter.type === "lowpass" ? { ...filter, frequency: scaleAutomation(filter.frequency, divisor) } : filter);
524
+ return { ...layer2, filters: { ...layer2.filters, bank } };
508
525
  }
509
- var layerEnd = (layer) => layer.at + layer.duration + layer.tail;
526
+ var layerEnd = (layer2) => layer2.at + layer2.duration + layer2.tail;
510
527
  function planSound(recipe2, input = {}) {
511
528
  const listener = input.listener ?? DEFAULT_LISTENER;
512
529
  const distance = input.distance ?? (input.position ? listenerDistance(listener, input.position, input.distanceMode) : 0);
@@ -534,7 +551,7 @@ var GameAudio = (() => {
534
551
  noiseSeconds: input.noiseSeconds ?? DEFAULT_NOISE_SECONDS
535
552
  };
536
553
  const divisor = cutoffDivisor(recipe2.falloff, distance) / (1 - OCCLUSION_CUTOFF * occlusion);
537
- const layers = recipe2.layers.flatMap((layer) => planLayer(layer, scope, defaults, order !== "layered", level)).map((layer) => muffle(layer, divisor));
554
+ const layers = recipe2.layers.flatMap((layer2) => planLayer(layer2, scope, defaults, order !== "layered", level)).map((layer2) => muffle(layer2, divisor));
538
555
  return { ...base, silent: false, length: Math.max(0, ...layers.map(layerEnd)), layers };
539
556
  }
540
557
 
@@ -600,7 +617,16 @@ var GameAudio = (() => {
600
617
  const index = pickTake(refs.length, input.memory?.get(key), input.random);
601
618
  input.memory?.set(key, index);
602
619
  const ref = refs[index];
603
- layers.push({ role, url: ref.url, take: index, gain: gain * (ref.gain ?? 1) * level, rate, at });
620
+ layers.push({
621
+ role,
622
+ url: ref.url,
623
+ take: index,
624
+ gain: gain * (ref.gain ?? 1) * level,
625
+ rate,
626
+ at,
627
+ ...ref.offset === void 0 ? {} : { offset: ref.offset },
628
+ ...ref.duration === void 0 ? {} : { duration: ref.duration }
629
+ });
604
630
  };
605
631
  take("close", close, gains.close, 0);
606
632
  take("far", far, gains.far, 0);
@@ -747,12 +773,46 @@ var GameAudio = (() => {
747
773
  }
748
774
  return merged;
749
775
  }
776
+ var trimmed = (refs, alias) => refs.map((ref) => ({
777
+ ...ref,
778
+ ...alias.offset === void 0 ? {} : { offset: alias.offset },
779
+ ...alias.duration === void 0 ? {} : { duration: alias.duration }
780
+ }));
781
+ function aliasSample(alias, file) {
782
+ const { tiers: _tiers, fallback: _fallback, choke: _choke, ...rest } = file;
783
+ return {
784
+ ...rest,
785
+ id: alias.id,
786
+ close: trimmed(file.close, alias),
787
+ ...file.far ? { far: trimmed(file.far, alias) } : {},
788
+ ...alias.loop === void 0 ? {} : { loop: alias.loop },
789
+ ...alias.baseFrequency === void 0 ? {} : { baseFrequency: alias.baseFrequency },
790
+ ...alias.gain === void 0 ? {} : { gain: alias.gain },
791
+ ...alias.pitch === void 0 ? {} : { pitch: alias.pitch },
792
+ ...alias.falloff ? { falloff: alias.falloff } : {},
793
+ fallback: alias.id,
794
+ sources: [...file.sources, `alias: ${alias.id} \u2192 ${alias.file}`]
795
+ };
796
+ }
750
797
  function createSoundRegistry(banks = []) {
751
798
  const sounds = /* @__PURE__ */ new Map();
752
799
  const loops = /* @__PURE__ */ new Map();
753
800
  const sets = /* @__PURE__ */ new Map();
754
801
  const samples = /* @__PURE__ */ new Map();
755
802
  const owners = /* @__PURE__ */ new Map();
803
+ const aliases = /* @__PURE__ */ new Map();
804
+ const derived = /* @__PURE__ */ new Map();
805
+ const resolveAlias = (id) => {
806
+ const alias = aliases.get(id);
807
+ if (!alias) return void 0;
808
+ const cached = derived.get(id);
809
+ if (cached) return cached;
810
+ const file = samples.get(alias.file);
811
+ if (!file) return void 0;
812
+ const sample = aliasSample(alias, file);
813
+ derived.set(id, sample);
814
+ return sample;
815
+ };
756
816
  const registry = {
757
817
  register(bank) {
758
818
  for (const sound of bank.sounds ?? []) {
@@ -772,6 +832,11 @@ var GameAudio = (() => {
772
832
  samples.set(sample.id, sample);
773
833
  owners.set(sample.id, bank.id);
774
834
  }
835
+ for (const alias of bank.sampleAliases ?? []) {
836
+ aliases.set(alias.id, alias);
837
+ if (!owners.has(alias.id)) owners.set(alias.id, bank.id);
838
+ }
839
+ derived.clear();
775
840
  },
776
841
  patch(id, patch) {
777
842
  const sound = sounds.get(id);
@@ -780,22 +845,31 @@ var GameAudio = (() => {
780
845
  if (loop) loops.set(id, mergeRecords(loop, patch));
781
846
  const sample = samples.get(id);
782
847
  if (sample) samples.set(id, mergeRecords(sample, patch));
848
+ derived.clear();
783
849
  },
784
850
  remove(id) {
785
851
  sounds.delete(id);
786
852
  loops.delete(id);
787
853
  sets.delete(id);
788
854
  samples.delete(id);
855
+ aliases.delete(id);
789
856
  owners.delete(id);
857
+ derived.clear();
858
+ },
859
+ removeSample(id) {
860
+ samples.delete(id);
861
+ aliases.delete(id);
862
+ if (!sounds.has(id) && !loops.has(id) && !sets.has(id)) owners.delete(id);
863
+ derived.clear();
790
864
  },
791
865
  sound: (id) => sounds.get(id),
792
866
  loop: (id) => loops.get(id),
793
867
  set: (id) => sets.get(id),
794
- sample: (id) => samples.get(id),
868
+ sample: (id) => samples.get(id) ?? resolveAlias(id),
795
869
  soundIds: () => [...sounds.keys()],
796
870
  setIds: () => [...sets.keys()],
797
871
  loopIds: () => [...loops.keys()],
798
- sampleIds: () => [...samples.keys()],
872
+ sampleIds: () => [...samples.keys(), ...[...aliases.keys()].filter((id) => !samples.has(id) && resolveAlias(id) !== void 0)],
799
873
  bankOf: (id) => owners.get(id)
800
874
  };
801
875
  for (const bank of banks) registry.register(bank);
@@ -1223,6 +1297,8 @@ var GameAudio = (() => {
1223
1297
  var DEFAULT_LOOP_CROSSFADE = 0.25;
1224
1298
  var LOOKAHEAD = 1.5;
1225
1299
  var VOLUME_SMOOTHING = 0.05;
1300
+ var RATE_SMOOTHING = 0.04;
1301
+ var RATE_RANGE = [0.25, 4];
1226
1302
  function loopCrossfade(sound) {
1227
1303
  if (!sound.loop) return void 0;
1228
1304
  return sound.loop === true ? DEFAULT_LOOP_CROSSFADE : Math.max(0, sound.loop.crossfade ?? DEFAULT_LOOP_CROSSFADE);
@@ -1234,6 +1310,7 @@ var GameAudio = (() => {
1234
1310
  param.setValueAtTime(value(0), at);
1235
1311
  for (let step = 1; step <= CROSSFADE_STEPS; step++) param.linearRampToValueAtTime(value(step / CROSSFADE_STEPS), at + seconds * step / CROSSFADE_STEPS);
1236
1312
  };
1313
+ var loopRate = (sound, frequency) => sound.baseFrequency && sound.baseFrequency > 0 && frequency > 0 ? Math.max(RATE_RANGE[0], Math.min(RATE_RANGE[1], frequency / sound.baseFrequency)) : 1;
1237
1314
  function createSampleLoopHandle(sound, host, volume = 0) {
1238
1315
  const crossfade = loopCrossfade(sound) ?? DEFAULT_LOOP_CROSSFADE;
1239
1316
  let level = volume;
@@ -1243,13 +1320,17 @@ var GameAudio = (() => {
1243
1320
  let segments = [];
1244
1321
  let last;
1245
1322
  let timer;
1323
+ let panner;
1324
+ let rate = 1;
1325
+ let position;
1246
1326
  const entry = {
1247
1327
  get created() {
1248
1328
  return master !== void 0;
1249
1329
  },
1250
1330
  rewire() {
1251
- master?.disconnect();
1252
- master?.connect(host.output(sound.bus));
1331
+ const out = panner ?? master;
1332
+ out?.disconnect();
1333
+ out?.connect(host.output(sound.bus));
1253
1334
  },
1254
1335
  stop() {
1255
1336
  stopped = true;
@@ -1266,23 +1347,29 @@ var GameAudio = (() => {
1266
1347
  segments = [];
1267
1348
  master?.disconnect();
1268
1349
  master = void 0;
1350
+ panner?.disconnect();
1351
+ panner = void 0;
1269
1352
  fallback?.stop();
1270
1353
  fallback = void 0;
1271
1354
  host.unregister(entry);
1272
1355
  }
1273
1356
  };
1274
- const nextBuffer = () => {
1357
+ const nextTake = () => {
1275
1358
  const takes2 = sound.close;
1276
1359
  const take = pickTake(takes2.length, last, host.random);
1277
1360
  last = take;
1278
1361
  const ref = takes2[take];
1279
- return ref ? host.buffer(ref.url) : void 0;
1362
+ const buffer = ref ? host.buffer(ref.url) : void 0;
1363
+ return ref && buffer ? { buffer, ref } : void 0;
1280
1364
  };
1281
1365
  const schedule = (context, output, at, first) => {
1282
- const buffer = nextBuffer();
1283
- if (!buffer) return void 0;
1366
+ const next = nextTake();
1367
+ if (!next) return void 0;
1368
+ const { buffer, ref } = next;
1369
+ const offset = Math.max(0, Math.min(ref.offset ?? 0, buffer.duration));
1284
1370
  const source = context.createBufferSource();
1285
1371
  source.buffer = buffer;
1372
+ source.playbackRate.value = rate;
1286
1373
  const gain = context.createGain();
1287
1374
  source.connect(gain);
1288
1375
  gain.connect(output);
@@ -1290,15 +1377,15 @@ var GameAudio = (() => {
1290
1377
  if (buffer.duration < 2 * crossfade || sound.close.length === 1) {
1291
1378
  source.loop = true;
1292
1379
  if (!first) ramp2(gain.gain, "in", at, Math.max(1e-3, fade));
1293
- source.start(at);
1380
+ source.start(at, offset);
1294
1381
  segments.push({ source, gain, end: Number.POSITIVE_INFINITY });
1295
1382
  return void 0;
1296
1383
  }
1297
1384
  if (first) gain.gain.setValueAtTime(1, at);
1298
1385
  else ramp2(gain.gain, "in", at, fade);
1299
- const end3 = at + buffer.duration;
1386
+ const end3 = at + (buffer.duration - offset) / rate;
1300
1387
  ramp2(gain.gain, "out", end3 - fade, fade);
1301
- source.start(at);
1388
+ source.start(at, offset);
1302
1389
  source.stop(end3);
1303
1390
  segments.push({ source, gain, end: end3 });
1304
1391
  source.onended = () => {
@@ -1319,14 +1406,26 @@ var GameAudio = (() => {
1319
1406
  pump(context, output, next, false);
1320
1407
  }, wait);
1321
1408
  };
1322
- const fileLevel = () => level * (sound.gain ?? 1);
1409
+ const spatial = () => {
1410
+ if (!position || !host.listener) return 1;
1411
+ return falloffGain(sound.falloff ?? DEFAULT_SAMPLE_FALLOFF, 1, listenerDistance(host.listener(), position, host.distance));
1412
+ };
1413
+ const fileLevel = () => level * (sound.gain ?? 1) * spatial();
1414
+ const place = (context) => {
1415
+ if (panner && position && host.listener) panner.pan.setTargetAtTime(panFor(host.listener(), position), context.currentTime, VOLUME_SMOOTHING);
1416
+ };
1323
1417
  const startFiles = () => {
1324
1418
  if (stopped || master || !host.isReady(sound)) return master !== void 0;
1325
1419
  const context = host.ready();
1326
1420
  if (!context) return false;
1327
1421
  master = context.createGain();
1328
1422
  master.gain.setValueAtTime(fileLevel(), context.currentTime);
1329
- master.connect(host.output(sound.bus));
1423
+ if (sound.pan !== false && position && typeof context.createStereoPanner === "function") {
1424
+ panner = context.createStereoPanner();
1425
+ if (host.listener) panner.pan.value = panFor(host.listener(), position);
1426
+ master.connect(panner);
1427
+ panner.connect(host.output(sound.bus));
1428
+ } else master.connect(host.output(sound.bus));
1330
1429
  host.register(entry);
1331
1430
  pump(context, master, context.currentTime, true);
1332
1431
  if (fallback) {
@@ -1352,9 +1451,15 @@ var GameAudio = (() => {
1352
1451
  set(next) {
1353
1452
  if (stopped) return;
1354
1453
  if (next.volume !== void 0) level = host.muted(sound.bus) ? 0 : Math.max(0, next.volume);
1454
+ if (next.position) position = next.position;
1455
+ if (next.frequency !== void 0 && sound.baseFrequency) rate = loopRate(sound, next.frequency);
1355
1456
  if (level > 0) ensure();
1356
1457
  const context = host.ready();
1357
- if (master && context) master.gain.setTargetAtTime(fileLevel(), context.currentTime, VOLUME_SMOOTHING);
1458
+ if (master && context) {
1459
+ master.gain.setTargetAtTime(fileLevel(), context.currentTime, VOLUME_SMOOTHING);
1460
+ place(context);
1461
+ if (next.frequency !== void 0 && sound.baseFrequency) for (const segment of segments) segment.source.playbackRate.setTargetAtTime(rate, context.currentTime, RATE_SMOOTHING);
1462
+ }
1358
1463
  fallback?.set(next.volume === void 0 ? next : { ...next, volume: level });
1359
1464
  },
1360
1465
  stop: entry.stop
@@ -1516,9 +1621,9 @@ var GameAudio = (() => {
1516
1621
  }
1517
1622
 
1518
1623
  // src/webaudio/realize-game.ts
1519
- var end = (layer, start) => start + layer.duration + layer.tail;
1520
- var firstFilter = (layer) => layer.filters?.bank[0];
1521
- var offsetOf = (layer) => layer.source.kind === "noise" ? layer.source.offset : 0;
1624
+ var end = (layer2, start) => start + layer2.duration + layer2.tail;
1625
+ var firstFilter = (layer2) => layer2.filters?.bank[0];
1626
+ var offsetOf = (layer2) => layer2.source.kind === "noise" ? layer2.source.offset : 0;
1522
1627
  function setFilter(node, filter, time) {
1523
1628
  if (!filter) return;
1524
1629
  node.type = filter.type;
@@ -1527,28 +1632,28 @@ var GameAudio = (() => {
1527
1632
  }
1528
1633
  function realizeBurst(plan, target) {
1529
1634
  const { context } = target;
1530
- const layer = plan.layers[0];
1531
- const time = target.time + layer.at;
1635
+ const layer2 = plan.layers[0];
1636
+ const time = target.time + layer2.at;
1532
1637
  const gain = context.createGain();
1533
1638
  gain.connect(target.output);
1534
- const source = noiseSource(target, layer.source.kind === "noise" && layer.source.loop);
1639
+ const source = noiseSource(target, layer2.source.kind === "noise" && layer2.source.loop);
1535
1640
  const filter = context.createBiquadFilter();
1536
1641
  source.connect(filter);
1537
1642
  filter.connect(gain);
1538
- setFilter(filter, firstFilter(layer), time);
1539
- applyEnvelope(gain.gain, layer.envelope, time);
1540
- source.start(time, offsetOf(layer));
1541
- source.stop(end(layer, time));
1643
+ setFilter(filter, firstFilter(layer2), time);
1644
+ applyEnvelope(gain.gain, layer2.envelope, time);
1645
+ source.start(time, offsetOf(layer2));
1646
+ source.stop(end(layer2, time));
1542
1647
  return voiceOf([source]);
1543
1648
  }
1544
1649
  function realizeScream(plan, target) {
1545
1650
  const { context } = target;
1546
- const layer = plan.layers[0];
1547
- const time = target.time + layer.at;
1548
- const source = noiseSource(target, layer.source.kind === "noise" && layer.source.loop);
1651
+ const layer2 = plan.layers[0];
1652
+ const time = target.time + layer2.at;
1653
+ const source = noiseSource(target, layer2.source.kind === "noise" && layer2.source.loop);
1549
1654
  const gain = context.createGain();
1550
1655
  gain.connect(target.output);
1551
- for (const band of layer.filters?.bank ?? []) {
1656
+ for (const band of layer2.filters?.bank ?? []) {
1552
1657
  const filter = context.createBiquadFilter();
1553
1658
  filter.type = band.type;
1554
1659
  if (band.q !== void 0) filter.Q.value = band.q;
@@ -1561,7 +1666,7 @@ var GameAudio = (() => {
1561
1666
  level.connect(gain);
1562
1667
  }
1563
1668
  const sources = [source];
1564
- const lfos = layer.modulators.map((modulator) => {
1669
+ const lfos = layer2.modulators.map((modulator) => {
1565
1670
  const lfo = context.createOscillator();
1566
1671
  const depth = context.createGain();
1567
1672
  if (modulator.wave) lfo.type = modulator.wave;
@@ -1571,75 +1676,75 @@ var GameAudio = (() => {
1571
1676
  depth.connect(gain.gain);
1572
1677
  return lfo;
1573
1678
  });
1574
- applyEnvelope(gain.gain, layer.envelope, time);
1575
- source.start(time, offsetOf(layer));
1576
- source.stop(end(layer, time));
1679
+ applyEnvelope(gain.gain, layer2.envelope, time);
1680
+ source.start(time, offsetOf(layer2));
1681
+ source.stop(end(layer2, time));
1577
1682
  for (const lfo of lfos) {
1578
1683
  lfo.start(time);
1579
- lfo.stop(end(layer, time));
1684
+ lfo.stop(end(layer2, time));
1580
1685
  sources.push(lfo);
1581
1686
  }
1582
1687
  return voiceOf(sources);
1583
1688
  }
1584
1689
  function realizeGroan(plan, target) {
1585
1690
  const { context } = target;
1586
- const layer = plan.layers[0];
1587
- const time = target.time + layer.at;
1691
+ const layer2 = plan.layers[0];
1692
+ const time = target.time + layer2.at;
1588
1693
  const oscillator = context.createOscillator();
1589
1694
  const gain = context.createGain();
1590
1695
  const filter = context.createBiquadFilter();
1591
- const band = firstFilter(layer);
1592
- if (layer.source.kind === "osc") oscillator.type = layer.source.wave;
1696
+ const band = firstFilter(layer2);
1697
+ if (layer2.source.kind === "osc") oscillator.type = layer2.source.wave;
1593
1698
  if (band) {
1594
1699
  filter.type = band.type;
1595
1700
  if (band.q !== void 0) filter.Q.value = band.q;
1596
1701
  }
1597
- if (layer.source.kind === "osc") {
1598
- assign(oscillator.frequency, layer.source.frequency, time);
1599
- rampTo(oscillator.frequency, layer.source.frequency, time);
1702
+ if (layer2.source.kind === "osc") {
1703
+ assign(oscillator.frequency, layer2.source.frequency, time);
1704
+ rampTo(oscillator.frequency, layer2.source.frequency, time);
1600
1705
  }
1601
1706
  if (band) assign(filter.frequency, band.frequency, time);
1602
- applyEnvelope(gain.gain, layer.envelope, time);
1707
+ applyEnvelope(gain.gain, layer2.envelope, time);
1603
1708
  oscillator.connect(filter);
1604
1709
  filter.connect(gain);
1605
1710
  gain.connect(target.output);
1606
1711
  oscillator.start(time);
1607
- oscillator.stop(end(layer, time));
1712
+ oscillator.stop(end(layer2, time));
1608
1713
  return voiceOf([oscillator]);
1609
1714
  }
1610
1715
  function realizeBoom(plan, target) {
1611
1716
  const { context } = target;
1612
- const layer = plan.layers[0];
1613
- const time = target.time + layer.at;
1717
+ const layer2 = plan.layers[0];
1718
+ const time = target.time + layer2.at;
1614
1719
  const oscillator = context.createOscillator();
1615
1720
  const gain = context.createGain();
1616
- if (layer.source.kind === "osc") {
1617
- oscillator.type = layer.source.wave;
1618
- assign(oscillator.frequency, layer.source.frequency, time);
1619
- rampTo(oscillator.frequency, layer.source.frequency, time);
1721
+ if (layer2.source.kind === "osc") {
1722
+ oscillator.type = layer2.source.wave;
1723
+ assign(oscillator.frequency, layer2.source.frequency, time);
1724
+ rampTo(oscillator.frequency, layer2.source.frequency, time);
1620
1725
  }
1621
- applyEnvelope(gain.gain, layer.envelope, time);
1726
+ applyEnvelope(gain.gain, layer2.envelope, time);
1622
1727
  oscillator.connect(gain);
1623
1728
  gain.connect(target.output);
1624
1729
  oscillator.start(time);
1625
- oscillator.stop(end(layer, time));
1730
+ oscillator.stop(end(layer2, time));
1626
1731
  return voiceOf([oscillator]);
1627
1732
  }
1628
1733
  function realizeStatic(plan, target) {
1629
1734
  const { context } = target;
1630
- const layer = plan.layers[0];
1631
- const time = target.time + layer.at;
1735
+ const layer2 = plan.layers[0];
1736
+ const time = target.time + layer2.at;
1632
1737
  const gain = context.createGain();
1633
1738
  const source = context.createBufferSource();
1634
1739
  const filter = context.createBiquadFilter();
1635
1740
  source.buffer = target.noise();
1636
- setFilter(filter, firstFilter(layer), time);
1637
- applyEnvelope(gain.gain, layer.envelope, time);
1741
+ setFilter(filter, firstFilter(layer2), time);
1742
+ applyEnvelope(gain.gain, layer2.envelope, time);
1638
1743
  source.connect(filter);
1639
1744
  filter.connect(gain);
1640
1745
  gain.connect(target.output);
1641
- source.start(time, offsetOf(layer));
1642
- source.stop(end(layer, time));
1746
+ source.start(time, offsetOf(layer2));
1747
+ source.stop(end(layer2, time));
1643
1748
  return voiceOf([source]);
1644
1749
  }
1645
1750
  function realizeChord(plan, target) {
@@ -1651,14 +1756,14 @@ var GameAudio = (() => {
1651
1756
  const source = layers[index].source;
1652
1757
  if (source.kind === "osc") oscillators[index].type = source.wave;
1653
1758
  }
1654
- layers.forEach((layer, index) => {
1655
- if (layer.source.kind === "osc") assign(oscillators[index].frequency, layer.source.frequency, target.time + layer.at);
1759
+ layers.forEach((layer2, index) => {
1760
+ if (layer2.source.kind === "osc") assign(oscillators[index].frequency, layer2.source.frequency, target.time + layer2.at);
1656
1761
  });
1657
1762
  applyEnvelope(gain.gain, layers[0].envelope, target.time + layers[0].at);
1658
1763
  for (const oscillator of oscillators) oscillator.connect(gain);
1659
1764
  gain.connect(target.output);
1660
- layers.forEach((layer, index) => oscillators[index].start(target.time + layer.at));
1661
- layers.forEach((layer, index) => oscillators[index].stop(end(layer, target.time + layer.at)));
1765
+ layers.forEach((layer2, index) => oscillators[index].start(target.time + layer2.at));
1766
+ layers.forEach((layer2, index) => oscillators[index].stop(end(layer2, target.time + layer2.at)));
1662
1767
  return voiceOf(oscillators);
1663
1768
  }
1664
1769
  function realizeCalls(plan, target) {
@@ -1670,34 +1775,34 @@ var GameAudio = (() => {
1670
1775
  if (band) filter.type = band.type;
1671
1776
  filter.connect(gain);
1672
1777
  gain.connect(target.output);
1673
- const oscillators = plan.layers.map((layer) => {
1674
- const time = target.time + layer.at;
1778
+ const oscillators = plan.layers.map((layer2) => {
1779
+ const time = target.time + layer2.at;
1675
1780
  const oscillator = context.createOscillator();
1676
- if (layer.source.kind === "osc") {
1677
- oscillator.type = layer.source.wave;
1678
- assign(oscillator.frequency, layer.source.frequency, time);
1679
- rampTo(oscillator.frequency, layer.source.frequency, time);
1781
+ if (layer2.source.kind === "osc") {
1782
+ oscillator.type = layer2.source.wave;
1783
+ assign(oscillator.frequency, layer2.source.frequency, time);
1784
+ rampTo(oscillator.frequency, layer2.source.frequency, time);
1680
1785
  }
1681
1786
  if (band) {
1682
1787
  assign(filter.frequency, band.frequency, time);
1683
1788
  if (band.q !== void 0) filter.Q.value = band.q;
1684
1789
  }
1685
1790
  const envelope2 = context.createGain();
1686
- applyEnvelope(envelope2.gain, layer.envelope, time);
1791
+ applyEnvelope(envelope2.gain, layer2.envelope, time);
1687
1792
  oscillator.connect(envelope2);
1688
1793
  envelope2.connect(filter);
1689
1794
  oscillator.start(time);
1690
- oscillator.stop(end(layer, time));
1795
+ oscillator.stop(end(layer2, time));
1691
1796
  return oscillator;
1692
1797
  });
1693
1798
  return voiceOf(oscillators);
1694
1799
  }
1695
1800
 
1696
1801
  // src/webaudio/realize-layered.ts
1697
- var end2 = (layer, start) => start + layer.duration + layer.tail;
1698
- function outputStage2(plan, layer, target) {
1802
+ var end2 = (layer2, start) => start + layer2.duration + layer2.tail;
1803
+ function outputStage2(plan, layer2, target) {
1699
1804
  const { context } = target;
1700
- const level = gainNode(context, layer.level);
1805
+ const level = gainNode(context, layer2.level);
1701
1806
  let node = level;
1702
1807
  if (plan.pan !== void 0 && typeof context.createStereoPanner === "function") {
1703
1808
  const panner = context.createStereoPanner();
@@ -1706,54 +1811,54 @@ var GameAudio = (() => {
1706
1811
  node = panner;
1707
1812
  }
1708
1813
  node.connect(target.output);
1709
- if (layer.wet && target.wet) {
1710
- const send = gainNode(context, layer.wet);
1814
+ if (layer2.wet && target.wet) {
1815
+ const send = gainNode(context, layer2.wet);
1711
1816
  node.connect(send);
1712
1817
  send.connect(target.wet);
1713
1818
  }
1714
1819
  return level;
1715
1820
  }
1716
- function realizeNoiseLayer(plan, layer, target) {
1821
+ function realizeNoiseLayer(plan, layer2, target) {
1717
1822
  const { context } = target;
1718
- const time = target.time + layer.at;
1719
- const source = noiseSource(target, layer.source.kind === "noise" && layer.source.loop);
1720
- const filters = (layer.filters?.bank ?? []).map((filter) => {
1823
+ const time = target.time + layer2.at;
1824
+ const source = noiseSource(target, layer2.source.kind === "noise" && layer2.source.loop);
1825
+ const filters = (layer2.filters?.bank ?? []).map((filter) => {
1721
1826
  const node = filterNode(context, filter, time);
1722
1827
  rampTo(node.frequency, filter.frequency, time);
1723
1828
  return node;
1724
1829
  });
1725
1830
  const envelope2 = context.createGain();
1726
- applyEnvelope(envelope2.gain, layer.envelope, time);
1831
+ applyEnvelope(envelope2.gain, layer2.envelope, time);
1727
1832
  let tail = source;
1728
1833
  for (const filter of filters) tail = tail.connect(filter);
1729
1834
  tail.connect(envelope2);
1730
- envelope2.connect(outputStage2(plan, layer, target));
1731
- source.start(time, layer.source.kind === "noise" ? layer.source.offset : 0);
1732
- source.stop(end2(layer, time));
1835
+ envelope2.connect(outputStage2(plan, layer2, target));
1836
+ source.start(time, layer2.source.kind === "noise" ? layer2.source.offset : 0);
1837
+ source.stop(end2(layer2, time));
1733
1838
  return [source];
1734
1839
  }
1735
- function realizeToneLayer(plan, layer, target) {
1840
+ function realizeToneLayer(plan, layer2, target) {
1736
1841
  const { context } = target;
1737
- const time = target.time + layer.at;
1842
+ const time = target.time + layer2.at;
1738
1843
  const oscillator = context.createOscillator();
1739
- if (layer.source.kind === "osc") {
1740
- oscillator.type = layer.source.wave;
1741
- assign(oscillator.frequency, layer.source.frequency, time);
1742
- rampTo(oscillator.frequency, layer.source.frequency, time);
1844
+ if (layer2.source.kind === "osc") {
1845
+ oscillator.type = layer2.source.wave;
1846
+ assign(oscillator.frequency, layer2.source.frequency, time);
1847
+ rampTo(oscillator.frequency, layer2.source.frequency, time);
1743
1848
  }
1744
1849
  const envelope2 = context.createGain();
1745
- applyEnvelope(envelope2.gain, layer.envelope, time);
1850
+ applyEnvelope(envelope2.gain, layer2.envelope, time);
1746
1851
  oscillator.connect(envelope2);
1747
- envelope2.connect(outputStage2(plan, layer, target));
1852
+ envelope2.connect(outputStage2(plan, layer2, target));
1748
1853
  oscillator.start(time);
1749
- oscillator.stop(end2(layer, time));
1854
+ oscillator.stop(end2(layer2, time));
1750
1855
  return [oscillator];
1751
1856
  }
1752
- function realizeVoiceLayer(plan, layer, target) {
1753
- const source = layer.source;
1857
+ function realizeVoiceLayer(plan, layer2, target) {
1858
+ const source = layer2.source;
1754
1859
  if (source.kind !== "formant_voice") return [];
1755
1860
  const { context } = target;
1756
- const time = target.time + layer.at;
1861
+ const time = target.time + layer2.at;
1757
1862
  const oscillator = context.createOscillator();
1758
1863
  oscillator.type = source.wave;
1759
1864
  assign(oscillator.frequency, source.frequency, time);
@@ -1774,10 +1879,10 @@ var GameAudio = (() => {
1774
1879
  for (const formant of formants) formant.connect(mix);
1775
1880
  breathLevel.connect(mix);
1776
1881
  const envelope2 = context.createGain();
1777
- applyEnvelope(envelope2.gain, layer.envelope, time);
1882
+ applyEnvelope(envelope2.gain, layer2.envelope, time);
1778
1883
  mix.connect(envelope2);
1779
- envelope2.connect(outputStage2(plan, layer, target));
1780
- const stop = end2(layer, time);
1884
+ envelope2.connect(outputStage2(plan, layer2, target));
1885
+ const stop = end2(layer2, time);
1781
1886
  oscillator.start(time);
1782
1887
  vibrato.start(time);
1783
1888
  breath.start(time, source.breath.offset);
@@ -1787,24 +1892,24 @@ var GameAudio = (() => {
1787
1892
  return [oscillator, vibrato, breath];
1788
1893
  }
1789
1894
  function realizeLayered(plan, target) {
1790
- const sources = plan.layers.flatMap((layer) => {
1791
- if (layer.source.kind === "noise") return realizeNoiseLayer(plan, layer, target);
1792
- if (layer.source.kind === "osc") return realizeToneLayer(plan, layer, target);
1793
- return realizeVoiceLayer(plan, layer, target);
1895
+ const sources = plan.layers.flatMap((layer2) => {
1896
+ if (layer2.source.kind === "noise") return realizeNoiseLayer(plan, layer2, target);
1897
+ if (layer2.source.kind === "osc") return realizeToneLayer(plan, layer2, target);
1898
+ return realizeVoiceLayer(plan, layer2, target);
1794
1899
  });
1795
1900
  return voiceOf(sources);
1796
1901
  }
1797
1902
  function realizeSiren(plan, target) {
1798
1903
  const { context } = target;
1799
- const layer = plan.layers[0];
1800
- const time = target.time + layer.at;
1904
+ const layer2 = plan.layers[0];
1905
+ const time = target.time + layer2.at;
1801
1906
  const oscillator = context.createOscillator();
1802
- if (layer.source.kind === "osc") {
1803
- oscillator.type = layer.source.wave;
1804
- assign(oscillator.frequency, layer.source.frequency, time);
1805
- rampTo(oscillator.frequency, layer.source.frequency, time);
1907
+ if (layer2.source.kind === "osc") {
1908
+ oscillator.type = layer2.source.wave;
1909
+ assign(oscillator.frequency, layer2.source.frequency, time);
1910
+ rampTo(oscillator.frequency, layer2.source.frequency, time);
1806
1911
  }
1807
- const depths = layer.modulators.map((modulator) => {
1912
+ const depths = layer2.modulators.map((modulator) => {
1808
1913
  const lfo = context.createOscillator();
1809
1914
  if (modulator.wave) lfo.type = modulator.wave;
1810
1915
  lfo.frequency.value = modulator.rate;
@@ -1815,19 +1920,19 @@ var GameAudio = (() => {
1815
1920
  });
1816
1921
  const lfos = depths.map(({ lfo }) => lfo);
1817
1922
  const envelope2 = context.createGain();
1818
- applyEnvelope(envelope2.gain, layer.envelope, time);
1923
+ applyEnvelope(envelope2.gain, layer2.envelope, time);
1819
1924
  for (const { depth, target: modulated } of depths) if (modulated === "gain") depth.connect(envelope2.gain);
1820
- const filters = (layer.filters?.bank ?? []).map((filter) => filterNode(context, filter, time));
1925
+ const filters = (layer2.filters?.bank ?? []).map((filter) => filterNode(context, filter, time));
1821
1926
  let tail = oscillator;
1822
1927
  for (const filter of filters) tail = tail.connect(filter);
1823
1928
  tail.connect(envelope2);
1824
1929
  envelope2.connect(target.output);
1825
- if (layer.wet && target.wet) {
1826
- const send = gainNode(context, layer.wet);
1930
+ if (layer2.wet && target.wet) {
1931
+ const send = gainNode(context, layer2.wet);
1827
1932
  envelope2.connect(send);
1828
1933
  send.connect(target.wet);
1829
1934
  }
1830
- const stop = end2(layer, time);
1935
+ const stop = end2(layer2, time);
1831
1936
  oscillator.start(time);
1832
1937
  for (const lfo of lfos) lfo.start(time);
1833
1938
  oscillator.stop(stop);
@@ -1836,38 +1941,38 @@ var GameAudio = (() => {
1836
1941
  }
1837
1942
 
1838
1943
  // src/webaudio/realize-weapon.ts
1839
- function noiseLayer(layer, target, time) {
1944
+ function noiseLayer(layer2, target, time) {
1840
1945
  const { context } = target;
1841
- const source = noiseSource(target, layer.source.kind === "noise" && layer.source.loop);
1842
- const filters = (layer.filters?.bank ?? []).map((filter) => filterNode(context, filter, time));
1946
+ const source = noiseSource(target, layer2.source.kind === "noise" && layer2.source.loop);
1947
+ const filters = (layer2.filters?.bank ?? []).map((filter) => filterNode(context, filter, time));
1843
1948
  const envelope2 = context.createGain();
1844
- applyEnvelope(envelope2.gain, layer.envelope, time);
1949
+ applyEnvelope(envelope2.gain, layer2.envelope, time);
1845
1950
  let tail = source;
1846
1951
  for (const filter of filters) tail = tail.connect(filter);
1847
1952
  tail.connect(envelope2).connect(target.output);
1848
- source.start(time, layer.source.kind === "noise" ? layer.source.offset : 0);
1849
- source.stop(time + layer.duration + layer.tail);
1953
+ source.start(time, layer2.source.kind === "noise" ? layer2.source.offset : 0);
1954
+ source.stop(time + layer2.duration + layer2.tail);
1850
1955
  return source;
1851
1956
  }
1852
- function toneLayer(layer, target, time) {
1957
+ function toneLayer(layer2, target, time) {
1853
1958
  const { context } = target;
1854
1959
  const oscillator = context.createOscillator();
1855
- if (layer.source.kind === "osc") {
1856
- oscillator.type = layer.source.wave;
1857
- assign(oscillator.frequency, layer.source.frequency, time);
1858
- rampTo(oscillator.frequency, layer.source.frequency, time);
1960
+ if (layer2.source.kind === "osc") {
1961
+ oscillator.type = layer2.source.wave;
1962
+ assign(oscillator.frequency, layer2.source.frequency, time);
1963
+ rampTo(oscillator.frequency, layer2.source.frequency, time);
1859
1964
  }
1860
1965
  const envelope2 = context.createGain();
1861
- applyEnvelope(envelope2.gain, layer.envelope, time);
1966
+ applyEnvelope(envelope2.gain, layer2.envelope, time);
1862
1967
  oscillator.connect(envelope2).connect(target.output);
1863
1968
  oscillator.start(time);
1864
- oscillator.stop(time + layer.duration + layer.tail);
1969
+ oscillator.stop(time + layer2.duration + layer2.tail);
1865
1970
  return oscillator;
1866
1971
  }
1867
1972
  function realizeWeapon(plan, target) {
1868
- const sources = plan.layers.map((layer) => {
1869
- const time = target.time + layer.at;
1870
- return layer.source.kind === "noise" ? noiseLayer(layer, target, time) : toneLayer(layer, target, time);
1973
+ const sources = plan.layers.map((layer2) => {
1974
+ const time = target.time + layer2.at;
1975
+ return layer2.source.kind === "noise" ? noiseLayer(layer2, target, time) : toneLayer(layer2, target, time);
1871
1976
  });
1872
1977
  return voiceOf(sources);
1873
1978
  }
@@ -1919,19 +2024,19 @@ var GameAudio = (() => {
1919
2024
  rate: modulator.rate * rate,
1920
2025
  ...modulator.target === "frequency" ? { depth: modulator.depth * rate } : {}
1921
2026
  });
1922
- var tuneLayer = (layer, rate) => ({
1923
- ...layer,
1924
- at: layer.at / rate,
1925
- duration: layer.duration / rate,
1926
- tail: layer.tail / rate,
1927
- source: tuneSource(layer.source, rate),
1928
- ...layer.filters ? { filters: { ...layer.filters, bank: layer.filters.bank.map((filter) => tuneFilter(filter, rate)) } } : {},
1929
- modulators: layer.modulators.map((modulator) => tuneModulator(modulator, rate)),
1930
- envelope: layer.envelope.map((point) => ({ ...point, time: point.time / rate }))
2027
+ var tuneLayer = (layer2, rate) => ({
2028
+ ...layer2,
2029
+ at: layer2.at / rate,
2030
+ duration: layer2.duration / rate,
2031
+ tail: layer2.tail / rate,
2032
+ source: tuneSource(layer2.source, rate),
2033
+ ...layer2.filters ? { filters: { ...layer2.filters, bank: layer2.filters.bank.map((filter) => tuneFilter(filter, rate)) } } : {},
2034
+ modulators: layer2.modulators.map((modulator) => tuneModulator(modulator, rate)),
2035
+ envelope: layer2.envelope.map((point) => ({ ...point, time: point.time / rate }))
1931
2036
  });
1932
2037
  function retunePlan(plan, rate) {
1933
2038
  if (rate === 1 || !(rate > 0)) return plan;
1934
- return { ...plan, length: plan.length / rate, layers: plan.layers.map((layer) => tuneLayer(layer, rate)) };
2039
+ return { ...plan, length: plan.length / rate, layers: plan.layers.map((layer2) => tuneLayer(layer2, rate)) };
1935
2040
  }
1936
2041
  function createSetPicker() {
1937
2042
  const last = /* @__PURE__ */ new Map();
@@ -2034,6 +2139,7 @@ var GameAudio = (() => {
2034
2139
  }
2035
2140
 
2036
2141
  // src/webaudio/realize-sample.ts
2142
+ var TRIM_FADE = 0.04;
2037
2143
  function realizeSample(plan, target) {
2038
2144
  const context = target.context;
2039
2145
  let head = target.output;
@@ -2055,16 +2161,26 @@ var GameAudio = (() => {
2055
2161
  voice2.connect(head);
2056
2162
  head = voice2;
2057
2163
  const sources = [];
2058
- for (const layer of plan.layers) {
2059
- const buffer = target.buffer(layer.url);
2164
+ for (const layer2 of plan.layers) {
2165
+ const buffer = target.buffer(layer2.url);
2060
2166
  if (!buffer) continue;
2061
2167
  const source = context.createBufferSource();
2062
2168
  source.buffer = buffer;
2063
- source.playbackRate.value = layer.rate;
2064
- const gain = gainNode(context, layer.gain);
2169
+ source.playbackRate.value = layer2.rate;
2170
+ const gain = gainNode(context, layer2.gain);
2065
2171
  source.connect(gain);
2066
2172
  gain.connect(head);
2067
- source.start(target.time + layer.at);
2173
+ const at = target.time + layer2.at;
2174
+ const offset = Math.max(0, Math.min(layer2.offset ?? 0, buffer.duration));
2175
+ if (layer2.duration === void 0) source.start(at, offset);
2176
+ else {
2177
+ const duration = Math.max(0, Math.min(layer2.duration, buffer.duration - offset));
2178
+ const end3 = at + duration / layer2.rate;
2179
+ const fade = Math.min(TRIM_FADE, (end3 - at) / 4);
2180
+ gain.gain.setValueAtTime(layer2.gain, end3 - fade);
2181
+ gain.gain.linearRampToValueAtTime(0, end3);
2182
+ source.start(at, offset, duration);
2183
+ }
2068
2184
  sources.push(source);
2069
2185
  }
2070
2186
  const realized = voiceOf(sources);
@@ -2084,7 +2200,11 @@ var GameAudio = (() => {
2084
2200
  }
2085
2201
  function sampleLength(plan, seconds) {
2086
2202
  let length = 0;
2087
- for (const layer of plan.layers) length = Math.max(length, layer.at + (seconds(layer.url) ?? 0) / layer.rate);
2203
+ for (const layer2 of plan.layers) {
2204
+ const file = seconds(layer2.url) ?? 0;
2205
+ const played = layer2.duration === void 0 ? file - (layer2.offset ?? 0) : Math.min(layer2.duration, file - (layer2.offset ?? 0));
2206
+ length = Math.max(length, layer2.at + Math.max(0, played) / layer2.rate);
2207
+ }
2088
2208
  return length;
2089
2209
  }
2090
2210
 
@@ -2100,8 +2220,8 @@ var GameAudio = (() => {
2100
2220
  }
2101
2221
  return curve;
2102
2222
  }
2103
- var usesNoise = (recipe2) => recipe2.layers.some((layer) => layer.source.kind !== "osc");
2104
- var planUsesNoise = (plan) => plan.layers.some((layer) => layer.source.kind !== "osc");
2223
+ var usesNoise = (recipe2) => recipe2.layers.some((layer2) => layer2.source.kind !== "osc");
2224
+ var planUsesNoise = (plan) => plan.layers.some((layer2) => layer2.source.kind !== "osc");
2105
2225
  function createAudioEngine(options = {}) {
2106
2226
  const seed = options.seed ?? 1;
2107
2227
  const registry = createSoundRegistry(options.banks);
@@ -2340,7 +2460,7 @@ var GameAudio = (() => {
2340
2460
  level: plan.level,
2341
2461
  distance: plan.distance,
2342
2462
  ...plan.pan === void 0 ? {} : { pan: plan.pan },
2343
- layers: plan.layers.map((layer) => ({ role: layer.role, url: layer.url, take: layer.take, rate: layer.rate })),
2463
+ layers: plan.layers.map((layer2) => ({ role: layer2.role, url: layer2.url, take: layer2.take, rate: layer2.rate })),
2344
2464
  ...plan.tier ? { tier: plan.tier } : {}
2345
2465
  });
2346
2466
  voices.setLength(voiceId, sampleLength(plan, (url2) => sampleStore.seconds(url2)) + (playOptions.delay ?? 0));
@@ -2473,7 +2593,9 @@ var GameAudio = (() => {
2473
2593
  random: engineRandom,
2474
2594
  register: loopHost.register,
2475
2595
  unregister: loopHost.unregister,
2476
- muted: (bus) => busSettings.get(bus)?.muted === true
2596
+ muted: (bus) => busSettings.get(bus)?.muted === true,
2597
+ listener: () => listener,
2598
+ ...options.distance ? { distance: options.distance } : {}
2477
2599
  },
2478
2600
  loopOptions.volume
2479
2601
  );
@@ -2787,12 +2909,12 @@ var GameAudio = (() => {
2787
2909
  brightness.push(onset < 0 ? 0 : centroidHz(result.channels, result.sampleRate, onset));
2788
2910
  }
2789
2911
  const far = planSample(sound, { random: createRng(1), distance: CRITERIA_TARGETS.distances.at(-1) });
2790
- const switched = (far?.farMix ?? 0) === 1 && (far?.layers.some((layer) => layer.role === "far") ?? false);
2912
+ const switched = (far?.farMix ?? 0) === 1 && (far?.layers.some((layer2) => layer2.role === "far") ?? false);
2791
2913
  const pass = decreasing(levels) && decreasing(brightness) && switched;
2792
2914
  return {
2793
2915
  id: "C3",
2794
2916
  pass,
2795
- value: `${levels.map((level) => db(level)).join(" \u203A ")}; ${brightness.map((hz) => `${Math.round(hz)} Hz`).join(" \u203A ")}${switched ? "; longe = far" : "; sem camada far"}`,
2917
+ value: `${levels.map((level) => db(level)).join(" \u203A ")}; ${brightness.map((hz2) => `${Math.round(hz2)} Hz`).join(" \u203A ")}${switched ? "; longe = far" : "; sem camada far"}`,
2796
2918
  target: "cai e escurece com a dist\xE2ncia; troca para a vers\xE3o de longe depois de ~50 m",
2797
2919
  data: { distances: CRITERIA_TARGETS.distances, levels, brightness, switched }
2798
2920
  };
@@ -2827,11 +2949,11 @@ var GameAudio = (() => {
2827
2949
  for (let index = 0; index < CRITERIA_TARGETS.plays; index++) if (engine.play(options.sound, { distance: 1, delay: 0.1 + index * 0.3 })) played++;
2828
2950
  return played;
2829
2951
  });
2830
- const close = result.events.map((event) => event.layers?.find((layer) => layer.role === "close"));
2831
- const takes2 = close.map((layer) => layer?.url ?? "");
2952
+ const close = result.events.map((event) => event.layers?.find((layer2) => layer2.role === "close"));
2953
+ const takes2 = close.map((layer2) => layer2?.url ?? "");
2832
2954
  const repeats = takes2.filter((take, index) => index > 0 && take === takes2[index - 1]).length;
2833
2955
  const distinct = new Set(takes2).size;
2834
- const rates = close.map((layer) => layer?.rate ?? 1);
2956
+ const rates = close.map((layer2) => layer2?.rate ?? 1);
2835
2957
  const spread = (Math.max(...rates) - Math.min(...rates)) / 2;
2836
2958
  const pitch = sound.pitch ?? 0.04;
2837
2959
  const pass = distinct >= CRITERIA_TARGETS.minTakes && repeats === 0 && pitch >= CRITERIA_TARGETS.pitch[0] && pitch <= CRITERIA_TARGETS.pitch[1] && spread > 0.01;
@@ -2869,7 +2991,7 @@ var GameAudio = (() => {
2869
2991
  const result = await render(options, 1.2, (engine) => engine.play(options.sound, { distance: 1, seed: 1, intensity, delay: EVENT_AT }) ? 1 : 0);
2870
2992
  const onset = onsetIndex(result.channels, 0, 1e-5);
2871
2993
  const event = result.events[0];
2872
- return { tier: event?.tier ?? "", rms: onset < 0 ? -Infinity : rmsDb(result.channels, onset, onset + result.sampleRate * 0.3), files: event?.layers?.find((layer) => layer.role === "close")?.url ?? "" };
2994
+ return { tier: event?.tier ?? "", rms: onset < 0 ? -Infinity : rmsDb(result.channels, onset, onset + result.sampleRate * 0.3), files: event?.layers?.find((layer2) => layer2.role === "close")?.url ?? "" };
2873
2995
  };
2874
2996
  const light = await at(0.1);
2875
2997
  const heavy = await at(0.9);
@@ -3026,7 +3148,22 @@ var GameAudio = (() => {
3026
3148
  ["smg_45_auto", 2, "sfx_pistol"],
3027
3149
  ["weapon_draw", 2],
3028
3150
  ["suppressor_attach", 3],
3029
- ["suppressor_detach", 3]
3151
+ ["suppressor_detach", 3],
3152
+ ["minigun_loop", 3],
3153
+ ["smg_5_7x28", 3],
3154
+ ["mg_belt_adjust", 3],
3155
+ ["mg_belt_box_attach", 3],
3156
+ ["mg_cover_open", 3],
3157
+ ["mg_cover_close", 3],
3158
+ ["weapon_holster", 3],
3159
+ ["scope_zoom", 3]
3160
+ ]),
3161
+ ...entries("impactos", [
3162
+ ["knife_hit_wall", 3],
3163
+ ["helmet_hit", 3],
3164
+ ["vest_hit", 3],
3165
+ ["headshot", 3],
3166
+ ["blood_squirt", 3]
3030
3167
  ]),
3031
3168
  ...entries("explosoes-fogo", [
3032
3169
  ["explosion_grenade", 1, "boom"],
@@ -3044,7 +3181,13 @@ var GameAudio = (() => {
3044
3181
  ["grenade_bounce", 1],
3045
3182
  ["c4_plant", 2],
3046
3183
  ["c4_beep", 2],
3047
- ["c4_disarm", 2]
3184
+ ["c4_disarm", 2],
3185
+ ["c4_disarming_loop", 3],
3186
+ ["c4_remote_detonate", 3],
3187
+ ["smoke_grenade_hiss", 3],
3188
+ ["grenade_pin_pull", 3],
3189
+ ["electric_shock", 3],
3190
+ ["electric_spark", 3]
3048
3191
  ]),
3049
3192
  ...entries("personagem", [
3050
3193
  ["footstep_concrete_walk", 1, "sfx_step"],
@@ -3072,7 +3215,13 @@ var GameAudio = (() => {
3072
3215
  ["zombie_attack", 1],
3073
3216
  ["zombie_pain", 1],
3074
3217
  ["zombie_claw_hit", 1, "sfx_flesh"],
3075
- ["zombie_claw_miss", 2]
3218
+ ["zombie_claw_miss", 2],
3219
+ ["swing_whoosh", 3],
3220
+ ["heartbeat_critical", 3],
3221
+ ["fall_water", 3],
3222
+ ["fall_damage", 3],
3223
+ ["fall_scream", 3],
3224
+ ["footstep_glass_walk", 3]
3076
3225
  ]),
3077
3226
  ...entries("veiculos", [
3078
3227
  ["engine_loop_car", 1],
@@ -3082,7 +3231,12 @@ var GameAudio = (() => {
3082
3231
  ["car_door_open", 1, "latch"],
3083
3232
  ["car_door_close", 1, "shut_metal"],
3084
3233
  ["horn_car", 2, "horn"],
3085
- ["tire_skid_asphalt", 2]
3234
+ ["tire_skid_asphalt", 2],
3235
+ ["jet_flyby", 3],
3236
+ ["helicopter_turbine", 3],
3237
+ ["tire_burnout", 3],
3238
+ ["handbrake_turn", 3],
3239
+ ["siren_police", 3]
3086
3240
  ]),
3087
3241
  ...entries("itens-portas", [
3088
3242
  ["item_pickup_metal", 1],
@@ -3093,7 +3247,27 @@ var GameAudio = (() => {
3093
3247
  ["door_creak", 1, "creak_wood"],
3094
3248
  ["door_locked_rattle", 1, "rattle"],
3095
3249
  ["drawer_open", 2, "slide"],
3096
- ["fridge_close", 2, "shut_metal"]
3250
+ ["fridge_close", 2, "shut_metal"],
3251
+ ["inventory_open", 3],
3252
+ ["inventory_close", 3],
3253
+ ["inventory_select", 3],
3254
+ ["inventory_place", 3],
3255
+ ["pickup_chime", 3],
3256
+ ["item_pickup_coins", 3],
3257
+ ["bandage_use", 3],
3258
+ ["bandage_refuse", 3],
3259
+ ["flashlight_toggle", 3],
3260
+ ["gear_draw", 3],
3261
+ ["gear_holster", 3],
3262
+ ["button_press", 3],
3263
+ ["lock_desk_open", 3],
3264
+ ["elevator_move_loop", 3],
3265
+ ["elevator_stop", 3],
3266
+ ["door_sliding", 3],
3267
+ ["door_kick", 3],
3268
+ ["door_wood_break", 3],
3269
+ ["gate_iron_open", 3],
3270
+ ["gate_iron_close", 3]
3097
3271
  ]),
3098
3272
  ...entries("ambiente", [
3099
3273
  ["rain_loop", 2],
@@ -3101,7 +3275,16 @@ var GameAudio = (() => {
3101
3275
  ["thunder_near", 2],
3102
3276
  ["thunder_far", 2],
3103
3277
  ["water_splash", 2],
3104
- ["helicopter_loop", 3]
3278
+ ["helicopter_loop", 3],
3279
+ ["bird_flush", 3],
3280
+ ["dog_growl", 3],
3281
+ ["dog_whimper", 3],
3282
+ ["dog_howl", 3],
3283
+ ["zombie_dog_bark", 3],
3284
+ ["zombie_dog_howl_far", 3],
3285
+ ["insect_squash", 3],
3286
+ ["insect_crawl", 3],
3287
+ ["fan_loop", 3]
3105
3288
  ])
3106
3289
  ];
3107
3290
  var SFX_MATERIALS = [
@@ -3151,9 +3334,9 @@ var GameAudio = (() => {
3151
3334
  function parseSfxName(name) {
3152
3335
  const match = /^(.*?)(?:_(close|far|tail_in|tail_out))?(?:_(\d+))?$/.exec(name);
3153
3336
  const id = match?.[1] || name;
3154
- const layer = match?.[2] ?? "close";
3337
+ const layer2 = match?.[2] ?? "close";
3155
3338
  const take = match?.[3] ? Number(match[3]) : 1;
3156
- return { id, layer, take };
3339
+ return { id, layer: layer2, take };
3157
3340
  }
3158
3341
  function splitTier(id) {
3159
3342
  const match = /^(.*)_(light|medium|heavy)$/.exec(id);
@@ -3229,7 +3412,16 @@ var GameAudio = (() => {
3229
3412
  // a drawer stays on its recipe: the recorded runs (1 to 1.9 s) outlast a drawer's pull
3230
3413
  // an item taken in the hand (game-destruction-three grab_* keys)
3231
3414
  grab_hard: "item_pickup_generic",
3232
- grab_soft: "item_pickup_leather"
3415
+ grab_soft: "item_pickup_leather",
3416
+ // the hand foley of the test room (game-audio FOLEY_BANK) whose id is not a file id: a wooden leaf shut and slammed, an item picked up by material.
3417
+ // The metal door stays on its recipe (two of its takes run 10 s), and so do the fridge, the microwave and paper (no file for them).
3418
+ door_wood_close: "door_wood_shut",
3419
+ door_wood_slam: "door_slam_wood",
3420
+ item_pickup_metal: "item_pickup_generic",
3421
+ item_pickup_plastic: "item_pickup_generic",
3422
+ item_pickup_glass: "item_pickup_generic",
3423
+ item_pickup_wood: "item_pickup_generic",
3424
+ item_pickup_fabric: "item_pickup_leather"
3233
3425
  };
3234
3426
  function kitSampleDefaults(sound) {
3235
3427
  const bus = VOICE_IDS.test(sound.id) ? "voices" : KIT_CATEGORY_BUS[sound.category];
@@ -3333,6 +3525,145 @@ var GameAudio = (() => {
3333
3525
  return result;
3334
3526
  }
3335
3527
 
3528
+ // src/local-pack.ts
3529
+ var LOCAL_PACK_LICENSES = ["CC0", "CC-BY", "unknown", "proprietary"];
3530
+ var LOCAL_PACK_PREFERENCES = ["pack", "sdk"];
3531
+ var LocalSoundPackError = class extends Error {
3532
+ constructor(problems) {
3533
+ super(`invalid local sound pack: ${problems.join("; ")}`);
3534
+ __publicField(this, "problems");
3535
+ this.name = "LocalSoundPackError";
3536
+ this.problems = problems;
3537
+ }
3538
+ };
3539
+ var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
3540
+ var isLicense = (value) => LOCAL_PACK_LICENSES.includes(value);
3541
+ var isBus = (value) => BUS_IDS.includes(value);
3542
+ function entryProblems(id, entry) {
3543
+ if (!isRecord(entry)) return [`${id}: not an object`];
3544
+ const problems = [];
3545
+ const files = entry.files;
3546
+ if (!Array.isArray(files) || files.length === 0 || !files.every((file) => typeof file === "string" && file.length > 0)) problems.push(`${id}: files must be a non-empty list of paths`);
3547
+ if (!isLicense(entry.license)) problems.push(`${id}: license must be one of ${LOCAL_PACK_LICENSES.join(", ")}`);
3548
+ if (entry.prefer !== void 0 && !LOCAL_PACK_PREFERENCES.includes(entry.prefer)) problems.push(`${id}: prefer must be pack or sdk`);
3549
+ if (entry.bus !== void 0 && !isBus(entry.bus)) problems.push(`${id}: unknown bus ${String(entry.bus)}`);
3550
+ if (entry.gain !== void 0 && (typeof entry.gain !== "number" || entry.gain < 0)) problems.push(`${id}: gain must be a number \u2265 0`);
3551
+ if (entry.score !== void 0 && (typeof entry.score !== "number" || entry.score < 0 || entry.score > 10)) problems.push(`${id}: score must be 0\u201310`);
3552
+ return problems;
3553
+ }
3554
+ function parseLocalSoundPack(value) {
3555
+ if (!isRecord(value)) throw new LocalSoundPackError(["the pack is not an object"]);
3556
+ const problems = [];
3557
+ if (value.version !== 1) problems.push("version must be 1");
3558
+ if (value.baseUrl !== void 0 && typeof value.baseUrl !== "string") problems.push("baseUrl must be a string");
3559
+ if (!isRecord(value.sounds)) problems.push("sounds must be an object of id \u2192 entry");
3560
+ else for (const [id, entry] of Object.entries(value.sounds)) problems.push(...entryProblems(id, entry));
3561
+ if (problems.length > 0) throw new LocalSoundPackError(problems);
3562
+ return value;
3563
+ }
3564
+ var isShippableLicense = (license) => SDK_LICENSES.includes(license);
3565
+ var CATALOG = new Map([...SFX_CATALOG, ...SFX_IMPACTS].map((entry) => [entry.id, entry]));
3566
+ var busOf = (id, entry) => {
3567
+ if (entry.bus) return entry.bus;
3568
+ const category = CATALOG.get(id)?.category ?? "";
3569
+ return kitSampleDefaults({ id, category })?.bus ?? "world";
3570
+ };
3571
+ function localPackSamples(pack, options = {}) {
3572
+ const baseUrl = options.baseUrl ?? pack.baseUrl ?? "";
3573
+ return Object.entries(pack.sounds).map(([id, entry]) => {
3574
+ const current = CATALOG.get(id)?.current;
3575
+ const isLoop = /_loop(_|$)/.test(id);
3576
+ return {
3577
+ id,
3578
+ bus: busOf(id, entry),
3579
+ close: entry.files.map((file) => ({ url: `${baseUrl}${file}` })),
3580
+ pitch: isLoop ? 0 : 0.04,
3581
+ ...isLoop ? { loop: true } : {},
3582
+ ...entry.gain === void 0 ? {} : { gain: entry.gain },
3583
+ ...current ? { fallback: current } : {},
3584
+ license: entry.license,
3585
+ sources: entry.files.map((file) => `local: ${file} ${entry.license}`)
3586
+ };
3587
+ });
3588
+ }
3589
+
3590
+ // src/local-pack-loader.ts
3591
+ var LOCAL_PACK_BANK_ID = "local_sound_pack";
3592
+ var STAGING_PREFIX = "local_pack_staging:";
3593
+ var defaultIdleScheduler = (task) => {
3594
+ const idle = globalThis;
3595
+ if (idle.requestIdleCallback && idle.cancelIdleCallback) {
3596
+ const handle2 = idle.requestIdleCallback(task);
3597
+ const cancel = idle.cancelIdleCallback;
3598
+ return () => cancel(handle2);
3599
+ }
3600
+ const handle = setTimeout(task, 0);
3601
+ return () => clearTimeout(handle);
3602
+ };
3603
+ function applyLocalSoundPack(engine, pack, options = {}) {
3604
+ const schedule = options.schedule ?? defaultIdleScheduler;
3605
+ const samples = localPackSamples(pack, options);
3606
+ const statuses = new Map(samples.map((sample) => [sample.id, "pending"]));
3607
+ const priors = /* @__PURE__ */ new Map();
3608
+ const report = { file: [], sdk: [], fallback: [] };
3609
+ const queue = [...samples];
3610
+ let cancel;
3611
+ let disposed = false;
3612
+ let finish = () => void 0;
3613
+ const done = new Promise((resolve) => {
3614
+ finish = resolve;
3615
+ });
3616
+ const swapIn = (sample) => {
3617
+ const prior = engine.registry.sample(sample.id);
3618
+ const bank = engine.registry.bankOf(sample.id);
3619
+ priors.set(sample.id, { ...prior ? { sample: prior } : {}, ...bank ? { bank } : {} });
3620
+ engine.register({ id: LOCAL_PACK_BANK_ID, samples: [{ ...sample, ...prior?.fallback ? { fallback: prior.fallback } : {} }] });
3621
+ statuses.set(sample.id, "file");
3622
+ report.file.push(sample.id);
3623
+ };
3624
+ const loadOne = async (sample) => {
3625
+ if (pack.sounds[sample.id]?.prefer === "sdk" && engine.registry.sample(sample.id)) {
3626
+ statuses.set(sample.id, "sdk");
3627
+ report.sdk.push(sample.id);
3628
+ return;
3629
+ }
3630
+ const staging = `${STAGING_PREFIX}${sample.id}`;
3631
+ engine.register({ id: LOCAL_PACK_BANK_ID, samples: [{ ...sample, id: staging }] });
3632
+ const loaded = await engine.loadSamples([staging]);
3633
+ engine.registry.removeSample(staging);
3634
+ if (disposed) return;
3635
+ if (loaded.failed.length === 0) return swapIn(sample);
3636
+ statuses.set(sample.id, "fallback");
3637
+ report.fallback.push({ id: sample.id, error: loaded.failed.map((entry) => `${entry.url}: ${entry.error}`).join("; ") });
3638
+ };
3639
+ const next = () => {
3640
+ const sample = queue.shift();
3641
+ if (!sample || disposed) {
3642
+ if (!disposed) finish(report);
3643
+ return;
3644
+ }
3645
+ void loadOne(sample).finally(() => {
3646
+ if (!disposed) cancel = schedule(next);
3647
+ });
3648
+ };
3649
+ cancel = schedule(next);
3650
+ return {
3651
+ done,
3652
+ status: (id) => statuses.get(id),
3653
+ unlicensed: () => samples.filter((sample) => statuses.get(sample.id) === "file" && !isShippableLicense(sample.license)).map((sample) => sample.id),
3654
+ dispose() {
3655
+ disposed = true;
3656
+ cancel?.();
3657
+ for (const [id, prior] of priors) {
3658
+ if (prior.sample) engine.register({ id: prior.bank ?? LOCAL_PACK_BANK_ID, samples: [prior.sample] });
3659
+ else engine.registry.removeSample(id);
3660
+ }
3661
+ priors.clear();
3662
+ finish(report);
3663
+ }
3664
+ };
3665
+ }
3666
+
3336
3667
  // src/data/game-sfx.json
3337
3668
  var game_sfx_default = {
3338
3669
  sources: ["jogo:L62089-62107"],
@@ -3632,10 +3963,80 @@ var GameAudio = (() => {
3632
3963
  duration: 0.5,
3633
3964
  layers: [{ source: { kind: "osc", wave: "sine", frequency: { set: 880 } }, repeat: { count: 3, spacing: 0.7 }, envelope: [[0, 0.06, "set"], [0.5, 1e-4, "exp", "fixed"]] }],
3634
3965
  falloff: { model: "none" }
3966
+ },
3967
+ {
3968
+ // the parking sensor: a short high beep, repeated by the cabin faster as the obstacle comes close
3969
+ id: "parking_beep",
3970
+ bus: "world",
3971
+ duration: 0.09,
3972
+ layers: [{ source: { kind: "osc", wave: "sine", frequency: { set: 2300 } }, envelope: [[0, 0.07, "set"], [0.08, 1e-4, "exp", "fixed"]] }],
3973
+ falloff: { model: "none" }
3635
3974
  }
3636
3975
  ];
3637
3976
  var CABIN_BANK = { id: "vehicle_cabin", sounds: CABIN_SOUNDS, loops: [] };
3638
3977
 
3978
+ // src/library/radio.ts
3979
+ var hz = (midi) => 440 * 2 ** ((midi - 69) / 12);
3980
+ var layer = (note, beat, wave, level) => {
3981
+ const [at, midi, beats] = note;
3982
+ const length = beats * beat;
3983
+ return {
3984
+ at: at * beat,
3985
+ duration: length,
3986
+ source: { kind: "osc", wave, frequency: { set: hz(midi) } },
3987
+ envelope: [[0, 1e-4, "set"], [0.01, level, "linear"], [Math.max(0.02, length * 0.9), level * 0.35, "linear"], [length, 1e-4, "exp", "fixed"]]
3988
+ };
3989
+ };
3990
+ function radioTrack(spec) {
3991
+ const beat = 60 / spec.bpm;
3992
+ const recipes = Array.from({ length: spec.bars }, (_, bar) => {
3993
+ const inBar = (notes) => notes.filter((n) => n[0] >= bar * 4 && n[0] < bar * 4 + 4).map((n) => [n[0] - bar * 4, n[1], n[2]]);
3994
+ const layers = [
3995
+ ...inBar(spec.bass).map((n) => layer(n, beat, "triangle", 0.16)),
3996
+ ...inBar(spec.chords).map((n) => layer(n, beat, "sine", 0.05)),
3997
+ ...inBar(spec.melody).map((n) => layer(n, beat, spec.wave, 0.07))
3998
+ ];
3999
+ return { id: `${spec.id}_${bar}`, bus: "world", duration: 4 * beat, layers, falloff: { model: "none" } };
4000
+ });
4001
+ return { song: { id: spec.id, barSeconds: 4 * beat, bars: recipes.map((r) => r.id) }, recipes };
4002
+ }
4003
+ var chord = (bar, root, minor = false) => [[bar * 4, root, 4], [bar * 4, root + (minor ? 3 : 4), 4], [bar * 4, root + 7, 4]];
4004
+ var bassLine = (roots, pattern) => roots.flatMap((root, bar) => pattern.map((b) => [bar * 4 + b, root - 12, 0.9]));
4005
+ var TRACKS = [
4006
+ // a bright pop loop: I–V–vi–IV in C
4007
+ radioTrack({
4008
+ id: "radio_track_pop",
4009
+ bpm: 112,
4010
+ bars: 4,
4011
+ wave: "square",
4012
+ bass: bassLine([48, 55, 57, 53], [0, 1.5, 2, 3]),
4013
+ chords: [...chord(0, 60), ...chord(1, 55), ...chord(2, 57, true), ...chord(3, 53)],
4014
+ melody: [[0, 76, 1], [1, 74, 0.5], [1.5, 72, 1.5], [4, 74, 1], [5, 76, 1], [6, 79, 2], [8, 76, 1], [9, 74, 1], [10, 72, 2], [12, 72, 1], [13, 74, 1], [14, 72, 2]]
4015
+ }),
4016
+ // a syncopated loop in A minor, the bass on the off-beats
4017
+ radioTrack({
4018
+ id: "radio_track_groove",
4019
+ bpm: 100,
4020
+ bars: 4,
4021
+ wave: "triangle",
4022
+ bass: bassLine([57, 62, 64, 57], [0, 0.75, 1.5, 2.5, 3.25]),
4023
+ chords: [...chord(0, 57, true), ...chord(1, 62, true), ...chord(2, 64), ...chord(3, 57, true)],
4024
+ melody: [[0.5, 72, 0.5], [1.25, 76, 0.75], [2.5, 74, 1], [4.5, 77, 0.5], [5.25, 74, 0.75], [6.5, 72, 1.5], [8.5, 71, 0.5], [9.25, 74, 0.75], [10.5, 76, 1.5], [12.5, 72, 0.5], [13.25, 69, 2]]
4025
+ }),
4026
+ // a slow blues-like loop in F with a swung melody
4027
+ radioTrack({
4028
+ id: "radio_track_slow",
4029
+ bpm: 76,
4030
+ bars: 4,
4031
+ wave: "sine",
4032
+ bass: bassLine([53, 58, 53, 60], [0, 2]),
4033
+ chords: [...chord(0, 65), ...chord(1, 58), ...chord(2, 65), ...chord(3, 60)],
4034
+ melody: [[0, 72, 1.5], [1.67, 75, 0.33], [2, 77, 2], [4, 74, 1], [5, 72, 1], [6, 70, 2], [8, 72, 1.5], [9.67, 69, 0.33], [10, 65, 2], [12, 67, 1], [13, 70, 1], [14, 72, 2]]
4035
+ })
4036
+ ];
4037
+ var RADIO_TRACKS = TRACKS.map((t) => t.song);
4038
+ var RADIO_BANK = { id: "vehicle_radio", sounds: TRACKS.flatMap((t) => t.recipes), loops: [] };
4039
+
3639
4040
  // src/recipes/foley.ts
3640
4041
  var FOLEY_FALLOFF = {
3641
4042
  model: "inverse_square",
@@ -4277,11 +4678,11 @@ var GameAudio = (() => {
4277
4678
  ...s.splash ? [sceneNoise({ type: "bandpass", f: s.splash.f * take.f, f2: s.splash.f2 * take.f, q: 1.4, d: s.splash.d * take.t * weight ** 0.4, vol: s.splash.vol * gait.vol * take.v * weight ** 0.5 })] : []
4278
4679
  ];
4279
4680
  }
4280
- var quieter = (level, layers) => layers.map((layer) => {
4281
- const gain = layer.gain ?? 1;
4282
- if (typeof gain === "number") return { ...layer, gain: gain * level };
4283
- if (Array.isArray(gain)) return { ...layer, gain: [gain[0] * level, gain[1] * level] };
4284
- return layer;
4681
+ var quieter = (level, layers) => layers.map((layer2) => {
4682
+ const gain = layer2.gain ?? 1;
4683
+ if (typeof gain === "number") return { ...layer2, gain: gain * level };
4684
+ if (Array.isArray(gain)) return { ...layer2, gain: [gain[0] * level, gain[1] * level] };
4685
+ return layer2;
4285
4686
  });
4286
4687
  var recipe = (id, layers, falloff, bus = "world") => ({ id, bus, pan: true, layers, falloff, sources: ["sdk"] });
4287
4688
  var takeId = (id, index) => `${id}_${String(index + 1).padStart(2, "0")}`;
@@ -4297,7 +4698,7 @@ var GameAudio = (() => {
4297
4698
  (take) => quieter(LANDING_LEVEL, [
4298
4699
  // both feet, a hair apart, then the knees taking the weight (a low body thump) and the clothes settling
4299
4700
  ...footLayers(surface, take, GAITS.run, LANDINGS[landing2].weight),
4300
- ...footLayers(surface, { ...take, v: take.v * 0.6 }, GAITS.run, LANDINGS[landing2].weight * 0.6).map((layer) => ({ ...layer, at: (typeof layer.at === "number" ? layer.at : 0) + 0.018 * take.t })),
4701
+ ...footLayers(surface, { ...take, v: take.v * 0.6 }, GAITS.run, LANDINGS[landing2].weight * 0.6).map((layer2) => ({ ...layer2, at: (typeof layer2.at === "number" ? layer2.at : 0) + 0.018 * take.t })),
4301
4702
  sceneTone({ f: 60 * take.f, f2: 38, d: 0.14 * LANDINGS[landing2].weight * take.t, vol: 0.22 * LANDINGS[landing2].weight ** 0.7 * take.v, delay: 0.02 }),
4302
4703
  sceneNoise({ type: "bandpass", f: [1800, 2600], q: 0.8, d: 0.18, vol: LANDINGS[landing2].cloth * take.v, delay: 0.04 })
4303
4704
  ]),
@@ -4343,7 +4744,7 @@ var GameAudio = (() => {
4343
4744
  fall_damage: (take) => [
4344
4745
  ...BODY.body_fall(take),
4345
4746
  sceneNoise({ type: "highpass", f: 2800, d: 0.02, vol: 0.35 * take.v, delay: 0.01 }),
4346
- ...voice({ f0: 170, f1: 110, d: 0.32, fA: 650, fB: 1150, noise: 0.25, vol: 0.32 })(take).map((layer) => ({ ...layer, at: 0.08 }))
4747
+ ...voice({ f0: 170, f1: 110, d: 0.32, fA: 650, fB: 1150, noise: 0.25, vol: 0.32 })(take).map((layer2) => ({ ...layer2, at: 0.08 }))
4347
4748
  ],
4348
4749
  player_hurt: voice({ f0: 150, f1: 105, d: 0.26, fA: 620, fB: 1100, noise: 0.3, vol: 0.35 }),
4349
4750
  player_breath_run: (take) => [
@@ -4705,11 +5106,11 @@ var GameAudio = (() => {
4705
5106
  const planned = plan();
4706
5107
  if (!planned) return `${text.sheet.title}: ${engine.registry.sound(state.sound) ? text.sheet.silent : text.sheet.none}`;
4707
5108
  const head = `${text.sheet.title}: ${planned.id} (${planned.bus}) ${text.sheet.level} ${planned.level.toFixed(4)} ${text.sheet.distance} ${planned.distance.toFixed(1)} m${planned.pan === void 0 ? "" : ` ${text.sheet.pan} ${planned.pan.toFixed(3)}`} ${planned.length.toFixed(3)} ${text.sheet.length}`;
4708
- const layers2 = planned.layers.map((layer, index) => {
4709
- const source = layer.source.kind === "noise" ? `noise@${layer.source.offset.toFixed(4)}` : layer.source.kind === "osc" ? `${layer.source.wave}@${layer.source.frequency.value ?? layer.source.frequency.from}` : layer.source.kind;
4710
- const filters = (layer.filters?.bank ?? []).map((filter) => `${filter.type}@${(filter.frequency.value ?? filter.frequency.from ?? 0).toFixed(1)}`).join(" ");
4711
- const envelope2 = layer.envelope.map((point) => `${point.time.toFixed(3)}:${point.value.toPrecision(3)}`).join(" ");
4712
- return ` ${text.sheet.layer} ${index + 1}: ${source} at ${layer.at.toFixed(3)} for ${layer.duration.toFixed(3)} ${filters} [${envelope2}]`;
5109
+ const layers2 = planned.layers.map((layer2, index) => {
5110
+ const source = layer2.source.kind === "noise" ? `noise@${layer2.source.offset.toFixed(4)}` : layer2.source.kind === "osc" ? `${layer2.source.wave}@${layer2.source.frequency.value ?? layer2.source.frequency.from}` : layer2.source.kind;
5111
+ const filters = (layer2.filters?.bank ?? []).map((filter) => `${filter.type}@${(filter.frequency.value ?? filter.frequency.from ?? 0).toFixed(1)}`).join(" ");
5112
+ const envelope2 = layer2.envelope.map((point) => `${point.time.toFixed(3)}:${point.value.toPrecision(3)}`).join(" ");
5113
+ return ` ${text.sheet.layer} ${index + 1}: ${source} at ${layer2.at.toFixed(3)} for ${layer2.duration.toFixed(3)} ${filters} [${envelope2}]`;
4713
5114
  });
4714
5115
  return [head, ...layers2].join("\n");
4715
5116
  };