@jadujoel/web-audio-clip-node 0.1.7 → 0.1.8

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 (432) hide show
  1. package/dist/App.d.ts +6 -0
  2. package/dist/App.js +179 -0
  3. package/dist/audio/processor-code.d.ts +1 -1
  4. package/dist/audio/processor-code.js +1 -1
  5. package/dist/audio/processor-kernel.js +23 -9
  6. package/dist/audio/version.d.ts +1 -1
  7. package/dist/audio/version.js +1 -1
  8. package/dist/lib.bundle.js +3 -3
  9. package/dist/lib.bundle.js.map +3 -3
  10. package/dist/processor.js +2 -2
  11. package/dist/processor.js.map +3 -3
  12. package/dist/streaming.d.ts +6 -0
  13. package/dist/streaming.js +32 -0
  14. package/dist/workers/framed-raw-opus.d.ts +13 -0
  15. package/dist/workers/framed-raw-opus.js +68 -0
  16. package/dist/workers/mp3-decode-worker.d.ts +1 -0
  17. package/dist/workers/mp3-decode-worker.js +254 -0
  18. package/dist/workers/mp3-decode-worker.min.js +1 -0
  19. package/dist/workers/ogg-opus-decode-worker.d.ts +1 -0
  20. package/dist/workers/ogg-opus-decode-worker.js +398 -0
  21. package/dist/workers/ogg-opus-decode-worker.min.js +1 -0
  22. package/dist/workers/opus-worker-common.d.ts +45 -0
  23. package/dist/workers/opus-worker-common.js +226 -0
  24. package/dist/workers/raw-opus-framed-decode-worker.d.ts +1 -0
  25. package/dist/workers/raw-opus-framed-decode-worker.js +119 -0
  26. package/dist/workers/raw-opus-framed-decode-worker.min.js +1 -0
  27. package/dist/workers/webm-opus-decode-worker.d.ts +1 -0
  28. package/dist/workers/webm-opus-decode-worker.js +97 -0
  29. package/dist/workers/webm-opus-decode-worker.min.js +1 -0
  30. package/dist/workers/webm-opus-parser.d.ts +49 -0
  31. package/dist/workers/webm-opus-parser.js +369 -0
  32. package/dist/workers/worker-utils.d.ts +11 -0
  33. package/dist/workers/worker-utils.js +55 -0
  34. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/LICENSE +21 -0
  35. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/README.md +197 -0
  36. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/App.d.ts +6 -0
  37. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/App.js +179 -0
  38. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.d.ts +88 -0
  39. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.js +317 -0
  40. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.d.ts +1 -0
  41. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.js +2 -0
  42. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.d.ts +43 -0
  43. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.js +892 -0
  44. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.d.ts +1 -0
  45. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.js +103 -0
  46. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.d.ts +192 -0
  47. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.js +9 -0
  48. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.d.ts +22 -0
  49. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.js +128 -0
  50. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.d.ts +1 -0
  51. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.js +2 -0
  52. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.d.ts +6 -0
  53. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.js +17 -0
  54. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.d.ts +28 -0
  55. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.js +99 -0
  56. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.d.ts +17 -0
  57. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.js +73 -0
  58. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.d.ts +26 -0
  59. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.js +74 -0
  60. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.d.ts +10 -0
  61. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.js +44 -0
  62. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.d.ts +14 -0
  63. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.js +6 -0
  64. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.d.ts +12 -0
  65. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.js +48 -0
  66. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.d.ts +10 -0
  67. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.js +44 -0
  68. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.d.ts +10 -0
  69. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.js +50 -0
  70. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.d.ts +10 -0
  71. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.js +44 -0
  72. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.d.ts +13 -0
  73. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.js +20 -0
  74. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.d.ts +18 -0
  75. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.js +174 -0
  76. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.d.ts +14 -0
  77. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.js +9 -0
  78. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.d.ts +31 -0
  79. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.js +214 -0
  80. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.d.ts +2 -0
  81. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.js +80 -0
  82. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.d.ts +20 -0
  83. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.js +51 -0
  84. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.d.ts +1 -0
  85. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.js +17 -0
  86. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.d.ts +6 -0
  87. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.js +39 -0
  88. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.d.ts +31 -0
  89. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.js +338 -0
  90. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.d.ts +15 -0
  91. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.js +17 -0
  92. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js +6 -0
  93. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js.map +7 -0
  94. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib.d.ts +16 -0
  95. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib.js +16 -0
  96. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js +4 -0
  97. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js.map +12 -0
  98. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.d.ts +63 -0
  99. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.js +71 -0
  100. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.d.ts +6 -0
  101. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.js +32 -0
  102. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css +739 -0
  103. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css.d.ts +3 -0
  104. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.d.ts +13 -0
  105. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.js +68 -0
  106. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.d.ts +1 -0
  107. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.js +254 -0
  108. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.min.js +1 -0
  109. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.d.ts +1 -0
  110. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.js +398 -0
  111. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.min.js +1 -0
  112. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.d.ts +45 -0
  113. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.js +226 -0
  114. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.d.ts +1 -0
  115. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.js +119 -0
  116. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.min.js +1 -0
  117. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.d.ts +1 -0
  118. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.js +97 -0
  119. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.min.js +1 -0
  120. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.d.ts +49 -0
  121. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.js +369 -0
  122. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.d.ts +11 -0
  123. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.js +55 -0
  124. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/package.json +104 -0
  125. package/examples/index.html +253 -8
  126. package/examples/playground/README.md +9 -0
  127. package/examples/playground/index.html +14 -0
  128. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/LICENSE +21 -0
  129. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/README.md +197 -0
  130. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/App.d.ts +6 -0
  131. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/App.js +179 -0
  132. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.d.ts +88 -0
  133. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.js +317 -0
  134. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.d.ts +1 -0
  135. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.js +2 -0
  136. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.d.ts +43 -0
  137. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.js +892 -0
  138. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.d.ts +1 -0
  139. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.js +103 -0
  140. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.d.ts +192 -0
  141. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.js +9 -0
  142. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.d.ts +22 -0
  143. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.js +128 -0
  144. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.d.ts +1 -0
  145. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.js +2 -0
  146. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.d.ts +6 -0
  147. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.js +17 -0
  148. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.d.ts +28 -0
  149. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.js +99 -0
  150. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.d.ts +17 -0
  151. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.js +73 -0
  152. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.d.ts +26 -0
  153. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.js +74 -0
  154. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.d.ts +10 -0
  155. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.js +44 -0
  156. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.d.ts +14 -0
  157. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.js +6 -0
  158. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.d.ts +12 -0
  159. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.js +48 -0
  160. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.d.ts +10 -0
  161. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.js +44 -0
  162. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.d.ts +10 -0
  163. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.js +50 -0
  164. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.d.ts +10 -0
  165. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.js +44 -0
  166. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.d.ts +13 -0
  167. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.js +20 -0
  168. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.d.ts +18 -0
  169. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.js +174 -0
  170. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.d.ts +14 -0
  171. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.js +9 -0
  172. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.d.ts +31 -0
  173. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.js +214 -0
  174. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.d.ts +2 -0
  175. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.js +80 -0
  176. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.d.ts +20 -0
  177. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.js +51 -0
  178. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.d.ts +1 -0
  179. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.js +17 -0
  180. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.d.ts +6 -0
  181. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.js +39 -0
  182. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.d.ts +31 -0
  183. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.js +338 -0
  184. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.d.ts +15 -0
  185. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.js +17 -0
  186. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js +6 -0
  187. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js.map +7 -0
  188. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib.d.ts +16 -0
  189. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib.js +16 -0
  190. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js +4 -0
  191. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js.map +12 -0
  192. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.d.ts +63 -0
  193. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.js +71 -0
  194. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.d.ts +6 -0
  195. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.js +32 -0
  196. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css +739 -0
  197. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css.d.ts +3 -0
  198. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.d.ts +13 -0
  199. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.js +68 -0
  200. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.d.ts +1 -0
  201. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.js +254 -0
  202. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.min.js +1 -0
  203. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.d.ts +1 -0
  204. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.js +398 -0
  205. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.min.js +1 -0
  206. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.d.ts +45 -0
  207. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.js +226 -0
  208. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.d.ts +1 -0
  209. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.js +119 -0
  210. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.min.js +1 -0
  211. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.d.ts +1 -0
  212. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.js +97 -0
  213. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.min.js +1 -0
  214. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.d.ts +49 -0
  215. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.js +369 -0
  216. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.d.ts +11 -0
  217. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.js +55 -0
  218. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/package.json +104 -0
  219. package/examples/playground/package.json +19 -0
  220. package/examples/playground/src/App.tsx +442 -0
  221. package/examples/playground/src/main.tsx +9 -0
  222. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/LICENSE +21 -0
  223. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/README.md +197 -0
  224. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/App.d.ts +6 -0
  225. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/App.js +179 -0
  226. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.d.ts +88 -0
  227. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.js +317 -0
  228. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.d.ts +1 -0
  229. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.js +2 -0
  230. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.d.ts +43 -0
  231. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.js +892 -0
  232. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.d.ts +1 -0
  233. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.js +103 -0
  234. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.d.ts +192 -0
  235. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.js +9 -0
  236. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.d.ts +22 -0
  237. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.js +128 -0
  238. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.d.ts +1 -0
  239. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.js +2 -0
  240. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.d.ts +6 -0
  241. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.js +17 -0
  242. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.d.ts +28 -0
  243. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.js +99 -0
  244. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.d.ts +17 -0
  245. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.js +73 -0
  246. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.d.ts +26 -0
  247. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.js +74 -0
  248. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.d.ts +10 -0
  249. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.js +44 -0
  250. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.d.ts +14 -0
  251. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.js +6 -0
  252. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.d.ts +12 -0
  253. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.js +48 -0
  254. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.d.ts +10 -0
  255. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.js +44 -0
  256. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.d.ts +10 -0
  257. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.js +50 -0
  258. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.d.ts +10 -0
  259. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.js +44 -0
  260. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.d.ts +13 -0
  261. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.js +20 -0
  262. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.d.ts +18 -0
  263. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.js +174 -0
  264. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.d.ts +14 -0
  265. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.js +9 -0
  266. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.d.ts +31 -0
  267. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.js +214 -0
  268. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.d.ts +2 -0
  269. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.js +80 -0
  270. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.d.ts +20 -0
  271. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.js +51 -0
  272. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.d.ts +1 -0
  273. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.js +17 -0
  274. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.d.ts +6 -0
  275. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.js +39 -0
  276. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.d.ts +31 -0
  277. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.js +338 -0
  278. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.d.ts +15 -0
  279. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.js +17 -0
  280. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js +6 -0
  281. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js.map +7 -0
  282. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib.d.ts +16 -0
  283. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib.js +16 -0
  284. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js +4 -0
  285. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js.map +12 -0
  286. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.d.ts +63 -0
  287. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.js +71 -0
  288. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.d.ts +6 -0
  289. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.js +32 -0
  290. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css +739 -0
  291. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css.d.ts +3 -0
  292. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.d.ts +13 -0
  293. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.js +68 -0
  294. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.d.ts +1 -0
  295. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.js +254 -0
  296. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.min.js +1 -0
  297. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.d.ts +1 -0
  298. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.js +398 -0
  299. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.min.js +1 -0
  300. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.d.ts +45 -0
  301. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.js +226 -0
  302. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.d.ts +1 -0
  303. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.js +119 -0
  304. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.min.js +1 -0
  305. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.d.ts +1 -0
  306. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.js +97 -0
  307. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.min.js +1 -0
  308. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.d.ts +49 -0
  309. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.js +369 -0
  310. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.d.ts +11 -0
  311. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.js +55 -0
  312. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/package.json +104 -0
  313. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/LICENSE +21 -0
  314. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/README.md +197 -0
  315. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/App.d.ts +6 -0
  316. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/App.js +179 -0
  317. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.d.ts +88 -0
  318. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.js +317 -0
  319. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.d.ts +1 -0
  320. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.js +2 -0
  321. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.d.ts +43 -0
  322. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.js +892 -0
  323. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.d.ts +1 -0
  324. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.js +103 -0
  325. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.d.ts +192 -0
  326. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.js +9 -0
  327. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.d.ts +22 -0
  328. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.js +128 -0
  329. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.d.ts +1 -0
  330. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.js +2 -0
  331. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.d.ts +6 -0
  332. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.js +17 -0
  333. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.d.ts +28 -0
  334. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.js +99 -0
  335. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.d.ts +17 -0
  336. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.js +73 -0
  337. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.d.ts +26 -0
  338. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.js +74 -0
  339. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.d.ts +10 -0
  340. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.js +44 -0
  341. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.d.ts +14 -0
  342. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.js +6 -0
  343. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.d.ts +12 -0
  344. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.js +48 -0
  345. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.d.ts +10 -0
  346. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.js +44 -0
  347. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.d.ts +10 -0
  348. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.js +50 -0
  349. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.d.ts +10 -0
  350. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.js +44 -0
  351. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.d.ts +13 -0
  352. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.js +20 -0
  353. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.d.ts +18 -0
  354. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.js +174 -0
  355. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.d.ts +14 -0
  356. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.js +9 -0
  357. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.d.ts +31 -0
  358. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.js +214 -0
  359. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.d.ts +2 -0
  360. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.js +80 -0
  361. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.d.ts +20 -0
  362. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.js +51 -0
  363. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.d.ts +1 -0
  364. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.js +17 -0
  365. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.d.ts +6 -0
  366. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.js +39 -0
  367. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.d.ts +31 -0
  368. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.js +338 -0
  369. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.d.ts +15 -0
  370. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.js +17 -0
  371. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js +6 -0
  372. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js.map +7 -0
  373. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib.d.ts +16 -0
  374. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib.js +16 -0
  375. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js +4 -0
  376. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js.map +12 -0
  377. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.d.ts +63 -0
  378. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.js +71 -0
  379. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.d.ts +6 -0
  380. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.js +32 -0
  381. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css +739 -0
  382. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css.d.ts +3 -0
  383. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.d.ts +13 -0
  384. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.js +68 -0
  385. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.d.ts +1 -0
  386. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.js +254 -0
  387. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.min.js +1 -0
  388. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.d.ts +1 -0
  389. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.js +398 -0
  390. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.min.js +1 -0
  391. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.d.ts +45 -0
  392. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.js +226 -0
  393. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.d.ts +1 -0
  394. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.js +119 -0
  395. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.min.js +1 -0
  396. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.d.ts +1 -0
  397. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.js +97 -0
  398. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.min.js +1 -0
  399. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.d.ts +49 -0
  400. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.js +369 -0
  401. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.d.ts +11 -0
  402. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.js +55 -0
  403. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/package.json +104 -0
  404. package/examples/self-hosted/public/processor.js +2 -2
  405. package/examples/streaming/build-worker.ts +45 -17
  406. package/examples/streaming/framed-raw-opus.ts +95 -0
  407. package/examples/streaming/index.html +4 -199
  408. package/examples/streaming/{decode-worker.ts → mp3-decode-worker.ts} +62 -44
  409. package/examples/streaming/ogg-opus-decode-worker.ts +479 -0
  410. package/examples/streaming/opus-worker-common.ts +278 -0
  411. package/examples/streaming/package.json +9 -1
  412. package/examples/streaming/raw-opus-framed-decode-worker.ts +148 -0
  413. package/examples/streaming/src/App.tsx +726 -0
  414. package/examples/streaming/src/clip-node-lib.ts +33 -0
  415. package/examples/streaming/src/framedRawOpus.test.ts +74 -0
  416. package/examples/streaming/src/main.tsx +6 -0
  417. package/examples/streaming/src/react-dom-runtime.d.ts +1 -0
  418. package/examples/streaming/src/react-dom-runtime.js +1 -0
  419. package/examples/streaming/src/react-runtime.d.ts +2 -0
  420. package/examples/streaming/src/react-runtime.js +7 -0
  421. package/examples/streaming/src/streamFormat.test.ts +13 -0
  422. package/examples/streaming/src/streamFormat.ts +14 -0
  423. package/examples/streaming/src/streamTimeline.test.ts +74 -0
  424. package/examples/streaming/src/streamTimeline.ts +76 -0
  425. package/examples/streaming/src/useStreamingClipNode.ts +540 -0
  426. package/examples/streaming/src/webmOpusParser.test.ts +153 -0
  427. package/examples/streaming/tsconfig.json +19 -0
  428. package/examples/streaming/webm-opus-decode-worker.ts +123 -0
  429. package/examples/streaming/webm-opus-parser.ts +461 -0
  430. package/examples/streaming/worker-utils.ts +45 -0
  431. package/package.json +13 -2
  432. package/examples/streaming/main.ts +0 -276
