tone 15.2.5 → 15.2.7

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 (522) hide show
  1. package/Tone/classes.ts +5 -5
  2. package/Tone/component/analysis/Analyser.test.ts +1 -0
  3. package/Tone/component/analysis/Analyser.ts +2 -2
  4. package/Tone/component/analysis/DCMeter.test.ts +1 -0
  5. package/Tone/component/analysis/FFT.test.ts +1 -0
  6. package/Tone/component/analysis/FFT.ts +1 -1
  7. package/Tone/component/analysis/Follower.test.ts +4 -3
  8. package/Tone/component/analysis/Follower.ts +2 -2
  9. package/Tone/component/analysis/Meter.test.ts +3 -2
  10. package/Tone/component/analysis/Meter.ts +4 -4
  11. package/Tone/component/analysis/Waveform.test.ts +1 -0
  12. package/Tone/component/channel/Channel.test.ts +4 -3
  13. package/Tone/component/channel/Channel.ts +5 -5
  14. package/Tone/component/channel/Merge.test.ts +1 -0
  15. package/Tone/component/channel/MidSideMerge.test.ts +2 -2
  16. package/Tone/component/channel/MidSideMerge.ts +3 -3
  17. package/Tone/component/channel/MidSideSplit.test.ts +6 -5
  18. package/Tone/component/channel/MidSideSplit.ts +2 -2
  19. package/Tone/component/channel/Mono.test.ts +1 -0
  20. package/Tone/component/channel/MultibandSplit.test.ts +1 -0
  21. package/Tone/component/channel/PanVol.test.ts +1 -0
  22. package/Tone/component/channel/PanVol.ts +1 -1
  23. package/Tone/component/channel/Panner.test.ts +1 -0
  24. package/Tone/component/channel/Panner3D.test.ts +1 -0
  25. package/Tone/component/channel/Panner3D.ts +2 -1
  26. package/Tone/component/channel/Recorder.test.ts +2 -1
  27. package/Tone/component/channel/Recorder.ts +2 -2
  28. package/Tone/component/channel/Solo.test.ts +1 -0
  29. package/Tone/component/channel/Split.test.ts +1 -0
  30. package/Tone/component/channel/Volume.test.ts +1 -0
  31. package/Tone/component/dynamics/Compressor.test.ts +1 -0
  32. package/Tone/component/dynamics/Gate.test.ts +4 -3
  33. package/Tone/component/dynamics/Gate.ts +3 -3
  34. package/Tone/component/dynamics/Limiter.test.ts +3 -2
  35. package/Tone/component/dynamics/Limiter.ts +2 -2
  36. package/Tone/component/dynamics/MidSideCompressor.test.ts +3 -2
  37. package/Tone/component/dynamics/MidSideCompressor.ts +3 -3
  38. package/Tone/component/dynamics/MultibandCompressor.test.ts +3 -2
  39. package/Tone/component/dynamics/MultibandCompressor.ts +4 -4
  40. package/Tone/component/envelope/AmplitudeEnvelope.test.ts +1 -0
  41. package/Tone/component/envelope/Envelope.test.ts +1 -0
  42. package/Tone/component/envelope/Envelope.ts +3 -3
  43. package/Tone/component/envelope/FrequencyEnvelope.test.ts +4 -3
  44. package/Tone/component/envelope/FrequencyEnvelope.ts +4 -4
  45. package/Tone/component/filter/BiquadFilter.test.ts +1 -0
  46. package/Tone/component/filter/BiquadFilter.ts +2 -2
  47. package/Tone/component/filter/Convolver.test.ts +1 -0
  48. package/Tone/component/filter/Convolver.ts +2 -2
  49. package/Tone/component/filter/EQ3.test.ts +1 -0
  50. package/Tone/component/filter/FeedbackCombFilter.test.ts +4 -3
  51. package/Tone/component/filter/FeedbackCombFilter.worklet.ts +1 -0
  52. package/Tone/component/filter/Filter.test.ts +1 -0
  53. package/Tone/component/filter/Filter.ts +1 -1
  54. package/Tone/component/filter/LowpassCombFilter.test.ts +3 -2
  55. package/Tone/component/filter/OnePoleFilter.test.ts +5 -4
  56. package/Tone/component/filter/OnePoleFilter.ts +1 -1
  57. package/Tone/component/index.ts +7 -11
  58. package/Tone/core/Global.ts +1 -1
  59. package/Tone/core/Tone.ts +0 -1
  60. package/Tone/core/clock/Clock.test.ts +1 -0
  61. package/Tone/core/clock/Clock.ts +1 -1
  62. package/Tone/core/clock/TickSignal.test.ts +1 -0
  63. package/Tone/core/clock/TickSource.test.ts +1 -0
  64. package/Tone/core/clock/TickSource.ts +1 -1
  65. package/Tone/core/clock/Ticker.test.ts +1 -0
  66. package/Tone/core/clock/Transport.test.ts +8 -6
  67. package/Tone/core/clock/Transport.ts +1 -1
  68. package/Tone/core/clock/TransportEvent.test.ts +1 -0
  69. package/Tone/core/clock/TransportRepeatEvent.test.ts +1 -0
  70. package/Tone/core/clock/TransportRepeatEvent.ts +1 -1
  71. package/Tone/core/context/AudioContext.ts +1 -0
  72. package/Tone/core/context/BaseContext.ts +2 -2
  73. package/Tone/core/context/Context.test.ts +2 -1
  74. package/Tone/core/context/Context.ts +4 -4
  75. package/Tone/core/context/Delay.test.ts +1 -0
  76. package/Tone/core/context/Destination.test.ts +1 -0
  77. package/Tone/core/context/DummyContext.ts +3 -3
  78. package/Tone/core/context/Gain.test.ts +1 -0
  79. package/Tone/core/context/Listener.test.ts +1 -0
  80. package/Tone/core/context/Listener.ts +2 -2
  81. package/Tone/core/context/Offline.test.ts +2 -1
  82. package/Tone/core/context/Offline.ts +3 -2
  83. package/Tone/core/context/OfflineContext.test.ts +1 -0
  84. package/Tone/core/context/Param.test.ts +4 -3
  85. package/Tone/core/context/Param.ts +2 -2
  86. package/Tone/core/context/ToneAudioBuffer.test.ts +1 -0
  87. package/Tone/core/context/ToneAudioBuffer.ts +1 -1
  88. package/Tone/core/context/ToneAudioBuffers.test.ts +1 -0
  89. package/Tone/core/context/ToneAudioBuffers.ts +1 -1
  90. package/Tone/core/context/ToneAudioNode.test.ts +4 -3
  91. package/Tone/core/context/ToneAudioNode.ts +1 -1
  92. package/Tone/core/context/ToneWithContext.ts +1 -1
  93. package/Tone/core/index.ts +9 -11
  94. package/Tone/core/type/Conversions.test.ts +1 -0
  95. package/Tone/core/type/Frequency.test.ts +2 -1
  96. package/Tone/core/type/Frequency.ts +0 -1
  97. package/Tone/core/type/Midi.test.ts +2 -1
  98. package/Tone/core/type/Ticks.test.ts +1 -0
  99. package/Tone/core/type/Time.test.ts +1 -0
  100. package/Tone/core/type/TransportTime.test.ts +1 -0
  101. package/Tone/core/util/Debug.test.ts +3 -2
  102. package/Tone/core/util/Debug.ts +1 -1
  103. package/Tone/core/util/Decorator.ts +1 -1
  104. package/Tone/core/util/Defaults.ts +1 -1
  105. package/Tone/core/util/Draw.test.ts +8 -11
  106. package/Tone/core/util/Draw.ts +4 -4
  107. package/Tone/core/util/Emitter.test.ts +1 -0
  108. package/Tone/core/util/IntervalTimeline.test.ts +1 -0
  109. package/Tone/core/util/IntervalTimeline.ts +1 -1
  110. package/Tone/core/util/StateTimeline.test.ts +1 -0
  111. package/Tone/core/util/StateTimeline.ts +1 -1
  112. package/Tone/core/util/Timeline.test.ts +1 -0
  113. package/Tone/core/util/Timeline.ts +1 -1
  114. package/Tone/core/util/TimelineValue.test.ts +1 -0
  115. package/Tone/core/util/TimelineValue.ts +1 -1
  116. package/Tone/core/worklet/SingleIOProcessor.worklet.ts +1 -0
  117. package/Tone/effect/AutoFilter.test.ts +5 -4
  118. package/Tone/effect/AutoFilter.ts +2 -2
  119. package/Tone/effect/AutoPanner.test.ts +4 -3
  120. package/Tone/effect/AutoPanner.ts +1 -1
  121. package/Tone/effect/AutoWah.test.ts +4 -3
  122. package/Tone/effect/AutoWah.ts +5 -5
  123. package/Tone/effect/BitCrusher.test.ts +6 -5
  124. package/Tone/effect/BitCrusher.ts +6 -6
  125. package/Tone/effect/BitCrusher.worklet.ts +1 -0
  126. package/Tone/effect/Chebyshev.test.ts +4 -3
  127. package/Tone/effect/Chebyshev.ts +2 -2
  128. package/Tone/effect/Chorus.test.ts +5 -4
  129. package/Tone/effect/Chorus.ts +8 -8
  130. package/Tone/effect/Distortion.test.ts +1 -0
  131. package/Tone/effect/FeedbackDelay.test.ts +1 -0
  132. package/Tone/effect/Freeverb.test.ts +4 -3
  133. package/Tone/effect/Freeverb.ts +2 -2
  134. package/Tone/effect/FrequencyShifter.test.ts +1 -0
  135. package/Tone/effect/JCReverb.test.ts +4 -3
  136. package/Tone/effect/JCReverb.ts +3 -3
  137. package/Tone/effect/LFOEffect.ts +4 -4
  138. package/Tone/effect/MidSideEffect.ts +2 -2
  139. package/Tone/effect/Phaser.test.ts +4 -3
  140. package/Tone/effect/Phaser.ts +3 -3
  141. package/Tone/effect/PingPongDelay.test.ts +4 -3
  142. package/Tone/effect/PingPongDelay.ts +5 -5
  143. package/Tone/effect/PitchShift.test.ts +4 -3
  144. package/Tone/effect/PitchShift.ts +7 -7
  145. package/Tone/effect/Reverb.test.ts +1 -0
  146. package/Tone/effect/Reverb.ts +3 -3
  147. package/Tone/effect/StereoEffect.ts +6 -6
  148. package/Tone/effect/StereoFeedbackEffect.ts +5 -5
  149. package/Tone/effect/StereoWidener.test.ts +4 -3
  150. package/Tone/effect/StereoWidener.ts +5 -5
  151. package/Tone/effect/StereoXFeedbackEffect.ts +2 -2
  152. package/Tone/effect/Tremolo.test.ts +4 -3
  153. package/Tone/effect/Tremolo.ts +4 -4
  154. package/Tone/effect/Vibrato.test.ts +4 -3
  155. package/Tone/effect/Vibrato.ts +6 -6
  156. package/Tone/effect/index.ts +2 -2
  157. package/Tone/event/Loop.test.ts +4 -3
  158. package/Tone/event/Loop.ts +5 -5
  159. package/Tone/event/Part.test.ts +1 -0
  160. package/Tone/event/Pattern.test.ts +3 -2
  161. package/Tone/event/Pattern.ts +3 -3
  162. package/Tone/event/PatternGenerator.test.ts +1 -0
  163. package/Tone/event/Sequence.test.ts +1 -0
  164. package/Tone/event/ToneEvent.test.ts +1 -0
  165. package/Tone/event/ToneEvent.ts +1 -0
  166. package/Tone/fromContext.test.ts +1 -0
  167. package/Tone/fromContext.ts +2 -2
  168. package/Tone/index.test.ts +4 -3
  169. package/Tone/index.ts +2 -2
  170. package/Tone/instrument/AMSynth.test.ts +4 -3
  171. package/Tone/instrument/AMSynth.ts +2 -2
  172. package/Tone/instrument/DuoSynth.test.ts +4 -3
  173. package/Tone/instrument/DuoSynth.ts +7 -7
  174. package/Tone/instrument/FMSynth.test.ts +3 -2
  175. package/Tone/instrument/MembraneSynth.test.ts +1 -0
  176. package/Tone/instrument/MembraneSynth.ts +1 -1
  177. package/Tone/instrument/MetalSynth.test.ts +1 -0
  178. package/Tone/instrument/ModulationSynth.ts +8 -8
  179. package/Tone/instrument/MonoSynth.test.ts +4 -3
  180. package/Tone/instrument/MonoSynth.ts +8 -8
  181. package/Tone/instrument/Monophonic.ts +1 -1
  182. package/Tone/instrument/NoiseSynth.test.ts +1 -0
  183. package/Tone/instrument/NoiseSynth.ts +6 -6
  184. package/Tone/instrument/PluckSynth.test.ts +1 -0
  185. package/Tone/instrument/PluckSynth.ts +1 -1
  186. package/Tone/instrument/PolySynth.test.ts +5 -4
  187. package/Tone/instrument/PolySynth.ts +4 -4
  188. package/Tone/instrument/Sampler.test.ts +94 -0
  189. package/Tone/instrument/Sampler.ts +132 -4
  190. package/Tone/instrument/Synth.test.ts +1 -0
  191. package/Tone/instrument/index.ts +1 -1
  192. package/Tone/signal/Add.ts +1 -1
  193. package/Tone/signal/AudioToGain.test.ts +1 -0
  194. package/Tone/signal/GainToAudio.test.ts +1 -1
  195. package/Tone/signal/GreaterThan.test.ts +1 -1
  196. package/Tone/signal/GreaterThan.ts +4 -4
  197. package/Tone/signal/GreaterThanZero.test.ts +1 -1
  198. package/Tone/signal/GreaterThanZero.ts +3 -3
  199. package/Tone/signal/Multiply.test.ts +1 -0
  200. package/Tone/signal/Multiply.ts +1 -1
  201. package/Tone/signal/Pow.test.ts +1 -1
  202. package/Tone/signal/Pow.ts +2 -2
  203. package/Tone/signal/Scale.test.ts +1 -0
  204. package/Tone/signal/ScaleExp.test.ts +3 -2
  205. package/Tone/signal/ScaleExp.ts +1 -1
  206. package/Tone/signal/Signal.test.ts +2 -1
  207. package/Tone/signal/SignalOperator.ts +1 -1
  208. package/Tone/signal/Subtract.ts +1 -1
  209. package/Tone/signal/SyncedSignal.test.ts +6 -4
  210. package/Tone/signal/SyncedSignal.ts +4 -4
  211. package/Tone/signal/ToneConstantSource.test.ts +2 -1
  212. package/Tone/signal/ToneConstantSource.ts +1 -1
  213. package/Tone/signal/WaveShaper.test.ts +1 -0
  214. package/Tone/signal/WaveShaper.ts +1 -1
  215. package/Tone/signal/Zero.test.ts +1 -0
  216. package/Tone/signal/index.ts +2 -2
  217. package/Tone/source/Noise.test.ts +1 -0
  218. package/Tone/source/Noise.ts +1 -1
  219. package/Tone/source/OneShotSource.ts +1 -1
  220. package/Tone/source/Source.test.ts +1 -0
  221. package/Tone/source/Source.ts +4 -3
  222. package/Tone/source/UserMedia.test.ts +3 -2
  223. package/Tone/source/UserMedia.ts +3 -3
  224. package/Tone/source/buffer/GrainPlayer.test.ts +4 -3
  225. package/Tone/source/buffer/GrainPlayer.ts +6 -6
  226. package/Tone/source/buffer/Player.test.ts +1 -0
  227. package/Tone/source/buffer/Player.ts +2 -2
  228. package/Tone/source/buffer/Players.test.ts +1 -0
  229. package/Tone/source/buffer/Players.ts +1 -1
  230. package/Tone/source/buffer/ToneBufferSource.test.ts +1 -0
  231. package/Tone/source/buffer/ToneBufferSource.ts +3 -3
  232. package/Tone/source/index.ts +9 -9
  233. package/Tone/source/oscillator/AMOscillator.test.ts +1 -0
  234. package/Tone/source/oscillator/AMOscillator.ts +2 -2
  235. package/Tone/source/oscillator/FMOscillator.test.ts +1 -0
  236. package/Tone/source/oscillator/FatOscillator.test.ts +1 -0
  237. package/Tone/source/oscillator/FatOscillator.ts +1 -1
  238. package/Tone/source/oscillator/LFO.test.ts +1 -0
  239. package/Tone/source/oscillator/OmniOscillator.test.ts +1 -0
  240. package/Tone/source/oscillator/Oscillator.test.ts +1 -0
  241. package/Tone/source/oscillator/Oscillator.ts +2 -2
  242. package/Tone/source/oscillator/OscillatorInterface.ts +1 -1
  243. package/Tone/source/oscillator/PWMOscillator.test.ts +1 -0
  244. package/Tone/source/oscillator/PulseOscillator.test.ts +1 -0
  245. package/Tone/source/oscillator/ToneOscillatorNode.test.ts +1 -0
  246. package/Tone/source/oscillator/ToneOscillatorNode.ts +2 -2
  247. package/Tone/version.ts +1 -1
  248. package/build/Tone.js +1 -1
  249. package/build/Tone.js.map +1 -1
  250. package/build/esm/classes.d.ts +5 -5
  251. package/build/esm/classes.js +5 -5
  252. package/build/esm/classes.js.map +1 -1
  253. package/build/esm/component/analysis/Analyser.js +2 -2
  254. package/build/esm/component/analysis/Analyser.js.map +1 -1
  255. package/build/esm/component/analysis/FFT.js +1 -1
  256. package/build/esm/component/analysis/FFT.js.map +1 -1
  257. package/build/esm/component/analysis/Follower.d.ts +1 -1
  258. package/build/esm/component/analysis/Follower.js +1 -1
  259. package/build/esm/component/analysis/Follower.js.map +1 -1
  260. package/build/esm/component/analysis/Meter.js +4 -4
  261. package/build/esm/component/analysis/Meter.js.map +1 -1
  262. package/build/esm/component/channel/Channel.d.ts +3 -3
  263. package/build/esm/component/channel/Channel.js +3 -3
  264. package/build/esm/component/channel/Channel.js.map +1 -1
  265. package/build/esm/component/channel/MidSideMerge.js +3 -3
  266. package/build/esm/component/channel/MidSideMerge.js.map +1 -1
  267. package/build/esm/component/channel/MidSideSplit.js +2 -2
  268. package/build/esm/component/channel/MidSideSplit.js.map +1 -1
  269. package/build/esm/component/channel/PanVol.js +1 -1
  270. package/build/esm/component/channel/PanVol.js.map +1 -1
  271. package/build/esm/component/channel/Panner3D.d.ts +1 -1
  272. package/build/esm/component/channel/Panner3D.js +1 -1
  273. package/build/esm/component/channel/Panner3D.js.map +1 -1
  274. package/build/esm/component/channel/Recorder.d.ts +1 -1
  275. package/build/esm/component/channel/Recorder.js +2 -2
  276. package/build/esm/component/channel/Recorder.js.map +1 -1
  277. package/build/esm/component/dynamics/Gate.js +3 -3
  278. package/build/esm/component/dynamics/Gate.js.map +1 -1
  279. package/build/esm/component/dynamics/Limiter.d.ts +1 -1
  280. package/build/esm/component/dynamics/Limiter.js +1 -1
  281. package/build/esm/component/dynamics/Limiter.js.map +1 -1
  282. package/build/esm/component/dynamics/MidSideCompressor.d.ts +1 -1
  283. package/build/esm/component/dynamics/MidSideCompressor.js +3 -3
  284. package/build/esm/component/dynamics/MidSideCompressor.js.map +1 -1
  285. package/build/esm/component/dynamics/MultibandCompressor.d.ts +2 -2
  286. package/build/esm/component/dynamics/MultibandCompressor.js +2 -2
  287. package/build/esm/component/dynamics/MultibandCompressor.js.map +1 -1
  288. package/build/esm/component/envelope/Envelope.js +3 -3
  289. package/build/esm/component/envelope/Envelope.js.map +1 -1
  290. package/build/esm/component/envelope/FrequencyEnvelope.js +3 -3
  291. package/build/esm/component/envelope/FrequencyEnvelope.js.map +1 -1
  292. package/build/esm/component/filter/BiquadFilter.d.ts +1 -1
  293. package/build/esm/component/filter/BiquadFilter.js +2 -2
  294. package/build/esm/component/filter/BiquadFilter.js.map +1 -1
  295. package/build/esm/component/filter/Convolver.d.ts +2 -2
  296. package/build/esm/component/filter/Convolver.js +2 -2
  297. package/build/esm/component/filter/Convolver.js.map +1 -1
  298. package/build/esm/component/filter/FeedbackCombFilter.worklet.js.map +1 -1
  299. package/build/esm/component/filter/Filter.js +1 -1
  300. package/build/esm/component/filter/Filter.js.map +1 -1
  301. package/build/esm/component/filter/OnePoleFilter.d.ts +1 -1
  302. package/build/esm/component/filter/OnePoleFilter.js +1 -1
  303. package/build/esm/component/filter/OnePoleFilter.js.map +1 -1
  304. package/build/esm/component/index.d.ts +7 -7
  305. package/build/esm/component/index.js +7 -7
  306. package/build/esm/component/index.js.map +1 -1
  307. package/build/esm/core/Global.js.map +1 -1
  308. package/build/esm/core/Tone.js.map +1 -1
  309. package/build/esm/core/clock/Clock.js +1 -1
  310. package/build/esm/core/clock/Clock.js.map +1 -1
  311. package/build/esm/core/clock/TickSource.js +1 -1
  312. package/build/esm/core/clock/TickSource.js.map +1 -1
  313. package/build/esm/core/clock/Transport.js.map +1 -1
  314. package/build/esm/core/clock/TransportRepeatEvent.d.ts +1 -1
  315. package/build/esm/core/clock/TransportRepeatEvent.js +1 -1
  316. package/build/esm/core/clock/TransportRepeatEvent.js.map +1 -1
  317. package/build/esm/core/context/AudioContext.js.map +1 -1
  318. package/build/esm/core/context/BaseContext.d.ts +2 -2
  319. package/build/esm/core/context/BaseContext.js.map +1 -1
  320. package/build/esm/core/context/Context.d.ts +2 -2
  321. package/build/esm/core/context/Context.js +2 -2
  322. package/build/esm/core/context/Context.js.map +1 -1
  323. package/build/esm/core/context/DummyContext.d.ts +3 -3
  324. package/build/esm/core/context/DummyContext.js.map +1 -1
  325. package/build/esm/core/context/Listener.d.ts +1 -1
  326. package/build/esm/core/context/Listener.js +2 -2
  327. package/build/esm/core/context/Listener.js.map +1 -1
  328. package/build/esm/core/context/Offline.d.ts +2 -2
  329. package/build/esm/core/context/Offline.js +2 -2
  330. package/build/esm/core/context/Offline.js.map +1 -1
  331. package/build/esm/core/context/Param.js +2 -2
  332. package/build/esm/core/context/Param.js.map +1 -1
  333. package/build/esm/core/context/ToneAudioBuffer.js +1 -1
  334. package/build/esm/core/context/ToneAudioBuffer.js.map +1 -1
  335. package/build/esm/core/context/ToneAudioBuffers.js +1 -1
  336. package/build/esm/core/context/ToneAudioBuffers.js.map +1 -1
  337. package/build/esm/core/context/ToneAudioNode.js +1 -1
  338. package/build/esm/core/context/ToneAudioNode.js.map +1 -1
  339. package/build/esm/core/context/ToneWithContext.js.map +1 -1
  340. package/build/esm/core/index.d.ts +4 -4
  341. package/build/esm/core/index.js +4 -4
  342. package/build/esm/core/index.js.map +1 -1
  343. package/build/esm/core/type/Frequency.js +0 -1
  344. package/build/esm/core/type/Frequency.js.map +1 -1
  345. package/build/esm/core/util/Debug.js.map +1 -1
  346. package/build/esm/core/util/Decorator.js.map +1 -1
  347. package/build/esm/core/util/Defaults.js.map +1 -1
  348. package/build/esm/core/util/Draw.js +1 -1
  349. package/build/esm/core/util/Draw.js.map +1 -1
  350. package/build/esm/core/util/IntervalTimeline.js +1 -1
  351. package/build/esm/core/util/IntervalTimeline.js.map +1 -1
  352. package/build/esm/core/util/StateTimeline.js +1 -1
  353. package/build/esm/core/util/StateTimeline.js.map +1 -1
  354. package/build/esm/core/util/Timeline.js +1 -1
  355. package/build/esm/core/util/Timeline.js.map +1 -1
  356. package/build/esm/core/util/TimelineValue.js +1 -1
  357. package/build/esm/core/util/TimelineValue.js.map +1 -1
  358. package/build/esm/core/worklet/SingleIOProcessor.worklet.js.map +1 -1
  359. package/build/esm/effect/AutoFilter.d.ts +1 -1
  360. package/build/esm/effect/AutoFilter.js.map +1 -1
  361. package/build/esm/effect/AutoPanner.d.ts +1 -1
  362. package/build/esm/effect/AutoPanner.js.map +1 -1
  363. package/build/esm/effect/AutoWah.d.ts +1 -1
  364. package/build/esm/effect/AutoWah.js +4 -4
  365. package/build/esm/effect/AutoWah.js.map +1 -1
  366. package/build/esm/effect/BitCrusher.d.ts +2 -2
  367. package/build/esm/effect/BitCrusher.js +4 -4
  368. package/build/esm/effect/BitCrusher.js.map +1 -1
  369. package/build/esm/effect/BitCrusher.worklet.js.map +1 -1
  370. package/build/esm/effect/Chebyshev.d.ts +1 -1
  371. package/build/esm/effect/Chebyshev.js +2 -2
  372. package/build/esm/effect/Chebyshev.js.map +1 -1
  373. package/build/esm/effect/Chorus.d.ts +2 -2
  374. package/build/esm/effect/Chorus.js +3 -3
  375. package/build/esm/effect/Chorus.js.map +1 -1
  376. package/build/esm/effect/Freeverb.d.ts +1 -1
  377. package/build/esm/effect/Freeverb.js +2 -2
  378. package/build/esm/effect/Freeverb.js.map +1 -1
  379. package/build/esm/effect/JCReverb.d.ts +1 -1
  380. package/build/esm/effect/JCReverb.js +3 -3
  381. package/build/esm/effect/JCReverb.js.map +1 -1
  382. package/build/esm/effect/LFOEffect.d.ts +3 -3
  383. package/build/esm/effect/LFOEffect.js +1 -1
  384. package/build/esm/effect/LFOEffect.js.map +1 -1
  385. package/build/esm/effect/MidSideEffect.d.ts +1 -1
  386. package/build/esm/effect/MidSideEffect.js +2 -2
  387. package/build/esm/effect/MidSideEffect.js.map +1 -1
  388. package/build/esm/effect/Phaser.d.ts +1 -1
  389. package/build/esm/effect/Phaser.js +3 -3
  390. package/build/esm/effect/Phaser.js.map +1 -1
  391. package/build/esm/effect/PingPongDelay.d.ts +1 -1
  392. package/build/esm/effect/PingPongDelay.js +3 -3
  393. package/build/esm/effect/PingPongDelay.js.map +1 -1
  394. package/build/esm/effect/PitchShift.d.ts +1 -1
  395. package/build/esm/effect/PitchShift.js +6 -6
  396. package/build/esm/effect/PitchShift.js.map +1 -1
  397. package/build/esm/effect/Reverb.js +3 -3
  398. package/build/esm/effect/Reverb.js.map +1 -1
  399. package/build/esm/effect/StereoEffect.d.ts +4 -4
  400. package/build/esm/effect/StereoEffect.js +2 -2
  401. package/build/esm/effect/StereoEffect.js.map +1 -1
  402. package/build/esm/effect/StereoFeedbackEffect.d.ts +4 -4
  403. package/build/esm/effect/StereoFeedbackEffect.js +4 -4
  404. package/build/esm/effect/StereoFeedbackEffect.js.map +1 -1
  405. package/build/esm/effect/StereoWidener.d.ts +1 -1
  406. package/build/esm/effect/StereoWidener.js +4 -4
  407. package/build/esm/effect/StereoWidener.js.map +1 -1
  408. package/build/esm/effect/StereoXFeedbackEffect.d.ts +1 -1
  409. package/build/esm/effect/StereoXFeedbackEffect.js +1 -1
  410. package/build/esm/effect/StereoXFeedbackEffect.js.map +1 -1
  411. package/build/esm/effect/Tremolo.d.ts +2 -2
  412. package/build/esm/effect/Tremolo.js +3 -3
  413. package/build/esm/effect/Tremolo.js.map +1 -1
  414. package/build/esm/effect/Vibrato.d.ts +3 -3
  415. package/build/esm/effect/Vibrato.js +3 -3
  416. package/build/esm/effect/Vibrato.js.map +1 -1
  417. package/build/esm/effect/index.d.ts +2 -2
  418. package/build/esm/effect/index.js +2 -2
  419. package/build/esm/effect/index.js.map +1 -1
  420. package/build/esm/event/Loop.d.ts +1 -1
  421. package/build/esm/event/Loop.js +1 -1
  422. package/build/esm/event/Loop.js.map +1 -1
  423. package/build/esm/event/Pattern.d.ts +1 -1
  424. package/build/esm/event/Pattern.js +2 -2
  425. package/build/esm/event/Pattern.js.map +1 -1
  426. package/build/esm/event/ToneEvent.js.map +1 -1
  427. package/build/esm/fromContext.d.ts +1 -1
  428. package/build/esm/fromContext.js +1 -1
  429. package/build/esm/fromContext.js.map +1 -1
  430. package/build/esm/index.d.ts +1 -1
  431. package/build/esm/index.js +1 -1
  432. package/build/esm/index.js.map +1 -1
  433. package/build/esm/instrument/AMSynth.js +1 -1
  434. package/build/esm/instrument/AMSynth.js.map +1 -1
  435. package/build/esm/instrument/DuoSynth.d.ts +4 -4
  436. package/build/esm/instrument/DuoSynth.js +6 -6
  437. package/build/esm/instrument/DuoSynth.js.map +1 -1
  438. package/build/esm/instrument/MembraneSynth.js +1 -1
  439. package/build/esm/instrument/MembraneSynth.js.map +1 -1
  440. package/build/esm/instrument/ModulationSynth.d.ts +7 -7
  441. package/build/esm/instrument/ModulationSynth.js +6 -6
  442. package/build/esm/instrument/ModulationSynth.js.map +1 -1
  443. package/build/esm/instrument/MonoSynth.d.ts +4 -4
  444. package/build/esm/instrument/MonoSynth.js +2 -2
  445. package/build/esm/instrument/MonoSynth.js.map +1 -1
  446. package/build/esm/instrument/Monophonic.js +1 -1
  447. package/build/esm/instrument/Monophonic.js.map +1 -1
  448. package/build/esm/instrument/NoiseSynth.d.ts +2 -2
  449. package/build/esm/instrument/NoiseSynth.js +3 -3
  450. package/build/esm/instrument/NoiseSynth.js.map +1 -1
  451. package/build/esm/instrument/PluckSynth.js.map +1 -1
  452. package/build/esm/instrument/PolySynth.d.ts +3 -3
  453. package/build/esm/instrument/PolySynth.js +1 -1
  454. package/build/esm/instrument/PolySynth.js.map +1 -1
  455. package/build/esm/instrument/Sampler.d.ts +56 -0
  456. package/build/esm/instrument/Sampler.js +108 -4
  457. package/build/esm/instrument/Sampler.js.map +1 -1
  458. package/build/esm/instrument/index.d.ts +1 -1
  459. package/build/esm/instrument/index.js +1 -1
  460. package/build/esm/instrument/index.js.map +1 -1
  461. package/build/esm/signal/Add.js +1 -1
  462. package/build/esm/signal/Add.js.map +1 -1
  463. package/build/esm/signal/GreaterThan.d.ts +1 -1
  464. package/build/esm/signal/GreaterThan.js +3 -3
  465. package/build/esm/signal/GreaterThan.js.map +1 -1
  466. package/build/esm/signal/GreaterThanZero.d.ts +1 -1
  467. package/build/esm/signal/GreaterThanZero.js +2 -2
  468. package/build/esm/signal/GreaterThanZero.js.map +1 -1
  469. package/build/esm/signal/Multiply.d.ts +1 -1
  470. package/build/esm/signal/Multiply.js.map +1 -1
  471. package/build/esm/signal/Pow.d.ts +2 -2
  472. package/build/esm/signal/Pow.js +1 -1
  473. package/build/esm/signal/Pow.js.map +1 -1
  474. package/build/esm/signal/ScaleExp.d.ts +1 -1
  475. package/build/esm/signal/ScaleExp.js +1 -1
  476. package/build/esm/signal/ScaleExp.js.map +1 -1
  477. package/build/esm/signal/SignalOperator.js +1 -1
  478. package/build/esm/signal/SignalOperator.js.map +1 -1
  479. package/build/esm/signal/Subtract.js +1 -1
  480. package/build/esm/signal/Subtract.js.map +1 -1
  481. package/build/esm/signal/SyncedSignal.d.ts +2 -2
  482. package/build/esm/signal/SyncedSignal.js +2 -2
  483. package/build/esm/signal/SyncedSignal.js.map +1 -1
  484. package/build/esm/signal/ToneConstantSource.js +1 -1
  485. package/build/esm/signal/ToneConstantSource.js.map +1 -1
  486. package/build/esm/signal/WaveShaper.js +1 -1
  487. package/build/esm/signal/WaveShaper.js.map +1 -1
  488. package/build/esm/signal/index.d.ts +2 -2
  489. package/build/esm/signal/index.js +2 -2
  490. package/build/esm/signal/index.js.map +1 -1
  491. package/build/esm/source/Noise.js +1 -1
  492. package/build/esm/source/Noise.js.map +1 -1
  493. package/build/esm/source/OneShotSource.js +1 -1
  494. package/build/esm/source/OneShotSource.js.map +1 -1
  495. package/build/esm/source/Source.js +3 -3
  496. package/build/esm/source/Source.js.map +1 -1
  497. package/build/esm/source/UserMedia.d.ts +1 -1
  498. package/build/esm/source/UserMedia.js +2 -2
  499. package/build/esm/source/UserMedia.js.map +1 -1
  500. package/build/esm/source/buffer/GrainPlayer.d.ts +1 -1
  501. package/build/esm/source/buffer/GrainPlayer.js +5 -5
  502. package/build/esm/source/buffer/GrainPlayer.js.map +1 -1
  503. package/build/esm/source/buffer/Player.js +2 -2
  504. package/build/esm/source/buffer/Player.js.map +1 -1
  505. package/build/esm/source/buffer/Players.js +1 -1
  506. package/build/esm/source/buffer/Players.js.map +1 -1
  507. package/build/esm/source/buffer/ToneBufferSource.js +3 -3
  508. package/build/esm/source/buffer/ToneBufferSource.js.map +1 -1
  509. package/build/esm/source/index.d.ts +9 -9
  510. package/build/esm/source/index.js +9 -9
  511. package/build/esm/source/index.js.map +1 -1
  512. package/build/esm/source/oscillator/AMOscillator.js +2 -2
  513. package/build/esm/source/oscillator/AMOscillator.js.map +1 -1
  514. package/build/esm/source/oscillator/FatOscillator.js +1 -1
  515. package/build/esm/source/oscillator/FatOscillator.js.map +1 -1
  516. package/build/esm/source/oscillator/Oscillator.js +2 -2
  517. package/build/esm/source/oscillator/Oscillator.js.map +1 -1
  518. package/build/esm/source/oscillator/OscillatorInterface.js.map +1 -1
  519. package/build/esm/source/oscillator/ToneOscillatorNode.js +2 -2
  520. package/build/esm/source/oscillator/ToneOscillatorNode.js.map +1 -1
  521. package/build/esm/version.js +1 -1
  522. package/package.json +10 -9
