@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,726 @@
1
+ import {
2
+ memo,
3
+ useCallback,
4
+ useEffect,
5
+ useRef,
6
+ useState,
7
+ } from "./react-runtime";
8
+ import {
9
+ ControlSection,
10
+ DetuneControl,
11
+ FilterControl,
12
+ GainControl,
13
+ PanControl,
14
+ PlaybackRateControl,
15
+ PlayheadSlider,
16
+ useClipControls,
17
+ } from "./clip-node-lib";
18
+ import type { ControlKey } from "./clip-node-lib";
19
+ import type { ClipNodeState, FrameData } from "./clip-node-lib";
20
+ import {
21
+ controlDefs,
22
+ loopControlDefs,
23
+ transportLinkedControlPairs,
24
+ loopLinkedControlPairs,
25
+ getActiveLinkedControls,
26
+ getLinkedControlPairForControl,
27
+ getLinkedControlUpdates,
28
+ isTempoRelativeSnap,
29
+ remapTempoRelativeValue,
30
+ } from "./clip-node-lib";
31
+ import { useStreamingClipNode } from "./useStreamingClipNode";
32
+ import type { RefObject } from "./react-runtime";
33
+ import type { StreamFormat } from "./clip-node-lib";
34
+ import { getDefaultUrlForFormat } from "./streamFormat";
35
+
36
+ /**
37
+ * Reads frame data from a ref via its own RAF loop and updates DOM directly,
38
+ * avoiding React re-renders on every animation frame.
39
+ */
40
+ function StreamingDisplayPanelInner({
41
+ nodeState,
42
+ frameRef,
43
+ timesLoopedRef,
44
+ latency,
45
+ }: {
46
+ nodeState: ClipNodeState;
47
+ frameRef: RefObject<FrameData | null>;
48
+ timesLoopedRef: RefObject<string>;
49
+ latency: string;
50
+ }) {
51
+ const timeEl = useRef<HTMLOutputElement>(null);
52
+ const frameEl = useRef<HTMLOutputElement>(null);
53
+ const loopsEl = useRef<HTMLOutputElement>(null);
54
+ const ttEl = useRef<HTMLOutputElement>(null);
55
+
56
+ useEffect(() => {
57
+ let raf: number;
58
+ const tick = () => {
59
+ const f = frameRef.current;
60
+ if (f) {
61
+ const [ct, cf, , tt] = f;
62
+ if (timeEl.current) timeEl.current.textContent = ct.toPrecision(4);
63
+ if (frameEl.current)
64
+ frameEl.current.textContent = cf.toString();
65
+ if (ttEl.current) ttEl.current.textContent = tt.toFixed(4);
66
+ }
67
+ if (loopsEl.current)
68
+ loopsEl.current.textContent = timesLoopedRef.current;
69
+ raf = requestAnimationFrame(tick);
70
+ };
71
+ raf = requestAnimationFrame(tick);
72
+ return () => cancelAnimationFrame(raf);
73
+ }, [frameRef, timesLoopedRef]);
74
+
75
+ return (
76
+ <section id="display">
77
+ <code>Sound:</code>
78
+ <output>Stream</output>
79
+ <code>State:</code>
80
+ <output>{nodeState}</output>
81
+ <code>Time:</code>
82
+ <output ref={timeEl}>0</output>
83
+ <code>Loops:</code>
84
+ <output ref={loopsEl}>0</output>
85
+ <details className="display-details">
86
+ <summary>Debug</summary>
87
+ <div className="display-details__row">
88
+ <code>Frame:</code>
89
+ <output ref={frameEl}>0</output>
90
+ <code>Latency:</code>
91
+ <output>{latency}</output>
92
+ <code>TimeTaken:</code>
93
+ <output ref={ttEl}>unknown</output>
94
+ </div>
95
+ </details>
96
+ </section>
97
+ );
98
+ }
99
+ const StreamingDisplayPanel = memo(StreamingDisplayPanelInner);
100
+
101
+ /**
102
+ * Isolates playhead updates from the parent component tree.
103
+ * Reads the playhead position from frameRef via its own RAF loop,
104
+ * so only this small subtree re-renders at 60fps.
105
+ */
106
+ function StreamingPlayheadInner({
107
+ frameRef,
108
+ audioDuration,
109
+ disabled,
110
+ onChange,
111
+ }: {
112
+ frameRef: RefObject<FrameData | null>;
113
+ audioDuration: number | null;
114
+ disabled: boolean;
115
+ onChange: (v: number) => void;
116
+ }) {
117
+ const [value, setValue] = useState(0);
118
+
119
+ useEffect(() => {
120
+ let raf: number;
121
+ const tick = () => {
122
+ const f = frameRef.current;
123
+ if (f) {
124
+ setValue(f[2]);
125
+ }
126
+ raf = requestAnimationFrame(tick);
127
+ };
128
+ raf = requestAnimationFrame(tick);
129
+ return () => cancelAnimationFrame(raf);
130
+ }, [frameRef]);
131
+
132
+ return (
133
+ <PlayheadSlider
134
+ value={value}
135
+ audioDuration={audioDuration}
136
+ disabled={disabled}
137
+ onChange={onChange}
138
+ />
139
+ );
140
+ }
141
+ const StreamingPlayhead = memo(StreamingPlayheadInner);
142
+
143
+ function buildControlUpdates<T>(
144
+ keys: readonly ControlKey[],
145
+ value: T,
146
+ ): Partial<Record<ControlKey, T>> {
147
+ return Object.fromEntries(
148
+ keys.map((key) => [key, value] satisfies [ControlKey, T]),
149
+ ) as Partial<Record<ControlKey, T>>;
150
+ }
151
+
152
+ export function App() {
153
+ const controls = useClipControls();
154
+ const node = useStreamingClipNode({
155
+ values: controls.values,
156
+ enabled: controls.enabled,
157
+ loop: controls.loop,
158
+ setValue: controls.setValue,
159
+ });
160
+
161
+ const [format, setFormat] = useState<StreamFormat>("Mp3");
162
+ const [url, setUrl] = useState(getDefaultUrlForFormat("Mp3"));
163
+ const [throttle, setThrottle] = useState(0);
164
+ const [tempoDraft, setTempoDraft] = useState(() => String(controls.tempo));
165
+ const [isEditingTempo, setIsEditingTempo] = useState(false);
166
+ const progressRef = useRef<HTMLDivElement>(null);
167
+
168
+ const handleFormatChange = useCallback((nextFormat: StreamFormat) => {
169
+ setFormat(nextFormat);
170
+ setUrl((prevUrl: string) => {
171
+ const trimmed = prevUrl.trim();
172
+ if (!trimmed) {
173
+ return getDefaultUrlForFormat(nextFormat);
174
+ }
175
+ const knownDefaults: StreamFormat[] = [
176
+ "Mp3",
177
+ "OggOpus",
178
+ "RawOpusFramed",
179
+ "WebmOpus",
180
+ ];
181
+ return knownDefaults.some(
182
+ (format) => trimmed === getDefaultUrlForFormat(format),
183
+ )
184
+ ? getDefaultUrlForFormat(nextFormat)
185
+ : prevUrl;
186
+ });
187
+ }, []);
188
+
189
+ // Sync progress bar width
190
+ useEffect(() => {
191
+ if (progressRef.current) {
192
+ progressRef.current.style.width = `${Math.min(100, node.progress * 100).toFixed(1)}%`;
193
+ }
194
+ }, [node.progress]);
195
+
196
+ // Persist audioDuration into maxs state for locked controls
197
+ useEffect(() => {
198
+ if (node.audioDuration == null) return;
199
+ for (const key of Object.keys(controls.maxLocked) as ControlKey[]) {
200
+ if (controls.maxLocked[key]) {
201
+ controls.setMax(key, node.audioDuration);
202
+ }
203
+ }
204
+ }, [node.audioDuration, controls.maxLocked, controls.setMax]);
205
+
206
+ useEffect(() => {
207
+ if (isEditingTempo) return;
208
+ setTempoDraft(String(controls.tempo));
209
+ }, [controls.tempo, isEditingTempo]);
210
+
211
+ // ── Control handlers (same pattern as main App.tsx) ──
212
+
213
+ const handleValueChange = useCallback(
214
+ (key: ControlKey, val: number) => {
215
+ const linkedPair = getLinkedControlPairForControl(key);
216
+ if (linkedPair && controls.linkedPairs[linkedPair.key]) {
217
+ const effectiveMaxs = { ...controls.maxs };
218
+ for (const linkedKey of linkedPair.controls) {
219
+ if (controls.maxLocked[linkedKey] && node.audioDuration != null) {
220
+ effectiveMaxs[linkedKey] = node.audioDuration;
221
+ }
222
+ }
223
+ const nextValues = getLinkedControlUpdates({
224
+ pair: linkedPair,
225
+ changedKey: key,
226
+ nextValue: val,
227
+ values: controls.values,
228
+ mins: controls.mins,
229
+ maxs: effectiveMaxs,
230
+ });
231
+ controls.setValuesPartial(nextValues);
232
+ node.applyValues(nextValues);
233
+ return;
234
+ }
235
+ node.applyValue(key, val);
236
+ },
237
+ [
238
+ controls.linkedPairs,
239
+ controls.maxLocked,
240
+ controls.maxs,
241
+ controls.mins,
242
+ controls.setValuesPartial,
243
+ controls.values,
244
+ node.applyValue,
245
+ node.applyValues,
246
+ node.audioDuration,
247
+ ],
248
+ );
249
+
250
+ const handleTempoChange = useCallback(
251
+ (nextTempo: number) => {
252
+ if (!Number.isFinite(nextTempo) || nextTempo <= 0) return;
253
+ const previousTempo = controls.tempo;
254
+ if (nextTempo === previousTempo) return;
255
+
256
+ const changedValues: Partial<Record<ControlKey, number>> = {};
257
+ for (const key of Object.keys(controls.values) as ControlKey[]) {
258
+ const snap = controls.snaps[key];
259
+ if (!isTempoRelativeSnap(snap)) continue;
260
+ const effectiveMax =
261
+ controls.maxLocked[key] && node.audioDuration != null
262
+ ? node.audioDuration
263
+ : controls.maxs[key];
264
+ const nextValue = remapTempoRelativeValue(
265
+ controls.values[key],
266
+ snap,
267
+ previousTempo,
268
+ nextTempo,
269
+ controls.mins[key],
270
+ effectiveMax,
271
+ );
272
+ if (nextValue !== controls.values[key]) {
273
+ changedValues[key] = nextValue;
274
+ }
275
+ }
276
+ controls.setTempoAndValues(nextTempo, changedValues);
277
+ node.applyValues(changedValues);
278
+ },
279
+ [
280
+ controls.maxLocked,
281
+ controls.maxs,
282
+ controls.mins,
283
+ controls.setTempoAndValues,
284
+ controls.snaps,
285
+ controls.tempo,
286
+ controls.values,
287
+ node.applyValues,
288
+ node.audioDuration,
289
+ ],
290
+ );
291
+
292
+ const commitTempoDraft = useCallback(() => {
293
+ const nextTempo = Number(tempoDraft.trim());
294
+ setIsEditingTempo(false);
295
+ if (!Number.isFinite(nextTempo) || nextTempo <= 0) {
296
+ setTempoDraft(String(controls.tempo));
297
+ return;
298
+ }
299
+ handleTempoChange(nextTempo);
300
+ setTempoDraft(String(nextTempo));
301
+ }, [controls.tempo, handleTempoChange, tempoDraft]);
302
+
303
+ const handleSnapChange = useCallback(
304
+ (key: ControlKey, snap: string) => {
305
+ const linkedKeys = getActiveLinkedControls(key, controls.linkedPairs);
306
+ controls.setSnapsPartial(buildControlUpdates(linkedKeys, snap));
307
+ },
308
+ [controls.linkedPairs, controls.setSnapsPartial],
309
+ );
310
+
311
+ const handleToggle = useCallback(
312
+ (key: ControlKey, on: boolean) => {
313
+ const linkedKeys = getActiveLinkedControls(key, controls.linkedPairs);
314
+ controls.setEnabledPartial(buildControlUpdates(linkedKeys, on));
315
+ for (const linkedKey of linkedKeys) {
316
+ node.applyToggle(linkedKey, on);
317
+ }
318
+ },
319
+ [controls.linkedPairs, controls.setEnabledPartial, node.applyToggle],
320
+ );
321
+
322
+ const handleMinChange = useCallback(
323
+ (key: ControlKey, val: number) => {
324
+ const linkedKeys = getActiveLinkedControls(key, controls.linkedPairs);
325
+ controls.setMinsPartial(buildControlUpdates(linkedKeys, val));
326
+ },
327
+ [controls.linkedPairs, controls.setMinsPartial],
328
+ );
329
+
330
+ const handleMaxChange = useCallback(
331
+ (key: ControlKey, val: number) => {
332
+ const linkedKeys = getActiveLinkedControls(key, controls.linkedPairs);
333
+ controls.setMaxsPartial(buildControlUpdates(linkedKeys, val));
334
+ },
335
+ [controls.linkedPairs, controls.setMaxsPartial],
336
+ );
337
+
338
+ const handleLoopChange = useCallback(
339
+ (checked: boolean) => {
340
+ controls.setLoop(checked);
341
+ node.setLoopOnNode(checked);
342
+ },
343
+ [controls.setLoop, node.setLoopOnNode],
344
+ );
345
+
346
+ const handleMaxLockedChange = useCallback(
347
+ (key: ControlKey, locked: boolean) => {
348
+ const linkedKeys = getActiveLinkedControls(key, controls.linkedPairs);
349
+ controls.setMaxLockedPartial(buildControlUpdates(linkedKeys, locked));
350
+ if (locked && node.audioDuration != null) {
351
+ controls.setMaxsPartial(
352
+ buildControlUpdates(linkedKeys, node.audioDuration),
353
+ );
354
+ }
355
+ },
356
+ [
357
+ controls.linkedPairs,
358
+ controls.setMaxLockedPartial,
359
+ controls.setMaxsPartial,
360
+ node.audioDuration,
361
+ ],
362
+ );
363
+
364
+ const handlePlayheadChange = useCallback(
365
+ (v: number) => node.seekPlayhead(v),
366
+ [node],
367
+ );
368
+ const handlePlaybackRateChange = useCallback(
369
+ (v: number) => handleValueChange("playbackRate", v),
370
+ [handleValueChange],
371
+ );
372
+ const handlePlaybackRateToggle = useCallback(
373
+ (on: boolean) => handleToggle("playbackRate", on),
374
+ [handleToggle],
375
+ );
376
+ const handleDetuneChange = useCallback(
377
+ (v: number) => handleValueChange("detune", v),
378
+ [handleValueChange],
379
+ );
380
+ const handleDetuneToggle = useCallback(
381
+ (on: boolean) => handleToggle("detune", on),
382
+ [handleToggle],
383
+ );
384
+ const handleGainChange = useCallback(
385
+ (v: number) => handleValueChange("gain", v),
386
+ [handleValueChange],
387
+ );
388
+ const handleGainToggle = useCallback(
389
+ (on: boolean) => handleToggle("gain", on),
390
+ [handleToggle],
391
+ );
392
+ const handlePanChange = useCallback(
393
+ (v: number) => handleValueChange("pan", v),
394
+ [handleValueChange],
395
+ );
396
+ const handlePanToggle = useCallback(
397
+ (on: boolean) => handleToggle("pan", on),
398
+ [handleToggle],
399
+ );
400
+ const handleLowpassChange = useCallback(
401
+ (v: number) => handleValueChange("lowpass", v),
402
+ [handleValueChange],
403
+ );
404
+ const handleLowpassToggle = useCallback(
405
+ (on: boolean) => handleToggle("lowpass", on),
406
+ [handleToggle],
407
+ );
408
+ const handleHighpassChange = useCallback(
409
+ (v: number) => handleValueChange("highpass", v),
410
+ [handleValueChange],
411
+ );
412
+ const handleHighpassToggle = useCallback(
413
+ (on: boolean) => handleToggle("highpass", on),
414
+ [handleToggle],
415
+ );
416
+
417
+ const isStreaming =
418
+ node.nodeState !== "initial" &&
419
+ node.nodeState !== "stopped" &&
420
+ node.nodeState !== "ended" &&
421
+ node.nodeState !== "disposed";
422
+
423
+ return (
424
+ <main>
425
+ {/* ── Streaming-specific header ── */}
426
+ <h1 style={{ fontSize: "1.5rem", marginBottom: "0.25rem" }}>
427
+ ClipNode — Streaming
428
+ </h1>
429
+ <p style={{ color: "#94a3b8", marginTop: 0, fontSize: "0.9rem" }}>
430
+ Stream &amp; decode MP3, Ogg Opus, framed raw Opus, or WebM Opus in a Web Worker, feeding decoded audio
431
+ directly to the AudioWorklet processor via MessagePort.
432
+ </p>
433
+
434
+ <label
435
+ htmlFor="format-select"
436
+ style={{ display: "block", marginTop: "1rem", fontSize: "0.85rem", color: "#94a3b8" }}
437
+ >
438
+ Format
439
+ </label>
440
+ <select
441
+ id="format-select"
442
+ value={format}
443
+ onChange={(e) => handleFormatChange(e.target.value as StreamFormat)}
444
+ style={{
445
+ width: "100%",
446
+ boxSizing: "border-box",
447
+ padding: "0.5rem",
448
+ marginTop: "0.25rem",
449
+ border: "1px solid var(--color-border-subtle, #334155)",
450
+ borderRadius: "6px",
451
+ background: "var(--color-surface, #1e293b)",
452
+ color: "var(--color-text, #e2e8f0)",
453
+ fontSize: "0.9rem",
454
+ }}
455
+ >
456
+ <option value="Mp3">MP3</option>
457
+ <option value="OggOpus">Opus (Ogg)</option>
458
+ <option value="RawOpusFramed">Opus (framed raw)</option>
459
+ <option value="WebmOpus">Opus (WebM)</option>
460
+ </select>
461
+
462
+ <label
463
+ htmlFor="url"
464
+ style={{ display: "block", marginTop: "1rem", fontSize: "0.85rem", color: "#94a3b8" }}
465
+ >
466
+ Audio URL
467
+ </label>
468
+ <input
469
+ type="text"
470
+ id="url"
471
+ value={url}
472
+ onChange={(e) => setUrl(e.target.value)}
473
+ style={{
474
+ width: "100%",
475
+ boxSizing: "border-box",
476
+ padding: "0.5rem",
477
+ marginTop: "0.25rem",
478
+ border: "1px solid var(--color-border-subtle, #334155)",
479
+ borderRadius: "6px",
480
+ background: "var(--color-surface, #1e293b)",
481
+ color: "var(--color-text, #e2e8f0)",
482
+ fontSize: "0.9rem",
483
+ }}
484
+ />
485
+
486
+ <label
487
+ htmlFor="throttle-select"
488
+ style={{ display: "block", marginTop: "1rem", fontSize: "0.85rem", color: "#94a3b8" }}
489
+ >
490
+ Network Speed
491
+ </label>
492
+ <select
493
+ id="throttle-select"
494
+ value={throttle}
495
+ onChange={(e) => setThrottle(Number(e.target.value))}
496
+ style={{
497
+ width: "100%",
498
+ boxSizing: "border-box",
499
+ padding: "0.5rem",
500
+ marginTop: "0.25rem",
501
+ border: "1px solid var(--color-border-subtle, #334155)",
502
+ borderRadius: "6px",
503
+ background: "var(--color-surface, #1e293b)",
504
+ color: "var(--color-text, #e2e8f0)",
505
+ fontSize: "0.9rem",
506
+ }}
507
+ >
508
+ <option value={0}>Normal (unlimited)</option>
509
+ <option value={204800}>Slow (~200 KB/s)</option>
510
+ <option value={51200}>Turtle (~50 KB/s)</option>
511
+ </select>
512
+
513
+ <div style={{ display: "flex", gap: "0.5rem", marginTop: "1rem" }}>
514
+ <button type="button" onClick={() => node.stream(url, throttle, format)}>
515
+ ▶ Stream &amp; Play
516
+ </button>
517
+ <button type="button" onClick={node.pause} disabled={!isStreaming}>
518
+ ⏸ Pause
519
+ </button>
520
+ <button type="button" onClick={node.stop} disabled={!isStreaming}>
521
+ ■ Stop
522
+ </button>
523
+ </div>
524
+
525
+ <div
526
+ style={{
527
+ marginTop: "1rem",
528
+ height: 6,
529
+ borderRadius: 3,
530
+ background: "var(--color-track, #1e293b)",
531
+ overflow: "hidden",
532
+ }}
533
+ >
534
+ <div
535
+ ref={progressRef}
536
+ style={{
537
+ height: "100%",
538
+ width: "0%",
539
+ borderRadius: 3,
540
+ background: "var(--color-accent, #38bdf8)",
541
+ transition: "width 0.15s",
542
+ }}
543
+ />
544
+ </div>
545
+ <p
546
+ style={{
547
+ marginTop: "0.75rem",
548
+ fontSize: "0.85rem",
549
+ color: "#94a3b8",
550
+ minHeight: "1.2em",
551
+ }}
552
+ >
553
+ {node.statusMessage}
554
+ </p>
555
+ {node.seekableDuration != null && (
556
+ <p
557
+ style={{
558
+ marginTop: "0.25rem",
559
+ fontSize: "0.8rem",
560
+ color: "#64748b",
561
+ }}
562
+ >
563
+ Decoded seekable: {node.seekableDuration.toFixed(2)}s
564
+ </p>
565
+ )}
566
+
567
+ {/* ── Display panel ── */}
568
+ <StreamingDisplayPanel
569
+ nodeState={node.nodeState}
570
+ frameRef={node.frameRef}
571
+ timesLoopedRef={node.timesLoopedRef}
572
+ latency={node.infoLatency}
573
+ />
574
+
575
+ {/* ── Tempo ── */}
576
+ <fieldset className="control-group tempo-group">
577
+ <legend>Tempo</legend>
578
+ <label htmlFor="tempo" className="tempo-label">
579
+ BPM
580
+ </label>
581
+ <input
582
+ id="tempo"
583
+ type="number"
584
+ min={20}
585
+ max={999}
586
+ step={1}
587
+ value={tempoDraft}
588
+ onFocus={() => setIsEditingTempo(true)}
589
+ onChange={(e) => setTempoDraft(e.target.value)}
590
+ onBlur={commitTempoDraft}
591
+ onKeyDown={(e) => {
592
+ if (e.key === "Enter") {
593
+ commitTempoDraft();
594
+ e.currentTarget.blur();
595
+ }
596
+ if (e.key === "Escape") {
597
+ setIsEditingTempo(false);
598
+ setTempoDraft(String(controls.tempo));
599
+ e.currentTarget.blur();
600
+ }
601
+ }}
602
+ style={{ width: 70 }}
603
+ />
604
+ </fieldset>
605
+
606
+ {/* ── Playhead ── */}
607
+ <StreamingPlayhead
608
+ frameRef={node.frameRef}
609
+ audioDuration={node.audioDuration}
610
+ disabled={
611
+ node.nodeState === "initial" || node.nodeState === "disposed"
612
+ }
613
+ onChange={handlePlayheadChange}
614
+ />
615
+
616
+ {/* ── Controls (reused from library) ── */}
617
+ <section id="controls">
618
+ <ControlSection
619
+ legend="Transport"
620
+ defs={controlDefs}
621
+ values={controls.values}
622
+ snaps={controls.snaps}
623
+ enabled={controls.enabled}
624
+ mins={controls.mins}
625
+ maxs={controls.maxs}
626
+ maxLocked={controls.maxLocked}
627
+ linked={controls.linkedPairs}
628
+ linkedPairs={transportLinkedControlPairs}
629
+ tempo={controls.tempo}
630
+ audioDuration={node.audioDuration}
631
+ onValueChange={handleValueChange}
632
+ onToggle={handleToggle}
633
+ onLinkedChange={controls.setLinkedPair}
634
+ onSnapChange={handleSnapChange}
635
+ onMinChange={handleMinChange}
636
+ onMaxChange={handleMaxChange}
637
+ onMaxLockedChange={handleMaxLockedChange}
638
+ />
639
+ <fieldset className="control-group">
640
+ <legend>Loop</legend>
641
+ <div className="loop-row">
642
+ <label htmlFor="loop">Loop</label>
643
+ <input
644
+ type="checkbox"
645
+ id="loop"
646
+ checked={controls.loop}
647
+ onChange={(e) => handleLoopChange(e.target.checked)}
648
+ />
649
+ </div>
650
+ {controls.loop && (
651
+ <ControlSection
652
+ legend="Controls"
653
+ defs={loopControlDefs}
654
+ values={controls.values}
655
+ snaps={controls.snaps}
656
+ enabled={controls.enabled}
657
+ mins={controls.mins}
658
+ maxs={controls.maxs}
659
+ maxLocked={controls.maxLocked}
660
+ linked={controls.linkedPairs}
661
+ linkedPairs={loopLinkedControlPairs}
662
+ tempo={controls.tempo}
663
+ audioDuration={node.audioDuration}
664
+ onValueChange={handleValueChange}
665
+ onToggle={handleToggle}
666
+ onLinkedChange={controls.setLinkedPair}
667
+ onSnapChange={handleSnapChange}
668
+ onMinChange={handleMinChange}
669
+ onMaxChange={handleMaxChange}
670
+ onMaxLockedChange={handleMaxLockedChange}
671
+ />
672
+ )}
673
+ </fieldset>
674
+ <fieldset className="control-group">
675
+ <legend>Parameters</legend>
676
+ <PlaybackRateControl
677
+ value={controls.values.playbackRate}
678
+ defaultValue={1}
679
+ enabled={controls.enabled.playbackRate}
680
+ onChange={handlePlaybackRateChange}
681
+ onToggle={handlePlaybackRateToggle}
682
+ />
683
+ <DetuneControl
684
+ value={controls.values.detune}
685
+ defaultValue={0}
686
+ enabled={controls.enabled.detune}
687
+ onChange={handleDetuneChange}
688
+ onToggle={handleDetuneToggle}
689
+ />
690
+ <GainControl
691
+ value={controls.values.gain}
692
+ defaultValue={0}
693
+ enabled={controls.enabled.gain}
694
+ onChange={handleGainChange}
695
+ onToggle={handleGainToggle}
696
+ />
697
+ <PanControl
698
+ value={controls.values.pan}
699
+ defaultValue={0}
700
+ enabled={controls.enabled.pan}
701
+ onChange={handlePanChange}
702
+ onToggle={handlePanToggle}
703
+ />
704
+ <FilterControl
705
+ label="Lowpass"
706
+ controlKey="lowpass"
707
+ value={controls.values.lowpass}
708
+ defaultValue={16384}
709
+ enabled={controls.enabled.lowpass}
710
+ onChange={handleLowpassChange}
711
+ onToggle={handleLowpassToggle}
712
+ />
713
+ <FilterControl
714
+ label="Highpass"
715
+ controlKey="highpass"
716
+ value={controls.values.highpass}
717
+ defaultValue={32}
718
+ enabled={controls.enabled.highpass}
719
+ onChange={handleHighpassChange}
720
+ onToggle={handleHighpassToggle}
721
+ />
722
+ </fieldset>
723
+ </section>
724
+ </main>
725
+ );
726
+ }