@@ -0,0 +1,892 @@
1
+ // processor-kernel.ts — Pure DSP logic, state machine, all filters
2
+ // NO AudioWorklet or platform dependencies. Fully testable.
3
+ import { State, } from "./types.js";
4
+ // ---------------------------------------------------------------------------
5
+ // Constants
6
+ // ---------------------------------------------------------------------------
7
+ export const SAMPLE_BLOCK_SIZE = 128;
8
+ function createStreamBufferState(buffer = []) {
9
+ const totalLength = buffer[0]?.length ?? 0;
10
+ const hasBuffer = totalLength > 0;
11
+ return {
12
+ totalLength: hasBuffer ? totalLength : null,
13
+ committedLength: hasBuffer ? totalLength : 0,
14
+ streamEnded: hasBuffer,
15
+ streaming: false,
16
+ writtenSpans: hasBuffer ? [{ startSample: 0, endSample: totalLength }] : [],
17
+ pendingWrites: [],
18
+ lowWaterThreshold: SAMPLE_BLOCK_SIZE * 4,
19
+ lowWaterNotified: false,
20
+ lastUnderrunSample: null,
21
+ };
22
+ }
23
+ function getBufferLength(buffer) {
24
+ return buffer[0]?.length ?? 0;
25
+ }
26
+ function getLogicalBufferLength(properties) {
27
+ return (properties.streamBuffer.totalLength ?? getBufferLength(properties.buffer));
28
+ }
29
+ function createSilentBuffer(channels, length) {
30
+ return Array.from({ length: channels }, () => new Float32Array(length));
31
+ }
32
+ function mergeWrittenSpan(spans, nextSpan) {
33
+ const merged = [...spans, nextSpan].sort((a, b) => a.startSample - b.startSample);
34
+ const result = [];
35
+ for (const span of merged) {
36
+ const previous = result[result.length - 1];
37
+ if (!previous || span.startSample > previous.endSample) {
38
+ result.push({ ...span });
39
+ continue;
40
+ }
41
+ previous.endSample = Math.max(previous.endSample, span.endSample);
42
+ }
43
+ return result;
44
+ }
45
+ function getCommittedLength(spans) {
46
+ let committedLength = 0;
47
+ for (const span of spans) {
48
+ if (span.startSample > committedLength)
49
+ break;
50
+ committedLength = Math.max(committedLength, span.endSample);
51
+ }
52
+ return committedLength;
53
+ }
54
+ function resetLowWaterState(streamBuffer, playhead) {
55
+ if (streamBuffer.committedLength - Math.floor(playhead) >=
56
+ streamBuffer.lowWaterThreshold) {
57
+ streamBuffer.lowWaterNotified = false;
58
+ }
59
+ }
60
+ function ensureBufferCapacity(properties, requiredChannels, requiredLength) {
61
+ const currentLength = getBufferLength(properties.buffer);
62
+ const currentChannels = properties.buffer.length;
63
+ if (currentLength >= requiredLength && currentChannels >= requiredChannels) {
64
+ return;
65
+ }
66
+ const nextLength = Math.max(currentLength, requiredLength);
67
+ const nextChannels = Math.max(currentChannels, requiredChannels);
68
+ const nextBuffer = createSilentBuffer(nextChannels, nextLength);
69
+ for (let ch = 0; ch < currentChannels; ch++) {
70
+ nextBuffer[ch].set(properties.buffer[ch].subarray(0, currentLength));
71
+ }
72
+ properties.buffer = nextBuffer;
73
+ if (properties.streamBuffer.totalLength == null ||
74
+ properties.streamBuffer.totalLength < nextLength) {
75
+ properties.streamBuffer.totalLength = nextLength;
76
+ }
77
+ }
78
+ function applyBufferRangeWrite(properties, write) {
79
+ const startSample = Math.max(Math.floor(write.startSample), 0);
80
+ const writeLength = write.channelData[0]?.length ?? 0;
81
+ const requestedTotalLength = write.totalLength ?? null;
82
+ const requiredLength = Math.max(startSample + writeLength, requestedTotalLength ?? 0);
83
+ ensureBufferCapacity(properties, Math.max(write.channelData.length, properties.buffer.length, 1), requiredLength);
84
+ for (let ch = 0; ch < write.channelData.length; ch++) {
85
+ properties.buffer[ch].set(write.channelData[ch], startSample);
86
+ }
87
+ if (requestedTotalLength != null) {
88
+ properties.streamBuffer.totalLength = requestedTotalLength;
89
+ }
90
+ if (writeLength > 0) {
91
+ properties.streamBuffer.writtenSpans = mergeWrittenSpan(properties.streamBuffer.writtenSpans, { startSample, endSample: startSample + writeLength });
92
+ properties.streamBuffer.committedLength = getCommittedLength(properties.streamBuffer.writtenSpans);
93
+ }
94
+ if (write.streamEnded === true) {
95
+ properties.streamBuffer.streamEnded = true;
96
+ }
97
+ resetLowWaterState(properties.streamBuffer, properties.playhead);
98
+ }
99
+ function applyPendingBufferWrites(properties) {
100
+ if (properties.streamBuffer.pendingWrites.length === 0) {
101
+ return;
102
+ }
103
+ for (const write of properties.streamBuffer.pendingWrites) {
104
+ applyBufferRangeWrite(properties, write);
105
+ }
106
+ properties.streamBuffer.pendingWrites = [];
107
+ }
108
+ function setWholeBuffer(properties, buffer) {
109
+ properties.buffer = buffer;
110
+ properties.streamBuffer = createStreamBufferState(buffer);
111
+ }
112
+ // ---------------------------------------------------------------------------
113
+ // Properties & offset
114
+ // ---------------------------------------------------------------------------
115
+ export function getProperties(opts = {}, sampleRate) {
116
+ const { buffer = [], streamBuffer = createStreamBufferState(buffer), duration = -1, loop = false, loopStart = 0, loopEnd = (buffer[0]?.length ?? 0) / sampleRate, loopCrossfade = 0, playhead = 0, offset = 0, startWhen = 0, stopWhen = 0, pauseWhen = 0, resumeWhen = 0, playedSamples = 0, state = State.Initial, timesLooped = 0, fadeInDuration = 0, fadeOutDuration = 0, enableFadeIn = fadeInDuration > 0, enableFadeOut = fadeOutDuration > 0, enableLoopStart = true, enableLoopEnd = true, enableLoopCrossfade = loopCrossfade > 0, enableHighpass = true, enableLowpass = true, enableGain = true, enablePan = true, enableDetune = true, enablePlaybackRate = true, } = opts;
117
+ return {
118
+ buffer,
119
+ streamBuffer,
120
+ loop,
121
+ loopStart,
122
+ loopEnd,
123
+ loopCrossfade,
124
+ duration,
125
+ playhead,
126
+ offset,
127
+ startWhen,
128
+ stopWhen,
129
+ pauseWhen,
130
+ resumeWhen,
131
+ playedSamples,
132
+ state,
133
+ timesLooped,
134
+ fadeInDuration,
135
+ fadeOutDuration,
136
+ enableFadeIn,
137
+ enableFadeOut,
138
+ enableLoopStart,
139
+ enableLoopEnd,
140
+ enableHighpass,
141
+ enableLowpass,
142
+ enableGain,
143
+ enablePan,
144
+ enableDetune,
145
+ enablePlaybackRate,
146
+ enableLoopCrossfade,
147
+ };
148
+ }
149
+ function getBufferDurationSeconds(properties, sampleRate) {
150
+ return getLogicalBufferLength(properties) / sampleRate;
151
+ }
152
+ function normalizeLoopBounds(properties, sampleRate) {
153
+ const bufferDuration = getBufferDurationSeconds(properties, sampleRate);
154
+ if (bufferDuration <= 0) {
155
+ properties.loopStart = 0;
156
+ properties.loopEnd = 0;
157
+ return;
158
+ }
159
+ if (!Number.isFinite(properties.loopStart) || properties.loopStart < 0) {
160
+ properties.loopStart = 0;
161
+ }
162
+ if (properties.loopStart >= bufferDuration) {
163
+ properties.loopStart = 0;
164
+ }
165
+ if (!Number.isFinite(properties.loopEnd) ||
166
+ properties.loopEnd <= properties.loopStart ||
167
+ properties.loopEnd > bufferDuration) {
168
+ properties.loopEnd = bufferDuration;
169
+ }
170
+ }
171
+ export function setOffset(properties, offset, sampleRate) {
172
+ if (offset === undefined) {
173
+ properties.offset = 0;
174
+ return 0;
175
+ }
176
+ if (offset < 0) {
177
+ return setOffset(properties, getLogicalBufferLength(properties) + offset, sampleRate);
178
+ }
179
+ if (offset > (getLogicalBufferLength(properties) || 1) - 1) {
180
+ return setOffset(properties, getLogicalBufferLength(properties) % offset, sampleRate);
181
+ }
182
+ const offs = Math.floor(offset * sampleRate);
183
+ properties.offset = offs;
184
+ return offs;
185
+ }
186
+ // ---------------------------------------------------------------------------
187
+ // Index calculation
188
+ // ---------------------------------------------------------------------------
189
+ export function findIndexesNormal(p) {
190
+ const { playhead, bufferLength, loop, loopStartSamples, loopEndSamples } = p;
191
+ let length = 128;
192
+ if (!loop && playhead + 128 > bufferLength) {
193
+ length = Math.max(bufferLength - playhead, 0);
194
+ }
195
+ const indexes = new Array(length);
196
+ if (!loop) {
197
+ for (let i = 0, head = playhead; i < length; i++, head++) {
198
+ indexes[i] = head;
199
+ }
200
+ const nextPlayhead = playhead + length;
201
+ return {
202
+ playhead: nextPlayhead,
203
+ indexes,
204
+ looped: false,
205
+ ended: nextPlayhead >= bufferLength,
206
+ };
207
+ }
208
+ let head = playhead;
209
+ let looped = false;
210
+ for (let i = 0; i < length; i++, head++) {
211
+ if (head >= loopEndSamples) {
212
+ head = loopStartSamples + (head - loopEndSamples);
213
+ looped = true;
214
+ }
215
+ indexes[i] = head;
216
+ }
217
+ return { indexes, looped, ended: false, playhead: head };
218
+ }
219
+ export function findIndexesWithPlaybackRates(p) {
220
+ const { playhead, bufferLength, loop, loopStartSamples, loopEndSamples, playbackRates, } = p;
221
+ let length = 128;
222
+ if (!loop && playhead + 128 > bufferLength) {
223
+ length = Math.max(bufferLength - playhead, 0);
224
+ }
225
+ const indexes = new Array(length);
226
+ let head = playhead;
227
+ let looped = false;
228
+ if (loop) {
229
+ for (let i = 0; i < length; i++) {
230
+ indexes[i] = Math.min(Math.max(Math.floor(head), 0), bufferLength - 1);
231
+ const rate = playbackRates[i] ?? playbackRates[0] ?? 1;
232
+ head += rate;
233
+ if (rate >= 0 && (head > loopEndSamples || head > bufferLength)) {
234
+ head = loopStartSamples;
235
+ looped = true;
236
+ }
237
+ else if (rate < 0 && (head < loopStartSamples || head < 0)) {
238
+ head = loopEndSamples;
239
+ looped = true;
240
+ }
241
+ }
242
+ return { playhead: head, indexes, looped, ended: false };
243
+ }
244
+ for (let i = 0; i < length; i++) {
245
+ indexes[i] = Math.min(Math.max(Math.floor(head), 0), bufferLength - 1);
246
+ head += playbackRates[i] ?? playbackRates[0] ?? 1;
247
+ }
248
+ return {
249
+ playhead: head,
250
+ indexes,
251
+ looped: false,
252
+ ended: head >= bufferLength || head < 0,
253
+ };
254
+ }
255
+ // ---------------------------------------------------------------------------
256
+ // Buffer operations
257
+ // ---------------------------------------------------------------------------
258
+ export function fill(target, source, indexes) {
259
+ const nc = Math.min(target.length, source.length);
260
+ for (let i = 0; i < indexes.length; i++) {
261
+ for (let ch = 0; ch < nc; ch++) {
262
+ target[ch][i] = source[ch][indexes[i]];
263
+ }
264
+ }
265
+ for (let ch = nc; ch < target.length; ch++) {
266
+ for (let i = 0; i < target[ch].length; i++) {
267
+ target[ch][i] = 0;
268
+ }
269
+ }
270
+ for (let i = indexes.length; i < target[0].length; i++) {
271
+ for (let ch = 0; ch < nc; ch++) {
272
+ target[ch][i] = 0;
273
+ }
274
+ }
275
+ }
276
+ export function fillWithSilence(buffer) {
277
+ for (let ch = 0; ch < buffer.length; ch++) {
278
+ for (let j = 0; j < buffer[ch].length; j++) {
279
+ buffer[ch][j] = 0;
280
+ }
281
+ }
282
+ }
283
+ export function monoToStereo(signal) {
284
+ if (signal.length >= 2) {
285
+ // Output already has a second channel — copy mono data into it
286
+ for (let i = 0; i < signal[0].length; i++) {
287
+ signal[1][i] = signal[0][i];
288
+ }
289
+ }
290
+ else {
291
+ const r = new Float32Array(signal[0].length);
292
+ for (let i = 0; i < signal[0].length; i++) {
293
+ r[i] = signal[0][i];
294
+ }
295
+ signal.push(r);
296
+ }
297
+ }
298
+ export function copy(source, target) {
299
+ for (let i = target.length; i < source.length; i++) {
300
+ target[i] = new Float32Array(source[i].length);
301
+ }
302
+ for (let ch = 0; ch < source.length; ch++) {
303
+ for (let i = 0; i < source[ch].length; i++) {
304
+ target[ch][i] = source[ch][i];
305
+ }
306
+ }
307
+ }
308
+ export function checkNans(output) {
309
+ let numNans = 0;
310
+ for (let ch = 0; ch < output.length; ch++) {
311
+ for (let j = 0; j < output[ch].length; j++) {
312
+ if (Number.isNaN(output[ch][j])) {
313
+ numNans++;
314
+ output[ch][j] = 0;
315
+ }
316
+ }
317
+ }
318
+ return numNans;
319
+ }
320
+ export function createFilterState() {
321
+ return [
322
+ { x_1: 0, x_2: 0, y_1: 0, y_2: 0 },
323
+ { x_1: 0, x_2: 0, y_1: 0, y_2: 0 },
324
+ ];
325
+ }
326
+ export function gainFilter(arr, gains) {
327
+ if (gains.length === 1) {
328
+ const g = gains[0];
329
+ if (g === 1)
330
+ return;
331
+ for (const ch of arr) {
332
+ for (let i = 0; i < ch.length; i++)
333
+ ch[i] *= g;
334
+ }
335
+ return;
336
+ }
337
+ let g = gains[0];
338
+ for (const ch of arr) {
339
+ for (let i = 0; i < ch.length; i++) {
340
+ g = gains[i] ?? g;
341
+ ch[i] *= g;
342
+ }
343
+ }
344
+ }
345
+ export function panFilter(signal, pans) {
346
+ let pan = pans[0];
347
+ for (let i = 0; i < signal[0].length; i++) {
348
+ pan = pans[i] ?? pan;
349
+ const leftGain = pan <= 0 ? 1 : 1 - pan;
350
+ const rightGain = pan >= 0 ? 1 : 1 + pan;
351
+ signal[0][i] *= leftGain;
352
+ signal[1][i] *= rightGain;
353
+ }
354
+ }
355
+ export function lowpassFilter(buffer, cutoffs, sampleRate, states) {
356
+ for (let channel = 0; channel < buffer.length; channel++) {
357
+ const arr = buffer[channel];
358
+ let { x_1, x_2, y_1, y_2 } = states[channel] ?? {
359
+ x_1: 0,
360
+ x_2: 0,
361
+ y_1: 0,
362
+ y_2: 0,
363
+ };
364
+ if (cutoffs.length === 1) {
365
+ const cutoff = cutoffs[0];
366
+ if (cutoff >= 20000)
367
+ return;
368
+ const w0 = (2 * Math.PI * cutoff) / sampleRate;
369
+ const alpha = Math.sin(w0) / 2;
370
+ const b0 = (1 - Math.cos(w0)) / 2;
371
+ const b1 = 1 - Math.cos(w0);
372
+ const b2 = (1 - Math.cos(w0)) / 2;
373
+ const a0 = 1 + alpha;
374
+ const a1 = -2 * Math.cos(w0);
375
+ const a2 = 1 - alpha;
376
+ const h0 = b0 / a0, h1 = b1 / a0, h2 = b2 / a0, h3 = a1 / a0, h4 = a2 / a0;
377
+ for (let i = 0; i < arr.length; i++) {
378
+ const x = arr[i];
379
+ const y = h0 * x + h1 * x_1 + h2 * x_2 - h3 * y_1 - h4 * y_2;
380
+ x_2 = x_1;
381
+ x_1 = x;
382
+ y_2 = y_1;
383
+ y_1 = y;
384
+ arr[i] = y;
385
+ }
386
+ }
387
+ else {
388
+ const prevCutoff = cutoffs[0];
389
+ for (let i = 0; i < arr.length; i++) {
390
+ const cutoff = cutoffs[i] ?? prevCutoff;
391
+ const w0 = (2 * Math.PI * cutoff) / sampleRate;
392
+ const alpha = Math.sin(w0) / 2;
393
+ const b0 = (1 - Math.cos(w0)) / 2;
394
+ const b1 = 1 - Math.cos(w0);
395
+ const b2 = (1 - Math.cos(w0)) / 2;
396
+ const a0 = 1 + alpha;
397
+ const a1 = -2 * Math.cos(w0);
398
+ const a2 = 1 - alpha;
399
+ const x = arr[i];
400
+ const y = (b0 / a0) * x +
401
+ (b1 / a0) * x_1 +
402
+ (b2 / a0) * x_2 -
403
+ (a1 / a0) * y_1 -
404
+ (a2 / a0) * y_2;
405
+ x_2 = x_1;
406
+ x_1 = x;
407
+ y_2 = y_1;
408
+ y_1 = y;
409
+ arr[i] = y;
410
+ }
411
+ }
412
+ states[channel] = { x_1, x_2, y_1, y_2 };
413
+ }
414
+ }
415
+ export function highpassFilter(buffer, cutoffs, sampleRate, states) {
416
+ for (let channel = 0; channel < buffer.length; channel++) {
417
+ const arr = buffer[channel];
418
+ let { x_1, x_2, y_1, y_2 } = states[channel] ?? {
419
+ x_1: 0,
420
+ x_2: 0,
421
+ y_1: 0,
422
+ y_2: 0,
423
+ };
424
+ if (cutoffs.length === 1) {
425
+ const cutoff = cutoffs[0];
426
+ if (cutoff <= 20)
427
+ return;
428
+ const w0 = (2 * Math.PI * cutoff) / sampleRate;
429
+ const alpha = Math.sin(w0) / 2;
430
+ const b0 = (1 + Math.cos(w0)) / 2;
431
+ const b1 = -(1 + Math.cos(w0));
432
+ const b2 = (1 + Math.cos(w0)) / 2;
433
+ const a0 = 1 + alpha;
434
+ const a1 = -2 * Math.cos(w0);
435
+ const a2 = 1 - alpha;
436
+ for (let i = 0; i < arr.length; i++) {
437
+ const x = arr[i];
438
+ const y = (b0 / a0) * x +
439
+ (b1 / a0) * x_1 +
440
+ (b2 / a0) * x_2 -
441
+ (a1 / a0) * y_1 -
442
+ (a2 / a0) * y_2;
443
+ x_2 = x_1;
444
+ x_1 = x;
445
+ y_2 = y_1;
446
+ y_1 = y;
447
+ arr[i] = y;
448
+ }
449
+ }
450
+ else {
451
+ const prevCutoff = cutoffs[0];
452
+ for (let i = 0; i < arr.length; i++) {
453
+ const cutoff = cutoffs[i] ?? prevCutoff;
454
+ const w0 = (2 * Math.PI * cutoff) / sampleRate;
455
+ const alpha = Math.sin(w0) / 2;
456
+ const b0 = (1 + Math.cos(w0)) / 2;
457
+ const b1 = -(1 + Math.cos(w0));
458
+ const b2 = (1 + Math.cos(w0)) / 2;
459
+ const a0 = 1 + alpha;
460
+ const a1 = -2 * Math.cos(w0);
461
+ const a2 = 1 - alpha;
462
+ const x = arr[i];
463
+ const y = (b0 / a0) * x +
464
+ (b1 / a0) * x_1 +
465
+ (b2 / a0) * x_2 -
466
+ (a1 / a0) * y_1 -
467
+ (a2 / a0) * y_2;
468
+ x_2 = x_1;
469
+ x_1 = x;
470
+ y_2 = y_1;
471
+ y_1 = y;
472
+ arr[i] = y;
473
+ }
474
+ }
475
+ states[channel] = { x_1, x_2, y_1, y_2 };
476
+ }
477
+ }
478
+ export function handleProcessorMessage(properties, message, currentTime, sampleRate) {
479
+ const { type, data } = message;
480
+ switch (type) {
481
+ case "buffer":
482
+ setWholeBuffer(properties, data);
483
+ normalizeLoopBounds(properties, sampleRate);
484
+ return [];
485
+ case "bufferInit": {
486
+ const init = data;
487
+ properties.buffer = createSilentBuffer(init.channels, init.totalLength);
488
+ properties.streamBuffer = {
489
+ ...createStreamBufferState(),
490
+ totalLength: init.totalLength,
491
+ streamEnded: false,
492
+ streaming: init.streaming ?? true,
493
+ };
494
+ normalizeLoopBounds(properties, sampleRate);
495
+ return [];
496
+ }
497
+ case "bufferRange":
498
+ properties.streamBuffer.pendingWrites.push(data);
499
+ return [];
500
+ case "bufferEnd": {
501
+ const endData = data;
502
+ if (endData?.totalLength != null) {
503
+ properties.streamBuffer.totalLength = endData.totalLength;
504
+ }
505
+ properties.streamBuffer.streamEnded = true;
506
+ return [];
507
+ }
508
+ case "bufferReset":
509
+ properties.buffer = [];
510
+ properties.streamBuffer = createStreamBufferState();
511
+ normalizeLoopBounds(properties, sampleRate);
512
+ return [];
513
+ case "start":
514
+ properties.timesLooped = 0;
515
+ {
516
+ const d = data;
517
+ properties.duration = d?.duration ?? -1;
518
+ if (properties.duration === -1) {
519
+ properties.duration = properties.loop
520
+ ? Number.MAX_SAFE_INTEGER
521
+ : (properties.buffer[0]?.length ?? 0) / sampleRate;
522
+ }
523
+ setOffset(properties, d?.offset, sampleRate);
524
+ normalizeLoopBounds(properties, sampleRate);
525
+ properties.playhead = properties.offset;
526
+ properties.startWhen = d?.when ?? currentTime;
527
+ properties.stopWhen = properties.startWhen + properties.duration;
528
+ properties.playedSamples = 0;
529
+ properties.state = State.Scheduled;
530
+ }
531
+ return [{ type: "scheduled" }];
532
+ case "stop":
533
+ if (properties.state === State.Ended ||
534
+ properties.state === State.Initial)
535
+ return [];
536
+ properties.stopWhen = data ?? properties.stopWhen;
537
+ properties.state = State.Stopped;
538
+ return [{ type: "stopped" }];
539
+ case "pause":
540
+ properties.state = State.Paused;
541
+ properties.pauseWhen = data ?? currentTime;
542
+ return [{ type: "paused" }];
543
+ case "resume":
544
+ properties.state = State.Started;
545
+ properties.startWhen = data ?? currentTime;
546
+ return [{ type: "resume" }];
547
+ case "dispose":
548
+ properties.state = State.Disposed;
549
+ properties.buffer = [];
550
+ properties.streamBuffer = createStreamBufferState();
551
+ return [{ type: "disposed" }];
552
+ case "loop": {
553
+ const loop = data;
554
+ const st = properties.state;
555
+ if (loop && (st === State.Scheduled || st === State.Started)) {
556
+ properties.stopWhen = Number.MAX_SAFE_INTEGER;
557
+ properties.duration = Number.MAX_SAFE_INTEGER;
558
+ }
559
+ properties.loop = loop;
560
+ if (loop) {
561
+ normalizeLoopBounds(properties, sampleRate);
562
+ }
563
+ return [];
564
+ }
565
+ case "loopStart":
566
+ properties.loopStart = data;
567
+ return [];
568
+ case "loopEnd":
569
+ properties.loopEnd = data;
570
+ return [];
571
+ case "loopCrossfade":
572
+ properties.loopCrossfade = data;
573
+ properties.enableLoopCrossfade = properties.loopCrossfade > 0;
574
+ return [];
575
+ case "playhead":
576
+ properties.playhead = Math.floor(data);
577
+ return [];
578
+ case "fadeIn":
579
+ properties.fadeInDuration = data;
580
+ properties.enableFadeIn = properties.fadeInDuration > 0;
581
+ return [];
582
+ case "fadeOut":
583
+ properties.fadeOutDuration = data;
584
+ properties.enableFadeOut = properties.fadeOutDuration > 0;
585
+ return [];
586
+ case "toggleGain":
587
+ properties.enableGain =
588
+ data ?? !properties.enableGain;
589
+ return [];
590
+ case "togglePan":
591
+ properties.enablePan =
592
+ data ?? !properties.enablePan;
593
+ return [];
594
+ case "toggleLowpass":
595
+ properties.enableLowpass =
596
+ data ?? !properties.enableLowpass;
597
+ return [];
598
+ case "toggleHighpass":
599
+ properties.enableHighpass =
600
+ data ?? !properties.enableHighpass;
601
+ return [];
602
+ case "toggleDetune":
603
+ properties.enableDetune =
604
+ data ?? !properties.enableDetune;
605
+ return [];
606
+ case "togglePlaybackRate":
607
+ properties.enablePlaybackRate =
608
+ data ?? !properties.enablePlaybackRate;
609
+ return [];
610
+ case "toggleFadeIn":
611
+ properties.enableFadeIn =
612
+ data ?? !properties.enableFadeIn;
613
+ return [];
614
+ case "toggleFadeOut":
615
+ properties.enableFadeOut =
616
+ data ?? !properties.enableFadeOut;
617
+ return [];
618
+ case "toggleLoopStart":
619
+ properties.enableLoopStart =
620
+ data ?? !properties.enableLoopStart;
621
+ return [];
622
+ case "toggleLoopEnd":
623
+ properties.enableLoopEnd =
624
+ data ?? !properties.enableLoopEnd;
625
+ return [];
626
+ case "toggleLoopCrossfade":
627
+ properties.enableLoopCrossfade =
628
+ data ?? !properties.enableLoopCrossfade;
629
+ return [];
630
+ case "logState":
631
+ return [];
632
+ }
633
+ return [];
634
+ }
635
+ export function processBlock(props, outputs, parameters, ctx, filterState) {
636
+ const messages = [];
637
+ let state = props.state;
638
+ if (state === State.Disposed)
639
+ return { keepAlive: false, messages };
640
+ applyPendingBufferWrites(props);
641
+ if (state === State.Initial)
642
+ return { keepAlive: true, messages };
643
+ if (state === State.Ended) {
644
+ fillWithSilence(outputs[0]);
645
+ return { keepAlive: true, messages };
646
+ }
647
+ if (state === State.Scheduled) {
648
+ if (ctx.currentTime >= props.startWhen) {
649
+ state = props.state = State.Started;
650
+ messages.push({ type: "started" });
651
+ }
652
+ else {
653
+ fillWithSilence(outputs[0]);
654
+ return { keepAlive: true, messages };
655
+ }
656
+ }
657
+ else if (state === State.Paused) {
658
+ if (ctx.currentTime > props.pauseWhen) {
659
+ fillWithSilence(outputs[0]);
660
+ return { keepAlive: true, messages };
661
+ }
662
+ }
663
+ if (ctx.currentTime > props.stopWhen) {
664
+ fillWithSilence(outputs[0]);
665
+ props.state = State.Ended;
666
+ messages.push({ type: "ended" });
667
+ props.playedSamples = 0;
668
+ return { keepAlive: true, messages };
669
+ }
670
+ const output0 = outputs[0];
671
+ const sourceLength = getLogicalBufferLength(props);
672
+ if (sourceLength === 0) {
673
+ fillWithSilence(output0);
674
+ return { keepAlive: true, messages };
675
+ }
676
+ const { playbackRate: playbackRates, detune: detunes, lowpass, highpass, gain: gains, pan: pans, } = parameters;
677
+ const { buffer, loopStart, loopEnd, loopCrossfade, stopWhen, playedSamples, enableLowpass, enableHighpass, enableGain, enablePan, enableDetune, enableFadeOut, enableFadeIn, enableLoopStart, enableLoopEnd, enableLoopCrossfade, playhead, fadeInDuration, fadeOutDuration, } = props;
678
+ const hasIncompleteStream = props.streamBuffer.streaming &&
679
+ props.streamBuffer.committedLength < sourceLength;
680
+ const loop = props.loop;
681
+ // When looping during an incomplete stream, clamp effective length to committed data
682
+ // to avoid reading silence/unwritten regions.
683
+ const effectiveSourceLength = hasIncompleteStream && loop
684
+ ? Math.max(props.streamBuffer.committedLength, 0)
685
+ : sourceLength;
686
+ // Guard against degenerate tiny loops that would produce audible artifacts
687
+ const MIN_LOOP_SAMPLES = SAMPLE_BLOCK_SIZE * 2;
688
+ if (hasIncompleteStream && loop && effectiveSourceLength < MIN_LOOP_SAMPLES) {
689
+ fillWithSilence(output0);
690
+ for (let i = 1; i < outputs.length; i++) {
691
+ copy(output0, outputs[i]);
692
+ }
693
+ return { keepAlive: true, messages };
694
+ }
695
+ const nc = Math.min(buffer.length, output0.length);
696
+ const durationSamples = props.duration * ctx.sampleRate;
697
+ const loopCrossfadeSamples = Math.floor(ctx.sampleRate * loopCrossfade);
698
+ const maxLoopStartSample = Math.max(effectiveSourceLength - SAMPLE_BLOCK_SIZE, 0);
699
+ const loopStartSamples = enableLoopStart
700
+ ? Math.min(Math.floor(loopStart * ctx.sampleRate), maxLoopStartSample)
701
+ : 0;
702
+ const loopEndSamples = enableLoopEnd
703
+ ? Math.min(Math.floor(loopEnd * ctx.sampleRate), effectiveSourceLength)
704
+ : effectiveSourceLength;
705
+ const loopLengthSamples = loopEndSamples - loopStartSamples;
706
+ // Apply detune to playback rates: effectiveRate = rate * 2^(detune/1200)
707
+ const needsDetune = enableDetune && detunes.length > 0 && detunes[0] !== 0;
708
+ let effectiveRates = playbackRates;
709
+ if (needsDetune) {
710
+ const len = Math.max(playbackRates.length, detunes.length, SAMPLE_BLOCK_SIZE);
711
+ effectiveRates = new Float32Array(len);
712
+ for (let i = 0; i < len; i++) {
713
+ const rate = playbackRates[i] ?? playbackRates[playbackRates.length - 1];
714
+ const cents = detunes[i] ?? detunes[detunes.length - 1];
715
+ effectiveRates[i] = rate * 2 ** (cents / 1200);
716
+ }
717
+ }
718
+ const useRateIndexing = props.enablePlaybackRate || needsDetune;
719
+ const isZeroRateBlock = useRateIndexing &&
720
+ effectiveRates.length > 0 &&
721
+ effectiveRates.every((rate) => rate === 0);
722
+ if (props.streamBuffer.streaming &&
723
+ !props.streamBuffer.streamEnded &&
724
+ !props.streamBuffer.lowWaterNotified &&
725
+ props.streamBuffer.committedLength - Math.floor(playhead) <
726
+ props.streamBuffer.lowWaterThreshold) {
727
+ messages.push({
728
+ type: "bufferLowWater",
729
+ data: {
730
+ playhead: Math.floor(playhead),
731
+ committedLength: props.streamBuffer.committedLength,
732
+ },
733
+ });
734
+ props.streamBuffer.lowWaterNotified = true;
735
+ }
736
+ if (isZeroRateBlock) {
737
+ fillWithSilence(output0);
738
+ for (let i = 1; i < outputs.length; i++) {
739
+ copy(output0, outputs[i]);
740
+ }
741
+ return { keepAlive: true, messages };
742
+ }
743
+ const blockParams = {
744
+ bufferLength: effectiveSourceLength,
745
+ loop,
746
+ playhead: props.playhead,
747
+ loopStartSamples,
748
+ loopEndSamples,
749
+ durationSamples,
750
+ playbackRates: effectiveRates,
751
+ };
752
+ const { indexes, ended, looped, playhead: updatedPlayhead, } = useRateIndexing
753
+ ? findIndexesWithPlaybackRates(blockParams)
754
+ : findIndexesNormal(blockParams);
755
+ const underrunSample = indexes.find((index) => index >= props.streamBuffer.committedLength && index < sourceLength);
756
+ if (underrunSample !== undefined &&
757
+ !props.streamBuffer.streamEnded &&
758
+ props.streamBuffer.lastUnderrunSample !== underrunSample) {
759
+ messages.push({
760
+ type: "bufferUnderrun",
761
+ data: {
762
+ playhead: Math.floor(playhead),
763
+ committedLength: props.streamBuffer.committedLength,
764
+ requestedSample: underrunSample,
765
+ },
766
+ });
767
+ props.streamBuffer.lastUnderrunSample = underrunSample;
768
+ }
769
+ else if (underrunSample === undefined) {
770
+ props.streamBuffer.lastUnderrunSample = null;
771
+ }
772
+ fill(output0, buffer, indexes);
773
+ // --- Loop crossfade ---
774
+ const xfadeNumSamples = Math.min(Math.floor(loopCrossfade * ctx.sampleRate), loopLengthSamples);
775
+ const isWithinLoopRange = loop && playhead > loopStartSamples && playhead < loopEndSamples;
776
+ const needsCrossfade = enableLoopCrossfade &&
777
+ loopCrossfadeSamples > 0 &&
778
+ effectiveSourceLength > SAMPLE_BLOCK_SIZE;
779
+ if (isWithinLoopRange && needsCrossfade) {
780
+ // Crossfade out at loop start: fade out tail of previous loop iteration.
781
+ // Source: reads from END of loop (loopEnd - xfade to loopEnd).
782
+ {
783
+ const endIndex = loopStartSamples + xfadeNumSamples;
784
+ if (xfadeNumSamples > 0 &&
785
+ playhead > loopStartSamples &&
786
+ playhead < endIndex) {
787
+ const elapsed = playhead - loopStartSamples;
788
+ const n = Math.min(Math.floor(endIndex - playhead), SAMPLE_BLOCK_SIZE);
789
+ for (let i = 0; i < n; i++) {
790
+ const position = (elapsed + i) / xfadeNumSamples;
791
+ const g = Math.cos((Math.PI * position) / 2);
792
+ const srcIdx = Math.floor(loopEndSamples - xfadeNumSamples + elapsed + i);
793
+ if (srcIdx >= 0 && srcIdx < effectiveSourceLength) {
794
+ for (let ch = 0; ch < nc; ch++) {
795
+ output0[ch][i] += buffer[ch][srcIdx] * g;
796
+ }
797
+ }
798
+ }
799
+ }
800
+ }
801
+ // Crossfade in approaching loop end: fade in head of next loop iteration.
802
+ // Source: reads from START of loop (loopStart to loopStart + xfade).
803
+ {
804
+ const startIndex = loopEndSamples - xfadeNumSamples;
805
+ if (xfadeNumSamples > 0 &&
806
+ playhead > startIndex &&
807
+ playhead < loopEndSamples) {
808
+ const elapsed = playhead - startIndex;
809
+ const n = Math.min(Math.floor(loopEndSamples - playhead), SAMPLE_BLOCK_SIZE);
810
+ for (let i = 0; i < n; i++) {
811
+ const position = (elapsed + i) / xfadeNumSamples;
812
+ const g = Math.sin((Math.PI * position) / 2);
813
+ const srcIdx = Math.floor(loopStartSamples + elapsed + i);
814
+ if (srcIdx >= 0 && srcIdx < effectiveSourceLength) {
815
+ for (let ch = 0; ch < nc; ch++) {
816
+ output0[ch][i] += buffer[ch][srcIdx] * g;
817
+ }
818
+ }
819
+ }
820
+ }
821
+ }
822
+ }
823
+ // --- Fade in ---
824
+ if (enableFadeIn && fadeInDuration > 0) {
825
+ const fadeInSamples = Math.floor(fadeInDuration * ctx.sampleRate);
826
+ const remaining = fadeInSamples - playedSamples;
827
+ if (remaining > 0) {
828
+ const n = Math.min(remaining, SAMPLE_BLOCK_SIZE);
829
+ for (let i = 0; i < n; i++) {
830
+ const t = (playedSamples + i) / fadeInSamples;
831
+ const g = t * t * t; // cubic: slow start, fast finish
832
+ for (let ch = 0; ch < nc; ch++) {
833
+ output0[ch][i] *= g;
834
+ }
835
+ }
836
+ }
837
+ }
838
+ // --- Fade out ---
839
+ if (enableFadeOut && fadeOutDuration > 0) {
840
+ const fadeOutSamples = Math.floor(fadeOutDuration * ctx.sampleRate);
841
+ const remainingSamples = Math.floor(ctx.sampleRate * (stopWhen - ctx.currentTime));
842
+ if (remainingSamples < fadeOutSamples + SAMPLE_BLOCK_SIZE) {
843
+ for (let i = 0; i < SAMPLE_BLOCK_SIZE; i++) {
844
+ const sampleRemaining = remainingSamples - i;
845
+ if (sampleRemaining >= fadeOutSamples)
846
+ continue; // not yet in fade zone
847
+ const t = sampleRemaining <= 0 ? 0 : sampleRemaining / fadeOutSamples;
848
+ const g = t * t * t; // cubic fade-out: fast drop, slow tail
849
+ for (let ch = 0; ch < nc; ch++) {
850
+ output0[ch][i] *= g;
851
+ }
852
+ }
853
+ }
854
+ }
855
+ // --- Filters ---
856
+ if (enableLowpass)
857
+ lowpassFilter(output0, lowpass, ctx.sampleRate, filterState.lowpass);
858
+ if (enableHighpass)
859
+ highpassFilter(output0, highpass, ctx.sampleRate, filterState.highpass);
860
+ if (enableGain)
861
+ gainFilter(output0, gains);
862
+ if (nc === 1)
863
+ monoToStereo(output0);
864
+ if (enablePan)
865
+ panFilter(output0, pans);
866
+ if (looped) {
867
+ props.timesLooped++;
868
+ messages.push({ type: "looped", data: props.timesLooped });
869
+ }
870
+ if (ended) {
871
+ props.state = State.Ended;
872
+ messages.push({ type: "ended" });
873
+ }
874
+ props.playedSamples += indexes.length;
875
+ props.playhead = updatedPlayhead;
876
+ const numNans = checkNans(output0);
877
+ if (numNans > 0) {
878
+ console.log({
879
+ numNans,
880
+ indexes,
881
+ playhead: updatedPlayhead,
882
+ ended,
883
+ looped,
884
+ sourceLength,
885
+ });
886
+ return { keepAlive: true, messages };
887
+ }
888
+ for (let i = 1; i < outputs.length; i++) {
889
+ copy(output0, outputs[i]);
890
+ }
891
+ return { keepAlive: true, messages };
892
+ }