@adatechnology/game-audio 0.4.0 → 0.6.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 (1067) hide show
  1. package/README.md +20 -0
  2. package/assets/sfx/CREDITOS.md +1057 -0
  3. package/assets/sfx/ambiente/ambience_city_day_01.ogg +0 -0
  4. package/assets/sfx/ambiente/ambience_city_day_02.ogg +0 -0
  5. package/assets/sfx/ambiente/ambience_construction_01.ogg +0 -0
  6. package/assets/sfx/ambiente/ambience_night_01.ogg +0 -0
  7. package/assets/sfx/ambiente/ambience_room_tone_01.ogg +0 -0
  8. package/assets/sfx/ambiente/ambience_room_tone_02.ogg +0 -0
  9. package/assets/sfx/ambiente/ambience_rural_day_01.ogg +0 -0
  10. package/assets/sfx/ambiente/ambience_rural_day_02.ogg +0 -0
  11. package/assets/sfx/ambiente/rain_loop_01.ogg +0 -0
  12. package/assets/sfx/ambiente/water_river_loop_01.ogg +0 -0
  13. package/assets/sfx/ambiente/water_river_loop_02.ogg +0 -0
  14. package/assets/sfx/ambiente/water_river_loop_03.ogg +0 -0
  15. package/assets/sfx/ambiente/water_splash_01.ogg +0 -0
  16. package/assets/sfx/ambiente/water_splash_02.ogg +0 -0
  17. package/assets/sfx/ambiente/water_splash_03.ogg +0 -0
  18. package/assets/sfx/ambiente/water_splash_04.ogg +0 -0
  19. package/assets/sfx/ambiente/water_splash_05.ogg +0 -0
  20. package/assets/sfx/ambiente/water_splash_06.ogg +0 -0
  21. package/assets/sfx/ambiente/water_splash_07.ogg +0 -0
  22. package/assets/sfx/ambiente/water_splash_08.ogg +0 -0
  23. package/assets/sfx/ambiente/water_splash_09.ogg +0 -0
  24. package/assets/sfx/ambiente/water_splash_10.ogg +0 -0
  25. package/assets/sfx/ambiente/water_splash_11.ogg +0 -0
  26. package/assets/sfx/ambiente/water_splash_12.ogg +0 -0
  27. package/assets/sfx/ambiente/water_splash_13.ogg +0 -0
  28. package/assets/sfx/ambiente/water_splash_14.ogg +0 -0
  29. package/assets/sfx/ambiente/water_splash_15.ogg +0 -0
  30. package/assets/sfx/armas/bolt_lift_medium_01.ogg +0 -0
  31. package/assets/sfx/armas/bolt_lift_medium_02.ogg +0 -0
  32. package/assets/sfx/armas/bolt_lift_medium_03.ogg +0 -0
  33. package/assets/sfx/armas/bolt_lift_medium_04.ogg +0 -0
  34. package/assets/sfx/armas/bolt_lift_medium_05.ogg +0 -0
  35. package/assets/sfx/armas/bolt_lock_medium_01.ogg +0 -0
  36. package/assets/sfx/armas/bolt_lock_medium_02.ogg +0 -0
  37. package/assets/sfx/armas/bolt_lock_medium_03.ogg +0 -0
  38. package/assets/sfx/armas/bolt_lock_medium_04.ogg +0 -0
  39. package/assets/sfx/armas/bolt_lock_medium_05.ogg +0 -0
  40. package/assets/sfx/armas/bolt_pull_heavy_01.ogg +0 -0
  41. package/assets/sfx/armas/bolt_pull_medium_01.ogg +0 -0
  42. package/assets/sfx/armas/bolt_pull_medium_02.ogg +0 -0
  43. package/assets/sfx/armas/bolt_pull_medium_03.ogg +0 -0
  44. package/assets/sfx/armas/bolt_pull_medium_04.ogg +0 -0
  45. package/assets/sfx/armas/bolt_pull_medium_05.ogg +0 -0
  46. package/assets/sfx/armas/bolt_pull_medium_06.ogg +0 -0
  47. package/assets/sfx/armas/bolt_push_heavy_01.ogg +0 -0
  48. package/assets/sfx/armas/bolt_push_medium_01.ogg +0 -0
  49. package/assets/sfx/armas/bolt_push_medium_02.ogg +0 -0
  50. package/assets/sfx/armas/bolt_push_medium_03.ogg +0 -0
  51. package/assets/sfx/armas/bolt_push_medium_04.ogg +0 -0
  52. package/assets/sfx/armas/bolt_push_medium_05.ogg +0 -0
  53. package/assets/sfx/armas/bolt_push_medium_06.ogg +0 -0
  54. package/assets/sfx/armas/casing_drop_concreto_01.ogg +0 -0
  55. package/assets/sfx/armas/casing_drop_concreto_02.ogg +0 -0
  56. package/assets/sfx/armas/casing_drop_concreto_03.ogg +0 -0
  57. package/assets/sfx/armas/casing_drop_metal_01.ogg +0 -0
  58. package/assets/sfx/armas/casing_drop_metal_02.ogg +0 -0
  59. package/assets/sfx/armas/casing_drop_metal_03.ogg +0 -0
  60. package/assets/sfx/armas/casing_drop_terra_01.ogg +0 -0
  61. package/assets/sfx/armas/casing_drop_terra_02.ogg +0 -0
  62. package/assets/sfx/armas/casing_drop_terra_03.ogg +0 -0
  63. package/assets/sfx/armas/charging_handle_pull_light_01.ogg +0 -0
  64. package/assets/sfx/armas/charging_handle_pull_light_02.ogg +0 -0
  65. package/assets/sfx/armas/charging_handle_pull_light_03.ogg +0 -0
  66. package/assets/sfx/armas/charging_handle_pull_light_04.ogg +0 -0
  67. package/assets/sfx/armas/charging_handle_pull_medium_01.ogg +0 -0
  68. package/assets/sfx/armas/charging_handle_pull_medium_02.ogg +0 -0
  69. package/assets/sfx/armas/charging_handle_pull_medium_03.ogg +0 -0
  70. package/assets/sfx/armas/charging_handle_pull_medium_04.ogg +0 -0
  71. package/assets/sfx/armas/charging_handle_pull_medium_05.ogg +0 -0
  72. package/assets/sfx/armas/charging_handle_release_medium_01.ogg +0 -0
  73. package/assets/sfx/armas/charging_handle_release_medium_02.ogg +0 -0
  74. package/assets/sfx/armas/charging_handle_release_medium_03.ogg +0 -0
  75. package/assets/sfx/armas/charging_handle_release_medium_04.ogg +0 -0
  76. package/assets/sfx/armas/charging_handle_release_medium_05.ogg +0 -0
  77. package/assets/sfx/armas/cylinder_close_light_01.ogg +0 -0
  78. package/assets/sfx/armas/cylinder_close_light_02.ogg +0 -0
  79. package/assets/sfx/armas/cylinder_close_light_03.ogg +0 -0
  80. package/assets/sfx/armas/cylinder_close_light_04.ogg +0 -0
  81. package/assets/sfx/armas/cylinder_close_light_05.ogg +0 -0
  82. package/assets/sfx/armas/cylinder_eject_light_01.ogg +0 -0
  83. package/assets/sfx/armas/cylinder_eject_light_02.ogg +0 -0
  84. package/assets/sfx/armas/cylinder_eject_light_03.ogg +0 -0
  85. package/assets/sfx/armas/cylinder_open_light_01.ogg +0 -0
  86. package/assets/sfx/armas/cylinder_open_light_02.ogg +0 -0
  87. package/assets/sfx/armas/cylinder_open_light_03.ogg +0 -0
  88. package/assets/sfx/armas/cylinder_open_light_04.ogg +0 -0
  89. package/assets/sfx/armas/cylinder_open_light_05.ogg +0 -0
  90. package/assets/sfx/armas/lever_close_medium_01.ogg +0 -0
  91. package/assets/sfx/armas/lever_close_medium_02.ogg +0 -0
  92. package/assets/sfx/armas/lever_open_medium_01.ogg +0 -0
  93. package/assets/sfx/armas/lever_open_medium_02.ogg +0 -0
  94. package/assets/sfx/armas/mag_out_heavy_01.ogg +0 -0
  95. package/assets/sfx/armas/mag_out_heavy_02.ogg +0 -0
  96. package/assets/sfx/armas/mag_out_light_01.ogg +0 -0
  97. package/assets/sfx/armas/mag_out_light_02.ogg +0 -0
  98. package/assets/sfx/armas/mag_out_light_03.ogg +0 -0
  99. package/assets/sfx/armas/mag_out_light_04.ogg +0 -0
  100. package/assets/sfx/armas/mag_out_medium_01.ogg +0 -0
  101. package/assets/sfx/armas/mag_out_medium_02.ogg +0 -0
  102. package/assets/sfx/armas/mag_out_medium_03.ogg +0 -0
  103. package/assets/sfx/armas/mag_seat_heavy_01.ogg +0 -0
  104. package/assets/sfx/armas/mag_seat_heavy_02.ogg +0 -0
  105. package/assets/sfx/armas/mag_seat_light_01.ogg +0 -0
  106. package/assets/sfx/armas/mag_seat_light_02.ogg +0 -0
  107. package/assets/sfx/armas/mag_seat_light_03.ogg +0 -0
  108. package/assets/sfx/armas/mag_seat_light_04.ogg +0 -0
  109. package/assets/sfx/armas/mag_seat_light_05.ogg +0 -0
  110. package/assets/sfx/armas/mag_seat_light_06.ogg +0 -0
  111. package/assets/sfx/armas/mag_seat_medium_01.ogg +0 -0
  112. package/assets/sfx/armas/mag_seat_medium_02.ogg +0 -0
  113. package/assets/sfx/armas/mag_seat_medium_03.ogg +0 -0
  114. package/assets/sfx/armas/pistol_22lr_close_01.ogg +0 -0
  115. package/assets/sfx/armas/pistol_22lr_close_02.ogg +0 -0
  116. package/assets/sfx/armas/pistol_22lr_far_01.ogg +0 -0
  117. package/assets/sfx/armas/pistol_22lr_far_02.ogg +0 -0
  118. package/assets/sfx/armas/pistol_22lr_far_03.ogg +0 -0
  119. package/assets/sfx/armas/pistol_22lr_far_04.ogg +0 -0
  120. package/assets/sfx/armas/pistol_45_close_01.ogg +0 -0
  121. package/assets/sfx/armas/pistol_45_close_02.ogg +0 -0
  122. package/assets/sfx/armas/pistol_45_close_03.ogg +0 -0
  123. package/assets/sfx/armas/pistol_45_close_04.ogg +0 -0
  124. package/assets/sfx/armas/pistol_45_close_05.ogg +0 -0
  125. package/assets/sfx/armas/pistol_45_far_01.ogg +0 -0
  126. package/assets/sfx/armas/pistol_45_far_02.ogg +0 -0
  127. package/assets/sfx/armas/pistol_45_far_03.ogg +0 -0
  128. package/assets/sfx/armas/pistol_45_far_04.ogg +0 -0
  129. package/assets/sfx/armas/pistol_9mm_close_01.ogg +0 -0
  130. package/assets/sfx/armas/pistol_9mm_close_02.ogg +0 -0
  131. package/assets/sfx/armas/pistol_9mm_close_03.ogg +0 -0
  132. package/assets/sfx/armas/pistol_9mm_close_04.ogg +0 -0
  133. package/assets/sfx/armas/pistol_9mm_close_05.ogg +0 -0
  134. package/assets/sfx/armas/pistol_9mm_close_06.ogg +0 -0
  135. package/assets/sfx/armas/pistol_9mm_far_01.ogg +0 -0
  136. package/assets/sfx/armas/pistol_9mm_far_02.ogg +0 -0
  137. package/assets/sfx/armas/pistol_9mm_far_03.ogg +0 -0
  138. package/assets/sfx/armas/pistol_9mm_far_04.ogg +0 -0
  139. package/assets/sfx/armas/pump_back_heavy_01.ogg +0 -0
  140. package/assets/sfx/armas/pump_back_heavy_02.ogg +0 -0
  141. package/assets/sfx/armas/pump_back_heavy_03.ogg +0 -0
  142. package/assets/sfx/armas/pump_back_heavy_04.ogg +0 -0
  143. package/assets/sfx/armas/pump_back_heavy_05.ogg +0 -0
  144. package/assets/sfx/armas/pump_forward_heavy_01.ogg +0 -0
  145. package/assets/sfx/armas/pump_forward_heavy_02.ogg +0 -0
  146. package/assets/sfx/armas/pump_forward_heavy_03.ogg +0 -0
  147. package/assets/sfx/armas/revolver_38_357_close_01.ogg +0 -0
  148. package/assets/sfx/armas/revolver_38_357_close_02.ogg +0 -0
  149. package/assets/sfx/armas/revolver_38_357_close_03.ogg +0 -0
  150. package/assets/sfx/armas/revolver_38_357_close_04.ogg +0 -0
  151. package/assets/sfx/armas/revolver_38_357_far_01.ogg +0 -0
  152. package/assets/sfx/armas/revolver_38_357_far_02.ogg +0 -0
  153. package/assets/sfx/armas/revolver_38_357_far_03.ogg +0 -0
  154. package/assets/sfx/armas/revolver_38_357_far_04.ogg +0 -0
  155. package/assets/sfx/armas/rifle_308_3006_close_01.ogg +0 -0
  156. package/assets/sfx/armas/rifle_308_3006_close_02.ogg +0 -0
  157. package/assets/sfx/armas/rifle_308_3006_close_03.ogg +0 -0
  158. package/assets/sfx/armas/rifle_308_3006_close_04.ogg +0 -0
  159. package/assets/sfx/armas/rifle_308_3006_close_05.ogg +0 -0
  160. package/assets/sfx/armas/rifle_308_3006_close_06.ogg +0 -0
  161. package/assets/sfx/armas/rifle_308_3006_far_01.ogg +0 -0
  162. package/assets/sfx/armas/rifle_308_3006_far_02.ogg +0 -0
  163. package/assets/sfx/armas/rifle_308_3006_far_03.ogg +0 -0
  164. package/assets/sfx/armas/rifle_308_3006_far_04.ogg +0 -0
  165. package/assets/sfx/armas/rifle_308_3006_far_05.ogg +0 -0
  166. package/assets/sfx/armas/rifle_308_3006_far_06.ogg +0 -0
  167. package/assets/sfx/armas/rifle_5_56_close_01.ogg +0 -0
  168. package/assets/sfx/armas/rifle_5_56_close_02.ogg +0 -0
  169. package/assets/sfx/armas/rifle_5_56_close_03.ogg +0 -0
  170. package/assets/sfx/armas/rifle_5_56_close_04.ogg +0 -0
  171. package/assets/sfx/armas/rifle_5_56_close_05.ogg +0 -0
  172. package/assets/sfx/armas/rifle_5_56_far_01.ogg +0 -0
  173. package/assets/sfx/armas/rifle_5_56_far_02.ogg +0 -0
  174. package/assets/sfx/armas/rifle_5_56_far_03.ogg +0 -0
  175. package/assets/sfx/armas/rifle_5_56_far_04.ogg +0 -0
  176. package/assets/sfx/armas/rifle_7_62x39_close_01.ogg +0 -0
  177. package/assets/sfx/armas/rifle_7_62x39_close_02.ogg +0 -0
  178. package/assets/sfx/armas/rifle_7_62x39_close_03.ogg +0 -0
  179. package/assets/sfx/armas/rifle_7_62x39_close_04.ogg +0 -0
  180. package/assets/sfx/armas/rifle_7_62x39_close_05.ogg +0 -0
  181. package/assets/sfx/armas/rifle_7_62x39_close_06.ogg +0 -0
  182. package/assets/sfx/armas/rifle_7_62x39_close_07.ogg +0 -0
  183. package/assets/sfx/armas/rifle_7_62x39_close_08.ogg +0 -0
  184. package/assets/sfx/armas/rifle_7_62x39_close_09.ogg +0 -0
  185. package/assets/sfx/armas/rifle_7_62x39_close_10.ogg +0 -0
  186. package/assets/sfx/armas/rifle_7_62x39_close_11.ogg +0 -0
  187. package/assets/sfx/armas/rifle_7_62x39_close_12.ogg +0 -0
  188. package/assets/sfx/armas/rifle_7_62x39_far_01.ogg +0 -0
  189. package/assets/sfx/armas/rifle_7_62x39_far_02.ogg +0 -0
  190. package/assets/sfx/armas/rifle_7_62x39_far_03.ogg +0 -0
  191. package/assets/sfx/armas/shell_insert_heavy_01.ogg +0 -0
  192. package/assets/sfx/armas/shell_insert_heavy_02.ogg +0 -0
  193. package/assets/sfx/armas/shell_insert_heavy_03.ogg +0 -0
  194. package/assets/sfx/armas/shell_insert_heavy_04.ogg +0 -0
  195. package/assets/sfx/armas/shell_insert_heavy_05.ogg +0 -0
  196. package/assets/sfx/armas/shell_insert_heavy_06.ogg +0 -0
  197. package/assets/sfx/armas/shell_insert_heavy_07.ogg +0 -0
  198. package/assets/sfx/armas/shell_insert_heavy_08.ogg +0 -0
  199. package/assets/sfx/armas/shell_insert_heavy_09.ogg +0 -0
  200. package/assets/sfx/armas/shotgun_12_close_01.ogg +0 -0
  201. package/assets/sfx/armas/shotgun_12_close_02.ogg +0 -0
  202. package/assets/sfx/armas/shotgun_12_close_03.ogg +0 -0
  203. package/assets/sfx/armas/shotgun_12_close_04.ogg +0 -0
  204. package/assets/sfx/armas/shotgun_12_close_05.ogg +0 -0
  205. package/assets/sfx/armas/shotgun_12_close_06.ogg +0 -0
  206. package/assets/sfx/armas/shotgun_12_far_01.ogg +0 -0
  207. package/assets/sfx/armas/shotgun_12_far_02.ogg +0 -0
  208. package/assets/sfx/armas/shotgun_12_far_03.ogg +0 -0
  209. package/assets/sfx/armas/shotgun_12_far_04.ogg +0 -0
  210. package/assets/sfx/armas/shotgun_12_far_05.ogg +0 -0
  211. package/assets/sfx/armas/shotgun_12_far_06.ogg +0 -0
  212. package/assets/sfx/armas/slide_release_light_01.ogg +0 -0
  213. package/assets/sfx/armas/slide_release_light_02.ogg +0 -0
  214. package/assets/sfx/armas/slide_release_light_03.ogg +0 -0
  215. package/assets/sfx/armas/slide_release_light_04.ogg +0 -0
  216. package/assets/sfx/armas/slide_release_light_05.ogg +0 -0
  217. package/assets/sfx/armas/slide_release_light_06.ogg +0 -0
  218. package/assets/sfx/armas/slide_release_medium_01.ogg +0 -0
  219. package/assets/sfx/armas/slide_release_medium_02.ogg +0 -0
  220. package/assets/sfx/armas/slide_release_medium_03.ogg +0 -0
  221. package/assets/sfx/armas/slide_release_medium_04.ogg +0 -0
  222. package/assets/sfx/armas/sniper_338_300wm_close_01.ogg +0 -0
  223. package/assets/sfx/armas/sniper_338_300wm_close_02.ogg +0 -0
  224. package/assets/sfx/armas/sniper_338_300wm_close_03.ogg +0 -0
  225. package/assets/sfx/armas/sniper_338_300wm_close_04.ogg +0 -0
  226. package/assets/sfx/armas/sniper_338_300wm_close_05.ogg +0 -0
  227. package/assets/sfx/armas/sniper_338_300wm_close_06.ogg +0 -0
  228. package/assets/sfx/armas/sniper_338_300wm_close_07.ogg +0 -0
  229. package/assets/sfx/armas/sniper_338_300wm_far_01.ogg +0 -0
  230. package/assets/sfx/armas/sniper_338_300wm_far_02.ogg +0 -0
  231. package/assets/sfx/armas/sniper_338_300wm_far_03.ogg +0 -0
  232. package/assets/sfx/armas/sniper_338_300wm_far_04.ogg +0 -0
  233. package/assets/sfx/armas/sniper_338_300wm_far_05.ogg +0 -0
  234. package/assets/sfx/armas/sniper_338_300wm_far_06.ogg +0 -0
  235. package/assets/sfx/armas/speedloader_light_01.ogg +0 -0
  236. package/assets/sfx/armas/speedloader_light_02.ogg +0 -0
  237. package/assets/sfx/armas/speedloader_light_03.ogg +0 -0
  238. package/assets/sfx/armas/speedloader_light_04.ogg +0 -0
  239. package/assets/sfx/armas/speedloader_light_05.ogg +0 -0
  240. package/assets/sfx/armas/speedloader_light_06.ogg +0 -0
  241. package/assets/sfx/armas/speedloader_light_07.ogg +0 -0
  242. package/assets/sfx/armas/speedloader_light_08.ogg +0 -0
  243. package/assets/sfx/armas/suppressed_pistol_close_01.ogg +0 -0
  244. package/assets/sfx/armas/suppressed_pistol_close_02.ogg +0 -0
  245. package/assets/sfx/armas/suppressed_pistol_close_03.ogg +0 -0
  246. package/assets/sfx/armas/suppressed_pistol_close_04.ogg +0 -0
  247. package/assets/sfx/armas/suppressed_pistol_close_05.ogg +0 -0
  248. package/assets/sfx/armas/suppressed_pistol_far_01.ogg +0 -0
  249. package/assets/sfx/armas/suppressed_pistol_far_02.ogg +0 -0
  250. package/assets/sfx/armas/suppressed_pistol_far_03.ogg +0 -0
  251. package/assets/sfx/armas/suppressed_pistol_far_04.ogg +0 -0
  252. package/assets/sfx/armas/suppressed_pistol_far_05.ogg +0 -0
  253. package/assets/sfx/armas/suppressed_rifle_close_01.ogg +0 -0
  254. package/assets/sfx/armas/suppressed_rifle_close_02.ogg +0 -0
  255. package/assets/sfx/armas/suppressed_rifle_close_03.ogg +0 -0
  256. package/assets/sfx/armas/suppressed_rifle_close_04.ogg +0 -0
  257. package/assets/sfx/armas/suppressed_rifle_far_01.ogg +0 -0
  258. package/assets/sfx/armas/suppressed_rifle_far_02.ogg +0 -0
  259. package/assets/sfx/armas/suppressed_rifle_far_03.ogg +0 -0
  260. package/assets/sfx/armas/suppressed_rifle_far_04.ogg +0 -0
  261. package/assets/sfx/explosoes-fogo/debris_rain_mixed_01.ogg +0 -0
  262. package/assets/sfx/explosoes-fogo/debris_rain_mixed_02.ogg +0 -0
  263. package/assets/sfx/explosoes-fogo/debris_rain_mixed_03.ogg +0 -0
  264. package/assets/sfx/explosoes-fogo/debris_rain_mixed_04.ogg +0 -0
  265. package/assets/sfx/explosoes-fogo/debris_rain_mixed_05.ogg +0 -0
  266. package/assets/sfx/explosoes-fogo/debris_rain_mixed_06.ogg +0 -0
  267. package/assets/sfx/explosoes-fogo/debris_rain_mixed_07.ogg +0 -0
  268. package/assets/sfx/explosoes-fogo/debris_rain_stone_01.ogg +0 -0
  269. package/assets/sfx/explosoes-fogo/debris_rain_stone_02.ogg +0 -0
  270. package/assets/sfx/explosoes-fogo/debris_rain_stone_03.ogg +0 -0
  271. package/assets/sfx/explosoes-fogo/debris_rain_stone_04.ogg +0 -0
  272. package/assets/sfx/explosoes-fogo/debris_rain_stone_05.ogg +0 -0
  273. package/assets/sfx/explosoes-fogo/debris_rain_stone_06.ogg +0 -0
  274. package/assets/sfx/explosoes-fogo/debris_rain_stone_07.ogg +0 -0
  275. package/assets/sfx/explosoes-fogo/debris_rain_stone_08.ogg +0 -0
  276. package/assets/sfx/explosoes-fogo/debris_rain_stone_09.ogg +0 -0
  277. package/assets/sfx/explosoes-fogo/explosion_big_01.ogg +0 -0
  278. package/assets/sfx/explosoes-fogo/explosion_big_02.ogg +0 -0
  279. package/assets/sfx/explosoes-fogo/explosion_big_03.ogg +0 -0
  280. package/assets/sfx/explosoes-fogo/explosion_big_04.ogg +0 -0
  281. package/assets/sfx/explosoes-fogo/explosion_big_05.ogg +0 -0
  282. package/assets/sfx/explosoes-fogo/explosion_car_01.ogg +0 -0
  283. package/assets/sfx/explosoes-fogo/explosion_car_02.ogg +0 -0
  284. package/assets/sfx/explosoes-fogo/explosion_car_03.ogg +0 -0
  285. package/assets/sfx/explosoes-fogo/explosion_car_04.ogg +0 -0
  286. package/assets/sfx/explosoes-fogo/explosion_far_close_01.ogg +0 -0
  287. package/assets/sfx/explosoes-fogo/explosion_far_close_02.ogg +0 -0
  288. package/assets/sfx/explosoes-fogo/explosion_far_close_03.ogg +0 -0
  289. package/assets/sfx/explosoes-fogo/explosion_far_close_04.ogg +0 -0
  290. package/assets/sfx/explosoes-fogo/explosion_flashbang_01.ogg +0 -0
  291. package/assets/sfx/explosoes-fogo/explosion_flashbang_02.ogg +0 -0
  292. package/assets/sfx/explosoes-fogo/explosion_grenade_01.ogg +0 -0
  293. package/assets/sfx/explosoes-fogo/explosion_grenade_02.ogg +0 -0
  294. package/assets/sfx/explosoes-fogo/explosion_grenade_03.ogg +0 -0
  295. package/assets/sfx/explosoes-fogo/explosion_grenade_04.ogg +0 -0
  296. package/assets/sfx/explosoes-fogo/explosion_grenade_05.ogg +0 -0
  297. package/assets/sfx/explosoes-fogo/explosion_grenade_06.ogg +0 -0
  298. package/assets/sfx/explosoes-fogo/explosion_small_bang_01.ogg +0 -0
  299. package/assets/sfx/explosoes-fogo/explosion_small_bang_02.ogg +0 -0
  300. package/assets/sfx/explosoes-fogo/explosion_small_bang_03.ogg +0 -0
  301. package/assets/sfx/explosoes-fogo/explosion_small_bang_04.ogg +0 -0
  302. package/assets/sfx/explosoes-fogo/explosion_small_bang_05.ogg +0 -0
  303. package/assets/sfx/explosoes-fogo/explosion_small_bang_06.ogg +0 -0
  304. package/assets/sfx/explosoes-fogo/explosion_small_bang_07.ogg +0 -0
  305. package/assets/sfx/explosoes-fogo/explosion_small_bang_08.ogg +0 -0
  306. package/assets/sfx/explosoes-fogo/explosion_small_bang_09.ogg +0 -0
  307. package/assets/sfx/explosoes-fogo/explosion_small_bang_10.ogg +0 -0
  308. package/assets/sfx/explosoes-fogo/fire_crackle_01.ogg +0 -0
  309. package/assets/sfx/explosoes-fogo/fire_crackle_02.ogg +0 -0
  310. package/assets/sfx/explosoes-fogo/fire_crackle_03.ogg +0 -0
  311. package/assets/sfx/explosoes-fogo/fire_crackle_05.ogg +0 -0
  312. package/assets/sfx/explosoes-fogo/fire_crackle_07.ogg +0 -0
  313. package/assets/sfx/explosoes-fogo/fire_extinguish_01.ogg +0 -0
  314. package/assets/sfx/explosoes-fogo/fire_extinguish_02.ogg +0 -0
  315. package/assets/sfx/explosoes-fogo/fire_ignite_01.ogg +0 -0
  316. package/assets/sfx/explosoes-fogo/fire_ignite_02.ogg +0 -0
  317. package/assets/sfx/explosoes-fogo/fire_ignite_03.ogg +0 -0
  318. package/assets/sfx/explosoes-fogo/fire_ignite_04.ogg +0 -0
  319. package/assets/sfx/explosoes-fogo/fire_loop_01.ogg +0 -0
  320. package/assets/sfx/explosoes-fogo/fire_loop_03.ogg +0 -0
  321. package/assets/sfx/explosoes-fogo/fire_loop_04.ogg +0 -0
  322. package/assets/sfx/explosoes-fogo/fire_loop_gas_01.ogg +0 -0
  323. package/assets/sfx/explosoes-fogo/fire_loop_gas_02.ogg +0 -0
  324. package/assets/sfx/explosoes-fogo/fire_loop_gas_03.ogg +0 -0
  325. package/assets/sfx/explosoes-fogo/fire_loop_gas_04.ogg +0 -0
  326. package/assets/sfx/explosoes-fogo/fire_loop_liquid_01.ogg +0 -0
  327. package/assets/sfx/explosoes-fogo/fire_loop_liquid_02.ogg +0 -0
  328. package/assets/sfx/explosoes-fogo/fire_loop_liquid_03.ogg +0 -0
  329. package/assets/sfx/explosoes-fogo/fire_loop_plastic_01.ogg +0 -0
  330. package/assets/sfx/explosoes-fogo/fire_loop_plastic_02.ogg +0 -0
  331. package/assets/sfx/explosoes-fogo/fire_loop_plastic_03.ogg +0 -0
  332. package/assets/sfx/explosoes-fogo/fire_loop_plastic_04.ogg +0 -0
  333. package/assets/sfx/explosoes-fogo/fire_loop_small_01.ogg +0 -0
  334. package/assets/sfx/explosoes-fogo/fire_pop_01.ogg +0 -0
  335. package/assets/sfx/explosoes-fogo/fire_pop_02.ogg +0 -0
  336. package/assets/sfx/explosoes-fogo/fire_pop_03.ogg +0 -0
  337. package/assets/sfx/explosoes-fogo/flamethrower_loop_01.ogg +0 -0
  338. package/assets/sfx/explosoes-fogo/gas_leak_01.ogg +0 -0
  339. package/assets/sfx/explosoes-fogo/molotov_break_ignite_01.ogg +0 -0
  340. package/assets/sfx/explosoes-fogo/molotov_break_ignite_02.ogg +0 -0
  341. package/assets/sfx/impactos/ceramic_hit_close_01.ogg +0 -0
  342. package/assets/sfx/impactos/concrete_block_drag_close_01.ogg +0 -0
  343. package/assets/sfx/impactos/concrete_block_drag_close_02.ogg +0 -0
  344. package/assets/sfx/impactos/concrete_block_drag_close_03.ogg +0 -0
  345. package/assets/sfx/impactos/concrete_block_drag_close_04.ogg +0 -0
  346. package/assets/sfx/impactos/concrete_block_drag_close_05.ogg +0 -0
  347. package/assets/sfx/impactos/concrete_block_drag_close_06.ogg +0 -0
  348. package/assets/sfx/impactos/concrete_block_drag_close_07.ogg +0 -0
  349. package/assets/sfx/impactos/crack_close_01.ogg +0 -0
  350. package/assets/sfx/impactos/crack_close_02.ogg +0 -0
  351. package/assets/sfx/impactos/crack_close_03.ogg +0 -0
  352. package/assets/sfx/impactos/crack_close_04.ogg +0 -0
  353. package/assets/sfx/impactos/crack_close_05.ogg +0 -0
  354. package/assets/sfx/impactos/crack_close_06.ogg +0 -0
  355. package/assets/sfx/impactos/crack_close_07.ogg +0 -0
  356. package/assets/sfx/impactos/crack_close_08.ogg +0 -0
  357. package/assets/sfx/impactos/crack_close_09.ogg +0 -0
  358. package/assets/sfx/impactos/crack_close_10.ogg +0 -0
  359. package/assets/sfx/impactos/crumble_close_01.ogg +0 -0
  360. package/assets/sfx/impactos/crumble_close_02.ogg +0 -0
  361. package/assets/sfx/impactos/crumble_close_03.ogg +0 -0
  362. package/assets/sfx/impactos/crumble_close_04.ogg +0 -0
  363. package/assets/sfx/impactos/crumble_close_05.ogg +0 -0
  364. package/assets/sfx/impactos/flesh_fruit_splat_close_01.ogg +0 -0
  365. package/assets/sfx/impactos/flesh_fruit_splat_close_02.ogg +0 -0
  366. package/assets/sfx/impactos/flesh_fruit_splat_close_03.ogg +0 -0
  367. package/assets/sfx/impactos/furniture_push_wood_close_01.ogg +0 -0
  368. package/assets/sfx/impactos/glass_blunt_heavy_close_01.ogg +0 -0
  369. package/assets/sfx/impactos/glass_blunt_heavy_close_02.ogg +0 -0
  370. package/assets/sfx/impactos/glass_blunt_heavy_close_03.ogg +0 -0
  371. package/assets/sfx/impactos/glass_blunt_heavy_close_04.ogg +0 -0
  372. package/assets/sfx/impactos/glass_blunt_heavy_close_05.ogg +0 -0
  373. package/assets/sfx/impactos/glass_blunt_light_close_01.ogg +0 -0
  374. package/assets/sfx/impactos/glass_blunt_light_close_02.ogg +0 -0
  375. package/assets/sfx/impactos/glass_blunt_light_close_03.ogg +0 -0
  376. package/assets/sfx/impactos/glass_blunt_light_close_04.ogg +0 -0
  377. package/assets/sfx/impactos/glass_blunt_light_close_05.ogg +0 -0
  378. package/assets/sfx/impactos/glass_blunt_medium_close_01.ogg +0 -0
  379. package/assets/sfx/impactos/glass_blunt_medium_close_02.ogg +0 -0
  380. package/assets/sfx/impactos/glass_blunt_medium_close_03.ogg +0 -0
  381. package/assets/sfx/impactos/glass_blunt_medium_close_04.ogg +0 -0
  382. package/assets/sfx/impactos/glass_blunt_medium_close_05.ogg +0 -0
  383. package/assets/sfx/impactos/glass_bottle_break_close_01.ogg +0 -0
  384. package/assets/sfx/impactos/glass_debris_fall_close_01.ogg +0 -0
  385. package/assets/sfx/impactos/glass_debris_fall_close_02.ogg +0 -0
  386. package/assets/sfx/impactos/glass_debris_fall_close_03.ogg +0 -0
  387. package/assets/sfx/impactos/glass_debris_fall_close_04.ogg +0 -0
  388. package/assets/sfx/impactos/glass_shatter_close_01.ogg +0 -0
  389. package/assets/sfx/impactos/glass_shatter_close_02.ogg +0 -0
  390. package/assets/sfx/impactos/glass_shatter_close_03.ogg +0 -0
  391. package/assets/sfx/impactos/glass_shatter_close_04.ogg +0 -0
  392. package/assets/sfx/impactos/glass_shatter_close_05.ogg +0 -0
  393. package/assets/sfx/impactos/glass_shatter_close_06.ogg +0 -0
  394. package/assets/sfx/impactos/glass_shatter_close_07.ogg +0 -0
  395. package/assets/sfx/impactos/glass_shatter_close_08.ogg +0 -0
  396. package/assets/sfx/impactos/glass_shatter_close_09.ogg +0 -0
  397. package/assets/sfx/impactos/gravel_hit_close_21.ogg +0 -0
  398. package/assets/sfx/impactos/gravel_hit_close_22.ogg +0 -0
  399. package/assets/sfx/impactos/gravel_hit_close_23.ogg +0 -0
  400. package/assets/sfx/impactos/gravel_hit_close_24.ogg +0 -0
  401. package/assets/sfx/impactos/gravel_hit_close_25.ogg +0 -0
  402. package/assets/sfx/impactos/gravel_hit_close_26.ogg +0 -0
  403. package/assets/sfx/impactos/gravel_hit_close_27.ogg +0 -0
  404. package/assets/sfx/impactos/gravel_hit_close_28.ogg +0 -0
  405. package/assets/sfx/impactos/gravel_hit_close_29.ogg +0 -0
  406. package/assets/sfx/impactos/impact_generic_light_close_01.ogg +0 -0
  407. package/assets/sfx/impactos/impact_generic_light_close_02.ogg +0 -0
  408. package/assets/sfx/impactos/impact_generic_light_close_03.ogg +0 -0
  409. package/assets/sfx/impactos/impact_generic_light_close_04.ogg +0 -0
  410. package/assets/sfx/impactos/impact_generic_light_close_05.ogg +0 -0
  411. package/assets/sfx/impactos/masonry_blunt_close_01.ogg +0 -0
  412. package/assets/sfx/impactos/masonry_blunt_close_02.ogg +0 -0
  413. package/assets/sfx/impactos/masonry_blunt_close_03.ogg +0 -0
  414. package/assets/sfx/impactos/masonry_blunt_close_04.ogg +0 -0
  415. package/assets/sfx/impactos/masonry_blunt_close_05.ogg +0 -0
  416. package/assets/sfx/impactos/masonry_blunt_close_06.ogg +0 -0
  417. package/assets/sfx/impactos/masonry_blunt_close_07.ogg +0 -0
  418. package/assets/sfx/impactos/masonry_bullet_close_01.ogg +0 -0
  419. package/assets/sfx/impactos/masonry_bullet_close_02.ogg +0 -0
  420. package/assets/sfx/impactos/masonry_bullet_close_03.ogg +0 -0
  421. package/assets/sfx/impactos/masonry_bullet_close_04.ogg +0 -0
  422. package/assets/sfx/impactos/masonry_bullet_close_05.ogg +0 -0
  423. package/assets/sfx/impactos/masonry_bullet_close_21.ogg +0 -0
  424. package/assets/sfx/impactos/masonry_bullet_close_22.ogg +0 -0
  425. package/assets/sfx/impactos/masonry_bullet_close_23.ogg +0 -0
  426. package/assets/sfx/impactos/masonry_bullet_close_24.ogg +0 -0
  427. package/assets/sfx/impactos/masonry_bullet_close_25.ogg +0 -0
  428. package/assets/sfx/impactos/masonry_bullet_close_26.ogg +0 -0
  429. package/assets/sfx/impactos/masonry_bullet_close_27.ogg +0 -0
  430. package/assets/sfx/impactos/masonry_bullet_close_28.ogg +0 -0
  431. package/assets/sfx/impactos/metal_blunt_close_01.ogg +0 -0
  432. package/assets/sfx/impactos/metal_blunt_close_02.ogg +0 -0
  433. package/assets/sfx/impactos/metal_blunt_close_03.ogg +0 -0
  434. package/assets/sfx/impactos/metal_blunt_close_04.ogg +0 -0
  435. package/assets/sfx/impactos/metal_blunt_close_05.ogg +0 -0
  436. package/assets/sfx/impactos/metal_blunt_heavy_close_01.ogg +0 -0
  437. package/assets/sfx/impactos/metal_blunt_heavy_close_02.ogg +0 -0
  438. package/assets/sfx/impactos/metal_blunt_heavy_close_03.ogg +0 -0
  439. package/assets/sfx/impactos/metal_blunt_heavy_close_04.ogg +0 -0
  440. package/assets/sfx/impactos/metal_blunt_heavy_close_05.ogg +0 -0
  441. package/assets/sfx/impactos/metal_blunt_light_close_01.ogg +0 -0
  442. package/assets/sfx/impactos/metal_blunt_light_close_02.ogg +0 -0
  443. package/assets/sfx/impactos/metal_blunt_light_close_03.ogg +0 -0
  444. package/assets/sfx/impactos/metal_blunt_light_close_04.ogg +0 -0
  445. package/assets/sfx/impactos/metal_blunt_light_close_05.ogg +0 -0
  446. package/assets/sfx/impactos/metal_blunt_medium_close_01.ogg +0 -0
  447. package/assets/sfx/impactos/metal_blunt_medium_close_02.ogg +0 -0
  448. package/assets/sfx/impactos/metal_blunt_medium_close_03.ogg +0 -0
  449. package/assets/sfx/impactos/metal_blunt_medium_close_04.ogg +0 -0
  450. package/assets/sfx/impactos/metal_blunt_medium_close_05.ogg +0 -0
  451. package/assets/sfx/impactos/metal_bullet_close_01.ogg +0 -0
  452. package/assets/sfx/impactos/metal_bullet_close_02.ogg +0 -0
  453. package/assets/sfx/impactos/metal_bullet_close_03.ogg +0 -0
  454. package/assets/sfx/impactos/metal_bullet_close_04.ogg +0 -0
  455. package/assets/sfx/impactos/metal_bullet_close_05.ogg +0 -0
  456. package/assets/sfx/impactos/metal_bullet_close_06.ogg +0 -0
  457. package/assets/sfx/impactos/metal_bullet_close_21.ogg +0 -0
  458. package/assets/sfx/impactos/metal_bullet_close_22.ogg +0 -0
  459. package/assets/sfx/impactos/metal_bullet_close_23.ogg +0 -0
  460. package/assets/sfx/impactos/metal_bullet_close_24.ogg +0 -0
  461. package/assets/sfx/impactos/metal_bullet_close_25.ogg +0 -0
  462. package/assets/sfx/impactos/metal_bullet_close_26.ogg +0 -0
  463. package/assets/sfx/impactos/metal_bullet_close_27.ogg +0 -0
  464. package/assets/sfx/impactos/metal_bullet_close_28.ogg +0 -0
  465. package/assets/sfx/impactos/metal_bullet_close_29.ogg +0 -0
  466. package/assets/sfx/impactos/metal_bullet_close_30.ogg +0 -0
  467. package/assets/sfx/impactos/metal_bullet_close_31.ogg +0 -0
  468. package/assets/sfx/impactos/metal_bullet_close_32.ogg +0 -0
  469. package/assets/sfx/impactos/metal_bullet_close_33.ogg +0 -0
  470. package/assets/sfx/impactos/metal_bullet_close_34.ogg +0 -0
  471. package/assets/sfx/impactos/metal_fall_close_01.ogg +0 -0
  472. package/assets/sfx/impactos/metal_fall_close_02.ogg +0 -0
  473. package/assets/sfx/impactos/metal_fall_close_03.ogg +0 -0
  474. package/assets/sfx/impactos/metal_fall_close_04.ogg +0 -0
  475. package/assets/sfx/impactos/metal_fall_close_05.ogg +0 -0
  476. package/assets/sfx/impactos/metal_fall_close_06.ogg +0 -0
  477. package/assets/sfx/impactos/metal_fall_close_07.ogg +0 -0
  478. package/assets/sfx/impactos/metal_fall_close_08.ogg +0 -0
  479. package/assets/sfx/impactos/metal_fall_close_09.ogg +0 -0
  480. package/assets/sfx/impactos/metal_fall_close_10.ogg +0 -0
  481. package/assets/sfx/impactos/metal_thin_close_01.ogg +0 -0
  482. package/assets/sfx/impactos/metal_thin_close_02.ogg +0 -0
  483. package/assets/sfx/impactos/metal_thin_close_03.ogg +0 -0
  484. package/assets/sfx/impactos/metal_thin_close_04.ogg +0 -0
  485. package/assets/sfx/impactos/metal_thin_close_05.ogg +0 -0
  486. package/assets/sfx/impactos/metal_thin_close_06.ogg +0 -0
  487. package/assets/sfx/impactos/metal_thin_close_07.ogg +0 -0
  488. package/assets/sfx/impactos/metal_thin_close_08.ogg +0 -0
  489. package/assets/sfx/impactos/metal_thin_close_09.ogg +0 -0
  490. package/assets/sfx/impactos/metal_thin_close_10.ogg +0 -0
  491. package/assets/sfx/impactos/metal_thin_close_11.ogg +0 -0
  492. package/assets/sfx/impactos/metal_thin_close_12.ogg +0 -0
  493. package/assets/sfx/impactos/metal_thin_close_13.ogg +0 -0
  494. package/assets/sfx/impactos/metal_thin_close_14.ogg +0 -0
  495. package/assets/sfx/impactos/metal_thin_close_15.ogg +0 -0
  496. package/assets/sfx/impactos/metal_thin_close_16.ogg +0 -0
  497. package/assets/sfx/impactos/metal_thin_close_17.ogg +0 -0
  498. package/assets/sfx/impactos/metal_thin_close_18.ogg +0 -0
  499. package/assets/sfx/impactos/metal_thin_close_19.ogg +0 -0
  500. package/assets/sfx/impactos/metal_thin_close_20.ogg +0 -0
  501. package/assets/sfx/impactos/metal_thin_close_21.ogg +0 -0
  502. package/assets/sfx/impactos/metal_thin_close_22.ogg +0 -0
  503. package/assets/sfx/impactos/metal_thin_close_23.ogg +0 -0
  504. package/assets/sfx/impactos/metal_thin_close_24.ogg +0 -0
  505. package/assets/sfx/impactos/metal_thin_close_25.ogg +0 -0
  506. package/assets/sfx/impactos/metal_thin_close_26.ogg +0 -0
  507. package/assets/sfx/impactos/paper_tear_close_01.ogg +0 -0
  508. package/assets/sfx/impactos/paper_tear_close_02.ogg +0 -0
  509. package/assets/sfx/impactos/plastic_hit_close_01.ogg +0 -0
  510. package/assets/sfx/impactos/plastic_hit_close_02.ogg +0 -0
  511. package/assets/sfx/impactos/plastic_hit_close_03.ogg +0 -0
  512. package/assets/sfx/impactos/plastic_hit_close_04.ogg +0 -0
  513. package/assets/sfx/impactos/ricochet_metal_close_21.ogg +0 -0
  514. package/assets/sfx/impactos/ricochet_metal_close_22.ogg +0 -0
  515. package/assets/sfx/impactos/ricochet_metal_close_23.ogg +0 -0
  516. package/assets/sfx/impactos/ricochet_metal_close_24.ogg +0 -0
  517. package/assets/sfx/impactos/ricochet_metal_close_25.ogg +0 -0
  518. package/assets/sfx/impactos/ricochet_metal_close_26.ogg +0 -0
  519. package/assets/sfx/impactos/ricochet_metal_close_27.ogg +0 -0
  520. package/assets/sfx/impactos/ricochet_metal_close_28.ogg +0 -0
  521. package/assets/sfx/impactos/rubble_falling_close_01.ogg +0 -0
  522. package/assets/sfx/impactos/rubble_falling_close_02.ogg +0 -0
  523. package/assets/sfx/impactos/rubble_falling_close_03.ogg +0 -0
  524. package/assets/sfx/impactos/rubble_falling_close_04.ogg +0 -0
  525. package/assets/sfx/impactos/rubble_falling_close_05.ogg +0 -0
  526. package/assets/sfx/impactos/rubble_falling_close_06.ogg +0 -0
  527. package/assets/sfx/impactos/rubble_falling_close_07.ogg +0 -0
  528. package/assets/sfx/impactos/rubble_falling_close_08.ogg +0 -0
  529. package/assets/sfx/impactos/rubble_falling_close_09.ogg +0 -0
  530. package/assets/sfx/impactos/soft_bullet_close_01.ogg +0 -0
  531. package/assets/sfx/impactos/soft_bullet_close_02.ogg +0 -0
  532. package/assets/sfx/impactos/soft_bullet_close_03.ogg +0 -0
  533. package/assets/sfx/impactos/soft_bullet_close_04.ogg +0 -0
  534. package/assets/sfx/impactos/soft_bullet_close_05.ogg +0 -0
  535. package/assets/sfx/impactos/soft_bullet_close_06.ogg +0 -0
  536. package/assets/sfx/impactos/soft_bullet_close_07.ogg +0 -0
  537. package/assets/sfx/impactos/soft_bullet_close_08.ogg +0 -0
  538. package/assets/sfx/impactos/soft_bullet_close_09.ogg +0 -0
  539. package/assets/sfx/impactos/soft_bullet_close_10.ogg +0 -0
  540. package/assets/sfx/impactos/soil_bullet_close_21.ogg +0 -0
  541. package/assets/sfx/impactos/soil_bullet_close_22.ogg +0 -0
  542. package/assets/sfx/impactos/soil_bullet_close_23.ogg +0 -0
  543. package/assets/sfx/impactos/wood_blunt_heavy_close_01.ogg +0 -0
  544. package/assets/sfx/impactos/wood_blunt_heavy_close_02.ogg +0 -0
  545. package/assets/sfx/impactos/wood_blunt_heavy_close_03.ogg +0 -0
  546. package/assets/sfx/impactos/wood_blunt_heavy_close_04.ogg +0 -0
  547. package/assets/sfx/impactos/wood_blunt_heavy_close_05.ogg +0 -0
  548. package/assets/sfx/impactos/wood_blunt_light_close_01.ogg +0 -0
  549. package/assets/sfx/impactos/wood_blunt_light_close_02.ogg +0 -0
  550. package/assets/sfx/impactos/wood_blunt_light_close_03.ogg +0 -0
  551. package/assets/sfx/impactos/wood_blunt_light_close_04.ogg +0 -0
  552. package/assets/sfx/impactos/wood_blunt_light_close_05.ogg +0 -0
  553. package/assets/sfx/impactos/wood_blunt_medium_close_01.ogg +0 -0
  554. package/assets/sfx/impactos/wood_blunt_medium_close_02.ogg +0 -0
  555. package/assets/sfx/impactos/wood_blunt_medium_close_03.ogg +0 -0
  556. package/assets/sfx/impactos/wood_blunt_medium_close_04.ogg +0 -0
  557. package/assets/sfx/impactos/wood_blunt_medium_close_05.ogg +0 -0
  558. package/assets/sfx/impactos/wood_fall_close_01.ogg +0 -0
  559. package/assets/sfx/impactos/wood_fall_close_02.ogg +0 -0
  560. package/assets/sfx/impactos/wood_fall_close_03.ogg +0 -0
  561. package/assets/sfx/impactos/wood_fall_close_04.ogg +0 -0
  562. package/assets/sfx/impactos/wood_fall_close_05.ogg +0 -0
  563. package/assets/sfx/impactos/wood_fall_close_06.ogg +0 -0
  564. package/assets/sfx/impactos/wood_fall_close_07.ogg +0 -0
  565. package/assets/sfx/impactos/wood_fall_close_08.ogg +0 -0
  566. package/assets/sfx/impactos/wood_fall_close_09.ogg +0 -0
  567. package/assets/sfx/impactos/wood_hit_close_01.ogg +0 -0
  568. package/assets/sfx/impactos/wood_hit_close_02.ogg +0 -0
  569. package/assets/sfx/impactos/wood_hit_close_03.ogg +0 -0
  570. package/assets/sfx/impactos/wood_hit_close_04.ogg +0 -0
  571. package/assets/sfx/impactos/wood_hit_close_05.ogg +0 -0
  572. package/assets/sfx/impactos/wood_hit_close_06.ogg +0 -0
  573. package/assets/sfx/impactos/wood_hit_close_07.ogg +0 -0
  574. package/assets/sfx/impactos/wood_hit_close_08.ogg +0 -0
  575. package/assets/sfx/impactos/wood_hit_close_09.ogg +0 -0
  576. package/assets/sfx/impactos/wood_hit_close_10.ogg +0 -0
  577. package/assets/sfx/impactos/wood_hit_close_11.ogg +0 -0
  578. package/assets/sfx/impactos/wood_hit_close_12.ogg +0 -0
  579. package/assets/sfx/impactos/wood_hit_close_13.ogg +0 -0
  580. package/assets/sfx/impactos/wood_hit_close_14.ogg +0 -0
  581. package/assets/sfx/impactos/wood_hit_close_21.ogg +0 -0
  582. package/assets/sfx/impactos/wood_hit_close_22.ogg +0 -0
  583. package/assets/sfx/impactos/wood_hit_close_23.ogg +0 -0
  584. package/assets/sfx/impactos/wood_hit_close_24.ogg +0 -0
  585. package/assets/sfx/impactos/wood_hit_close_25.ogg +0 -0
  586. package/assets/sfx/impactos/wood_hit_close_26.ogg +0 -0
  587. package/assets/sfx/impactos/wood_hit_close_27.ogg +0 -0
  588. package/assets/sfx/itens-portas/backpack_open_shut_01.ogg +0 -0
  589. package/assets/sfx/itens-portas/backpack_open_shut_02.ogg +0 -0
  590. package/assets/sfx/itens-portas/backpack_open_shut_03.ogg +0 -0
  591. package/assets/sfx/itens-portas/backpack_open_shut_04.ogg +0 -0
  592. package/assets/sfx/itens-portas/backpack_open_shut_05.ogg +0 -0
  593. package/assets/sfx/itens-portas/backpack_open_shut_06.ogg +0 -0
  594. package/assets/sfx/itens-portas/book_open_shut_01.ogg +0 -0
  595. package/assets/sfx/itens-portas/book_open_shut_02.ogg +0 -0
  596. package/assets/sfx/itens-portas/book_open_shut_03.ogg +0 -0
  597. package/assets/sfx/itens-portas/book_open_shut_04.ogg +0 -0
  598. package/assets/sfx/itens-portas/book_open_shut_05.ogg +0 -0
  599. package/assets/sfx/itens-portas/book_open_shut_06.ogg +0 -0
  600. package/assets/sfx/itens-portas/book_open_shut_07.ogg +0 -0
  601. package/assets/sfx/itens-portas/book_open_shut_08.ogg +0 -0
  602. package/assets/sfx/itens-portas/book_open_shut_09.ogg +0 -0
  603. package/assets/sfx/itens-portas/book_open_shut_10.ogg +0 -0
  604. package/assets/sfx/itens-portas/book_open_shut_11.ogg +0 -0
  605. package/assets/sfx/itens-portas/door_creak_01.ogg +0 -0
  606. package/assets/sfx/itens-portas/door_creak_02.ogg +0 -0
  607. package/assets/sfx/itens-portas/door_creak_03.ogg +0 -0
  608. package/assets/sfx/itens-portas/door_creak_06.ogg +0 -0
  609. package/assets/sfx/itens-portas/door_creak_07.ogg +0 -0
  610. package/assets/sfx/itens-portas/door_glass_sliding_01.ogg +0 -0
  611. package/assets/sfx/itens-portas/door_glass_sliding_02.ogg +0 -0
  612. package/assets/sfx/itens-portas/door_glass_sliding_03.ogg +0 -0
  613. package/assets/sfx/itens-portas/door_glass_sliding_04.ogg +0 -0
  614. package/assets/sfx/itens-portas/door_knock_01.ogg +0 -0
  615. package/assets/sfx/itens-portas/door_lock_unlock_01.ogg +0 -0
  616. package/assets/sfx/itens-portas/door_lock_unlock_02.ogg +0 -0
  617. package/assets/sfx/itens-portas/door_lock_unlock_03.ogg +0 -0
  618. package/assets/sfx/itens-portas/door_lock_unlock_04.ogg +0 -0
  619. package/assets/sfx/itens-portas/door_lock_unlock_05.ogg +0 -0
  620. package/assets/sfx/itens-portas/door_lock_unlock_06.ogg +0 -0
  621. package/assets/sfx/itens-portas/door_lock_unlock_07.ogg +0 -0
  622. package/assets/sfx/itens-portas/door_lock_unlock_08.ogg +0 -0
  623. package/assets/sfx/itens-portas/door_lock_unlock_09.ogg +0 -0
  624. package/assets/sfx/itens-portas/door_lock_unlock_10.ogg +0 -0
  625. package/assets/sfx/itens-portas/door_lock_unlock_11.ogg +0 -0
  626. package/assets/sfx/itens-portas/door_locked_rattle_01.ogg +0 -0
  627. package/assets/sfx/itens-portas/door_locked_rattle_02.ogg +0 -0
  628. package/assets/sfx/itens-portas/door_locked_rattle_03.ogg +0 -0
  629. package/assets/sfx/itens-portas/door_metal_open_shut_01.ogg +0 -0
  630. package/assets/sfx/itens-portas/door_metal_open_shut_02.ogg +0 -0
  631. package/assets/sfx/itens-portas/door_metal_open_shut_03.ogg +0 -0
  632. package/assets/sfx/itens-portas/door_metal_open_shut_04.ogg +0 -0
  633. package/assets/sfx/itens-portas/door_metal_open_shut_05.ogg +0 -0
  634. package/assets/sfx/itens-portas/door_metal_open_shut_06.ogg +0 -0
  635. package/assets/sfx/itens-portas/door_metal_open_shut_07.ogg +0 -0
  636. package/assets/sfx/itens-portas/door_slam_wood_01.ogg +0 -0
  637. package/assets/sfx/itens-portas/door_slam_wood_02.ogg +0 -0
  638. package/assets/sfx/itens-portas/door_slam_wood_03.ogg +0 -0
  639. package/assets/sfx/itens-portas/door_slam_wood_04.ogg +0 -0
  640. package/assets/sfx/itens-portas/door_wood_open_01.ogg +0 -0
  641. package/assets/sfx/itens-portas/door_wood_open_02.ogg +0 -0
  642. package/assets/sfx/itens-portas/door_wood_open_03.ogg +0 -0
  643. package/assets/sfx/itens-portas/door_wood_open_04.ogg +0 -0
  644. package/assets/sfx/itens-portas/door_wood_shut_01.ogg +0 -0
  645. package/assets/sfx/itens-portas/door_wood_shut_02.ogg +0 -0
  646. package/assets/sfx/itens-portas/door_wood_shut_03.ogg +0 -0
  647. package/assets/sfx/itens-portas/door_wood_shut_04.ogg +0 -0
  648. package/assets/sfx/itens-portas/door_wood_shut_05.ogg +0 -0
  649. package/assets/sfx/itens-portas/door_wood_shut_06.ogg +0 -0
  650. package/assets/sfx/itens-portas/door_wood_shut_07.ogg +0 -0
  651. package/assets/sfx/itens-portas/door_wood_shut_08.ogg +0 -0
  652. package/assets/sfx/itens-portas/drawer_open_01.ogg +0 -0
  653. package/assets/sfx/itens-portas/drawer_open_02.ogg +0 -0
  654. package/assets/sfx/itens-portas/drawer_shut_01.ogg +0 -0
  655. package/assets/sfx/itens-portas/drawer_shut_02.ogg +0 -0
  656. package/assets/sfx/itens-portas/item_drop_bag_01.ogg +0 -0
  657. package/assets/sfx/itens-portas/item_drop_bag_02.ogg +0 -0
  658. package/assets/sfx/itens-portas/item_drop_glass_01.ogg +0 -0
  659. package/assets/sfx/itens-portas/item_drop_metal_01.ogg +0 -0
  660. package/assets/sfx/itens-portas/item_drop_metal_02.ogg +0 -0
  661. package/assets/sfx/itens-portas/item_drop_metal_03.ogg +0 -0
  662. package/assets/sfx/itens-portas/item_drop_metal_04.ogg +0 -0
  663. package/assets/sfx/itens-portas/item_drop_metal_05.ogg +0 -0
  664. package/assets/sfx/itens-portas/item_drop_paper_01.ogg +0 -0
  665. package/assets/sfx/itens-portas/item_pickup_coins_01.ogg +0 -0
  666. package/assets/sfx/itens-portas/item_pickup_coins_02.ogg +0 -0
  667. package/assets/sfx/itens-portas/item_pickup_generic_01.ogg +0 -0
  668. package/assets/sfx/itens-portas/item_pickup_generic_02.ogg +0 -0
  669. package/assets/sfx/itens-portas/item_pickup_generic_03.ogg +0 -0
  670. package/assets/sfx/itens-portas/item_pickup_generic_04.ogg +0 -0
  671. package/assets/sfx/itens-portas/item_pickup_leather_01.ogg +0 -0
  672. package/assets/sfx/itens-portas/item_pickup_leather_02.ogg +0 -0
  673. package/assets/sfx/itens-portas/item_pickup_leather_03.ogg +0 -0
  674. package/assets/sfx/itens-portas/item_pickup_leather_04.ogg +0 -0
  675. package/assets/sfx/itens-portas/item_pickup_leather_05.ogg +0 -0
  676. package/assets/sfx/itens-portas/item_setdown_01.ogg +0 -0
  677. package/assets/sfx/itens-portas/item_setdown_02.ogg +0 -0
  678. package/assets/sfx/itens-portas/keys_jingle_01.ogg +0 -0
  679. package/assets/sfx/itens-portas/keys_jingle_02.ogg +0 -0
  680. package/assets/sfx/itens-portas/keys_jingle_03.ogg +0 -0
  681. package/assets/sfx/itens-portas/keys_jingle_04.ogg +0 -0
  682. package/assets/sfx/itens-portas/keys_jingle_05.ogg +0 -0
  683. package/assets/sfx/itens-portas/keys_jingle_06.ogg +0 -0
  684. package/assets/sfx/itens-portas/keys_jingle_07.ogg +0 -0
  685. package/assets/sfx/itens-portas/lever_pull_01.ogg +0 -0
  686. package/assets/sfx/itens-portas/lever_pull_02.ogg +0 -0
  687. package/assets/sfx/itens-portas/lever_pull_03.ogg +0 -0
  688. package/assets/sfx/itens-portas/lever_pull_04.ogg +0 -0
  689. package/assets/sfx/itens-portas/lever_pull_05.ogg +0 -0
  690. package/assets/sfx/itens-portas/lever_pull_06.ogg +0 -0
  691. package/assets/sfx/itens-portas/metal_latch_01.ogg +0 -0
  692. package/assets/sfx/itens-portas/metal_latch_02.ogg +0 -0
  693. package/assets/sfx/itens-portas/plates_hit_01.ogg +0 -0
  694. package/assets/sfx/itens-portas/plates_hit_02.ogg +0 -0
  695. package/assets/sfx/itens-portas/plates_hit_03.ogg +0 -0
  696. package/assets/sfx/itens-portas/plates_hit_04.ogg +0 -0
  697. package/assets/sfx/itens-portas/plates_hit_05.ogg +0 -0
  698. package/assets/sfx/itens-portas/plates_hit_06.ogg +0 -0
  699. package/assets/sfx/itens-portas/plates_hit_07.ogg +0 -0
  700. package/assets/sfx/itens-portas/plates_hit_08.ogg +0 -0
  701. package/assets/sfx/itens-portas/plates_hit_09.ogg +0 -0
  702. package/assets/sfx/itens-portas/plates_hit_10.ogg +0 -0
  703. package/assets/sfx/itens-portas/plates_slide_01.ogg +0 -0
  704. package/assets/sfx/itens-portas/plates_slide_02.ogg +0 -0
  705. package/assets/sfx/itens-portas/plates_slide_03.ogg +0 -0
  706. package/assets/sfx/itens-portas/plates_slide_04.ogg +0 -0
  707. package/assets/sfx/itens-portas/saw_wood_01.ogg +0 -0
  708. package/assets/sfx/itens-portas/switch_click_01.ogg +0 -0
  709. package/assets/sfx/itens-portas/switch_click_02.ogg +0 -0
  710. package/assets/sfx/itens-portas/switch_click_03.ogg +0 -0
  711. package/assets/sfx/itens-portas/switch_click_04.ogg +0 -0
  712. package/assets/sfx/itens-portas/toilet_flush_01.ogg +0 -0
  713. package/assets/sfx/itens-portas/tools_handling_01.ogg +0 -0
  714. package/assets/sfx/itens-portas/tools_handling_02.ogg +0 -0
  715. package/assets/sfx/itens-portas/tools_handling_03.ogg +0 -0
  716. package/assets/sfx/itens-portas/tools_handling_04.ogg +0 -0
  717. package/assets/sfx/itens-portas/tools_handling_05.ogg +0 -0
  718. package/assets/sfx/itens-portas/tools_handling_06.ogg +0 -0
  719. package/assets/sfx/itens-portas/tools_handling_07.ogg +0 -0
  720. package/assets/sfx/itens-portas/tools_handling_08.ogg +0 -0
  721. package/assets/sfx/itens-portas/tools_handling_09.ogg +0 -0
  722. package/assets/sfx/itens-portas/tools_handling_10.ogg +0 -0
  723. package/assets/sfx/itens-portas/tools_handling_11.ogg +0 -0
  724. package/assets/sfx/itens-portas/tools_handling_12.ogg +0 -0
  725. package/assets/sfx/itens-portas/tools_handling_13.ogg +0 -0
  726. package/assets/sfx/itens-portas/tools_handling_14.ogg +0 -0
  727. package/assets/sfx/itens-portas/tools_handling_15.ogg +0 -0
  728. package/assets/sfx/itens-portas/tools_handling_16.ogg +0 -0
  729. package/assets/sfx/itens-portas/water_drip_01.ogg +0 -0
  730. package/assets/sfx/itens-portas/water_drip_02.ogg +0 -0
  731. package/assets/sfx/itens-portas/water_drip_03.ogg +0 -0
  732. package/assets/sfx/itens-portas/water_drip_04.ogg +0 -0
  733. package/assets/sfx/itens-portas/water_faucet_01.ogg +0 -0
  734. package/assets/sfx/itens-portas/water_faucet_02.ogg +0 -0
  735. package/assets/sfx/itens-portas/water_faucet_03.ogg +0 -0
  736. package/assets/sfx/itens-portas/water_faucet_04.ogg +0 -0
  737. package/assets/sfx/itens-portas/water_faucet_05.ogg +0 -0
  738. package/assets/sfx/itens-portas/water_faucet_06.ogg +0 -0
  739. package/assets/sfx/itens-portas/water_faucet_07.ogg +0 -0
  740. package/assets/sfx/itens-portas/water_faucet_08.ogg +0 -0
  741. package/assets/sfx/itens-portas/water_faucet_09.ogg +0 -0
  742. package/assets/sfx/itens-portas/water_faucet_10.ogg +0 -0
  743. package/assets/sfx/manifest.json +12093 -0
  744. package/assets/sfx/personagem/axe_chop_01.ogg +0 -0
  745. package/assets/sfx/personagem/axe_chop_02.ogg +0 -0
  746. package/assets/sfx/personagem/blunt_hit_metal_01.ogg +0 -0
  747. package/assets/sfx/personagem/blunt_hit_metal_02.ogg +0 -0
  748. package/assets/sfx/personagem/blunt_hit_metal_03.ogg +0 -0
  749. package/assets/sfx/personagem/blunt_hit_metal_04.ogg +0 -0
  750. package/assets/sfx/personagem/blunt_hit_metal_05.ogg +0 -0
  751. package/assets/sfx/personagem/body_fall_01.ogg +0 -0
  752. package/assets/sfx/personagem/body_fall_02.ogg +0 -0
  753. package/assets/sfx/personagem/body_fall_03.ogg +0 -0
  754. package/assets/sfx/personagem/body_fall_04.ogg +0 -0
  755. package/assets/sfx/personagem/body_fall_05.ogg +0 -0
  756. package/assets/sfx/personagem/cloth_rustle_01.ogg +0 -0
  757. package/assets/sfx/personagem/cloth_rustle_02.ogg +0 -0
  758. package/assets/sfx/personagem/cloth_rustle_03.ogg +0 -0
  759. package/assets/sfx/personagem/cloth_rustle_04.ogg +0 -0
  760. package/assets/sfx/personagem/cloth_rustle_05.ogg +0 -0
  761. package/assets/sfx/personagem/cloth_rustle_06.ogg +0 -0
  762. package/assets/sfx/personagem/cloth_rustle_07.ogg +0 -0
  763. package/assets/sfx/personagem/cloth_rustle_08.ogg +0 -0
  764. package/assets/sfx/personagem/cloth_rustle_09.ogg +0 -0
  765. package/assets/sfx/personagem/cloth_rustle_10.ogg +0 -0
  766. package/assets/sfx/personagem/cloth_rustle_11.ogg +0 -0
  767. package/assets/sfx/personagem/cloth_rustle_12.ogg +0 -0
  768. package/assets/sfx/personagem/cloth_rustle_13.ogg +0 -0
  769. package/assets/sfx/personagem/cloth_rustle_14.ogg +0 -0
  770. package/assets/sfx/personagem/drink_gulp_01.ogg +0 -0
  771. package/assets/sfx/personagem/drink_gulp_02.ogg +0 -0
  772. package/assets/sfx/personagem/drink_gulp_03.ogg +0 -0
  773. package/assets/sfx/personagem/footstep_carpet_alt_01.ogg +0 -0
  774. package/assets/sfx/personagem/footstep_carpet_alt_02.ogg +0 -0
  775. package/assets/sfx/personagem/footstep_carpet_alt_03.ogg +0 -0
  776. package/assets/sfx/personagem/footstep_carpet_alt_04.ogg +0 -0
  777. package/assets/sfx/personagem/footstep_carpet_alt_05.ogg +0 -0
  778. package/assets/sfx/personagem/footstep_concrete_alt_01.ogg +0 -0
  779. package/assets/sfx/personagem/footstep_concrete_alt_02.ogg +0 -0
  780. package/assets/sfx/personagem/footstep_concrete_alt_03.ogg +0 -0
  781. package/assets/sfx/personagem/footstep_concrete_alt_04.ogg +0 -0
  782. package/assets/sfx/personagem/footstep_concrete_alt_05.ogg +0 -0
  783. package/assets/sfx/personagem/footstep_concrete_run_01.ogg +0 -0
  784. package/assets/sfx/personagem/footstep_concrete_run_02.ogg +0 -0
  785. package/assets/sfx/personagem/footstep_concrete_run_03.ogg +0 -0
  786. package/assets/sfx/personagem/footstep_concrete_run_04.ogg +0 -0
  787. package/assets/sfx/personagem/footstep_concrete_run_05.ogg +0 -0
  788. package/assets/sfx/personagem/footstep_concrete_walk_01.ogg +0 -0
  789. package/assets/sfx/personagem/footstep_concrete_walk_02.ogg +0 -0
  790. package/assets/sfx/personagem/footstep_concrete_walk_03.ogg +0 -0
  791. package/assets/sfx/personagem/footstep_concrete_walk_04.ogg +0 -0
  792. package/assets/sfx/personagem/footstep_concrete_walk_05.ogg +0 -0
  793. package/assets/sfx/personagem/footstep_dirt_run_01.ogg +0 -0
  794. package/assets/sfx/personagem/footstep_dirt_run_02.ogg +0 -0
  795. package/assets/sfx/personagem/footstep_dirt_run_03.ogg +0 -0
  796. package/assets/sfx/personagem/footstep_dirt_run_04.ogg +0 -0
  797. package/assets/sfx/personagem/footstep_dirt_run_05.ogg +0 -0
  798. package/assets/sfx/personagem/footstep_dirt_walk_01.ogg +0 -0
  799. package/assets/sfx/personagem/footstep_dirt_walk_02.ogg +0 -0
  800. package/assets/sfx/personagem/footstep_dirt_walk_03.ogg +0 -0
  801. package/assets/sfx/personagem/footstep_dirt_walk_04.ogg +0 -0
  802. package/assets/sfx/personagem/footstep_dirt_walk_05.ogg +0 -0
  803. package/assets/sfx/personagem/footstep_generic_alt_01.ogg +0 -0
  804. package/assets/sfx/personagem/footstep_generic_alt_02.ogg +0 -0
  805. package/assets/sfx/personagem/footstep_generic_alt_03.ogg +0 -0
  806. package/assets/sfx/personagem/footstep_generic_alt_04.ogg +0 -0
  807. package/assets/sfx/personagem/footstep_generic_alt_05.ogg +0 -0
  808. package/assets/sfx/personagem/footstep_generic_alt_06.ogg +0 -0
  809. package/assets/sfx/personagem/footstep_generic_alt_07.ogg +0 -0
  810. package/assets/sfx/personagem/footstep_generic_alt_08.ogg +0 -0
  811. package/assets/sfx/personagem/footstep_generic_alt_09.ogg +0 -0
  812. package/assets/sfx/personagem/footstep_generic_alt_10.ogg +0 -0
  813. package/assets/sfx/personagem/footstep_grass_alt2_01.ogg +0 -0
  814. package/assets/sfx/personagem/footstep_grass_alt2_02.ogg +0 -0
  815. package/assets/sfx/personagem/footstep_grass_alt2_03.ogg +0 -0
  816. package/assets/sfx/personagem/footstep_grass_alt2_04.ogg +0 -0
  817. package/assets/sfx/personagem/footstep_grass_alt_01.ogg +0 -0
  818. package/assets/sfx/personagem/footstep_grass_alt_02.ogg +0 -0
  819. package/assets/sfx/personagem/footstep_grass_alt_03.ogg +0 -0
  820. package/assets/sfx/personagem/footstep_grass_alt_04.ogg +0 -0
  821. package/assets/sfx/personagem/footstep_grass_alt_05.ogg +0 -0
  822. package/assets/sfx/personagem/footstep_grass_run_01.ogg +0 -0
  823. package/assets/sfx/personagem/footstep_grass_run_02.ogg +0 -0
  824. package/assets/sfx/personagem/footstep_grass_run_03.ogg +0 -0
  825. package/assets/sfx/personagem/footstep_grass_run_04.ogg +0 -0
  826. package/assets/sfx/personagem/footstep_grass_run_05.ogg +0 -0
  827. package/assets/sfx/personagem/footstep_grass_walk_01.ogg +0 -0
  828. package/assets/sfx/personagem/footstep_grass_walk_02.ogg +0 -0
  829. package/assets/sfx/personagem/footstep_grass_walk_03.ogg +0 -0
  830. package/assets/sfx/personagem/footstep_grass_walk_04.ogg +0 -0
  831. package/assets/sfx/personagem/footstep_grass_walk_05.ogg +0 -0
  832. package/assets/sfx/personagem/footstep_hard_alt_01.ogg +0 -0
  833. package/assets/sfx/personagem/footstep_hard_alt_02.ogg +0 -0
  834. package/assets/sfx/personagem/footstep_hard_alt_03.ogg +0 -0
  835. package/assets/sfx/personagem/footstep_hard_alt_04.ogg +0 -0
  836. package/assets/sfx/personagem/footstep_hard_alt_05.ogg +0 -0
  837. package/assets/sfx/personagem/footstep_hard_alt_06.ogg +0 -0
  838. package/assets/sfx/personagem/footstep_hard_alt_07.ogg +0 -0
  839. package/assets/sfx/personagem/footstep_hard_alt_08.ogg +0 -0
  840. package/assets/sfx/personagem/footstep_hard_alt_09.ogg +0 -0
  841. package/assets/sfx/personagem/footstep_metal_run_01.ogg +0 -0
  842. package/assets/sfx/personagem/footstep_metal_run_02.ogg +0 -0
  843. package/assets/sfx/personagem/footstep_metal_run_03.ogg +0 -0
  844. package/assets/sfx/personagem/footstep_metal_run_04.ogg +0 -0
  845. package/assets/sfx/personagem/footstep_metal_run_05.ogg +0 -0
  846. package/assets/sfx/personagem/footstep_metal_walk_01.ogg +0 -0
  847. package/assets/sfx/personagem/footstep_metal_walk_02.ogg +0 -0
  848. package/assets/sfx/personagem/footstep_metal_walk_03.ogg +0 -0
  849. package/assets/sfx/personagem/footstep_metal_walk_04.ogg +0 -0
  850. package/assets/sfx/personagem/footstep_metal_walk_05.ogg +0 -0
  851. package/assets/sfx/personagem/footstep_snow_alt_01.ogg +0 -0
  852. package/assets/sfx/personagem/footstep_snow_alt_02.ogg +0 -0
  853. package/assets/sfx/personagem/footstep_snow_alt_03.ogg +0 -0
  854. package/assets/sfx/personagem/footstep_snow_alt_04.ogg +0 -0
  855. package/assets/sfx/personagem/footstep_snow_alt_05.ogg +0 -0
  856. package/assets/sfx/personagem/footstep_snow_run_01.ogg +0 -0
  857. package/assets/sfx/personagem/footstep_snow_run_02.ogg +0 -0
  858. package/assets/sfx/personagem/footstep_snow_run_03.ogg +0 -0
  859. package/assets/sfx/personagem/footstep_snow_run_04.ogg +0 -0
  860. package/assets/sfx/personagem/footstep_snow_run_05.ogg +0 -0
  861. package/assets/sfx/personagem/footstep_snow_walk_01.ogg +0 -0
  862. package/assets/sfx/personagem/footstep_snow_walk_02.ogg +0 -0
  863. package/assets/sfx/personagem/footstep_snow_walk_03.ogg +0 -0
  864. package/assets/sfx/personagem/footstep_snow_walk_04.ogg +0 -0
  865. package/assets/sfx/personagem/footstep_snow_walk_05.ogg +0 -0
  866. package/assets/sfx/personagem/footstep_wood_alt_01.ogg +0 -0
  867. package/assets/sfx/personagem/footstep_wood_alt_02.ogg +0 -0
  868. package/assets/sfx/personagem/footstep_wood_alt_03.ogg +0 -0
  869. package/assets/sfx/personagem/footstep_wood_alt_04.ogg +0 -0
  870. package/assets/sfx/personagem/footstep_wood_alt_05.ogg +0 -0
  871. package/assets/sfx/personagem/footstep_wood_run_01.ogg +0 -0
  872. package/assets/sfx/personagem/footstep_wood_run_02.ogg +0 -0
  873. package/assets/sfx/personagem/footstep_wood_run_03.ogg +0 -0
  874. package/assets/sfx/personagem/footstep_wood_run_04.ogg +0 -0
  875. package/assets/sfx/personagem/footstep_wood_run_05.ogg +0 -0
  876. package/assets/sfx/personagem/footstep_wood_walk_01.ogg +0 -0
  877. package/assets/sfx/personagem/footstep_wood_walk_02.ogg +0 -0
  878. package/assets/sfx/personagem/footstep_wood_walk_03.ogg +0 -0
  879. package/assets/sfx/personagem/footstep_wood_walk_04.ogg +0 -0
  880. package/assets/sfx/personagem/footstep_wood_walk_05.ogg +0 -0
  881. package/assets/sfx/personagem/frying_pan_hit_01.ogg +0 -0
  882. package/assets/sfx/personagem/frying_pan_hit_02.ogg +0 -0
  883. package/assets/sfx/personagem/frying_pan_hit_03.ogg +0 -0
  884. package/assets/sfx/personagem/grab_01.ogg +0 -0
  885. package/assets/sfx/personagem/kick_hit_01.ogg +0 -0
  886. package/assets/sfx/personagem/kick_hit_02.ogg +0 -0
  887. package/assets/sfx/personagem/kick_hit_03.ogg +0 -0
  888. package/assets/sfx/personagem/kick_hit_04.ogg +0 -0
  889. package/assets/sfx/personagem/kick_hit_05.ogg +0 -0
  890. package/assets/sfx/personagem/knife_draw_01.ogg +0 -0
  891. package/assets/sfx/personagem/knife_draw_02.ogg +0 -0
  892. package/assets/sfx/personagem/knife_draw_03.ogg +0 -0
  893. package/assets/sfx/personagem/knife_scrape_01.ogg +0 -0
  894. package/assets/sfx/personagem/knife_slash_01.ogg +0 -0
  895. package/assets/sfx/personagem/knife_slash_02.ogg +0 -0
  896. package/assets/sfx/personagem/land_concrete_01.ogg +0 -0
  897. package/assets/sfx/personagem/land_concrete_02.ogg +0 -0
  898. package/assets/sfx/personagem/land_dirt_01.ogg +0 -0
  899. package/assets/sfx/personagem/land_dirt_02.ogg +0 -0
  900. package/assets/sfx/personagem/land_grass_01.ogg +0 -0
  901. package/assets/sfx/personagem/land_grass_02.ogg +0 -0
  902. package/assets/sfx/personagem/land_metal_01.ogg +0 -0
  903. package/assets/sfx/personagem/land_metal_02.ogg +0 -0
  904. package/assets/sfx/personagem/land_snow_01.ogg +0 -0
  905. package/assets/sfx/personagem/land_snow_02.ogg +0 -0
  906. package/assets/sfx/personagem/land_wood_01.ogg +0 -0
  907. package/assets/sfx/personagem/land_wood_02.ogg +0 -0
  908. package/assets/sfx/personagem/player_breath_run_01.ogg +0 -0
  909. package/assets/sfx/personagem/player_breath_run_02.ogg +0 -0
  910. package/assets/sfx/personagem/player_breath_run_03.ogg +0 -0
  911. package/assets/sfx/personagem/player_breath_run_04.ogg +0 -0
  912. package/assets/sfx/personagem/player_breath_run_05.ogg +0 -0
  913. package/assets/sfx/personagem/player_death_female_01.ogg +0 -0
  914. package/assets/sfx/personagem/player_death_female_02.ogg +0 -0
  915. package/assets/sfx/personagem/player_death_female_03.ogg +0 -0
  916. package/assets/sfx/personagem/player_death_female_04.ogg +0 -0
  917. package/assets/sfx/personagem/player_death_female_05.ogg +0 -0
  918. package/assets/sfx/personagem/player_death_female_06.ogg +0 -0
  919. package/assets/sfx/personagem/player_death_female_07.ogg +0 -0
  920. package/assets/sfx/personagem/player_death_female_08.ogg +0 -0
  921. package/assets/sfx/personagem/player_death_male_01.ogg +0 -0
  922. package/assets/sfx/personagem/player_death_male_02.ogg +0 -0
  923. package/assets/sfx/personagem/player_death_male_03.ogg +0 -0
  924. package/assets/sfx/personagem/player_death_male_04.ogg +0 -0
  925. package/assets/sfx/personagem/player_death_male_05.ogg +0 -0
  926. package/assets/sfx/personagem/player_death_male_06.ogg +0 -0
  927. package/assets/sfx/personagem/player_death_male_07.ogg +0 -0
  928. package/assets/sfx/personagem/player_death_male_08.ogg +0 -0
  929. package/assets/sfx/personagem/player_effort_01.ogg +0 -0
  930. package/assets/sfx/personagem/player_effort_02.ogg +0 -0
  931. package/assets/sfx/personagem/player_effort_03.ogg +0 -0
  932. package/assets/sfx/personagem/player_effort_04.ogg +0 -0
  933. package/assets/sfx/personagem/player_hurt_female_01.ogg +0 -0
  934. package/assets/sfx/personagem/player_hurt_female_02.ogg +0 -0
  935. package/assets/sfx/personagem/player_hurt_female_03.ogg +0 -0
  936. package/assets/sfx/personagem/player_hurt_female_04.ogg +0 -0
  937. package/assets/sfx/personagem/player_hurt_female_05.ogg +0 -0
  938. package/assets/sfx/personagem/player_hurt_female_06.ogg +0 -0
  939. package/assets/sfx/personagem/player_hurt_male_01.ogg +0 -0
  940. package/assets/sfx/personagem/player_hurt_male_02.ogg +0 -0
  941. package/assets/sfx/personagem/player_hurt_male_03.ogg +0 -0
  942. package/assets/sfx/personagem/player_hurt_male_04.ogg +0 -0
  943. package/assets/sfx/personagem/player_hurt_male_05.ogg +0 -0
  944. package/assets/sfx/personagem/player_hurt_male_06.ogg +0 -0
  945. package/assets/sfx/personagem/punch_hit_alt_01.ogg +0 -0
  946. package/assets/sfx/personagem/punch_hit_alt_02.ogg +0 -0
  947. package/assets/sfx/personagem/punch_hit_alt_03.ogg +0 -0
  948. package/assets/sfx/personagem/punch_hit_alt_04.ogg +0 -0
  949. package/assets/sfx/personagem/punch_hit_alt_05.ogg +0 -0
  950. package/assets/sfx/personagem/punch_hit_alt_06.ogg +0 -0
  951. package/assets/sfx/personagem/punch_hit_alt_07.ogg +0 -0
  952. package/assets/sfx/personagem/punch_hit_alt_08.ogg +0 -0
  953. package/assets/sfx/personagem/punch_hit_alt_09.ogg +0 -0
  954. package/assets/sfx/personagem/punch_hit_alt_10.ogg +0 -0
  955. package/assets/sfx/personagem/punch_hit_body_01.ogg +0 -0
  956. package/assets/sfx/personagem/punch_hit_body_02.ogg +0 -0
  957. package/assets/sfx/personagem/punch_hit_body_03.ogg +0 -0
  958. package/assets/sfx/personagem/punch_hit_body_04.ogg +0 -0
  959. package/assets/sfx/personagem/punch_hit_body_05.ogg +0 -0
  960. package/assets/sfx/personagem/punch_hit_body_06.ogg +0 -0
  961. package/assets/sfx/personagem/punch_hit_face_01.ogg +0 -0
  962. package/assets/sfx/personagem/punch_hit_face_02.ogg +0 -0
  963. package/assets/sfx/personagem/punch_hit_face_03.ogg +0 -0
  964. package/assets/sfx/personagem/punch_hit_face_04.ogg +0 -0
  965. package/assets/sfx/personagem/punch_hit_face_05.ogg +0 -0
  966. package/assets/sfx/personagem/punch_swing_01.ogg +0 -0
  967. package/assets/sfx/personagem/punch_swing_02.ogg +0 -0
  968. package/assets/sfx/personagem/punch_swing_03.ogg +0 -0
  969. package/assets/sfx/personagem/punch_swing_04.ogg +0 -0
  970. package/assets/sfx/personagem/punch_swing_05.ogg +0 -0
  971. package/assets/sfx/personagem/punch_swing_06.ogg +0 -0
  972. package/assets/sfx/personagem/punch_swing_07.ogg +0 -0
  973. package/assets/sfx/personagem/punch_swing_08.ogg +0 -0
  974. package/assets/sfx/personagem/scream_01.ogg +0 -0
  975. package/assets/sfx/personagem/scream_02.ogg +0 -0
  976. package/assets/sfx/personagem/scream_03.ogg +0 -0
  977. package/assets/sfx/personagem/scream_04.ogg +0 -0
  978. package/assets/sfx/personagem/slap_01.ogg +0 -0
  979. package/assets/sfx/personagem/swing_whoosh_alt_01.ogg +0 -0
  980. package/assets/sfx/personagem/swing_whoosh_alt_02.ogg +0 -0
  981. package/assets/sfx/personagem/swing_whoosh_alt_03.ogg +0 -0
  982. package/assets/sfx/personagem/swing_whoosh_alt_04.ogg +0 -0
  983. package/assets/sfx/personagem/swing_whoosh_alt_05.ogg +0 -0
  984. package/assets/sfx/personagem/swing_whoosh_alt_06.ogg +0 -0
  985. package/assets/sfx/personagem/swing_whoosh_alt_07.ogg +0 -0
  986. package/assets/sfx/personagem/swing_whoosh_alt_08.ogg +0 -0
  987. package/assets/sfx/personagem/swing_whoosh_alt_09.ogg +0 -0
  988. package/assets/sfx/personagem/swing_whoosh_alt_10.ogg +0 -0
  989. package/assets/sfx/personagem/swing_whoosh_alt_11.ogg +0 -0
  990. package/assets/sfx/personagem/swing_whoosh_alt_12.ogg +0 -0
  991. package/assets/sfx/personagem/swing_whoosh_alt_13.ogg +0 -0
  992. package/assets/sfx/personagem/swing_whoosh_alt_14.ogg +0 -0
  993. package/assets/sfx/personagem/swing_whoosh_alt_15.ogg +0 -0
  994. package/assets/sfx/personagem/swing_whoosh_alt_16.ogg +0 -0
  995. package/assets/sfx/personagem/swing_whoosh_alt_17.ogg +0 -0
  996. package/assets/sfx/personagem/swing_whoosh_alt_18.ogg +0 -0
  997. package/assets/sfx/personagem/swing_whoosh_alt_19.ogg +0 -0
  998. package/assets/sfx/personagem/swing_whoosh_alt_20.ogg +0 -0
  999. package/assets/sfx/personagem/swing_whoosh_alt_21.ogg +0 -0
  1000. package/assets/sfx/personagem/swing_whoosh_alt_22.ogg +0 -0
  1001. package/assets/sfx/personagem/swing_whoosh_alt_23.ogg +0 -0
  1002. package/assets/sfx/personagem/swing_whoosh_alt_24.ogg +0 -0
  1003. package/assets/sfx/personagem/swing_whoosh_alt_25.ogg +0 -0
  1004. package/assets/sfx/personagem/swing_whoosh_alt_26.ogg +0 -0
  1005. package/assets/sfx/personagem/swing_whoosh_alt_27.ogg +0 -0
  1006. package/assets/sfx/personagem/swing_whoosh_alt_28.ogg +0 -0
  1007. package/assets/sfx/personagem/swing_whoosh_alt_29.ogg +0 -0
  1008. package/assets/sfx/personagem/swing_whoosh_alt_30.ogg +0 -0
  1009. package/assets/sfx/personagem/swing_whoosh_alt_31.ogg +0 -0
  1010. package/assets/sfx/personagem/swing_whoosh_alt_32.ogg +0 -0
  1011. package/assets/sfx/personagem/swing_whoosh_alt_33.ogg +0 -0
  1012. package/assets/sfx/personagem/swing_whoosh_alt_34.ogg +0 -0
  1013. package/assets/sfx/personagem/swing_whoosh_alt_35.ogg +0 -0
  1014. package/assets/sfx/personagem/swing_whoosh_alt_36.ogg +0 -0
  1015. package/assets/sfx/personagem/swing_whoosh_alt_37.ogg +0 -0
  1016. package/assets/sfx/personagem/swing_whoosh_alt_38.ogg +0 -0
  1017. package/assets/sfx/personagem/swing_whoosh_alt_39.ogg +0 -0
  1018. package/assets/sfx/personagem/swing_whoosh_alt_40.ogg +0 -0
  1019. package/assets/sfx/personagem/swing_whoosh_alt_41.ogg +0 -0
  1020. package/assets/sfx/personagem/swing_whoosh_alt_42.ogg +0 -0
  1021. package/assets/sfx/personagem/swing_whoosh_alt_43.ogg +0 -0
  1022. package/assets/sfx/personagem/zombie_creature_01.ogg +0 -0
  1023. package/assets/sfx/personagem/zombie_creature_02.ogg +0 -0
  1024. package/assets/sfx/personagem/zombie_creature_03.ogg +0 -0
  1025. package/assets/sfx/personagem/zombie_death_01.ogg +0 -0
  1026. package/assets/sfx/personagem/zombie_death_02.ogg +0 -0
  1027. package/assets/sfx/personagem/zombie_death_03.ogg +0 -0
  1028. package/assets/sfx/personagem/zombie_death_04.ogg +0 -0
  1029. package/assets/sfx/personagem/zombie_death_05.ogg +0 -0
  1030. package/assets/sfx/personagem/zombie_death_06.ogg +0 -0
  1031. package/assets/sfx/personagem/zombie_death_07.ogg +0 -0
  1032. package/assets/sfx/personagem/zombie_death_08.ogg +0 -0
  1033. package/assets/sfx/personagem/zombie_groan_01.ogg +0 -0
  1034. package/assets/sfx/personagem/zombie_groan_02.ogg +0 -0
  1035. package/assets/sfx/personagem/zombie_groan_03.ogg +0 -0
  1036. package/assets/sfx/personagem/zombie_groan_04.ogg +0 -0
  1037. package/assets/sfx/personagem/zombie_groan_05.ogg +0 -0
  1038. package/assets/sfx/personagem/zombie_groan_06.ogg +0 -0
  1039. package/assets/sfx/personagem/zombie_groan_07.ogg +0 -0
  1040. package/assets/sfx/personagem/zombie_groan_08.ogg +0 -0
  1041. package/assets/sfx/personagem/zombie_groan_09.ogg +0 -0
  1042. package/assets/sfx/personagem/zombie_groan_10.ogg +0 -0
  1043. package/assets/sfx/personagem/zombie_groan_11.ogg +0 -0
  1044. package/assets/sfx/veiculos/car_door_open_01.ogg +0 -0
  1045. package/assets/sfx/veiculos/car_door_shut_01.ogg +0 -0
  1046. package/assets/sfx/veiculos/car_gear_shift_01.ogg +0 -0
  1047. package/assets/sfx/veiculos/car_trunk_shut_01.ogg +0 -0
  1048. package/assets/sfx/veiculos/car_window_01.ogg +0 -0
  1049. package/assets/sfx/veiculos/car_window_02.ogg +0 -0
  1050. package/assets/sfx/veiculos/engine_loop_car_high_01.ogg +0 -0
  1051. package/assets/sfx/veiculos/engine_loop_car_idle_01.ogg +0 -0
  1052. package/assets/sfx/veiculos/engine_start_run_stop_01.ogg +0 -0
  1053. package/assets/sfx/veiculos/engine_start_run_stop_02.ogg +0 -0
  1054. package/dist/chunk-KBTUANNG.js +4429 -0
  1055. package/dist/chunk-KBTUANNG.js.map +1 -0
  1056. package/dist/index.d.ts +153 -3
  1057. package/dist/index.global.js +3423 -1112
  1058. package/dist/index.global.js.map +1 -1
  1059. package/dist/index.js +842 -6
  1060. package/dist/index.js.map +1 -1
  1061. package/dist/locale-CJfDpWnI.d.ts +1250 -0
  1062. package/dist/testing.d.ts +84 -2
  1063. package/dist/testing.js +11 -3
  1064. package/package.json +10 -6
  1065. package/dist/chunk-DZITVFMJ.js +0 -2235
  1066. package/dist/chunk-DZITVFMJ.js.map +0 -1
  1067. package/dist/testing-BZQid7h0.d.ts +0 -653