@@ -1,15 +1,15 @@
1
1
  import { AmplitudeEnvelope } from "../component/envelope/AmplitudeEnvelope.js";
2
- import { NormalRange, Time } from "../core/type/Units.js";
3
- import { omitFromObject, optionsFromArguments } from "../core/util/Defaults.js";
4
- import { RecursivePartial } from "../core/util/Interface.js";
5
- import { Noise, NoiseOptions } from "../source/Noise.js";
6
- import { Instrument, InstrumentOptions } from "./Instrument.js";
2
+ import { Envelope, EnvelopeOptions } from "../component/envelope/Envelope.js";
7
3
  import {
8
4
  ToneAudioNode,
9
5
  ToneAudioNodeOptions,
10
6
  } from "../core/context/ToneAudioNode.js";
11
- import { Envelope, EnvelopeOptions } from "../component/envelope/Envelope.js";
7
+ import { NormalRange, Time } from "../core/type/Units.js";
8
+ import { omitFromObject, optionsFromArguments } from "../core/util/Defaults.js";
9
+ import { RecursivePartial } from "../core/util/Interface.js";
10
+ import { Noise, NoiseOptions } from "../source/Noise.js";
12
11
  import { Source } from "../source/Source.js";
12
+ import { Instrument, InstrumentOptions } from "./Instrument.js";
13
13
 
