@jadujoel/web-audio-clip-node 0.1.6 → 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 (439) hide show
  1. package/README.md +77 -32
  2. package/dist/App.d.ts +6 -0
  3. package/dist/App.js +179 -0
  4. package/dist/audio/ClipNode.d.ts +2 -0
  5. package/dist/audio/ClipNode.js +6 -1
  6. package/dist/audio/processor-code.d.ts +1 -1
  7. package/dist/audio/processor-code.js +1 -1
  8. package/dist/audio/processor-kernel.js +26 -9
  9. package/dist/audio/processor.js +9 -0
  10. package/dist/audio/version.d.ts +1 -1
  11. package/dist/audio/version.js +1 -1
  12. package/dist/lib.bundle.js +3 -3
  13. package/dist/lib.bundle.js.map +3 -3
  14. package/dist/processor.js +2 -2
  15. package/dist/processor.js.map +4 -4
  16. package/dist/streaming.d.ts +6 -0
  17. package/dist/streaming.js +32 -0
  18. package/dist/workers/framed-raw-opus.d.ts +13 -0
  19. package/dist/workers/framed-raw-opus.js +68 -0
  20. package/dist/workers/mp3-decode-worker.d.ts +1 -0
  21. package/dist/workers/mp3-decode-worker.js +254 -0
  22. package/dist/workers/mp3-decode-worker.min.js +1 -0
  23. package/dist/workers/ogg-opus-decode-worker.d.ts +1 -0
  24. package/dist/workers/ogg-opus-decode-worker.js +398 -0
  25. package/dist/workers/ogg-opus-decode-worker.min.js +1 -0
  26. package/dist/workers/opus-worker-common.d.ts +45 -0
  27. package/dist/workers/opus-worker-common.js +226 -0
  28. package/dist/workers/raw-opus-framed-decode-worker.d.ts +1 -0
  29. package/dist/workers/raw-opus-framed-decode-worker.js +119 -0
  30. package/dist/workers/raw-opus-framed-decode-worker.min.js +1 -0
  31. package/dist/workers/webm-opus-decode-worker.d.ts +1 -0
  32. package/dist/workers/webm-opus-decode-worker.js +97 -0
  33. package/dist/workers/webm-opus-decode-worker.min.js +1 -0
  34. package/dist/workers/webm-opus-parser.d.ts +49 -0
  35. package/dist/workers/webm-opus-parser.js +369 -0
  36. package/dist/workers/worker-utils.d.ts +11 -0
  37. package/dist/workers/worker-utils.js +55 -0
  38. package/examples/README.md +12 -4
  39. package/examples/cdn-vanilla/README.md +10 -6
  40. package/examples/cdn-vanilla/index.html +1065 -33
  41. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/LICENSE +21 -0
  42. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/README.md +197 -0
  43. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/App.d.ts +6 -0
  44. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/App.js +179 -0
  45. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.d.ts +88 -0
  46. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.js +317 -0
  47. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.d.ts +1 -0
  48. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.js +2 -0
  49. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.d.ts +43 -0
  50. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.js +892 -0
  51. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.d.ts +1 -0
  52. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.js +103 -0
  53. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.d.ts +192 -0
  54. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.js +9 -0
  55. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.d.ts +22 -0
  56. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.js +128 -0
  57. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.d.ts +1 -0
  58. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.js +2 -0
  59. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.d.ts +6 -0
  60. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.js +17 -0
  61. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.d.ts +28 -0
  62. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.js +99 -0
  63. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.d.ts +17 -0
  64. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.js +73 -0
  65. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.d.ts +26 -0
  66. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.js +74 -0
  67. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.d.ts +10 -0
  68. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.js +44 -0
  69. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.d.ts +14 -0
  70. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.js +6 -0
  71. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.d.ts +12 -0
  72. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.js +48 -0
  73. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.d.ts +10 -0
  74. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.js +44 -0
  75. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.d.ts +10 -0
  76. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.js +50 -0
  77. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.d.ts +10 -0
  78. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.js +44 -0
  79. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.d.ts +13 -0
  80. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.js +20 -0
  81. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.d.ts +18 -0
  82. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.js +174 -0
  83. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.d.ts +14 -0
  84. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.js +9 -0
  85. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.d.ts +31 -0
  86. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.js +214 -0
  87. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.d.ts +2 -0
  88. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.js +80 -0
  89. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.d.ts +20 -0
  90. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.js +51 -0
  91. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.d.ts +1 -0
  92. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.js +17 -0
  93. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.d.ts +6 -0
  94. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.js +39 -0
  95. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.d.ts +31 -0
  96. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.js +338 -0
  97. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.d.ts +15 -0
  98. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.js +17 -0
  99. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js +6 -0
  100. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js.map +7 -0
  101. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib.d.ts +16 -0
  102. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib.js +16 -0
  103. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js +4 -0
  104. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js.map +12 -0
  105. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.d.ts +63 -0
  106. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.js +71 -0
  107. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.d.ts +6 -0
  108. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.js +32 -0
  109. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css +739 -0
  110. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css.d.ts +3 -0
  111. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.d.ts +13 -0
  112. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.js +68 -0
  113. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.d.ts +1 -0
  114. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.js +254 -0
  115. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.min.js +1 -0
  116. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.d.ts +1 -0
  117. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.js +398 -0
  118. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.min.js +1 -0
  119. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.d.ts +45 -0
  120. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.js +226 -0
  121. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.d.ts +1 -0
  122. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.js +119 -0
  123. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.min.js +1 -0
  124. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.d.ts +1 -0
  125. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.js +97 -0
  126. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.min.js +1 -0
  127. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.d.ts +49 -0
  128. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.js +369 -0
  129. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.d.ts +11 -0
  130. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.js +55 -0
  131. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/package.json +104 -0
  132. package/examples/index.html +253 -7
  133. package/examples/playground/README.md +9 -0
  134. package/examples/playground/index.html +14 -0
  135. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/LICENSE +21 -0
  136. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/README.md +197 -0
  137. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/App.d.ts +6 -0
  138. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/App.js +179 -0
  139. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.d.ts +88 -0
  140. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.js +317 -0
  141. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.d.ts +1 -0
  142. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.js +2 -0
  143. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.d.ts +43 -0
  144. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.js +892 -0
  145. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.d.ts +1 -0
  146. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.js +103 -0
  147. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.d.ts +192 -0
  148. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.js +9 -0
  149. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.d.ts +22 -0
  150. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.js +128 -0
  151. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.d.ts +1 -0
  152. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.js +2 -0
  153. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.d.ts +6 -0
  154. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.js +17 -0
  155. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.d.ts +28 -0
  156. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.js +99 -0
  157. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.d.ts +17 -0
  158. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.js +73 -0
  159. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.d.ts +26 -0
  160. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.js +74 -0
  161. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.d.ts +10 -0
  162. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.js +44 -0
  163. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.d.ts +14 -0
  164. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.js +6 -0
  165. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.d.ts +12 -0
  166. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.js +48 -0
  167. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.d.ts +10 -0
  168. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.js +44 -0
  169. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.d.ts +10 -0
  170. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.js +50 -0
  171. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.d.ts +10 -0
  172. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.js +44 -0
  173. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.d.ts +13 -0
  174. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.js +20 -0
  175. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.d.ts +18 -0
  176. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.js +174 -0
  177. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.d.ts +14 -0
  178. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.js +9 -0
  179. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.d.ts +31 -0
  180. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.js +214 -0
  181. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.d.ts +2 -0
  182. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.js +80 -0
  183. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.d.ts +20 -0
  184. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.js +51 -0
  185. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.d.ts +1 -0
  186. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.js +17 -0
  187. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.d.ts +6 -0
  188. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.js +39 -0
  189. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.d.ts +31 -0
  190. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.js +338 -0
  191. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.d.ts +15 -0
  192. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.js +17 -0
  193. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js +6 -0
  194. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js.map +7 -0
  195. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib.d.ts +16 -0
  196. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib.js +16 -0
  197. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js +4 -0
  198. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js.map +12 -0
  199. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.d.ts +63 -0
  200. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.js +71 -0
  201. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.d.ts +6 -0
  202. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.js +32 -0
  203. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css +739 -0
  204. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css.d.ts +3 -0
  205. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.d.ts +13 -0
  206. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.js +68 -0
  207. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.d.ts +1 -0
  208. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.js +254 -0
  209. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.min.js +1 -0
  210. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.d.ts +1 -0
  211. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.js +398 -0
  212. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.min.js +1 -0
  213. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.d.ts +45 -0
  214. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.js +226 -0
  215. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.d.ts +1 -0
  216. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.js +119 -0
  217. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.min.js +1 -0
  218. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.d.ts +1 -0
  219. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.js +97 -0
  220. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.min.js +1 -0
  221. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.d.ts +49 -0
  222. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.js +369 -0
  223. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.d.ts +11 -0
  224. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.js +55 -0
  225. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/package.json +104 -0
  226. package/examples/playground/package.json +19 -0
  227. package/examples/playground/src/App.tsx +442 -0
  228. package/examples/playground/src/main.tsx +9 -0
  229. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/LICENSE +21 -0
  230. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/README.md +197 -0
  231. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/App.d.ts +6 -0
  232. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/App.js +179 -0
  233. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.d.ts +88 -0
  234. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.js +317 -0
  235. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.d.ts +1 -0
  236. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.js +2 -0
  237. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.d.ts +43 -0
  238. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.js +892 -0
  239. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.d.ts +1 -0
  240. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.js +103 -0
  241. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.d.ts +192 -0
  242. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.js +9 -0
  243. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.d.ts +22 -0
  244. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.js +128 -0
  245. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.d.ts +1 -0
  246. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.js +2 -0
  247. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.d.ts +6 -0
  248. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.js +17 -0
  249. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.d.ts +28 -0
  250. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.js +99 -0
  251. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.d.ts +17 -0
  252. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.js +73 -0
  253. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.d.ts +26 -0
  254. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.js +74 -0
  255. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.d.ts +10 -0
  256. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.js +44 -0
  257. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.d.ts +14 -0
  258. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.js +6 -0
  259. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.d.ts +12 -0
  260. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.js +48 -0
  261. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.d.ts +10 -0
  262. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.js +44 -0
  263. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.d.ts +10 -0
  264. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.js +50 -0
  265. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.d.ts +10 -0
  266. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.js +44 -0
  267. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.d.ts +13 -0
  268. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.js +20 -0
  269. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.d.ts +18 -0
  270. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.js +174 -0
  271. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.d.ts +14 -0
  272. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.js +9 -0
  273. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.d.ts +31 -0
  274. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.js +214 -0
  275. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.d.ts +2 -0
  276. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.js +80 -0
  277. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.d.ts +20 -0
  278. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.js +51 -0
  279. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.d.ts +1 -0
  280. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.js +17 -0
  281. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.d.ts +6 -0
  282. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.js +39 -0
  283. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.d.ts +31 -0
  284. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.js +338 -0
  285. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.d.ts +15 -0
  286. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.js +17 -0
  287. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js +6 -0
  288. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js.map +7 -0
  289. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib.d.ts +16 -0
  290. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib.js +16 -0
  291. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js +4 -0
  292. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js.map +12 -0
  293. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.d.ts +63 -0
  294. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.js +71 -0
  295. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.d.ts +6 -0
  296. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.js +32 -0
  297. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css +739 -0
  298. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css.d.ts +3 -0
  299. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.d.ts +13 -0
  300. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.js +68 -0
  301. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.d.ts +1 -0
  302. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.js +254 -0
  303. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.min.js +1 -0
  304. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.d.ts +1 -0
  305. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.js +398 -0
  306. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.min.js +1 -0
  307. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.d.ts +45 -0
  308. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.js +226 -0
  309. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.d.ts +1 -0
  310. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.js +119 -0
  311. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.min.js +1 -0
  312. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.d.ts +1 -0
  313. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.js +97 -0
  314. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.min.js +1 -0
  315. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.d.ts +49 -0
  316. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.js +369 -0
  317. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.d.ts +11 -0
  318. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.js +55 -0
  319. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/package.json +104 -0
  320. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/LICENSE +21 -0
  321. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/README.md +197 -0
  322. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/App.d.ts +6 -0
  323. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/App.js +179 -0
  324. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.d.ts +88 -0
  325. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.js +317 -0
  326. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.d.ts +1 -0
  327. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.js +2 -0
  328. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.d.ts +43 -0
  329. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.js +892 -0
  330. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.d.ts +1 -0
  331. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.js +103 -0
  332. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.d.ts +192 -0
  333. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.js +9 -0
  334. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.d.ts +22 -0
  335. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.js +128 -0
  336. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.d.ts +1 -0
  337. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.js +2 -0
  338. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.d.ts +6 -0
  339. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.js +17 -0
  340. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.d.ts +28 -0
  341. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.js +99 -0
  342. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.d.ts +17 -0
  343. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.js +73 -0
  344. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.d.ts +26 -0
  345. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.js +74 -0
  346. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.d.ts +10 -0
  347. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.js +44 -0
  348. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.d.ts +14 -0
  349. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.js +6 -0
  350. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.d.ts +12 -0
  351. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.js +48 -0
  352. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.d.ts +10 -0
  353. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.js +44 -0
  354. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.d.ts +10 -0
  355. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.js +50 -0
  356. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.d.ts +10 -0
  357. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.js +44 -0
  358. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.d.ts +13 -0
  359. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.js +20 -0
  360. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.d.ts +18 -0
  361. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.js +174 -0
  362. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.d.ts +14 -0
  363. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.js +9 -0
  364. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.d.ts +31 -0
  365. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.js +214 -0
  366. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.d.ts +2 -0
  367. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.js +80 -0
  368. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.d.ts +20 -0
  369. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.js +51 -0
  370. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.d.ts +1 -0
  371. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.js +17 -0
  372. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.d.ts +6 -0
  373. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.js +39 -0
  374. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.d.ts +31 -0
  375. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.js +338 -0
  376. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.d.ts +15 -0
  377. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.js +17 -0
  378. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js +6 -0
  379. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js.map +7 -0
  380. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib.d.ts +16 -0
  381. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib.js +16 -0
  382. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js +4 -0
  383. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js.map +12 -0
  384. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.d.ts +63 -0
  385. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.js +71 -0
  386. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.d.ts +6 -0
  387. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.js +32 -0
  388. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css +739 -0
  389. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css.d.ts +3 -0
  390. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.d.ts +13 -0
  391. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.js +68 -0
  392. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.d.ts +1 -0
  393. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.js +254 -0
  394. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.min.js +1 -0
  395. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.d.ts +1 -0
  396. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.js +398 -0
  397. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.min.js +1 -0
  398. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.d.ts +45 -0
  399. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.js +226 -0
  400. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.d.ts +1 -0
  401. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.js +119 -0
  402. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.min.js +1 -0
  403. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.d.ts +1 -0
  404. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.js +97 -0
  405. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.min.js +1 -0
  406. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.d.ts +49 -0
  407. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.js +369 -0
  408. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.d.ts +11 -0
  409. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.js +55 -0
  410. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/package.json +104 -0
  411. package/examples/self-hosted/public/processor.js +2 -2
  412. package/examples/streaming/README.md +25 -0
  413. package/examples/streaming/build-worker.ts +49 -0
  414. package/examples/streaming/framed-raw-opus.ts +95 -0
  415. package/examples/streaming/index.html +16 -0
  416. package/examples/streaming/mp3-decode-worker.ts +326 -0
  417. package/examples/streaming/ogg-opus-decode-worker.ts +479 -0
  418. package/examples/streaming/opus-worker-common.ts +278 -0
  419. package/examples/streaming/package.json +20 -0
  420. package/examples/streaming/raw-opus-framed-decode-worker.ts +148 -0
  421. package/examples/streaming/src/App.tsx +726 -0
  422. package/examples/streaming/src/clip-node-lib.ts +33 -0
  423. package/examples/streaming/src/framedRawOpus.test.ts +74 -0
  424. package/examples/streaming/src/main.tsx +6 -0
  425. package/examples/streaming/src/react-dom-runtime.d.ts +1 -0
  426. package/examples/streaming/src/react-dom-runtime.js +1 -0
  427. package/examples/streaming/src/react-runtime.d.ts +2 -0
  428. package/examples/streaming/src/react-runtime.js +7 -0
  429. package/examples/streaming/src/streamFormat.test.ts +13 -0
  430. package/examples/streaming/src/streamFormat.ts +14 -0
  431. package/examples/streaming/src/streamTimeline.test.ts +74 -0
  432. package/examples/streaming/src/streamTimeline.ts +76 -0
  433. package/examples/streaming/src/useStreamingClipNode.ts +540 -0
  434. package/examples/streaming/src/webmOpusParser.test.ts +153 -0
  435. package/examples/streaming/tsconfig.json +19 -0
  436. package/examples/streaming/webm-opus-decode-worker.ts +123 -0
  437. package/examples/streaming/webm-opus-parser.ts +461 -0
  438. package/examples/streaming/worker-utils.ts +45 -0
  439. package/package.json +13 -2