@@ -1,2235 +0,0 @@
1
- // src/falloff.ts
2
- var DISTANCE_CURVES = {
3
- /** The game's `sfx`: `vol / (1 + d² × 0.004)`, cutoff `/ (1 + d × 0.01)`, silent below 0.01 (jogo L62091–62092, L62101). */
4
- game_sfx: { model: "inverse_square", k: 4e-3, cutoffK: 0.01, minGain: 0.01 },
5
- /** The game's `grito`: `1 / (1 + d² × 0.006)`, silent below 0.02 (jogo L62129–62130). */
6
- game_scream: { model: "inverse_square", k: 6e-3, minGain: 0.02 },
7
- /** The game's `voz`: `1 / (1 + d² × 0.01)`, silent below 0.02 (jogo L62146–62147). */
8
- game_voice: { model: "inverse_square", k: 0.01, minGain: 0.02 },
9
- /** The game's `boom`: `1.4 / (1 + d² × 0.002)`, never silent (jogo L68280). */
10
- game_boom: { model: "inverse_square", k: 2e-3, scale: 1.4 },
11
- /** The art scene's `outAt`: `vol / (1 + d² × 0.008)` (cena L1320). */
12
- art_scene: { model: "inverse_square", k: 8e-3 },
13
- /** The game's animal calls: `max(0, 1 − d / 70) × 0.25`, silent at or below 0.005 (jogo L66627–66628). */
14
- animals: { model: "linear", range: 70, scale: 0.25, minGain: 5e-3 }
15
- };
16
- function falloffGain(falloff, volume, distance) {
17
- if (!falloff || falloff.model === "none") return volume;
18
- if (falloff.model === "linear") {
19
- const level2 = Math.max(0, 1 - distance / falloff.range) * volume;
20
- return falloff.scale === void 0 ? level2 : level2 * falloff.scale;
21
- }
22
- const level = volume / (1 + distance * distance * falloff.k);
23
- return falloff.scale === void 0 ? level : falloff.scale * level;
24
- }
25
- function isSilent(falloff, gain) {
26
- if (!falloff || falloff.model === "none" || falloff.minGain === void 0) return false;
27
- return falloff.model === "linear" ? gain <= falloff.minGain : gain < falloff.minGain;
28
- }
29
- function cutoffDivisor(falloff, distance) {
30
- if (!falloff || falloff.model !== "inverse_square" || falloff.cutoffK === void 0) return 1;
31
- return 1 + distance * falloff.cutoffK;
32
- }
33
-
34
- // src/data/game-sfx.json
35
- var game_sfx_default = {
36
- sources: ["jogo:L62089-62107"],
37
- note: "The game's sfx table P: [lowpass cutoff Hz, peak gain, seconds]. Played as a noise burst with the game's distance curve (falloff game_sfx) and a 0.05 s tail. Team names in `team`.",
38
- classes: [
39
- { id: "pistol", team: "pistola", bus: "weapons", cutoff: 1800, gain: 0.9, seconds: 0.18 },
40
- { id: "shotgun", team: "escopeta", bus: "weapons", cutoff: 900, gain: 1.2, seconds: 0.35 },
41
- { id: "rifle", team: "fuzil", bus: "weapons", cutoff: 1400, gain: 1.1, seconds: 0.28 },
42
- { id: "long_rifle", team: "rifle", bus: "weapons", cutoff: 1100, gain: 1.3, seconds: 0.45 },
43
- { id: "impact", team: "impacto", bus: "world", cutoff: 2500, gain: 0.25, seconds: 0.05 },
44
- { id: "flesh", team: "carne", bus: "world", cutoff: 600, gain: 0.35, seconds: 0.08 },
45
- { id: "step", team: "passo", bus: "world", cutoff: 400, gain: 0.08, seconds: 0.05 },
46
- { id: "glass", team: "vidro", bus: "world", cutoff: 5e3, gain: 0.5, seconds: 0.3 },
47
- { id: "wood", team: "madeira", bus: "world", cutoff: 700, gain: 0.5, seconds: 0.2 },
48
- { id: "reload", team: "recarga", bus: "weapons", cutoff: 3e3, gain: 0.15, seconds: 0.06 },
49
- { id: "empty", team: "vazio", bus: "weapons", cutoff: 4e3, gain: 0.12, seconds: 0.03 },
50
- { id: "explosion", team: "explosao", bus: "world", cutoff: 200, gain: 1.6, seconds: 1.4 }
51
- ],
52
- fallback: { id: "unknown", team: "(any other name)", bus: "world", cutoff: 1e3, gain: 0.5, seconds: 0.1 }
53
- };
54
-
55
- // src/recipes/noise-class.ts
56
- var GAME_SFX = game_sfx_default;
57
- var GAME_SFX_CLASSES = GAME_SFX.classes;
58
- var GAME_SFX_FALLBACK = GAME_SFX.fallback;
59
- function noiseClassRecipe(row, id = `sfx_${row.id}`) {
60
- return {
61
- id,
62
- bus: row.bus,
63
- order: "burst",
64
- duration: row.seconds,
65
- tail: 0.05,
66
- layers: [
67
- {
68
- source: { kind: "noise", offset: "random" },
69
- filters: { mode: "serial", bank: [{ type: "lowpass", frequency: { set: row.cutoff } }] },
70
- envelope: [
71
- [0, row.gain, "set"],
72
- ["1d", 1e-3, "exp", "fixed"]
73
- ]
74
- }
75
- ],
76
- falloff: DISTANCE_CURVES.game_sfx,
77
- sources: [...GAME_SFX.sources.map((source) => `${source} ${row.team}`)]
78
- };
79
- }
80
- var GAME_SFX_BANK = { id: "game_sfx", sounds: [...GAME_SFX_CLASSES, GAME_SFX_FALLBACK].map((row) => noiseClassRecipe(row)) };
81
-
82
- // src/library/crowd_rumble.json
83
- var crowd_rumble_default = {
84
- id: "crowd_rumble",
85
- bus: "ambience",
86
- order: "game_loop",
87
- source: { kind: "noise", loop: true },
88
- filters: { mode: "serial", bank: [{ type: "lowpass", frequency: { set: 160 } }] },
89
- smoothing: { volume: 0.15, frequency: 0.08 },
90
- startAbove: 2e-3,
91
- sources: ["jogo:L62116 horda: noise through a 160 Hz lowpass", "jogo:L70424 level min(0.16, near \xD7 0.0016)", "temporary home until the crowd package (Q12)"]
92
- };
93
-
94
- // src/library/engine_saw.json
95
- var engine_saw_default = {
96
- id: "engine_saw",
97
- bus: "world",
98
- order: "game_loop",
99
- source: { kind: "osc", wave: "sawtooth", loop: true },
100
- filters: { mode: "serial", bank: [{ type: "lowpass", frequency: { set: 400 } }] },
101
- smoothing: { volume: 0.15, frequency: 0.08 },
102
- startAbove: 2e-3,
103
- sources: [
104
- "jogo:L62115 motor: sawtooth through a 400 Hz lowpass",
105
- "jogo:L70421 level 0.035 + speed \xD7 0.003, frequency 38 + speed \xD7 7 (the host drives `set`)",
106
- "temporary home until the vehicles package (Q12)"
107
- ]
108
- };
109
-
110
- // src/library/horn.json
111
- var horn_default = {
112
- id: "horn",
113
- bus: "world",
114
- order: "chord",
115
- duration: 0.6,
116
- tail: 0.02,
117
- layers: [
118
- { source: { kind: "osc", wave: "square", frequency: { set: 415 } }, envelope: [[0, 0.08, "set"], [0.6, 1e-4, "set", "fixed"]] },
119
- { source: { kind: "osc", wave: "square", frequency: { set: 523 } }, envelope: [[0, 0.08, "set"], [0.6, 1e-4, "set", "fixed"]] }
120
- ],
121
- falloff: { model: "none" },
122
- sources: ["jogo:L70272-70276 buzina: squares at 415 and 523 Hz, 0.08 for 0.6 s", "temporary home until the vehicles package (Q12)"]
123
- };
124
-
125
- // src/library/radio_static.json
126
- var radio_static_default = {
127
- id: "radio_static",
128
- bus: "world",
129
- order: "static",
130
- duration: 0.6,
131
- layers: [
132
- {
133
- source: { kind: "noise", offset: "random" },
134
- filters: { mode: "serial", bank: [{ type: "bandpass", frequency: { set: 1800 }, q: 0.8 }] },
135
- envelope: [[0, 0.06, "set"], ["1d", 1e-3, "exp", "fixed"]]
136
- }
137
- ],
138
- falloff: { model: "none" },
139
- sources: ["jogo:L69998-70004 chiado: noise through a 1800 Hz bandpass (Q 0.8), 0.06 falling over 0.6 s", "temporary home until the props or radio package (Q12)"]
140
- };
141
-
142
- // src/library/rotor_blades.json
143
- var rotor_blades_default = {
144
- id: "rotor_blades",
145
- bus: "world",
146
- order: "game_loop",
147
- source: { kind: "noise", loop: true },
148
- filters: { mode: "serial", bank: [{ type: "lowpass", frequency: { set: 300 } }] },
149
- modulators: [{ target: "gain", rate: 11, depth: 0.5, base: 0.5 }],
150
- smoothing: { volume: 0.15, frequency: 0.08 },
151
- startAbove: 2e-3,
152
- sources: [
153
- "jogo:L62116-62120 rotor: noise through a 300 Hz lowpass, blade beat as an 11 Hz LFO of 0.5 on a 0.5 gain stage",
154
- "jogo:L70426 level min(0.5, 30 / (distance + 10))",
155
- "temporary home until the vehicles package (Q12)"
156
- ]
157
- };
158
-
159
- // src/library/siren.json
160
- var siren_default = {
161
- id: "siren",
162
- bus: "world",
163
- order: "siren",
164
- duration: 9,
165
- tail: 0.2,
166
- layers: [
167
- {
168
- wet: 1.5,
169
- source: { kind: "osc", wave: "sine", frequency: { set: 850 } },
170
- modulators: [{ target: "frequency", rate: 0.18, depth: 280 }],
171
- filters: { mode: "serial", bank: [{ type: "lowpass", frequency: { set: 1400 } }] },
172
- envelope: [[0, 1e-4, "set", "fixed"], [2, 0.035, "exp"], [6, 0.035, "set"], [9, 1e-4, "exp", "fixed"]]
173
- }
174
- ],
175
- falloff: { model: "none" },
176
- sources: ["cena:L1369 siren: 850 Hz sine swept \xB1280 Hz at 0.18 Hz, 1400 Hz lowpass, 0.035 for 9 s, reverb send 1.5", "temporary home until the vehicles package (Q12)"]
177
- };
178
-
179
- // src/library/index.ts
180
- var LIBRARY_SOUNDS = [horn_default, radio_static_default, siren_default];
181
- var LIBRARY_LOOPS = [engine_saw_default, rotor_blades_default, crowd_rumble_default];
182
- var LIBRARY_BANK = { id: "library", sounds: LIBRARY_SOUNDS, loops: LIBRARY_LOOPS };
183
-
184
- // src/data/mix-profiles.json
185
- var mix_profiles_default = [
186
- {
187
- id: "game",
188
- master: 0.5,
189
- noise: { seconds: 1.5, create: "lazy" },
190
- sources: ["jogo:L62077-62081 master 0.5 to the output", "jogo:L62082-62088 noise 1.5 s made by the first sound that needs it"]
191
- },
192
- {
193
- id: "art_scene",
194
- master: 0.85,
195
- compressor: { threshold: -12, ratio: 5 },
196
- reverb: { seconds: 2.2, decay: 3.4, wet: 0.4 },
197
- noise: { seconds: 2, create: "eager" },
198
- sources: [
199
- "cena:L1308 compressor -12 dB, ratio 5",
200
- "cena:L1309 master 0.85",
201
- "cena:L1310 convolver, impulse 2.2 s of (1 - i/len)^3.4",
202
- "cena:L1311 wet 0.4",
203
- "cena:L1312 noise 2 s made with the chain"
204
- ]
205
- }
206
- ];
207
-
208
- // src/mix.ts
209
- var MIX_PROFILES = Object.fromEntries(
210
- mix_profiles_default.map((profile) => [profile.id, profile])
211
- );
212
- var DEFAULT_MIX = "art_scene";
213
- function resolveMix(mix, profiles = MIX_PROFILES) {
214
- if (typeof mix !== "string") return mix;
215
- const profile = profiles[mix];
216
- if (!profile) throw new Error(`game-audio: unknown mix profile "${mix}" (known: ${Object.keys(profiles).join(", ")})`);
217
- return profile;
218
- }
219
- function busGain(setting) {
220
- if (!setting) return 1;
221
- return setting.muted ? 0 : setting.gain ?? 1;
222
- }
223
-
224
- // src/recipe.ts
225
- var BUS_IDS = ["weapons", "voices", "world", "ambience", "weather", "ui"];
226
- var BUILD_ORDERS = ["layered", "burst", "scream", "groan", "boom", "static", "chord", "calls", "siren", "weapon"];
227
-
228
- // src/data/voice-groups.json
229
- var voice_groups_default = {
230
- undead_voice: {
231
- maxConcurrent: 5,
232
- cooldown: 0.25,
233
- maxDistance: 40,
234
- sources: [
235
- "cena:L1342 `AU.groans > 4` refuses, so five play at once",
236
- "jogo:L66986 one groan every 0.25 s (`groanBudget`), only nearer than 40 m",
237
- "jogo:L70472 the budget counts down by the frame time"
238
- ]
239
- }
240
- };
241
-
242
- // src/voices.ts
243
- var VOICE_GROUPS = voice_groups_default;
244
- var BUS_PRIORITY = { ui: 5, weapons: 4, voices: 3, world: 2, weather: 1, ambience: 1 };
245
- var DEFAULT_MAX_VOICES = 32;
246
- function busPriority(bus) {
247
- return BUS_PRIORITY[bus];
248
- }
249
- function createVoiceManager(options = {}) {
250
- const groups = new Map(Object.entries(options.groups ?? VOICE_GROUPS));
251
- const maxVoices = options.maxVoices ?? DEFAULT_MAX_VOICES;
252
- const budgets = /* @__PURE__ */ new Map();
253
- let voices = [];
254
- let nextId = 1;
255
- let peak = 0;
256
- let dropped = 0;
257
- const refuse = (reason) => {
258
- dropped += 1;
259
- return { accepted: false, reason };
260
- };
261
- const groupCheck = (request, evicted) => {
262
- const group = request.group === void 0 ? void 0 : groups.get(request.group);
263
- if (!group) return void 0;
264
- if (group.maxDistance !== void 0 && !((request.distance ?? 0) < group.maxDistance)) return "distance";
265
- if (group.cooldown !== void 0 && (budgets.get(request.group) ?? 0) > 0) return "cooldown";
266
- const members = voices.filter((voice) => voice.group === request.group);
267
- if (group.maxConcurrent === void 0 || members.length < group.maxConcurrent) return void 0;
268
- if (!group.steal) return "group_full";
269
- evicted.push(members[0].id);
270
- return void 0;
271
- };
272
- return {
273
- request(request) {
274
- const evicted = [];
275
- const refusal = groupCheck(request, evicted);
276
- if (refusal) return refuse(refusal);
277
- const score = request.priority * request.gain;
278
- const remaining = voices.filter((voice) => !evicted.includes(voice.id));
279
- if (remaining.length >= maxVoices) {
280
- const lowest = remaining.reduce((low, voice) => voice.score < low.score ? voice : low);
281
- if (score <= lowest.score) return refuse("global_full");
282
- evicted.push(lowest.id);
283
- dropped += 1;
284
- }
285
- const group = request.group === void 0 ? void 0 : groups.get(request.group);
286
- if (group?.cooldown !== void 0) budgets.set(request.group, group.cooldown);
287
- const id = nextId++;
288
- voices = [...voices.filter((voice) => !evicted.includes(voice.id)), { id, ...request.group === void 0 ? {} : { group: request.group }, score, remaining: request.length }];
289
- peak = Math.max(peak, voices.length);
290
- return { accepted: true, id, evicted };
291
- },
292
- release(id) {
293
- voices = voices.filter((voice) => voice.id !== id);
294
- },
295
- setLength(id, seconds) {
296
- const voice = voices.find((entry) => entry.id === id);
297
- if (voice) voice.remaining = seconds;
298
- },
299
- advance(dt) {
300
- for (const [group, budget] of budgets) budgets.set(group, budget - dt);
301
- const ended = [];
302
- for (const voice of voices) {
303
- voice.remaining -= dt;
304
- if (voice.remaining <= 0) ended.push(voice.id);
305
- }
306
- if (ended.length > 0) voices = voices.filter((voice) => voice.remaining > 0);
307
- return ended;
308
- },
309
- setGroup(id, group) {
310
- if (group) groups.set(id, group);
311
- else groups.delete(id);
312
- },
313
- stats: () => ({ active: voices.length, peak, dropped, maxVoices })
314
- };
315
- }
316
-
317
- // src/bank.ts
318
- function isPlainObject(value) {
319
- return typeof value === "object" && value !== null && !Array.isArray(value);
320
- }
321
- function mergeRecords(base, patch) {
322
- const merged = { ...base };
323
- for (const [key, value] of Object.entries(patch)) {
324
- if (value === void 0) continue;
325
- const current = merged[key];
326
- merged[key] = isPlainObject(current) && isPlainObject(value) ? mergeRecords(current, value) : value;
327
- }
328
- return merged;
329
- }
330
- function createSoundRegistry(banks = []) {
331
- const sounds = /* @__PURE__ */ new Map();
332
- const loops = /* @__PURE__ */ new Map();
333
- const sets = /* @__PURE__ */ new Map();
334
- const owners = /* @__PURE__ */ new Map();
335
- const registry = {
336
- register(bank) {
337
- for (const sound of bank.sounds ?? []) {
338
- sounds.set(sound.id, sound);
339
- owners.set(sound.id, bank.id);
340
- }
341
- for (const loop of bank.loops ?? []) {
342
- loops.set(loop.id, loop);
343
- owners.set(loop.id, bank.id);
344
- }
345
- for (const set of bank.sets ?? []) {
346
- if (set.variants.length === 0) throw new Error(`sound set ${set.id} has no variant`);
347
- sets.set(set.id, set);
348
- owners.set(set.id, bank.id);
349
- }
350
- },
351
- patch(id, patch) {
352
- const sound = sounds.get(id);
353
- if (sound) sounds.set(id, mergeRecords(sound, patch));
354
- const loop = loops.get(id);
355
- if (loop) loops.set(id, mergeRecords(loop, patch));
356
- },
357
- remove(id) {
358
- sounds.delete(id);
359
- loops.delete(id);
360
- sets.delete(id);
361
- owners.delete(id);
362
- },
363
- sound: (id) => sounds.get(id),
364
- loop: (id) => loops.get(id),
365
- set: (id) => sets.get(id),
366
- soundIds: () => [...sounds.keys()],
367
- setIds: () => [...sets.keys()],
368
- loopIds: () => [...loops.keys()],
369
- bankOf: (id) => owners.get(id)
370
- };
371
- for (const bank of banks) registry.register(bank);
372
- return registry;
373
- }
374
-
375
- // src/listener.ts
376
- var DEFAULT_LISTENER = { position: [0, 0, 0], yaw: 0 };
377
- var PAN_LIMIT = 0.85;
378
- var PAN_MIN_DISTANCE = 2;
379
- function listenerDistance(listener, position, mode = "xz") {
380
- const dx = position[0] - listener.position[0];
381
- const dz = position[2] - listener.position[2];
382
- if (mode === "xz") return Math.hypot(dx, dz);
383
- return Math.hypot(dx, position[1] - listener.position[1], dz);
384
- }
385
- function panFor(listener, position) {
386
- const rightX = Math.cos(listener.yaw);
387
- const rightZ = -Math.sin(listener.yaw);
388
- const dx = position[0] - listener.position[0];
389
- const dz = position[2] - listener.position[2];
390
- const distance = Math.hypot(dx, dz) || 1;
391
- const pan = (dx * rightX + dz * rightZ) / Math.max(distance, PAN_MIN_DISTANCE);
392
- return pan < -PAN_LIMIT ? -PAN_LIMIT : pan > PAN_LIMIT ? PAN_LIMIT : pan;
393
- }
394
-
395
- // src/rng.ts
396
- var FNV_OFFSET = 2166136261;
397
- var FNV_PRIME = 16777619;
398
- var MIX = 2654435761;
399
- function createRng(seed) {
400
- let state = seed >>> 0;
401
- return () => {
402
- state = state + 1831565813 >>> 0;
403
- let mixed = Math.imul(state ^ state >>> 15, state | 1);
404
- mixed ^= mixed + Math.imul(mixed ^ mixed >>> 7, mixed | 61);
405
- return ((mixed ^ mixed >>> 14) >>> 0) / 4294967296;
406
- };
407
- }
408
- function streamSeed(seed, name) {
409
- const label = String(name);
410
- let hash = FNV_OFFSET;
411
- for (let index = 0; index < label.length; index++) hash = Math.imul(hash ^ label.charCodeAt(index), FNV_PRIME) >>> 0;
412
- return Math.imul(seed >>> 0 ^ hash, MIX) >>> 0;
413
- }
414
- function streamFor(seed, name) {
415
- return createRng(streamSeed(seed, name));
416
- }
417
- function drawBetween(random, min, max) {
418
- return min + random() * (max - min);
419
- }
420
-
421
- // src/plan.ts
422
- var DEFAULT_TAIL = 0.05;
423
- var DEFAULT_NOISE_SECONDS = 1.5;
424
- var OCCLUSION_GAIN = 0.5;
425
- var OCCLUSION_CUTOFF = 0.6;
426
- function isParamRef(range) {
427
- return typeof range === "object" && !Array.isArray(range);
428
- }
429
- function draw(range, scope) {
430
- if (typeof range === "number") return range;
431
- if (isParamRef(range)) {
432
- const value = scope.params[range.param];
433
- if (value === void 0) throw new Error(`game-audio: the recipe reads the param "${range.param}", which was not given`);
434
- return value * (range.scale ?? 1) + (range.add ?? 0);
435
- }
436
- const [min, max] = range;
437
- return min + scope.random() * (max - min);
438
- }
439
- function drawTime(time, scope) {
440
- if (time === "duration" || typeof time === "string" && time.endsWith("d")) return time;
441
- return draw(time, scope);
442
- }
443
- function timeOf(time, duration) {
444
- if (typeof time === "number") return time;
445
- if (time === "duration") return duration;
446
- return Number(time.slice(0, -1)) * duration;
447
- }
448
- function drawAutomation(automation, scope) {
449
- const pending = {};
450
- for (const key of Object.keys(automation)) {
451
- if (key === "set" && "set" in automation) pending.value = draw(automation.set, scope);
452
- else if (key === "from" && "from" in automation) pending.from = draw(automation.from, scope);
453
- else if (key === "to" && automation.to !== void 0) pending.to = automation.to === "from" ? pending.from ?? pending.value ?? 0 : draw(automation.to, scope);
454
- else if (key === "curve") pending.curve = automation.curve;
455
- else if (key === "over" && automation.over !== void 0) pending.over = drawTime(automation.over, scope);
456
- }
457
- return pending;
458
- }
459
- function finishAutomation(pending, duration) {
460
- if (pending.from !== void 0 && pending.to === void 0) return { from: pending.from };
461
- if (pending.from !== void 0) return { from: pending.from, to: pending.to, curve: pending.curve ?? "linear", at: timeOf(pending.over ?? "duration", duration) };
462
- if (pending.to === void 0 || pending.over === void 0) return { value: pending.value };
463
- return { value: pending.value, to: pending.to, curve: pending.curve ?? "linear", at: timeOf(pending.over, duration) };
464
- }
465
- var startFrequency = (automation) => automation.from ?? automation.value ?? 0;
466
- function drawFilter(spec, scope) {
467
- const pending = { spec, frequency: {} };
468
- for (const key of Object.keys(spec)) {
469
- if (key === "frequency") pending.frequency = drawAutomation(spec.frequency, scope);
470
- else if (key === "q" && spec.q !== void 0) pending.q = draw(spec.q, scope);
471
- else if (key === "gain" && spec.gain !== void 0) pending.gain = draw(spec.gain, scope);
472
- else if (key === "level" && spec.level !== void 0) pending.level = draw(spec.level, scope);
473
- }
474
- return pending;
475
- }
476
- function drawModulator(modulator, scope) {
477
- const pending = { modulator, rate: 0 };
478
- for (const key of Object.keys(modulator)) {
479
- if (key === "rate") pending.rate = draw(modulator.rate, scope);
480
- else if (key === "depth" && !(typeof modulator.depth === "object" && "scaleOf" in modulator.depth)) pending.depth = draw(modulator.depth, scope);
481
- }
482
- return pending;
483
- }
484
- function drawVoice(source, scope) {
485
- const pending = { frequency: {}, vibratoRate: 0, formants: [], breath: { frequency: 0, q: source.breath.q, gain: 0 } };
486
- for (const key of Object.keys(source)) {
487
- if (key === "frequency") pending.frequency = drawAutomation(source.frequency, scope);
488
- else if (key === "vibrato") pending.vibratoRate = draw(source.vibrato.rate, scope);
489
- else if (key === "formants") pending.formants = source.formants.map((formant) => ({ frequency: draw(formant.frequency, scope), q: formant.q }));
490
- else if (key === "breath") pending.breath = { frequency: draw(source.breath.frequency, scope), q: source.breath.q, gain: draw(source.breath.gain, scope) };
491
- }
492
- return pending;
493
- }
494
- function drawLayer(layer, scope) {
495
- const pending = { at: 0, gain: 1, filters: [], modulators: [] };
496
- for (const key of Object.keys(layer)) {
497
- if (key === "at" && layer.at !== void 0) pending.at = draw(layer.at, scope);
498
- else if (key === "duration" && layer.duration !== void 0) pending.duration = draw(layer.duration, scope);
499
- else if (key === "gain" && layer.gain !== void 0) pending.gain = draw(layer.gain, scope);
500
- else if (key === "source" && layer.source.kind === "osc") pending.automation = drawAutomation(layer.source.frequency, scope);
501
- else if (key === "source" && layer.source.kind === "formant_voice") pending.voice = drawVoice(layer.source, scope);
502
- else if (key === "filters" && layer.filters) pending.filters = layer.filters.bank.map((spec) => drawFilter(spec, scope));
503
- else if (key === "modulators" && layer.modulators) pending.modulators = layer.modulators.map((modulator) => drawModulator(modulator, scope));
504
- }
505
- return pending;
506
- }
507
- function drawOffset(source, duration, scope, noiseSeconds) {
508
- if (source.kind === "formant_voice") return scope.random();
509
- if (source.kind !== "noise" || source.offset === void 0) return 0;
510
- if (typeof source.offset === "number") return source.offset;
511
- if (source.offset === "fit") return scope.random() * Math.max(0, noiseSeconds - duration);
512
- return scope.random() * (source.offsetScale ?? 1);
513
- }
514
- function finishSource(layer, pending, duration, offset) {
515
- const source = layer.source;
516
- if (source.kind === "noise") return { kind: "noise", offset, loop: source.loop === true };
517
- if (source.kind === "osc") return { kind: "osc", wave: source.wave, frequency: finishAutomation(pending.automation ?? {}, duration) };
518
- const voice = pending.voice;
519
- return {
520
- kind: "formant_voice",
521
- wave: source.wave,
522
- frequency: finishAutomation(voice.frequency, duration),
523
- vibrato: { rate: voice.vibratoRate, depth: startFrequency(voice.frequency) * source.vibrato.depth },
524
- formants: voice.formants,
525
- breath: { ...voice.breath, offset },
526
- mix: source.mix
527
- };
528
- }
529
- function finishModulator(pending, sourceFrequency) {
530
- const { modulator } = pending;
531
- const depth = typeof modulator.depth === "object" && "scaleOf" in modulator.depth ? sourceFrequency * modulator.depth.factor : pending.depth ?? 0;
532
- return { target: modulator.target, ...modulator.wave ? { wave: modulator.wave } : {}, rate: pending.rate, depth, ...modulator.base === void 0 ? {} : { base: modulator.base } };
533
- }
534
- function finishEnvelope(envelope, duration, level) {
535
- return envelope.map(([time, value, curve, fixed2]) => ({ time: timeOf(time, duration), value: fixed2 === "fixed" ? value : value * level, curve }));
536
- }
537
- function planLayer(layer, scope, defaults, levelInEnvelope, soundLevel) {
538
- const pending = drawLayer(layer, scope);
539
- const duration = pending.duration ?? defaults.duration;
540
- if (duration === void 0) throw new Error("game-audio: a layer needs a duration (its own or the recipe\u2019s)");
541
- const offset = drawOffset(layer.source, duration, scope, defaults.noiseSeconds);
542
- const level = pending.gain * soundLevel;
543
- const sourceFrequency = layer.source.kind === "noise" ? 0 : startFrequency(pending.automation ?? pending.voice?.frequency ?? {});
544
- const planned = {
545
- at: pending.at,
546
- duration,
547
- tail: layer.tail ?? defaults.tail ?? DEFAULT_TAIL,
548
- level,
549
- ...layer.wet === void 0 ? {} : { wet: layer.wet },
550
- source: finishSource(layer, pending, duration, offset),
551
- ...layer.filters ? {
552
- filters: {
553
- mode: layer.filters.mode,
554
- bank: pending.filters.map(({ spec, frequency, q, gain, level: filterLevel }) => ({
555
- type: spec.type,
556
- frequency: finishAutomation(frequency, duration),
557
- ...q === void 0 ? {} : { q },
558
- ...gain === void 0 ? {} : { gain },
559
- ...filterLevel === void 0 ? {} : { level: filterLevel }
560
- }))
561
- }
562
- } : {},
563
- modulators: pending.modulators.map((modulator) => finishModulator(modulator, sourceFrequency)),
564
- envelope: finishEnvelope(layer.envelope, duration, levelInEnvelope ? level : 1)
565
- };
566
- if (!layer.repeat) return [planned];
567
- return Array.from({ length: layer.repeat.count }, (_, index) => ({ ...planned, at: planned.at + index * (layer.repeat?.spacing ?? 0) }));
568
- }
569
- function scaleAutomation(automation, divisor) {
570
- const scale = (value) => value === void 0 ? void 0 : value / divisor;
571
- const scaled = { ...automation };
572
- for (const key of ["value", "from", "to"]) if (automation[key] !== void 0) scaled[key] = scale(automation[key]);
573
- return scaled;
574
- }
575
- function muffle(layer, divisor) {
576
- if (divisor === 1 || !layer.filters) return layer;
577
- const bank = layer.filters.bank.map((filter) => filter.type === "lowpass" ? { ...filter, frequency: scaleAutomation(filter.frequency, divisor) } : filter);
578
- return { ...layer, filters: { ...layer.filters, bank } };
579
- }
580
- var layerEnd = (layer) => layer.at + layer.duration + layer.tail;
581
- function planSound(recipe, input = {}) {
582
- const listener = input.listener ?? DEFAULT_LISTENER;
583
- const distance = input.distance ?? (input.position ? listenerDistance(listener, input.position, input.distanceMode) : 0);
584
- const occlusion = Math.min(1, Math.max(0, input.occlusion ?? 0));
585
- const order = recipe.order ?? "layered";
586
- const falloffLevel = falloffGain(recipe.falloff, input.volume ?? 1, distance);
587
- const level = occlusion > 0 ? falloffLevel * (1 - OCCLUSION_GAIN * occlusion) : falloffLevel;
588
- const silent = isSilent(recipe.falloff, falloffLevel);
589
- const base = {
590
- id: recipe.id,
591
- bus: recipe.bus,
592
- order,
593
- ...recipe.group === void 0 ? {} : { group: recipe.group },
594
- priority: recipe.priority ?? busPriority(recipe.bus),
595
- level,
596
- distance,
597
- ...recipe.pan ? { pan: input.position ? panFor(listener, input.position) : 0 } : {}
598
- };
599
- if (silent) return recipe.keepSilent ? { ...base, silent: true, length: 0, layers: [] } : null;
600
- const scope = { random: input.random ?? createRng(1), params: { ...input.params } };
601
- for (const [name, range] of Object.entries(recipe.vars ?? {})) if (scope.params[name] === void 0) scope.params[name] = draw(range, scope);
602
- const defaults = {
603
- ...recipe.duration === void 0 ? {} : { duration: draw(recipe.duration, scope) },
604
- ...recipe.tail === void 0 ? {} : { tail: recipe.tail },
605
- noiseSeconds: input.noiseSeconds ?? DEFAULT_NOISE_SECONDS
606
- };
607
- const divisor = cutoffDivisor(recipe.falloff, distance) / (1 - OCCLUSION_CUTOFF * occlusion);
608
- const layers = recipe.layers.flatMap((layer) => planLayer(layer, scope, defaults, order !== "layered", level)).map((layer) => muffle(layer, divisor));
609
- return { ...base, silent: false, length: Math.max(0, ...layers.map(layerEnd)), layers };
610
- }
611
-
612
- // src/webaudio/noise.ts
613
- function fillNoise(random, length) {
614
- const samples = new Float32Array(length);
615
- for (let index = 0; index < length; index++) samples[index] = random() * 2 - 1;
616
- return samples;
617
- }
618
- function fillImpulse(random, options) {
619
- const size = Math.floor(options.length);
620
- return Array.from({ length: options.channels }, () => {
621
- const samples = new Float32Array(size);
622
- for (let index = 0; index < options.length; index++) {
623
- const value = (random() * 2 - 1) * Math.exp(options.decay * Math.log(1 - index / options.length));
624
- if (index < size) samples[index] = value;
625
- }
626
- return samples;
627
- });
628
- }
629
- function bufferOf(context, channels, requestedLength) {
630
- const buffer = context.createBuffer(channels.length, requestedLength, context.sampleRate);
631
- channels.forEach((samples, channel) => buffer.getChannelData(channel).set(samples));
632
- return buffer;
633
- }
634
-
635
- // src/webaudio/chain.ts
636
- function buildChain(context, profile, random) {
637
- let compressor;
638
- if (profile.compressor) {
639
- compressor = context.createDynamicsCompressor();
640
- compressor.threshold.value = profile.compressor.threshold;
641
- compressor.ratio.value = profile.compressor.ratio;
642
- if (profile.compressor.knee !== void 0) compressor.knee.value = profile.compressor.knee;
643
- if (profile.compressor.attack !== void 0) compressor.attack.value = profile.compressor.attack;
644
- if (profile.compressor.release !== void 0) compressor.release.value = profile.compressor.release;
645
- compressor.connect(context.destination);
646
- }
647
- const master = context.createGain();
648
- master.gain.value = profile.master;
649
- master.connect(compressor ?? context.destination);
650
- if (!profile.reverb) {
651
- return {
652
- master,
653
- disconnect: () => {
654
- master.disconnect();
655
- compressor?.disconnect();
656
- }
657
- };
658
- }
659
- const convolver = context.createConvolver();
660
- const length = context.sampleRate * profile.reverb.seconds;
661
- convolver.buffer = bufferOf(context, fillImpulse(random, { channels: 2, length, decay: profile.reverb.decay }), length);
662
- const wet = context.createGain();
663
- wet.gain.value = profile.reverb.wet;
664
- wet.connect(convolver);
665
- convolver.connect(master);
666
- return {
667
- master,
668
- wet,
669
- disconnect: () => {
670
- wet.disconnect();
671
- convolver.disconnect();
672
- master.disconnect();
673
- compressor?.disconnect();
674
- }
675
- };
676
- }
677
-
678
- // src/webaudio/context.ts
679
- function globalContext() {
680
- const scope = globalThis;
681
- const Constructor = scope.AudioContext ?? scope.webkitAudioContext;
682
- return Constructor ? new Constructor() : null;
683
- }
684
- function unlockContext(context) {
685
- if (context.state === "suspended") void context.resume();
686
- }
687
-
688
- // src/loops.ts
689
- var LOOP_START_ABOVE = 2e-3;
690
- var LOOP_SMOOTHING = { volume: 0.15, frequency: 0.08 };
691
- function createLoopState(recipe, open = false) {
692
- const startAbove = recipe.startAbove ?? LOOP_START_ABOVE;
693
- let created = open;
694
- let volume = recipe.volume ?? 0;
695
- return {
696
- set(state) {
697
- volume = state.volume ?? volume;
698
- const create = !created;
699
- if (create && !(volume >= startAbove)) return null;
700
- created = true;
701
- const frequency = recipe.source.kind === "osc" && state.frequency ? state.frequency : void 0;
702
- return { create, volume, ...frequency === void 0 ? {} : { frequency } };
703
- },
704
- get created() {
705
- return created;
706
- },
707
- reset() {
708
- created = false;
709
- }
710
- };
711
- }
712
-
713
- // src/webaudio/nodes.ts
714
- function assign(param, automation, time) {
715
- if (automation.value !== void 0) param.value = automation.value;
716
- if (automation.from !== void 0) param.setValueAtTime(automation.from, time);
717
- }
718
- function ramp(param, curve, value, at) {
719
- if (curve === "set") param.setValueAtTime(value, at);
720
- else if (curve === "exp") param.exponentialRampToValueAtTime(value, at);
721
- else param.linearRampToValueAtTime(value, at);
722
- }
723
- function rampTo(param, automation, time) {
724
- if (automation.to !== void 0 && automation.at !== void 0) ramp(param, automation.curve ?? "linear", automation.to, time + automation.at);
725
- }
726
- function applyEnvelope(param, points, time) {
727
- for (const point of points) ramp(param, point.curve, point.value, time + point.time);
728
- }
729
- function noiseSource(target, loop) {
730
- const source = target.context.createBufferSource();
731
- source.buffer = target.noise();
732
- if (loop) source.loop = true;
733
- return source;
734
- }
735
- function filterNode(context, filter, time) {
736
- const node = context.createBiquadFilter();
737
- node.type = filter.type;
738
- assign(node.frequency, filter.frequency, time);
739
- if (filter.q !== void 0) node.Q.value = filter.q;
740
- if (filter.gain !== void 0) node.gain.value = filter.gain;
741
- return node;
742
- }
743
- function gainNode(context, value) {
744
- const node = context.createGain();
745
- node.gain.value = value;
746
- return node;
747
- }
748
- function voiceOf(sources) {
749
- return {
750
- sources,
751
- stop() {
752
- for (const source of sources) {
753
- try {
754
- source.stop();
755
- } catch {
756
- }
757
- }
758
- }
759
- };
760
- }
761
-
762
- // src/webaudio/realize-loop.ts
763
- var fixed = (range) => typeof range === "number" ? range : 0;
764
- var fixedFrequency = (automation) => fixed("set" in automation ? automation.set : automation.from);
765
- function sourceOf(recipe, target) {
766
- if (recipe.source.kind === "noise") return { source: noiseSource(target, true) };
767
- const oscillator = target.context.createOscillator();
768
- oscillator.type = recipe.source.wave;
769
- if (recipe.source.frequency) oscillator.frequency.value = fixedFrequency(recipe.source.frequency);
770
- return { source: oscillator, frequency: oscillator.frequency };
771
- }
772
- function stopAll(sources) {
773
- return () => {
774
- for (const source of sources) {
775
- try {
776
- source.stop();
777
- } catch {
778
- }
779
- }
780
- };
781
- }
782
- function realizeGameLoop(recipe, target) {
783
- const { context } = target;
784
- const gain = context.createGain();
785
- const filters = (recipe.filters?.bank ?? []).map(() => context.createBiquadFilter());
786
- gain.gain.value = 0;
787
- const last = filters.reduce((previous, filter) => previous ? previous.connect(filter) : filter, void 0);
788
- last?.connect(gain);
789
- gain.connect(target.output);
790
- const { source, frequency } = sourceOf(recipe, target);
791
- recipe.filters?.bank.forEach((spec, index) => {
792
- const filter = filters[index];
793
- filter.type = spec.type;
794
- filter.frequency.value = fixedFrequency(spec.frequency);
795
- if (spec.q !== void 0) filter.Q.value = fixed(spec.q);
796
- });
797
- const sources = [source];
798
- for (const modulator of recipe.modulators ?? []) {
799
- const lfo = context.createOscillator();
800
- const depth = context.createGain();
801
- const stage = context.createGain();
802
- if (modulator.wave) lfo.type = modulator.wave;
803
- lfo.frequency.value = fixed(modulator.rate);
804
- depth.gain.value = fixed(modulator.depth);
805
- stage.gain.value = modulator.base ?? 0;
806
- lfo.connect(depth);
807
- depth.connect(stage.gain);
808
- last?.disconnect();
809
- last?.connect(stage);
810
- stage.connect(gain);
811
- lfo.start();
812
- sources.push(lfo);
813
- }
814
- source.connect(filters[0] ?? gain);
815
- source.start();
816
- return { gain, source, ...frequency ? { frequency } : {}, stop: stopAll(sources) };
817
- }
818
- function realizeChainLoop(recipe, target, volume) {
819
- const { context } = target;
820
- const { source, frequency } = sourceOf(recipe, target);
821
- const filters = (recipe.filters?.bank ?? []).map(
822
- (spec) => filterNode(context, { type: spec.type, frequency: { value: fixedFrequency(spec.frequency) }, ...spec.q === void 0 ? {} : { q: fixed(spec.q) } }, target.time)
823
- );
824
- const gain = gainNode(context, volume);
825
- const lfos = (recipe.modulators ?? []).map((modulator) => {
826
- const lfo = context.createOscillator();
827
- if (modulator.wave) lfo.type = modulator.wave;
828
- lfo.frequency.value = fixed(modulator.rate);
829
- const depth = gainNode(context, fixed(modulator.depth));
830
- lfo.connect(depth);
831
- depth.connect(gain.gain);
832
- return lfo;
833
- });
834
- let tail = source;
835
- for (const filter of filters) tail = tail.connect(filter);
836
- tail.connect(gain);
837
- gain.connect(target.output);
838
- source.start();
839
- for (const lfo of lfos) lfo.start();
840
- return { gain, source, ...frequency ? { frequency } : {}, stop: stopAll([source, ...lfos]) };
841
- }
842
-
843
- // src/webaudio/engine-loop.ts
844
- var INERT = { set() {
845
- }, stop() {
846
- } };
847
- function createLoopHandle(recipe, host, volume) {
848
- if (!recipe) return INERT;
849
- const loopRecipe = recipe;
850
- const isChain = loopRecipe.order === "chain_loop";
851
- const opening = volume ?? loopRecipe.volume ?? 0;
852
- const smoothing = loopRecipe.smoothing ?? LOOP_SMOOTHING;
853
- let state = createLoopState(loopRecipe);
854
- let nodes;
855
- const entry = {
856
- get created() {
857
- return nodes !== void 0;
858
- },
859
- rewire() {
860
- nodes?.gain.disconnect();
861
- nodes?.gain.connect(host.output(loopRecipe.bus));
862
- },
863
- stop() {
864
- nodes?.stop();
865
- nodes?.gain.disconnect();
866
- nodes = void 0;
867
- state = createLoopState(loopRecipe);
868
- host.unregister(entry);
869
- }
870
- };
871
- const create = (context, startVolume) => {
872
- if (loopRecipe.source.kind === "noise") host.prepareNoise();
873
- const target = { context, output: host.output(loopRecipe.bus), noise: host.noise, time: context.currentTime };
874
- const made = isChain ? realizeChainLoop(loopRecipe, target, startVolume) : realizeGameLoop(loopRecipe, target);
875
- host.register(entry);
876
- return made;
877
- };
878
- const open = () => {
879
- const context = host.ready();
880
- if (!context) return;
881
- nodes = create(context, opening);
882
- state = createLoopState({ ...loopRecipe, volume: opening }, true);
883
- };
884
- if (isChain) open();
885
- return {
886
- set(next) {
887
- if (isChain && !nodes) open();
888
- const context = host.ready();
889
- if (!context) return;
890
- const action = state.set(next);
891
- if (!action) return;
892
- nodes ?? (nodes = create(context, 0));
893
- nodes.gain.gain.setTargetAtTime(action.volume, context.currentTime, smoothing.volume);
894
- if (action.frequency !== void 0 && nodes.frequency) nodes.frequency.setTargetAtTime(action.frequency, context.currentTime, smoothing.frequency);
895
- },
896
- stop: entry.stop
897
- };
898
- }
899
-
900
- // src/webaudio/engine-noise.ts
901
- function createNoiseStore(random) {
902
- const store = {
903
- random,
904
- reset() {
905
- store.samples = void 0;
906
- store.buffer = void 0;
907
- }
908
- };
909
- return store;
910
- }
911
- function prepareNoise(store, context, seconds) {
912
- store.samples ?? (store.samples = fillNoise(store.random, Math.floor(context.sampleRate * seconds)));
913
- return store.samples;
914
- }
915
- function noiseBuffer(store, context, seconds) {
916
- const samples = prepareNoise(store, context, seconds);
917
- store.buffer ?? (store.buffer = bufferOf(context, [samples], context.sampleRate * seconds));
918
- return store.buffer;
919
- }
920
-
921
- // src/webaudio/engine-queue.ts
922
- import { DEFERRED_QUEUE_ID } from "@adatechnology/game-contracts";
923
- var nowMs = () => typeof performance === "undefined" ? Date.now() : performance.now();
924
- function scheduleTask(task) {
925
- if (typeof MessageChannel === "undefined") {
926
- setTimeout(task, 0);
927
- return;
928
- }
929
- const channel = new MessageChannel();
930
- channel.port1.onmessage = () => {
931
- channel.port1.close();
932
- task();
933
- };
934
- channel.port2.postMessage(0);
935
- }
936
- function createStartQueue(options = {}) {
937
- const budgetMs = options.budgetMs ?? 2;
938
- const maxLatencyMs = options.maxLatencyMs ?? 250;
939
- let jobs = [];
940
- let scheduled = false;
941
- let attached = false;
942
- const runNext = () => {
943
- const job = jobs.shift();
944
- if (nowMs() - job.queuedAt > maxLatencyMs) job.drop();
945
- else job.run();
946
- };
947
- const drain = () => {
948
- scheduled = false;
949
- if (attached) return;
950
- const began = nowMs();
951
- while (jobs.length > 0) {
952
- runNext();
953
- if (nowMs() - began >= budgetMs) break;
954
- }
955
- if (jobs.length > 0) schedule();
956
- };
957
- const schedule = () => {
958
- if (scheduled || attached) return;
959
- scheduled = true;
960
- scheduleTask(drain);
961
- };
962
- const queue = {
963
- push(job) {
964
- jobs.push({ ...job, queuedAt: nowMs() });
965
- schedule();
966
- },
967
- clear() {
968
- for (const job of jobs) job.drop();
969
- jobs = [];
970
- },
971
- get size() {
972
- return jobs.length;
973
- },
974
- deferredQueue: () => deferredQueue
975
- };
976
- const deferredQueue = {
977
- id: DEFERRED_QUEUE_ID.AUDIO_VOICES,
978
- pending: () => jobs.length,
979
- run(deadline, clock) {
980
- let ran = 0;
981
- while (jobs.length > 0) {
982
- runNext();
983
- ran++;
984
- if (clock() >= deadline) break;
985
- }
986
- return ran;
987
- },
988
- flush() {
989
- while (jobs.length > 0) runNext();
990
- },
991
- attach() {
992
- attached = true;
993
- },
994
- detach() {
995
- attached = false;
996
- if (jobs.length > 0) schedule();
997
- }
998
- };
999
- return queue;
1000
- }
1001
-
1002
- // src/webaudio/realize-game.ts
1003
- var end = (layer, start) => start + layer.duration + layer.tail;
1004
- var firstFilter = (layer) => layer.filters?.bank[0];
1005
- var offsetOf = (layer) => layer.source.kind === "noise" ? layer.source.offset : 0;
1006
- function setFilter(node, filter, time) {
1007
- if (!filter) return;
1008
- node.type = filter.type;
1009
- assign(node.frequency, filter.frequency, time);
1010
- if (filter.q !== void 0) node.Q.value = filter.q;
1011
- }
1012
- function realizeBurst(plan, target) {
1013
- const { context } = target;
1014
- const layer = plan.layers[0];
1015
- const time = target.time + layer.at;
1016
- const gain = context.createGain();
1017
- gain.connect(target.output);
1018
- const source = noiseSource(target, layer.source.kind === "noise" && layer.source.loop);
1019
- const filter = context.createBiquadFilter();
1020
- source.connect(filter);
1021
- filter.connect(gain);
1022
- setFilter(filter, firstFilter(layer), time);
1023
- applyEnvelope(gain.gain, layer.envelope, time);
1024
- source.start(time, offsetOf(layer));
1025
- source.stop(end(layer, time));
1026
- return voiceOf([source]);
1027
- }
1028
- function realizeScream(plan, target) {
1029
- const { context } = target;
1030
- const layer = plan.layers[0];
1031
- const time = target.time + layer.at;
1032
- const source = noiseSource(target, layer.source.kind === "noise" && layer.source.loop);
1033
- const gain = context.createGain();
1034
- gain.connect(target.output);
1035
- for (const band of layer.filters?.bank ?? []) {
1036
- const filter = context.createBiquadFilter();
1037
- filter.type = band.type;
1038
- if (band.q !== void 0) filter.Q.value = band.q;
1039
- assign(filter.frequency, band.frequency, time);
1040
- rampTo(filter.frequency, band.frequency, time);
1041
- const level = context.createGain();
1042
- level.gain.value = band.level ?? 1;
1043
- source.connect(filter);
1044
- filter.connect(level);
1045
- level.connect(gain);
1046
- }
1047
- const sources = [source];
1048
- const lfos = layer.modulators.map((modulator) => {
1049
- const lfo = context.createOscillator();
1050
- const depth = context.createGain();
1051
- if (modulator.wave) lfo.type = modulator.wave;
1052
- lfo.frequency.value = modulator.rate;
1053
- depth.gain.value = modulator.depth;
1054
- lfo.connect(depth);
1055
- depth.connect(gain.gain);
1056
- return lfo;
1057
- });
1058
- applyEnvelope(gain.gain, layer.envelope, time);
1059
- source.start(time, offsetOf(layer));
1060
- source.stop(end(layer, time));
1061
- for (const lfo of lfos) {
1062
- lfo.start(time);
1063
- lfo.stop(end(layer, time));
1064
- sources.push(lfo);
1065
- }
1066
- return voiceOf(sources);
1067
- }
1068
- function realizeGroan(plan, target) {
1069
- const { context } = target;
1070
- const layer = plan.layers[0];
1071
- const time = target.time + layer.at;
1072
- const oscillator = context.createOscillator();
1073
- const gain = context.createGain();
1074
- const filter = context.createBiquadFilter();
1075
- const band = firstFilter(layer);
1076
- if (layer.source.kind === "osc") oscillator.type = layer.source.wave;
1077
- if (band) {
1078
- filter.type = band.type;
1079
- if (band.q !== void 0) filter.Q.value = band.q;
1080
- }
1081
- if (layer.source.kind === "osc") {
1082
- assign(oscillator.frequency, layer.source.frequency, time);
1083
- rampTo(oscillator.frequency, layer.source.frequency, time);
1084
- }
1085
- if (band) assign(filter.frequency, band.frequency, time);
1086
- applyEnvelope(gain.gain, layer.envelope, time);
1087
- oscillator.connect(filter);
1088
- filter.connect(gain);
1089
- gain.connect(target.output);
1090
- oscillator.start(time);
1091
- oscillator.stop(end(layer, time));
1092
- return voiceOf([oscillator]);
1093
- }
1094
- function realizeBoom(plan, target) {
1095
- const { context } = target;
1096
- const layer = plan.layers[0];
1097
- const time = target.time + layer.at;
1098
- const oscillator = context.createOscillator();
1099
- const gain = context.createGain();
1100
- if (layer.source.kind === "osc") {
1101
- oscillator.type = layer.source.wave;
1102
- assign(oscillator.frequency, layer.source.frequency, time);
1103
- rampTo(oscillator.frequency, layer.source.frequency, time);
1104
- }
1105
- applyEnvelope(gain.gain, layer.envelope, time);
1106
- oscillator.connect(gain);
1107
- gain.connect(target.output);
1108
- oscillator.start(time);
1109
- oscillator.stop(end(layer, time));
1110
- return voiceOf([oscillator]);
1111
- }
1112
- function realizeStatic(plan, target) {
1113
- const { context } = target;
1114
- const layer = plan.layers[0];
1115
- const time = target.time + layer.at;
1116
- const gain = context.createGain();
1117
- const source = context.createBufferSource();
1118
- const filter = context.createBiquadFilter();
1119
- source.buffer = target.noise();
1120
- setFilter(filter, firstFilter(layer), time);
1121
- applyEnvelope(gain.gain, layer.envelope, time);
1122
- source.connect(filter);
1123
- filter.connect(gain);
1124
- gain.connect(target.output);
1125
- source.start(time, offsetOf(layer));
1126
- source.stop(end(layer, time));
1127
- return voiceOf([source]);
1128
- }
1129
- function realizeChord(plan, target) {
1130
- const { context } = target;
1131
- const layers = plan.layers;
1132
- const oscillators = layers.map(() => context.createOscillator());
1133
- const gain = context.createGain();
1134
- for (let index = layers.length - 1; index >= 0; index--) {
1135
- const source = layers[index].source;
1136
- if (source.kind === "osc") oscillators[index].type = source.wave;
1137
- }
1138
- layers.forEach((layer, index) => {
1139
- if (layer.source.kind === "osc") assign(oscillators[index].frequency, layer.source.frequency, target.time + layer.at);
1140
- });
1141
- applyEnvelope(gain.gain, layers[0].envelope, target.time + layers[0].at);
1142
- for (const oscillator of oscillators) oscillator.connect(gain);
1143
- gain.connect(target.output);
1144
- layers.forEach((layer, index) => oscillators[index].start(target.time + layer.at));
1145
- layers.forEach((layer, index) => oscillators[index].stop(end(layer, target.time + layer.at)));
1146
- return voiceOf(oscillators);
1147
- }
1148
- function realizeCalls(plan, target) {
1149
- const { context } = target;
1150
- const gain = context.createGain();
1151
- const filter = context.createBiquadFilter();
1152
- if (plan.silent) return voiceOf([]);
1153
- const band = firstFilter(plan.layers[0]);
1154
- if (band) filter.type = band.type;
1155
- filter.connect(gain);
1156
- gain.connect(target.output);
1157
- const oscillators = plan.layers.map((layer) => {
1158
- const time = target.time + layer.at;
1159
- const oscillator = context.createOscillator();
1160
- if (layer.source.kind === "osc") {
1161
- oscillator.type = layer.source.wave;
1162
- assign(oscillator.frequency, layer.source.frequency, time);
1163
- rampTo(oscillator.frequency, layer.source.frequency, time);
1164
- }
1165
- if (band) {
1166
- assign(filter.frequency, band.frequency, time);
1167
- if (band.q !== void 0) filter.Q.value = band.q;
1168
- }
1169
- const envelope = context.createGain();
1170
- applyEnvelope(envelope.gain, layer.envelope, time);
1171
- oscillator.connect(envelope);
1172
- envelope.connect(filter);
1173
- oscillator.start(time);
1174
- oscillator.stop(end(layer, time));
1175
- return oscillator;
1176
- });
1177
- return voiceOf(oscillators);
1178
- }
1179
-
1180
- // src/webaudio/realize-layered.ts
1181
- var end2 = (layer, start) => start + layer.duration + layer.tail;
1182
- function outputStage(plan, layer, target) {
1183
- const { context } = target;
1184
- const level = gainNode(context, layer.level);
1185
- let node = level;
1186
- if (plan.pan !== void 0 && typeof context.createStereoPanner === "function") {
1187
- const panner = context.createStereoPanner();
1188
- panner.pan.value = plan.pan;
1189
- level.connect(panner);
1190
- node = panner;
1191
- }
1192
- node.connect(target.output);
1193
- if (layer.wet && target.wet) {
1194
- const send = gainNode(context, layer.wet);
1195
- node.connect(send);
1196
- send.connect(target.wet);
1197
- }
1198
- return level;
1199
- }
1200
- function realizeNoiseLayer(plan, layer, target) {
1201
- const { context } = target;
1202
- const time = target.time + layer.at;
1203
- const source = noiseSource(target, layer.source.kind === "noise" && layer.source.loop);
1204
- const filters = (layer.filters?.bank ?? []).map((filter) => {
1205
- const node = filterNode(context, filter, time);
1206
- rampTo(node.frequency, filter.frequency, time);
1207
- return node;
1208
- });
1209
- const envelope = context.createGain();
1210
- applyEnvelope(envelope.gain, layer.envelope, time);
1211
- let tail = source;
1212
- for (const filter of filters) tail = tail.connect(filter);
1213
- tail.connect(envelope);
1214
- envelope.connect(outputStage(plan, layer, target));
1215
- source.start(time, layer.source.kind === "noise" ? layer.source.offset : 0);
1216
- source.stop(end2(layer, time));
1217
- return [source];
1218
- }
1219
- function realizeToneLayer(plan, layer, target) {
1220
- const { context } = target;
1221
- const time = target.time + layer.at;
1222
- const oscillator = context.createOscillator();
1223
- if (layer.source.kind === "osc") {
1224
- oscillator.type = layer.source.wave;
1225
- assign(oscillator.frequency, layer.source.frequency, time);
1226
- rampTo(oscillator.frequency, layer.source.frequency, time);
1227
- }
1228
- const envelope = context.createGain();
1229
- applyEnvelope(envelope.gain, layer.envelope, time);
1230
- oscillator.connect(envelope);
1231
- envelope.connect(outputStage(plan, layer, target));
1232
- oscillator.start(time);
1233
- oscillator.stop(end2(layer, time));
1234
- return [oscillator];
1235
- }
1236
- function realizeVoiceLayer(plan, layer, target) {
1237
- const source = layer.source;
1238
- if (source.kind !== "formant_voice") return [];
1239
- const { context } = target;
1240
- const time = target.time + layer.at;
1241
- const oscillator = context.createOscillator();
1242
- oscillator.type = source.wave;
1243
- assign(oscillator.frequency, source.frequency, time);
1244
- rampTo(oscillator.frequency, source.frequency, time);
1245
- const vibrato = context.createOscillator();
1246
- vibrato.frequency.value = source.vibrato.rate;
1247
- const vibratoDepth = gainNode(context, source.vibrato.depth);
1248
- vibrato.connect(vibratoDepth);
1249
- vibratoDepth.connect(oscillator.frequency);
1250
- const formants = source.formants.map((formant) => filterNode(context, { type: "bandpass", frequency: { value: formant.frequency }, q: formant.q }, time));
1251
- const breath = noiseSource(target, true);
1252
- const breathBand = filterNode(context, { type: "bandpass", frequency: { value: source.breath.frequency }, q: source.breath.q }, time);
1253
- const breathLevel = gainNode(context, source.breath.gain);
1254
- const mix = gainNode(context, source.mix);
1255
- for (const formant of formants) oscillator.connect(formant);
1256
- breath.connect(breathBand);
1257
- breathBand.connect(breathLevel);
1258
- for (const formant of formants) formant.connect(mix);
1259
- breathLevel.connect(mix);
1260
- const envelope = context.createGain();
1261
- applyEnvelope(envelope.gain, layer.envelope, time);
1262
- mix.connect(envelope);
1263
- envelope.connect(outputStage(plan, layer, target));
1264
- const stop = end2(layer, time);
1265
- oscillator.start(time);
1266
- vibrato.start(time);
1267
- breath.start(time, source.breath.offset);
1268
- oscillator.stop(stop);
1269
- vibrato.stop(stop);
1270
- breath.stop(stop);
1271
- return [oscillator, vibrato, breath];
1272
- }
1273
- function realizeLayered(plan, target) {
1274
- const sources = plan.layers.flatMap((layer) => {
1275
- if (layer.source.kind === "noise") return realizeNoiseLayer(plan, layer, target);
1276
- if (layer.source.kind === "osc") return realizeToneLayer(plan, layer, target);
1277
- return realizeVoiceLayer(plan, layer, target);
1278
- });
1279
- return voiceOf(sources);
1280
- }
1281
- function realizeSiren(plan, target) {
1282
- const { context } = target;
1283
- const layer = plan.layers[0];
1284
- const time = target.time + layer.at;
1285
- const oscillator = context.createOscillator();
1286
- if (layer.source.kind === "osc") {
1287
- oscillator.type = layer.source.wave;
1288
- assign(oscillator.frequency, layer.source.frequency, time);
1289
- rampTo(oscillator.frequency, layer.source.frequency, time);
1290
- }
1291
- const depths = layer.modulators.map((modulator) => {
1292
- const lfo = context.createOscillator();
1293
- if (modulator.wave) lfo.type = modulator.wave;
1294
- lfo.frequency.value = modulator.rate;
1295
- const depth = gainNode(context, modulator.depth);
1296
- lfo.connect(depth);
1297
- if (modulator.target === "frequency") depth.connect(oscillator.frequency);
1298
- return { lfo, depth, target: modulator.target };
1299
- });
1300
- const lfos = depths.map(({ lfo }) => lfo);
1301
- const envelope = context.createGain();
1302
- applyEnvelope(envelope.gain, layer.envelope, time);
1303
- for (const { depth, target: modulated } of depths) if (modulated === "gain") depth.connect(envelope.gain);
1304
- const filters = (layer.filters?.bank ?? []).map((filter) => filterNode(context, filter, time));
1305
- let tail = oscillator;
1306
- for (const filter of filters) tail = tail.connect(filter);
1307
- tail.connect(envelope);
1308
- envelope.connect(target.output);
1309
- if (layer.wet && target.wet) {
1310
- const send = gainNode(context, layer.wet);
1311
- envelope.connect(send);
1312
- send.connect(target.wet);
1313
- }
1314
- const stop = end2(layer, time);
1315
- oscillator.start(time);
1316
- for (const lfo of lfos) lfo.start(time);
1317
- oscillator.stop(stop);
1318
- for (const lfo of lfos) lfo.stop(stop);
1319
- return voiceOf([oscillator, ...lfos]);
1320
- }
1321
-
1322
- // src/webaudio/realize-weapon.ts
1323
- function noiseLayer(layer, target, time) {
1324
- const { context } = target;
1325
- const source = noiseSource(target, layer.source.kind === "noise" && layer.source.loop);
1326
- const filters = (layer.filters?.bank ?? []).map((filter) => filterNode(context, filter, time));
1327
- const envelope = context.createGain();
1328
- applyEnvelope(envelope.gain, layer.envelope, time);
1329
- let tail = source;
1330
- for (const filter of filters) tail = tail.connect(filter);
1331
- tail.connect(envelope).connect(target.output);
1332
- source.start(time, layer.source.kind === "noise" ? layer.source.offset : 0);
1333
- source.stop(time + layer.duration + layer.tail);
1334
- return source;
1335
- }
1336
- function toneLayer(layer, target, time) {
1337
- const { context } = target;
1338
- const oscillator = context.createOscillator();
1339
- if (layer.source.kind === "osc") {
1340
- oscillator.type = layer.source.wave;
1341
- assign(oscillator.frequency, layer.source.frequency, time);
1342
- rampTo(oscillator.frequency, layer.source.frequency, time);
1343
- }
1344
- const envelope = context.createGain();
1345
- applyEnvelope(envelope.gain, layer.envelope, time);
1346
- oscillator.connect(envelope).connect(target.output);
1347
- oscillator.start(time);
1348
- oscillator.stop(time + layer.duration + layer.tail);
1349
- return oscillator;
1350
- }
1351
- function realizeWeapon(plan, target) {
1352
- const sources = plan.layers.map((layer) => {
1353
- const time = target.time + layer.at;
1354
- return layer.source.kind === "noise" ? noiseLayer(layer, target, time) : toneLayer(layer, target, time);
1355
- });
1356
- return voiceOf(sources);
1357
- }
1358
-
1359
- // src/webaudio/realize.ts
1360
- var BUILDERS = {
1361
- layered: realizeLayered,
1362
- burst: realizeBurst,
1363
- scream: realizeScream,
1364
- groan: realizeGroan,
1365
- boom: realizeBoom,
1366
- static: realizeStatic,
1367
- chord: realizeChord,
1368
- calls: realizeCalls,
1369
- siren: realizeSiren,
1370
- weapon: realizeWeapon
1371
- };
1372
- function realize(plan, target) {
1373
- return BUILDERS[plan.order](plan, target);
1374
- }
1375
-
1376
- // src/variation.ts
1377
- var tuneAutomation = (automation, rate) => {
1378
- const tuned = { ...automation };
1379
- if (automation.value !== void 0) tuned.value = automation.value * rate;
1380
- if (automation.from !== void 0) tuned.from = automation.from * rate;
1381
- if (automation.to !== void 0) tuned.to = automation.to * rate;
1382
- if (automation.at !== void 0) tuned.at = automation.at / rate;
1383
- return tuned;
1384
- };
1385
- var tuneFilter = (filter, rate) => ({ ...filter, frequency: tuneAutomation(filter.frequency, rate) });
1386
- var tuneSource = (source, rate) => {
1387
- switch (source.kind) {
1388
- case "noise":
1389
- return source;
1390
- case "osc":
1391
- return { ...source, frequency: tuneAutomation(source.frequency, rate) };
1392
- case "formant_voice":
1393
- return {
1394
- ...source,
1395
- frequency: tuneAutomation(source.frequency, rate),
1396
- formants: source.formants.map((formant) => ({ ...formant, frequency: formant.frequency * rate })),
1397
- breath: { ...source.breath, frequency: source.breath.frequency * rate }
1398
- };
1399
- }
1400
- };
1401
- var tuneModulator = (modulator, rate) => ({
1402
- ...modulator,
1403
- rate: modulator.rate * rate,
1404
- ...modulator.target === "frequency" ? { depth: modulator.depth * rate } : {}
1405
- });
1406
- var tuneLayer = (layer, rate) => ({
1407
- ...layer,
1408
- at: layer.at / rate,
1409
- duration: layer.duration / rate,
1410
- tail: layer.tail / rate,
1411
- source: tuneSource(layer.source, rate),
1412
- ...layer.filters ? { filters: { ...layer.filters, bank: layer.filters.bank.map((filter) => tuneFilter(filter, rate)) } } : {},
1413
- modulators: layer.modulators.map((modulator) => tuneModulator(modulator, rate)),
1414
- envelope: layer.envelope.map((point) => ({ ...point, time: point.time / rate }))
1415
- });
1416
- function retunePlan(plan, rate) {
1417
- if (rate === 1 || !(rate > 0)) return plan;
1418
- return { ...plan, length: plan.length / rate, layers: plan.layers.map((layer) => tuneLayer(layer, rate)) };
1419
- }
1420
- function createSetPicker() {
1421
- const last = /* @__PURE__ */ new Map();
1422
- return {
1423
- pick(set, random) {
1424
- const count = set.variants.length;
1425
- const previous = last.get(set.id);
1426
- let index;
1427
- if (count === 1) index = 0;
1428
- else if (set.repeat || previous === void 0) index = Math.min(count - 1, Math.floor(random() * count));
1429
- else {
1430
- index = Math.min(count - 2, Math.floor(random() * (count - 1)));
1431
- if (index >= previous) index += 1;
1432
- }
1433
- last.set(set.id, index);
1434
- const [min, max] = set.rate ?? [1, 1];
1435
- const rate = min === max ? min : min + random() * (max - min);
1436
- return { id: set.variants[index], rate };
1437
- },
1438
- reset: () => last.clear()
1439
- };
1440
- }
1441
-
1442
- // src/webaudio/engine.ts
1443
- var usesNoise = (recipe) => recipe.layers.some((layer) => layer.source.kind !== "osc");
1444
- var planUsesNoise = (plan) => plan.layers.some((layer) => layer.source.kind !== "osc");
1445
- function createAudioEngine(options = {}) {
1446
- const seed = options.seed ?? 1;
1447
- const registry = createSoundRegistry(options.banks);
1448
- const voices = createVoiceManager({ ...options.groups ? { groups: options.groups } : {}, ...options.maxVoices === void 0 ? {} : { maxVoices: options.maxVoices } });
1449
- const engineRandom = createRng(seed);
1450
- const shared = createNoiseStore(engineRandom);
1451
- const busSettings = /* @__PURE__ */ new Map();
1452
- const busNodes = /* @__PURE__ */ new Map();
1453
- const meters = /* @__PURE__ */ new Map();
1454
- const active = /* @__PURE__ */ new Map();
1455
- const loops = /* @__PURE__ */ new Set();
1456
- const named = /* @__PURE__ */ new Map();
1457
- let mix = resolveMix(options.mix ?? DEFAULT_MIX, options.profiles);
1458
- let context = null;
1459
- let chain = null;
1460
- let listener = DEFAULT_LISTENER;
1461
- let lastTime = 0;
1462
- const outputFor = (bus) => busNodes.get(bus) ?? chain?.master;
1463
- const watched = /* @__PURE__ */ new Set();
1464
- const meterOf = (bus) => {
1465
- const existing = meters.get(bus);
1466
- if (existing) return existing;
1467
- const node = busNodes.get(bus);
1468
- if (!context || !node || typeof context.createAnalyser !== "function") return void 0;
1469
- const analyser = context.createAnalyser();
1470
- analyser.fftSize = 1024;
1471
- node.connect(analyser);
1472
- const made = { analyser, data: new Float32Array(analyser.fftSize) };
1473
- meters.set(bus, made);
1474
- return made;
1475
- };
1476
- const ensureBus = (bus) => {
1477
- if (!context || !chain || busNodes.has(bus)) return;
1478
- const node = context.createGain();
1479
- node.connect(chain.master);
1480
- busNodes.set(bus, node);
1481
- if (watched.has(bus)) meterOf(bus);
1482
- };
1483
- const ready = () => {
1484
- if (context) return context;
1485
- const created = (options.createContext ?? globalContext)();
1486
- if (!created) return null;
1487
- context = created;
1488
- chain = buildChain(created, mix, engineRandom);
1489
- if (mix.noise.create === "eager") noiseBuffer(shared, created, mix.noise.seconds);
1490
- for (const [bus, setting] of Object.entries(mix.buses ?? {})) {
1491
- busSettings.set(bus, { ...setting, ...busSettings.get(bus) });
1492
- }
1493
- for (const [bus, setting] of busSettings) {
1494
- ensureBus(bus);
1495
- busNodes.get(bus).gain.value = busGain(setting);
1496
- }
1497
- lastTime = created.currentTime;
1498
- return created;
1499
- };
1500
- const advance = () => {
1501
- if (!context) return;
1502
- const elapsed = context.currentTime - lastTime;
1503
- lastTime = context.currentTime;
1504
- if (elapsed > 0) for (const id of voices.advance(elapsed)) active.delete(id);
1505
- };
1506
- const inputFor = (recipe, playOptions, random) => ({
1507
- random,
1508
- listener,
1509
- noiseSeconds: mix.noise.seconds,
1510
- ...options.distance ? { distanceMode: options.distance } : {},
1511
- ...playOptions.volume === void 0 ? {} : { volume: playOptions.volume },
1512
- ...playOptions.distance === void 0 ? {} : { distance: playOptions.distance },
1513
- ...playOptions.position ? { position: playOptions.position } : {},
1514
- ...playOptions.params ? { params: playOptions.params } : {},
1515
- ...options.occlusion && playOptions.position && recipe.falloff?.model !== "none" ? { occlusion: options.occlusion(playOptions.position) } : {}
1516
- });
1517
- const startQueue = options.deferredStart ? createStartQueue(options.deferredStart) : null;
1518
- const build = (plan, store, delay) => {
1519
- const audio = context;
1520
- return realize(plan, {
1521
- context: audio,
1522
- output: outputFor(plan.bus),
1523
- ...chain?.wet ? { wet: chain.wet } : {},
1524
- noise: () => noiseBuffer(store, audio, mix.noise.seconds),
1525
- time: audio.currentTime + delay
1526
- });
1527
- };
1528
- const deferVoice = (plan, store, voiceId, delay) => {
1529
- let built = null;
1530
- let cancelled = false;
1531
- const pending = {
1532
- get sources() {
1533
- return built?.sources ?? [];
1534
- },
1535
- stop() {
1536
- cancelled = true;
1537
- built?.stop();
1538
- }
1539
- };
1540
- startQueue.push({
1541
- run() {
1542
- if (!cancelled && context) built = build(plan, store, delay);
1543
- },
1544
- drop() {
1545
- if (voiceId === void 0) return;
1546
- voices.release(voiceId);
1547
- active.delete(voiceId);
1548
- }
1549
- });
1550
- return pending;
1551
- };
1552
- const start = (plan, store, voiceId, delay = 0) => {
1553
- const realized = startQueue ? deferVoice(plan, store, voiceId, delay) : build(plan, store, delay);
1554
- if (voiceId === void 0) return null;
1555
- voices.setLength(voiceId, plan.length + delay);
1556
- active.set(voiceId, realized);
1557
- return {
1558
- id: voiceId,
1559
- plan,
1560
- stop() {
1561
- realized.stop();
1562
- voices.release(voiceId);
1563
- active.delete(voiceId);
1564
- }
1565
- };
1566
- };
1567
- const admit = (recipe, gain, distance) => {
1568
- const decision = voices.request({ ...recipe.group ? { group: recipe.group } : {}, priority: recipe.priority ?? busPriority(recipe.bus), gain, distance, length: 0 });
1569
- if (!decision.accepted) return null;
1570
- for (const id of decision.evicted) {
1571
- active.get(id)?.stop();
1572
- active.delete(id);
1573
- }
1574
- return decision.id;
1575
- };
1576
- const picker = createSetPicker();
1577
- const resolve = (id, random, chooser = picker) => {
1578
- if (registry.sound(id)) return { id, rate: 1 };
1579
- const set = registry.set(id);
1580
- return set ? chooser.pick(set, random) : { id, rate: 1 };
1581
- };
1582
- const playWith = (asked, playOptions, streamRandom, store) => {
1583
- const seeded = playOptions.seed === void 0 ? null : createRng(playOptions.seed);
1584
- const { id, rate } = resolve(asked, seeded ?? streamRandom);
1585
- const random = seeded ?? streamRandom;
1586
- const recipe = registry.sound(id);
1587
- if (!recipe || busSettings.get(recipe.bus)?.muted) return null;
1588
- const distance = playOptions.distance ?? (playOptions.position ? listenerDistance(listener, playOptions.position, options.distance) : 0);
1589
- const level = falloffGain(recipe.falloff, playOptions.volume ?? 1, distance);
1590
- const silent = isSilent(recipe.falloff, level);
1591
- if (silent && !recipe.keepSilent) return null;
1592
- const audio = ready();
1593
- if (!audio) return null;
1594
- unlockContext(audio);
1595
- advance();
1596
- const voiceId = silent ? void 0 : admit(recipe, level, distance);
1597
- if (voiceId === null) return null;
1598
- if (!silent && usesNoise(recipe)) prepareNoise(store, audio, mix.noise.seconds);
1599
- const plan = planSound(recipe, inputFor(recipe, playOptions, random));
1600
- return plan ? start(retunePlan(plan, rate), store, voiceId, playOptions.delay) : null;
1601
- };
1602
- const randomFor = (playOptions) => {
1603
- if (playOptions.channel === void 0) return engineRandom;
1604
- const existing = named.get(playOptions.channel);
1605
- if (existing) return existing;
1606
- const stream = streamFor(seed, playOptions.channel);
1607
- named.set(playOptions.channel, stream);
1608
- return stream;
1609
- };
1610
- const planWith = (asked, playOptions, random) => {
1611
- const { id, rate } = resolve(asked, random, createSetPicker());
1612
- const recipe = registry.sound(id);
1613
- const plan = recipe ? planSound(recipe, inputFor(recipe, playOptions, random)) : null;
1614
- return plan ? retunePlan(plan, rate) : null;
1615
- };
1616
- const loopHost = {
1617
- ready,
1618
- output: outputFor,
1619
- prepareNoise: () => context && prepareNoise(shared, context, mix.noise.seconds),
1620
- noise: () => noiseBuffer(shared, context, mix.noise.seconds),
1621
- register: (loop) => void loops.add(loop),
1622
- unregister: (loop) => void loops.delete(loop)
1623
- };
1624
- return {
1625
- registry,
1626
- register: (bank) => registry.register(bank),
1627
- plan: (id, playOptions = {}) => planWith(id, playOptions, createRng(playOptions.seed ?? seed)),
1628
- play: (id, playOptions = {}) => playWith(id, playOptions, randomFor(playOptions), shared),
1629
- playPlan(plan, playOptions = {}) {
1630
- const audio = ready();
1631
- if (!audio) return null;
1632
- advance();
1633
- const recipe = { id: plan.id, bus: plan.bus, layers: [], sources: [], priority: plan.priority, ...plan.group ? { group: plan.group } : {} };
1634
- const voiceId = plan.silent ? void 0 : admit(recipe, plan.level, plan.distance);
1635
- if (voiceId === null) return null;
1636
- if (planUsesNoise(plan)) prepareNoise(shared, audio, mix.noise.seconds);
1637
- return start(plan, shared, voiceId, playOptions.delay);
1638
- },
1639
- loop: (id, loopOptions = {}) => createLoopHandle(registry.loop(id), loopHost, loopOptions.volume),
1640
- channel(channelOptions) {
1641
- const random = channelOptions.random ?? (channelOptions.seed === void 0 ? engineRandom : createRng(channelOptions.seed));
1642
- const store = channelOptions.ownNoise ? createNoiseStore(random) : shared;
1643
- return {
1644
- random,
1645
- play: (id, playOptions = {}) => playWith(id, playOptions, random, store),
1646
- plan: (id, playOptions = {}) => planWith(id, playOptions, createRng(playOptions.seed ?? seed))
1647
- };
1648
- },
1649
- setListener(next) {
1650
- listener = next;
1651
- },
1652
- setBus(id, setting) {
1653
- busSettings.set(id, { ...busSettings.get(id), ...setting });
1654
- if (!context) return;
1655
- ensureBus(id);
1656
- busNodes.get(id).gain.value = busGain(busSettings.get(id));
1657
- },
1658
- setMix(next) {
1659
- const previous = mix;
1660
- mix = resolveMix(next, options.profiles);
1661
- if (!context || !chain) return;
1662
- const old = chain;
1663
- chain = buildChain(context, mix, engineRandom);
1664
- if (mix.noise.seconds !== previous.noise.seconds) shared.reset();
1665
- for (const node of busNodes.values()) {
1666
- node.disconnect();
1667
- node.connect(chain.master);
1668
- }
1669
- for (const loop of loops) loop.rewire();
1670
- old.disconnect();
1671
- },
1672
- setMaster(gain) {
1673
- mix = { ...mix, master: gain };
1674
- if (chain) chain.master.gain.value = gain;
1675
- },
1676
- unlock() {
1677
- const audio = ready();
1678
- if (audio) unlockContext(audio);
1679
- },
1680
- warmUp() {
1681
- const audio = ready();
1682
- if (!audio) return false;
1683
- noiseBuffer(shared, audio, mix.noise.seconds);
1684
- return true;
1685
- },
1686
- level(bus) {
1687
- watched.add(bus);
1688
- ensureBus(bus);
1689
- const meter = meterOf(bus);
1690
- if (!meter) return 0;
1691
- meter.analyser.getFloatTimeDomainData(meter.data);
1692
- let sum = 0;
1693
- for (const sample of meter.data) sum += sample * sample;
1694
- return Math.sqrt(sum / meter.data.length);
1695
- },
1696
- deferredQueue: () => startQueue?.deferredQueue() ?? null,
1697
- stats() {
1698
- advance();
1699
- const voiceStats = voices.stats();
1700
- return {
1701
- context: context ? context.state : "none",
1702
- voices: voiceStats.active,
1703
- peak: voiceStats.peak,
1704
- dropped: voiceStats.dropped,
1705
- maxVoices: voiceStats.maxVoices,
1706
- loops: [...loops].filter((loop) => loop.created).length
1707
- };
1708
- },
1709
- dispose() {
1710
- startQueue?.clear();
1711
- for (const id of active.keys()) voices.release(id);
1712
- for (const loop of [...loops]) loop.stop();
1713
- active.clear();
1714
- void context?.close();
1715
- context = null;
1716
- chain = null;
1717
- busNodes.clear();
1718
- meters.clear();
1719
- shared.reset();
1720
- }
1721
- };
1722
- }
1723
-
1724
- // src/bench/locale.ts
1725
- var EN = {
1726
- group: "Sound",
1727
- name: "Sound area",
1728
- probe: "Sound probe",
1729
- controls: {
1730
- sound: "Sound",
1731
- distance: "Distance",
1732
- bearing: "Bearing",
1733
- volume: "Volume",
1734
- mix: "Mixing chain",
1735
- seed: "Seed",
1736
- play: "Play",
1737
- voice_storm: "Voice storm",
1738
- loop: "Loop",
1739
- loop_level: "Loop level",
1740
- loop_pitch: "Loop pitch",
1741
- source: "Source"
1742
- },
1743
- hints: {
1744
- distance: "Metres from the listener: the level falls and the sound is muffled with it.",
1745
- bearing: "Degrees from straight ahead, positive to the right: shows the panning.",
1746
- mix: "The game chain (master only) or the art scene chain (compressor and reverb).",
1747
- seed: "The same seed gives the same sound.",
1748
- voice_storm: "Twenty of the chosen sound at once: the voice limiter drops what its group and the global cap refuse.",
1749
- loop_pitch: "Frequency of an oscillator loop, in hertz (0 leaves it where it is).",
1750
- source: "Where the sound comes from: the distance and bearing set here, or the probe standing in the area."
1751
- },
1752
- options: { none: "None", bench: "Bench settings", probe: "The probe" },
1753
- layers: { reverb: "Reverb", compressor: "Compressor", panning: "Panning", muffling: "Muffling by distance" },
1754
- metrics: {
1755
- voices: "Voices playing",
1756
- peak: "Most voices at once",
1757
- dropped: "Voices dropped",
1758
- loops: "Loops running",
1759
- context: "Audio context",
1760
- plan_length: "Chosen sound: length",
1761
- plan_level: "Chosen sound: level",
1762
- plan_pan: "Chosen sound: pan",
1763
- level_weapons: "Level: weapons",
1764
- level_voices: "Level: voices",
1765
- level_world: "Level: world",
1766
- level_ambience: "Level: ambience",
1767
- level_weather: "Level: weather",
1768
- level_ui: "Level: interface"
1769
- },
1770
- scenarios: {
1771
- panning: "A sound to the right is heard on the right, one to the left on the left, one ahead in the middle",
1772
- distance: "The farther a sound, the quieter, until it is not played",
1773
- determinism: "The same seed gives the same sound plan, another seed another one",
1774
- limiter: "The voice limiter holds a storm of voices to its group rule and its global cap"
1775
- },
1776
- mixes: { game: "Game", art_scene: "Art scene" },
1777
- sheet: { title: "Sound plan", level: "level", distance: "distance", pan: "pan", length: "seconds", silent: "too far to be heard", layer: "layer", none: "no sound chosen" }
1778
- };
1779
- var PT_BR = {
1780
- group: "Som",
1781
- name: "\xC1rea de som",
1782
- probe: "Sonda de som",
1783
- controls: {
1784
- sound: "Som",
1785
- distance: "Dist\xE2ncia",
1786
- bearing: "Dire\xE7\xE3o",
1787
- volume: "Volume",
1788
- mix: "Cadeia de mixagem",
1789
- seed: "Semente",
1790
- play: "Tocar",
1791
- voice_storm: "Tempestade de vozes",
1792
- loop: "La\xE7o",
1793
- loop_level: "N\xEDvel do la\xE7o",
1794
- loop_pitch: "Altura do la\xE7o",
1795
- source: "Origem"
1796
- },
1797
- hints: {
1798
- distance: "Metros at\xE9 o ouvinte: o n\xEDvel cai e o som abafa junto.",
1799
- bearing: "Graus a partir da frente, positivo para a direita: mostra o pan.",
1800
- mix: "A cadeia do jogo (s\xF3 o master) ou a da Cena de Arte (compressor e reverb).",
1801
- seed: "A mesma semente d\xE1 o mesmo som.",
1802
- voice_storm: "Vinte do som escolhido de uma vez: o limite de vozes derruba o que a regra do grupo e o teto global recusam.",
1803
- loop_pitch: "Frequ\xEAncia de um la\xE7o de oscilador, em hertz (0 deixa onde est\xE1).",
1804
- source: "De onde vem o som: a dist\xE2ncia e a dire\xE7\xE3o daqui, ou a sonda que est\xE1 na \xE1rea."
1805
- },
1806
- options: { none: "Nenhum", bench: "Ajustes da bancada", probe: "A sonda" },
1807
- layers: { reverb: "Reverb", compressor: "Compressor", panning: "Pan", muffling: "Abafamento pela dist\xE2ncia" },
1808
- metrics: {
1809
- voices: "Vozes tocando",
1810
- peak: "Mais vozes de uma vez",
1811
- dropped: "Vozes derrubadas",
1812
- loops: "La\xE7os ligados",
1813
- context: "Contexto de \xE1udio",
1814
- plan_length: "Som escolhido: dura\xE7\xE3o",
1815
- plan_level: "Som escolhido: n\xEDvel",
1816
- plan_pan: "Som escolhido: pan",
1817
- level_weapons: "N\xEDvel: armas",
1818
- level_voices: "N\xEDvel: vozes",
1819
- level_world: "N\xEDvel: mundo",
1820
- level_ambience: "N\xEDvel: ambiente",
1821
- level_weather: "N\xEDvel: clima",
1822
- level_ui: "N\xEDvel: interface"
1823
- },
1824
- scenarios: {
1825
- panning: "Um som \xE0 direita sai \xE0 direita, \xE0 esquerda sai \xE0 esquerda, \xE0 frente sai no meio",
1826
- distance: "Quanto mais longe, mais baixo, at\xE9 n\xE3o tocar",
1827
- determinism: "A mesma semente d\xE1 o mesmo plano de som, outra semente d\xE1 outro",
1828
- limiter: "O limite de vozes segura uma tempestade de vozes na regra do grupo e no teto global"
1829
- },
1830
- mixes: { game: "Jogo", art_scene: "Cena de Arte" },
1831
- sheet: { title: "Plano do som", level: "n\xEDvel", distance: "dist\xE2ncia", pan: "pan", length: "segundos", silent: "longe demais para ouvir", layer: "camada", none: "nenhum som escolhido" }
1832
- };
1833
- var audioBenchTextOf = (locale) => locale === "en" ? EN : PT_BR;
1834
-
1835
- // src/bench/module.ts
1836
- var BENCH_BANK = {
1837
- id: "audio_bench",
1838
- sounds: [
1839
- {
1840
- id: "bench_ping",
1841
- bus: "ui",
1842
- pan: true,
1843
- duration: 0.25,
1844
- layers: [
1845
- {
1846
- gain: 0.5,
1847
- wet: 0.3,
1848
- source: { kind: "osc", wave: "sine", frequency: { from: 880 } },
1849
- envelope: [
1850
- [0, 1e-4, "set", "fixed"],
1851
- [2e-3, 1, "exp"],
1852
- ["1d", 1e-4, "exp", "fixed"]
1853
- ]
1854
- }
1855
- ],
1856
- falloff: DISTANCE_CURVES.art_scene,
1857
- sources: ["sdk: bench probe, a 880 Hz ping through the art scene output stage"]
1858
- },
1859
- {
1860
- id: "bench_hiss",
1861
- bus: "ui",
1862
- pan: true,
1863
- duration: [0.3, 0.9],
1864
- layers: [
1865
- {
1866
- gain: 0.4,
1867
- source: { kind: "noise", offset: "random", offsetScale: 1.5, loop: true },
1868
- filters: { mode: "serial", bank: [{ type: "highpass", frequency: { set: 3e3 }, q: 0.7 }] },
1869
- envelope: [
1870
- [0, 1e-4, "set", "fixed"],
1871
- [2e-3, 1, "exp"],
1872
- ["1d", 1e-4, "exp", "fixed"]
1873
- ]
1874
- }
1875
- ],
1876
- falloff: DISTANCE_CURVES.art_scene,
1877
- sources: ["sdk: bench probe, a highpass hiss of random length"]
1878
- }
1879
- ]
1880
- };
1881
- var DISTANCES = [0, 10, 40, 60, 120, 160];
1882
- var STORM = 20;
1883
- var PROBE_ID = "audio_probe";
1884
- var PROBE_AT = [0, 0, -10];
1885
- var NONE = "none";
1886
- var DEFAULT_SOUND = "bench_ping";
1887
- var variantOf = (profile, reverb, compressor) => {
1888
- const { reverb: wet, compressor: chain, ...rest } = profile;
1889
- return { ...rest, id: `${profile.id}${reverb ? "" : "+dry"}${compressor ? "" : "+open"}`, ...wet && reverb ? { reverb: wet } : {}, ...chain && compressor ? { compressor: chain } : {} };
1890
- };
1891
- function createAudioTestModule(options = {}) {
1892
- const locale = options.locale ?? "pt-BR";
1893
- const text = audioBenchTextOf(locale);
1894
- const banks = [BENCH_BANK, ...options.banks ?? [GAME_SFX_BANK, LIBRARY_BANK]];
1895
- let engine = options.engine ?? createAudioEngine({ seed: options.seed ?? 1, banks });
1896
- for (const bank of banks) engine.register(bank);
1897
- let host = null;
1898
- let loop;
1899
- const state = {
1900
- sound: options.sound ?? DEFAULT_SOUND,
1901
- distance: 10,
1902
- bearing: 0,
1903
- volume: 1,
1904
- mix: "art_scene",
1905
- seed: options.seed ?? 1,
1906
- source: "bench",
1907
- loop: NONE,
1908
- loopLevel: 0.1,
1909
- loopPitch: 0,
1910
- reverb: true,
1911
- compressor: true,
1912
- panning: true,
1913
- muffling: true
1914
- };
1915
- const nameOf = (id) => {
1916
- const translated = options.translate?.(`sound.${id}`, locale);
1917
- if (translated) return translated;
1918
- const bank = engine.registry.bankOf(id);
1919
- return bank ? `${bank} / ${id}` : id;
1920
- };
1921
- const soundOptions = () => engine.registry.soundIds().map((id) => ({ id, name: nameOf(id) }));
1922
- const loopOptions = () => [{ id: NONE, name: text.options.none }, ...engine.registry.loopIds().map((id) => ({ id, name: nameOf(id) }))];
1923
- const listener = () => {
1924
- const camera = host?.camera;
1925
- const three = host?.THREE;
1926
- if (typeof camera?.getWorldDirection !== "function" || typeof three?.Vector3 !== "function" || !camera.position) return { position: [0, 0, 0], yaw: 0 };
1927
- const direction = camera.getWorldDirection(new three.Vector3());
1928
- return { position: [camera.position.x, camera.position.y, camera.position.z], yaw: Math.atan2(-direction.x, -direction.z) };
1929
- };
1930
- const probePosition = () => {
1931
- const scene = host?.scene;
1932
- const three = host?.THREE;
1933
- if (typeof scene?.traverse !== "function" || typeof three?.Vector3 !== "function") return void 0;
1934
- let found;
1935
- scene.traverse((object) => {
1936
- if (found || object.userData?.[PROBE_ID] !== true) return;
1937
- const at = object.getWorldPosition(new three.Vector3());
1938
- found = [at.x, at.y, at.z];
1939
- });
1940
- return found;
1941
- };
1942
- const sourceAt = (ears) => {
1943
- const probe = state.source === "probe" ? probePosition() : void 0;
1944
- if (probe) return probe;
1945
- const bearing = state.bearing * Math.PI / 180;
1946
- const forward = [-Math.sin(ears.yaw), -Math.cos(ears.yaw)];
1947
- const right = [Math.cos(ears.yaw), -Math.sin(ears.yaw)];
1948
- return [ears.position[0] + state.distance * (forward[0] * Math.cos(bearing) + right[0] * Math.sin(bearing)), ears.position[1], ears.position[2] + state.distance * (forward[1] * Math.cos(bearing) + right[1] * Math.sin(bearing))];
1949
- };
1950
- const playOptions = () => {
1951
- const ears = listener();
1952
- engine.setListener(ears);
1953
- const at = sourceAt(ears);
1954
- const distance = Math.hypot(at[0] - ears.position[0], at[2] - ears.position[2]);
1955
- return { ...state.panning ? { position: at } : { distance }, volume: state.volume, seed: state.seed };
1956
- };
1957
- const withMuffling = (id, run) => {
1958
- const falloff = engine.registry.sound(id)?.falloff;
1959
- if (state.muffling || !falloff || falloff.model !== "inverse_square" || falloff.cutoffK === void 0) return run();
1960
- engine.registry.patch(id, { falloff: { cutoffK: 0 } });
1961
- try {
1962
- return run();
1963
- } finally {
1964
- engine.registry.patch(id, { falloff: { cutoffK: falloff.cutoffK } });
1965
- }
1966
- };
1967
- const play = () => {
1968
- engine.unlock();
1969
- const chosen = state.sound;
1970
- return withMuffling(chosen, () => engine.play(chosen, playOptions()));
1971
- };
1972
- const plan = () => {
1973
- const chosen = state.sound;
1974
- return withMuffling(chosen, () => engine.plan(chosen, playOptions()));
1975
- };
1976
- const sheet = () => {
1977
- const planned = plan();
1978
- if (!planned) return `${text.sheet.title}: ${engine.registry.sound(state.sound) ? text.sheet.silent : text.sheet.none}`;
1979
- 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}`;
1980
- const layers2 = planned.layers.map((layer, index) => {
1981
- 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;
1982
- const filters = (layer.filters?.bank ?? []).map((filter) => `${filter.type}@${(filter.frequency.value ?? filter.frequency.from ?? 0).toFixed(1)}`).join(" ");
1983
- const envelope = layer.envelope.map((point) => `${point.time.toFixed(3)}:${point.value.toPrecision(3)}`).join(" ");
1984
- return ` ${text.sheet.layer} ${index + 1}: ${source} at ${layer.at.toFixed(3)} for ${layer.duration.toFixed(3)} ${filters} [${envelope}]`;
1985
- });
1986
- return [head, ...layers2].join("\n");
1987
- };
1988
- const applyMix = () => {
1989
- const profile = engine && MIX_PROFILES[state.mix];
1990
- if (profile) engine.setMix(variantOf(profile, state.reverb, state.compressor));
1991
- };
1992
- const setLoop = () => {
1993
- loop?.stop();
1994
- loop = void 0;
1995
- if (state.loop === NONE) return;
1996
- engine.unlock();
1997
- loop = engine.loop(state.loop);
1998
- loop.set({ volume: state.loopLevel, ...state.loopPitch > 0 ? { frequency: state.loopPitch } : {} });
1999
- };
2000
- const storm = () => {
2001
- engine.unlock();
2002
- const base = playOptions();
2003
- const chosen = state.sound;
2004
- for (let index = 0; index < STORM; index++) {
2005
- const spread = base.position ? { position: [base.position[0] + (index - STORM / 2), base.position[1], base.position[2]] } : {};
2006
- withMuffling(chosen, () => engine.play(chosen, { ...base, ...spread, seed: state.seed + index }));
2007
- }
2008
- };
2009
- const onChange = (change) => {
2010
- if (change.kind === "layer") {
2011
- if (change.id === "reverb" || change.id === "compressor") {
2012
- state[change.id] = change.on;
2013
- applyMix();
2014
- } else if (change.id === "panning" || change.id === "muffling") state[change.id] = change.on;
2015
- return;
2016
- }
2017
- if (change.kind === "action") {
2018
- if (change.id === "play") play();
2019
- else if (change.id === "voice_storm") storm();
2020
- return;
2021
- }
2022
- const { id, value } = change;
2023
- if (id === "sound" && typeof value === "string") state.sound = value;
2024
- else if (id === "distance" && typeof value === "string") state.distance = Number(value);
2025
- else if (id === "bearing" && typeof value === "number") state.bearing = value;
2026
- else if (id === "volume" && typeof value === "number") state.volume = value;
2027
- else if (id === "seed" && typeof value === "number") state.seed = value;
2028
- else if (id === "source" && typeof value === "string") state.source = value;
2029
- else if (id === "mix" && typeof value === "string") {
2030
- state.mix = value;
2031
- applyMix();
2032
- } else if (id === "loop" && typeof value === "string") {
2033
- state.loop = value;
2034
- setLoop();
2035
- } else if (id === "loop_level" && typeof value === "number") {
2036
- state.loopLevel = value;
2037
- loop?.set({ volume: value });
2038
- } else if (id === "loop_pitch" && typeof value === "number") {
2039
- state.loopPitch = value;
2040
- if (value > 0) loop?.set({ frequency: value });
2041
- }
2042
- };
2043
- const items = () => {
2044
- const probe = options.probe;
2045
- if (!probe) return [];
2046
- return [
2047
- {
2048
- id: PROBE_ID,
2049
- name: text.probe,
2050
- movable: false,
2051
- build: (THREE) => {
2052
- const root = probe(THREE);
2053
- root.userData = root.userData ?? {};
2054
- root.userData[PROBE_ID] = true;
2055
- return root;
2056
- }
2057
- }
2058
- ];
2059
- };
2060
- const controls = () => [
2061
- { kind: "choice", id: "sound", name: text.controls.sound, options: soundOptions(), default: state.sound },
2062
- { kind: "choice", id: "source", name: text.controls.source, hint: text.hints.source, options: [{ id: "bench", name: text.options.bench }, { id: "probe", name: text.options.probe }], default: state.source },
2063
- { kind: "choice", id: "distance", name: text.controls.distance, hint: text.hints.distance, options: DISTANCES.map((meters) => ({ id: String(meters), name: `${meters} m` })), default: String(state.distance) },
2064
- { kind: "number", id: "bearing", name: text.controls.bearing, hint: text.hints.bearing, unit: "\xB0", min: -180, max: 180, step: 15, default: state.bearing },
2065
- { kind: "number", id: "volume", name: text.controls.volume, min: 0, max: 1, step: 0.05, default: state.volume },
2066
- { kind: "choice", id: "mix", name: text.controls.mix, hint: text.hints.mix, options: Object.keys(MIX_PROFILES).map((id) => ({ id, name: text.mixes[id] ?? id })), default: state.mix },
2067
- { kind: "number", id: "seed", name: text.controls.seed, hint: text.hints.seed, min: 1, max: 9999, step: 1, default: state.seed },
2068
- { kind: "action", id: "play", name: text.controls.play },
2069
- { kind: "action", id: "voice_storm", name: text.controls.voice_storm, hint: text.hints.voice_storm },
2070
- { kind: "choice", id: "loop", name: text.controls.loop, options: loopOptions(), default: state.loop },
2071
- { kind: "number", id: "loop_level", name: text.controls.loop_level, min: 0, max: 0.6, step: 0.01, default: state.loopLevel },
2072
- { kind: "number", id: "loop_pitch", name: text.controls.loop_pitch, hint: text.hints.loop_pitch, unit: "Hz", min: 0, max: 400, step: 5, default: state.loopPitch }
2073
- ];
2074
- const layers = () => ["reverb", "compressor", "panning", "muffling"].map((id) => ({ id, name: text.layers[id] }));
2075
- const metrics = () => [
2076
- { id: "voices", name: text.metrics.voices, digits: 0, read: () => engine.stats().voices },
2077
- { id: "peak", name: text.metrics.peak, digits: 0, max: engine.stats().maxVoices > 0 && Number.isFinite(engine.stats().maxVoices) ? engine.stats().maxVoices : void 0, read: () => engine.stats().peak },
2078
- { id: "dropped", name: text.metrics.dropped, digits: 0, read: () => engine.stats().dropped },
2079
- { id: "loops", name: text.metrics.loops, digits: 0, read: () => engine.stats().loops },
2080
- { id: "context", name: text.metrics.context, read: () => engine.stats().context },
2081
- { id: "plan_length", name: text.metrics.plan_length, unit: "s", digits: 2, read: () => plan()?.length ?? 0 },
2082
- { id: "plan_level", name: text.metrics.plan_level, digits: 3, read: () => plan()?.level ?? 0 },
2083
- { id: "plan_pan", name: text.metrics.plan_pan, digits: 2, read: () => plan()?.pan ?? 0 },
2084
- ...BUS_IDS.map((bus) => ({ id: `level_${bus}`, name: text.metrics[`level_${bus}`], digits: 3, read: () => engine.level(bus) }))
2085
- ];
2086
- const scenarios = () => [
2087
- {
2088
- id: "panning",
2089
- name: text.scenarios.panning,
2090
- run: ({ expect }) => {
2091
- engine.setListener({ position: [0, 0, 0], yaw: 0 });
2092
- const pan = (at) => engine.plan("bench_ping", { position: at })?.pan ?? Number.NaN;
2093
- expect(pan([10, 0, 0]) > 0.3, "a sound to the right pans right", { pan: pan([10, 0, 0]) });
2094
- expect(pan([-10, 0, 0]) < -0.3, "a sound to the left pans left", { pan: pan([-10, 0, 0]) });
2095
- expect(Math.abs(pan([0, 0, -10])) < 0.05, "a sound ahead stays in the middle", { pan: pan([0, 0, -10]) });
2096
- engine.setListener({ position: [0, 0, 0], yaw: Math.PI / 2 });
2097
- expect(pan([0, 0, -10]) > 0.3, "turning the listener left puts what was ahead on the right", { pan: pan([0, 0, -10]) });
2098
- engine.setListener(listener());
2099
- }
2100
- },
2101
- {
2102
- id: "distance",
2103
- name: text.scenarios.distance,
2104
- run: ({ expect }) => {
2105
- const levels = [0, 10, 40, 100].map((meters) => engine.plan("bench_ping", { distance: meters })?.level ?? Number.NaN);
2106
- expect(levels.every((level, index) => index === 0 || level < levels[index - 1]), "the level falls with the distance", { levels });
2107
- const far = engine.registry.sound("sfx_pistol") ? engine.plan("sfx_pistol", { distance: 400 }) : null;
2108
- expect(far === null, "a game noise class is not played too far to be heard");
2109
- }
2110
- },
2111
- {
2112
- id: "determinism",
2113
- name: text.scenarios.determinism,
2114
- run: ({ expect }) => {
2115
- const a = engine.plan("bench_hiss", { seed: 5 });
2116
- const b = engine.plan("bench_hiss", { seed: 5 });
2117
- const c = engine.plan("bench_hiss", { seed: 6 });
2118
- expect(JSON.stringify(a) === JSON.stringify(b), "the same seed gives the same plan");
2119
- expect(JSON.stringify(a) !== JSON.stringify(c), "another seed gives another plan");
2120
- }
2121
- },
2122
- {
2123
- id: "limiter",
2124
- name: text.scenarios.limiter,
2125
- run: ({ expect }) => {
2126
- const voices = createVoiceManager({ maxVoices: 8 });
2127
- const request = (group) => voices.request({ ...group ? { group } : {}, priority: 3, gain: 0.5, distance: 5, length: 1 });
2128
- const grouped = Array.from({ length: STORM }, () => request("undead_voice")).filter((decision) => decision.accepted).length;
2129
- expect(grouped === 1, "the group cooldown lets one voice of a storm through", { accepted: grouped });
2130
- const plain = Array.from({ length: STORM }, () => request()).filter((decision) => decision.accepted).length;
2131
- expect(plain <= 8, "the global cap holds the rest", { accepted: plain });
2132
- }
2133
- }
2134
- ];
2135
- const area = () => ({
2136
- placements: options.probe ? [{ item: PROBE_ID, position: PROBE_AT, asleep: true }] : [],
2137
- view: { eye: [0, 1.7, 3], target: [0, 1.4, -10] }
2138
- });
2139
- const module = {
2140
- id: "audio_area",
2141
- name: text.name,
2142
- ground: { surface: "concrete_slab" },
2143
- group: text.group,
2144
- get engine() {
2145
- return engine;
2146
- },
2147
- items: () => items(),
2148
- area: () => area(),
2149
- controls: () => controls(),
2150
- layers: () => layers(),
2151
- metrics: () => metrics(),
2152
- scenarios: () => scenarios(),
2153
- sheet,
2154
- play,
2155
- attach(lent) {
2156
- host = lent;
2157
- const shared = lent.audio?.engine;
2158
- if (shared && shared !== engine) {
2159
- for (const bank of banks) shared.register(bank);
2160
- engine = shared;
2161
- }
2162
- for (const bus of BUS_IDS) {
2163
- engine.setBus(bus, {});
2164
- engine.level(bus);
2165
- }
2166
- lent.bench?.patch("sound", { options: soundOptions() });
2167
- lent.bench?.patch("loop", { options: loopOptions() });
2168
- const off = lent.bench?.onChange(onChange);
2169
- const offFrame = lent.onFrame(() => {
2170
- if (!shared) engine.setListener(listener());
2171
- });
2172
- return () => {
2173
- off?.();
2174
- offFrame();
2175
- loop?.stop();
2176
- loop = void 0;
2177
- host = null;
2178
- };
2179
- }
2180
- };
2181
- return module;
2182
- }
2183
-
2184
- export {
2185
- createRng,
2186
- streamSeed,
2187
- streamFor,
2188
- drawBetween,
2189
- BUS_IDS,
2190
- BUILD_ORDERS,
2191
- DISTANCE_CURVES,
2192
- falloffGain,
2193
- isSilent,
2194
- cutoffDivisor,
2195
- DEFAULT_LISTENER,
2196
- PAN_LIMIT,
2197
- PAN_MIN_DISTANCE,
2198
- listenerDistance,
2199
- panFor,
2200
- VOICE_GROUPS,
2201
- BUS_PRIORITY,
2202
- DEFAULT_MAX_VOICES,
2203
- busPriority,
2204
- createVoiceManager,
2205
- planSound,
2206
- LOOP_START_ABOVE,
2207
- LOOP_SMOOTHING,
2208
- createLoopState,
2209
- MIX_PROFILES,
2210
- DEFAULT_MIX,
2211
- resolveMix,
2212
- busGain,
2213
- createSoundRegistry,
2214
- GAME_SFX_CLASSES,
2215
- GAME_SFX_FALLBACK,
2216
- noiseClassRecipe,
2217
- GAME_SFX_BANK,
2218
- LIBRARY_SOUNDS,
2219
- LIBRARY_LOOPS,
2220
- LIBRARY_BANK,
2221
- retunePlan,
2222
- createSetPicker,
2223
- fillNoise,
2224
- fillImpulse,
2225
- bufferOf,
2226
- buildChain,
2227
- globalContext,
2228
- unlockContext,
2229
- realize,
2230
- createAudioEngine,
2231
- audioBenchTextOf,
2232
- BENCH_BANK,
2233
- createAudioTestModule
2234
- };
2235
- //# sourceMappingURL=chunk-DZITVFMJ.js.map