14
14
  export interface NoiseSynthOptions extends InstrumentOptions {
15
15
  envelope: Omit<EnvelopeOptions, keyof ToneAudioNodeOptions>;
@@ -1,4 +1,5 @@
1
1
  import { expect } from "chai";
2
+
2
3
  import { BasicTests } from "../../test/helper/Basic.js";
3
4
  import { CompareToFile } from "../../test/helper/CompareToFile.js";
4
5
  import { InstrumentTest } from "../../test/helper/InstrumentTests.js";
@@ -1,5 +1,5 @@
1
- import { Frequency, NormalRange, Time } from "../core/type/Units.js";
2
1
  import { LowpassCombFilter } from "../component/filter/LowpassCombFilter.js";
2
+ import { Frequency, NormalRange, Time } from "../core/type/Units.js";
3
3
  import { deepMerge } from "../core/util/Defaults.js";
4
4
  import { optionsFromArguments } from "../core/util/Defaults.js";
5
5
  import { RecursivePartial } from "../core/util/Interface.js";
@@ -1,14 +1,15 @@
1
1
  import { expect } from "chai";
2
+
2
3
  import { BasicTests, warns } from "../../test/helper/Basic.js";
3
4
  import { CompareToFile } from "../../test/helper/CompareToFile.js";
4
5
  import { atTime, Offline } from "../../test/helper/Offline.js";
5
6
  import { OutputAudio } from "../../test/helper/OutputAudio.js";
6
- import { PolySynth } from "./PolySynth.js";
7
- import { Synth } from "./Synth.js";
8
7
  import { FMSynth } from "./FMSynth.js";
9
- import { PluckSynth } from "./PluckSynth.js";
10
- import { MetalSynth } from "./MetalSynth.js";
11
8
  import { MembraneSynth } from "./MembraneSynth.js";
9
+ import { MetalSynth } from "./MetalSynth.js";
10
+ import { PluckSynth } from "./PluckSynth.js";
11
+ import { PolySynth } from "./PolySynth.js";
12
+ import { Synth } from "./Synth.js";
12
13
 
13
14
  describe("PolySynth", () => {
14
15
  BasicTests(PolySynth);
@@ -6,6 +6,7 @@ import {
6
6
  Seconds,
7
7
  Time,
8
8
  } from "../core/type/Units.js";
9
+ import { assert, warn } from "../core/util/Debug.js";
9
10
  import {
10
11
  deepMerge,
11
12
  omitFromObject,
@@ -13,15 +14,14 @@ import {
13
14
  } from "../core/util/Defaults.js";
14
15
  import { RecursivePartial } from "../core/util/Interface.js";
15
16
  import { isArray, isNumber } from "../core/util/TypeCheck.js";
17
+ import { AMSynth, AMSynthOptions } from "./AMSynth.js";
18
+ import { FMSynth, FMSynthOptions } from "./FMSynth.js";
16
19
  import { Instrument, InstrumentOptions } from "./Instrument.js";
17
20
  import { MembraneSynth, MembraneSynthOptions } from "./MembraneSynth.js";
18
- import { FMSynth, FMSynthOptions } from "./FMSynth.js";
19
- import { AMSynth, AMSynthOptions } from "./AMSynth.js";
20
- import { MonoSynth, MonoSynthOptions } from "./MonoSynth.js";
21
21
  import { MetalSynth, MetalSynthOptions } from "./MetalSynth.js";
22
22
  import { Monophonic } from "./Monophonic.js";
23
+ import { MonoSynth, MonoSynthOptions } from "./MonoSynth.js";
23
24
  import { Synth, SynthOptions } from "./Synth.js";
24
- import { assert, warn } from "../core/util/Debug.js";
25
25
 
26
26
  type VoiceConstructor<V> = {
27
27
  getDefaults: () => VoiceOptions<V>;
@@ -1,9 +1,11 @@
1
1
  import { expect } from "chai";
2
+
2
3
  import { BasicTests } from "../../test/helper/Basic.js";
3
4
  import { CompareToFile } from "../../test/helper/CompareToFile.js";
4
5
  import { InstrumentTest } from "../../test/helper/InstrumentTests.js";
5
6
  import { atTime, Offline } from "../../test/helper/Offline.js";
6
7
  import { ToneAudioBuffer } from "../core/context/ToneAudioBuffer.js";
8
+ import { getContext } from "../core/Global.js";
7
9
  import { Sampler } from "./Sampler.js";
8
10
 
9
11
  describe("Sampler", () => {
@@ -55,6 +57,7 @@ describe("Sampler", () => {
55
57
  {
56
58
  attack: 0.2,
57
59
  release: 0.3,
60
+ loop: true
58
61
  }
59
62
  );
60
63
  expect(sampler.attack).to.equal(0.2);
@@ -266,6 +269,97 @@ describe("Sampler", () => {
266
269
  });
267
270
  });
268
271
 
272
+ context("Looping", () => {
273
+
274
+ it("can be set to loop", () => {
275
+ const sampler = new Sampler();
276
+ sampler.loop = true;
277
+ expect(sampler.loop).to.be.true;
278
+ sampler.dispose();
279
+ });
280
+
281
+ it("can set the loop points", () => {
282
+ const sampler = new Sampler();
283
+ sampler.loopStart = 0.2;
284
+ expect(sampler.loopStart).to.equal(0.2);
285
+ sampler.loopEnd = 0.7;
286
+ expect(sampler.loopEnd).to.equal(0.7);
287
+ sampler.setLoopPoints(0, 0.5);
288
+ expect(sampler.loopStart).to.equal(0);
289
+ expect(sampler.loopEnd).to.equal(0.5);
290
+ sampler.dispose();
291
+ });
292
+
293
+ it("loops the audio", async () => {
294
+ const buff = await Offline(() => {
295
+ const sampler = new Sampler({
296
+ urls: {
297
+ A4: A4_buffer
298
+ }
299
+ });
300
+ sampler.loop = true;
301
+ sampler.toDestination();
302
+ sampler.triggerAttack("A4");
303
+ }, A4_buffer.duration * 1.5);
304
+ expect(buff.getRmsAtTime(0)).to.be.above(0);
305
+ expect(buff.getRmsAtTime(A4_buffer.duration * 0.5)).to.be.above(0);
306
+ expect(buff.getRmsAtTime(A4_buffer.duration)).to.be.above(0);
307
+ expect(buff.getRmsAtTime(A4_buffer.duration * 1.2)).to.be.above(0);
308
+ });
309
+
310
+ it("setting the loop multiple times has no affect", async () => {
311
+ const buff = await Offline(() => {
312
+ const sampler = new Sampler({
313
+ urls: {
314
+ A4: A4_buffer
315
+ }
316
+ });
317
+ sampler.loop = true;
318
+ sampler.loop = true;
319
+ sampler.toDestination();
320
+ sampler.triggerAttack("A4");
321
+ }, A4_buffer.duration * 1.5);
322
+ expect(buff.getRmsAtTime(0)).to.be.above(0);
323
+ expect(buff.getRmsAtTime(A4_buffer.duration * 0.5)).to.be.above(0);
324
+ expect(buff.getRmsAtTime(A4_buffer.duration)).to.be.above(0);
325
+ expect(buff.getRmsAtTime(A4_buffer.duration * 1.2)).to.be.above(0);
326
+ });
327
+
328
+ it("loops the audio when loop is set after start", async () => {
329
+ const buff = await Offline(() => {
330
+ const sampler = new Sampler({
331
+ urls: {
332
+ A4: A4_buffer
333
+ }
334
+ });
335
+ sampler.toDestination();
336
+ sampler.triggerAttack("A4");
337
+ sampler.loop = true;
338
+ }, A4_buffer.duration * 1.5);
339
+ expect(buff.getRmsAtTime(0)).to.be.above(0);
340
+ expect(buff.getRmsAtTime(A4_buffer.duration * 0.5)).to.be.above(0);
341
+ expect(buff.getRmsAtTime(A4_buffer.duration)).to.be.above(0);
342
+ expect(buff.getRmsAtTime(A4_buffer.duration * 1.2)).to.be.above(0);
343
+ });
344
+
345
+ it("starts buffers at loopStart when set to loop", async () => {
346
+ const testSample =
347
+ A4_buffer.toArray(0)[Math.floor(0.1 * getContext().sampleRate)];
348
+ const buff = await Offline(() => {
349
+ const sampler = new Sampler({
350
+ urls: {
351
+ A4: A4_buffer
352
+ }
353
+ });
354
+ sampler.loopStart = 0.1;
355
+ sampler.loop = true;
356
+ sampler.toDestination();
357
+ sampler.triggerAttack("A4");
358
+ }, 0.05);
359
+ expect(buff.toArray()[0][0]).to.equal(testSample);
360
+ });
361
+ });
362
+
269
363
  context("add samples", () => {
270
364
  it("can add a note with its midi value", async () => {
271
365
  const buffer = await Offline(() => {
@@ -10,7 +10,9 @@ import {
10
10
  Note,
11
11
  Time,
12
12
  } from "../core/type/Units.js";
13
- import { optionsFromArguments } from "../core/util/Defaults.js";
13
+ import { assert, assertRange } from "../core/util/Debug.js";
14
+ import { timeRange } from "../core/util/Decorator.js";
15
+ import { defaultArg, optionsFromArguments } from "../core/util/Defaults.js";
14
16
  import { noOp } from "../core/util/Interface.js";
15
17
  import { isArray, isNote, isNumber } from "../core/util/TypeCheck.js";
16
18
  import { Instrument, InstrumentOptions } from "../instrument/Instrument.js";
@@ -18,8 +20,6 @@ import {
18
20
  ToneBufferSource,
19
21
  ToneBufferSourceCurve,
20
22
  } from "../source/buffer/ToneBufferSource.js";
21
- import { timeRange } from "../core/util/Decorator.js";
22
- import { assert } from "../core/util/Debug.js";
23
23
 
24
24
  interface SamplesMap {
25
25
  [note: string]: ToneAudioBuffer | AudioBuffer | string;
@@ -34,6 +34,9 @@ export interface SamplerOptions extends InstrumentOptions {
34
34
  baseUrl: string;
35
35
  curve: ToneBufferSourceCurve;
36
36
  urls: SamplesMap;
37
+ loop: boolean;
38
+ loopEnd: number;
39
+ loopStart: number;
37
40
  }
38
41
 
39
42
  /**
@@ -70,6 +73,26 @@ export class Sampler extends Instrument<SamplerOptions> {
70
73
  */
71
74
  private _activeSources: Map<MidiNote, ToneBufferSource[]> = new Map();
72
75
 
76
+ /**
77
+ * The list of all provided midi notes
78
+ */
79
+ private _providedMidiNotes: MidiNote[] = [];
80
+
81
+ /**
82
+ * if the buffer should loop once its over
83
+ */
84
+ private _loop: boolean;
85
+
86
+ /**
87
+ * if 'loop' is true, the loop will start at this position
88
+ */
89
+ private _loopStart: Time;
90
+
91
+ /**
92
+ * if 'loop' is true, the loop will end at this position
93
+ */
94
+ private _loopEnd: Time;
95
+
73
96
  /**
74
97
  * The envelope applied to the beginning of the sample.
75
98
  * @min 0
@@ -144,6 +167,9 @@ export class Sampler extends Instrument<SamplerOptions> {
144
167
  this.attack = options.attack;
145
168
  this.release = options.release;
146
169
  this.curve = options.curve;
170
+ this._loop = options.loop;
171
+ this._loopStart = options.loopStart;
172
+ this._loopEnd = options.loopEnd;
147
173
 
148
174
  // invoke the callback if it's already loaded
149
175
  if (this._buffers.loaded) {
@@ -161,6 +187,9 @@ export class Sampler extends Instrument<SamplerOptions> {
161
187
  onerror: noOp,
162
188
  release: 0.1,
163
189
  urls: {},
190
+ loop: false,
191
+ loopEnd: 0,
192
+ loopStart: 0,
164
193
  });
165
194
  }
166
195
 
@@ -197,6 +226,7 @@ export class Sampler extends Instrument<SamplerOptions> {
197
226
  if (!Array.isArray(notes)) {
198
227
  notes = [notes];
199
228
  }
229
+ const offset = defaultArg(this._loopStart, 0);
200
230
  notes.forEach((note) => {
201
231
  const midiFloat = ftomf(
202
232
  new FrequencyClass(this.context, note).toFrequency()
@@ -210,6 +240,9 @@ export class Sampler extends Instrument<SamplerOptions> {
210
240
  const playbackRate = intervalToFrequencyRatio(
211
241
  difference + remainder
212
242
  );
243
+ const duration = this._loop
244
+ ? undefined
245
+ : buffer.duration / playbackRate;
213
246
  // play that note
214
247
  const source = new ToneBufferSource({
215
248
  url: buffer,
@@ -217,9 +250,12 @@ export class Sampler extends Instrument<SamplerOptions> {
217
250
  curve: this.curve,
218
251
  fadeIn: this.attack,
219
252
  fadeOut: this.release,
253
+ loop: this._loop,
254
+ loopStart: this._loopStart,
255
+ loopEnd: this._loopEnd,
220
256
  playbackRate,
221
257
  }).connect(this.output);
222
- source.start(time, 0, buffer.duration / playbackRate, velocity);
258
+ source.start(time, offset, duration, velocity);
223
259
  // add it to the active sources
224
260
  if (!isArray(this._activeSources.get(midi))) {
225
261
  this._activeSources.set(midi, []);
@@ -357,6 +393,98 @@ export class Sampler extends Instrument<SamplerOptions> {
357
393
  return this._buffers.loaded;
358
394
  }
359
395
 
396
+ /**
397
+ * Set the loop start and end. Will only loop if loop is set to true.
398
+ * @param loopStart The loop start time
399
+ * @param loopEnd The loop end time
400
+ * @example
401
+ * const sampler = new Tone.Sampler({
402
+ * urls: {
403
+ * A1: "https://tonejs.github.io/audio/berklee/guitar_chord4.mp3",
404
+ * },
405
+ * }).toDestination();
406
+ * // loop between the given points
407
+ * sampler.setLoopPoints(0.2, 0.3);
408
+ * sampler.loop = true;
409
+ */
410
+ setLoopPoints(loopStart: Time, loopEnd: Time): this {
411
+ this.loopStart = loopStart;
412
+ this.loopEnd = loopEnd;
413
+ return this;
414
+ }
415
+
416
+ /**
417
+ * If loop is true, the loop will start at this position.
418
+ */
419
+ get loopStart(): Time {
420
+ return this._loopStart;
421
+ }
422
+ set loopStart(loopStart) {
423
+ this._loopStart = loopStart;
424
+ this._providedMidiNotes.forEach((midiNote) => {
425
+ const buffer = this._buffers.get(midiNote);
426
+ if (buffer.loaded) {
427
+ assertRange(this.toSeconds(loopStart), 0, buffer.duration);
428
+ }
429
+ });
430
+ // get the current sources
431
+ this._activeSources.forEach((sourceList) => {
432
+ sourceList.forEach((source) => {
433
+ source.loopStart = loopStart;
434
+ });
435
+ });
436
+ }
437
+
438
+ /**
439
+ * If loop is true, the loop will end at this position.
440
+ */
441
+ get loopEnd(): Time {
442
+ return this._loopEnd;
443
+ }
444
+ set loopEnd(loopEnd) {
445
+ this._loopEnd = loopEnd;
446
+ this._providedMidiNotes.forEach((midiNote) => {
447
+ const buffer = this._buffers.get(midiNote);
448
+ if (buffer.loaded) {
449
+ assertRange(this.toSeconds(loopEnd), 0, buffer.duration);
450
+ }
451
+ });
452
+ // get the current sources
453
+ this._activeSources.forEach((sourceList) => {
454
+ sourceList.forEach((source) => {
455
+ source.loopEnd = loopEnd;
456
+ });
457
+ });
458
+ }
459
+
460
+
461
+ /**
462
+ * If the buffers should loop once they are over.
463
+ * @example
464
+ * const sampler = new Tone.Sampler({
465
+ * urls: {
466
+ * A4: "https://tonejs.github.io/audio/berklee/femalevoice_aa_A4.mp3",
467
+ * },
468
+ * }).toDestination();
469
+ * sampler.loop = true;
470
+ */
471
+ get loop(): boolean {
472
+ return this._loop;
473
+ }
474
+ set loop(loop) {
475
+ // if no change, do nothing
476
+ if (this._loop === loop) {
477
+ return;
478
+ }
479
+ this._loop = loop;
480
+ // set the loop of all of the sources
481
+ this._activeSources.forEach((sourceList) => {
482
+ sourceList.forEach((source) => {
483
+ source.loop = loop;
484
+ });
485
+ });
486
+ }
487
+
360
488
  /**
361
489
  * Clean up
362
490
  */
@@ -1,4 +1,5 @@
1
1
  import { expect } from "chai";
2
+
2
3
  import { BasicTests } from "../../test/helper/Basic.js";
3
4
  import { CompareToFile } from "../../test/helper/CompareToFile.js";
4
5
  import { InstrumentTest } from "../../test/helper/InstrumentTests.js";
@@ -1,8 +1,8 @@
1
1
  export * from "./AMSynth.js";
2
2
  export * from "./DuoSynth.js";
3
3
  export * from "./FMSynth.js";
4
- export * from "./MetalSynth.js";
5
4
  export * from "./MembraneSynth.js";
5
+ export * from "./MetalSynth.js";
6
6
  export * from "./MonoSynth.js";
7
7
  export * from "./NoiseSynth.js";
8
8
  export * from "./PluckSynth.js";
@@ -1,6 +1,6 @@
1
- import { connectSeries } from "../core/context/ToneAudioNode.js";
2
1
  import { Gain } from "../core/context/Gain.js";
3
2
  import { Param } from "../core/context/Param.js";
3
+ import { connectSeries } from "../core/context/ToneAudioNode.js";
4
4
  import { optionsFromArguments } from "../core/util/Defaults.js";
5
5
  import { Signal, SignalOptions } from "./Signal.js";
6
6
 
@@ -1,4 +1,5 @@
1
1
  import { expect } from "chai";
2
+
2
3
  import { BasicTests } from "../../test/helper/Basic.js";
3
4
  import { connectFrom, connectTo } from "../../test/helper/Connect.js";
4
5
  import { ConstantOutput } from "../../test/helper/ConstantOutput.js";
@@ -1,9 +1,9 @@
1
1
  import { BasicTests } from "../../test/helper/Basic.js";
2
2
  import { connectFrom, connectTo } from "../../test/helper/Connect.js";
3
3
  import { ConstantOutput } from "../../test/helper/ConstantOutput.js";
4
- import { Zero } from "./Zero.js";
5
4
  import { GainToAudio } from "./GainToAudio.js";
6
5
  import { Signal } from "./Signal.js";
6
+ import { Zero } from "./Zero.js";
7
7
 
8
8
  describe("GainToAudio", () => {
9
9
  BasicTests(GainToAudio);
@@ -1,5 +1,5 @@
1
- import { ConstantOutput } from "../../test/helper/ConstantOutput.js";
2
1
  import { BasicTests } from "../../test/helper/Basic.js";
2
+ import { ConstantOutput } from "../../test/helper/ConstantOutput.js";
3
3
  import { GreaterThan } from "./GreaterThan.js";
4
4
  import { Signal } from "./Signal.js";
5
5
 
@@ -1,10 +1,10 @@
1
+ import { Param } from "../core/context/Param.js";
1
2
  import { ToneAudioNode } from "../core/context/ToneAudioNode.js";
2
3
  import { optionsFromArguments } from "../core/util/Defaults.js";
3
- import { Subtract } from "./Subtract.js";
4
- import { Signal, SignalOptions } from "./Signal.js";
5
- import { GreaterThanZero } from "./GreaterThanZero.js";
6
4
  import { readOnly } from "../core/util/Interface.js";
7
- import { Param } from "../core/context/Param.js";
5
+ import { GreaterThanZero } from "./GreaterThanZero.js";
6
+ import { Signal, SignalOptions } from "./Signal.js";
7
+ import { Subtract } from "./Subtract.js";
8
8
 
9
9
  export type GreaterThanOptions = SignalOptions<"number">;
10
10
 
@@ -1,5 +1,5 @@
1
- import { ConstantOutput } from "../../test/helper/ConstantOutput.js";
2
1
  import { BasicTests } from "../../test/helper/Basic.js";
2
+ import { ConstantOutput } from "../../test/helper/ConstantOutput.js";
3
3
  import { GreaterThanZero } from "./GreaterThanZero.js";
4
4
  import { Signal } from "./Signal.js";
5
5
 
@@ -1,8 +1,8 @@
1
- import { SignalOperator, SignalOperatorOptions } from "./SignalOperator.js";
2
- import { Multiply } from "./Multiply.js";
3
1
  import { ToneAudioNode } from "../core/context/ToneAudioNode.js";
4
- import { WaveShaper } from "./WaveShaper.js";
5
2
  import { optionsFromArguments } from "../core/util/Defaults.js";
3
+ import { Multiply } from "./Multiply.js";
4
+ import { SignalOperator, SignalOperatorOptions } from "./SignalOperator.js";
5
+ import { WaveShaper } from "./WaveShaper.js";
6
6
 
7
7
  export type GreaterThanZeroOptions = SignalOperatorOptions;
8
8
 
@@ -1,4 +1,5 @@
1
1
  import { expect } from "chai";
2
+
2
3
  import { BasicTests } from "../../test/helper/Basic.js";
3
4
  import { connectFrom, connectTo } from "../../test/helper/Connect.js";
4
5
  // import Test from "../../test/helper/Test";
@@ -1,8 +1,8 @@
1
1
  import { Gain } from "../core/context/Gain.js";
2
2
  import { Param } from "../core/context/Param.js";
3
+ import { InputNode, OutputNode } from "../core/context/ToneAudioNode.js";
3
4
  import { optionsFromArguments } from "../core/util/Defaults.js";
4
5
  import { Signal, SignalOptions } from "./Signal.js";
5
- import { InputNode, OutputNode } from "../core/context/ToneAudioNode.js";
6
6
 
7
7
  /**
8
8
  * Multiply two incoming signals. Or, if a number is given in the constructor,
@@ -1,6 +1,6 @@
1
1
  import { BasicTests } from "../../test/helper/Basic.js";
2
- import { Pow } from "./Pow.js";
3
2
  import { ConstantOutput } from "../../test/helper/ConstantOutput.js";
3
+ import { Pow } from "./Pow.js";
4
4
  import { Signal } from "./Signal.js";
5
5
 
6
6
  describe("Pow", () => {
@@ -1,7 +1,7 @@
1
- import { WaveShaper, WaveShaperMappingFn } from "./WaveShaper.js";
1
+ import { ToneAudioNodeOptions } from "../core/context/ToneAudioNode.js";
2
2
  import { optionsFromArguments } from "../core/util/Defaults.js";
3
3
  import { SignalOperator } from "./SignalOperator.js";
4
- import { ToneAudioNodeOptions } from "../core/context/ToneAudioNode.js";
4
+ import { WaveShaper, WaveShaperMappingFn } from "./WaveShaper.js";
5
5
 
6
6
  export interface PowOptions extends ToneAudioNodeOptions {
7
7
  value: number;
@@ -1,4 +1,5 @@
1
1
  import { expect } from "chai";
2
+
2
3
  import { BasicTests } from "../../test/helper/Basic.js";
3
4
  import { connectFrom, connectTo } from "../../test/helper/Connect.js";
4
5
  import { ConstantOutput } from "../../test/helper/ConstantOutput.js";
@@ -1,8 +1,9 @@
1
+ import { expect } from "chai";
2
+
3
+ import { BasicTests } from "../../test/helper/Basic.js";
1
4
  import { ConstantOutput } from "../../test/helper/ConstantOutput.js";
2
5
  import { ScaleExp } from "./ScaleExp.js";
3
- import { BasicTests } from "../../test/helper/Basic.js";
4
6
  import { Signal } from "./Signal.js";
5
- import { expect } from "chai";
6
7
 
7
8
  describe("ScaleExp", () => {
8
9
  BasicTests(ScaleExp);
@@ -1,7 +1,7 @@
1
- import { Scale, ScaleOptions } from "./Scale.js";
2
1
  import { Positive } from "../core/type/Units.js";
3
2
  import { optionsFromArguments } from "../core/util/Defaults.js";
4
3
  import { Pow } from "./Pow.js";
4
+ import { Scale, ScaleOptions } from "./Scale.js";
5
5
 
6
6
  export interface ScaleExpOptions extends ScaleOptions {
7
7
  exponent: Positive;
@@ -1,10 +1,11 @@
1
1
  import { expect } from "chai";
2
+
2
3
  import { BasicTests } from "../../test/helper/Basic.js";
3
4
  import { connectFrom, connectTo } from "../../test/helper/Connect.js";
4
5
  import { ConstantOutput } from "../../test/helper/ConstantOutput.js";
5
6
  import { Offline } from "../../test/helper/Offline.js";
6
- import { Decibels, Frequency, Time } from "../core/type/Units.js";
7
7
  import { Gain } from "../core/context/Gain.js";
8
+ import { Decibels, Frequency, Time } from "../core/type/Units.js";
8
9
  import { Signal } from "./Signal.js";
9
10
 
10
11
  describe("Signal", () => {
@@ -1,9 +1,9 @@
1
- import { optionsFromArguments } from "../core/util/Defaults.js";
2
1
  import {
3
2
  InputNode,
4
3
  ToneAudioNode,
5
4
  ToneAudioNodeOptions,
6
5
  } from "../core/context/ToneAudioNode.js";
6
+ import { optionsFromArguments } from "../core/util/Defaults.js";
7
7
  import { connectSignal } from "./Signal.js";
8
8
 
9
9
  export type SignalOperatorOptions = ToneAudioNodeOptions;
@@ -1,6 +1,6 @@
1
- import { connectSeries } from "../core/context/ToneAudioNode.js";
2
1
  import { Gain } from "../core/context/Gain.js";
3
2
  import { Param } from "../core/context/Param.js";
3
+ import { connectSeries } from "../core/context/ToneAudioNode.js";
4
4
  import { optionsFromArguments } from "../core/util/Defaults.js";
5
5
  import { Negate } from "../signal/Negate.js";
6
6
  import { Signal, SignalOptions } from "../signal/Signal.js";
@@ -1,10 +1,12 @@
1
- import { SyncedSignal } from "./SyncedSignal.js";
2
- import { Offline } from "../../test/helper/Offline.js";
3
- import { expect } from "chai";
4
- import { dbToGain } from "../core/type/Conversions.js";
5
1
  import "../core/clock/Transport.js";
6
2
  import "../core/context/Destination.js";
3
+
4
+ import { expect } from "chai";
5
+
7
6
  import { BasicTests } from "../../test/helper/Basic.js";
7
+ import { Offline } from "../../test/helper/Offline.js";
8
+ import { dbToGain } from "../core/type/Conversions.js";
9
+ import { SyncedSignal } from "./SyncedSignal.js";
8
10
 
9
11
  describe("SyncedSignal", () => {
10
12
  BasicTests(SyncedSignal);
@@ -1,4 +1,6 @@
1
- import { Signal, SignalOptions } from "./Signal.js";
1
+ import type { TransportClass } from "../core/clock/Transport.js";
2
+ import { OutputNode } from "../core/context/ToneAudioNode.js";
3
+ import { TransportTimeClass } from "../core/type/TransportTime.js";
2
4
  import {
3
5
  NormalRange,
4
6
  Seconds,
@@ -8,10 +10,8 @@ import {
8
10
  UnitName,
9
11
  } from "../core/type/Units.js";
10
12
  import { optionsFromArguments } from "../core/util/Defaults.js";
11
- import { TransportTimeClass } from "../core/type/TransportTime.js";
13
+ import { Signal, SignalOptions } from "./Signal.js";
12
14
  import { ToneConstantSource } from "./ToneConstantSource.js";
13
- import { OutputNode } from "../core/context/ToneAudioNode.js";
14
- import type { TransportClass } from "../core/clock/Transport.js";
15
15
 
16
16
  /**
17
17
  * Adds the ability to synchronize the signal to the {@link TransportClass}
@@ -1,8 +1,9 @@
1
1
  import { expect } from "chai";
2
+
2
3
  import { BasicTests } from "../../test/helper/Basic.js";
3
4
  import { Offline, whenBetween } from "../../test/helper/Offline.js";
4
- import { ToneConstantSource } from "./ToneConstantSource.js";
5
5
  import { Context } from "../core/context/Context.js";
6
+ import { ToneConstantSource } from "./ToneConstantSource.js";
6
7
 
7
8
  describe("ToneConstantSource", () => {
8
9
  BasicTests(ToneConstantSource);