@@ -0,0 +1,73 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useRef } from "react";
3
+ import { createPortal } from "react-dom";
4
+ const SNAP_OPTIONS = [
5
+ { value: "none", label: "None" },
6
+ { value: "beat", label: "Beat" },
7
+ { value: "bar", label: "Bar" },
8
+ { value: "8th", label: "8th" },
9
+ { value: "16th", label: "16th" },
10
+ { value: "int", label: "Integer" },
11
+ ];
12
+ export function ContextMenu({ x, y, snap, snapMode = "tempo", min, max, maxLocked = false, showMaxLock = true, audioDuration, onSnapChange, onMinChange, onMaxChange, onMaxLockedChange, onClose, }) {
13
+ const menuRef = useRef(null);
14
+ // Close on click outside or Escape
15
+ useEffect(() => {
16
+ const handleClick = (e) => {
17
+ if (menuRef.current && !menuRef.current.contains(e.target)) {
18
+ onClose();
19
+ }
20
+ };
21
+ const handleKey = (e) => {
22
+ if (e.key === "Escape")
23
+ onClose();
24
+ };
25
+ document.addEventListener("mousedown", handleClick);
26
+ document.addEventListener("keydown", handleKey);
27
+ return () => {
28
+ document.removeEventListener("mousedown", handleClick);
29
+ document.removeEventListener("keydown", handleKey);
30
+ };
31
+ }, [onClose]);
32
+ // Adjust position to stay within viewport
33
+ useEffect(() => {
34
+ const el = menuRef.current;
35
+ if (!el)
36
+ return;
37
+ const rect = el.getBoundingClientRect();
38
+ if (rect.right > window.innerWidth) {
39
+ el.style.left = `${window.innerWidth - rect.width - 8}px`;
40
+ }
41
+ if (rect.bottom > window.innerHeight) {
42
+ el.style.top = `${window.innerHeight - rect.height - 8}px`;
43
+ }
44
+ }, []);
45
+ const handleSnapClick = useCallback((value) => {
46
+ onSnapChange(value);
47
+ }, [onSnapChange]);
48
+ const handleMinCommit = useCallback((e) => {
49
+ const input = e.currentTarget;
50
+ const parsed = Number.parseFloat(input.value);
51
+ if (Number.isFinite(parsed)) {
52
+ onMinChange(parsed);
53
+ }
54
+ }, [onMinChange]);
55
+ const handleMaxCommit = useCallback((e) => {
56
+ const input = e.currentTarget;
57
+ const parsed = Number.parseFloat(input.value);
58
+ if (Number.isFinite(parsed)) {
59
+ onMaxChange(parsed);
60
+ }
61
+ }, [onMaxChange]);
62
+ const handleInputKeyDown = useCallback((commit) => (e) => {
63
+ if (e.key === "Enter") {
64
+ e.preventDefault();
65
+ commit(e);
66
+ }
67
+ else if (e.key === "Escape") {
68
+ e.preventDefault();
69
+ onClose();
70
+ }
71
+ }, [onClose]);
72
+ return createPortal(_jsxs("div", { ref: menuRef, className: "context-menu", style: { left: x, top: y }, role: "menu", children: [_jsx("div", { className: "context-menu__section-label", children: "Snap" }), snapMode === "preset" ? (_jsxs("label", { className: "context-menu__field", children: [_jsx("input", { type: "checkbox", className: "control-toggle", checked: snap !== "none", onChange: (e) => onSnapChange(e.target.checked ? "preset" : "none") }), "Enable snap"] })) : (SNAP_OPTIONS.map((opt) => (_jsxs("button", { type: "button", className: `context-menu__item${snap === opt.value ? " context-menu__item--active" : ""}`, role: "menuitemradio", "aria-checked": snap === opt.value, onClick: () => handleSnapClick(opt.value), children: [_jsx("span", { className: "context-menu__radio", children: snap === opt.value ? "●" : "○" }), opt.label] }, opt.value)))), _jsx("div", { className: "context-menu__divider" }), _jsx("div", { className: "context-menu__section-label", children: "Range" }), _jsxs("label", { className: "context-menu__field", children: ["Min:", _jsx("input", { type: "number", className: "context-menu__input", defaultValue: min, step: "any", onBlur: handleMinCommit, onKeyDown: handleInputKeyDown(handleMinCommit) })] }), _jsxs("label", { className: "context-menu__field", children: ["Max:", _jsx("input", { type: "number", className: "context-menu__input", defaultValue: max, step: "any", disabled: maxLocked && audioDuration != null, onBlur: handleMaxCommit, onKeyDown: handleInputKeyDown(handleMaxCommit) })] }), showMaxLock && (_jsxs("label", { className: "context-menu__field", children: [_jsx("input", { type: "checkbox", className: "control-toggle", checked: maxLocked, onChange: (e) => onMaxLockedChange?.(e.target.checked) }), "Max = file length"] }))] }), document.body);
73
+ }
@@ -0,0 +1,26 @@
1
+ import type { ControlDef, ControlKey } from "../controls/controlDefs";
2
+ import type { LinkedControlPairDef, LinkedControlPairKey } from "../controls/linkedControlPairs";
3
+ interface ControlSectionProps {
4
+ legend: string;
5
+ defs: ControlDef[];
6
+ values: Record<ControlKey, number>;
7
+ snaps: Record<ControlKey, string>;
8
+ enabled: Record<ControlKey, boolean>;
9
+ mins: Record<ControlKey, number>;
10
+ maxs: Record<ControlKey, number>;
11
+ maxLocked: Record<ControlKey, boolean>;
12
+ linked?: Record<LinkedControlPairKey, boolean>;
13
+ linkedPairs?: readonly LinkedControlPairDef[];
14
+ tempo: number;
15
+ audioDuration?: number | null;
16
+ onValueChange: (key: ControlKey, val: number) => void;
17
+ onToggle: (key: ControlKey, on: boolean) => void;
18
+ onLinkedChange?: (key: LinkedControlPairKey, linked: boolean) => void;
19
+ onSnapChange: (key: ControlKey, snap: string) => void;
20
+ onMinChange: (key: ControlKey, val: number) => void;
21
+ onMaxChange: (key: ControlKey, val: number) => void;
22
+ onMaxLockedChange: (key: ControlKey, locked: boolean) => void;
23
+ }
24
+ declare function ControlSectionInner({ legend, defs, linked, linkedPairs, onLinkedChange, ...controlProps }: ControlSectionProps): import("react/jsx-runtime").JSX.Element;
25
+ export declare const ControlSection: import("react").MemoExoticComponent<typeof ControlSectionInner>;
26
+ export {};
@@ -0,0 +1,74 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo, useId } from "react";
3
+ import { AudioControl } from "./AudioControl.js";
4
+ /** Build a set of control keys that belong to a linked pair,
5
+ * and a map from the first control key to its pair def. */
6
+ function buildPairMaps(pairs) {
7
+ const pairByFirst = new Map();
8
+ const pairedKeys = new Set();
9
+ if (pairs) {
10
+ for (const pair of pairs) {
11
+ pairByFirst.set(pair.controls[0], pair);
12
+ pairedKeys.add(pair.controls[0]);
13
+ pairedKeys.add(pair.controls[1]);
14
+ }
15
+ }
16
+ return { pairByFirst, pairedKeys };
17
+ }
18
+ function renderAudioControl(def, props) {
19
+ const { mins, maxs, maxLocked, audioDuration, values, tempo, snaps, enabled, onValueChange, onToggle, onSnapChange, onMinChange, onMaxChange, onMaxLockedChange, } = props;
20
+ return (_jsx(AudioControl, { label: def.label, controlKey: def.key, min: mins[def.key] ?? def.min, max: maxLocked[def.key] && audioDuration != null
21
+ ? audioDuration
22
+ : (maxs[def.key] ?? def.max), value: values[def.key], defaultValue: def.defaultValue, tempo: tempo, snap: snaps[def.key], preset: def.preset, title: def.title, enabled: enabled[def.key], hasToggle: def.hasToggle, hasSnap: def.hasSnap, hasMaxLock: def.hasMaxLock, audioDuration: audioDuration, maxLocked: maxLocked[def.key] ?? true, onChange: (v) => onValueChange(def.key, v), onToggle: (on) => onToggle(def.key, on), onSnapChange: (s) => onSnapChange(def.key, s), onMinChange: (v) => onMinChange(def.key, v), onMaxChange: (v) => onMaxChange(def.key, v), onMaxLockedChange: (locked) => onMaxLockedChange(def.key, locked) }, def.key));
23
+ }
24
+ function ControlSectionInner({ legend, defs, linked, linkedPairs, onLinkedChange, ...controlProps }) {
25
+ const sectionId = useId();
26
+ const { pairByFirst, pairedKeys } = buildPairMaps(linkedPairs);
27
+ const items = [];
28
+ let i = 0;
29
+ while (i < defs.length) {
30
+ const def = defs[i];
31
+ const pair = pairByFirst.get(def.key);
32
+ if (pair) {
33
+ // Find the second control in the pair
34
+ const secondDef = defs.find((d) => d.key === pair.controls[1]);
35
+ const isLinked = linked?.[pair.key] ?? false;
36
+ const inputId = `${sectionId}-${pair.key}`;
37
+ items.push(_jsxs("div", { className: `control-link-group${isLinked ? " control-link-group--active" : ""}`, children: [_jsxs("div", { className: "control-link-bracket", children: [_jsx("span", { className: "control-link-line" }), _jsx("button", { type: "button", id: inputId, className: "control-link-btn", "aria-pressed": isLinked, "aria-label": pair.label, title: pair.label, onClick: () => onLinkedChange?.(pair.key, !isLinked), children: _jsx("svg", { width: "12", height: "12", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: _jsx("path", { d: "M6.5 4.5h-1A2.5 2.5 0 0 0 3 7v2a2.5 2.5 0 0 0 2.5 2.5h1m3-7h1A2.5 2.5 0 0 1 13 7v2a2.5 2.5 0 0 1-2.5 2.5h-1M5.5 8h5", stroke: "currentColor", strokeWidth: "1.3", strokeLinecap: "round" }) }) }), _jsx("span", { className: "control-link-line" })] }), _jsxs("div", { className: "control-link-controls", children: [renderAudioControl(def, controlProps), secondDef && renderAudioControl(secondDef, controlProps)] })] }, `link-${pair.key}`));
38
+ // Skip past both controls in the pair
39
+ i += 1;
40
+ if (secondDef && defs[i]?.key === secondDef.key) {
41
+ i += 1;
42
+ }
43
+ continue;
44
+ }
45
+ // Not part of a pair (or is a second control already rendered above)
46
+ if (!pairedKeys.has(def.key)) {
47
+ items.push(renderAudioControl(def, controlProps));
48
+ }
49
+ i += 1;
50
+ }
51
+ return (_jsxs("fieldset", { className: "control-group", children: [_jsx("legend", { children: legend }), items] }));
52
+ }
53
+ function areControlSectionPropsEqual(prev, next) {
54
+ return (prev.legend === next.legend &&
55
+ prev.defs === next.defs &&
56
+ prev.values === next.values &&
57
+ prev.snaps === next.snaps &&
58
+ prev.enabled === next.enabled &&
59
+ prev.mins === next.mins &&
60
+ prev.maxs === next.maxs &&
61
+ prev.maxLocked === next.maxLocked &&
62
+ prev.linked === next.linked &&
63
+ prev.linkedPairs === next.linkedPairs &&
64
+ prev.tempo === next.tempo &&
65
+ prev.audioDuration === next.audioDuration &&
66
+ prev.onValueChange === next.onValueChange &&
67
+ prev.onToggle === next.onToggle &&
68
+ prev.onLinkedChange === next.onLinkedChange &&
69
+ prev.onSnapChange === next.onSnapChange &&
70
+ prev.onMinChange === next.onMinChange &&
71
+ prev.onMaxChange === next.onMaxChange &&
72
+ prev.onMaxLockedChange === next.onMaxLockedChange);
73
+ }
74
+ export const ControlSection = memo(ControlSectionInner, areControlSectionPropsEqual);
@@ -0,0 +1,10 @@
1
+ interface DetuneControlProps {
2
+ value: number;
3
+ defaultValue: number;
4
+ enabled: boolean;
5
+ onChange: (value: number) => void;
6
+ onToggle: (enabled: boolean) => void;
7
+ }
8
+ declare function DetuneControlInner({ value, defaultValue, enabled, onChange, onToggle, }: DetuneControlProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare const DetuneControl: import("react").MemoExoticComponent<typeof DetuneControlInner>;
10
+ export {};
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo, useCallback, useId, useRef, useState } from "react";
3
+ import { presets } from "../audio/utils.js";
4
+ import { SnappableSlider } from "./SnappableSlider.js";
5
+ function DetuneControlInner({ value, defaultValue, enabled, onChange, onToggle, }) {
6
+ const preset = presets.cents;
7
+ const min = preset.min ?? -2400;
8
+ const max = preset.max ?? 2400;
9
+ const labelId = useId();
10
+ const [isEditing, setIsEditing] = useState(false);
11
+ const [editText, setEditText] = useState("");
12
+ const inputRef = useRef(null);
13
+ const displayValue = `${Math.round(value)} cents`;
14
+ const handleChange = useCallback((v) => {
15
+ if (!enabled)
16
+ return;
17
+ onChange(v);
18
+ }, [enabled, onChange]);
19
+ const startEditing = useCallback(() => {
20
+ setEditText(String(Math.round(value)));
21
+ setIsEditing(true);
22
+ queueMicrotask(() => inputRef.current?.select());
23
+ }, [value]);
24
+ const commitEdit = useCallback(() => {
25
+ setIsEditing(false);
26
+ const parsed = Number.parseFloat(editText);
27
+ if (Number.isFinite(parsed)) {
28
+ onChange(Math.min(Math.max(parsed, min), max));
29
+ }
30
+ }, [editText, min, max, onChange]);
31
+ const handleEditKeyDown = useCallback((e) => {
32
+ if (e.key === "Enter") {
33
+ e.preventDefault();
34
+ commitEdit();
35
+ }
36
+ else if (e.key === "Escape") {
37
+ e.preventDefault();
38
+ setIsEditing(false);
39
+ }
40
+ }, [commitEdit]);
41
+ const disabled = !enabled;
42
+ return (_jsxs("div", { className: `audio-control${disabled ? " audio-control--disabled" : ""}`, title: "Pitch shift in cents.", children: [_jsx("input", { type: "checkbox", className: "control-toggle", checked: enabled, onChange: (e) => onToggle(e.target.checked) }), _jsx("span", { className: "control-label", id: labelId, children: "Detune" }), _jsx(SnappableSlider, { min: min, max: max, value: value, skew: preset.skew ?? 1, step: preset.step ?? 1, defaultValue: defaultValue, ticks: preset.ticks ?? [], disabled: disabled, labelId: labelId, valueText: displayValue, onChange: handleChange }), isEditing ? (_jsx("input", { ref: inputRef, type: "text", className: "control-output control-output--editing", value: editText, onChange: (e) => setEditText(e.target.value), onBlur: commitEdit, onKeyDown: handleEditKeyDown })) : (_jsx("button", { type: "button", className: "control-output", onClick: startEditing, children: displayValue }))] }));
43
+ }
44
+ export const DetuneControl = memo(DetuneControlInner);
@@ -0,0 +1,14 @@
1
+ import type { ClipNodeState } from "../audio/types";
2
+ interface DisplayPanelProps {
3
+ nodeState: ClipNodeState;
4
+ statusMessage: string | null;
5
+ soundName: string | null;
6
+ currentTime: string;
7
+ currentFrame: string;
8
+ timesLooped: string;
9
+ latency: string;
10
+ timeTaken: string;
11
+ }
12
+ declare function DisplayPanelInner({ nodeState, statusMessage, soundName, currentTime, currentFrame, timesLooped, latency, timeTaken, }: DisplayPanelProps): import("react/jsx-runtime").JSX.Element;
13
+ export declare const DisplayPanel: import("react").MemoExoticComponent<typeof DisplayPanelInner>;
14
+ export {};
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo } from "react";
3
+ function DisplayPanelInner({ nodeState, statusMessage, soundName, currentTime, currentFrame, timesLooped, latency, timeTaken, }) {
4
+ return (_jsxs("section", { id: "display", children: [statusMessage && (_jsx("div", { className: "status-message", role: "alert", children: statusMessage })), _jsx("code", { children: "Sound:" }), _jsx("output", { children: soundName ?? "none" }), _jsx("code", { children: "State:" }), _jsx("output", { children: nodeState }), _jsx("code", { children: "Time:" }), _jsx("output", { children: currentTime }), _jsx("code", { children: "Loops:" }), _jsx("output", { children: timesLooped }), _jsxs("details", { className: "display-details", children: [_jsx("summary", { children: "Debug" }), _jsxs("div", { className: "display-details__row", children: [_jsx("code", { children: "Frame:" }), _jsx("output", { children: currentFrame }), _jsx("code", { children: "Latency:" }), _jsx("output", { children: latency }), _jsx("code", { children: "TimeTaken:" }), _jsx("output", { children: timeTaken })] })] })] }));
5
+ }
6
+ export const DisplayPanel = memo(DisplayPanelInner);
@@ -0,0 +1,12 @@
1
+ interface FilterControlProps {
2
+ label: string;
3
+ controlKey: string;
4
+ value: number;
5
+ defaultValue: number;
6
+ enabled: boolean;
7
+ onChange: (value: number) => void;
8
+ onToggle: (enabled: boolean) => void;
9
+ }
10
+ declare function FilterControlInner({ label, controlKey: _controlKey, value, defaultValue, enabled, onChange, onToggle, }: FilterControlProps): import("react/jsx-runtime").JSX.Element;
11
+ export declare const FilterControl: import("react").MemoExoticComponent<typeof FilterControlInner>;
12
+ export {};
@@ -0,0 +1,48 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo, useCallback, useId, useRef, useState } from "react";
3
+ import { presets } from "../audio/utils.js";
4
+ import { SnappableSlider } from "./SnappableSlider.js";
5
+ function formatHz(value) {
6
+ if (value >= 1000)
7
+ return `${(value / 1000).toFixed(1)} kHz`;
8
+ return `${Math.round(value)} Hz`;
9
+ }
10
+ function FilterControlInner({ label, controlKey: _controlKey, value, defaultValue, enabled, onChange, onToggle, }) {
11
+ const preset = presets.hertz;
12
+ const min = preset.min ?? 32;
13
+ const max = preset.max ?? 16384;
14
+ const labelId = useId();
15
+ const [isEditing, setIsEditing] = useState(false);
16
+ const [editText, setEditText] = useState("");
17
+ const inputRef = useRef(null);
18
+ const handleChange = useCallback((v) => {
19
+ if (!enabled)
20
+ return;
21
+ onChange(v);
22
+ }, [enabled, onChange]);
23
+ const startEditing = useCallback(() => {
24
+ setEditText(String(Math.round(value)));
25
+ setIsEditing(true);
26
+ queueMicrotask(() => inputRef.current?.select());
27
+ }, [value]);
28
+ const commitEdit = useCallback(() => {
29
+ setIsEditing(false);
30
+ const parsed = Number.parseFloat(editText);
31
+ if (Number.isFinite(parsed)) {
32
+ onChange(Math.min(Math.max(parsed, min), max));
33
+ }
34
+ }, [editText, min, max, onChange]);
35
+ const handleEditKeyDown = useCallback((e) => {
36
+ if (e.key === "Enter") {
37
+ e.preventDefault();
38
+ commitEdit();
39
+ }
40
+ else if (e.key === "Escape") {
41
+ e.preventDefault();
42
+ setIsEditing(false);
43
+ }
44
+ }, [commitEdit]);
45
+ const disabled = !enabled;
46
+ return (_jsxs("div", { className: `audio-control${disabled ? " audio-control--disabled" : ""}`, title: `${label} cutoff frequency.`, children: [_jsx("input", { type: "checkbox", className: "control-toggle", checked: enabled, onChange: (e) => onToggle(e.target.checked) }), _jsx("span", { className: "control-label", id: labelId, children: label }), _jsx(SnappableSlider, { min: min, max: max, value: value, logarithmic: true, defaultValue: defaultValue, enableSnap: true, snaps: preset.snaps ?? [], ticks: preset.ticks ?? [], disabled: disabled, labelId: labelId, valueText: formatHz(value), onChange: handleChange }), isEditing ? (_jsx("input", { ref: inputRef, type: "text", className: "control-output control-output--editing", value: editText, onChange: (e) => setEditText(e.target.value), onBlur: commitEdit, onKeyDown: handleEditKeyDown })) : (_jsx("button", { type: "button", className: "control-output", onClick: startEditing, children: formatHz(value) }))] }));
47
+ }
48
+ export const FilterControl = memo(FilterControlInner);
@@ -0,0 +1,10 @@
1
+ interface GainControlProps {
2
+ value: number;
3
+ defaultValue: number;
4
+ enabled: boolean;
5
+ onChange: (value: number) => void;
6
+ onToggle: (enabled: boolean) => void;
7
+ }
8
+ declare function GainControlInner({ value, defaultValue, enabled, onChange, onToggle, }: GainControlProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare const GainControl: import("react").MemoExoticComponent<typeof GainControlInner>;
10
+ export {};
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo, useCallback, useId, useRef, useState } from "react";
3
+ import { presets } from "../audio/utils.js";
4
+ import { SnappableSlider } from "./SnappableSlider.js";
5
+ function GainControlInner({ value, defaultValue, enabled, onChange, onToggle, }) {
6
+ const preset = presets.gain;
7
+ const min = preset.min ?? -100;
8
+ const max = preset.max ?? 0;
9
+ const labelId = useId();
10
+ const [isEditing, setIsEditing] = useState(false);
11
+ const [editText, setEditText] = useState("");
12
+ const inputRef = useRef(null);
13
+ const displayValue = `${value.toFixed(1)} dB`;
14
+ const handleChange = useCallback((v) => {
15
+ if (!enabled)
16
+ return;
17
+ onChange(v);
18
+ }, [enabled, onChange]);
19
+ const startEditing = useCallback(() => {
20
+ setEditText(String(value));
21
+ setIsEditing(true);
22
+ queueMicrotask(() => inputRef.current?.select());
23
+ }, [value]);
24
+ const commitEdit = useCallback(() => {
25
+ setIsEditing(false);
26
+ const parsed = Number.parseFloat(editText);
27
+ if (Number.isFinite(parsed)) {
28
+ onChange(Math.min(Math.max(parsed, min), max));
29
+ }
30
+ }, [editText, min, max, onChange]);
31
+ const handleEditKeyDown = useCallback((e) => {
32
+ if (e.key === "Enter") {
33
+ e.preventDefault();
34
+ commitEdit();
35
+ }
36
+ else if (e.key === "Escape") {
37
+ e.preventDefault();
38
+ setIsEditing(false);
39
+ }
40
+ }, [commitEdit]);
41
+ const disabled = !enabled;
42
+ return (_jsxs("div", { className: `audio-control${disabled ? " audio-control--disabled" : ""}`, title: "Amplitude in dB.", children: [_jsx("input", { type: "checkbox", className: "control-toggle", checked: enabled, onChange: (e) => onToggle(e.target.checked) }), _jsx("span", { className: "control-label", id: labelId, children: "Gain" }), _jsx(SnappableSlider, { min: min, max: max, value: value, skew: preset.skew ?? 6, defaultValue: defaultValue, ticks: preset.ticks ?? [], disabled: disabled, labelId: labelId, valueText: displayValue, onChange: handleChange }), isEditing ? (_jsx("input", { ref: inputRef, type: "text", className: "control-output control-output--editing", value: editText, onChange: (e) => setEditText(e.target.value), onBlur: commitEdit, onKeyDown: handleEditKeyDown })) : (_jsx("button", { type: "button", className: "control-output", onClick: startEditing, children: displayValue }))] }));
43
+ }
44
+ export const GainControl = memo(GainControlInner);
@@ -0,0 +1,10 @@
1
+ interface PanControlProps {
2
+ value: number;
3
+ defaultValue: number;
4
+ enabled: boolean;
5
+ onChange: (value: number) => void;
6
+ onToggle: (enabled: boolean) => void;
7
+ }
8
+ declare function PanControlInner({ value, defaultValue, enabled, onChange, onToggle, }: PanControlProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare const PanControl: import("react").MemoExoticComponent<typeof PanControlInner>;
10
+ export {};
@@ -0,0 +1,50 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo, useCallback, useId, useRef, useState } from "react";
3
+ import { presets } from "../audio/utils.js";
4
+ import { SnappableSlider } from "./SnappableSlider.js";
5
+ function formatPan(value) {
6
+ if (Math.abs(value) < 0.005)
7
+ return "C";
8
+ const pct = Math.round(Math.abs(value) * 100);
9
+ return value < 0 ? `L${pct}` : `R${pct}`;
10
+ }
11
+ function PanControlInner({ value, defaultValue, enabled, onChange, onToggle, }) {
12
+ const preset = presets.pan;
13
+ const min = preset.min ?? -1;
14
+ const max = preset.max ?? 1;
15
+ const labelId = useId();
16
+ const [isEditing, setIsEditing] = useState(false);
17
+ const [editText, setEditText] = useState("");
18
+ const inputRef = useRef(null);
19
+ const displayValue = formatPan(value);
20
+ const handleChange = useCallback((v) => {
21
+ if (!enabled)
22
+ return;
23
+ onChange(v);
24
+ }, [enabled, onChange]);
25
+ const startEditing = useCallback(() => {
26
+ setEditText(String(value));
27
+ setIsEditing(true);
28
+ queueMicrotask(() => inputRef.current?.select());
29
+ }, [value]);
30
+ const commitEdit = useCallback(() => {
31
+ setIsEditing(false);
32
+ const parsed = Number.parseFloat(editText);
33
+ if (Number.isFinite(parsed)) {
34
+ onChange(Math.min(Math.max(parsed, min), max));
35
+ }
36
+ }, [editText, min, max, onChange]);
37
+ const handleEditKeyDown = useCallback((e) => {
38
+ if (e.key === "Enter") {
39
+ e.preventDefault();
40
+ commitEdit();
41
+ }
42
+ else if (e.key === "Escape") {
43
+ e.preventDefault();
44
+ setIsEditing(false);
45
+ }
46
+ }, [commitEdit]);
47
+ const disabled = !enabled;
48
+ return (_jsxs("div", { className: `audio-control${disabled ? " audio-control--disabled" : ""}`, title: "-1 full left, 1 full right.", children: [_jsx("input", { type: "checkbox", className: "control-toggle", checked: enabled, onChange: (e) => onToggle(e.target.checked) }), _jsx("span", { className: "control-label", id: labelId, children: "Pan" }), _jsx(SnappableSlider, { min: min, max: max, value: value, skew: preset.skew ?? 1, defaultValue: defaultValue, ticks: preset.ticks ?? [], disabled: disabled, labelId: labelId, valueText: displayValue, onChange: handleChange }), isEditing ? (_jsx("input", { ref: inputRef, type: "text", className: "control-output control-output--editing", value: editText, onChange: (e) => setEditText(e.target.value), onBlur: commitEdit, onKeyDown: handleEditKeyDown })) : (_jsx("button", { type: "button", className: "control-output", onClick: startEditing, children: displayValue }))] }));
49
+ }
50
+ export const PanControl = memo(PanControlInner);
@@ -0,0 +1,10 @@
1
+ interface PlaybackRateControlProps {
2
+ value: number;
3
+ defaultValue: number;
4
+ enabled: boolean;
5
+ onChange: (value: number) => void;
6
+ onToggle: (enabled: boolean) => void;
7
+ }
8
+ declare function PlaybackRateControlInner({ value, defaultValue, enabled, onChange, onToggle, }: PlaybackRateControlProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare const PlaybackRateControl: import("react").MemoExoticComponent<typeof PlaybackRateControlInner>;
10
+ export {};
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo, useCallback, useId, useRef, useState } from "react";
3
+ import { presets } from "../audio/utils.js";
4
+ import { SnappableSlider } from "./SnappableSlider.js";
5
+ function PlaybackRateControlInner({ value, defaultValue, enabled, onChange, onToggle, }) {
6
+ const preset = presets.playbackRate;
7
+ const min = preset.min ?? -4;
8
+ const max = preset.max ?? 4;
9
+ const labelId = useId();
10
+ const [isEditing, setIsEditing] = useState(false);
11
+ const [editText, setEditText] = useState("");
12
+ const inputRef = useRef(null);
13
+ const displayValue = `${value.toFixed(2)}x`;
14
+ const handleChange = useCallback((v) => {
15
+ if (!enabled)
16
+ return;
17
+ onChange(v);
18
+ }, [enabled, onChange]);
19
+ const startEditing = useCallback(() => {
20
+ setEditText(String(value));
21
+ setIsEditing(true);
22
+ queueMicrotask(() => inputRef.current?.select());
23
+ }, [value]);
24
+ const commitEdit = useCallback(() => {
25
+ setIsEditing(false);
26
+ const parsed = Number.parseFloat(editText);
27
+ if (Number.isFinite(parsed)) {
28
+ onChange(Math.min(Math.max(parsed, min), max));
29
+ }
30
+ }, [editText, min, max, onChange]);
31
+ const handleEditKeyDown = useCallback((e) => {
32
+ if (e.key === "Enter") {
33
+ e.preventDefault();
34
+ commitEdit();
35
+ }
36
+ else if (e.key === "Escape") {
37
+ e.preventDefault();
38
+ setIsEditing(false);
39
+ }
40
+ }, [commitEdit]);
41
+ const disabled = !enabled;
42
+ return (_jsxs("div", { className: `audio-control${disabled ? " audio-control--disabled" : ""}`, title: "Playback speed. Negative for reverse.", children: [_jsx("input", { type: "checkbox", className: "control-toggle", checked: enabled, onChange: (e) => onToggle(e.target.checked) }), _jsx("span", { className: "control-label", id: labelId, children: "Rate" }), _jsx(SnappableSlider, { min: min, max: max, value: value, skew: preset.skew ?? 1, defaultValue: defaultValue, enableSnap: true, snaps: preset.snaps ?? [], ticks: preset.ticks ?? [], disabled: disabled, labelId: labelId, valueText: displayValue, onChange: handleChange }), isEditing ? (_jsx("input", { ref: inputRef, type: "text", className: "control-output control-output--editing", value: editText, onChange: (e) => setEditText(e.target.value), onBlur: commitEdit, onKeyDown: handleEditKeyDown })) : (_jsx("button", { type: "button", className: "control-output", onClick: startEditing, children: displayValue }))] }));
43
+ }
44
+ export const PlaybackRateControl = memo(PlaybackRateControlInner);
@@ -0,0 +1,13 @@
1
+ export interface PlayheadSliderProps {
2
+ /** Current playhead position in samples. */
3
+ value: number;
4
+ /** Audio duration in seconds (null when no audio loaded). */
5
+ audioDuration: number | null;
6
+ /** Whether playback is active (started/paused). */
7
+ disabled?: boolean;
8
+ /** Called when the user seeks to a new position (value in samples). */
9
+ onChange: (samplePosition: number) => void;
10
+ }
11
+ declare function PlayheadSliderInner({ value, audioDuration, disabled, onChange, }: PlayheadSliderProps): import("react/jsx-runtime").JSX.Element;
12
+ export declare const PlayheadSlider: import("react").MemoExoticComponent<typeof PlayheadSliderInner>;
13
+ export {};
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo, useCallback, useId } from "react";
3
+ import { SAMPLE_RATE } from "../controls/controlDefs.js";
4
+ import { SnappableSlider } from "./SnappableSlider.js";
5
+ function formatTime(seconds) {
6
+ const m = Math.floor(seconds / 60);
7
+ const s = seconds % 60;
8
+ return `${m}:${s.toFixed(2).padStart(5, "0")}`;
9
+ }
10
+ function PlayheadSliderInner({ value, audioDuration, disabled = false, onChange, }) {
11
+ const labelId = useId();
12
+ const maxSamples = audioDuration != null ? audioDuration * SAMPLE_RATE : 0;
13
+ const currentSeconds = value / SAMPLE_RATE;
14
+ const durationSeconds = audioDuration ?? 0;
15
+ const handleChange = useCallback((v) => {
16
+ onChange(Math.floor(v));
17
+ }, [onChange]);
18
+ return (_jsxs("div", { className: "playhead-slider", children: [_jsx("span", { className: "playhead-label", id: labelId, children: "Playhead" }), _jsx(SnappableSlider, { min: 0, max: maxSamples, value: value, disabled: disabled || maxSamples === 0, labelId: labelId, valueText: formatTime(currentSeconds), onChange: handleChange }), _jsxs("span", { className: "playhead-time", children: [formatTime(currentSeconds), " / ", formatTime(durationSeconds)] })] }));
19
+ }
20
+ export const PlayheadSlider = memo(PlayheadSliderInner);
@@ -0,0 +1,18 @@
1
+ export interface SnappableSliderProps {
2
+ min: number;
3
+ max: number;
4
+ value: number;
5
+ skew?: number;
6
+ step?: number;
7
+ defaultValue?: number;
8
+ enableSnap?: boolean;
9
+ snaps?: number[];
10
+ ticks?: number[];
11
+ logarithmic?: boolean;
12
+ disabled?: boolean;
13
+ labelId?: string;
14
+ valueText?: string;
15
+ formatTick?: (value: number) => string;
16
+ onChange?: (value: number) => void;
17
+ }
18
+ export declare function SnappableSlider({ min, max, value, skew, step, defaultValue, enableSnap, snaps, ticks, logarithmic, disabled, labelId, valueText, formatTick, onChange, }: SnappableSliderProps): import("react/jsx-runtime").JSX.Element;