1 |
- {"version":3,"sources":["webpack://Tone/webpack/universalModuleDefinition","webpack://Tone/webpack/bootstrap","webpack://Tone/./node_modules/automation-events/build/es5/bundle.js","webpack://Tone/./node_modules/@babel/runtime/helpers/slicedToArray.js","webpack://Tone/./node_modules/@babel/runtime/helpers/arrayWithHoles.js","webpack://Tone/./node_modules/@babel/runtime/helpers/iterableToArrayLimit.js","webpack://Tone/./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js","webpack://Tone/./node_modules/@babel/runtime/helpers/arrayLikeToArray.js","webpack://Tone/./node_modules/@babel/runtime/helpers/nonIterableRest.js","webpack://Tone/./node_modules/@babel/runtime/helpers/classCallCheck.js","webpack://Tone/./node_modules/@babel/runtime/helpers/createClass.js","webpack://Tone/./Tone/version.ts","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/abort-error.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/globals.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/is-constructible.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/split-import-statements.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/add-audio-worklet-module.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/get-value-for-key.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/pick-element-from-set.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/delete-passive-input-connection-to-audio-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/get-event-listeners-of-audio-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/set-internal-state-to-active.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/guards/audio-worklet-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/set-internal-state-to-passive.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/set-internal-state-to-passive-when-necessary.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/analyser-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/is-owned-by-context.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/test-audio-buffer-copy-channel-methods-out-of-bounds-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/index-size-error.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/wrap-audio-buffer-get-channel-data-method.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/audio-buffer-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/constants.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/is-active-audio-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/audio-buffer-source-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/get-audio-node-connections.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/get-audio-param-connections.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/deactivate-active-audio-node-input-connections.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/guards/audio-buffer-source-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/guards/biquad-filter-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/guards/constant-source-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/guards/gain-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/guards/oscillator-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/guards/stereo-panner-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/deactivate-audio-graph.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/is-valid-latency-hint.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/guards/audio-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/guards/audio-node-output-connection.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/insert-element-in-set.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/add-active-input-connection-to-audio-param.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/add-passive-input-connection-to-audio-param.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/guards/native-audio-node-faker.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/connect-native-audio-node-to-native-audio-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/delete-active-input-connection.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/delete-event-listeners-of-audio-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/delete-passive-input-connection-to-audio-param.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/disconnect-native-audio-node-from-native-audio-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/get-native-audio-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/get-native-audio-param.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/is-part-of-a-cycle.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/is-passive-audio-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/test-audio-node-disconnect-method-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/visit-each-audio-node-once.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/guards/native-audio-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/audio-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/delete-active-input-connection-to-audio-param.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/read-only-map.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/audio-worklet-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/copy-from-channel.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/copy-to-channel.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/create-nested-arrays.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/audio-worklet-node-renderer-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/get-audio-worklet-processor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/biquad-filter-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/channel-merger-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/channel-splitter-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/constant-source-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/convolver-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/delay-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/disconnect-multiple-outputs.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/dynamics-compressor-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/gain-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/invalid-state-error.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/invalid-access-error.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/iir-filter-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/filter-buffer.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/media-stream-audio-destination-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/test-promise-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/minimal-offline-audio-context-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/assign-native-audio-node-option.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/assign-native-audio-node-options.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/test-analyser-node-get-float-time-domain-data-method-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/assign-native-audio-node-audio-param-value.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/wrap-audio-scheduled-source-node-start-method-negative-parameters.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/wrap-audio-scheduled-source-node-stop-method-negative-parameters.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/compute-buffer-size.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/create-audio-worklet-processor-promise.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/clone-audio-worklet-node-options.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-biquad-filter-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-channel-splitter-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/wrap-channel-splitter-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/intercept-connections.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-delay-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-gain-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-iir-filter-node-faker-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-script-processor-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/not-supported-error.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/offline-audio-context-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/oscillator-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/panner-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/periodic-wave-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/stereo-panner-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/unknown-error.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/wave-shaper-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/is-dc-curve.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/overwrite-accessors.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/set-value-at-time-until-possible.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/test-audio-scheduled-source-node-start-method-negative-parameters-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/test-audio-scheduled-source-node-stop-method-consecutive-calls-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/test-audio-scheduled-source-node-stop-method-negative-parameters-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/test-dom-exception-constructor-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/test-transferables-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/wrap-audio-scheduled-source-node-stop-method-consecutive-calls.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/wrap-event-listener.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/module.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/add-active-input-connection-to-audio-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/add-passive-input-connection-to-audio-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/delete-active-input-connection-to-audio-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/get-audio-node-tail-time.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/cache-test-result.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/window.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-analyser-node-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/wrap-analyser-node-get-float-time-domain-data-method.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/get-audio-node-renderer.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/render-inputs-of-audio-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/analyser-node-renderer-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/get-native-context.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-offline-audio-context-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/is-native-offline-audio-context.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/event-target-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-audio-context-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/is-native-audio-context.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/is-native-audio-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/is-native-audio-param.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/wrap-audio-node-disconnect-method.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/add-audio-node-connections.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/add-connection-to-audio-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/increment-cycle-counter-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/decrement-cycle-counter.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/detect-cycles.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/guards/delay-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-audio-buffer-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/convert-number-to-unsigned-long.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/wrap-audio-buffer-copy-channel-methods.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/wrap-audio-buffer-copy-channel-methods-out-of-bounds.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/test-audio-buffer-constructor-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/add-silent-connection.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/render-inputs-of-audio-param.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/connect-audio-param.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-audio-buffer-source-node-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/wrap-audio-buffer-source-node-start-method-consecutive-calls.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/test-audio-buffer-source-node-start-method-consecutive-calls-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/test-audio-buffer-source-node-start-method-offset-clamping-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/test-audio-buffer-source-node-stop-method-nullified-buffer-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/wrap-audio-buffer-source-node-start-method-offset-clamping.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/wrap-audio-buffer-source-node-stop-method-nullified-buffer.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/render-automation.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/get-audio-param-renderer.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/audio-buffer-source-node-renderer-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/audio-param-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/add-audio-param-connections.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/audio-param-renderer.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/audio-destination-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/audio-destination-node-renderer-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-audio-destination-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/biquad-filter-node-renderer-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/set-audio-node-tail-time.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/monitor-connections.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/wrap-channel-merger-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-channel-merger-node-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/channel-merger-node-renderer-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/channel-splitter-node-renderer-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/sanitize-channel-splitter-options.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-constant-source-node-faker-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-constant-source-node-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/constant-source-node-renderer-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-convolver-node-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/convolver-node-renderer-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/delay-node-renderer-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-dynamics-compressor-node-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/dynamics-compressor-node-renderer-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/gain-node-renderer-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/render-native-offline-audio-context.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/test-offline-audio-context-current-time-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/iir-filter-node-renderer-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-iir-filter-node-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/wrap-iir-filter-node-get-frequency-response-method.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/audio-listener-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/minimal-base-audio-context-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-oscillator-node-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/oscillator-node-renderer-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/connected-native-audio-buffer-source-node-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-wave-shaper-node-faker-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-wave-shaper-node-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-panner-node-faker-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-panner-node-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/panner-node-renderer-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-periodic-wave-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/sanitize-periodic-wave-options.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-stereo-panner-node-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-stereo-panner-node-faker-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/stereo-panner-node-renderer-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/wave-shaper-node-renderer-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/is-secure-context.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/expose-current-frame-and-current-time.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/get-or-create-backup-offline-audio-context.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-audio-worklet-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/evaluate-source.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/fetch-source.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/test-audio-worklet-processor-post-message-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/is-native-context.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/decode-audio-data.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/detach-array-buffer.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/data-clone-error.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/encoding-error.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/base-audio-context-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/media-element-audio-source-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-media-element-audio-source-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-media-stream-audio-destination-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/media-stream-audio-source-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-media-stream-audio-source-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/media-stream-track-audio-source-node-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-media-stream-track-audio-source-node-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/audio-context-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/get-unrendered-audio-worklet-nodes.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/add-unrendered-audio-worklet-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/connect-multiple-outputs.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/delete-unrendered-audio-worklet-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/get-active-audio-worklet-node-inputs.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-audio-worklet-node-faker-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/create-audio-worklet-processor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/native-audio-worklet-node-factory.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/test-clonability-of-audio-worklet-node-options.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/get-backup-offline-audio-context.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/set-active-audio-worklet-node-inputs.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/helpers/sanitize-audio-worklet-node-options.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/minimal-audio-context-constructor.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/create-native-offline-audio-context.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/start-rendering.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/is-any-audio-context.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/is-any-audio-node.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/is-any-audio-param.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/is-any-offline-audio-context.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/is-supported-promise.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/test-audio-buffer-copy-channel-methods-subarray-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/test-audio-context-close-method-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/test-audio-context-decode-audio-data-method-type-error-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/test-audio-context-options-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/test-audio-node-connect-method-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/test-audio-worklet-processor-no-outputs-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/test-channel-merger-node-channel-count-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/test-constant-source-node-accurate-scheduling-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/test-convolver-node-buffer-reassignability-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/test-convolver-node-channel-count-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/test-is-secure-context-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/test-media-stream-audio-source-node-media-stream-without-audio-track-support.js","webpack://Tone/./node_modules/standardized-audio-context/build/es2019/factories/test-stereo-panner-node-default-value-support.js","webpack://Tone/./Tone/core/util/Debug.ts","webpack://Tone/./Tone/core/util/TypeCheck.ts","webpack://Tone/./Tone/core/context/AudioContext.ts","webpack://Tone/./node_modules/tslib/tslib.es6.js","webpack://Tone/./Tone/core/clock/Ticker.ts","webpack://Tone/./Tone/core/util/AdvancedTypeCheck.ts","webpack://Tone/./Tone/core/util/Defaults.ts","webpack://Tone/./Tone/core/Tone.ts","webpack://Tone/./Tone/core/util/Math.ts","webpack://Tone/./Tone/core/util/Timeline.ts","webpack://Tone/./Tone/core/context/ContextInitialization.ts","webpack://Tone/./Tone/core/util/Emitter.ts","webpack://Tone/./Tone/core/context/BaseContext.ts","webpack://Tone/./Tone/core/context/Context.ts","webpack://Tone/./Tone/core/util/Interface.ts","webpack://Tone/./Tone/core/context/ToneAudioBuffer.ts","webpack://Tone/./Tone/core/context/OfflineContext.ts","webpack://Tone/./Tone/core/Global.ts","webpack://Tone/./Tone/core/context/DummyContext.ts","webpack://Tone/./Tone/core/type/Conversions.ts","webpack://Tone/./Tone/core/type/TimeBase.ts","webpack://Tone/./Tone/core/type/Time.ts","webpack://Tone/./Tone/core/type/Frequency.ts","webpack://Tone/./Tone/core/type/TransportTime.ts","webpack://Tone/./Tone/core/context/ToneWithContext.ts","webpack://Tone/./Tone/core/util/StateTimeline.ts","webpack://Tone/./Tone/core/context/Param.ts","webpack://Tone/./Tone/core/context/ToneAudioNode.ts","webpack://Tone/./Tone/core/context/Gain.ts","webpack://Tone/./Tone/source/OneShotSource.ts","webpack://Tone/./Tone/signal/ToneConstantSource.ts","webpack://Tone/./Tone/signal/Signal.ts","webpack://Tone/./Tone/core/clock/TickParam.ts","webpack://Tone/./Tone/core/clock/TickSignal.ts","webpack://Tone/./Tone/core/clock/TickSource.ts","webpack://Tone/./Tone/core/clock/Clock.ts","webpack://Tone/./Tone/core/context/Delay.ts","webpack://Tone/./Tone/core/context/Offline.ts","webpack://Tone/./Tone/core/context/ToneAudioBuffers.ts","webpack://Tone/./Tone/core/type/Midi.ts","webpack://Tone/./Tone/core/type/Ticks.ts","webpack://Tone/./Tone/core/util/Draw.ts","webpack://Tone/./Tone/core/util/IntervalTimeline.ts","webpack://Tone/./Tone/component/channel/Volume.ts","webpack://Tone/./Tone/core/context/Destination.ts","webpack://Tone/./Tone/core/util/TimelineValue.ts","webpack://Tone/./Tone/core/clock/TransportEvent.ts","webpack://Tone/./Tone/core/clock/TransportRepeatEvent.ts","webpack://Tone/./Tone/core/clock/Transport.ts","webpack://Tone/./Tone/source/Source.ts","webpack://Tone/./Tone/source/buffer/ToneBufferSource.ts","webpack://Tone/./Tone/source/Noise.ts","webpack://Tone/./Tone/source/UserMedia.ts","webpack://Tone/./Tone/source/oscillator/OscillatorInterface.ts","webpack://Tone/./Tone/source/oscillator/ToneOscillatorNode.ts","webpack://Tone/./Tone/source/oscillator/Oscillator.ts","webpack://Tone/./Tone/signal/SignalOperator.ts","webpack://Tone/./Tone/signal/WaveShaper.ts","webpack://Tone/./Tone/signal/AudioToGain.ts","webpack://Tone/./Tone/signal/Multiply.ts","webpack://Tone/./Tone/source/oscillator/AMOscillator.ts","webpack://Tone/./Tone/source/oscillator/FMOscillator.ts","webpack://Tone/./Tone/source/oscillator/PulseOscillator.ts","webpack://Tone/./Tone/source/oscillator/FatOscillator.ts","webpack://Tone/./Tone/source/oscillator/PWMOscillator.ts","webpack://Tone/./Tone/source/oscillator/OmniOscillator.ts","webpack://Tone/./Tone/signal/Add.ts","webpack://Tone/./Tone/signal/Scale.ts","webpack://Tone/./Tone/signal/Zero.ts","webpack://Tone/./Tone/source/oscillator/LFO.ts","webpack://Tone/./Tone/core/util/Decorator.ts","webpack://Tone/./Tone/source/buffer/Player.ts","webpack://Tone/./Tone/source/buffer/Players.ts","webpack://Tone/./Tone/source/buffer/GrainPlayer.ts","webpack://Tone/./Tone/signal/Abs.ts","webpack://Tone/./Tone/signal/GainToAudio.ts","webpack://Tone/./Tone/signal/Negate.ts","webpack://Tone/./Tone/signal/Subtract.ts","webpack://Tone/./Tone/signal/GreaterThanZero.ts","webpack://Tone/./Tone/signal/GreaterThan.ts","webpack://Tone/./Tone/signal/Pow.ts","webpack://Tone/./Tone/signal/ScaleExp.ts","webpack://Tone/./Tone/signal/SyncedSignal.ts","webpack://Tone/./Tone/component/envelope/Envelope.ts","webpack://Tone/./Tone/instrument/Instrument.ts","webpack://Tone/./Tone/instrument/Monophonic.ts","webpack://Tone/./Tone/component/envelope/AmplitudeEnvelope.ts","webpack://Tone/./Tone/instrument/Synth.ts","webpack://Tone/./Tone/instrument/ModulationSynth.ts","webpack://Tone/./Tone/instrument/AMSynth.ts","webpack://Tone/./Tone/component/filter/BiquadFilter.ts","webpack://Tone/./Tone/component/filter/Filter.ts","webpack://Tone/./Tone/component/envelope/FrequencyEnvelope.ts","webpack://Tone/./Tone/instrument/MonoSynth.ts","webpack://Tone/./Tone/instrument/DuoSynth.ts","webpack://Tone/./Tone/instrument/FMSynth.ts","webpack://Tone/./Tone/instrument/MetalSynth.ts","webpack://Tone/./Tone/instrument/MembraneSynth.ts","webpack://Tone/./Tone/instrument/NoiseSynth.ts","webpack://Tone/./Tone/core/worklet/WorkletGlobalScope.ts","webpack://Tone/./Tone/core/worklet/ToneAudioWorklet.ts","webpack://Tone/./Tone/core/worklet/ToneAudioWorkletProcessor.worklet.ts","webpack://Tone/./Tone/core/worklet/SingleIOProcessor.worklet.ts","webpack://Tone/./Tone/core/worklet/DelayLine.worklet.ts","webpack://Tone/./Tone/component/filter/FeedbackCombFilter.worklet.ts","webpack://Tone/./Tone/component/filter/FeedbackCombFilter.ts","webpack://Tone/./Tone/component/filter/OnePoleFilter.ts","webpack://Tone/./Tone/component/filter/LowpassCombFilter.ts","webpack://Tone/./Tone/instrument/PluckSynth.ts","webpack://Tone/./Tone/instrument/PolySynth.ts","webpack://Tone/./Tone/instrument/Sampler.ts","webpack://Tone/./Tone/event/ToneEvent.ts","webpack://Tone/./Tone/event/Loop.ts","webpack://Tone/./Tone/event/Part.ts","webpack://Tone/./Tone/event/PatternGenerator.ts","webpack://Tone/./Tone/event/Pattern.ts","webpack://Tone/./Tone/event/Sequence.ts","webpack://Tone/./Tone/component/channel/CrossFade.ts","webpack://Tone/./Tone/effect/Effect.ts","webpack://Tone/./Tone/effect/LFOEffect.ts","webpack://Tone/./Tone/effect/AutoFilter.ts","webpack://Tone/./Tone/component/channel/Panner.ts","webpack://Tone/./Tone/effect/AutoPanner.ts","webpack://Tone/./Tone/component/analysis/Follower.ts","webpack://Tone/./Tone/effect/AutoWah.ts","webpack://Tone/./Tone/effect/BitCrusher.worklet.ts","webpack://Tone/./Tone/effect/BitCrusher.ts","webpack://Tone/./Tone/effect/Chebyshev.ts","webpack://Tone/./Tone/component/channel/Split.ts","webpack://Tone/./Tone/component/channel/Merge.ts","webpack://Tone/./Tone/effect/StereoEffect.ts","webpack://Tone/./Tone/effect/StereoFeedbackEffect.ts","webpack://Tone/./Tone/effect/Chorus.ts","webpack://Tone/./Tone/effect/Distortion.ts","webpack://Tone/./Tone/effect/FeedbackEffect.ts","webpack://Tone/./Tone/effect/FeedbackDelay.ts","webpack://Tone/./Tone/component/filter/PhaseShiftAllpass.ts","webpack://Tone/./Tone/effect/FrequencyShifter.ts","webpack://Tone/./Tone/effect/Freeverb.ts","webpack://Tone/./Tone/effect/JCReverb.ts","webpack://Tone/./Tone/effect/StereoXFeedbackEffect.ts","webpack://Tone/./Tone/effect/PingPongDelay.ts","webpack://Tone/./Tone/effect/PitchShift.ts","webpack://Tone/./Tone/effect/Phaser.ts","webpack://Tone/./Tone/effect/Reverb.ts","webpack://Tone/./Tone/component/channel/MidSideSplit.ts","webpack://Tone/./Tone/component/channel/MidSideMerge.ts","webpack://Tone/./Tone/effect/MidSideEffect.ts","webpack://Tone/./Tone/effect/StereoWidener.ts","webpack://Tone/./Tone/effect/Tremolo.ts","webpack://Tone/./Tone/effect/Vibrato.ts","webpack://Tone/./Tone/component/analysis/Analyser.ts","webpack://Tone/./Tone/component/analysis/MeterBase.ts","webpack://Tone/./Tone/component/analysis/Meter.ts","webpack://Tone/./Tone/component/analysis/FFT.ts","webpack://Tone/./Tone/component/analysis/DCMeter.ts","webpack://Tone/./Tone/component/analysis/Waveform.ts","webpack://Tone/./Tone/component/channel/Solo.ts","webpack://Tone/./Tone/component/channel/PanVol.ts","webpack://Tone/./Tone/component/channel/Channel.ts","webpack://Tone/./Tone/component/channel/Mono.ts","webpack://Tone/./Tone/component/channel/MultibandSplit.ts","webpack://Tone/./Tone/core/context/Listener.ts","webpack://Tone/./Tone/component/channel/Panner3D.ts","webpack://Tone/./Tone/component/channel/Recorder.ts","webpack://Tone/./Tone/component/dynamics/Compressor.ts","webpack://Tone/./Tone/component/dynamics/Gate.ts","webpack://Tone/./Tone/component/dynamics/Limiter.ts","webpack://Tone/./Tone/component/dynamics/MidSideCompressor.ts","webpack://Tone/./Tone/component/dynamics/MultibandCompressor.ts","webpack://Tone/./Tone/component/filter/EQ3.ts","webpack://Tone/./Tone/component/filter/Convolver.ts","webpack://Tone/./Tone/index.ts"],"names":["root","factory","exports","module","define","amd","self","this","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","_slicedToArray","_classCallCheck","_createClass","_interopDefaultLegacy","e","_slicedToArray__default","_classCallCheck__default","_createClass__default","createExtendedExponentialRampToValueAutomationEvent","endTime","insertTime","type","createExtendedLinearRampToValueAutomationEvent","createSetValueAutomationEvent","startTime","createSetValueCurveAutomationEvent","values","duration","getTargetValueAtTime","time","valueAtStartTime","_ref","target","timeConstant","Math","exp","isExponentialRampToValueAutomationEvent","automationEvent","isLinearRampToValueAutomationEvent","isAnyRampToValueAutomationEvent","isSetValueAutomationEvent","isSetValueCurveAutomationEvent","getValueOfAutomationEventAtIndexAtTime","automationEvents","index","defaultValue","undefined","length","getEndTimeAndValueOfPreviousAutomationEvent","currentAutomationEvent","nextAutomationEvent","isCancelAndHoldAutomationEvent","isCancelScheduledValuesAutomationEvent","getEventTime","cancelTime","getExponentialRampValueAtTime","pow","getLinearRampValueAtTime","getValueCurveValueAtTime","theoreticIndex","lowerIndex","floor","upperIndex","ceil","interpolateValue","isSetTargetAutomationEvent","AutomationEventList","_automationEvents","_currenTime","_defaultValue","iterator","eventTime","findIndex","removedAutomationEvent","slice","lastAutomationEvent","Error","startValue","truncatedAutomationEvent","push","getValue","Float32Array","_index","previousAutomationEvent","persistentAutomationEvent","splice","remainingAutomationEvents","firstRemainingAutomationEvent","unshift","_getEndTimeAndValueOf","_getEndTimeAndValueOf2","_getEndTimeAndValueOf3","_getEndTimeAndValueOf4","_startTime","_value","createCancelAndHoldAutomationEvent","createCancelScheduledValuesAutomationEvent","createExponentialRampToValueAutomationEvent","createLinearRampToValueAutomationEvent","createSetTargetAutomationEvent","arrayWithHoles","iterableToArrayLimit","unsupportedIterableToArray","nonIterableRest","arr","Array","isArray","_arr","_n","_d","_e","_s","_i","next","done","err","arrayLikeToArray","minLen","toString","constructor","from","test","len","arr2","TypeError","instance","Constructor","_defineProperties","props","descriptor","configurable","writable","protoProps","staticProps","version","ACTIVE_AUDIO_NODE_STORE","WeakSet","AUDIO_NODE_CONNECTIONS_STORE","WeakMap","AUDIO_NODE_STORE","AUDIO_PARAM_CONNECTIONS_STORE","AUDIO_PARAM_STORE","CONTEXT_STORE","EVENT_LISTENERS","CYCLE_COUNTERS","NODE_NAME_TO_PROCESSOR_CONSTRUCTOR_MAPS","NODE_TO_PROCESSOR_MAPS","handler","construct","IMPORT_STATEMENT_REGEX","splitImportStatements","source","url","importStatements","sourceWithoutImportStatements","replace","result","match","unresolvedUrl","importStatementWithResolvedUrl","URL","join","verifyParameterDescriptors","parameterDescriptors","verifyProcessorCtor","processorCtor","constructible","Proxy","isConstructible","map","pickElementFromSet","set","predicate","matchingElements","filter","matchingElement","delete","deletePassiveInputConnectionToAudioNode","passiveInputs","output","input","passiveInputConnections","matchingConnection","passiveInputConnection","size","audioNode","setInternalStateToActive","has","add","forEach","eventListener","isAudioWorkletNode","setInternalStateToPassive","setInternalStateToPassiveWhenNecessary","activeInputs","every","connections","DEFAULT_OPTIONS","channelCount","channelCountMode","channelInterpretation","fftSize","maxDecibels","minDecibels","smoothingTimeConstant","isOwnedByContext","nativeAudioNode","nativeContext","context","nativeAudioBuffer","copyToChannel","DOMException","wrapAudioBufferGetChannelDataMethod","audioBuffer","getChannelData","channel","code","numberOfChannels","MOST_NEGATIVE_SINGLE_FLOAT","MOST_POSITIVE_SINGLE_FLOAT","buffer","loop","loopEnd","loopStart","playbackRate","getAudioParamConnections","audioParam","deactivateActiveAudioNodeInputConnections","trace","includes","audioParams","isAudioBufferSourceNode","parameters","isBiquadFilterNode","Q","detune","frequency","gain","isConstantSourceNode","offset","isGainNode","isOscillatorNode","isStereoPannerNode","pan","audioParamConnections","deactivateAudioGraph","destination","isValidLatencyHint","latencyHint","isAudioNode","audioNodeOrAudioParam","isAudioNodeOutputConnection","outputConnection","element","ignoreDuplicates","lmnt","addActiveInputConnectionToAudioParam","activeInputConnection","addPassiveInputConnectionToAudioParam","Set","isNativeAudioNodeFaker","nativeAudioNodeOrNativeAudioNodeFaker","nativeSourceAudioNode","nativeDestinationAudioNode","fakeNativeDestinationAudioNode","inputs","connect","deleteActiveInputConnection","activeInputConnections","deleteEventListenerOfAudioNode","deletePassiveInputConnectionToAudioParam","disconnect","testAudioNodeDisconnectMethodSupport","nativeAudioContext","Promise","resolve","analyzer","createScriptProcessor","dummy","createGain","ones","createBuffer","channelData","createBufferSource","onaudioprocess","event","chnnlDt","inputBuffer","some","sample","stop","start","visitEachAudioNodeOnce","cycles","visitor","counts","Map","cycle","count","nativeAudioNodeOrAudioParam","addConnectionToAudioParamOfAudioContext","isOffline","outputs","eventListeners","isActive","nativeAudioParam","partialConnection","deleteActiveInputConnectionToAudioParam","deleteInputsOfAudioNode","listener","deleteInputConnectionOfAudioNode","deleteInputsOfAudioParam","deleteInputConnectionOfAudioParam","ReadOnlyMap","_map","entries","callback","thisArg","keys","numberOfInputs","numberOfOutputs","parameterData","processorOptions","copyFromChannel","parent","channelNumber","bufferOffset","byteLength","slicedInput","BYTES_PER_ELEMENT","createNestedArrays","x","y","arrays","array","j","processBuffer","async","proxy","renderedBuffer","nativeOfflineAudioContext","options","outputChannelCount","processorConstructor","exposeCurrentFrameAndCurrentTime","numberOfInputChannels","numberOfOutputChannels","reduce","sum","processedBuffer","sampleRate","audioNodeConnections","audioWorkletProcessor","nodeToProcessorMap","nativeAudioWorkletNode","getAudioWorkletProcessor","prmtrs","k","potentiallyEmptyInputs","activeSourceFlag","process","outputChannelSplitterNodeOutput","error","dispatchEvent","ErrorEvent","colno","filename","lineno","message","disableNormalization","delayTime","maxDelayTime","getOutputAudioNodeAtIndex","createIndexSizeError","outputAudioNodes","outputAudioNode","attack","knee","ratio","release","threshold","filterBuffer","feedback","feedbackLength","feedforward","feedforwardLength","minLength","xBuffer","yBuffer","bufferIndex","bufferLength","inputLength","uint32Array","Uint32Array","promise","decodeAudioData","catch","assignNativeAudioNodeOption","option","assignNativeAudioNodeOptions","testAnalyserNodeGetFloatTimeDomainDataMethodSupport","nativeAnalyserNode","getFloatTimeDomainData","assignNativeAudioNodeAudioParamValue","wrapAudioScheduledSourceNodeStartMethodNegativeParameters","nativeAudioScheduledSourceNode","when","RangeError","wrapAudioScheduledSourceNodeStopMethodNegativeParameters","computeBufferSize","baseLatency","max","min","round","log2","createAudioWorkletProcessorPromise","audioWorkletNodeOptions","reject","port1","port2","MessageChannel","onmessage","data","close","onmessageerror","postMessage","cloneAudioWorkletNodeOptions","nativeBiquadFilterNode","createBiquadFilter","nativeChannelSplitterNode","createChannelSplitter","channelSplitterNode","wrapChannelSplitterNode","interceptConnections","original","interceptor","nativeDelayNode","createDelay","nativeGainNode","divide","a","b","denominator","evaluatePolynomial","coefficient","z","bufferSize","periodicWave","coneInnerAngle","coneOuterAngle","coneOuterGain","distanceModel","maxDistance","orientationX","orientationY","orientationZ","panningModel","positionX","positionY","positionZ","refDistance","rolloffFactor","curve","oversample","createGetter","createSetter","getPrototypeOf","getOwnPropertyDescriptor","setValueAtTime","nativeAudioBufferSourceNode","createOscillator","testDomExceptionConstructorSupport","testTransferablesSupport","arrayBuffer","ArrayBuffer","disconnectGainNode","removeEventListener","addEventListener","isStopped","defineProperties","currentTarget","handleEvent","insertElementInSet","createAddPassiveInputConnectionToAudioNode","createDeleteActiveInputConnectionToAudioNode","audioNodeTailTimeStore","_a","createGetAudioNodeTailTime","ongoingTests","testResults","tester","cachedTestResult","ongoingTest","synchronousTestResult","then","finalTestResult","window","cacheTestResult","createAnalyser","byteTimeDomainData","Uint8Array","getByteTimeDomainData","wrapAnalyserNodeGetFloatTimeDomainDataMethod","getAudioNodeConnections","renderer","getAudioNodeRenderer","isPartOfACycle","nextTrace","all","audioNodeRenderer","renderedNativeAudioNode","render","allRenderingPromises","renderingPromises","createRenderInputsOfAudioNode","createAnalyserNodeRenderer","createNativeAnalyserNode","getNativeAudioNode","renderInputsOfAudioNode","renderedNativeAnalyserNodes","renderedNativeAnalyserNode","createAnalyserNode","contextStore","OfflineAudioContext","webkitOfflineAudioContext","createNativeOfflineAudioContextConstructor","nativeOfflineAudioContextConstructor","anything","wrapEventListener","_nativeEventTarget","_listeners","wrappedEventListener","AudioContext","webkitAudioContext","createNativeAudioContextConstructor","nativeAudioContextConstructor","AudioNode","createIsNativeAudioNode","AudioParam","createIsNativeAudioParam","addAudioNodeConnections","addConnectionToAudioNode","createIncrementCycleCounter","createInvalidAccessError","createNotSupportedError","decrementCycleCounter","detectCycles","eventTargetConstructor","getNativeContext","isNativeAudioContext","isNativeAudioNode","isNativeAudioParam","isNativeOfflineAudioContext","super","_context","_nativeAudioNode","returnValue","connectionsToDestination","connection","destinationOrOutput","apply","clear","filteredConnections","wrapAudioNodeDisconnectMethod","state","isPassive","destinations","audioNodeConnectionsOfSource","deleteAnyConnection","deleteConnectionAtOutput","deleteConnectionToDestination","createAudioNodeConstructor","audioNodeConnectionsStore","addActiveInputConnectionToAudioNode","addPassiveInputConnectionToAudioNode","connectNativeAudioNodeToNativeAudioNode","deleteActiveInputConnectionToAudioNode","disconnectNativeAudioNodeFromNativeAudioNode","getAudioNodeTailTime","getEventListenersOfAudioNode","isActiveAudioNode","isPassiveAudioNode","tailTime","setTimeout","createAddConnectionToAudioNode","cycleCounters","getNativeAudioParam","cycleCounter","nativeDestinationAudioParam","createIncrementCycleCounterFactory","createDecrementCycleCounter","audioParamAudioNodeStore","getValueForKey","chain","nextLink","isDelayNode","mergedCycles","nestedCycles","concat","createDetectCycles","analyserNodeConstructor","audionNodeConstructor","mergedOptions","_nativeAnalyserNode","frequencyBinCount","getByteFrequencyData","getFloatFrequencyData","createAnalyserNodeConstructor","AudioBuffer","createNativeAudioBufferConstructor","convertNumberToUnsignedLong","unit32Array","channelNumberAsNumber","bufferOffsetAsNumber","audioBufferLength","destinationLength","sourceLength","createWrapAudioBufferCopyChannelMethods","createWrapAudioBufferCopyChannelMethodsOutOfBounds","audioBufferConstructor","audioBufferStore","nativeAudioBufferConstructor","testNativeAudioBufferConstructorSupport","wrapAudioBufferCopyChannelMethods","wrapAudioBufferCopyChannelMethodsOutOfBounds","hasInstance","createAudioBufferConstructor","createNativeGainNode","renderInputsOfAudioParam","createRenderInputsOfAudioParam","createConnectAudioParam","addSilentConnection","testAudioBufferSourceNodeStartMethodConsecutiveCallsSupport","testAudioBufferSourceNodeStartMethodOffsetClampingSupport","testAudioBufferSourceNodeStopMethodNullifiedBufferSupport","testAudioScheduledSourceNodeStartMethodNegativeParametersSupport","testAudioScheduledSourceNodeStopMethodConsecutiveCallsSupport","testAudioScheduledSourceNodeStopMethodNegativeParametersSupport","wrapAudioBufferSourceNodeStartMethodOffsetClampling","wrapAudioBufferSourceNodeStopMethodNullifiedBuffer","wrapAudioScheduledSourceNodeStopMethodConsecutiveCalls","isScheduled","wrapAudioBufferSourceNodeStartMethodConsecutiveCalls","createNativeAudioBufferSourceNodeFactory","clampedOffset","overwriteAccessors","nullifiedBuffer","getAudioParamRenderer","replay","createRenderAutomation","createGetAudioParamRenderer","connectAudioParam","createNativeAudioBufferSourceNode","renderAutomation","renderedNativeAudioBufferSourceNodes","renderedNativeAudioBufferSourceNode","nativeAudioBufferSourceNodeIsOwnedByContext","createAudioBufferSourceNode","createAudioBufferSourceNodeRendererFactory","addAudioParamConnections","audioParamStore","createAudioParamRenderer","setValueAtTimeUntilPossible","isAudioParamOfOfflineAudioContext","maxValue","minValue","automationEventList","audioParamRenderer","currentTime","cancelAndHoldAtTime","flush","previousLastEvent","pop","currentLastEvent","cancelScheduledValues","exponentialRampToValueAtTime","linearRampToValueAtTime","setValueCurveAtTime","Number","isFinite","setTargetAtTime","convertedValues","firstSample","lastSample","numberOfInterpolatedValues","interpolatedValues","timeOfLastSample","createAudioParamFactory","audioParamConnectionsStore","audioBufferSourceNodeConstructor","audioNodeConstructor","createAudioBufferSourceNodeRenderer","createAudioParam","createInvalidStateError","audioBufferSourceNodeRenderer","_audioBufferSourceNodeRenderer","_isBufferNullified","_isBufferSet","_nativeAudioBufferSourceNode","_onended","_playbackRate","wrappedListener","onended","nativeOnEnded","resetInternalStateToPassive","createAudioBufferSourceNodeConstructor","createAudioDestinationNodeRenderer","createNativeAudioDestinationNode","nativeAudioDestinationNode","_isNodeOfNativeOfflineAudioContext","_nativeAudioDestinationNode","maxChannelCount","createAudioDestinationNodeConstructor","nativeAudioDestinationNodePromise","createAudioDestinationNode","isNodeOfNativeOfflineAudioContext","gainNode","createNativeAudioDestinationNodeFactory","createNativeBiquadFilterNode","renderedNativeBiquadFilterNodes","renderedNativeBiquadFilterNode","nativeBiquadFilterNodeIsOwnedByContext","createBiquadFilterNode","createBiquadFilterNodeRendererFactory","createSetAudioNodeTailTime","biquadFilterNodeConstructor","createBiquadFilterNodeRenderer","setAudioNodeTailTime","_Q","_detune","_frequency","_gain","log10","_nativeBiquadFilterNode","frequencyHz","magResponse","phaseResponse","getFrequencyResponse","whenConnected","whenDisconnected","wasDisconnected","wasConnected","isDisconnected","createMonitorConnections","monitorConnections","channelMergerNode","audioBufferSourceNode","wrapChannelMergerNode","nativeChannelMergerNode","createChannelMerger","createNativeChannelMergerNodeFactory","channelMergerNodeConstructor","createChannelMergerNodeRenderer","createNativeChannelMergerNode","createChannelMergerNodeConstructor","renderedNativeAudioNodes","createAudioNode","createChannelMergerNodeRendererFactory","channelSplitterNodeConstructor","createChannelSplitterNodeRenderer","createNativeChannelSplitterNode","sanitizeChannelSplitterOptions","createChannelSplitterNodeConstructor","createChannelSplitterNodeRendererFactory","audioNodeOptions","nativeConstantSourceNodeFaker","args","createNativeConstantSourceNodeFakerFactory","createNativeConstantSourceNodeFaker","createConstantSource","nativeConstantSourceNode","createNativeConstantSourceNodeFactory","constantSourceNodeConstructor","createConstantSourceNodeRendererFactory","createNativeConstantSourceNode","constantSourceNodeRenderer","_constantSourceNodeRenderer","_nativeConstantSourceNode","_offset","createConstantSourceNodeConstructor","renderedNativeConstantSourceNodes","renderedNativeConstantSourceNode","nativeConstantSourceNodeIsOwnedByContext","createConstantSourceNode","nativeConvolverNode","createConvolver","normalize","createNativeConvolverNodeFactory","convolverNodeConstructor","createConvolverNodeRenderer","createNativeConvolverNode","_nativeConvolverNode","createConvolverNodeConstructor","renderedNativeConvolverNodes","renderedNativeConvolverNode","createConvolverNode","createConvolverNodeRendererFactory","delayNodeConstructor","createDelayNodeRenderer","createNativeDelayNode","_delayTime","createDelayNodeConstructor","renderedNativeDelayNodes","renderedNativeDelayNode","nativeDelayNodeIsOwnedByContext","createDelayNode","createDelayNodeRendererFactory","nativeDynamicsCompressorNode","createDynamicsCompressor","dynamicsCompressorNodeConstructor","createDynamicsCompressorNodeRenderer","createNativeDynamicsCompressorNode","_attack","_knee","_nativeDynamicsCompressorNode","_ratio","_release","_threshold","previousChannelCount","reduction","createDynamicsCompressorNodeConstructor","renderedNativeDynamicsCompressorNodes","renderedNativeDynamicsCompressorNode","nativeDynamicsCompressorNodeIsOwnedByContext","createDynamicsCompressorNode","createDynamicsCompressorNodeRendererFactory","gainNodeConstructor","createGainNodeRenderer","createGainNodeConstructor","renderedNativeGainNodes","renderedNativeGainNode","nativeGainNodeIsOwnedByContext","createGainNode","createGainNodeRendererFactory","createNativeScriptProcessorNode","convertedFeedback","Float64Array","convertedFeedforward","scriptProcessorNode","bufferIndexes","xBuffers","yBuffers","fill","outputBuffer","nyquist","omega","PI","cos","sin","response","sqrt","atan2","createNativeIIRFilterNodeFakerFactory","testOfflineAudioContextCurrentTimeSupport","isOfflineAudioContextCurrentTimeSupported","oncomplete","startRendering","createRenderNativeOfflineAudioContext","createTestOfflineAudioContextCurrentTimeSupport","renderNativeOfflineAudioContext","filteredBufferPromise","nativeIIRFilterNode","nativeIIRFilterNodeIsOwnedByContext","createIIRFilter","partialOfflineAudioContext","filteredBuffer","filterFullBuffer","createIIRFilterNodeRendererFactory","createNativeIIRFilterNodeFaker","iIRFilterNodeConstructor","createNativeIIRFilterNode","createIIRFilterNodeRenderer","wrapIIRFilterNodeGetFrequencyResponseMethod","_nativeIIRFilterNode","createIIRFilterNodeConstructor","nativeListener","forwardX","forwardY","forwardZ","upX","upY","upZ","createFakeAudioParam","constantSourceNode","lastOrientation","lastPosition","orientation","setOrientation","positon","setPosition","createFakeAudioParams","createAudioListenerFactory","audioDestinationNodeConstructor","createAudioListener","unrenderedAudioWorkletNodeStore","_nativeContext","_destination","_listener","_onstatechange","onstatechange","nativeOnStateChange","createMinimalBaseAudioContextConstructor","nativeOscillatorNode","setPeriodicWave","createNativeOscillatorNodeFactory","oscillatorNodeConstructor","createNativeOscillatorNode","createOscillatorNodeRenderer","oscillatorNodeRenderer","_nativeOscillatorNode","_oscillatorNodeRenderer","createOscillatorNodeConstructor","renderedNativeOscillatorNodes","renderedNativeOscillatorNode","nativeOscillatorNodeIsOwnedByContext","createOscillatorNode","createOscillatorNodeRendererFactory","createConnectedNativeAudioBufferSourceNode","isDCCurve","negativeWaveShaperNode","createWaveShaper","positiveWaveShaperNode","inputGainNode","invertGainNode","outputGainNode","revertGainNode","disconnectNativeAudioBufferSourceNode","isConnected","unmodifiedCurve","nativeWaveShaperNodeFaker","curveLength","negativeCurve","positiveCurve","centerIndex","createNativeWaveShaperNodeFakerFactory","createNativeWaveShaperNodeFaker","nativeWaveShaperNode","automationRate","createNativeWaveShaperNodeFactory","createNativeWaveShaperNode","pannerNode","createPanner","SINGLE_CHANNEL_OPTIONS","orientationXGainNode","orientationYGainNode","orientationZGainNode","positionXGainNode","positionYGainNode","positionZGainNode","waveShaperNode","nativePannerNodeFaker","createNativePannerNodeFakerFactory","createNativePannerNodeFaker","nativePannerNode","pannerNodeConstructor","createNativePannerNode","createPannerNodeRenderer","_nativePannerNode","_orientationX","_orientationY","_orientationZ","_positionX","_positionY","_positionZ","createPannerNodeConstructor","renderedBufferPromise","renderedNativeGainNodeOrNativePannerNode","commonAudioNodeOptions","commonNativePannerNodeOptions","nativePannerNodeIsOwnedByContext","nativeConstantSourceNodes","channelDatas","gateGainNode","partialPannerNode","createPannerNodeRendererFactory","periodicWaveConstructor","createNativePeriodicWave","periodicWaveStore","sanitizePeriodicWaveOptions","PeriodicWave","createPeriodicWaveConstructor","imag","real","convertedImag","convertedReal","nativePeriodicWave","createPeriodicWave","createNativePeriodicWaveFactory","createNativeStereoPannerNodeFaker","createStereoPanner","nativeStereoPannerNode","createNativeStereoPannerNodeFactory","DC_CURVE","HALF_PI","SINGLE_CHANNEL_WAVE_SHAPER_OPTIONS","buildInternalGraph","panGainNode","leftWaveShaperCurve","rightWaveShaperCurve","leftGainNode","leftWaveShaperNode","panWaveShaperNode","rightGainNode","rightWaveShaperNode","buildInternalGraphForMono","leftInputForLeftOutputWaveShaperCurve","leftInputForRightOutputWaveShaperCurve","rightInputForLeftOutputWaveShaperCurve","rightInputForRightOutputWaveShaperCurve","CURVE_SIZE","leftInputForLeftOutputGainNode","leftInputForLeftOutputWaveShaperNode","leftInputForRightOutputGainNode","leftInputForRightOutputWaveShaperNode","rightInputForLeftOutputGainNode","rightInputForLeftOutputWaveShaperNode","rightInputForRightOutputGainNode","rightInputForRightOutputWaveShaperNode","buildInternalGraphForStereo","connectGraph","disconnectGraph","nativeStereoPannerNodeFakerFactory","createNativeStereoPannerNodeFakerFactory","stereoPannerNodeConstructor","createNativeStereoPannerNode","createStereoPannerNodeRenderer","_pan","createStereoPannerNodeConstructor","renderedNativeStereoPannerNodes","renderedNativeStereoPannerNode","nativeStereoPannerNodeIsOwnedByContext","createStereoPannerNode","createStereoPannerNodeRendererFactory","createWaveShaperNodeRenderer","renderedNativeWaveShaperNodes","renderedNativeWaveShaperNode","createWaveShaperNode","createWaveShaperNodeRendererFactory","waveShaperNodeConstructor","_isCurveNullified","_nativeWaveShaperNode","createWaveShaperNodeConstructor","isSecureContext","createIsSecureContext","fn","currentFrame","createExposeCurrentFrameAndCurrentTime","backupOfflineAudioContextStore","backupOfflineAudioContext","createGetOrCreateBackupOfflineAudioContext","AudioWorkletNode","createNativeAudioWorkletNodeConstructor","addAudioWorkletModule","evaluateSource","fetchSource","getOrCreateBackupOfflineAudioContext","ongoingRequests","resolvedRequests","testAudioWorkletProcessorPostMessageSupport","moduleURL","credentials","audioWorklet","absoluteUrl","isSupportingPostMessage","patchedSourceWithoutImportStatements","blob","Blob","createObjectURL","addModule","finally","revokeObjectURL","resolvedRequestsOfContext","ongoingRequestsOfContext","promiseOfOngoingRequest","evaluateAudioWorkletGlobalScope","_AWGS","SyntaxError","trim","nodeNameToProcessorConstructorMap","rslvdRqstsFCntxt","ngngRqstsFCntxt","createAddAudioWorkletModule","head","document","script","createElement","originalOnErrorHandler","onerror","removeErrorEventListenerAndRevokeUrl","src","location","href","onload","appendChild","createEvaluateSource","createAbortError","fetch","ok","text","createFetchSource","nativeAudioWorkletNodeConstructor","offlineAudioContext","isEmittingMessageEvents","isEmittingProcessorErrorEvents","audioWorkletNode","oscillator","port","onprocessorerror","createTestAudioWorkletProcessorPostMessageSupport","createIsNativeContext","createDataCloneError","createEncodingError","detachedArrayBuffers","isNativeContext","testAudioBufferCopyChannelMethodsOutOfBoundsSupport","testPromiseSupport","anyContext","audioData","complete","detachArrayBuffer","fail","createDecodeAudioData","minimalBaseAudioContextConstructor","_audioWorklet","constraints","successCallback","errorCallback","createBaseAudioContextConstructor","createNativeMediaElementAudioSourceNode","nativeMediaElementAudioSourceNode","_nativeMediaElementAudioSourceNode","mediaElement","createMediaElementAudioSourceNodeConstructor","createMediaElementSource","createNativeMediaStreamAudioDestinationNode","nativeMediaStreamAudioDestinationNode","_nativeMediaStreamAudioDestinationNode","stream","createMediaStreamAudioDestinationNodeConstructor","createMediaStreamDestination","createNativeMediaStreamAudioSourceNode","nativeMediaStreamAudioSourceNode","_nativeMediaStreamAudioSourceNode","mediaStream","createMediaStreamAudioSourceNodeConstructor","audioStreamTracks","getAudioTracks","sort","id","filteredAudioStreamTracks","createMediaStreamSource","MediaStream","createNativeMediaStreamTrackAudioSourceNode","createMediaStreamTrackAudioSourceNodeConstructor","mediaStreamTrack","createMediaStreamTrackSource","kind","createNativeMediaStreamTrackAudioSourceNodeFactory","audioContextConstructor","baseAudioContextConstructor","createUnknownError","mediaElementAudioSourceNodeConstructor","mediaStreamAudioDestinationNodeConstructor","mediaStreamAudioSourceNodeConstructor","mediaStreamTrackAudioSourceNodeConstructor","_baseLatency","_nativeAudioContext","_nativeGainNode","_state","revokeState","resolvePromise","resume","suspend","createAudioContextConstructor","unrenderedAudioWorkletNodes","getUnrenderedAudioWorkletNodes","createConnectMultipleOutputs","createDeleteUnrenderedAudioWorkletNode","createDisconnectMultipleOutputs","activeAudioWorkletNodeInputsStore","createGetActiveAudioWorkletNodeInputs","connectMultipleOutputs","disconnectMultipleOutputs","getActiveAudioWorkletNodeInputs","numberOfParameters","messageChannel","gainNodes","inputChannelSplitterNodes","constantSourceNodes","inputChannelMergerNode","outputChannelSplitterNode","outputChannelMergerNodes","parameterMap","nativeAudioWorkletNodeFaker","_","patchedEventListeners","unpatchedEventListener","patchedEventListener","audioWorkletProcessorPromise","createAudioWorkletProcessor","dWrkltPrcssr","disconnectOutputsGraph","outputChannelMergerNode","activeInputIndexes","disconnectFakeGraph","connectFakeGraph","createNativeAudioWorkletNodeFakerFactory","createNativeAudioWorkletNodeFaker","testClonabilityOfAudioWorkletNodeOptions","createNativeAudioWorkletNodeFactory","deleteUnrenderedAudioWorkletNode","processedBufferPromise","renderedNativeAudioWorkletNodeOrGainNode","nativeOutputNodes","nativeAudioWorkletNodeIsOwnedByContext","renderBuffer","nm","createAudioWorkletNodeRendererFactory","createGetBackupOfflineAudioContext","createSetActiveAudioWorkletNodeInputs","audioWorkletNodeConstructor","addUnrenderedAudioWorkletNode","createAudioWorkletNodeRenderer","createNativeAudioWorkletNode","getBackupOfflineAudioContext","sanitizeAudioWorkletNodeOptions","setActiveAudioWorkletNodeInputs","nativeContextOrBackupOfflineAudioContext","_nativeAudioWorkletNode","_onprocessorerror","_parameters","nativeOnProcessorError","createAudioWorkletNodeConstructor","createMinimalAudioContextConstructor","createCreateNativeOfflineAudioContext","createStartRendering","offlineAudioContextConstructor","createNativeOfflineAudioContext","createMinimalOfflineAudioContextConstructor","delayStateChangeEvent","stopImmediatePropagation","_waitForThePromiseToSettle","_length","_nativeOfflineAudioContext","createOfflineAudioContextConstructor","isAnyAudioContext","createIsAnyAudioContext","isAnyAudioNode","audioNodeStore","isAnyAudioParam","isAnyOfflineAudioContext","createIsAnyOfflineAudioContext","isSupported","testAudioBufferCopyChannelMethodsSubarraySupport","testAudioContextCloseMethodSupport","testAudioContextDecodeAudioDataMethodTypeErrorSupport","testAudioContextOptionsSupport","testAudioNodeConnectMethodSupport","testAudioWorkletProcessorNoOutputsSupport","testChannelMergerNodeChannelCountSupport","testConstantSourceNodeAccurateSchedulingSupport","testConvolverNodeBufferReassignabilitySupport","testConvolverNodeChannelCountSupport","testDomExceptionContrucorSupport","testIsSecureContextSupport","testMediaStreamAudioSourceNodeMediaStreamWithoutAudioTrackSupport","testStereoPannerNodeDefaultValueSupport","createIsSupportedPromise","createTestAudioBufferCopyChannelMethodsSubarraySupport","audioContext","isAudioContextClosable","createTestAudioContextCloseMethodSupport","isPending","createTestAudioContextDecodeAudioDataMethodTypeErrorSupport","createTestAudioContextOptionsSupport","createTestAudioNodeConnectMethodSupport","isCallingProcess","createTestAudioWorkletProcessorNoOutputsSupport","createTestChannelMergerNodeChannelCountSupport","POSITIVE_INFINITY","createTestConstantSourceNodeAccurateSchedulingSupport","createTestConvolverNodeBufferReassignabilitySupport","createTestConvolverNodeChannelCountSupport","createTestIsSecureContextSupport","createTestMediaStreamAudioSourceNodeMediaStreamWithoutAudioTrackSupport","stereoPanner","createTestStereoPannerNodeDefaultValueSupport","assert","statement","assertRange","gte","lte","Infinity","assertContextRunning","warn","defaultLogger","console","setLogger","logger","log","isUndef","arg","isDefined","isFunction","isNumber","isObject","isBoolean","isString","isNote","theWindow","hasAudioContext","__decorate","decorators","desc","arguments","Reflect","decorate","__awaiter","_arguments","P","generator","fulfilled","step","rejected","Ticker","updateInterval","_callback","_type","_updateInterval","_createClock","toFixed","blobUrl","worker","Worker","_worker","_timeout","_createTimeout","_createWorker","clearTimeout","terminate","interval","_disposeClock","isAudioParam","isOfflineAudioContext","isAudioContext","isAudioBuffer","noCopy","deepMerge","sources","shift","assign","optionsFromArguments","defaults","argsArray","objKey","opts","indexOf","defaultArg","given","fallback","omitFromObject","obj","omit","prop","debug","_wasDisposed","TONE_DEBUG_CLASS","GT","GTE","EQ","LT","abs","clamp","_timeline","getDefaults","memory","increasing","valueOf","lastValue","_search","diff","param","after","beginning","end","midPoint","nextEvent","lowerBound","upperBound","_iterate","dispose","notifyNewContext","onContextInit","cb","notifyCloseContext","onContextClose","split","eventName","_events","boundCallback","off","on","eventList","constr","_constants","_timeouts","_timeoutIds","_initialized","_workletModules","createAudioContext","_ticker","emit","clockSource","_timeoutLoop","_setLatencyHint","lookAhead","ctx","feedForward","initialize","_transport","_draw","createAudioWorkletNode","rawContext","promises","_latencyHint","hint","lookAheadValue","val","constant","now","firstEvent","peek","timeout","remove","intervalFn","readOnly","str","noOp","reverse","load","_buffer","getContext","loaded","_reversed","_reverse","doneLoading","downloads","isMultidimensional","channels","multiChannelArray","chanNum","fromArray","toArray","outputArray","numChannels","channelArray","ret","startSamples","endSamples","retBuffer","subarray","rev","matches","extensions","extension","ext","supportsType","baseUrl","endsWith","canPlayType","_currentTime","_duration","asynchronous","yieldEvery","workletsAreReady","_renderClock","dummyContext","_numberOfChannels","_sampleRate","_numberOfInputs","_numberOfOutputs","_maxDelayTime","_feedForward","_feedback","_real","_imag","_constraints","_stream","_element","_audioData","_name","_options","_url","_fn","_id","_interval","_val","globalContext","setContext","TONE_SILENCE_LOGGING","prefix","printString","dbToGain","db","gainToDb","LN10","intervalToFrequencyRatio","A4","ftom","ftomf","mtof","midi","units","defaultUnits","_units","_expressions","_getExpressions","hz","method","_frequencyToUnits","parseFloat","regexp","_ticksToUnits","parseInt","_beatsToUnits","_getTimeSignature","dot","numericValue","scalar","number","_secondsToUnits","samples","tr","q","total","fromType","_noArg","typeName","quantity","expr","matching","freq","beats","_getBpm","seconds","ticks","_getPPQ","_now","transport","bpm","timeSignature","PPQ","toSeconds","toTicks","toFrequency","toMidi","capture","quantize","quantTo","nextSubdivision","subdiv","percent","subdivision","testNotations","power","closest","closestSeconds","notation","notationSeconds","quarterTime","quarters","measures","sixteenths","sixteenthString","Time","setA4","note","pitch","octave","noteNumber","noteToScaleIndex","toLowerCase","intervals","transpose","scaleIndexToNote","cbb","cx","dbb","dx","ebb","eb","ex","fbb","fb","f","fx","gbb","gb","g","gx","abb","ab","ax","bbb","bb","bx","Frequency","TransportTime","defaultContext","attribute","member","_getPartialProperties","initial","_initial","setStateAtTime","overridden","_minOutput","_param","_swappable","swappable","_initialValue","convert","_minValue","_maxValue","_toType","getValueAtTime","_fromType","_is","computedTime","JSON","stringify","_assertRange","getAfter","before","beforeValue","previous","getBefore","_linearInterpolate","_exponentialInterpolate","previousVal","_exponentialApproach","currentVal","rampTime","setRampPoint","exponentialApproachValueAtTime","scaling","startingValue","segTime","cancel","valueAtTime","sampleTime","exponentialRampTo","linearRampTo","previousEvent","subdivisions","forEachAfter","t0","v0","v1","t1","_internalChannels","node","nodeList","_isAudioNode","_getInternalNodes","_getChannelProperties","_setChannelProperties","outputNum","inputNum","toDestination","nodes","connectSeries","first","prev","current","srcNode","dstNode","outputNumber","inputNumber","_gainNode","_stopTime","getStateAtTime","_fadeIn","fadeIn","_fadeOut","fadeOut","_curve","fadeInTime","_stopGain","cancelStop","fadeOutTime","targetRampTo","additionalTail","_stopSource","disposeCallback","requestIdleCallback","_source","_startGain","override","_constantSource","connectSignal","rampTo","signal","_multiplier","multiplier","computedValue","prevEvent","segments","rampVal","ticksUntilTime","_getTicksUntilEvent","computedVal","segmentDur","val0","val1","onTheLineEvent","currentTick","getTicksAtTime","getTimeOfTick","tick","delta","sol1","sol2","getDurationOfTicks","computedDuration","startTicks","ticksToTime","timeToTicks","_tickOffset","setTicksAtTime","stopEvent","getLastState","tmpEvent","lastState","elapsedTicks","forEachBetween","periodStartTime","offsetEvent","getSecondsAtTime","elapsedSeconds","absoluteTicks","lastStateEvent","forEachTickBetween","maxStartTime","nextTickTime","_lastUpdate","_boundLoop","_loop","_tickSource","pause","mixin","maxDelayInSeconds","maxDelay","_maxDelay","_delayNode","Offline","originalContext","bufferPromise","_buffers","_loadingCount","urls","_bufferLoaded","Midi","Ticks","expiration","anticipation","_boundDrawLoop","_drawLoop","_animationFrame","requestAnimationFrame","cancelAnimationFrame","draw","_root","IntervalNode","insert","updateHeight","updateMax","_rebalance","results","search","_removeNode","forEachFrom","replacement","isLeftChild","left","right","_setRoot","_replaceNodeInParent","temp","getBalance","pivotNode","balance","_rotateLeft","_rotateRight","low","allNodes","traverse","searchAfter","high","_left","_right","height","point","volume","_unmutedVolume","mute","initialValue","_eventId","_remainderTime","_once","once","tickDuration","_currentId","_nextId","_nextTick","_boundRestart","_restart","_createEvents","invoke","floatTime","scheduleOnce","_createEvent","_loopStart","_loopEnd","_scheduledEvents","_repeatedEvents","_syncedSignals","_swingAmount","_ppq","ppq","_clock","_processTick","_bindClockEvents","_timeSignature","_swingTicks","swing","swingSubdivision","tickTime","progress","amount","forEachAtTime","_addEvent","eventId","item","timeline","computedAfter","offsetTicks","timeSig","startPosition","endPosition","toNotation","toBarsBeatsSixteenths","remainingTicks","computedFreq","ratioSignal","syncedSignal","_synced","_scheduled","_syncedStart","_syncedStop","_volume","onstop","_clampToCurrentTime","sched","schedule","_start","immediate","restart","getNextState","_stop","stateEvent","startOffset","unsync","_sourceStarted","_sourceStopped","computedOffset","loopDuration","computedDur","_noiseBuffers","rate","random","_noiseCache","brown","pink","white","channelNum","lastOut","b0","b1","b2","b3","b4","b5","b6","labelOrId","supported","devices","enumerateDevices","_device","find","device","label","deviceId","audio","echoCancellation","noiseSuppression","mozNoiseSuppression","navigator","mediaDevices","getUserMedia","mediaStreamNode","_mediaStream","track","active","groupId","generateWaveform","_oscillator","_partials","partials","_partialCount","partialCount","baseType","phase","_wave","syncSignal","unsyncSignal","_periodicWaveCache","description","_phase","arrayA","arrayB","oscProps","isBasicType","cache","_getCachedPeriodicWave","wave","_getRealImaginary","partial","exec","fullPartials","v","periodicWaveSize","piFactor","twoPi","_inverseFFT","_shaper","mapping","setMap","normalized","oversampling","_norm","_mult","factor","_modulationScale","_modulationNode","_carrier","_modulator","modulationType","harmonicity","modulationIndex","_widthGate","_thresh","width","_triangle","_oscillators","_spread","spread","_forEach","osc","sourceType","_scale","_pulse","modulationFrequency","carrierType","OmniOscillatorSourceMap","am","fat","fm","pulse","pwm","_sourceType","substr","_createNewOscillator","_getOscType","oscType","OscConstructor","oldOsc","blockTime","sType","mType","_sum","addend","_add","_min","_max","_setRange","getConstant","_stoppedValue","_clampValue","_amplitudeGain","amplitude","_stoppedSignal","_zeros","_a2g","_scaler","sync","syncFrequency","unsyncFrequency","getInitialValue","_setStoppedValue","currentMin","currentMax","range","valueMap","propertyKey","newValue","timeRange","_activeSources","_onload","autostart","origDuration","_onSourceEnd","implicitEnd","_players","player","_tick","grainSize","_grainSize","_overlap","overlap","_onstop","_abs","_multiply","_neg","subtrahend","_subtract","_gtz","comparator","_exponentScaler","_expFunc","_exponent","exponent","_exp","_lastVal","scheduleRepeat","_onTick","_syncedCallback","_anchorValue","_sig","decay","sustain","attackCurve","releaseCurve","decayCurve","direction","curveName","EnvelopeCurves","curveDef","_getCurve","_attackCurve","_setCurve","_releaseCurve","_decayCurve","velocity","currentValue","decayValue","decayStart","triggerAttack","triggerRelease","attackPortion","envelopeDuration","sustainTime","totalDuration","clone","triggerAttackRelease","cosineCurve","rippleCurve","curveLen","sineWave","stairsCurve","sineCurve","bounceCurve","invertCurve","out","bounce","In","Out","cosine","exponential","linear","ripple","sine","_original_triggerAttack","_original_triggerRelease","_syncState","_syncMethod","changed","timePosition","originalMethod","portamento","onsilence","_triggerEnvelopeAttack","setNote","_triggerEnvelopeRelease","computedFrequency","getLevelAtTime","portTime","envelope","computedAttack","computedDecay","modulation","modulationEnvelope","fan","_filter","freqValues","magValues","phaseValues","filterClone","_filters","rolloff","_rolloff","rolloffNum","possibilities","cascadingCount","totalResponse","_octaves","octaves","_baseFrequency","baseFrequency","filterEnvelope","voice0","voice1","_vibrato","vibratoRate","_vibratoGain","vibratoAmount","inharmRatios","_freqMultipliers","_amplitude","_highpass","mult","_filterFreqScaler","resonance","freqMult","pitchDecay","hertz","maxNote","noise","workletContext","addToWorklet","classOrFunction","registerProcessor","classDesc","processor","workletOptions","_audioWorkletName","_dummyGain","_dummyParam","disposed","_worklet","onReady","setParam","_createFilter","oldFilter","a0","fq","_combFilter","_lowpass","dampening","_noise","attackNoise","_lfcf","delayAmount","_availableVoices","_activeVoices","_voices","_gcTimeout","_averageActiveVoices","voice","maxPolyphony","_dummyVoice","_getNextAvailableVoice","setInterval","_collectGarbage","activeVoiceIndex","_makeVoiceAvailable","activeVoices","firstAvail","notes","midiNote","released","_triggerAttack","_triggerRelease","_scheduleEvent","durationSeconds","sanitizedOptions","clearInterval","urlMap","mid","midiFloat","remainder","difference","_findClosest","closestNote","_startOffset","_probability","probability","_humanize","humanize","_rescheduleEvents","startTick","_getLoopDuration","prob","variation","rescheduleTime","lastEvent","_event","iterations","iters","events","_startNote","timeInTicks","at","_restartEvent","attr","_setAll","_testLoopBoundries","upPatternGen","clampToArraySize","downPatternGen","infiniteGen","gen","alternatingGenerator","directionUp","jumpUp","stepIndex","jumpDown","randomOnce","copy","PatternGenerator","pattern","randomIndex","randomGen","randomWalk","_values","_pattern","_part","_seqCallback","_eventsArray","_subdivision","_createSequence","_eventsUpdated","_indexTime","_rescheduleSequence","sequence","eventOffset","_panner","_split","_g2a","fade","_dryWet","wet","effectSend","effectReturn","effect","_lfo","depth","connectEffect","oct","smoothing","_smoothing","_follower","follower","_sweepRange","_inputBoost","_bandpass","_peaking","_setSweepRange","sensitivity","baseFreq","_bitCrusherWorklet","bits","_order","order","degree","memo","_getCoefficient","isInteger","_splitter","_merger","_merge","_feedbackL","_feedbackR","_feedbackSplit","_feedbackMerge","_depth","_lfoL","_lfoR","_delayNodeL","_delayNodeR","connectEffectLeft","connectEffectRight","deviation","_distortion","distortion","deg","_feedbackGain","offset90","_bank0","_createAllPassFilterBank","_bank1","_oneSampleDelay","bankValues","coefficients","_sine","_cosine","_sineMultiply","_cosineMultiply","_negate","_phaseShifter","combFilterTunings","allpassFilterFrequencies","_combFilters","_allpassFiltersL","_allpassFiltersR","roomSize","allpassL","allpassR","lfpf","al","ar","cf","combFilterDelayTimes","combFilterResonances","allpassFilterFreqs","_allpassFilters","_feedbackCombFilters","_scaleRoomSize","allpass","fbcf","apf","_leftDelay","_rightDelay","_rightPreDelay","_delayA","_lfoA","_delayB","_lfoB","_crossFade","_crossFadeLFO","_feedbackDelay","_pitch","_windowSize","windowSize","_filtersL","_makeFilters","stages","_filtersR","connectToFreq","filters","_convolver","ready","_decay","_preDelay","preDelay","generate","previousReady","noiseL","noiseR","merge","renderPromise","_midAdd","SQRT1_2","_sideSubtract","side","_leftMult","_rightMult","_midSideMerge","_midSideSplit","_midSend","_sideSend","_midReturn","_sideReturn","_twoTimesWidthMid","_twoTimesWidthSide","_midMult","connectEffectMid","_oneMinusWidth","_sideMult","connectEffectSide","_amplitudeL","_amplitudeR","_analysers","analyser","_analyser","_rms","normalRange","aValues","vals","totalSquared","rms","_allSolos","solo","_isSoloed","_addSolo","_removeSolo","_updateSolo","_soloed","_noSolos","_solo","_panVol","muted","buses","bus","_getBus","sendKnob","_lowMidFilter","lowFrequency","highFrequency","_recorder","MediaRecorder","mimeType","startPromise","handleStart","dataPromise","handleData","_compressor","_gt","_gate","thresh","smoothingTime","_multibandSplit","_lowGain","_midGain","_highGain","buff","norm","getTransport","Master","getDestination","getListener","getDraw","Buffer","Buffers","BufferSource"],"mappings":"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","file":"Tone.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Tone\"] = factory();\n\telse\n\t\troot[\"Tone\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 9);\n","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@babel/runtime/helpers/slicedToArray'), require('@babel/runtime/helpers/classCallCheck'), require('@babel/runtime/helpers/createClass')) :\n typeof define === 'function' && define.amd ? define(['exports', '@babel/runtime/helpers/slicedToArray', '@babel/runtime/helpers/classCallCheck', '@babel/runtime/helpers/createClass'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.automationEvents = {}, global._slicedToArray, global._classCallCheck, global._createClass));\n}(this, (function (exports, _slicedToArray, _classCallCheck, _createClass) { 'use strict';\n\n function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }\n\n var _slicedToArray__default = /*#__PURE__*/_interopDefaultLegacy(_slicedToArray);\n var _classCallCheck__default = /*#__PURE__*/_interopDefaultLegacy(_classCallCheck);\n var _createClass__default = /*#__PURE__*/_interopDefaultLegacy(_createClass);\n\n var createExtendedExponentialRampToValueAutomationEvent = function createExtendedExponentialRampToValueAutomationEvent(value, endTime, insertTime) {\n return {\n endTime: endTime,\n insertTime: insertTime,\n type: 'exponentialRampToValue',\n value: value\n };\n };\n\n var createExtendedLinearRampToValueAutomationEvent = function createExtendedLinearRampToValueAutomationEvent(value, endTime, insertTime) {\n return {\n endTime: endTime,\n insertTime: insertTime,\n type: 'linearRampToValue',\n value: value\n };\n };\n\n var createSetValueAutomationEvent = function createSetValueAutomationEvent(value, startTime) {\n return {\n startTime: startTime,\n type: 'setValue',\n value: value\n };\n };\n\n var createSetValueCurveAutomationEvent = function createSetValueCurveAutomationEvent(values, startTime, duration) {\n return {\n duration: duration,\n startTime: startTime,\n type: 'setValueCurve',\n values: values\n };\n };\n\n var getTargetValueAtTime = function getTargetValueAtTime(time, valueAtStartTime, _ref) {\n var startTime = _ref.startTime,\n target = _ref.target,\n timeConstant = _ref.timeConstant;\n return target + (valueAtStartTime - target) * Math.exp((startTime - time) / timeConstant);\n };\n\n var isExponentialRampToValueAutomationEvent = function isExponentialRampToValueAutomationEvent(automationEvent) {\n return automationEvent.type === 'exponentialRampToValue';\n };\n\n var isLinearRampToValueAutomationEvent = function isLinearRampToValueAutomationEvent(automationEvent) {\n return automationEvent.type === 'linearRampToValue';\n };\n\n var isAnyRampToValueAutomationEvent = function isAnyRampToValueAutomationEvent(automationEvent) {\n return isExponentialRampToValueAutomationEvent(automationEvent) || isLinearRampToValueAutomationEvent(automationEvent);\n };\n\n var isSetValueAutomationEvent = function isSetValueAutomationEvent(automationEvent) {\n return automationEvent.type === 'setValue';\n };\n\n var isSetValueCurveAutomationEvent = function isSetValueCurveAutomationEvent(automationEvent) {\n return automationEvent.type === 'setValueCurve';\n };\n\n var getValueOfAutomationEventAtIndexAtTime = function getValueOfAutomationEventAtIndexAtTime(automationEvents, index, time, defaultValue) {\n var automationEvent = automationEvents[index];\n return automationEvent === undefined ? defaultValue : isAnyRampToValueAutomationEvent(automationEvent) || isSetValueAutomationEvent(automationEvent) ? automationEvent.value : isSetValueCurveAutomationEvent(automationEvent) ? automationEvent.values[automationEvent.values.length - 1] : getTargetValueAtTime(time, getValueOfAutomationEventAtIndexAtTime(automationEvents, index - 1, automationEvent.startTime, defaultValue), automationEvent);\n };\n\n var getEndTimeAndValueOfPreviousAutomationEvent = function getEndTimeAndValueOfPreviousAutomationEvent(automationEvents, index, currentAutomationEvent, nextAutomationEvent, defaultValue) {\n return currentAutomationEvent === undefined ? [nextAutomationEvent.insertTime, defaultValue] : isAnyRampToValueAutomationEvent(currentAutomationEvent) ? [currentAutomationEvent.endTime, currentAutomationEvent.value] : isSetValueAutomationEvent(currentAutomationEvent) ? [currentAutomationEvent.startTime, currentAutomationEvent.value] : isSetValueCurveAutomationEvent(currentAutomationEvent) ? [currentAutomationEvent.startTime + currentAutomationEvent.duration, currentAutomationEvent.values[currentAutomationEvent.values.length - 1]] : [currentAutomationEvent.startTime, getValueOfAutomationEventAtIndexAtTime(automationEvents, index - 1, currentAutomationEvent.startTime, defaultValue)];\n };\n\n var isCancelAndHoldAutomationEvent = function isCancelAndHoldAutomationEvent(automationEvent) {\n return automationEvent.type === 'cancelAndHold';\n };\n\n var isCancelScheduledValuesAutomationEvent = function isCancelScheduledValuesAutomationEvent(automationEvent) {\n return automationEvent.type === 'cancelScheduledValues';\n };\n\n var getEventTime = function getEventTime(automationEvent) {\n if (isCancelAndHoldAutomationEvent(automationEvent) || isCancelScheduledValuesAutomationEvent(automationEvent)) {\n return automationEvent.cancelTime;\n }\n\n if (isExponentialRampToValueAutomationEvent(automationEvent) || isLinearRampToValueAutomationEvent(automationEvent)) {\n return automationEvent.endTime;\n }\n\n return automationEvent.startTime;\n };\n\n var getExponentialRampValueAtTime = function getExponentialRampValueAtTime(time, startTime, valueAtStartTime, _ref) {\n var endTime = _ref.endTime,\n value = _ref.value;\n\n if (valueAtStartTime === value) {\n return value;\n }\n\n if (0 < valueAtStartTime && 0 < value || valueAtStartTime < 0 && value < 0) {\n return valueAtStartTime * Math.pow(value / valueAtStartTime, (time - startTime) / (endTime - startTime));\n }\n\n return 0;\n };\n\n var getLinearRampValueAtTime = function getLinearRampValueAtTime(time, startTime, valueAtStartTime, _ref) {\n var endTime = _ref.endTime,\n value = _ref.value;\n return valueAtStartTime + (time - startTime) / (endTime - startTime) * (value - valueAtStartTime);\n };\n\n var interpolateValue = function interpolateValue(values, theoreticIndex) {\n var lowerIndex = Math.floor(theoreticIndex);\n var upperIndex = Math.ceil(theoreticIndex);\n\n if (lowerIndex === upperIndex) {\n return values[lowerIndex];\n }\n\n return (1 - (theoreticIndex - lowerIndex)) * values[lowerIndex] + (1 - (upperIndex - theoreticIndex)) * values[upperIndex];\n };\n\n var getValueCurveValueAtTime = function getValueCurveValueAtTime(time, _ref) {\n var duration = _ref.duration,\n startTime = _ref.startTime,\n values = _ref.values;\n var theoreticIndex = (time - startTime) / duration * (values.length - 1);\n return interpolateValue(values, theoreticIndex);\n };\n\n var isSetTargetAutomationEvent = function isSetTargetAutomationEvent(automationEvent) {\n return automationEvent.type === 'setTarget';\n };\n\n var AutomationEventList = /*#__PURE__*/function () {\n function AutomationEventList(defaultValue) {\n _classCallCheck__default['default'](this, AutomationEventList);\n\n this._automationEvents = [];\n this._currenTime = 0;\n this._defaultValue = defaultValue;\n }\n\n _createClass__default['default'](AutomationEventList, [{\n key: Symbol.iterator,\n value: function value() {\n return this._automationEvents[Symbol.iterator]();\n }\n }, {\n key: \"add\",\n value: function add(automationEvent) {\n var eventTime = getEventTime(automationEvent);\n\n if (isCancelAndHoldAutomationEvent(automationEvent) || isCancelScheduledValuesAutomationEvent(automationEvent)) {\n var index = this._automationEvents.findIndex(function (currentAutomationEvent) {\n if (isCancelScheduledValuesAutomationEvent(automationEvent) && isSetValueCurveAutomationEvent(currentAutomationEvent)) {\n return currentAutomationEvent.startTime + currentAutomationEvent.duration >= eventTime;\n }\n\n return getEventTime(currentAutomationEvent) >= eventTime;\n });\n\n var removedAutomationEvent = this._automationEvents[index];\n\n if (index !== -1) {\n this._automationEvents = this._automationEvents.slice(0, index);\n }\n\n if (isCancelAndHoldAutomationEvent(automationEvent)) {\n var lastAutomationEvent = this._automationEvents[this._automationEvents.length - 1];\n\n if (removedAutomationEvent !== undefined && isAnyRampToValueAutomationEvent(removedAutomationEvent)) {\n if (isSetTargetAutomationEvent(lastAutomationEvent)) {\n throw new Error('The internal list is malformed.');\n }\n\n var startTime = isSetValueCurveAutomationEvent(lastAutomationEvent) ? lastAutomationEvent.startTime + lastAutomationEvent.duration : getEventTime(lastAutomationEvent);\n var startValue = isSetValueCurveAutomationEvent(lastAutomationEvent) ? lastAutomationEvent.values[lastAutomationEvent.values.length - 1] : lastAutomationEvent.value;\n var value = isExponentialRampToValueAutomationEvent(removedAutomationEvent) ? getExponentialRampValueAtTime(eventTime, startTime, startValue, removedAutomationEvent) : getLinearRampValueAtTime(eventTime, startTime, startValue, removedAutomationEvent);\n var truncatedAutomationEvent = isExponentialRampToValueAutomationEvent(removedAutomationEvent) ? createExtendedExponentialRampToValueAutomationEvent(value, eventTime, this._currenTime) : createExtendedLinearRampToValueAutomationEvent(value, eventTime, this._currenTime);\n\n this._automationEvents.push(truncatedAutomationEvent);\n }\n\n if (lastAutomationEvent !== undefined && isSetTargetAutomationEvent(lastAutomationEvent)) {\n this._automationEvents.push(createSetValueAutomationEvent(this.getValue(eventTime), eventTime));\n }\n\n if (lastAutomationEvent !== undefined && isSetValueCurveAutomationEvent(lastAutomationEvent) && lastAutomationEvent.startTime + lastAutomationEvent.duration > eventTime) {\n this._automationEvents[this._automationEvents.length - 1] = createSetValueCurveAutomationEvent(new Float32Array([6, 7]), lastAutomationEvent.startTime, eventTime - lastAutomationEvent.startTime);\n }\n }\n } else {\n var _index = this._automationEvents.findIndex(function (currentAutomationEvent) {\n return getEventTime(currentAutomationEvent) > eventTime;\n });\n\n var previousAutomationEvent = _index === -1 ? this._automationEvents[this._automationEvents.length - 1] : this._automationEvents[_index - 1];\n\n if (previousAutomationEvent !== undefined && isSetValueCurveAutomationEvent(previousAutomationEvent) && getEventTime(previousAutomationEvent) + previousAutomationEvent.duration > eventTime) {\n return false;\n }\n\n var persistentAutomationEvent = isExponentialRampToValueAutomationEvent(automationEvent) ? createExtendedExponentialRampToValueAutomationEvent(automationEvent.value, automationEvent.endTime, this._currenTime) : isLinearRampToValueAutomationEvent(automationEvent) ? createExtendedLinearRampToValueAutomationEvent(automationEvent.value, eventTime, this._currenTime) : automationEvent;\n\n if (_index === -1) {\n this._automationEvents.push(persistentAutomationEvent);\n } else {\n if (isSetValueCurveAutomationEvent(automationEvent) && eventTime + automationEvent.duration > getEventTime(this._automationEvents[_index])) {\n return false;\n }\n\n this._automationEvents.splice(_index, 0, persistentAutomationEvent);\n }\n }\n\n return true;\n }\n }, {\n key: \"flush\",\n value: function flush(time) {\n var index = this._automationEvents.findIndex(function (currentAutomationEvent) {\n return getEventTime(currentAutomationEvent) > time;\n });\n\n if (index > 1) {\n var remainingAutomationEvents = this._automationEvents.slice(index - 1);\n\n var firstRemainingAutomationEvent = remainingAutomationEvents[0];\n\n if (isSetTargetAutomationEvent(firstRemainingAutomationEvent)) {\n remainingAutomationEvents.unshift(createSetValueAutomationEvent(getValueOfAutomationEventAtIndexAtTime(this._automationEvents, index - 2, firstRemainingAutomationEvent.startTime, this._defaultValue), firstRemainingAutomationEvent.startTime));\n }\n\n this._automationEvents = remainingAutomationEvents;\n }\n }\n }, {\n key: \"getValue\",\n value: function getValue(time) {\n if (this._automationEvents.length === 0) {\n return this._defaultValue;\n }\n\n var lastAutomationEvent = this._automationEvents[this._automationEvents.length - 1];\n\n var index = this._automationEvents.findIndex(function (automationEvent) {\n return getEventTime(automationEvent) > time;\n });\n\n var nextAutomationEvent = this._automationEvents[index];\n var currentAutomationEvent = getEventTime(lastAutomationEvent) <= time ? lastAutomationEvent : this._automationEvents[index - 1];\n\n if (currentAutomationEvent !== undefined && isSetTargetAutomationEvent(currentAutomationEvent) && (nextAutomationEvent === undefined || !isAnyRampToValueAutomationEvent(nextAutomationEvent) || nextAutomationEvent.insertTime > time)) {\n return getTargetValueAtTime(time, getValueOfAutomationEventAtIndexAtTime(this._automationEvents, index - 2, currentAutomationEvent.startTime, this._defaultValue), currentAutomationEvent);\n }\n\n if (currentAutomationEvent !== undefined && isSetValueAutomationEvent(currentAutomationEvent) && (nextAutomationEvent === undefined || !isAnyRampToValueAutomationEvent(nextAutomationEvent))) {\n return currentAutomationEvent.value;\n }\n\n if (currentAutomationEvent !== undefined && isSetValueCurveAutomationEvent(currentAutomationEvent) && (nextAutomationEvent === undefined || !isAnyRampToValueAutomationEvent(nextAutomationEvent) || currentAutomationEvent.startTime + currentAutomationEvent.duration > time)) {\n if (time < currentAutomationEvent.startTime + currentAutomationEvent.duration) {\n return getValueCurveValueAtTime(time, currentAutomationEvent);\n }\n\n return currentAutomationEvent.values[currentAutomationEvent.values.length - 1];\n }\n\n if (currentAutomationEvent !== undefined && isAnyRampToValueAutomationEvent(currentAutomationEvent) && (nextAutomationEvent === undefined || !isAnyRampToValueAutomationEvent(nextAutomationEvent))) {\n return currentAutomationEvent.value;\n }\n\n if (nextAutomationEvent !== undefined && isExponentialRampToValueAutomationEvent(nextAutomationEvent)) {\n var _getEndTimeAndValueOf = getEndTimeAndValueOfPreviousAutomationEvent(this._automationEvents, index - 1, currentAutomationEvent, nextAutomationEvent, this._defaultValue),\n _getEndTimeAndValueOf2 = _slicedToArray__default['default'](_getEndTimeAndValueOf, 2),\n startTime = _getEndTimeAndValueOf2[0],\n value = _getEndTimeAndValueOf2[1];\n\n return getExponentialRampValueAtTime(time, startTime, value, nextAutomationEvent);\n }\n\n if (nextAutomationEvent !== undefined && isLinearRampToValueAutomationEvent(nextAutomationEvent)) {\n var _getEndTimeAndValueOf3 = getEndTimeAndValueOfPreviousAutomationEvent(this._automationEvents, index - 1, currentAutomationEvent, nextAutomationEvent, this._defaultValue),\n _getEndTimeAndValueOf4 = _slicedToArray__default['default'](_getEndTimeAndValueOf3, 2),\n _startTime = _getEndTimeAndValueOf4[0],\n _value = _getEndTimeAndValueOf4[1];\n\n return getLinearRampValueAtTime(time, _startTime, _value, nextAutomationEvent);\n }\n\n return this._defaultValue;\n }\n }]);\n\n return AutomationEventList;\n }();\n\n var createCancelAndHoldAutomationEvent = function createCancelAndHoldAutomationEvent(cancelTime) {\n return {\n cancelTime: cancelTime,\n type: 'cancelAndHold'\n };\n };\n\n var createCancelScheduledValuesAutomationEvent = function createCancelScheduledValuesAutomationEvent(cancelTime) {\n return {\n cancelTime: cancelTime,\n type: 'cancelScheduledValues'\n };\n };\n\n var createExponentialRampToValueAutomationEvent = function createExponentialRampToValueAutomationEvent(value, endTime) {\n return {\n endTime: endTime,\n type: 'exponentialRampToValue',\n value: value\n };\n };\n\n var createLinearRampToValueAutomationEvent = function createLinearRampToValueAutomationEvent(value, endTime) {\n return {\n endTime: endTime,\n type: 'linearRampToValue',\n value: value\n };\n };\n\n var createSetTargetAutomationEvent = function createSetTargetAutomationEvent(target, startTime, timeConstant) {\n return {\n startTime: startTime,\n target: target,\n timeConstant: timeConstant,\n type: 'setTarget'\n };\n };\n\n exports.AutomationEventList = AutomationEventList;\n exports.createCancelAndHoldAutomationEvent = createCancelAndHoldAutomationEvent;\n exports.createCancelScheduledValuesAutomationEvent = createCancelScheduledValuesAutomationEvent;\n exports.createExponentialRampToValueAutomationEvent = createExponentialRampToValueAutomationEvent;\n exports.createLinearRampToValueAutomationEvent = createLinearRampToValueAutomationEvent;\n exports.createSetTargetAutomationEvent = createSetTargetAutomationEvent;\n exports.createSetValueAutomationEvent = createSetValueAutomationEvent;\n exports.createSetValueCurveAutomationEvent = createSetValueCurveAutomationEvent;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n","var arrayWithHoles = require(\"./arrayWithHoles\");\n\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit\");\n\nvar unsupportedIterableToArray = require(\"./unsupportedIterableToArray\");\n\nvar nonIterableRest = require(\"./nonIterableRest\");\n\nfunction _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}\n\nmodule.exports = _slicedToArray;","function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nmodule.exports = _arrayWithHoles;","function _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nmodule.exports = _iterableToArrayLimit;","var arrayLikeToArray = require(\"./arrayLikeToArray\");\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}\n\nmodule.exports = _unsupportedIterableToArray;","function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}\n\nmodule.exports = _arrayLikeToArray;","function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nmodule.exports = _nonIterableRest;","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;","export const version: string = \"14.8.15\";\n","export const createAbortError = () => new DOMException('', 'AbortError');\n//# sourceMappingURL=abort-error.js.map","export const ACTIVE_AUDIO_NODE_STORE = new WeakSet();\nexport const AUDIO_NODE_CONNECTIONS_STORE = new WeakMap();\nexport const AUDIO_NODE_STORE = new WeakMap();\nexport const AUDIO_PARAM_CONNECTIONS_STORE = new WeakMap();\nexport const AUDIO_PARAM_STORE = new WeakMap();\nexport const CONTEXT_STORE = new WeakMap();\nexport const EVENT_LISTENERS = new WeakMap();\nexport const CYCLE_COUNTERS = new WeakMap();\n// This clunky name is borrowed from the spec. :-)\nexport const NODE_NAME_TO_PROCESSOR_CONSTRUCTOR_MAPS = new WeakMap();\nexport const NODE_TO_PROCESSOR_MAPS = new WeakMap();\n//# sourceMappingURL=globals.js.map","const handler = {\n construct() {\n return handler;\n }\n};\nexport const isConstructible = (constructible) => {\n try {\n const proxy = new Proxy(constructible, handler);\n new proxy(); // tslint:disable-line:no-unused-expression\n }\n catch {\n return false;\n }\n return true;\n};\n//# sourceMappingURL=is-constructible.js.map","/*\n * This massive regex tries to cover all the following cases.\n *\n * import './path';\n * import defaultImport from './path';\n * import { namedImport } from './path';\n * import { namedImport as renamendImport } from './path';\n * import * as namespaceImport from './path';\n * import defaultImport, { namedImport } from './path';\n * import defaultImport, { namedImport as renamendImport } from './path';\n * import defaultImport, * as namespaceImport from './path';\n */\nconst IMPORT_STATEMENT_REGEX = /^import(?:(?:[\\s]+[\\w]+|(?:[\\s]+[\\w]+[\\s]*,)?[\\s]*\\{[\\s]*[\\w]+(?:[\\s]+as[\\s]+[\\w]+)?(?:[\\s]*,[\\s]*[\\w]+(?:[\\s]+as[\\s]+[\\w]+)?)*[\\s]*}|(?:[\\s]+[\\w]+[\\s]*,)?[\\s]*\\*[\\s]+as[\\s]+[\\w]+)[\\s]+from)?(?:[\\s]*)(\"([^\"\\\\]|\\\\.)+\"|'([^'\\\\]|\\\\.)+')(?:[\\s]*);?/; // tslint:disable-line:max-line-length\nexport const splitImportStatements = (source, url) => {\n const importStatements = [];\n let sourceWithoutImportStatements = source.replace(/^[\\s]+/, '');\n let result = sourceWithoutImportStatements.match(IMPORT_STATEMENT_REGEX);\n while (result !== null) {\n const unresolvedUrl = result[1].slice(1, -1);\n const importStatementWithResolvedUrl = result[0]\n .replace(/([\\s]+)?;?$/, '')\n .replace(unresolvedUrl, new URL(unresolvedUrl, url).toString());\n importStatements.push(importStatementWithResolvedUrl);\n sourceWithoutImportStatements = sourceWithoutImportStatements.slice(result[0].length).replace(/^[\\s]+/, '');\n result = sourceWithoutImportStatements.match(IMPORT_STATEMENT_REGEX);\n }\n return [importStatements.join(';'), sourceWithoutImportStatements];\n};\n//# sourceMappingURL=split-import-statements.js.map","import { NODE_NAME_TO_PROCESSOR_CONSTRUCTOR_MAPS } from '../globals';\nimport { isConstructible } from '../helpers/is-constructible';\nimport { splitImportStatements } from '../helpers/split-import-statements';\nconst verifyParameterDescriptors = (parameterDescriptors) => {\n if (parameterDescriptors !== undefined && !Array.isArray(parameterDescriptors)) {\n throw new TypeError('The parameterDescriptors property of given value for processorCtor is not an array.');\n }\n};\nconst verifyProcessorCtor = (processorCtor) => {\n if (!isConstructible(processorCtor)) {\n throw new TypeError('The given value for processorCtor should be a constructor.');\n }\n if (processorCtor.prototype === null || typeof processorCtor.prototype !== 'object') {\n throw new TypeError('The given value for processorCtor should have a prototype.');\n }\n};\nexport const createAddAudioWorkletModule = (cacheTestResult, createNotSupportedError, evaluateSource, exposeCurrentFrameAndCurrentTime, fetchSource, getNativeContext, getOrCreateBackupOfflineAudioContext, isNativeOfflineAudioContext, ongoingRequests, resolvedRequests, testAudioWorkletProcessorPostMessageSupport, window) => {\n return (context, moduleURL, options = { credentials: 'omit' }) => {\n const nativeContext = getNativeContext(context);\n // Bug #59: Safari does not implement the audioWorklet property.\n if (nativeContext.audioWorklet !== undefined) {\n return Promise.all([\n fetchSource(moduleURL),\n Promise.resolve(cacheTestResult(testAudioWorkletProcessorPostMessageSupport, testAudioWorkletProcessorPostMessageSupport))\n ]).then(([[source, absoluteUrl], isSupportingPostMessage]) => {\n const [importStatements, sourceWithoutImportStatements] = splitImportStatements(source, absoluteUrl);\n /*\n * Bug #179: Firefox does not allow to transfer any buffer which has been passed to the process() method as an argument.\n *\n * This is the unminified version of the code used below.\n *\n * ```js\n * class extends AudioWorkletProcessor {\n *\n * __buffers = new WeakSet();\n *\n * constructor () {\n * super();\n *\n * this.port.postMessage = ((postMessage) => {\n * return (message, transferables) => {\n * const filteredTransferables = (transferables)\n * ? transferables.filter((transferable) => !this.__buffers.has(transferable))\n * : transferables;\n *\n * return postMessage.call(this.port, message, filteredTransferables);\n * };\n * })(this.port.postMessage);\n * }\n * }\n * ```\n */\n const patchedSourceWithoutImportStatements = isSupportingPostMessage\n ? sourceWithoutImportStatements\n : sourceWithoutImportStatements.replace(/\\s+extends\\s+AudioWorkletProcessor\\s*{/, ` extends (class extends AudioWorkletProcessor {__b=new WeakSet();constructor(){super();(p=>p.postMessage=(q=>(m,t)=>q.call(p,m,t?t.filter(u=>!this.__b.has(u)):t))(p.postMessage))(this.port)}}){`);\n /*\n * Bug #170: Chrome and Edge do call process() with an array with empty channelData for each input if no input is connected.\n *\n * Bug #179: Firefox does not allow to transfer any buffer which has been passed to the process() method as an argument.\n *\n * This is the unminified version of the code used below:\n *\n * ```js\n * `${ importStatements };\n * ((registerProcessor) => {${ sourceWithoutImportStatements }\n * })((name, processorCtor) => registerProcessor(name, class extends processorCtor {\n *\n * __collectBuffers = (array) => {\n * array.forEach((element) => this.__buffers.add(element.buffer));\n * };\n *\n * process (inputs, outputs, parameters) {\n * inputs.forEach(this.__collectBuffers);\n * outputs.forEach(this.__collectBuffers);\n * this.__collectBuffers(Object.values(parameters));\n *\n * return super.process(\n * (inputs.map((input) => input.some((channelData) => channelData.length === 0)) ? [ ] : input),\n * outputs,\n * parameters\n * );\n * }\n *\n * }))`\n * ```\n */\n const memberDefinition = isSupportingPostMessage ? '' : '__c = (a) => a.forEach(e=>this.__b.add(e.buffer));';\n const bufferRegistration = isSupportingPostMessage\n ? ''\n : 'i.forEach(this.__c);o.forEach(this.__c);this.__c(Object.values(p));';\n const wrappedSource = `${importStatements};(registerProcessor=>{${patchedSourceWithoutImportStatements}\n})((n,p)=>registerProcessor(n,class extends p{${memberDefinition}process(i,o,p){${bufferRegistration}return super.process(i.map(j=>j.some(k=>k.length===0)?[]:j),o,p)}}))`;\n const blob = new Blob([wrappedSource], { type: 'application/javascript; charset=utf-8' });\n const url = URL.createObjectURL(blob);\n return nativeContext.audioWorklet\n .addModule(url, options)\n .then(() => {\n if (isNativeOfflineAudioContext(nativeContext)) {\n return;\n }\n // Bug #186: Chrome, Edge and Opera do not allow to create an AudioWorkletNode on a closed AudioContext.\n const backupOfflineAudioContext = getOrCreateBackupOfflineAudioContext(nativeContext);\n return backupOfflineAudioContext.audioWorklet.addModule(url, options);\n })\n .finally(() => URL.revokeObjectURL(url));\n });\n }\n const resolvedRequestsOfContext = resolvedRequests.get(context);\n if (resolvedRequestsOfContext !== undefined && resolvedRequestsOfContext.has(moduleURL)) {\n return Promise.resolve();\n }\n const ongoingRequestsOfContext = ongoingRequests.get(context);\n if (ongoingRequestsOfContext !== undefined) {\n const promiseOfOngoingRequest = ongoingRequestsOfContext.get(moduleURL);\n if (promiseOfOngoingRequest !== undefined) {\n return promiseOfOngoingRequest;\n }\n }\n const promise = fetchSource(moduleURL)\n .then(([source, absoluteUrl]) => {\n const [importStatements, sourceWithoutImportStatements] = splitImportStatements(source, absoluteUrl);\n /*\n * This is the unminified version of the code used below:\n *\n * ```js\n * ${ importStatements };\n * ((a, b) => {\n * (a[b] = a[b] || [ ]).push(\n * (AudioWorkletProcessor, global, registerProcessor, sampleRate, self, window) => {\n * ${ sourceWithoutImportStatements }\n * }\n * );\n * })(window, '_AWGS');\n * ```\n */\n // tslint:disable-next-line:max-line-length\n const wrappedSource = `${importStatements};((a,b)=>{(a[b]=a[b]||[]).push((AudioWorkletProcessor,global,registerProcessor,sampleRate,self,window)=>{${sourceWithoutImportStatements}\n})})(window,'_AWGS')`;\n // @todo Evaluating the given source code is a possible security problem.\n return evaluateSource(wrappedSource);\n })\n .then(() => {\n const evaluateAudioWorkletGlobalScope = window._AWGS.pop();\n if (evaluateAudioWorkletGlobalScope === undefined) {\n // Bug #182 Chrome, Edge and Opera do throw an instance of a SyntaxError instead of a DOMException.\n throw new SyntaxError();\n }\n exposeCurrentFrameAndCurrentTime(nativeContext.currentTime, nativeContext.sampleRate, () => evaluateAudioWorkletGlobalScope(class AudioWorkletProcessor {\n }, undefined, (name, processorCtor) => {\n if (name.trim() === '') {\n throw createNotSupportedError();\n }\n const nodeNameToProcessorConstructorMap = NODE_NAME_TO_PROCESSOR_CONSTRUCTOR_MAPS.get(nativeContext);\n if (nodeNameToProcessorConstructorMap !== undefined) {\n if (nodeNameToProcessorConstructorMap.has(name)) {\n throw createNotSupportedError();\n }\n verifyProcessorCtor(processorCtor);\n verifyParameterDescriptors(processorCtor.parameterDescriptors);\n nodeNameToProcessorConstructorMap.set(name, processorCtor);\n }\n else {\n verifyProcessorCtor(processorCtor);\n verifyParameterDescriptors(processorCtor.parameterDescriptors);\n NODE_NAME_TO_PROCESSOR_CONSTRUCTOR_MAPS.set(nativeContext, new Map([[name, processorCtor]]));\n }\n }, nativeContext.sampleRate, undefined, undefined));\n });\n if (ongoingRequestsOfContext === undefined) {\n ongoingRequests.set(context, new Map([[moduleURL, promise]]));\n }\n else {\n ongoingRequestsOfContext.set(moduleURL, promise);\n }\n promise\n .then(() => {\n const rslvdRqstsFCntxt = resolvedRequests.get(context);\n if (rslvdRqstsFCntxt === undefined) {\n resolvedRequests.set(context, new Set([moduleURL]));\n }\n else {\n rslvdRqstsFCntxt.add(moduleURL);\n }\n })\n .finally(() => {\n const ngngRqstsFCntxt = ongoingRequests.get(context);\n if (ngngRqstsFCntxt !== undefined) {\n ngngRqstsFCntxt.delete(moduleURL);\n }\n });\n return promise;\n };\n};\n//# sourceMappingURL=add-audio-worklet-module.js.map","export const getValueForKey = (map, key) => {\n const value = map.get(key);\n if (value === undefined) {\n throw new Error('A value with the given key could not be found.');\n }\n return value;\n};\n//# sourceMappingURL=get-value-for-key.js.map","export const pickElementFromSet = (set, predicate) => {\n const matchingElements = Array.from(set).filter(predicate);\n if (matchingElements.length > 1) {\n throw Error('More than one element was found.');\n }\n if (matchingElements.length === 0) {\n throw Error('No element was found.');\n }\n const [matchingElement] = matchingElements;\n set.delete(matchingElement);\n return matchingElement;\n};\n//# sourceMappingURL=pick-element-from-set.js.map","import { getValueForKey } from './get-value-for-key';\nimport { pickElementFromSet } from './pick-element-from-set';\nexport const deletePassiveInputConnectionToAudioNode = (passiveInputs, source, output, input) => {\n const passiveInputConnections = getValueForKey(passiveInputs, source);\n const matchingConnection = pickElementFromSet(passiveInputConnections, (passiveInputConnection) => passiveInputConnection[0] === output && passiveInputConnection[1] === input);\n if (passiveInputConnections.size === 0) {\n passiveInputs.delete(source);\n }\n return matchingConnection;\n};\n//# sourceMappingURL=delete-passive-input-connection-to-audio-node.js.map","import { EVENT_LISTENERS } from '../globals';\nimport { getValueForKey } from './get-value-for-key';\nexport const getEventListenersOfAudioNode = (audioNode) => {\n return getValueForKey(EVENT_LISTENERS, audioNode);\n};\n//# sourceMappingURL=get-event-listeners-of-audio-node.js.map","import { ACTIVE_AUDIO_NODE_STORE } from '../globals';\nimport { getEventListenersOfAudioNode } from './get-event-listeners-of-audio-node';\nexport const setInternalStateToActive = (audioNode) => {\n if (ACTIVE_AUDIO_NODE_STORE.has(audioNode)) {\n throw new Error('The AudioNode is already stored.');\n }\n ACTIVE_AUDIO_NODE_STORE.add(audioNode);\n getEventListenersOfAudioNode(audioNode).forEach((eventListener) => eventListener(true));\n};\n//# sourceMappingURL=set-internal-state-to-active.js.map","export const isAudioWorkletNode = (audioNode) => {\n return 'port' in audioNode;\n};\n//# sourceMappingURL=audio-worklet-node.js.map","import { ACTIVE_AUDIO_NODE_STORE } from '../globals';\nimport { getEventListenersOfAudioNode } from './get-event-listeners-of-audio-node';\nexport const setInternalStateToPassive = (audioNode) => {\n if (!ACTIVE_AUDIO_NODE_STORE.has(audioNode)) {\n throw new Error('The AudioNode is not stored.');\n }\n ACTIVE_AUDIO_NODE_STORE.delete(audioNode);\n getEventListenersOfAudioNode(audioNode).forEach((eventListener) => eventListener(false));\n};\n//# sourceMappingURL=set-internal-state-to-passive.js.map","import { isAudioWorkletNode } from '../guards/audio-worklet-node';\nimport { setInternalStateToPassive } from './set-internal-state-to-passive';\n// Set the internalState of the audioNode to 'passive' if it is not an AudioWorkletNode and if it has no 'active' input connections.\nexport const setInternalStateToPassiveWhenNecessary = (audioNode, activeInputs) => {\n if (!isAudioWorkletNode(audioNode) && activeInputs.every((connections) => connections.size === 0)) {\n setInternalStateToPassive(audioNode);\n }\n};\n//# sourceMappingURL=set-internal-state-to-passive-when-necessary.js.map","const DEFAULT_OPTIONS = {\n channelCount: 2,\n channelCountMode: 'max',\n channelInterpretation: 'speakers',\n fftSize: 2048,\n maxDecibels: -30,\n minDecibels: -100,\n smoothingTimeConstant: 0.8\n};\nexport const createAnalyserNodeConstructor = (audionNodeConstructor, createAnalyserNodeRenderer, createIndexSizeError, createNativeAnalyserNode, getNativeContext, isNativeOfflineAudioContext) => {\n return class AnalyserNode extends audionNodeConstructor {\n constructor(context, options) {\n const nativeContext = getNativeContext(context);\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n const nativeAnalyserNode = createNativeAnalyserNode(nativeContext, mergedOptions);\n const analyserNodeRenderer = ((isNativeOfflineAudioContext(nativeContext) ? createAnalyserNodeRenderer() : null));\n super(context, false, nativeAnalyserNode, analyserNodeRenderer);\n this._nativeAnalyserNode = nativeAnalyserNode;\n }\n get fftSize() {\n return this._nativeAnalyserNode.fftSize;\n }\n set fftSize(value) {\n this._nativeAnalyserNode.fftSize = value;\n }\n get frequencyBinCount() {\n return this._nativeAnalyserNode.frequencyBinCount;\n }\n get maxDecibels() {\n return this._nativeAnalyserNode.maxDecibels;\n }\n set maxDecibels(value) {\n // Bug #118: Safari does not throw an error if maxDecibels is not more than minDecibels.\n const maxDecibels = this._nativeAnalyserNode.maxDecibels;\n this._nativeAnalyserNode.maxDecibels = value;\n if (!(value > this._nativeAnalyserNode.minDecibels)) {\n this._nativeAnalyserNode.maxDecibels = maxDecibels;\n throw createIndexSizeError();\n }\n }\n get minDecibels() {\n return this._nativeAnalyserNode.minDecibels;\n }\n set minDecibels(value) {\n // Bug #118: Safari does not throw an error if maxDecibels is not more than minDecibels.\n const minDecibels = this._nativeAnalyserNode.minDecibels;\n this._nativeAnalyserNode.minDecibels = value;\n if (!(this._nativeAnalyserNode.maxDecibels > value)) {\n this._nativeAnalyserNode.minDecibels = minDecibels;\n throw createIndexSizeError();\n }\n }\n get smoothingTimeConstant() {\n return this._nativeAnalyserNode.smoothingTimeConstant;\n }\n set smoothingTimeConstant(value) {\n this._nativeAnalyserNode.smoothingTimeConstant = value;\n }\n getByteFrequencyData(array) {\n this._nativeAnalyserNode.getByteFrequencyData(array);\n }\n getByteTimeDomainData(array) {\n this._nativeAnalyserNode.getByteTimeDomainData(array);\n }\n getFloatFrequencyData(array) {\n this._nativeAnalyserNode.getFloatFrequencyData(array);\n }\n getFloatTimeDomainData(array) {\n this._nativeAnalyserNode.getFloatTimeDomainData(array);\n }\n };\n};\n//# sourceMappingURL=analyser-node-constructor.js.map","export const isOwnedByContext = (nativeAudioNode, nativeContext) => {\n return nativeAudioNode.context === nativeContext;\n};\n//# sourceMappingURL=is-owned-by-context.js.map","export const testAudioBufferCopyChannelMethodsOutOfBoundsSupport = (nativeAudioBuffer) => {\n try {\n nativeAudioBuffer.copyToChannel(new Float32Array(1), 0, -1);\n }\n catch {\n return false;\n }\n return true;\n};\n//# sourceMappingURL=test-audio-buffer-copy-channel-methods-out-of-bounds-support.js.map","export const createIndexSizeError = () => new DOMException('', 'IndexSizeError');\n//# sourceMappingURL=index-size-error.js.map","import { createIndexSizeError } from '../factories/index-size-error';\nexport const wrapAudioBufferGetChannelDataMethod = (audioBuffer) => {\n audioBuffer.getChannelData = ((getChannelData) => {\n return (channel) => {\n try {\n return getChannelData.call(audioBuffer, channel);\n }\n catch (err) {\n if (err.code === 12) {\n throw createIndexSizeError();\n }\n throw err;\n }\n };\n })(audioBuffer.getChannelData);\n};\n//# sourceMappingURL=wrap-audio-buffer-get-channel-data-method.js.map","import { testAudioBufferCopyChannelMethodsOutOfBoundsSupport } from '../helpers/test-audio-buffer-copy-channel-methods-out-of-bounds-support';\nimport { wrapAudioBufferGetChannelDataMethod } from '../helpers/wrap-audio-buffer-get-channel-data-method';\nconst DEFAULT_OPTIONS = {\n numberOfChannels: 1\n};\nexport const createAudioBufferConstructor = (audioBufferStore, cacheTestResult, createNotSupportedError, nativeAudioBufferConstructor, nativeOfflineAudioContextConstructor, testNativeAudioBufferConstructorSupport, wrapAudioBufferCopyChannelMethods, wrapAudioBufferCopyChannelMethodsOutOfBounds) => {\n let nativeOfflineAudioContext = null;\n return class AudioBuffer {\n constructor(options) {\n if (nativeOfflineAudioContextConstructor === null) {\n throw new Error('Missing the native OfflineAudioContext constructor.');\n }\n const { length, numberOfChannels, sampleRate } = { ...DEFAULT_OPTIONS, ...options };\n if (nativeOfflineAudioContext === null) {\n nativeOfflineAudioContext = new nativeOfflineAudioContextConstructor(1, 1, 44100);\n }\n /*\n * Bug #99: Firefox does not throw a NotSupportedError when the numberOfChannels is zero. But it only does it when using the\n * factory function. But since Firefox also supports the constructor everything should be fine.\n */\n const audioBuffer = nativeAudioBufferConstructor !== null &&\n cacheTestResult(testNativeAudioBufferConstructorSupport, testNativeAudioBufferConstructorSupport)\n ? new nativeAudioBufferConstructor({ length, numberOfChannels, sampleRate })\n : nativeOfflineAudioContext.createBuffer(numberOfChannels, length, sampleRate);\n // Bug #99: Safari does not throw an error when the numberOfChannels is zero.\n if (audioBuffer.numberOfChannels === 0) {\n throw createNotSupportedError();\n }\n // Bug #5: Safari does not support copyFromChannel() and copyToChannel().\n // Bug #100: Safari does throw a wrong error when calling getChannelData() with an out-of-bounds value.\n if (typeof audioBuffer.copyFromChannel !== 'function') {\n wrapAudioBufferCopyChannelMethods(audioBuffer);\n wrapAudioBufferGetChannelDataMethod(audioBuffer);\n // Bug #157: Firefox does not allow the bufferOffset to be out-of-bounds.\n }\n else if (!cacheTestResult(testAudioBufferCopyChannelMethodsOutOfBoundsSupport, () => testAudioBufferCopyChannelMethodsOutOfBoundsSupport(audioBuffer))) {\n wrapAudioBufferCopyChannelMethodsOutOfBounds(audioBuffer);\n }\n audioBufferStore.add(audioBuffer);\n /*\n * This does violate all good pratices but it is necessary to allow this AudioBuffer to be used with native\n * (Offline)AudioContexts.\n */\n return audioBuffer;\n }\n static [Symbol.hasInstance](instance) {\n return ((instance !== null && typeof instance === 'object' && Object.getPrototypeOf(instance) === AudioBuffer.prototype) ||\n audioBufferStore.has(instance));\n }\n };\n};\n//# sourceMappingURL=audio-buffer-constructor.js.map","export const MOST_NEGATIVE_SINGLE_FLOAT = -3.4028234663852886e38;\nexport const MOST_POSITIVE_SINGLE_FLOAT = -MOST_NEGATIVE_SINGLE_FLOAT;\n//# sourceMappingURL=constants.js.map","import { ACTIVE_AUDIO_NODE_STORE } from '../globals';\nexport const isActiveAudioNode = (audioNode) => ACTIVE_AUDIO_NODE_STORE.has(audioNode);\n//# sourceMappingURL=is-active-audio-node.js.map","import { MOST_NEGATIVE_SINGLE_FLOAT, MOST_POSITIVE_SINGLE_FLOAT } from '../constants';\nimport { isActiveAudioNode } from '../helpers/is-active-audio-node';\nimport { setInternalStateToActive } from '../helpers/set-internal-state-to-active';\nimport { setInternalStateToPassive } from '../helpers/set-internal-state-to-passive';\nconst DEFAULT_OPTIONS = {\n buffer: null,\n channelCount: 2,\n channelCountMode: 'max',\n channelInterpretation: 'speakers',\n // Bug #149: Safari does not yet support the detune AudioParam.\n loop: false,\n loopEnd: 0,\n loopStart: 0,\n playbackRate: 1\n};\nexport const createAudioBufferSourceNodeConstructor = (audioNodeConstructor, createAudioBufferSourceNodeRenderer, createAudioParam, createInvalidStateError, createNativeAudioBufferSourceNode, getNativeContext, isNativeOfflineAudioContext, wrapEventListener) => {\n return class AudioBufferSourceNode extends audioNodeConstructor {\n constructor(context, options) {\n const nativeContext = getNativeContext(context);\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n const nativeAudioBufferSourceNode = createNativeAudioBufferSourceNode(nativeContext, mergedOptions);\n const isOffline = isNativeOfflineAudioContext(nativeContext);\n const audioBufferSourceNodeRenderer = ((isOffline ? createAudioBufferSourceNodeRenderer() : null));\n super(context, false, nativeAudioBufferSourceNode, audioBufferSourceNodeRenderer);\n this._audioBufferSourceNodeRenderer = audioBufferSourceNodeRenderer;\n this._isBufferNullified = false;\n this._isBufferSet = mergedOptions.buffer !== null;\n this._nativeAudioBufferSourceNode = nativeAudioBufferSourceNode;\n this._onended = null;\n // Bug #73: Safari does not export the correct values for maxValue and minValue.\n this._playbackRate = createAudioParam(this, isOffline, nativeAudioBufferSourceNode.playbackRate, MOST_POSITIVE_SINGLE_FLOAT, MOST_NEGATIVE_SINGLE_FLOAT);\n }\n get buffer() {\n if (this._isBufferNullified) {\n return null;\n }\n return this._nativeAudioBufferSourceNode.buffer;\n }\n set buffer(value) {\n this._nativeAudioBufferSourceNode.buffer = value;\n // Bug #72: Only Chrome, Edge & Opera do not allow to reassign the buffer yet.\n if (value !== null) {\n if (this._isBufferSet) {\n throw createInvalidStateError();\n }\n this._isBufferSet = true;\n }\n }\n get loop() {\n return this._nativeAudioBufferSourceNode.loop;\n }\n set loop(value) {\n this._nativeAudioBufferSourceNode.loop = value;\n }\n get loopEnd() {\n return this._nativeAudioBufferSourceNode.loopEnd;\n }\n set loopEnd(value) {\n this._nativeAudioBufferSourceNode.loopEnd = value;\n }\n get loopStart() {\n return this._nativeAudioBufferSourceNode.loopStart;\n }\n set loopStart(value) {\n this._nativeAudioBufferSourceNode.loopStart = value;\n }\n get onended() {\n return this._onended;\n }\n set onended(value) {\n const wrappedListener = typeof value === 'function' ? wrapEventListener(this, value) : null;\n this._nativeAudioBufferSourceNode.onended = wrappedListener;\n const nativeOnEnded = this._nativeAudioBufferSourceNode.onended;\n this._onended = nativeOnEnded !== null && nativeOnEnded === wrappedListener ? value : nativeOnEnded;\n }\n get playbackRate() {\n return this._playbackRate;\n }\n start(when = 0, offset = 0, duration) {\n this._nativeAudioBufferSourceNode.start(when, offset, duration);\n if (this._audioBufferSourceNodeRenderer !== null) {\n this._audioBufferSourceNodeRenderer.start = duration === undefined ? [when, offset] : [when, offset, duration];\n }\n if (this.context.state !== 'closed') {\n setInternalStateToActive(this);\n const resetInternalStateToPassive = () => {\n this._nativeAudioBufferSourceNode.removeEventListener('ended', resetInternalStateToPassive);\n if (isActiveAudioNode(this)) {\n setInternalStateToPassive(this);\n }\n };\n this._nativeAudioBufferSourceNode.addEventListener('ended', resetInternalStateToPassive);\n }\n }\n stop(when = 0) {\n this._nativeAudioBufferSourceNode.stop(when);\n if (this._audioBufferSourceNodeRenderer !== null) {\n this._audioBufferSourceNodeRenderer.stop = when;\n }\n }\n };\n};\n//# sourceMappingURL=audio-buffer-source-node-constructor.js.map","import { AUDIO_NODE_CONNECTIONS_STORE } from '../globals';\nimport { getValueForKey } from './get-value-for-key';\nexport const getAudioNodeConnections = (audioNode) => {\n return getValueForKey(AUDIO_NODE_CONNECTIONS_STORE, audioNode);\n};\n//# sourceMappingURL=get-audio-node-connections.js.map","import { AUDIO_PARAM_CONNECTIONS_STORE } from '../globals';\nimport { getValueForKey } from './get-value-for-key';\nexport const getAudioParamConnections = (audioParam) => {\n return getValueForKey(AUDIO_PARAM_CONNECTIONS_STORE, audioParam);\n};\n//# sourceMappingURL=get-audio-param-connections.js.map","import { isAudioBufferSourceNode } from '../guards/audio-buffer-source-node';\nimport { isAudioWorkletNode } from '../guards/audio-worklet-node';\nimport { isBiquadFilterNode } from '../guards/biquad-filter-node';\nimport { isConstantSourceNode } from '../guards/constant-source-node';\nimport { isGainNode } from '../guards/gain-node';\nimport { isOscillatorNode } from '../guards/oscillator-node';\nimport { isStereoPannerNode } from '../guards/stereo-panner-node';\nimport { getAudioNodeConnections } from './get-audio-node-connections';\nimport { getAudioParamConnections } from './get-audio-param-connections';\nimport { isActiveAudioNode } from './is-active-audio-node';\nimport { setInternalStateToPassive } from './set-internal-state-to-passive';\nexport const deactivateActiveAudioNodeInputConnections = (audioNode, trace) => {\n const { activeInputs } = getAudioNodeConnections(audioNode);\n activeInputs.forEach((connections) => connections.forEach(([source]) => {\n if (!trace.includes(audioNode)) {\n deactivateActiveAudioNodeInputConnections(source, [...trace, audioNode]);\n }\n }));\n const audioParams = isAudioBufferSourceNode(audioNode)\n ? [\n // Bug #149: Safari does not yet support the detune AudioParam.\n audioNode.playbackRate\n ]\n : isAudioWorkletNode(audioNode)\n ? Array.from(audioNode.parameters.values())\n : isBiquadFilterNode(audioNode)\n ? [audioNode.Q, audioNode.detune, audioNode.frequency, audioNode.gain]\n : isConstantSourceNode(audioNode)\n ? [audioNode.offset]\n : isGainNode(audioNode)\n ? [audioNode.gain]\n : isOscillatorNode(audioNode)\n ? [audioNode.detune, audioNode.frequency]\n : isStereoPannerNode(audioNode)\n ? [audioNode.pan]\n : [];\n for (const audioParam of audioParams) {\n const audioParamConnections = getAudioParamConnections(audioParam);\n if (audioParamConnections !== undefined) {\n audioParamConnections.activeInputs.forEach(([source]) => deactivateActiveAudioNodeInputConnections(source, trace));\n }\n }\n if (isActiveAudioNode(audioNode)) {\n setInternalStateToPassive(audioNode);\n }\n};\n//# sourceMappingURL=deactivate-active-audio-node-input-connections.js.map","export const isAudioBufferSourceNode = (audioNode) => {\n return 'playbackRate' in audioNode;\n};\n//# sourceMappingURL=audio-buffer-source-node.js.map","export const isBiquadFilterNode = (audioNode) => {\n return 'frequency' in audioNode && 'gain' in audioNode;\n};\n//# sourceMappingURL=biquad-filter-node.js.map","export const isConstantSourceNode = (audioNode) => {\n return 'offset' in audioNode;\n};\n//# sourceMappingURL=constant-source-node.js.map","export const isGainNode = (audioNode) => {\n return !('frequency' in audioNode) && 'gain' in audioNode;\n};\n//# sourceMappingURL=gain-node.js.map","export const isOscillatorNode = (audioNode) => {\n return 'detune' in audioNode && 'frequency' in audioNode;\n};\n//# sourceMappingURL=oscillator-node.js.map","export const isStereoPannerNode = (audioNode) => {\n return 'pan' in audioNode;\n};\n//# sourceMappingURL=stereo-panner-node.js.map","import { deactivateActiveAudioNodeInputConnections } from './deactivate-active-audio-node-input-connections';\nexport const deactivateAudioGraph = (context) => {\n deactivateActiveAudioNodeInputConnections(context.destination, []);\n};\n//# sourceMappingURL=deactivate-audio-graph.js.map","export const isValidLatencyHint = (latencyHint) => {\n return (latencyHint === undefined ||\n typeof latencyHint === 'number' ||\n (typeof latencyHint === 'string' && (latencyHint === 'balanced' || latencyHint === 'interactive' || latencyHint === 'playback')));\n};\n//# sourceMappingURL=is-valid-latency-hint.js.map","export const isAudioNode = (audioNodeOrAudioParam) => {\n return 'context' in audioNodeOrAudioParam;\n};\n//# sourceMappingURL=audio-node.js.map","import { isAudioNode } from './audio-node';\nexport const isAudioNodeOutputConnection = (outputConnection) => {\n return isAudioNode(outputConnection[0]);\n};\n//# sourceMappingURL=audio-node-output-connection.js.map","export const insertElementInSet = (set, element, predicate, ignoreDuplicates) => {\n for (const lmnt of set) {\n if (predicate(lmnt)) {\n if (ignoreDuplicates) {\n return false;\n }\n throw Error('The set contains at least one similar element.');\n }\n }\n set.add(element);\n return true;\n};\n//# sourceMappingURL=insert-element-in-set.js.map","import { insertElementInSet } from './insert-element-in-set';\nexport const addActiveInputConnectionToAudioParam = (activeInputs, source, [output, eventListener], ignoreDuplicates) => {\n insertElementInSet(activeInputs, [source, output, eventListener], (activeInputConnection) => activeInputConnection[0] === source && activeInputConnection[1] === output, ignoreDuplicates);\n};\n//# sourceMappingURL=add-active-input-connection-to-audio-param.js.map","import { insertElementInSet } from './insert-element-in-set';\nexport const addPassiveInputConnectionToAudioParam = (passiveInputs, [source, output, eventListener], ignoreDuplicates) => {\n const passiveInputConnections = passiveInputs.get(source);\n if (passiveInputConnections === undefined) {\n passiveInputs.set(source, new Set([[output, eventListener]]));\n }\n else {\n insertElementInSet(passiveInputConnections, [output, eventListener], (passiveInputConnection) => passiveInputConnection[0] === output, ignoreDuplicates);\n }\n};\n//# sourceMappingURL=add-passive-input-connection-to-audio-param.js.map","export const isNativeAudioNodeFaker = (nativeAudioNodeOrNativeAudioNodeFaker) => {\n return 'inputs' in nativeAudioNodeOrNativeAudioNodeFaker;\n};\n//# sourceMappingURL=native-audio-node-faker.js.map","import { isNativeAudioNodeFaker } from '../guards/native-audio-node-faker';\nexport const connectNativeAudioNodeToNativeAudioNode = (nativeSourceAudioNode, nativeDestinationAudioNode, output, input) => {\n if (isNativeAudioNodeFaker(nativeDestinationAudioNode)) {\n const fakeNativeDestinationAudioNode = nativeDestinationAudioNode.inputs[input];\n nativeSourceAudioNode.connect(fakeNativeDestinationAudioNode, output, 0);\n return [fakeNativeDestinationAudioNode, output, 0];\n }\n nativeSourceAudioNode.connect(nativeDestinationAudioNode, output, input);\n return [nativeDestinationAudioNode, output, input];\n};\n//# sourceMappingURL=connect-native-audio-node-to-native-audio-node.js.map","export const deleteActiveInputConnection = (activeInputConnections, source, output) => {\n for (const activeInputConnection of activeInputConnections) {\n if (activeInputConnection[0] === source && activeInputConnection[1] === output) {\n activeInputConnections.delete(activeInputConnection);\n return activeInputConnection;\n }\n }\n return null;\n};\n//# sourceMappingURL=delete-active-input-connection.js.map","import { getEventListenersOfAudioNode } from './get-event-listeners-of-audio-node';\nexport const deleteEventListenerOfAudioNode = (audioNode, eventListener) => {\n const eventListeners = getEventListenersOfAudioNode(audioNode);\n if (!eventListeners.delete(eventListener)) {\n throw new Error('Missing the expected event listener.');\n }\n};\n//# sourceMappingURL=delete-event-listeners-of-audio-node.js.map","import { getValueForKey } from './get-value-for-key';\nimport { pickElementFromSet } from './pick-element-from-set';\nexport const deletePassiveInputConnectionToAudioParam = (passiveInputs, source, output) => {\n const passiveInputConnections = getValueForKey(passiveInputs, source);\n const matchingConnection = pickElementFromSet(passiveInputConnections, (passiveInputConnection) => passiveInputConnection[0] === output);\n if (passiveInputConnections.size === 0) {\n passiveInputs.delete(source);\n }\n return matchingConnection;\n};\n//# sourceMappingURL=delete-passive-input-connection-to-audio-param.js.map","import { isNativeAudioNodeFaker } from '../guards/native-audio-node-faker';\nexport const disconnectNativeAudioNodeFromNativeAudioNode = (nativeSourceAudioNode, nativeDestinationAudioNode, output, input) => {\n if (isNativeAudioNodeFaker(nativeDestinationAudioNode)) {\n nativeSourceAudioNode.disconnect(nativeDestinationAudioNode.inputs[input], output, 0);\n }\n else {\n nativeSourceAudioNode.disconnect(nativeDestinationAudioNode, output, input);\n }\n};\n//# sourceMappingURL=disconnect-native-audio-node-from-native-audio-node.js.map","import { AUDIO_NODE_STORE } from '../globals';\nimport { getValueForKey } from './get-value-for-key';\nexport const getNativeAudioNode = (audioNode) => {\n return getValueForKey(AUDIO_NODE_STORE, audioNode);\n};\n//# sourceMappingURL=get-native-audio-node.js.map","import { AUDIO_PARAM_STORE } from '../globals';\nimport { getValueForKey } from './get-value-for-key';\nexport const getNativeAudioParam = (audioParam) => {\n return getValueForKey(AUDIO_PARAM_STORE, audioParam);\n};\n//# sourceMappingURL=get-native-audio-param.js.map","import { CYCLE_COUNTERS } from '../globals';\nexport const isPartOfACycle = (audioNode) => {\n return CYCLE_COUNTERS.has(audioNode);\n};\n//# sourceMappingURL=is-part-of-a-cycle.js.map","import { ACTIVE_AUDIO_NODE_STORE } from '../globals';\nexport const isPassiveAudioNode = (audioNode) => {\n return !ACTIVE_AUDIO_NODE_STORE.has(audioNode);\n};\n//# sourceMappingURL=is-passive-audio-node.js.map","export const testAudioNodeDisconnectMethodSupport = (nativeAudioContext) => {\n return new Promise((resolve) => {\n const analyzer = nativeAudioContext.createScriptProcessor(256, 1, 1);\n const dummy = nativeAudioContext.createGain();\n // Bug #95: Safari does not play one sample buffers.\n const ones = nativeAudioContext.createBuffer(1, 2, 44100);\n const channelData = ones.getChannelData(0);\n channelData[0] = 1;\n channelData[1] = 1;\n const source = nativeAudioContext.createBufferSource();\n source.buffer = ones;\n source.loop = true;\n source.connect(analyzer).connect(nativeAudioContext.destination);\n source.connect(dummy);\n source.disconnect(dummy);\n // tslint:disable-next-line:deprecation\n analyzer.onaudioprocess = (event) => {\n const chnnlDt = event.inputBuffer.getChannelData(0);\n if (Array.prototype.some.call(chnnlDt, (sample) => sample === 1)) {\n resolve(true);\n }\n else {\n resolve(false);\n }\n source.stop();\n analyzer.onaudioprocess = null; // tslint:disable-line:deprecation\n source.disconnect(analyzer);\n analyzer.disconnect(nativeAudioContext.destination);\n };\n source.start();\n });\n};\n//# sourceMappingURL=test-audio-node-disconnect-method-support.js.map","export const visitEachAudioNodeOnce = (cycles, visitor) => {\n const counts = new Map();\n for (const cycle of cycles) {\n for (const audioNode of cycle) {\n const count = counts.get(audioNode);\n counts.set(audioNode, count === undefined ? 1 : count + 1);\n }\n }\n counts.forEach((count, audioNode) => visitor(audioNode, count));\n};\n//# sourceMappingURL=visit-each-audio-node-once.js.map","export const isNativeAudioNode = (nativeAudioNodeOrAudioParam) => {\n return 'context' in nativeAudioNodeOrAudioParam;\n};\n//# sourceMappingURL=native-audio-node.js.map","import { AUDIO_NODE_STORE, EVENT_LISTENERS } from '../globals';\nimport { isAudioNode } from '../guards/audio-node';\nimport { isAudioNodeOutputConnection } from '../guards/audio-node-output-connection';\nimport { addActiveInputConnectionToAudioParam } from '../helpers/add-active-input-connection-to-audio-param';\nimport { addPassiveInputConnectionToAudioParam } from '../helpers/add-passive-input-connection-to-audio-param';\nimport { connectNativeAudioNodeToNativeAudioNode } from '../helpers/connect-native-audio-node-to-native-audio-node';\nimport { deleteActiveInputConnection } from '../helpers/delete-active-input-connection';\nimport { deleteActiveInputConnectionToAudioParam } from '../helpers/delete-active-input-connection-to-audio-param';\nimport { deleteEventListenerOfAudioNode } from '../helpers/delete-event-listeners-of-audio-node';\nimport { deletePassiveInputConnectionToAudioNode } from '../helpers/delete-passive-input-connection-to-audio-node';\nimport { deletePassiveInputConnectionToAudioParam } from '../helpers/delete-passive-input-connection-to-audio-param';\nimport { disconnectNativeAudioNodeFromNativeAudioNode } from '../helpers/disconnect-native-audio-node-from-native-audio-node';\nimport { getAudioNodeConnections } from '../helpers/get-audio-node-connections';\nimport { getAudioParamConnections } from '../helpers/get-audio-param-connections';\nimport { getEventListenersOfAudioNode } from '../helpers/get-event-listeners-of-audio-node';\nimport { getNativeAudioNode } from '../helpers/get-native-audio-node';\nimport { getNativeAudioParam } from '../helpers/get-native-audio-param';\nimport { insertElementInSet } from '../helpers/insert-element-in-set';\nimport { isActiveAudioNode } from '../helpers/is-active-audio-node';\nimport { isPartOfACycle } from '../helpers/is-part-of-a-cycle';\nimport { isPassiveAudioNode } from '../helpers/is-passive-audio-node';\nimport { setInternalStateToActive } from '../helpers/set-internal-state-to-active';\nimport { setInternalStateToPassiveWhenNecessary } from '../helpers/set-internal-state-to-passive-when-necessary';\nimport { testAudioNodeDisconnectMethodSupport } from '../helpers/test-audio-node-disconnect-method-support';\nimport { visitEachAudioNodeOnce } from '../helpers/visit-each-audio-node-once';\nimport { wrapAudioNodeDisconnectMethod } from '../helpers/wrap-audio-node-disconnect-method';\nconst addConnectionToAudioParamOfAudioContext = (source, destination, output, isOffline) => {\n const { activeInputs, passiveInputs } = getAudioParamConnections(destination);\n const { outputs } = getAudioNodeConnections(source);\n const eventListeners = getEventListenersOfAudioNode(source);\n const eventListener = (isActive) => {\n const nativeAudioNode = getNativeAudioNode(source);\n const nativeAudioParam = getNativeAudioParam(destination);\n if (isActive) {\n const partialConnection = deletePassiveInputConnectionToAudioParam(passiveInputs, source, output);\n addActiveInputConnectionToAudioParam(activeInputs, source, partialConnection, false);\n if (!isOffline && !isPartOfACycle(source)) {\n nativeAudioNode.connect(nativeAudioParam, output);\n }\n }\n else {\n const partialConnection = deleteActiveInputConnectionToAudioParam(activeInputs, source, output);\n addPassiveInputConnectionToAudioParam(passiveInputs, partialConnection, false);\n if (!isOffline && !isPartOfACycle(source)) {\n nativeAudioNode.disconnect(nativeAudioParam, output);\n }\n }\n };\n if (insertElementInSet(outputs, [destination, output], (outputConnection) => outputConnection[0] === destination && outputConnection[1] === output, true)) {\n eventListeners.add(eventListener);\n if (isActiveAudioNode(source)) {\n addActiveInputConnectionToAudioParam(activeInputs, source, [output, eventListener], true);\n }\n else {\n addPassiveInputConnectionToAudioParam(passiveInputs, [source, output, eventListener], true);\n }\n return true;\n }\n return false;\n};\nconst deleteInputConnectionOfAudioNode = (source, destination, output, input) => {\n const { activeInputs, passiveInputs } = getAudioNodeConnections(destination);\n const activeInputConnection = deleteActiveInputConnection(activeInputs[input], source, output);\n if (activeInputConnection === null) {\n const passiveInputConnection = deletePassiveInputConnectionToAudioNode(passiveInputs, source, output, input);\n return [passiveInputConnection[2], false];\n }\n return [activeInputConnection[2], true];\n};\nconst deleteInputConnectionOfAudioParam = (source, destination, output) => {\n const { activeInputs, passiveInputs } = getAudioParamConnections(destination);\n const activeInputConnection = deleteActiveInputConnection(activeInputs, source, output);\n if (activeInputConnection === null) {\n const passiveInputConnection = deletePassiveInputConnectionToAudioParam(passiveInputs, source, output);\n return [passiveInputConnection[1], false];\n }\n return [activeInputConnection[2], true];\n};\nconst deleteInputsOfAudioNode = (source, isOffline, destination, output, input) => {\n const [listener, isActive] = deleteInputConnectionOfAudioNode(source, destination, output, input);\n if (listener !== null) {\n deleteEventListenerOfAudioNode(source, listener);\n if (isActive && !isOffline && !isPartOfACycle(source)) {\n disconnectNativeAudioNodeFromNativeAudioNode(getNativeAudioNode(source), getNativeAudioNode(destination), output, input);\n }\n }\n if (isActiveAudioNode(destination)) {\n const { activeInputs } = getAudioNodeConnections(destination);\n setInternalStateToPassiveWhenNecessary(destination, activeInputs);\n }\n};\nconst deleteInputsOfAudioParam = (source, isOffline, destination, output) => {\n const [listener, isActive] = deleteInputConnectionOfAudioParam(source, destination, output);\n if (listener !== null) {\n deleteEventListenerOfAudioNode(source, listener);\n if (isActive && !isOffline && !isPartOfACycle(source)) {\n getNativeAudioNode(source).disconnect(getNativeAudioParam(destination), output);\n }\n }\n};\nconst deleteAnyConnection = (source, isOffline) => {\n const audioNodeConnectionsOfSource = getAudioNodeConnections(source);\n const destinations = [];\n for (const outputConnection of audioNodeConnectionsOfSource.outputs) {\n if (isAudioNodeOutputConnection(outputConnection)) {\n deleteInputsOfAudioNode(source, isOffline, ...outputConnection);\n }\n else {\n deleteInputsOfAudioParam(source, isOffline, ...outputConnection);\n }\n destinations.push(outputConnection[0]);\n }\n audioNodeConnectionsOfSource.outputs.clear();\n return destinations;\n};\nconst deleteConnectionAtOutput = (source, isOffline, output) => {\n const audioNodeConnectionsOfSource = getAudioNodeConnections(source);\n const destinations = [];\n for (const outputConnection of audioNodeConnectionsOfSource.outputs) {\n if (outputConnection[1] === output) {\n if (isAudioNodeOutputConnection(outputConnection)) {\n deleteInputsOfAudioNode(source, isOffline, ...outputConnection);\n }\n else {\n deleteInputsOfAudioParam(source, isOffline, ...outputConnection);\n }\n destinations.push(outputConnection[0]);\n audioNodeConnectionsOfSource.outputs.delete(outputConnection);\n }\n }\n return destinations;\n};\nconst deleteConnectionToDestination = (source, isOffline, destination, output, input) => {\n const audioNodeConnectionsOfSource = getAudioNodeConnections(source);\n return Array.from(audioNodeConnectionsOfSource.outputs)\n .filter((outputConnection) => outputConnection[0] === destination &&\n (output === undefined || outputConnection[1] === output) &&\n (input === undefined || outputConnection[2] === input))\n .map((outputConnection) => {\n if (isAudioNodeOutputConnection(outputConnection)) {\n deleteInputsOfAudioNode(source, isOffline, ...outputConnection);\n }\n else {\n deleteInputsOfAudioParam(source, isOffline, ...outputConnection);\n }\n audioNodeConnectionsOfSource.outputs.delete(outputConnection);\n return outputConnection[0];\n });\n};\nexport const createAudioNodeConstructor = (addAudioNodeConnections, addConnectionToAudioNode, cacheTestResult, createIncrementCycleCounter, createIndexSizeError, createInvalidAccessError, createNotSupportedError, decrementCycleCounter, detectCycles, eventTargetConstructor, getNativeContext, isNativeAudioContext, isNativeAudioNode, isNativeAudioParam, isNativeOfflineAudioContext) => {\n return class AudioNode extends eventTargetConstructor {\n constructor(context, isActive, nativeAudioNode, audioNodeRenderer) {\n super(nativeAudioNode);\n this._context = context;\n this._nativeAudioNode = nativeAudioNode;\n const nativeContext = getNativeContext(context);\n // Bug #12: Safari does not support to disconnect a specific destination.\n if (isNativeAudioContext(nativeContext) &&\n true !==\n cacheTestResult(testAudioNodeDisconnectMethodSupport, () => {\n return testAudioNodeDisconnectMethodSupport(nativeContext);\n })) {\n wrapAudioNodeDisconnectMethod(nativeAudioNode);\n }\n AUDIO_NODE_STORE.set(this, nativeAudioNode);\n EVENT_LISTENERS.set(this, new Set());\n if (context.state !== 'closed' && isActive) {\n setInternalStateToActive(this);\n }\n addAudioNodeConnections(this, audioNodeRenderer, nativeAudioNode);\n }\n get channelCount() {\n return this._nativeAudioNode.channelCount;\n }\n set channelCount(value) {\n this._nativeAudioNode.channelCount = value;\n }\n get channelCountMode() {\n return this._nativeAudioNode.channelCountMode;\n }\n set channelCountMode(value) {\n this._nativeAudioNode.channelCountMode = value;\n }\n get channelInterpretation() {\n return this._nativeAudioNode.channelInterpretation;\n }\n set channelInterpretation(value) {\n this._nativeAudioNode.channelInterpretation = value;\n }\n get context() {\n return this._context;\n }\n get numberOfInputs() {\n return this._nativeAudioNode.numberOfInputs;\n }\n get numberOfOutputs() {\n return this._nativeAudioNode.numberOfOutputs;\n }\n // tslint:disable-next-line:invalid-void\n connect(destination, output = 0, input = 0) {\n // Bug #174: Safari does expose a wrong numberOfOutputs for MediaStreamAudioDestinationNodes.\n if (output < 0 || output >= this._nativeAudioNode.numberOfOutputs) {\n throw createIndexSizeError();\n }\n const nativeContext = getNativeContext(this._context);\n const isOffline = isNativeOfflineAudioContext(nativeContext);\n if (isNativeAudioNode(destination) || isNativeAudioParam(destination)) {\n throw createInvalidAccessError();\n }\n if (isAudioNode(destination)) {\n const nativeDestinationAudioNode = getNativeAudioNode(destination);\n try {\n const connection = connectNativeAudioNodeToNativeAudioNode(this._nativeAudioNode, nativeDestinationAudioNode, output, input);\n const isPassive = isPassiveAudioNode(this);\n if (isOffline || isPassive) {\n this._nativeAudioNode.disconnect(...connection);\n }\n if (this.context.state !== 'closed' && !isPassive && isPassiveAudioNode(destination)) {\n setInternalStateToActive(destination);\n }\n }\n catch (err) {\n // Bug #41: Safari does not throw the correct exception so far.\n if (err.code === 12) {\n throw createInvalidAccessError();\n }\n throw err;\n }\n const isNewConnectionToAudioNode = addConnectionToAudioNode(this, destination, output, input, isOffline);\n // Bug #164: Only Firefox detects cycles so far.\n if (isNewConnectionToAudioNode) {\n const cycles = detectCycles([this], destination);\n visitEachAudioNodeOnce(cycles, createIncrementCycleCounter(isOffline));\n }\n return destination;\n }\n const nativeAudioParam = getNativeAudioParam(destination);\n /*\n * Bug #147 & #153: Safari does not support to connect an input signal to the playbackRate AudioParam of an\n * AudioBufferSourceNode. This can't be easily detected and that's why the outdated name property is used here to identify\n * Safari.\n */\n if (nativeAudioParam.name === 'playbackRate') {\n throw createNotSupportedError();\n }\n try {\n this._nativeAudioNode.connect(nativeAudioParam, output);\n if (isOffline || isPassiveAudioNode(this)) {\n this._nativeAudioNode.disconnect(nativeAudioParam, output);\n }\n }\n catch (err) {\n // Bug #58: Only Firefox does throw an InvalidStateError yet.\n if (err.code === 12) {\n throw createInvalidAccessError();\n }\n throw err;\n }\n const isNewConnectionToAudioParam = addConnectionToAudioParamOfAudioContext(this, destination, output, isOffline);\n // Bug #164: Only Firefox detects cycles so far.\n if (isNewConnectionToAudioParam) {\n const cycles = detectCycles([this], destination);\n visitEachAudioNodeOnce(cycles, createIncrementCycleCounter(isOffline));\n }\n }\n disconnect(destinationOrOutput, output, input) {\n let destinations;\n const nativeContext = getNativeContext(this._context);\n const isOffline = isNativeOfflineAudioContext(nativeContext);\n if (destinationOrOutput === undefined) {\n destinations = deleteAnyConnection(this, isOffline);\n }\n else if (typeof destinationOrOutput === 'number') {\n if (destinationOrOutput < 0 || destinationOrOutput >= this.numberOfOutputs) {\n throw createIndexSizeError();\n }\n destinations = deleteConnectionAtOutput(this, isOffline, destinationOrOutput);\n }\n else {\n if (output !== undefined && (output < 0 || output >= this.numberOfOutputs)) {\n throw createIndexSizeError();\n }\n if (isAudioNode(destinationOrOutput) && input !== undefined && (input < 0 || input >= destinationOrOutput.numberOfInputs)) {\n throw createIndexSizeError();\n }\n destinations = deleteConnectionToDestination(this, isOffline, destinationOrOutput, output, input);\n if (destinations.length === 0) {\n throw createInvalidAccessError();\n }\n }\n // Bug #164: Only Firefox detects cycles so far.\n for (const destination of destinations) {\n const cycles = detectCycles([this], destination);\n visitEachAudioNodeOnce(cycles, decrementCycleCounter);\n }\n }\n };\n};\n//# sourceMappingURL=audio-node-constructor.js.map","import { pickElementFromSet } from './pick-element-from-set';\nexport const deleteActiveInputConnectionToAudioParam = (activeInputs, source, output) => {\n return pickElementFromSet(activeInputs, (activeInputConnection) => activeInputConnection[0] === source && activeInputConnection[1] === output);\n};\n//# sourceMappingURL=delete-active-input-connection-to-audio-param.js.map","export class ReadOnlyMap {\n constructor(parameters) {\n this._map = new Map(parameters);\n }\n get size() {\n return this._map.size;\n }\n entries() {\n return this._map.entries();\n }\n forEach(callback, thisArg = null) {\n return this._map.forEach((value, key) => callback.call(thisArg, value, key, this));\n }\n get(name) {\n return this._map.get(name);\n }\n has(name) {\n return this._map.has(name);\n }\n keys() {\n return this._map.keys();\n }\n values() {\n return this._map.values();\n }\n}\n//# sourceMappingURL=read-only-map.js.map","import { NODE_NAME_TO_PROCESSOR_CONSTRUCTOR_MAPS } from '../globals';\nimport { ReadOnlyMap } from '../read-only-map';\nconst DEFAULT_OPTIONS = {\n channelCount: 2,\n // Bug #61: The channelCountMode should be 'max' according to the spec but is set to 'explicit' to achieve consistent behavior.\n channelCountMode: 'explicit',\n channelInterpretation: 'speakers',\n numberOfInputs: 1,\n numberOfOutputs: 1,\n parameterData: {},\n processorOptions: {}\n};\nexport const createAudioWorkletNodeConstructor = (addUnrenderedAudioWorkletNode, audioNodeConstructor, createAudioParam, createAudioWorkletNodeRenderer, createNativeAudioWorkletNode, getAudioNodeConnections, getBackupOfflineAudioContext, getNativeContext, isNativeOfflineAudioContext, nativeAudioWorkletNodeConstructor, sanitizeAudioWorkletNodeOptions, setActiveAudioWorkletNodeInputs, wrapEventListener) => {\n return class AudioWorkletNode extends audioNodeConstructor {\n constructor(context, name, options) {\n var _a;\n const nativeContext = getNativeContext(context);\n const isOffline = isNativeOfflineAudioContext(nativeContext);\n const mergedOptions = sanitizeAudioWorkletNodeOptions({ ...DEFAULT_OPTIONS, ...options });\n const nodeNameToProcessorConstructorMap = NODE_NAME_TO_PROCESSOR_CONSTRUCTOR_MAPS.get(nativeContext);\n const processorConstructor = nodeNameToProcessorConstructorMap === null || nodeNameToProcessorConstructorMap === void 0 ? void 0 : nodeNameToProcessorConstructorMap.get(name);\n // Bug #186: Chrome, Edge and Opera do not allow to create an AudioWorkletNode on a closed AudioContext.\n const nativeContextOrBackupOfflineAudioContext = isOffline || nativeContext.state !== 'closed'\n ? nativeContext\n : (_a = getBackupOfflineAudioContext(nativeContext)) !== null && _a !== void 0 ? _a : nativeContext;\n const nativeAudioWorkletNode = createNativeAudioWorkletNode(nativeContextOrBackupOfflineAudioContext, isOffline ? null : context.baseLatency, nativeAudioWorkletNodeConstructor, name, processorConstructor, mergedOptions);\n const audioWorkletNodeRenderer = ((isOffline ? createAudioWorkletNodeRenderer(name, mergedOptions, processorConstructor) : null));\n /*\n * @todo Add a mechanism to switch an AudioWorkletNode to passive once the process() function of the AudioWorkletProcessor\n * returns false.\n */\n super(context, true, nativeAudioWorkletNode, audioWorkletNodeRenderer);\n const parameters = [];\n nativeAudioWorkletNode.parameters.forEach((nativeAudioParam, nm) => {\n const audioParam = createAudioParam(this, isOffline, nativeAudioParam);\n parameters.push([nm, audioParam]);\n });\n this._nativeAudioWorkletNode = nativeAudioWorkletNode;\n this._onprocessorerror = null;\n this._parameters = new ReadOnlyMap(parameters);\n /*\n * Bug #86 & #87: Invoking the renderer of an AudioWorkletNode might be necessary if it has no direct or indirect connection to\n * the destination.\n */\n if (isOffline) {\n addUnrenderedAudioWorkletNode(nativeContext, this);\n }\n const { activeInputs } = getAudioNodeConnections(this);\n setActiveAudioWorkletNodeInputs(nativeAudioWorkletNode, activeInputs);\n }\n get onprocessorerror() {\n return this._onprocessorerror;\n }\n set onprocessorerror(value) {\n const wrappedListener = typeof value === 'function' ? wrapEventListener(this, value) : null;\n this._nativeAudioWorkletNode.onprocessorerror = wrappedListener;\n const nativeOnProcessorError = this._nativeAudioWorkletNode.onprocessorerror;\n this._onprocessorerror =\n nativeOnProcessorError !== null && nativeOnProcessorError === wrappedListener\n ? value\n : nativeOnProcessorError;\n }\n get parameters() {\n if (this._parameters === null) {\n // @todo The definition that TypeScript uses of the AudioParamMap is lacking many methods.\n return this._nativeAudioWorkletNode.parameters;\n }\n return this._parameters;\n }\n get port() {\n return this._nativeAudioWorkletNode.port;\n }\n };\n};\n//# sourceMappingURL=audio-worklet-node-constructor.js.map","export function copyFromChannel(audioBuffer, \n// @todo There is currently no way to define something like { [ key: number | string ]: Float32Array }\nparent, key, channelNumber, bufferOffset) {\n if (typeof audioBuffer.copyFromChannel === 'function') {\n // The byteLength will be 0 when the ArrayBuffer was transferred.\n if (parent[key].byteLength === 0) {\n parent[key] = new Float32Array(128);\n }\n audioBuffer.copyFromChannel(parent[key], channelNumber, bufferOffset);\n // Bug #5: Safari does not support copyFromChannel().\n }\n else {\n const channelData = audioBuffer.getChannelData(channelNumber);\n // The byteLength will be 0 when the ArrayBuffer was transferred.\n if (parent[key].byteLength === 0) {\n parent[key] = channelData.slice(bufferOffset, bufferOffset + 128);\n }\n else {\n const slicedInput = new Float32Array(channelData.buffer, bufferOffset * Float32Array.BYTES_PER_ELEMENT, 128);\n parent[key].set(slicedInput);\n }\n }\n}\n//# sourceMappingURL=copy-from-channel.js.map","export const copyToChannel = (audioBuffer, parent, key, channelNumber, bufferOffset) => {\n if (typeof audioBuffer.copyToChannel === 'function') {\n // The byteLength will be 0 when the ArrayBuffer was transferred.\n if (parent[key].byteLength !== 0) {\n audioBuffer.copyToChannel(parent[key], channelNumber, bufferOffset);\n }\n // Bug #5: Safari does not support copyToChannel().\n }\n else {\n // The byteLength will be 0 when the ArrayBuffer was transferred.\n if (parent[key].byteLength !== 0) {\n audioBuffer.getChannelData(channelNumber).set(parent[key], bufferOffset);\n }\n }\n};\n//# sourceMappingURL=copy-to-channel.js.map","export const createNestedArrays = (x, y) => {\n const arrays = [];\n for (let i = 0; i < x; i += 1) {\n const array = [];\n const length = typeof y === 'number' ? y : y[i];\n for (let j = 0; j < length; j += 1) {\n array.push(new Float32Array(128));\n }\n arrays.push(array);\n }\n return arrays;\n};\n//# sourceMappingURL=create-nested-arrays.js.map","import { copyFromChannel } from '../helpers/copy-from-channel';\nimport { copyToChannel } from '../helpers/copy-to-channel';\nimport { createNestedArrays } from '../helpers/create-nested-arrays';\nimport { getAudioNodeConnections } from '../helpers/get-audio-node-connections';\nimport { getAudioWorkletProcessor } from '../helpers/get-audio-worklet-processor';\nimport { isOwnedByContext } from '../helpers/is-owned-by-context';\nconst processBuffer = async (proxy, renderedBuffer, nativeOfflineAudioContext, options, outputChannelCount, processorConstructor, exposeCurrentFrameAndCurrentTime) => {\n // Ceil the length to the next full render quantum.\n // Bug #17: Safari does not yet expose the length.\n const length = renderedBuffer === null ? Math.ceil(proxy.context.length / 128) * 128 : renderedBuffer.length;\n const numberOfInputChannels = options.channelCount * options.numberOfInputs;\n const numberOfOutputChannels = outputChannelCount.reduce((sum, value) => sum + value, 0);\n const processedBuffer = numberOfOutputChannels === 0\n ? null\n : nativeOfflineAudioContext.createBuffer(numberOfOutputChannels, length, nativeOfflineAudioContext.sampleRate);\n if (processorConstructor === undefined) {\n throw new Error('Missing the processor constructor.');\n }\n const audioNodeConnections = getAudioNodeConnections(proxy);\n const audioWorkletProcessor = await getAudioWorkletProcessor(nativeOfflineAudioContext, proxy);\n const inputs = createNestedArrays(options.numberOfInputs, options.channelCount);\n const outputs = createNestedArrays(options.numberOfOutputs, outputChannelCount);\n const parameters = Array.from(proxy.parameters.keys()).reduce((prmtrs, name) => ({ ...prmtrs, [name]: new Float32Array(128) }), {});\n for (let i = 0; i < length; i += 128) {\n if (options.numberOfInputs > 0 && renderedBuffer !== null) {\n for (let j = 0; j < options.numberOfInputs; j += 1) {\n for (let k = 0; k < options.channelCount; k += 1) {\n copyFromChannel(renderedBuffer, inputs[j], k, k, i);\n }\n }\n }\n if (processorConstructor.parameterDescriptors !== undefined && renderedBuffer !== null) {\n processorConstructor.parameterDescriptors.forEach(({ name }, index) => {\n copyFromChannel(renderedBuffer, parameters, name, numberOfInputChannels + index, i);\n });\n }\n for (let j = 0; j < options.numberOfInputs; j += 1) {\n for (let k = 0; k < outputChannelCount[j]; k += 1) {\n // The byteLength will be 0 when the ArrayBuffer was transferred.\n if (outputs[j][k].byteLength === 0) {\n outputs[j][k] = new Float32Array(128);\n }\n }\n }\n try {\n const potentiallyEmptyInputs = inputs.map((input, index) => {\n if (audioNodeConnections.activeInputs[index].size === 0) {\n return [];\n }\n return input;\n });\n const activeSourceFlag = exposeCurrentFrameAndCurrentTime(i / nativeOfflineAudioContext.sampleRate, nativeOfflineAudioContext.sampleRate, () => audioWorkletProcessor.process(potentiallyEmptyInputs, outputs, parameters));\n if (processedBuffer !== null) {\n for (let j = 0, outputChannelSplitterNodeOutput = 0; j < options.numberOfOutputs; j += 1) {\n for (let k = 0; k < outputChannelCount[j]; k += 1) {\n copyToChannel(processedBuffer, outputs[j], k, outputChannelSplitterNodeOutput + k, i);\n }\n outputChannelSplitterNodeOutput += outputChannelCount[j];\n }\n }\n if (!activeSourceFlag) {\n break;\n }\n }\n catch (error) {\n proxy.dispatchEvent(new ErrorEvent('processorerror', {\n colno: error.colno,\n filename: error.filename,\n lineno: error.lineno,\n message: error.message\n }));\n break;\n }\n }\n return processedBuffer;\n};\nexport const createAudioWorkletNodeRendererFactory = (connectAudioParam, connectMultipleOutputs, createNativeAudioBufferSourceNode, createNativeChannelMergerNode, createNativeChannelSplitterNode, createNativeConstantSourceNode, createNativeGainNode, deleteUnrenderedAudioWorkletNode, disconnectMultipleOutputs, exposeCurrentFrameAndCurrentTime, getNativeAudioNode, nativeAudioWorkletNodeConstructor, nativeOfflineAudioContextConstructor, renderAutomation, renderInputsOfAudioNode, renderNativeOfflineAudioContext) => {\n return (name, options, processorConstructor) => {\n const renderedNativeAudioNodes = new WeakMap();\n let processedBufferPromise = null;\n const createAudioNode = async (proxy, nativeOfflineAudioContext, trace) => {\n let nativeAudioWorkletNode = getNativeAudioNode(proxy);\n let nativeOutputNodes = null;\n const nativeAudioWorkletNodeIsOwnedByContext = isOwnedByContext(nativeAudioWorkletNode, nativeOfflineAudioContext);\n const outputChannelCount = Array.isArray(options.outputChannelCount)\n ? options.outputChannelCount\n : Array.from(options.outputChannelCount);\n // Bug #61: Only Chrome, Edge, Firefox & Opera have an implementation of the AudioWorkletNode yet.\n if (nativeAudioWorkletNodeConstructor === null) {\n const numberOfOutputChannels = outputChannelCount.reduce((sum, value) => sum + value, 0);\n const outputChannelSplitterNode = createNativeChannelSplitterNode(nativeOfflineAudioContext, {\n channelCount: Math.max(1, numberOfOutputChannels),\n channelCountMode: 'explicit',\n channelInterpretation: 'discrete',\n numberOfOutputs: Math.max(1, numberOfOutputChannels)\n });\n const outputChannelMergerNodes = [];\n for (let i = 0; i < proxy.numberOfOutputs; i += 1) {\n outputChannelMergerNodes.push(createNativeChannelMergerNode(nativeOfflineAudioContext, {\n channelCount: 1,\n channelCountMode: 'explicit',\n channelInterpretation: 'speakers',\n numberOfInputs: outputChannelCount[i]\n }));\n }\n const outputGainNode = createNativeGainNode(nativeOfflineAudioContext, {\n channelCount: options.channelCount,\n channelCountMode: options.channelCountMode,\n channelInterpretation: options.channelInterpretation,\n gain: 1\n });\n outputGainNode.connect = connectMultipleOutputs.bind(null, outputChannelMergerNodes);\n outputGainNode.disconnect = disconnectMultipleOutputs.bind(null, outputChannelMergerNodes);\n nativeOutputNodes = [outputChannelSplitterNode, outputChannelMergerNodes, outputGainNode];\n }\n else if (!nativeAudioWorkletNodeIsOwnedByContext) {\n nativeAudioWorkletNode = new nativeAudioWorkletNodeConstructor(nativeOfflineAudioContext, name);\n }\n renderedNativeAudioNodes.set(nativeOfflineAudioContext, nativeOutputNodes === null ? nativeAudioWorkletNode : nativeOutputNodes[2]);\n if (nativeOutputNodes !== null) {\n if (processedBufferPromise === null) {\n if (processorConstructor === undefined) {\n throw new Error('Missing the processor constructor.');\n }\n if (nativeOfflineAudioContextConstructor === null) {\n throw new Error('Missing the native OfflineAudioContext constructor.');\n }\n // Bug #47: The AudioDestinationNode in Safari gets not initialized correctly.\n const numberOfInputChannels = proxy.channelCount * proxy.numberOfInputs;\n const numberOfParameters = processorConstructor.parameterDescriptors === undefined ? 0 : processorConstructor.parameterDescriptors.length;\n const numberOfChannels = numberOfInputChannels + numberOfParameters;\n const renderBuffer = async () => {\n const partialOfflineAudioContext = new nativeOfflineAudioContextConstructor(numberOfChannels, \n // Ceil the length to the next full render quantum.\n // Bug #17: Safari does not yet expose the length.\n Math.ceil(proxy.context.length / 128) * 128, nativeOfflineAudioContext.sampleRate);\n const gainNodes = [];\n const inputChannelSplitterNodes = [];\n for (let i = 0; i < options.numberOfInputs; i += 1) {\n gainNodes.push(createNativeGainNode(partialOfflineAudioContext, {\n channelCount: options.channelCount,\n channelCountMode: options.channelCountMode,\n channelInterpretation: options.channelInterpretation,\n gain: 1\n }));\n inputChannelSplitterNodes.push(createNativeChannelSplitterNode(partialOfflineAudioContext, {\n channelCount: options.channelCount,\n channelCountMode: 'explicit',\n channelInterpretation: 'discrete',\n numberOfOutputs: options.channelCount\n }));\n }\n const constantSourceNodes = await Promise.all(Array.from(proxy.parameters.values()).map(async (audioParam) => {\n const constantSourceNode = createNativeConstantSourceNode(partialOfflineAudioContext, {\n channelCount: 1,\n channelCountMode: 'explicit',\n channelInterpretation: 'discrete',\n offset: audioParam.value\n });\n await renderAutomation(partialOfflineAudioContext, audioParam, constantSourceNode.offset, trace);\n return constantSourceNode;\n }));\n const inputChannelMergerNode = createNativeChannelMergerNode(partialOfflineAudioContext, {\n channelCount: 1,\n channelCountMode: 'explicit',\n channelInterpretation: 'speakers',\n numberOfInputs: Math.max(1, numberOfInputChannels + numberOfParameters)\n });\n for (let i = 0; i < options.numberOfInputs; i += 1) {\n gainNodes[i].connect(inputChannelSplitterNodes[i]);\n for (let j = 0; j < options.channelCount; j += 1) {\n inputChannelSplitterNodes[i].connect(inputChannelMergerNode, j, i * options.channelCount + j);\n }\n }\n for (const [index, constantSourceNode] of constantSourceNodes.entries()) {\n constantSourceNode.connect(inputChannelMergerNode, 0, numberOfInputChannels + index);\n constantSourceNode.start(0);\n }\n inputChannelMergerNode.connect(partialOfflineAudioContext.destination);\n await Promise.all(gainNodes.map((gainNode) => renderInputsOfAudioNode(proxy, partialOfflineAudioContext, gainNode, trace)));\n return renderNativeOfflineAudioContext(partialOfflineAudioContext);\n };\n processedBufferPromise = processBuffer(proxy, numberOfChannels === 0 ? null : await renderBuffer(), nativeOfflineAudioContext, options, outputChannelCount, processorConstructor, exposeCurrentFrameAndCurrentTime);\n }\n const processedBuffer = await processedBufferPromise;\n const audioBufferSourceNode = createNativeAudioBufferSourceNode(nativeOfflineAudioContext, {\n buffer: null,\n channelCount: 2,\n channelCountMode: 'max',\n channelInterpretation: 'speakers',\n loop: false,\n loopEnd: 0,\n loopStart: 0,\n playbackRate: 1\n });\n const [outputChannelSplitterNode, outputChannelMergerNodes, outputGainNode] = nativeOutputNodes;\n if (processedBuffer !== null) {\n audioBufferSourceNode.buffer = processedBuffer;\n audioBufferSourceNode.start(0);\n }\n audioBufferSourceNode.connect(outputChannelSplitterNode);\n for (let i = 0, outputChannelSplitterNodeOutput = 0; i < proxy.numberOfOutputs; i += 1) {\n const outputChannelMergerNode = outputChannelMergerNodes[i];\n for (let j = 0; j < outputChannelCount[i]; j += 1) {\n outputChannelSplitterNode.connect(outputChannelMergerNode, outputChannelSplitterNodeOutput + j, j);\n }\n outputChannelSplitterNodeOutput += outputChannelCount[i];\n }\n return outputGainNode;\n }\n if (!nativeAudioWorkletNodeIsOwnedByContext) {\n for (const [nm, audioParam] of proxy.parameters.entries()) {\n await renderAutomation(nativeOfflineAudioContext, audioParam, \n // @todo The definition that TypeScript uses of the AudioParamMap is lacking many methods.\n nativeAudioWorkletNode.parameters.get(nm), trace);\n }\n }\n else {\n for (const [nm, audioParam] of proxy.parameters.entries()) {\n await connectAudioParam(nativeOfflineAudioContext, audioParam, \n // @todo The definition that TypeScript uses of the AudioParamMap is lacking many methods.\n nativeAudioWorkletNode.parameters.get(nm), trace);\n }\n }\n await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeAudioWorkletNode, trace);\n return nativeAudioWorkletNode;\n };\n return {\n render(proxy, nativeOfflineAudioContext, trace) {\n deleteUnrenderedAudioWorkletNode(nativeOfflineAudioContext, proxy);\n const renderedNativeAudioWorkletNodeOrGainNode = renderedNativeAudioNodes.get(nativeOfflineAudioContext);\n if (renderedNativeAudioWorkletNodeOrGainNode !== undefined) {\n return Promise.resolve(renderedNativeAudioWorkletNodeOrGainNode);\n }\n return createAudioNode(proxy, nativeOfflineAudioContext, trace);\n }\n };\n };\n};\n//# sourceMappingURL=audio-worklet-node-renderer-factory.js.map","import { NODE_TO_PROCESSOR_MAPS } from '../globals';\nimport { getNativeAudioNode } from './get-native-audio-node';\nimport { getValueForKey } from './get-value-for-key';\nexport const getAudioWorkletProcessor = (nativeOfflineAudioContext, proxy) => {\n const nodeToProcessorMap = getValueForKey(NODE_TO_PROCESSOR_MAPS, nativeOfflineAudioContext);\n const nativeAudioWorkletNode = getNativeAudioNode(proxy);\n return getValueForKey(nodeToProcessorMap, nativeAudioWorkletNode);\n};\n//# sourceMappingURL=get-audio-worklet-processor.js.map","import { MOST_NEGATIVE_SINGLE_FLOAT, MOST_POSITIVE_SINGLE_FLOAT } from '../constants';\nconst DEFAULT_OPTIONS = {\n Q: 1,\n channelCount: 2,\n channelCountMode: 'max',\n channelInterpretation: 'speakers',\n detune: 0,\n frequency: 350,\n gain: 0,\n type: 'lowpass'\n};\nexport const createBiquadFilterNodeConstructor = (audioNodeConstructor, createAudioParam, createBiquadFilterNodeRenderer, createInvalidAccessError, createNativeBiquadFilterNode, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime) => {\n return class BiquadFilterNode extends audioNodeConstructor {\n constructor(context, options) {\n const nativeContext = getNativeContext(context);\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n const nativeBiquadFilterNode = createNativeBiquadFilterNode(nativeContext, mergedOptions);\n const isOffline = isNativeOfflineAudioContext(nativeContext);\n const biquadFilterNodeRenderer = (isOffline ? createBiquadFilterNodeRenderer() : null);\n super(context, false, nativeBiquadFilterNode, biquadFilterNodeRenderer);\n // Bug #80: Safari does not export the correct values for maxValue and minValue.\n this._Q = createAudioParam(this, isOffline, nativeBiquadFilterNode.Q, MOST_POSITIVE_SINGLE_FLOAT, MOST_NEGATIVE_SINGLE_FLOAT);\n // Bug #78: Firefox & Safari do not export the correct values for maxValue and minValue.\n this._detune = createAudioParam(this, isOffline, nativeBiquadFilterNode.detune, 1200 * Math.log2(MOST_POSITIVE_SINGLE_FLOAT), -1200 * Math.log2(MOST_POSITIVE_SINGLE_FLOAT));\n // Bug #77: Firefox & Safari do not export the correct value for minValue.\n this._frequency = createAudioParam(this, isOffline, nativeBiquadFilterNode.frequency, context.sampleRate / 2, 0);\n // Bug #79: Firefox & Safari do not export the correct values for maxValue and minValue.\n this._gain = createAudioParam(this, isOffline, nativeBiquadFilterNode.gain, 40 * Math.log10(MOST_POSITIVE_SINGLE_FLOAT), MOST_NEGATIVE_SINGLE_FLOAT);\n this._nativeBiquadFilterNode = nativeBiquadFilterNode;\n // @todo Determine a meaningful tail-time instead of just using one second.\n setAudioNodeTailTime(this, 1);\n }\n get detune() {\n return this._detune;\n }\n get frequency() {\n return this._frequency;\n }\n get gain() {\n return this._gain;\n }\n get Q() {\n return this._Q;\n }\n get type() {\n return this._nativeBiquadFilterNode.type;\n }\n set type(value) {\n this._nativeBiquadFilterNode.type = value;\n }\n getFrequencyResponse(frequencyHz, magResponse, phaseResponse) {\n // Bug #189: Safari does throw an InvalidStateError.\n try {\n this._nativeBiquadFilterNode.getFrequencyResponse(frequencyHz, magResponse, phaseResponse);\n }\n catch (err) {\n if (err.code === 11) {\n throw createInvalidAccessError();\n }\n throw err;\n }\n // Bug #68: Safari does not throw an error if the parameters differ in their length.\n if (frequencyHz.length !== magResponse.length || magResponse.length !== phaseResponse.length) {\n throw createInvalidAccessError();\n }\n }\n };\n};\n//# sourceMappingURL=biquad-filter-node-constructor.js.map","const DEFAULT_OPTIONS = {\n channelCount: 1,\n channelCountMode: 'explicit',\n channelInterpretation: 'speakers',\n numberOfInputs: 6\n};\nexport const createChannelMergerNodeConstructor = (audioNodeConstructor, createChannelMergerNodeRenderer, createNativeChannelMergerNode, getNativeContext, isNativeOfflineAudioContext) => {\n return class ChannelMergerNode extends audioNodeConstructor {\n constructor(context, options) {\n const nativeContext = getNativeContext(context);\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n const nativeChannelMergerNode = createNativeChannelMergerNode(nativeContext, mergedOptions);\n const channelMergerNodeRenderer = ((isNativeOfflineAudioContext(nativeContext) ? createChannelMergerNodeRenderer() : null));\n super(context, false, nativeChannelMergerNode, channelMergerNodeRenderer);\n }\n };\n};\n//# sourceMappingURL=channel-merger-node-constructor.js.map","const DEFAULT_OPTIONS = {\n channelCount: 6,\n channelCountMode: 'explicit',\n channelInterpretation: 'discrete',\n numberOfOutputs: 6\n};\nexport const createChannelSplitterNodeConstructor = (audioNodeConstructor, createChannelSplitterNodeRenderer, createNativeChannelSplitterNode, getNativeContext, isNativeOfflineAudioContext, sanitizeChannelSplitterOptions) => {\n return class ChannelSplitterNode extends audioNodeConstructor {\n constructor(context, options) {\n const nativeContext = getNativeContext(context);\n const mergedOptions = sanitizeChannelSplitterOptions({ ...DEFAULT_OPTIONS, ...options });\n const nativeChannelSplitterNode = createNativeChannelSplitterNode(nativeContext, mergedOptions);\n const channelSplitterNodeRenderer = ((isNativeOfflineAudioContext(nativeContext) ? createChannelSplitterNodeRenderer() : null));\n super(context, false, nativeChannelSplitterNode, channelSplitterNodeRenderer);\n }\n };\n};\n//# sourceMappingURL=channel-splitter-node-constructor.js.map","import { MOST_NEGATIVE_SINGLE_FLOAT, MOST_POSITIVE_SINGLE_FLOAT } from '../constants';\nimport { isActiveAudioNode } from '../helpers/is-active-audio-node';\nimport { setInternalStateToActive } from '../helpers/set-internal-state-to-active';\nimport { setInternalStateToPassive } from '../helpers/set-internal-state-to-passive';\nconst DEFAULT_OPTIONS = {\n channelCount: 2,\n channelCountMode: 'max',\n channelInterpretation: 'speakers',\n offset: 1\n};\nexport const createConstantSourceNodeConstructor = (audioNodeConstructor, createAudioParam, createConstantSourceNodeRendererFactory, createNativeConstantSourceNode, getNativeContext, isNativeOfflineAudioContext, wrapEventListener) => {\n return class ConstantSourceNode extends audioNodeConstructor {\n constructor(context, options) {\n const nativeContext = getNativeContext(context);\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n const nativeConstantSourceNode = createNativeConstantSourceNode(nativeContext, mergedOptions);\n const isOffline = isNativeOfflineAudioContext(nativeContext);\n const constantSourceNodeRenderer = ((isOffline ? createConstantSourceNodeRendererFactory() : null));\n super(context, false, nativeConstantSourceNode, constantSourceNodeRenderer);\n this._constantSourceNodeRenderer = constantSourceNodeRenderer;\n this._nativeConstantSourceNode = nativeConstantSourceNode;\n /*\n * Bug #62 & #74: Safari does not support ConstantSourceNodes and does not export the correct values for maxValue and minValue\n * for GainNodes.\n */\n this._offset = createAudioParam(this, isOffline, nativeConstantSourceNode.offset, MOST_POSITIVE_SINGLE_FLOAT, MOST_NEGATIVE_SINGLE_FLOAT);\n this._onended = null;\n }\n get offset() {\n return this._offset;\n }\n get onended() {\n return this._onended;\n }\n set onended(value) {\n const wrappedListener = typeof value === 'function' ? wrapEventListener(this, value) : null;\n this._nativeConstantSourceNode.onended = wrappedListener;\n const nativeOnEnded = this._nativeConstantSourceNode.onended;\n this._onended = nativeOnEnded !== null && nativeOnEnded === wrappedListener ? value : nativeOnEnded;\n }\n start(when = 0) {\n this._nativeConstantSourceNode.start(when);\n if (this._constantSourceNodeRenderer !== null) {\n this._constantSourceNodeRenderer.start = when;\n }\n if (this.context.state !== 'closed') {\n setInternalStateToActive(this);\n const resetInternalStateToPassive = () => {\n this._nativeConstantSourceNode.removeEventListener('ended', resetInternalStateToPassive);\n if (isActiveAudioNode(this)) {\n setInternalStateToPassive(this);\n }\n };\n this._nativeConstantSourceNode.addEventListener('ended', resetInternalStateToPassive);\n }\n }\n stop(when = 0) {\n this._nativeConstantSourceNode.stop(when);\n if (this._constantSourceNodeRenderer !== null) {\n this._constantSourceNodeRenderer.stop = when;\n }\n }\n };\n};\n//# sourceMappingURL=constant-source-node-constructor.js.map","const DEFAULT_OPTIONS = {\n buffer: null,\n channelCount: 2,\n channelCountMode: 'clamped-max',\n channelInterpretation: 'speakers',\n disableNormalization: false\n};\nexport const createConvolverNodeConstructor = (audioNodeConstructor, createConvolverNodeRenderer, createNativeConvolverNode, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime) => {\n return class ConvolverNode extends audioNodeConstructor {\n constructor(context, options) {\n const nativeContext = getNativeContext(context);\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n const nativeConvolverNode = createNativeConvolverNode(nativeContext, mergedOptions);\n const isOffline = isNativeOfflineAudioContext(nativeContext);\n const convolverNodeRenderer = (isOffline ? createConvolverNodeRenderer() : null);\n super(context, false, nativeConvolverNode, convolverNodeRenderer);\n this._isBufferNullified = false;\n this._nativeConvolverNode = nativeConvolverNode;\n if (mergedOptions.buffer !== null) {\n setAudioNodeTailTime(this, mergedOptions.buffer.duration);\n }\n }\n get buffer() {\n if (this._isBufferNullified) {\n return null;\n }\n return this._nativeConvolverNode.buffer;\n }\n set buffer(value) {\n this._nativeConvolverNode.buffer = value;\n // Bug #115: Safari does not allow to set the buffer to null.\n if (value === null && this._nativeConvolverNode.buffer !== null) {\n const nativeContext = this._nativeConvolverNode.context;\n this._nativeConvolverNode.buffer = nativeContext.createBuffer(1, 1, 44100);\n this._isBufferNullified = true;\n setAudioNodeTailTime(this, 0);\n }\n else {\n this._isBufferNullified = false;\n setAudioNodeTailTime(this, this._nativeConvolverNode.buffer === null ? 0 : this._nativeConvolverNode.buffer.duration);\n }\n }\n get normalize() {\n return this._nativeConvolverNode.normalize;\n }\n set normalize(value) {\n this._nativeConvolverNode.normalize = value;\n }\n };\n};\n//# sourceMappingURL=convolver-node-constructor.js.map","const DEFAULT_OPTIONS = {\n channelCount: 2,\n channelCountMode: 'max',\n channelInterpretation: 'speakers',\n delayTime: 0,\n maxDelayTime: 1\n};\nexport const createDelayNodeConstructor = (audioNodeConstructor, createAudioParam, createDelayNodeRenderer, createNativeDelayNode, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime) => {\n return class DelayNode extends audioNodeConstructor {\n constructor(context, options) {\n const nativeContext = getNativeContext(context);\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n const nativeDelayNode = createNativeDelayNode(nativeContext, mergedOptions);\n const isOffline = isNativeOfflineAudioContext(nativeContext);\n const delayNodeRenderer = (isOffline ? createDelayNodeRenderer(mergedOptions.maxDelayTime) : null);\n super(context, false, nativeDelayNode, delayNodeRenderer);\n this._delayTime = createAudioParam(this, isOffline, nativeDelayNode.delayTime);\n setAudioNodeTailTime(this, mergedOptions.maxDelayTime);\n }\n get delayTime() {\n return this._delayTime;\n }\n };\n};\n//# sourceMappingURL=delay-node-constructor.js.map","import { isNativeAudioNode } from '../guards/native-audio-node';\nconst getOutputAudioNodeAtIndex = (createIndexSizeError, outputAudioNodes, output) => {\n const outputAudioNode = outputAudioNodes[output];\n if (outputAudioNode === undefined) {\n throw createIndexSizeError();\n }\n return outputAudioNode;\n};\nexport const createDisconnectMultipleOutputs = (createIndexSizeError) => {\n return (outputAudioNodes, destinationOrOutput = undefined, output = undefined, input = 0) => {\n if (destinationOrOutput === undefined) {\n return outputAudioNodes.forEach((outputAudioNode) => outputAudioNode.disconnect());\n }\n if (typeof destinationOrOutput === 'number') {\n return getOutputAudioNodeAtIndex(createIndexSizeError, outputAudioNodes, destinationOrOutput).disconnect();\n }\n if (isNativeAudioNode(destinationOrOutput)) {\n if (output === undefined) {\n return outputAudioNodes.forEach((outputAudioNode) => outputAudioNode.disconnect(destinationOrOutput));\n }\n if (input === undefined) {\n return getOutputAudioNodeAtIndex(createIndexSizeError, outputAudioNodes, output).disconnect(destinationOrOutput, 0);\n }\n return getOutputAudioNodeAtIndex(createIndexSizeError, outputAudioNodes, output).disconnect(destinationOrOutput, 0, input);\n }\n if (output === undefined) {\n return outputAudioNodes.forEach((outputAudioNode) => outputAudioNode.disconnect(destinationOrOutput));\n }\n return getOutputAudioNodeAtIndex(createIndexSizeError, outputAudioNodes, output).disconnect(destinationOrOutput, 0);\n };\n};\n//# sourceMappingURL=disconnect-multiple-outputs.js.map","const DEFAULT_OPTIONS = {\n attack: 0.003,\n channelCount: 2,\n channelCountMode: 'clamped-max',\n channelInterpretation: 'speakers',\n knee: 30,\n ratio: 12,\n release: 0.25,\n threshold: -24\n};\nexport const createDynamicsCompressorNodeConstructor = (audioNodeConstructor, createAudioParam, createDynamicsCompressorNodeRenderer, createNativeDynamicsCompressorNode, createNotSupportedError, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime) => {\n return class DynamicsCompressorNode extends audioNodeConstructor {\n constructor(context, options) {\n const nativeContext = getNativeContext(context);\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n const nativeDynamicsCompressorNode = createNativeDynamicsCompressorNode(nativeContext, mergedOptions);\n const isOffline = isNativeOfflineAudioContext(nativeContext);\n const dynamicsCompressorNodeRenderer = (isOffline ? createDynamicsCompressorNodeRenderer() : null);\n super(context, false, nativeDynamicsCompressorNode, dynamicsCompressorNodeRenderer);\n this._attack = createAudioParam(this, isOffline, nativeDynamicsCompressorNode.attack);\n this._knee = createAudioParam(this, isOffline, nativeDynamicsCompressorNode.knee);\n this._nativeDynamicsCompressorNode = nativeDynamicsCompressorNode;\n this._ratio = createAudioParam(this, isOffline, nativeDynamicsCompressorNode.ratio);\n this._release = createAudioParam(this, isOffline, nativeDynamicsCompressorNode.release);\n this._threshold = createAudioParam(this, isOffline, nativeDynamicsCompressorNode.threshold);\n setAudioNodeTailTime(this, 0.006);\n }\n get attack() {\n return this._attack;\n }\n // Bug #108: Safari allows a channelCount of three and above which is why the getter and setter needs to be overwritten here.\n get channelCount() {\n return this._nativeDynamicsCompressorNode.channelCount;\n }\n set channelCount(value) {\n const previousChannelCount = this._nativeDynamicsCompressorNode.channelCount;\n this._nativeDynamicsCompressorNode.channelCount = value;\n if (value > 2) {\n this._nativeDynamicsCompressorNode.channelCount = previousChannelCount;\n throw createNotSupportedError();\n }\n }\n /*\n * Bug #109: Only Chrome, Firefox and Opera disallow a channelCountMode of 'max' yet which is why the getter and setter needs to be\n * overwritten here.\n */\n get channelCountMode() {\n return this._nativeDynamicsCompressorNode.channelCountMode;\n }\n set channelCountMode(value) {\n const previousChannelCount = this._nativeDynamicsCompressorNode.channelCountMode;\n this._nativeDynamicsCompressorNode.channelCountMode = value;\n if (value === 'max') {\n this._nativeDynamicsCompressorNode.channelCountMode = previousChannelCount;\n throw createNotSupportedError();\n }\n }\n get knee() {\n return this._knee;\n }\n get ratio() {\n return this._ratio;\n }\n get reduction() {\n // Bug #111: Safari returns an AudioParam instead of a number.\n if (typeof this._nativeDynamicsCompressorNode.reduction.value === 'number') {\n return this._nativeDynamicsCompressorNode.reduction.value;\n }\n return this._nativeDynamicsCompressorNode.reduction;\n }\n get release() {\n return this._release;\n }\n get threshold() {\n return this._threshold;\n }\n };\n};\n//# sourceMappingURL=dynamics-compressor-node-constructor.js.map","import { MOST_NEGATIVE_SINGLE_FLOAT, MOST_POSITIVE_SINGLE_FLOAT } from '../constants';\nconst DEFAULT_OPTIONS = {\n channelCount: 2,\n channelCountMode: 'max',\n channelInterpretation: 'speakers',\n gain: 1\n};\nexport const createGainNodeConstructor = (audioNodeConstructor, createAudioParam, createGainNodeRenderer, createNativeGainNode, getNativeContext, isNativeOfflineAudioContext) => {\n return class GainNode extends audioNodeConstructor {\n constructor(context, options) {\n const nativeContext = getNativeContext(context);\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n const nativeGainNode = createNativeGainNode(nativeContext, mergedOptions);\n const isOffline = isNativeOfflineAudioContext(nativeContext);\n const gainNodeRenderer = (isOffline ? createGainNodeRenderer() : null);\n super(context, false, nativeGainNode, gainNodeRenderer);\n // Bug #74: Safari does not export the correct values for maxValue and minValue.\n this._gain = createAudioParam(this, isOffline, nativeGainNode.gain, MOST_POSITIVE_SINGLE_FLOAT, MOST_NEGATIVE_SINGLE_FLOAT);\n }\n get gain() {\n return this._gain;\n }\n };\n};\n//# sourceMappingURL=gain-node-constructor.js.map","export const createInvalidStateError = () => new DOMException('', 'InvalidStateError');\n//# sourceMappingURL=invalid-state-error.js.map","export const createInvalidAccessError = () => new DOMException('', 'InvalidAccessError');\n//# sourceMappingURL=invalid-access-error.js.map","import { wrapIIRFilterNodeGetFrequencyResponseMethod } from '../helpers/wrap-iir-filter-node-get-frequency-response-method';\nconst DEFAULT_OPTIONS = {\n channelCount: 2,\n channelCountMode: 'max',\n channelInterpretation: 'speakers'\n};\nexport const createIIRFilterNodeConstructor = (audioNodeConstructor, createNativeIIRFilterNode, createIIRFilterNodeRenderer, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime) => {\n return class IIRFilterNode extends audioNodeConstructor {\n constructor(context, options) {\n const nativeContext = getNativeContext(context);\n const isOffline = isNativeOfflineAudioContext(nativeContext);\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n const nativeIIRFilterNode = createNativeIIRFilterNode(nativeContext, isOffline ? null : context.baseLatency, mergedOptions);\n const iirFilterNodeRenderer = ((isOffline ? createIIRFilterNodeRenderer(mergedOptions.feedback, mergedOptions.feedforward) : null));\n super(context, false, nativeIIRFilterNode, iirFilterNodeRenderer);\n // Bug #23 & #24: FirefoxDeveloper does not throw an InvalidAccessError.\n // @todo Write a test which allows other browsers to remain unpatched.\n wrapIIRFilterNodeGetFrequencyResponseMethod(nativeIIRFilterNode);\n this._nativeIIRFilterNode = nativeIIRFilterNode;\n // @todo Determine a meaningful tail-time instead of just using one second.\n setAudioNodeTailTime(this, 1);\n }\n getFrequencyResponse(frequencyHz, magResponse, phaseResponse) {\n return this._nativeIIRFilterNode.getFrequencyResponse(frequencyHz, magResponse, phaseResponse);\n }\n };\n};\n//# sourceMappingURL=iir-filter-node-constructor.js.map","// This implementation as shamelessly inspired by source code of\n// tslint:disable-next-line:max-line-length\n// {@link https://chromium.googlesource.com/chromium/src.git/+/master/third_party/WebKit/Source/platform/audio/IIRFilter.cpp|Chromium's IIRFilter}.\nexport const filterBuffer = (feedback, feedbackLength, feedforward, feedforwardLength, minLength, xBuffer, yBuffer, bufferIndex, bufferLength, input, output) => {\n const inputLength = input.length;\n let i = bufferIndex;\n for (let j = 0; j < inputLength; j += 1) {\n let y = feedforward[0] * input[j];\n for (let k = 1; k < minLength; k += 1) {\n const x = (i - k) & (bufferLength - 1); // tslint:disable-line:no-bitwise\n y += feedforward[k] * xBuffer[x];\n y -= feedback[k] * yBuffer[x];\n }\n for (let k = minLength; k < feedforwardLength; k += 1) {\n y += feedforward[k] * xBuffer[(i - k) & (bufferLength - 1)]; // tslint:disable-line:no-bitwise\n }\n for (let k = minLength; k < feedbackLength; k += 1) {\n y -= feedback[k] * yBuffer[(i - k) & (bufferLength - 1)]; // tslint:disable-line:no-bitwise\n }\n xBuffer[i] = input[j];\n yBuffer[i] = y;\n i = (i + 1) & (bufferLength - 1); // tslint:disable-line:no-bitwise\n output[j] = y;\n }\n return i;\n};\n//# sourceMappingURL=filter-buffer.js.map","const DEFAULT_OPTIONS = {\n channelCount: 2,\n channelCountMode: 'explicit',\n channelInterpretation: 'speakers'\n};\nexport const createMediaStreamAudioDestinationNodeConstructor = (audioNodeConstructor, createNativeMediaStreamAudioDestinationNode, getNativeContext, isNativeOfflineAudioContext) => {\n return class MediaStreamAudioDestinationNode extends audioNodeConstructor {\n constructor(context, options) {\n const nativeContext = getNativeContext(context);\n // Bug #173: Safari allows to create a MediaStreamAudioDestinationNode with an OfflineAudioContext.\n if (isNativeOfflineAudioContext(nativeContext)) {\n throw new TypeError();\n }\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n const nativeMediaStreamAudioDestinationNode = createNativeMediaStreamAudioDestinationNode(nativeContext, mergedOptions);\n super(context, false, nativeMediaStreamAudioDestinationNode, null);\n this._nativeMediaStreamAudioDestinationNode = nativeMediaStreamAudioDestinationNode;\n }\n get stream() {\n return this._nativeMediaStreamAudioDestinationNode.stream;\n }\n };\n};\n//# sourceMappingURL=media-stream-audio-destination-node-constructor.js.map","export const testPromiseSupport = (nativeContext) => {\n // This 12 numbers represent the 48 bytes of an empty WAVE file with a single sample.\n const uint32Array = new Uint32Array([1179011410, 40, 1163280727, 544501094, 16, 131073, 44100, 176400, 1048580, 1635017060, 4, 0]);\n try {\n // Bug #1: Safari requires a successCallback.\n const promise = nativeContext.decodeAudioData(uint32Array.buffer, () => {\n // Ignore the success callback.\n });\n if (promise === undefined) {\n return false;\n }\n promise.catch(() => {\n // Ignore rejected errors.\n });\n return true;\n }\n catch {\n // Ignore errors.\n }\n return false;\n};\n//# sourceMappingURL=test-promise-support.js.map","import { deactivateAudioGraph } from '../helpers/deactivate-audio-graph';\nimport { testPromiseSupport } from '../helpers/test-promise-support';\nconst DEFAULT_OPTIONS = {\n numberOfChannels: 1\n};\nexport const createMinimalOfflineAudioContextConstructor = (cacheTestResult, createInvalidStateError, createNativeOfflineAudioContext, minimalBaseAudioContextConstructor, startRendering) => {\n return class MinimalOfflineAudioContext extends minimalBaseAudioContextConstructor {\n constructor(options) {\n const { length, numberOfChannels, sampleRate } = { ...DEFAULT_OPTIONS, ...options };\n const nativeOfflineAudioContext = createNativeOfflineAudioContext(numberOfChannels, length, sampleRate);\n // #21 Safari does not support promises and therefore would fire the statechange event before the promise can be resolved.\n if (!cacheTestResult(testPromiseSupport, () => testPromiseSupport(nativeOfflineAudioContext))) {\n nativeOfflineAudioContext.addEventListener('statechange', (() => {\n let i = 0;\n const delayStateChangeEvent = (event) => {\n if (this._state === 'running') {\n if (i > 0) {\n nativeOfflineAudioContext.removeEventListener('statechange', delayStateChangeEvent);\n event.stopImmediatePropagation();\n this._waitForThePromiseToSettle(event);\n }\n else {\n i += 1;\n }\n }\n };\n return delayStateChangeEvent;\n })());\n }\n super(nativeOfflineAudioContext, numberOfChannels);\n this._length = length;\n this._nativeOfflineAudioContext = nativeOfflineAudioContext;\n this._state = null;\n }\n get length() {\n // Bug #17: Safari does not yet expose the length.\n if (this._nativeOfflineAudioContext.length === undefined) {\n return this._length;\n }\n return this._nativeOfflineAudioContext.length;\n }\n get state() {\n return this._state === null ? this._nativeOfflineAudioContext.state : this._state;\n }\n startRendering() {\n /*\n * Bug #9 & #59: It is theoretically possible that startRendering() will first render a partialOfflineAudioContext. Therefore\n * the state of the nativeOfflineAudioContext might no transition to running immediately.\n */\n if (this._state === 'running') {\n return Promise.reject(createInvalidStateError());\n }\n this._state = 'running';\n return startRendering(this.destination, this._nativeOfflineAudioContext).finally(() => {\n this._state = null;\n deactivateAudioGraph(this);\n });\n }\n _waitForThePromiseToSettle(event) {\n if (this._state === null) {\n this._nativeOfflineAudioContext.dispatchEvent(event);\n }\n else {\n setTimeout(() => this._waitForThePromiseToSettle(event));\n }\n }\n };\n};\n//# sourceMappingURL=minimal-offline-audio-context-constructor.js.map","export const assignNativeAudioNodeOption = (nativeAudioNode, options, option) => {\n const value = options[option];\n if (value !== undefined && value !== nativeAudioNode[option]) {\n nativeAudioNode[option] = value;\n }\n};\n//# sourceMappingURL=assign-native-audio-node-option.js.map","import { assignNativeAudioNodeOption } from './assign-native-audio-node-option';\nexport const assignNativeAudioNodeOptions = (nativeAudioNode, options) => {\n assignNativeAudioNodeOption(nativeAudioNode, options, 'channelCount');\n assignNativeAudioNodeOption(nativeAudioNode, options, 'channelCountMode');\n assignNativeAudioNodeOption(nativeAudioNode, options, 'channelInterpretation');\n};\n//# sourceMappingURL=assign-native-audio-node-options.js.map","export const testAnalyserNodeGetFloatTimeDomainDataMethodSupport = (nativeAnalyserNode) => {\n return typeof nativeAnalyserNode.getFloatTimeDomainData === 'function';\n};\n//# sourceMappingURL=test-analyser-node-get-float-time-domain-data-method-support.js.map","export const assignNativeAudioNodeAudioParamValue = (nativeAudioNode, options, audioParam) => {\n const value = options[audioParam];\n if (value !== undefined && value !== nativeAudioNode[audioParam].value) {\n nativeAudioNode[audioParam].value = value;\n }\n};\n//# sourceMappingURL=assign-native-audio-node-audio-param-value.js.map","export const wrapAudioScheduledSourceNodeStartMethodNegativeParameters = (nativeAudioScheduledSourceNode) => {\n nativeAudioScheduledSourceNode.start = ((start) => {\n return (when = 0, offset = 0, duration) => {\n if ((typeof duration === 'number' && duration < 0) || offset < 0 || when < 0) {\n throw new RangeError(\"The parameters can't be negative.\");\n }\n // @todo TypeScript cannot infer the overloaded signature with 3 arguments yet.\n start.call(nativeAudioScheduledSourceNode, when, offset, duration);\n };\n })(nativeAudioScheduledSourceNode.start);\n};\n//# sourceMappingURL=wrap-audio-scheduled-source-node-start-method-negative-parameters.js.map","export const wrapAudioScheduledSourceNodeStopMethodNegativeParameters = (nativeAudioScheduledSourceNode) => {\n nativeAudioScheduledSourceNode.stop = ((stop) => {\n return (when = 0) => {\n if (when < 0) {\n throw new RangeError(\"The parameter can't be negative.\");\n }\n stop.call(nativeAudioScheduledSourceNode, when);\n };\n })(nativeAudioScheduledSourceNode.stop);\n};\n//# sourceMappingURL=wrap-audio-scheduled-source-node-stop-method-negative-parameters.js.map","export const computeBufferSize = (baseLatency, sampleRate) => {\n if (baseLatency === null) {\n return 512;\n }\n return Math.max(512, Math.min(16384, Math.pow(2, Math.round(Math.log2(baseLatency * sampleRate)))));\n};\n//# sourceMappingURL=compute-buffer-size.js.map","import { cloneAudioWorkletNodeOptions } from './clone-audio-worklet-node-options';\nexport const createAudioWorkletProcessorPromise = async (processorConstructor, audioWorkletNodeOptions) => {\n const clonedAudioWorkletNodeOptions = await cloneAudioWorkletNodeOptions(audioWorkletNodeOptions);\n return new processorConstructor(clonedAudioWorkletNodeOptions);\n};\n//# sourceMappingURL=create-audio-worklet-processor-promise.js.map","export const cloneAudioWorkletNodeOptions = (audioWorkletNodeOptions) => {\n return new Promise((resolve, reject) => {\n const { port1, port2 } = new MessageChannel();\n port1.onmessage = ({ data }) => {\n port1.close();\n port2.close();\n resolve(data);\n };\n port1.onmessageerror = ({ data }) => {\n port1.close();\n port2.close();\n reject(data);\n };\n // This will throw an error if the audioWorkletNodeOptions are not clonable.\n port2.postMessage(audioWorkletNodeOptions);\n });\n};\n//# sourceMappingURL=clone-audio-worklet-node-options.js.map","import { assignNativeAudioNodeAudioParamValue } from '../helpers/assign-native-audio-node-audio-param-value';\nimport { assignNativeAudioNodeOption } from '../helpers/assign-native-audio-node-option';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nexport const createNativeBiquadFilterNode = (nativeContext, options) => {\n const nativeBiquadFilterNode = nativeContext.createBiquadFilter();\n assignNativeAudioNodeOptions(nativeBiquadFilterNode, options);\n assignNativeAudioNodeAudioParamValue(nativeBiquadFilterNode, options, 'Q');\n assignNativeAudioNodeAudioParamValue(nativeBiquadFilterNode, options, 'detune');\n assignNativeAudioNodeAudioParamValue(nativeBiquadFilterNode, options, 'frequency');\n assignNativeAudioNodeAudioParamValue(nativeBiquadFilterNode, options, 'gain');\n assignNativeAudioNodeOption(nativeBiquadFilterNode, options, 'type');\n return nativeBiquadFilterNode;\n};\n//# sourceMappingURL=native-biquad-filter-node.js.map","import { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nimport { wrapChannelSplitterNode } from '../helpers/wrap-channel-splitter-node';\nexport const createNativeChannelSplitterNode = (nativeContext, options) => {\n const nativeChannelSplitterNode = nativeContext.createChannelSplitter(options.numberOfOutputs);\n // Bug #96: Safari does not have the correct channelCount.\n // Bug #29: Safari does not have the correct channelCountMode.\n // Bug #31: Safari does not have the correct channelInterpretation.\n assignNativeAudioNodeOptions(nativeChannelSplitterNode, options);\n // Bug #29, #30, #31, #32, #96 & #97: Only Chrome, Edge, Firefox & Opera partially support the spec yet.\n wrapChannelSplitterNode(nativeChannelSplitterNode);\n return nativeChannelSplitterNode;\n};\n//# sourceMappingURL=native-channel-splitter-node.js.map","import { createInvalidStateError } from '../factories/invalid-state-error';\nexport const wrapChannelSplitterNode = (channelSplitterNode) => {\n const channelCount = channelSplitterNode.numberOfOutputs;\n // Bug #97: Safari does not throw an error when attempting to change the channelCount to something other than its initial value.\n Object.defineProperty(channelSplitterNode, 'channelCount', {\n get: () => channelCount,\n set: (value) => {\n if (value !== channelCount) {\n throw createInvalidStateError();\n }\n }\n });\n // Bug #30: Safari does not throw an error when attempting to change the channelCountMode to something other than explicit.\n Object.defineProperty(channelSplitterNode, 'channelCountMode', {\n get: () => 'explicit',\n set: (value) => {\n if (value !== 'explicit') {\n throw createInvalidStateError();\n }\n }\n });\n // Bug #32: Safari does not throw an error when attempting to change the channelInterpretation to something other than discrete.\n Object.defineProperty(channelSplitterNode, 'channelInterpretation', {\n get: () => 'discrete',\n set: (value) => {\n if (value !== 'discrete') {\n throw createInvalidStateError();\n }\n }\n });\n};\n//# sourceMappingURL=wrap-channel-splitter-node.js.map","export const interceptConnections = (original, interceptor) => {\n original.connect = interceptor.connect.bind(interceptor);\n original.disconnect = interceptor.disconnect.bind(interceptor);\n return original;\n};\n//# sourceMappingURL=intercept-connections.js.map","import { assignNativeAudioNodeAudioParamValue } from '../helpers/assign-native-audio-node-audio-param-value';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nexport const createNativeDelayNode = (nativeContext, options) => {\n const nativeDelayNode = nativeContext.createDelay(options.maxDelayTime);\n assignNativeAudioNodeOptions(nativeDelayNode, options);\n assignNativeAudioNodeAudioParamValue(nativeDelayNode, options, 'delayTime');\n return nativeDelayNode;\n};\n//# sourceMappingURL=native-delay-node.js.map","import { assignNativeAudioNodeAudioParamValue } from '../helpers/assign-native-audio-node-audio-param-value';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nexport const createNativeGainNode = (nativeContext, options) => {\n const nativeGainNode = nativeContext.createGain();\n assignNativeAudioNodeOptions(nativeGainNode, options);\n assignNativeAudioNodeAudioParamValue(nativeGainNode, options, 'gain');\n return nativeGainNode;\n};\n//# sourceMappingURL=native-gain-node.js.map","import { computeBufferSize } from '../helpers/compute-buffer-size';\nimport { filterBuffer } from '../helpers/filter-buffer';\nimport { interceptConnections } from '../helpers/intercept-connections';\nfunction divide(a, b) {\n const denominator = b[0] * b[0] + b[1] * b[1];\n return [(a[0] * b[0] + a[1] * b[1]) / denominator, (a[1] * b[0] - a[0] * b[1]) / denominator];\n}\nfunction multiply(a, b) {\n return [a[0] * b[0] - a[1] * b[1], a[0] * b[1] + a[1] * b[0]];\n}\nfunction evaluatePolynomial(coefficient, z) {\n let result = [0, 0];\n for (let i = coefficient.length - 1; i >= 0; i -= 1) {\n result = multiply(result, z);\n result[0] += coefficient[i];\n }\n return result;\n}\nexport const createNativeIIRFilterNodeFakerFactory = (createInvalidAccessError, createInvalidStateError, createNativeScriptProcessorNode, createNotSupportedError) => {\n return (nativeContext, baseLatency, { channelCount, channelCountMode, channelInterpretation, feedback, feedforward }) => {\n const bufferSize = computeBufferSize(baseLatency, nativeContext.sampleRate);\n const convertedFeedback = feedback instanceof Float64Array ? feedback : new Float64Array(feedback);\n const convertedFeedforward = feedforward instanceof Float64Array ? feedforward : new Float64Array(feedforward);\n const feedbackLength = convertedFeedback.length;\n const feedforwardLength = convertedFeedforward.length;\n const minLength = Math.min(feedbackLength, feedforwardLength);\n if (feedbackLength === 0 || feedbackLength > 20) {\n throw createNotSupportedError();\n }\n if (convertedFeedback[0] === 0) {\n throw createInvalidStateError();\n }\n if (feedforwardLength === 0 || feedforwardLength > 20) {\n throw createNotSupportedError();\n }\n if (convertedFeedforward[0] === 0) {\n throw createInvalidStateError();\n }\n if (convertedFeedback[0] !== 1) {\n for (let i = 0; i < feedforwardLength; i += 1) {\n convertedFeedforward[i] /= convertedFeedback[0];\n }\n for (let i = 1; i < feedbackLength; i += 1) {\n convertedFeedback[i] /= convertedFeedback[0];\n }\n }\n const scriptProcessorNode = createNativeScriptProcessorNode(nativeContext, bufferSize, channelCount, channelCount);\n scriptProcessorNode.channelCount = channelCount;\n scriptProcessorNode.channelCountMode = channelCountMode;\n scriptProcessorNode.channelInterpretation = channelInterpretation;\n const bufferLength = 32;\n const bufferIndexes = [];\n const xBuffers = [];\n const yBuffers = [];\n for (let i = 0; i < channelCount; i += 1) {\n bufferIndexes.push(0);\n const xBuffer = new Float32Array(bufferLength);\n const yBuffer = new Float32Array(bufferLength);\n xBuffer.fill(0);\n yBuffer.fill(0);\n xBuffers.push(xBuffer);\n yBuffers.push(yBuffer);\n }\n // tslint:disable-next-line:deprecation\n scriptProcessorNode.onaudioprocess = (event) => {\n const inputBuffer = event.inputBuffer;\n const outputBuffer = event.outputBuffer;\n const numberOfChannels = inputBuffer.numberOfChannels;\n for (let i = 0; i < numberOfChannels; i += 1) {\n const input = inputBuffer.getChannelData(i);\n const output = outputBuffer.getChannelData(i);\n bufferIndexes[i] = filterBuffer(convertedFeedback, feedbackLength, convertedFeedforward, feedforwardLength, minLength, xBuffers[i], yBuffers[i], bufferIndexes[i], bufferLength, input, output);\n }\n };\n const nyquist = nativeContext.sampleRate / 2;\n const nativeIIRFilterNodeFaker = {\n get bufferSize() {\n return bufferSize;\n },\n get channelCount() {\n return scriptProcessorNode.channelCount;\n },\n set channelCount(value) {\n scriptProcessorNode.channelCount = value;\n },\n get channelCountMode() {\n return scriptProcessorNode.channelCountMode;\n },\n set channelCountMode(value) {\n scriptProcessorNode.channelCountMode = value;\n },\n get channelInterpretation() {\n return scriptProcessorNode.channelInterpretation;\n },\n set channelInterpretation(value) {\n scriptProcessorNode.channelInterpretation = value;\n },\n get context() {\n return scriptProcessorNode.context;\n },\n get inputs() {\n return [scriptProcessorNode];\n },\n get numberOfInputs() {\n return scriptProcessorNode.numberOfInputs;\n },\n get numberOfOutputs() {\n return scriptProcessorNode.numberOfOutputs;\n },\n addEventListener(...args) {\n // @todo Dissallow adding an audioprocess listener.\n return scriptProcessorNode.addEventListener(args[0], args[1], args[2]);\n },\n dispatchEvent(...args) {\n return scriptProcessorNode.dispatchEvent(args[0]);\n },\n getFrequencyResponse(frequencyHz, magResponse, phaseResponse) {\n if (frequencyHz.length !== magResponse.length || magResponse.length !== phaseResponse.length) {\n throw createInvalidAccessError();\n }\n const length = frequencyHz.length;\n for (let i = 0; i < length; i += 1) {\n const omega = -Math.PI * (frequencyHz[i] / nyquist);\n const z = [Math.cos(omega), Math.sin(omega)];\n const numerator = evaluatePolynomial(convertedFeedforward, z);\n const denominator = evaluatePolynomial(convertedFeedback, z);\n const response = divide(numerator, denominator);\n magResponse[i] = Math.sqrt(response[0] * response[0] + response[1] * response[1]);\n phaseResponse[i] = Math.atan2(response[1], response[0]);\n }\n },\n removeEventListener(...args) {\n return scriptProcessorNode.removeEventListener(args[0], args[1], args[2]);\n }\n };\n return interceptConnections(nativeIIRFilterNodeFaker, scriptProcessorNode);\n };\n};\n//# sourceMappingURL=native-iir-filter-node-faker-factory.js.map","export const createNativeScriptProcessorNode = (nativeContext, bufferSize, numberOfInputChannels, numberOfOutputChannels) => {\n return nativeContext.createScriptProcessor(bufferSize, numberOfInputChannels, numberOfOutputChannels);\n};\n//# sourceMappingURL=native-script-processor-node.js.map","export const createNotSupportedError = () => new DOMException('', 'NotSupportedError');\n//# sourceMappingURL=not-supported-error.js.map","import { deactivateAudioGraph } from '../helpers/deactivate-audio-graph';\nimport { testPromiseSupport } from '../helpers/test-promise-support';\nconst DEFAULT_OPTIONS = {\n numberOfChannels: 1\n};\nexport const createOfflineAudioContextConstructor = (baseAudioContextConstructor, cacheTestResult, createInvalidStateError, createNativeOfflineAudioContext, startRendering) => {\n return class OfflineAudioContext extends baseAudioContextConstructor {\n constructor(a, b, c) {\n let options;\n if (typeof a === 'number' && b !== undefined && c !== undefined) {\n options = { length: b, numberOfChannels: a, sampleRate: c };\n }\n else if (typeof a === 'object') {\n options = a;\n }\n else {\n throw new Error('The given parameters are not valid.');\n }\n const { length, numberOfChannels, sampleRate } = { ...DEFAULT_OPTIONS, ...options };\n const nativeOfflineAudioContext = createNativeOfflineAudioContext(numberOfChannels, length, sampleRate);\n // #21 Safari does not support promises and therefore would fire the statechange event before the promise can be resolved.\n if (!cacheTestResult(testPromiseSupport, () => testPromiseSupport(nativeOfflineAudioContext))) {\n nativeOfflineAudioContext.addEventListener('statechange', (() => {\n let i = 0;\n const delayStateChangeEvent = (event) => {\n if (this._state === 'running') {\n if (i > 0) {\n nativeOfflineAudioContext.removeEventListener('statechange', delayStateChangeEvent);\n event.stopImmediatePropagation();\n this._waitForThePromiseToSettle(event);\n }\n else {\n i += 1;\n }\n }\n };\n return delayStateChangeEvent;\n })());\n }\n super(nativeOfflineAudioContext, numberOfChannels);\n this._length = length;\n this._nativeOfflineAudioContext = nativeOfflineAudioContext;\n this._state = null;\n }\n get length() {\n // Bug #17: Safari does not yet expose the length.\n if (this._nativeOfflineAudioContext.length === undefined) {\n return this._length;\n }\n return this._nativeOfflineAudioContext.length;\n }\n get state() {\n return this._state === null ? this._nativeOfflineAudioContext.state : this._state;\n }\n startRendering() {\n /*\n * Bug #9 & #59: It is theoretically possible that startRendering() will first render a partialOfflineAudioContext. Therefore\n * the state of the nativeOfflineAudioContext might no transition to running immediately.\n */\n if (this._state === 'running') {\n return Promise.reject(createInvalidStateError());\n }\n this._state = 'running';\n return startRendering(this.destination, this._nativeOfflineAudioContext).finally(() => {\n this._state = null;\n deactivateAudioGraph(this);\n });\n }\n _waitForThePromiseToSettle(event) {\n if (this._state === null) {\n this._nativeOfflineAudioContext.dispatchEvent(event);\n }\n else {\n setTimeout(() => this._waitForThePromiseToSettle(event));\n }\n }\n };\n};\n//# sourceMappingURL=offline-audio-context-constructor.js.map","import { isActiveAudioNode } from '../helpers/is-active-audio-node';\nimport { setInternalStateToActive } from '../helpers/set-internal-state-to-active';\nimport { setInternalStateToPassive } from '../helpers/set-internal-state-to-passive';\nconst DEFAULT_OPTIONS = {\n channelCount: 2,\n channelCountMode: 'max',\n channelInterpretation: 'speakers',\n detune: 0,\n frequency: 440,\n periodicWave: undefined,\n type: 'sine'\n};\nexport const createOscillatorNodeConstructor = (audioNodeConstructor, createAudioParam, createNativeOscillatorNode, createOscillatorNodeRenderer, getNativeContext, isNativeOfflineAudioContext, wrapEventListener) => {\n return class OscillatorNode extends audioNodeConstructor {\n constructor(context, options) {\n const nativeContext = getNativeContext(context);\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n const nativeOscillatorNode = createNativeOscillatorNode(nativeContext, mergedOptions);\n const isOffline = isNativeOfflineAudioContext(nativeContext);\n const oscillatorNodeRenderer = (isOffline ? createOscillatorNodeRenderer() : null);\n const nyquist = context.sampleRate / 2;\n super(context, false, nativeOscillatorNode, oscillatorNodeRenderer);\n // Bug #81: Firefox & Safari do not export the correct values for maxValue and minValue.\n this._detune = createAudioParam(this, isOffline, nativeOscillatorNode.detune, 153600, -153600);\n // Bug #76: Safari does not export the correct values for maxValue and minValue.\n this._frequency = createAudioParam(this, isOffline, nativeOscillatorNode.frequency, nyquist, -nyquist);\n this._nativeOscillatorNode = nativeOscillatorNode;\n this._onended = null;\n this._oscillatorNodeRenderer = oscillatorNodeRenderer;\n if (this._oscillatorNodeRenderer !== null && mergedOptions.periodicWave !== undefined) {\n this._oscillatorNodeRenderer.periodicWave =\n mergedOptions.periodicWave;\n }\n }\n get detune() {\n return this._detune;\n }\n get frequency() {\n return this._frequency;\n }\n get onended() {\n return this._onended;\n }\n set onended(value) {\n const wrappedListener = typeof value === 'function' ? wrapEventListener(this, value) : null;\n this._nativeOscillatorNode.onended = wrappedListener;\n const nativeOnEnded = this._nativeOscillatorNode.onended;\n this._onended = nativeOnEnded !== null && nativeOnEnded === wrappedListener ? value : nativeOnEnded;\n }\n get type() {\n return this._nativeOscillatorNode.type;\n }\n set type(value) {\n this._nativeOscillatorNode.type = value;\n if (this._oscillatorNodeRenderer !== null) {\n this._oscillatorNodeRenderer.periodicWave = null;\n }\n }\n setPeriodicWave(periodicWave) {\n this._nativeOscillatorNode.setPeriodicWave(periodicWave);\n if (this._oscillatorNodeRenderer !== null) {\n this._oscillatorNodeRenderer.periodicWave = periodicWave;\n }\n }\n start(when = 0) {\n this._nativeOscillatorNode.start(when);\n if (this._oscillatorNodeRenderer !== null) {\n this._oscillatorNodeRenderer.start = when;\n }\n if (this.context.state !== 'closed') {\n setInternalStateToActive(this);\n const resetInternalStateToPassive = () => {\n this._nativeOscillatorNode.removeEventListener('ended', resetInternalStateToPassive);\n if (isActiveAudioNode(this)) {\n setInternalStateToPassive(this);\n }\n };\n this._nativeOscillatorNode.addEventListener('ended', resetInternalStateToPassive);\n }\n }\n stop(when = 0) {\n this._nativeOscillatorNode.stop(when);\n if (this._oscillatorNodeRenderer !== null) {\n this._oscillatorNodeRenderer.stop = when;\n }\n }\n };\n};\n//# sourceMappingURL=oscillator-node-constructor.js.map","import { MOST_NEGATIVE_SINGLE_FLOAT, MOST_POSITIVE_SINGLE_FLOAT } from '../constants';\nconst DEFAULT_OPTIONS = {\n channelCount: 2,\n channelCountMode: 'clamped-max',\n channelInterpretation: 'speakers',\n coneInnerAngle: 360,\n coneOuterAngle: 360,\n coneOuterGain: 0,\n distanceModel: 'inverse',\n maxDistance: 10000,\n orientationX: 1,\n orientationY: 0,\n orientationZ: 0,\n panningModel: 'equalpower',\n positionX: 0,\n positionY: 0,\n positionZ: 0,\n refDistance: 1,\n rolloffFactor: 1\n};\nexport const createPannerNodeConstructor = (audioNodeConstructor, createAudioParam, createNativePannerNode, createPannerNodeRenderer, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime) => {\n return class PannerNode extends audioNodeConstructor {\n constructor(context, options) {\n const nativeContext = getNativeContext(context);\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n const nativePannerNode = createNativePannerNode(nativeContext, mergedOptions);\n const isOffline = isNativeOfflineAudioContext(nativeContext);\n const pannerNodeRenderer = (isOffline ? createPannerNodeRenderer() : null);\n super(context, false, nativePannerNode, pannerNodeRenderer);\n this._nativePannerNode = nativePannerNode;\n // Bug #74: Safari does not export the correct values for maxValue and minValue.\n this._orientationX = createAudioParam(this, isOffline, nativePannerNode.orientationX, MOST_POSITIVE_SINGLE_FLOAT, MOST_NEGATIVE_SINGLE_FLOAT);\n this._orientationY = createAudioParam(this, isOffline, nativePannerNode.orientationY, MOST_POSITIVE_SINGLE_FLOAT, MOST_NEGATIVE_SINGLE_FLOAT);\n this._orientationZ = createAudioParam(this, isOffline, nativePannerNode.orientationZ, MOST_POSITIVE_SINGLE_FLOAT, MOST_NEGATIVE_SINGLE_FLOAT);\n this._positionX = createAudioParam(this, isOffline, nativePannerNode.positionX, MOST_POSITIVE_SINGLE_FLOAT, MOST_NEGATIVE_SINGLE_FLOAT);\n this._positionY = createAudioParam(this, isOffline, nativePannerNode.positionY, MOST_POSITIVE_SINGLE_FLOAT, MOST_NEGATIVE_SINGLE_FLOAT);\n this._positionZ = createAudioParam(this, isOffline, nativePannerNode.positionZ, MOST_POSITIVE_SINGLE_FLOAT, MOST_NEGATIVE_SINGLE_FLOAT);\n // @todo Determine a meaningful tail-time instead of just using one second.\n setAudioNodeTailTime(this, 1);\n }\n get coneInnerAngle() {\n return this._nativePannerNode.coneInnerAngle;\n }\n set coneInnerAngle(value) {\n this._nativePannerNode.coneInnerAngle = value;\n }\n get coneOuterAngle() {\n return this._nativePannerNode.coneOuterAngle;\n }\n set coneOuterAngle(value) {\n this._nativePannerNode.coneOuterAngle = value;\n }\n get coneOuterGain() {\n return this._nativePannerNode.coneOuterGain;\n }\n set coneOuterGain(value) {\n this._nativePannerNode.coneOuterGain = value;\n }\n get distanceModel() {\n return this._nativePannerNode.distanceModel;\n }\n set distanceModel(value) {\n this._nativePannerNode.distanceModel = value;\n }\n get maxDistance() {\n return this._nativePannerNode.maxDistance;\n }\n set maxDistance(value) {\n this._nativePannerNode.maxDistance = value;\n }\n get orientationX() {\n return this._orientationX;\n }\n get orientationY() {\n return this._orientationY;\n }\n get orientationZ() {\n return this._orientationZ;\n }\n get panningModel() {\n return this._nativePannerNode.panningModel;\n }\n set panningModel(value) {\n this._nativePannerNode.panningModel = value;\n }\n get positionX() {\n return this._positionX;\n }\n get positionY() {\n return this._positionY;\n }\n get positionZ() {\n return this._positionZ;\n }\n get refDistance() {\n return this._nativePannerNode.refDistance;\n }\n set refDistance(value) {\n this._nativePannerNode.refDistance = value;\n }\n get rolloffFactor() {\n return this._nativePannerNode.rolloffFactor;\n }\n set rolloffFactor(value) {\n this._nativePannerNode.rolloffFactor = value;\n }\n };\n};\n//# sourceMappingURL=panner-node-constructor.js.map","const DEFAULT_OPTIONS = {\n disableNormalization: false\n};\nexport const createPeriodicWaveConstructor = (createNativePeriodicWave, getNativeContext, periodicWaveStore, sanitizePeriodicWaveOptions) => {\n return class PeriodicWave {\n constructor(context, options) {\n const nativeContext = getNativeContext(context);\n const mergedOptions = sanitizePeriodicWaveOptions({ ...DEFAULT_OPTIONS, ...options });\n const periodicWave = createNativePeriodicWave(nativeContext, mergedOptions);\n periodicWaveStore.add(periodicWave);\n // This does violate all good pratices but it is used here to simplify the handling of periodic waves.\n return periodicWave;\n }\n static [Symbol.hasInstance](instance) {\n return ((instance !== null && typeof instance === 'object' && Object.getPrototypeOf(instance) === PeriodicWave.prototype) ||\n periodicWaveStore.has(instance));\n }\n };\n};\n//# sourceMappingURL=periodic-wave-constructor.js.map","const DEFAULT_OPTIONS = {\n channelCount: 2,\n /*\n * Bug #105: The channelCountMode should be 'clamped-max' according to the spec but is set to 'explicit' to achieve consistent\n * behavior.\n */\n channelCountMode: 'explicit',\n channelInterpretation: 'speakers',\n pan: 0\n};\nexport const createStereoPannerNodeConstructor = (audioNodeConstructor, createAudioParam, createNativeStereoPannerNode, createStereoPannerNodeRenderer, getNativeContext, isNativeOfflineAudioContext) => {\n return class StereoPannerNode extends audioNodeConstructor {\n constructor(context, options) {\n const nativeContext = getNativeContext(context);\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n const nativeStereoPannerNode = createNativeStereoPannerNode(nativeContext, mergedOptions);\n const isOffline = isNativeOfflineAudioContext(nativeContext);\n const stereoPannerNodeRenderer = (isOffline ? createStereoPannerNodeRenderer() : null);\n super(context, false, nativeStereoPannerNode, stereoPannerNodeRenderer);\n this._pan = createAudioParam(this, isOffline, nativeStereoPannerNode.pan);\n }\n get pan() {\n return this._pan;\n }\n };\n};\n//# sourceMappingURL=stereo-panner-node-constructor.js.map","export const createUnknownError = () => new DOMException('', 'UnknownError');\n//# sourceMappingURL=unknown-error.js.map","const DEFAULT_OPTIONS = {\n channelCount: 2,\n channelCountMode: 'max',\n channelInterpretation: 'speakers',\n curve: null,\n oversample: 'none'\n};\nexport const createWaveShaperNodeConstructor = (audioNodeConstructor, createInvalidStateError, createNativeWaveShaperNode, createWaveShaperNodeRenderer, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime) => {\n return class WaveShaperNode extends audioNodeConstructor {\n constructor(context, options) {\n const nativeContext = getNativeContext(context);\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n const nativeWaveShaperNode = createNativeWaveShaperNode(nativeContext, mergedOptions);\n const isOffline = isNativeOfflineAudioContext(nativeContext);\n const waveShaperNodeRenderer = (isOffline ? createWaveShaperNodeRenderer() : null);\n // @todo Add a mechanism to only switch a WaveShaperNode to active while it is connected.\n super(context, true, nativeWaveShaperNode, waveShaperNodeRenderer);\n this._isCurveNullified = false;\n this._nativeWaveShaperNode = nativeWaveShaperNode;\n // @todo Determine a meaningful tail-time instead of just using one second.\n setAudioNodeTailTime(this, 1);\n }\n get curve() {\n if (this._isCurveNullified) {\n return null;\n }\n return this._nativeWaveShaperNode.curve;\n }\n set curve(value) {\n // Bug #103: Safari does not allow to set the curve to null.\n if (value === null) {\n this._isCurveNullified = true;\n this._nativeWaveShaperNode.curve = new Float32Array([0, 0]);\n }\n else {\n // Bug #102: Safari does not throw an InvalidStateError when the curve has less than two samples.\n // Bug #104: Chrome, Edge and Opera will throw an InvalidAccessError when the curve has less than two samples.\n if (value.length < 2) {\n throw createInvalidStateError();\n }\n this._isCurveNullified = false;\n this._nativeWaveShaperNode.curve = value;\n }\n }\n get oversample() {\n return this._nativeWaveShaperNode.oversample;\n }\n set oversample(value) {\n this._nativeWaveShaperNode.oversample = value;\n }\n };\n};\n//# sourceMappingURL=wave-shaper-node-constructor.js.map","export const isDCCurve = (curve) => {\n if (curve === null) {\n return false;\n }\n const length = curve.length;\n if (length % 2 !== 0) {\n return curve[Math.floor(length / 2)] !== 0;\n }\n return curve[length / 2 - 1] + curve[length / 2] !== 0;\n};\n//# sourceMappingURL=is-dc-curve.js.map","export const overwriteAccessors = (object, property, createGetter, createSetter) => {\n let prototype = Object.getPrototypeOf(object);\n while (!prototype.hasOwnProperty(property)) {\n prototype = Object.getPrototypeOf(prototype);\n }\n const { get, set } = Object.getOwnPropertyDescriptor(prototype, property);\n Object.defineProperty(object, property, { get: createGetter(get), set: createSetter(set) });\n};\n//# sourceMappingURL=overwrite-accessors.js.map","export const setValueAtTimeUntilPossible = (audioParam, value, startTime) => {\n try {\n audioParam.setValueAtTime(value, startTime);\n }\n catch (err) {\n if (err.code !== 9) {\n throw err;\n }\n setValueAtTimeUntilPossible(audioParam, value, startTime + 1e-7);\n }\n};\n//# sourceMappingURL=set-value-at-time-until-possible.js.map","export const testAudioScheduledSourceNodeStartMethodNegativeParametersSupport = (nativeContext) => {\n const nativeAudioBufferSourceNode = nativeContext.createOscillator();\n try {\n nativeAudioBufferSourceNode.start(-1);\n }\n catch (err) {\n return err instanceof RangeError;\n }\n return false;\n};\n//# sourceMappingURL=test-audio-scheduled-source-node-start-method-negative-parameters-support.js.map","export const testAudioScheduledSourceNodeStopMethodConsecutiveCallsSupport = (nativeContext) => {\n const nativeAudioBuffer = nativeContext.createBuffer(1, 1, 44100);\n const nativeAudioBufferSourceNode = nativeContext.createBufferSource();\n nativeAudioBufferSourceNode.buffer = nativeAudioBuffer;\n nativeAudioBufferSourceNode.start();\n nativeAudioBufferSourceNode.stop();\n try {\n nativeAudioBufferSourceNode.stop();\n return true;\n }\n catch {\n return false;\n }\n};\n//# sourceMappingURL=test-audio-scheduled-source-node-stop-method-consecutive-calls-support.js.map","export const testAudioScheduledSourceNodeStopMethodNegativeParametersSupport = (nativeContext) => {\n const nativeAudioBufferSourceNode = nativeContext.createOscillator();\n try {\n nativeAudioBufferSourceNode.stop(-1);\n }\n catch (err) {\n return err instanceof RangeError;\n }\n return false;\n};\n//# sourceMappingURL=test-audio-scheduled-source-node-stop-method-negative-parameters-support.js.map","/*\n * Bug #122: Edge up to version v18 did not allow to construct a DOMException'. It also had a couple more bugs but since this is easy to\n * test it's used here as a placeholder.\n *\n * Bug #27: Edge up to version v18 did reject an invalid arrayBuffer passed to decodeAudioData() with a DOMException.\n *\n * Bug #50: Edge up to version v18 did not allow to create AudioNodes on a closed context.\n *\n * Bug #57: Edge up to version v18 did not throw an error when assigning the type of an OscillatorNode to 'custom'.\n *\n * Bug #63: Edge up to version v18 did not expose the mediaElement property of a MediaElementAudioSourceNode.\n *\n * Bug #64: Edge up to version v18 did not support the MediaStreamAudioDestinationNode.\n *\n * Bug #71: Edge up to version v18 did not allow to set the buffer of an AudioBufferSourceNode to null.\n *\n * Bug #93: Edge up to version v18 did set the sampleRate of an AudioContext to zero when it was closed.\n *\n * Bug #101: Edge up to version v18 refused to execute decodeAudioData() on a closed context.\n *\n * Bug #106: Edge up to version v18 did not expose the maxValue and minValue properties of the pan AudioParam of a StereoPannerNode.\n *\n * Bug #110: Edge up to version v18 did not expose the maxValue and minValue properties of the attack, knee, ratio, release and threshold AudioParams of a DynamicsCompressorNode.\n *\n * Bug #123: Edge up to version v18 did not support HRTF as the panningModel for a PannerNode.\n *\n * Bug #145: Edge up to version v18 did throw an IndexSizeError when an OfflineAudioContext was created with a sampleRate of zero.\n *\n * Bug #161: Edge up to version v18 did not expose the maxValue and minValue properties of the delayTime AudioParam of a DelayNode.\n */\nexport const testDomExceptionConstructorSupport = () => {\n try {\n new DOMException(); // tslint:disable-line:no-unused-expression\n }\n catch {\n return false;\n }\n return true;\n};\n//# sourceMappingURL=test-dom-exception-constructor-support.js.map","// Safari at version 11 did not support transferables.\nexport const testTransferablesSupport = () => new Promise((resolve) => {\n const arrayBuffer = new ArrayBuffer(0);\n const { port1, port2 } = new MessageChannel();\n port1.onmessage = ({ data }) => resolve(data !== null);\n port2.postMessage(arrayBuffer, [arrayBuffer]);\n});\n//# sourceMappingURL=test-transferables-support.js.map","import { interceptConnections } from './intercept-connections';\nexport const wrapAudioScheduledSourceNodeStopMethodConsecutiveCalls = (nativeAudioScheduledSourceNode, nativeContext) => {\n const nativeGainNode = nativeContext.createGain();\n nativeAudioScheduledSourceNode.connect(nativeGainNode);\n const disconnectGainNode = ((disconnect) => {\n return () => {\n // @todo TypeScript cannot infer the overloaded signature with 1 argument yet.\n disconnect.call(nativeAudioScheduledSourceNode, nativeGainNode);\n nativeAudioScheduledSourceNode.removeEventListener('ended', disconnectGainNode);\n };\n })(nativeAudioScheduledSourceNode.disconnect);\n nativeAudioScheduledSourceNode.addEventListener('ended', disconnectGainNode);\n interceptConnections(nativeAudioScheduledSourceNode, nativeGainNode);\n nativeAudioScheduledSourceNode.stop = ((stop) => {\n let isStopped = false;\n return (when = 0) => {\n if (isStopped) {\n try {\n stop.call(nativeAudioScheduledSourceNode, when);\n }\n catch {\n nativeGainNode.gain.setValueAtTime(0, when);\n }\n }\n else {\n stop.call(nativeAudioScheduledSourceNode, when);\n isStopped = true;\n }\n };\n })(nativeAudioScheduledSourceNode.stop);\n};\n//# sourceMappingURL=wrap-audio-scheduled-source-node-stop-method-consecutive-calls.js.map","export const wrapEventListener = (target, eventListener) => {\n return (event) => {\n const descriptor = { value: target };\n Object.defineProperties(event, {\n currentTarget: descriptor,\n target: descriptor\n });\n if (typeof eventListener === 'function') {\n return eventListener.call(target, event);\n }\n return eventListener.handleEvent.call(target, event);\n };\n};\n//# sourceMappingURL=wrap-event-listener.js.map","import { createCancelAndHoldAutomationEvent, createCancelScheduledValuesAutomationEvent, createExponentialRampToValueAutomationEvent, createLinearRampToValueAutomationEvent, createSetTargetAutomationEvent, createSetValueAutomationEvent, createSetValueCurveAutomationEvent } from 'automation-events';\nimport { createAbortError } from './factories/abort-error';\nimport { createAddActiveInputConnectionToAudioNode } from './factories/add-active-input-connection-to-audio-node';\nimport { createAddAudioNodeConnections } from './factories/add-audio-node-connections';\nimport { createAddAudioParamConnections } from './factories/add-audio-param-connections';\nimport { createAddAudioWorkletModule } from './factories/add-audio-worklet-module';\nimport { createAddConnectionToAudioNode } from './factories/add-connection-to-audio-node';\nimport { createAddPassiveInputConnectionToAudioNode } from './factories/add-passive-input-connection-to-audio-node';\nimport { createAddSilentConnection } from './factories/add-silent-connection';\nimport { createAddUnrenderedAudioWorkletNode } from './factories/add-unrendered-audio-worklet-node';\nimport { createAnalyserNodeConstructor } from './factories/analyser-node-constructor';\nimport { createAnalyserNodeRendererFactory } from './factories/analyser-node-renderer-factory';\nimport { createAudioBufferConstructor } from './factories/audio-buffer-constructor';\nimport { createAudioBufferSourceNodeConstructor } from './factories/audio-buffer-source-node-constructor';\nimport { createAudioBufferSourceNodeRendererFactory } from './factories/audio-buffer-source-node-renderer-factory';\nimport { createAudioContextConstructor } from './factories/audio-context-constructor';\nimport { createAudioDestinationNodeConstructor } from './factories/audio-destination-node-constructor';\nimport { createAudioDestinationNodeRenderer } from './factories/audio-destination-node-renderer-factory';\nimport { createAudioListenerFactory } from './factories/audio-listener-factory';\nimport { createAudioNodeConstructor } from './factories/audio-node-constructor';\nimport { createAudioParamFactory } from './factories/audio-param-factory';\nimport { createAudioParamRenderer } from './factories/audio-param-renderer';\nimport { createAudioWorkletNodeConstructor } from './factories/audio-worklet-node-constructor';\nimport { createAudioWorkletNodeRendererFactory } from './factories/audio-worklet-node-renderer-factory';\nimport { createBaseAudioContextConstructor } from './factories/base-audio-context-constructor';\nimport { createBiquadFilterNodeConstructor } from './factories/biquad-filter-node-constructor';\nimport { createBiquadFilterNodeRendererFactory } from './factories/biquad-filter-node-renderer-factory';\nimport { createCacheTestResult } from './factories/cache-test-result';\nimport { createChannelMergerNodeConstructor } from './factories/channel-merger-node-constructor';\nimport { createChannelMergerNodeRendererFactory } from './factories/channel-merger-node-renderer-factory';\nimport { createChannelSplitterNodeConstructor } from './factories/channel-splitter-node-constructor';\nimport { createChannelSplitterNodeRendererFactory } from './factories/channel-splitter-node-renderer-factory';\nimport { createConnectAudioParam } from './factories/connect-audio-param';\nimport { createConnectMultipleOutputs } from './factories/connect-multiple-outputs';\nimport { createConnectedNativeAudioBufferSourceNodeFactory } from './factories/connected-native-audio-buffer-source-node-factory';\nimport { createConstantSourceNodeConstructor } from './factories/constant-source-node-constructor';\nimport { createConstantSourceNodeRendererFactory } from './factories/constant-source-node-renderer-factory';\nimport { createConvertNumberToUnsignedLong } from './factories/convert-number-to-unsigned-long';\nimport { createConvolverNodeConstructor } from './factories/convolver-node-constructor';\nimport { createConvolverNodeRendererFactory } from './factories/convolver-node-renderer-factory';\nimport { createCreateNativeOfflineAudioContext } from './factories/create-native-offline-audio-context';\nimport { createDataCloneError } from './factories/data-clone-error';\nimport { createDecodeAudioData } from './factories/decode-audio-data';\nimport { createDecrementCycleCounter } from './factories/decrement-cycle-counter';\nimport { createDelayNodeConstructor } from './factories/delay-node-constructor';\nimport { createDelayNodeRendererFactory } from './factories/delay-node-renderer-factory';\nimport { createDeleteActiveInputConnectionToAudioNode } from './factories/delete-active-input-connection-to-audio-node';\nimport { createDeleteUnrenderedAudioWorkletNode } from './factories/delete-unrendered-audio-worklet-node';\nimport { createDetectCycles } from './factories/detect-cycles';\nimport { createDisconnectMultipleOutputs } from './factories/disconnect-multiple-outputs';\nimport { createDynamicsCompressorNodeConstructor } from './factories/dynamics-compressor-node-constructor';\nimport { createDynamicsCompressorNodeRendererFactory } from './factories/dynamics-compressor-node-renderer-factory';\nimport { createEncodingError } from './factories/encoding-error';\nimport { createEvaluateSource } from './factories/evaluate-source';\nimport { createEventTargetConstructor } from './factories/event-target-constructor';\nimport { createExposeCurrentFrameAndCurrentTime } from './factories/expose-current-frame-and-current-time';\nimport { createFetchSource } from './factories/fetch-source';\nimport { createGainNodeConstructor } from './factories/gain-node-constructor';\nimport { createGainNodeRendererFactory } from './factories/gain-node-renderer-factory';\nimport { createGetActiveAudioWorkletNodeInputs } from './factories/get-active-audio-worklet-node-inputs';\nimport { createGetAudioNodeRenderer } from './factories/get-audio-node-renderer';\nimport { createGetAudioNodeTailTime } from './factories/get-audio-node-tail-time';\nimport { createGetAudioParamRenderer } from './factories/get-audio-param-renderer';\nimport { createGetBackupOfflineAudioContext } from './factories/get-backup-offline-audio-context';\nimport { createGetNativeContext } from './factories/get-native-context';\nimport { createGetOrCreateBackupOfflineAudioContext } from './factories/get-or-create-backup-offline-audio-context';\nimport { createGetUnrenderedAudioWorkletNodes } from './factories/get-unrendered-audio-worklet-nodes';\nimport { createIIRFilterNodeConstructor } from './factories/iir-filter-node-constructor';\nimport { createIIRFilterNodeRendererFactory } from './factories/iir-filter-node-renderer-factory';\nimport { createIncrementCycleCounterFactory } from './factories/increment-cycle-counter-factory';\nimport { createIndexSizeError } from './factories/index-size-error';\nimport { createInvalidAccessError } from './factories/invalid-access-error';\nimport { createInvalidStateError } from './factories/invalid-state-error';\nimport { createIsAnyAudioContext } from './factories/is-any-audio-context';\nimport { createIsAnyAudioNode } from './factories/is-any-audio-node';\nimport { createIsAnyAudioParam } from './factories/is-any-audio-param';\nimport { createIsAnyOfflineAudioContext } from './factories/is-any-offline-audio-context';\nimport { createIsNativeAudioContext } from './factories/is-native-audio-context';\nimport { createIsNativeAudioNode } from './factories/is-native-audio-node';\nimport { createIsNativeAudioParam } from './factories/is-native-audio-param';\nimport { createIsNativeContext } from './factories/is-native-context';\nimport { createIsNativeOfflineAudioContext } from './factories/is-native-offline-audio-context';\nimport { createIsSecureContext } from './factories/is-secure-context';\nimport { createIsSupportedPromise } from './factories/is-supported-promise';\nimport { createMediaElementAudioSourceNodeConstructor } from './factories/media-element-audio-source-node-constructor';\nimport { createMediaStreamAudioDestinationNodeConstructor } from './factories/media-stream-audio-destination-node-constructor';\nimport { createMediaStreamAudioSourceNodeConstructor } from './factories/media-stream-audio-source-node-constructor';\nimport { createMediaStreamTrackAudioSourceNodeConstructor } from './factories/media-stream-track-audio-source-node-constructor';\nimport { createMinimalAudioContextConstructor } from './factories/minimal-audio-context-constructor';\nimport { createMinimalBaseAudioContextConstructor } from './factories/minimal-base-audio-context-constructor';\nimport { createMinimalOfflineAudioContextConstructor } from './factories/minimal-offline-audio-context-constructor';\nimport { createMonitorConnections } from './factories/monitor-connections';\nimport { createNativeAnalyserNodeFactory } from './factories/native-analyser-node-factory';\nimport { createNativeAudioBufferConstructor } from './factories/native-audio-buffer-constructor';\nimport { createNativeAudioBufferSourceNodeFactory } from './factories/native-audio-buffer-source-node-factory';\nimport { createNativeAudioContextConstructor } from './factories/native-audio-context-constructor';\nimport { createNativeAudioDestinationNodeFactory } from './factories/native-audio-destination-node';\nimport { createNativeAudioWorkletNodeConstructor } from './factories/native-audio-worklet-node-constructor';\nimport { createNativeAudioWorkletNodeFactory } from './factories/native-audio-worklet-node-factory';\nimport { createNativeAudioWorkletNodeFakerFactory } from './factories/native-audio-worklet-node-faker-factory';\nimport { createNativeBiquadFilterNode } from './factories/native-biquad-filter-node';\nimport { createNativeChannelMergerNodeFactory } from './factories/native-channel-merger-node-factory';\nimport { createNativeChannelSplitterNode } from './factories/native-channel-splitter-node';\nimport { createNativeConstantSourceNodeFactory } from './factories/native-constant-source-node-factory';\nimport { createNativeConstantSourceNodeFakerFactory } from './factories/native-constant-source-node-faker-factory';\nimport { createNativeConvolverNodeFactory } from './factories/native-convolver-node-factory';\nimport { createNativeDelayNode } from './factories/native-delay-node';\nimport { createNativeDynamicsCompressorNodeFactory } from './factories/native-dynamics-compressor-node-factory';\nimport { createNativeGainNode } from './factories/native-gain-node';\nimport { createNativeIIRFilterNodeFactory } from './factories/native-iir-filter-node-factory';\nimport { createNativeIIRFilterNodeFakerFactory } from './factories/native-iir-filter-node-faker-factory';\nimport { createNativeMediaElementAudioSourceNode } from './factories/native-media-element-audio-source-node';\nimport { createNativeMediaStreamAudioDestinationNode } from './factories/native-media-stream-audio-destination-node';\nimport { createNativeMediaStreamAudioSourceNode } from './factories/native-media-stream-audio-source-node';\nimport { createNativeMediaStreamTrackAudioSourceNodeFactory } from './factories/native-media-stream-track-audio-source-node-factory';\nimport { createNativeOfflineAudioContextConstructor } from './factories/native-offline-audio-context-constructor';\nimport { createNativeOscillatorNodeFactory } from './factories/native-oscillator-node-factory';\nimport { createNativePannerNodeFactory } from './factories/native-panner-node-factory';\nimport { createNativePannerNodeFakerFactory } from './factories/native-panner-node-faker-factory';\nimport { createNativePeriodicWaveFactory } from './factories/native-periodic-wave-factory';\nimport { createNativeScriptProcessorNode } from './factories/native-script-processor-node';\nimport { createNativeStereoPannerNodeFactory } from './factories/native-stereo-panner-node-factory';\nimport { createNativeStereoPannerNodeFakerFactory } from './factories/native-stereo-panner-node-faker-factory';\nimport { createNativeWaveShaperNodeFactory } from './factories/native-wave-shaper-node-factory';\nimport { createNativeWaveShaperNodeFakerFactory } from './factories/native-wave-shaper-node-faker-factory';\nimport { createNotSupportedError } from './factories/not-supported-error';\nimport { createOfflineAudioContextConstructor } from './factories/offline-audio-context-constructor';\nimport { createOscillatorNodeConstructor } from './factories/oscillator-node-constructor';\nimport { createOscillatorNodeRendererFactory } from './factories/oscillator-node-renderer-factory';\nimport { createPannerNodeConstructor } from './factories/panner-node-constructor';\nimport { createPannerNodeRendererFactory } from './factories/panner-node-renderer-factory';\nimport { createPeriodicWaveConstructor } from './factories/periodic-wave-constructor';\nimport { createRenderAutomation } from './factories/render-automation';\nimport { createRenderInputsOfAudioNode } from './factories/render-inputs-of-audio-node';\nimport { createRenderInputsOfAudioParam } from './factories/render-inputs-of-audio-param';\nimport { createRenderNativeOfflineAudioContext } from './factories/render-native-offline-audio-context';\nimport { createSetActiveAudioWorkletNodeInputs } from './factories/set-active-audio-worklet-node-inputs';\nimport { createSetAudioNodeTailTime } from './factories/set-audio-node-tail-time';\nimport { createStartRendering } from './factories/start-rendering';\nimport { createStereoPannerNodeConstructor } from './factories/stereo-panner-node-constructor';\nimport { createStereoPannerNodeRendererFactory } from './factories/stereo-panner-node-renderer-factory';\nimport { createTestAudioBufferConstructorSupport } from './factories/test-audio-buffer-constructor-support';\nimport { createTestAudioBufferCopyChannelMethodsSubarraySupport } from './factories/test-audio-buffer-copy-channel-methods-subarray-support';\nimport { createTestAudioContextCloseMethodSupport } from './factories/test-audio-context-close-method-support';\nimport { createTestAudioContextDecodeAudioDataMethodTypeErrorSupport } from './factories/test-audio-context-decode-audio-data-method-type-error-support';\nimport { createTestAudioContextOptionsSupport } from './factories/test-audio-context-options-support';\nimport { createTestAudioNodeConnectMethodSupport } from './factories/test-audio-node-connect-method-support';\nimport { createTestAudioWorkletProcessorNoOutputsSupport } from './factories/test-audio-worklet-processor-no-outputs-support';\nimport { createTestAudioWorkletProcessorPostMessageSupport } from './factories/test-audio-worklet-processor-post-message-support';\nimport { createTestChannelMergerNodeChannelCountSupport } from './factories/test-channel-merger-node-channel-count-support';\nimport { createTestConstantSourceNodeAccurateSchedulingSupport } from './factories/test-constant-source-node-accurate-scheduling-support';\nimport { createTestConvolverNodeBufferReassignabilitySupport } from './factories/test-convolver-node-buffer-reassignability-support';\nimport { createTestConvolverNodeChannelCountSupport } from './factories/test-convolver-node-channel-count-support';\nimport { createTestIsSecureContextSupport } from './factories/test-is-secure-context-support';\nimport { createTestMediaStreamAudioSourceNodeMediaStreamWithoutAudioTrackSupport } from './factories/test-media-stream-audio-source-node-media-stream-without-audio-track-support';\nimport { createTestOfflineAudioContextCurrentTimeSupport } from './factories/test-offline-audio-context-current-time-support';\nimport { createTestStereoPannerNodeDefaultValueSupport } from './factories/test-stereo-panner-node-default-value-support';\nimport { createUnknownError } from './factories/unknown-error';\nimport { createWaveShaperNodeConstructor } from './factories/wave-shaper-node-constructor';\nimport { createWaveShaperNodeRendererFactory } from './factories/wave-shaper-node-renderer-factory';\nimport { createWindow } from './factories/window';\nimport { createWrapAudioBufferCopyChannelMethods } from './factories/wrap-audio-buffer-copy-channel-methods';\nimport { createWrapAudioBufferCopyChannelMethodsOutOfBounds } from './factories/wrap-audio-buffer-copy-channel-methods-out-of-bounds';\nimport { createWrapAudioBufferSourceNodeStopMethodNullifiedBuffer } from './factories/wrap-audio-buffer-source-node-stop-method-nullified-buffer';\nimport { createWrapChannelMergerNode } from './factories/wrap-channel-merger-node';\nimport { AUDIO_NODE_CONNECTIONS_STORE, AUDIO_NODE_STORE, AUDIO_PARAM_CONNECTIONS_STORE, AUDIO_PARAM_STORE, CONTEXT_STORE, CYCLE_COUNTERS } from './globals';\nimport { connectNativeAudioNodeToNativeAudioNode } from './helpers/connect-native-audio-node-to-native-audio-node';\nimport { disconnectNativeAudioNodeFromNativeAudioNode } from './helpers/disconnect-native-audio-node-from-native-audio-node';\nimport { getAudioNodeConnections } from './helpers/get-audio-node-connections';\nimport { getAudioParamConnections } from './helpers/get-audio-param-connections';\nimport { getEventListenersOfAudioNode } from './helpers/get-event-listeners-of-audio-node';\nimport { getNativeAudioNode } from './helpers/get-native-audio-node';\nimport { getNativeAudioParam } from './helpers/get-native-audio-param';\nimport { getValueForKey } from './helpers/get-value-for-key';\nimport { insertElementInSet } from './helpers/insert-element-in-set';\nimport { isActiveAudioNode } from './helpers/is-active-audio-node';\nimport { isDCCurve } from './helpers/is-dc-curve';\nimport { isPartOfACycle } from './helpers/is-part-of-a-cycle';\nimport { isPassiveAudioNode } from './helpers/is-passive-audio-node';\nimport { overwriteAccessors } from './helpers/overwrite-accessors';\nimport { pickElementFromSet } from './helpers/pick-element-from-set';\nimport { sanitizeAudioWorkletNodeOptions } from './helpers/sanitize-audio-worklet-node-options';\nimport { sanitizeChannelSplitterOptions } from './helpers/sanitize-channel-splitter-options';\nimport { sanitizePeriodicWaveOptions } from './helpers/sanitize-periodic-wave-options';\nimport { setValueAtTimeUntilPossible } from './helpers/set-value-at-time-until-possible';\nimport { testAudioBufferCopyChannelMethodsOutOfBoundsSupport } from './helpers/test-audio-buffer-copy-channel-methods-out-of-bounds-support';\nimport { testAudioBufferSourceNodeStartMethodConsecutiveCallsSupport } from './helpers/test-audio-buffer-source-node-start-method-consecutive-calls-support';\nimport { testAudioBufferSourceNodeStartMethodOffsetClampingSupport } from './helpers/test-audio-buffer-source-node-start-method-offset-clamping-support';\nimport { testAudioBufferSourceNodeStopMethodNullifiedBufferSupport } from './helpers/test-audio-buffer-source-node-stop-method-nullified-buffer-support';\nimport { testAudioScheduledSourceNodeStartMethodNegativeParametersSupport } from './helpers/test-audio-scheduled-source-node-start-method-negative-parameters-support';\nimport { testAudioScheduledSourceNodeStopMethodConsecutiveCallsSupport } from './helpers/test-audio-scheduled-source-node-stop-method-consecutive-calls-support';\nimport { testAudioScheduledSourceNodeStopMethodNegativeParametersSupport } from './helpers/test-audio-scheduled-source-node-stop-method-negative-parameters-support';\nimport { testDomExceptionConstructorSupport } from './helpers/test-dom-exception-constructor-support';\nimport { testPromiseSupport } from './helpers/test-promise-support';\nimport { testTransferablesSupport } from './helpers/test-transferables-support';\nimport { wrapAudioBufferSourceNodeStartMethodOffsetClamping } from './helpers/wrap-audio-buffer-source-node-start-method-offset-clamping';\nimport { wrapAudioScheduledSourceNodeStopMethodConsecutiveCalls } from './helpers/wrap-audio-scheduled-source-node-stop-method-consecutive-calls';\nimport { wrapEventListener } from './helpers/wrap-event-listener';\n/*\n * @todo Explicitly referencing the barrel file seems to be necessary when enabling the\n * isolatedModules compiler option.\n */\nexport * from './interfaces/index';\nexport * from './types/index';\nconst addActiveInputConnectionToAudioNode = createAddActiveInputConnectionToAudioNode(insertElementInSet);\nconst addPassiveInputConnectionToAudioNode = createAddPassiveInputConnectionToAudioNode(insertElementInSet);\nconst deleteActiveInputConnectionToAudioNode = createDeleteActiveInputConnectionToAudioNode(pickElementFromSet);\nconst audioNodeTailTimeStore = new WeakMap();\nconst getAudioNodeTailTime = createGetAudioNodeTailTime(audioNodeTailTimeStore);\nconst cacheTestResult = createCacheTestResult(new Map(), new WeakMap());\nconst window = createWindow();\nconst createNativeAnalyserNode = createNativeAnalyserNodeFactory(cacheTestResult, createIndexSizeError);\nconst getAudioNodeRenderer = createGetAudioNodeRenderer(getAudioNodeConnections);\nconst renderInputsOfAudioNode = createRenderInputsOfAudioNode(getAudioNodeConnections, getAudioNodeRenderer, isPartOfACycle);\nconst createAnalyserNodeRenderer = createAnalyserNodeRendererFactory(createNativeAnalyserNode, getNativeAudioNode, renderInputsOfAudioNode);\nconst getNativeContext = createGetNativeContext(CONTEXT_STORE);\nconst nativeOfflineAudioContextConstructor = createNativeOfflineAudioContextConstructor(window);\nconst isNativeOfflineAudioContext = createIsNativeOfflineAudioContext(nativeOfflineAudioContextConstructor);\nconst audioParamAudioNodeStore = new WeakMap();\nconst eventTargetConstructor = createEventTargetConstructor(wrapEventListener);\nconst nativeAudioContextConstructor = createNativeAudioContextConstructor(window);\nconst isNativeAudioContext = createIsNativeAudioContext(nativeAudioContextConstructor);\nconst isNativeAudioNode = createIsNativeAudioNode(window);\nconst isNativeAudioParam = createIsNativeAudioParam(window);\nconst audioNodeConstructor = createAudioNodeConstructor(createAddAudioNodeConnections(AUDIO_NODE_CONNECTIONS_STORE), createAddConnectionToAudioNode(addActiveInputConnectionToAudioNode, addPassiveInputConnectionToAudioNode, connectNativeAudioNodeToNativeAudioNode, deleteActiveInputConnectionToAudioNode, disconnectNativeAudioNodeFromNativeAudioNode, getAudioNodeConnections, getAudioNodeTailTime, getEventListenersOfAudioNode, getNativeAudioNode, insertElementInSet, isActiveAudioNode, isPartOfACycle, isPassiveAudioNode), cacheTestResult, createIncrementCycleCounterFactory(CYCLE_COUNTERS, disconnectNativeAudioNodeFromNativeAudioNode, getAudioNodeConnections, getNativeAudioNode, getNativeAudioParam, isActiveAudioNode), createIndexSizeError, createInvalidAccessError, createNotSupportedError, createDecrementCycleCounter(connectNativeAudioNodeToNativeAudioNode, CYCLE_COUNTERS, getAudioNodeConnections, getNativeAudioNode, getNativeAudioParam, getNativeContext, isActiveAudioNode, isNativeOfflineAudioContext), createDetectCycles(audioParamAudioNodeStore, getAudioNodeConnections, getValueForKey), eventTargetConstructor, getNativeContext, isNativeAudioContext, isNativeAudioNode, isNativeAudioParam, isNativeOfflineAudioContext);\nconst analyserNodeConstructor = createAnalyserNodeConstructor(audioNodeConstructor, createAnalyserNodeRenderer, createIndexSizeError, createNativeAnalyserNode, getNativeContext, isNativeOfflineAudioContext);\nexport { analyserNodeConstructor as AnalyserNode };\nconst audioBufferStore = new WeakSet();\nconst nativeAudioBufferConstructor = createNativeAudioBufferConstructor(window);\nconst convertNumberToUnsignedLong = createConvertNumberToUnsignedLong(new Uint32Array(1));\nconst wrapAudioBufferCopyChannelMethods = createWrapAudioBufferCopyChannelMethods(convertNumberToUnsignedLong, createIndexSizeError);\nconst wrapAudioBufferCopyChannelMethodsOutOfBounds = createWrapAudioBufferCopyChannelMethodsOutOfBounds(convertNumberToUnsignedLong);\nconst audioBufferConstructor = createAudioBufferConstructor(audioBufferStore, cacheTestResult, createNotSupportedError, nativeAudioBufferConstructor, nativeOfflineAudioContextConstructor, createTestAudioBufferConstructorSupport(nativeAudioBufferConstructor), wrapAudioBufferCopyChannelMethods, wrapAudioBufferCopyChannelMethodsOutOfBounds);\nexport { audioBufferConstructor as AudioBuffer };\nconst addSilentConnection = createAddSilentConnection(createNativeGainNode);\nconst renderInputsOfAudioParam = createRenderInputsOfAudioParam(getAudioNodeRenderer, getAudioParamConnections, isPartOfACycle);\nconst connectAudioParam = createConnectAudioParam(renderInputsOfAudioParam);\nconst createNativeAudioBufferSourceNode = createNativeAudioBufferSourceNodeFactory(addSilentConnection, cacheTestResult, testAudioBufferSourceNodeStartMethodConsecutiveCallsSupport, testAudioBufferSourceNodeStartMethodOffsetClampingSupport, testAudioBufferSourceNodeStopMethodNullifiedBufferSupport, testAudioScheduledSourceNodeStartMethodNegativeParametersSupport, testAudioScheduledSourceNodeStopMethodConsecutiveCallsSupport, testAudioScheduledSourceNodeStopMethodNegativeParametersSupport, wrapAudioBufferSourceNodeStartMethodOffsetClamping, createWrapAudioBufferSourceNodeStopMethodNullifiedBuffer(overwriteAccessors), wrapAudioScheduledSourceNodeStopMethodConsecutiveCalls);\nconst renderAutomation = createRenderAutomation(createGetAudioParamRenderer(getAudioParamConnections), renderInputsOfAudioParam);\nconst createAudioBufferSourceNodeRenderer = createAudioBufferSourceNodeRendererFactory(connectAudioParam, createNativeAudioBufferSourceNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode);\nconst createAudioParam = createAudioParamFactory(createAddAudioParamConnections(AUDIO_PARAM_CONNECTIONS_STORE), audioParamAudioNodeStore, AUDIO_PARAM_STORE, createAudioParamRenderer, createCancelAndHoldAutomationEvent, createCancelScheduledValuesAutomationEvent, createExponentialRampToValueAutomationEvent, createLinearRampToValueAutomationEvent, createSetTargetAutomationEvent, createSetValueAutomationEvent, createSetValueCurveAutomationEvent, nativeAudioContextConstructor, setValueAtTimeUntilPossible);\nconst audioBufferSourceNodeConstructor = createAudioBufferSourceNodeConstructor(audioNodeConstructor, createAudioBufferSourceNodeRenderer, createAudioParam, createInvalidStateError, createNativeAudioBufferSourceNode, getNativeContext, isNativeOfflineAudioContext, wrapEventListener);\nexport { audioBufferSourceNodeConstructor as AudioBufferSourceNode };\nconst audioDestinationNodeConstructor = createAudioDestinationNodeConstructor(audioNodeConstructor, createAudioDestinationNodeRenderer, createIndexSizeError, createInvalidStateError, createNativeAudioDestinationNodeFactory(createNativeGainNode, overwriteAccessors), getNativeContext, isNativeOfflineAudioContext, renderInputsOfAudioNode);\nconst createBiquadFilterNodeRenderer = createBiquadFilterNodeRendererFactory(connectAudioParam, createNativeBiquadFilterNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode);\nconst setAudioNodeTailTime = createSetAudioNodeTailTime(audioNodeTailTimeStore);\nconst biquadFilterNodeConstructor = createBiquadFilterNodeConstructor(audioNodeConstructor, createAudioParam, createBiquadFilterNodeRenderer, createInvalidAccessError, createNativeBiquadFilterNode, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime);\nconst monitorConnections = createMonitorConnections(insertElementInSet, isNativeAudioNode);\nconst wrapChannelMergerNode = createWrapChannelMergerNode(createInvalidStateError, monitorConnections);\nconst createNativeChannelMergerNode = createNativeChannelMergerNodeFactory(nativeAudioContextConstructor, wrapChannelMergerNode);\nconst createChannelMergerNodeRenderer = createChannelMergerNodeRendererFactory(createNativeChannelMergerNode, getNativeAudioNode, renderInputsOfAudioNode);\nconst channelMergerNodeConstructor = createChannelMergerNodeConstructor(audioNodeConstructor, createChannelMergerNodeRenderer, createNativeChannelMergerNode, getNativeContext, isNativeOfflineAudioContext);\nconst createChannelSplitterNodeRenderer = createChannelSplitterNodeRendererFactory(createNativeChannelSplitterNode, getNativeAudioNode, renderInputsOfAudioNode);\nconst channelSplitterNodeConstructor = createChannelSplitterNodeConstructor(audioNodeConstructor, createChannelSplitterNodeRenderer, createNativeChannelSplitterNode, getNativeContext, isNativeOfflineAudioContext, sanitizeChannelSplitterOptions);\nconst createNativeConstantSourceNodeFaker = createNativeConstantSourceNodeFakerFactory(addSilentConnection, createNativeAudioBufferSourceNode, createNativeGainNode, monitorConnections);\nconst createNativeConstantSourceNode = createNativeConstantSourceNodeFactory(addSilentConnection, cacheTestResult, createNativeConstantSourceNodeFaker, testAudioScheduledSourceNodeStartMethodNegativeParametersSupport, testAudioScheduledSourceNodeStopMethodNegativeParametersSupport);\nconst createConstantSourceNodeRenderer = createConstantSourceNodeRendererFactory(connectAudioParam, createNativeConstantSourceNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode);\nconst constantSourceNodeConstructor = createConstantSourceNodeConstructor(audioNodeConstructor, createAudioParam, createConstantSourceNodeRenderer, createNativeConstantSourceNode, getNativeContext, isNativeOfflineAudioContext, wrapEventListener);\nconst createNativeConvolverNode = createNativeConvolverNodeFactory(createNotSupportedError, overwriteAccessors);\nconst createConvolverNodeRenderer = createConvolverNodeRendererFactory(createNativeConvolverNode, getNativeAudioNode, renderInputsOfAudioNode);\nconst convolverNodeConstructor = createConvolverNodeConstructor(audioNodeConstructor, createConvolverNodeRenderer, createNativeConvolverNode, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime);\nconst createDelayNodeRenderer = createDelayNodeRendererFactory(connectAudioParam, createNativeDelayNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode);\nconst delayNodeConstructor = createDelayNodeConstructor(audioNodeConstructor, createAudioParam, createDelayNodeRenderer, createNativeDelayNode, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime);\nconst createNativeDynamicsCompressorNode = createNativeDynamicsCompressorNodeFactory(createNotSupportedError);\nconst createDynamicsCompressorNodeRenderer = createDynamicsCompressorNodeRendererFactory(connectAudioParam, createNativeDynamicsCompressorNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode);\nconst dynamicsCompressorNodeConstructor = createDynamicsCompressorNodeConstructor(audioNodeConstructor, createAudioParam, createDynamicsCompressorNodeRenderer, createNativeDynamicsCompressorNode, createNotSupportedError, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime);\nconst createGainNodeRenderer = createGainNodeRendererFactory(connectAudioParam, createNativeGainNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode);\nconst gainNodeConstructor = createGainNodeConstructor(audioNodeConstructor, createAudioParam, createGainNodeRenderer, createNativeGainNode, getNativeContext, isNativeOfflineAudioContext);\nconst createNativeIIRFilterNodeFaker = createNativeIIRFilterNodeFakerFactory(createInvalidAccessError, createInvalidStateError, createNativeScriptProcessorNode, createNotSupportedError);\nconst renderNativeOfflineAudioContext = createRenderNativeOfflineAudioContext(cacheTestResult, createNativeGainNode, createNativeScriptProcessorNode, createTestOfflineAudioContextCurrentTimeSupport(createNativeGainNode, nativeOfflineAudioContextConstructor));\nconst createIIRFilterNodeRenderer = createIIRFilterNodeRendererFactory(createNativeAudioBufferSourceNode, getNativeAudioNode, nativeOfflineAudioContextConstructor, renderInputsOfAudioNode, renderNativeOfflineAudioContext);\nconst createNativeIIRFilterNode = createNativeIIRFilterNodeFactory(createNativeIIRFilterNodeFaker);\nconst iIRFilterNodeConstructor = createIIRFilterNodeConstructor(audioNodeConstructor, createNativeIIRFilterNode, createIIRFilterNodeRenderer, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime);\nconst createAudioListener = createAudioListenerFactory(createAudioParam, createNativeChannelMergerNode, createNativeConstantSourceNode, createNativeScriptProcessorNode, isNativeOfflineAudioContext);\nconst unrenderedAudioWorkletNodeStore = new WeakMap();\nconst minimalBaseAudioContextConstructor = createMinimalBaseAudioContextConstructor(audioDestinationNodeConstructor, createAudioListener, eventTargetConstructor, isNativeOfflineAudioContext, unrenderedAudioWorkletNodeStore, wrapEventListener);\nconst createNativeOscillatorNode = createNativeOscillatorNodeFactory(addSilentConnection, cacheTestResult, testAudioScheduledSourceNodeStartMethodNegativeParametersSupport, testAudioScheduledSourceNodeStopMethodConsecutiveCallsSupport, testAudioScheduledSourceNodeStopMethodNegativeParametersSupport, wrapAudioScheduledSourceNodeStopMethodConsecutiveCalls);\nconst createOscillatorNodeRenderer = createOscillatorNodeRendererFactory(connectAudioParam, createNativeOscillatorNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode);\nconst oscillatorNodeConstructor = createOscillatorNodeConstructor(audioNodeConstructor, createAudioParam, createNativeOscillatorNode, createOscillatorNodeRenderer, getNativeContext, isNativeOfflineAudioContext, wrapEventListener);\nconst createConnectedNativeAudioBufferSourceNode = createConnectedNativeAudioBufferSourceNodeFactory(createNativeAudioBufferSourceNode);\nconst createNativeWaveShaperNodeFaker = createNativeWaveShaperNodeFakerFactory(createConnectedNativeAudioBufferSourceNode, createInvalidStateError, createNativeGainNode, isDCCurve, monitorConnections);\nconst createNativeWaveShaperNode = createNativeWaveShaperNodeFactory(createConnectedNativeAudioBufferSourceNode, createInvalidStateError, createNativeWaveShaperNodeFaker, isDCCurve, monitorConnections, nativeAudioContextConstructor, overwriteAccessors);\nconst createNativePannerNodeFaker = createNativePannerNodeFakerFactory(connectNativeAudioNodeToNativeAudioNode, createInvalidStateError, createNativeChannelMergerNode, createNativeGainNode, createNativeScriptProcessorNode, createNativeWaveShaperNode, createNotSupportedError, disconnectNativeAudioNodeFromNativeAudioNode, monitorConnections);\nconst createNativePannerNode = createNativePannerNodeFactory(createNativePannerNodeFaker);\nconst createPannerNodeRenderer = createPannerNodeRendererFactory(connectAudioParam, createNativeChannelMergerNode, createNativeConstantSourceNode, createNativeGainNode, createNativePannerNode, getNativeAudioNode, nativeOfflineAudioContextConstructor, renderAutomation, renderInputsOfAudioNode, renderNativeOfflineAudioContext);\nconst pannerNodeConstructor = createPannerNodeConstructor(audioNodeConstructor, createAudioParam, createNativePannerNode, createPannerNodeRenderer, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime);\nconst createNativePeriodicWave = createNativePeriodicWaveFactory(createIndexSizeError);\nconst periodicWaveConstructor = createPeriodicWaveConstructor(createNativePeriodicWave, getNativeContext, new WeakSet(), sanitizePeriodicWaveOptions);\nconst nativeStereoPannerNodeFakerFactory = createNativeStereoPannerNodeFakerFactory(createNativeChannelMergerNode, createNativeChannelSplitterNode, createNativeGainNode, createNativeWaveShaperNode, createNotSupportedError, monitorConnections);\nconst createNativeStereoPannerNode = createNativeStereoPannerNodeFactory(nativeStereoPannerNodeFakerFactory, createNotSupportedError);\nconst createStereoPannerNodeRenderer = createStereoPannerNodeRendererFactory(connectAudioParam, createNativeStereoPannerNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode);\nconst stereoPannerNodeConstructor = createStereoPannerNodeConstructor(audioNodeConstructor, createAudioParam, createNativeStereoPannerNode, createStereoPannerNodeRenderer, getNativeContext, isNativeOfflineAudioContext);\nconst createWaveShaperNodeRenderer = createWaveShaperNodeRendererFactory(createNativeWaveShaperNode, getNativeAudioNode, renderInputsOfAudioNode);\nconst waveShaperNodeConstructor = createWaveShaperNodeConstructor(audioNodeConstructor, createInvalidStateError, createNativeWaveShaperNode, createWaveShaperNodeRenderer, getNativeContext, isNativeOfflineAudioContext, setAudioNodeTailTime);\nconst isSecureContext = createIsSecureContext(window);\nconst exposeCurrentFrameAndCurrentTime = createExposeCurrentFrameAndCurrentTime(window);\nconst backupOfflineAudioContextStore = new WeakMap();\nconst getOrCreateBackupOfflineAudioContext = createGetOrCreateBackupOfflineAudioContext(backupOfflineAudioContextStore, nativeOfflineAudioContextConstructor);\nconst nativeAudioWorkletNodeConstructor = createNativeAudioWorkletNodeConstructor(window);\n// The addAudioWorkletModule() function is only available in a SecureContext.\nexport const addAudioWorkletModule = isSecureContext\n ? createAddAudioWorkletModule(cacheTestResult, createNotSupportedError, createEvaluateSource(window), exposeCurrentFrameAndCurrentTime, createFetchSource(createAbortError), getNativeContext, getOrCreateBackupOfflineAudioContext, isNativeOfflineAudioContext, new WeakMap(), new WeakMap(), createTestAudioWorkletProcessorPostMessageSupport(nativeAudioWorkletNodeConstructor, nativeOfflineAudioContextConstructor), \n // @todo window is guaranteed to be defined because isSecureContext checks that as well.\n window)\n : undefined;\nconst isNativeContext = createIsNativeContext(isNativeAudioContext, isNativeOfflineAudioContext);\nexport const decodeAudioData = createDecodeAudioData(audioBufferStore, cacheTestResult, createDataCloneError, createEncodingError, new WeakSet(), getNativeContext, isNativeContext, testAudioBufferCopyChannelMethodsOutOfBoundsSupport, testPromiseSupport, wrapAudioBufferCopyChannelMethods, wrapAudioBufferCopyChannelMethodsOutOfBounds);\nconst baseAudioContextConstructor = createBaseAudioContextConstructor(addAudioWorkletModule, analyserNodeConstructor, audioBufferConstructor, audioBufferSourceNodeConstructor, biquadFilterNodeConstructor, channelMergerNodeConstructor, channelSplitterNodeConstructor, constantSourceNodeConstructor, convolverNodeConstructor, decodeAudioData, delayNodeConstructor, dynamicsCompressorNodeConstructor, gainNodeConstructor, iIRFilterNodeConstructor, minimalBaseAudioContextConstructor, oscillatorNodeConstructor, pannerNodeConstructor, periodicWaveConstructor, stereoPannerNodeConstructor, waveShaperNodeConstructor);\nconst mediaElementAudioSourceNodeConstructor = createMediaElementAudioSourceNodeConstructor(audioNodeConstructor, createNativeMediaElementAudioSourceNode, getNativeContext, isNativeOfflineAudioContext);\nconst mediaStreamAudioDestinationNodeConstructor = createMediaStreamAudioDestinationNodeConstructor(audioNodeConstructor, createNativeMediaStreamAudioDestinationNode, getNativeContext, isNativeOfflineAudioContext);\nconst mediaStreamAudioSourceNodeConstructor = createMediaStreamAudioSourceNodeConstructor(audioNodeConstructor, createNativeMediaStreamAudioSourceNode, getNativeContext, isNativeOfflineAudioContext);\nconst createNativeMediaStreamTrackAudioSourceNode = createNativeMediaStreamTrackAudioSourceNodeFactory(createInvalidStateError, isNativeOfflineAudioContext);\nconst mediaStreamTrackAudioSourceNodeConstructor = createMediaStreamTrackAudioSourceNodeConstructor(audioNodeConstructor, createNativeMediaStreamTrackAudioSourceNode, getNativeContext);\nconst audioContextConstructor = createAudioContextConstructor(baseAudioContextConstructor, createInvalidStateError, createNotSupportedError, createUnknownError, mediaElementAudioSourceNodeConstructor, mediaStreamAudioDestinationNodeConstructor, mediaStreamAudioSourceNodeConstructor, mediaStreamTrackAudioSourceNodeConstructor, nativeAudioContextConstructor);\nexport { audioContextConstructor as AudioContext };\nconst getUnrenderedAudioWorkletNodes = createGetUnrenderedAudioWorkletNodes(unrenderedAudioWorkletNodeStore);\nconst addUnrenderedAudioWorkletNode = createAddUnrenderedAudioWorkletNode(getUnrenderedAudioWorkletNodes);\nconst connectMultipleOutputs = createConnectMultipleOutputs(createIndexSizeError);\nconst deleteUnrenderedAudioWorkletNode = createDeleteUnrenderedAudioWorkletNode(getUnrenderedAudioWorkletNodes);\nconst disconnectMultipleOutputs = createDisconnectMultipleOutputs(createIndexSizeError);\nconst activeAudioWorkletNodeInputsStore = new WeakMap();\nconst getActiveAudioWorkletNodeInputs = createGetActiveAudioWorkletNodeInputs(activeAudioWorkletNodeInputsStore, getValueForKey);\nconst createNativeAudioWorkletNodeFaker = createNativeAudioWorkletNodeFakerFactory(connectMultipleOutputs, createIndexSizeError, createInvalidStateError, createNativeChannelMergerNode, createNativeChannelSplitterNode, createNativeConstantSourceNode, createNativeGainNode, createNativeScriptProcessorNode, createNotSupportedError, disconnectMultipleOutputs, exposeCurrentFrameAndCurrentTime, getActiveAudioWorkletNodeInputs, monitorConnections);\nconst createNativeAudioWorkletNode = createNativeAudioWorkletNodeFactory(createInvalidStateError, createNativeAudioWorkletNodeFaker, createNativeGainNode, createNotSupportedError, monitorConnections);\nconst createAudioWorkletNodeRenderer = createAudioWorkletNodeRendererFactory(connectAudioParam, connectMultipleOutputs, createNativeAudioBufferSourceNode, createNativeChannelMergerNode, createNativeChannelSplitterNode, createNativeConstantSourceNode, createNativeGainNode, deleteUnrenderedAudioWorkletNode, disconnectMultipleOutputs, exposeCurrentFrameAndCurrentTime, getNativeAudioNode, nativeAudioWorkletNodeConstructor, nativeOfflineAudioContextConstructor, renderAutomation, renderInputsOfAudioNode, renderNativeOfflineAudioContext);\nconst getBackupOfflineAudioContext = createGetBackupOfflineAudioContext(backupOfflineAudioContextStore);\nconst setActiveAudioWorkletNodeInputs = createSetActiveAudioWorkletNodeInputs(activeAudioWorkletNodeInputsStore);\n// The AudioWorkletNode constructor is only available in a SecureContext.\nconst audioWorkletNodeConstructor = isSecureContext\n ? createAudioWorkletNodeConstructor(addUnrenderedAudioWorkletNode, audioNodeConstructor, createAudioParam, createAudioWorkletNodeRenderer, createNativeAudioWorkletNode, getAudioNodeConnections, getBackupOfflineAudioContext, getNativeContext, isNativeOfflineAudioContext, nativeAudioWorkletNodeConstructor, sanitizeAudioWorkletNodeOptions, setActiveAudioWorkletNodeInputs, wrapEventListener)\n : undefined;\nexport { audioWorkletNodeConstructor as AudioWorkletNode };\nexport { biquadFilterNodeConstructor as BiquadFilterNode };\nexport { channelMergerNodeConstructor as ChannelMergerNode };\nexport { channelSplitterNodeConstructor as ChannelSplitterNode };\nexport { convolverNodeConstructor as ConvolverNode };\nexport { constantSourceNodeConstructor as ConstantSourceNode };\nexport { delayNodeConstructor as DelayNode };\nexport { dynamicsCompressorNodeConstructor as DynamicsCompressorNode };\nexport { gainNodeConstructor as GainNode };\nexport { iIRFilterNodeConstructor as IIRFilterNode };\nexport { mediaElementAudioSourceNodeConstructor as MediaElementAudioSourceNode };\nexport { mediaStreamAudioDestinationNodeConstructor as MediaStreamAudioDestinationNode };\nexport { mediaStreamAudioSourceNodeConstructor as MediaStreamAudioSourceNode };\nexport { mediaStreamTrackAudioSourceNodeConstructor as MediaStreamTrackAudioSourceNode };\nconst minimalAudioContextConstructor = createMinimalAudioContextConstructor(createInvalidStateError, createNotSupportedError, createUnknownError, minimalBaseAudioContextConstructor, nativeAudioContextConstructor);\nexport { minimalAudioContextConstructor as MinimalAudioContext };\nconst createNativeOfflineAudioContext = createCreateNativeOfflineAudioContext(createNotSupportedError, nativeOfflineAudioContextConstructor);\nconst startRendering = createStartRendering(audioBufferStore, cacheTestResult, getAudioNodeRenderer, getUnrenderedAudioWorkletNodes, renderNativeOfflineAudioContext, testAudioBufferCopyChannelMethodsOutOfBoundsSupport, wrapAudioBufferCopyChannelMethods, wrapAudioBufferCopyChannelMethodsOutOfBounds);\nconst minimalOfflineAudioContextConstructor = createMinimalOfflineAudioContextConstructor(cacheTestResult, createInvalidStateError, createNativeOfflineAudioContext, minimalBaseAudioContextConstructor, startRendering);\nexport { minimalOfflineAudioContextConstructor as MinimalOfflineAudioContext };\nconst offlineAudioContextConstructor = createOfflineAudioContextConstructor(baseAudioContextConstructor, cacheTestResult, createInvalidStateError, createNativeOfflineAudioContext, startRendering);\nexport { offlineAudioContextConstructor as OfflineAudioContext };\nexport { oscillatorNodeConstructor as OscillatorNode };\nexport { pannerNodeConstructor as PannerNode };\nexport { periodicWaveConstructor as PeriodicWave };\nexport { stereoPannerNodeConstructor as StereoPannerNode };\nexport { waveShaperNodeConstructor as WaveShaperNode };\nexport const isAnyAudioContext = createIsAnyAudioContext(CONTEXT_STORE, isNativeAudioContext);\nexport const isAnyAudioNode = createIsAnyAudioNode(AUDIO_NODE_STORE, isNativeAudioNode);\nexport const isAnyAudioParam = createIsAnyAudioParam(AUDIO_PARAM_STORE, isNativeAudioParam);\nexport const isAnyOfflineAudioContext = createIsAnyOfflineAudioContext(CONTEXT_STORE, isNativeOfflineAudioContext);\nexport const isSupported = () => createIsSupportedPromise(cacheTestResult, createTestAudioBufferCopyChannelMethodsSubarraySupport(nativeOfflineAudioContextConstructor), createTestAudioContextCloseMethodSupport(nativeAudioContextConstructor), createTestAudioContextDecodeAudioDataMethodTypeErrorSupport(nativeOfflineAudioContextConstructor), createTestAudioContextOptionsSupport(nativeAudioContextConstructor), createTestAudioNodeConnectMethodSupport(nativeOfflineAudioContextConstructor), createTestAudioWorkletProcessorNoOutputsSupport(nativeAudioWorkletNodeConstructor, nativeOfflineAudioContextConstructor), createTestChannelMergerNodeChannelCountSupport(nativeOfflineAudioContextConstructor), createTestConstantSourceNodeAccurateSchedulingSupport(nativeOfflineAudioContextConstructor), createTestConvolverNodeBufferReassignabilitySupport(nativeOfflineAudioContextConstructor), createTestConvolverNodeChannelCountSupport(nativeOfflineAudioContextConstructor), testDomExceptionConstructorSupport, createTestIsSecureContextSupport(window), createTestMediaStreamAudioSourceNodeMediaStreamWithoutAudioTrackSupport(nativeAudioContextConstructor), createTestStereoPannerNodeDefaultValueSupport(nativeOfflineAudioContextConstructor), testTransferablesSupport);\n//# sourceMappingURL=module.js.map","export const createAddActiveInputConnectionToAudioNode = (insertElementInSet) => {\n return (activeInputs, source, [output, input, eventListener], ignoreDuplicates) => {\n insertElementInSet(activeInputs[input], [source, output, eventListener], (activeInputConnection) => activeInputConnection[0] === source && activeInputConnection[1] === output, ignoreDuplicates);\n };\n};\n//# sourceMappingURL=add-active-input-connection-to-audio-node.js.map","export const createAddPassiveInputConnectionToAudioNode = (insertElementInSet) => {\n return (passiveInputs, input, [source, output, eventListener], ignoreDuplicates) => {\n const passiveInputConnections = passiveInputs.get(source);\n if (passiveInputConnections === undefined) {\n passiveInputs.set(source, new Set([[output, input, eventListener]]));\n }\n else {\n insertElementInSet(passiveInputConnections, [output, input, eventListener], (passiveInputConnection) => passiveInputConnection[0] === output && passiveInputConnection[1] === input, ignoreDuplicates);\n }\n };\n};\n//# sourceMappingURL=add-passive-input-connection-to-audio-node.js.map","export const createDeleteActiveInputConnectionToAudioNode = (pickElementFromSet) => {\n return (activeInputs, source, output, input) => {\n return pickElementFromSet(activeInputs[input], (activeInputConnection) => activeInputConnection[0] === source && activeInputConnection[1] === output);\n };\n};\n//# sourceMappingURL=delete-active-input-connection-to-audio-node.js.map","export const createGetAudioNodeTailTime = (audioNodeTailTimeStore) => {\n return (audioNode) => { var _a; return (_a = audioNodeTailTimeStore.get(audioNode)) !== null && _a !== void 0 ? _a : 0; };\n};\n//# sourceMappingURL=get-audio-node-tail-time.js.map","export const createCacheTestResult = (ongoingTests, testResults) => {\n return (tester, test) => {\n const cachedTestResult = testResults.get(tester);\n if (cachedTestResult !== undefined) {\n return cachedTestResult;\n }\n const ongoingTest = ongoingTests.get(tester);\n if (ongoingTest !== undefined) {\n return ongoingTest;\n }\n try {\n const synchronousTestResult = test();\n if (synchronousTestResult instanceof Promise) {\n ongoingTests.set(tester, synchronousTestResult);\n return synchronousTestResult\n .catch(() => false)\n .then((finalTestResult) => {\n ongoingTests.delete(tester);\n testResults.set(tester, finalTestResult);\n return finalTestResult;\n });\n }\n testResults.set(tester, synchronousTestResult);\n return synchronousTestResult;\n }\n catch {\n testResults.set(tester, false);\n return false;\n }\n };\n};\n//# sourceMappingURL=cache-test-result.js.map","export const createWindow = () => (typeof window === 'undefined' ? null : window);\n//# sourceMappingURL=window.js.map","import { assignNativeAudioNodeOption } from '../helpers/assign-native-audio-node-option';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nimport { testAnalyserNodeGetFloatTimeDomainDataMethodSupport } from '../helpers/test-analyser-node-get-float-time-domain-data-method-support';\nimport { wrapAnalyserNodeGetFloatTimeDomainDataMethod } from '../helpers/wrap-analyser-node-get-float-time-domain-data-method';\nexport const createNativeAnalyserNodeFactory = (cacheTestResult, createIndexSizeError) => {\n return (nativeContext, options) => {\n const nativeAnalyserNode = nativeContext.createAnalyser();\n // Bug #37: Firefox does not create an AnalyserNode with the default properties.\n assignNativeAudioNodeOptions(nativeAnalyserNode, options);\n // Bug #118: Safari does not throw an error if maxDecibels is not more than minDecibels.\n if (!(options.maxDecibels > options.minDecibels)) {\n throw createIndexSizeError();\n }\n assignNativeAudioNodeOption(nativeAnalyserNode, options, 'fftSize');\n assignNativeAudioNodeOption(nativeAnalyserNode, options, 'maxDecibels');\n assignNativeAudioNodeOption(nativeAnalyserNode, options, 'minDecibels');\n assignNativeAudioNodeOption(nativeAnalyserNode, options, 'smoothingTimeConstant');\n // Bug #36: Safari does not support getFloatTimeDomainData() yet.\n if (!cacheTestResult(testAnalyserNodeGetFloatTimeDomainDataMethodSupport, () => testAnalyserNodeGetFloatTimeDomainDataMethodSupport(nativeAnalyserNode))) {\n wrapAnalyserNodeGetFloatTimeDomainDataMethod(nativeAnalyserNode);\n }\n return nativeAnalyserNode;\n };\n};\n//# sourceMappingURL=native-analyser-node-factory.js.map","export const wrapAnalyserNodeGetFloatTimeDomainDataMethod = (nativeAnalyserNode) => {\n nativeAnalyserNode.getFloatTimeDomainData = (array) => {\n const byteTimeDomainData = new Uint8Array(array.length);\n nativeAnalyserNode.getByteTimeDomainData(byteTimeDomainData);\n const length = Math.max(byteTimeDomainData.length, nativeAnalyserNode.fftSize);\n for (let i = 0; i < length; i += 1) {\n array[i] = (byteTimeDomainData[i] - 128) * 0.0078125;\n }\n return array;\n };\n};\n//# sourceMappingURL=wrap-analyser-node-get-float-time-domain-data-method.js.map","export const createGetAudioNodeRenderer = (getAudioNodeConnections) => {\n return (audioNode) => {\n const audioNodeConnections = getAudioNodeConnections(audioNode);\n if (audioNodeConnections.renderer === null) {\n throw new Error('Missing the renderer of the given AudioNode in the audio graph.');\n }\n return audioNodeConnections.renderer;\n };\n};\n//# sourceMappingURL=get-audio-node-renderer.js.map","export const createRenderInputsOfAudioNode = (getAudioNodeConnections, getAudioNodeRenderer, isPartOfACycle) => {\n return async (audioNode, nativeOfflineAudioContext, nativeAudioNode, trace) => {\n const audioNodeConnections = getAudioNodeConnections(audioNode);\n const nextTrace = [...trace, audioNode];\n await Promise.all(audioNodeConnections.activeInputs\n .map((connections, input) => Array.from(connections)\n .filter(([source]) => !nextTrace.includes(source))\n .map(async ([source, output]) => {\n const audioNodeRenderer = getAudioNodeRenderer(source);\n const renderedNativeAudioNode = await audioNodeRenderer.render(source, nativeOfflineAudioContext, nextTrace);\n const destination = audioNode.context.destination;\n if (!isPartOfACycle(source) && (audioNode !== destination || !isPartOfACycle(audioNode))) {\n renderedNativeAudioNode.connect(nativeAudioNode, output, input);\n }\n }))\n .reduce((allRenderingPromises, renderingPromises) => [...allRenderingPromises, ...renderingPromises], []));\n };\n};\n//# sourceMappingURL=render-inputs-of-audio-node.js.map","import { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createAnalyserNodeRendererFactory = (createNativeAnalyserNode, getNativeAudioNode, renderInputsOfAudioNode) => {\n return () => {\n const renderedNativeAnalyserNodes = new WeakMap();\n const createAnalyserNode = async (proxy, nativeOfflineAudioContext, trace) => {\n let nativeAnalyserNode = getNativeAudioNode(proxy);\n // If the initially used nativeAnalyserNode was not constructed on the same OfflineAudioContext it needs to be created again.\n const nativeAnalyserNodeIsOwnedByContext = isOwnedByContext(nativeAnalyserNode, nativeOfflineAudioContext);\n if (!nativeAnalyserNodeIsOwnedByContext) {\n const options = {\n channelCount: nativeAnalyserNode.channelCount,\n channelCountMode: nativeAnalyserNode.channelCountMode,\n channelInterpretation: nativeAnalyserNode.channelInterpretation,\n fftSize: nativeAnalyserNode.fftSize,\n maxDecibels: nativeAnalyserNode.maxDecibels,\n minDecibels: nativeAnalyserNode.minDecibels,\n smoothingTimeConstant: nativeAnalyserNode.smoothingTimeConstant\n };\n nativeAnalyserNode = createNativeAnalyserNode(nativeOfflineAudioContext, options);\n }\n renderedNativeAnalyserNodes.set(nativeOfflineAudioContext, nativeAnalyserNode);\n await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeAnalyserNode, trace);\n return nativeAnalyserNode;\n };\n return {\n render(proxy, nativeOfflineAudioContext, trace) {\n const renderedNativeAnalyserNode = renderedNativeAnalyserNodes.get(nativeOfflineAudioContext);\n if (renderedNativeAnalyserNode !== undefined) {\n return Promise.resolve(renderedNativeAnalyserNode);\n }\n return createAnalyserNode(proxy, nativeOfflineAudioContext, trace);\n }\n };\n };\n};\n//# sourceMappingURL=analyser-node-renderer-factory.js.map","import { createInvalidStateError } from './invalid-state-error';\nexport const createGetNativeContext = (contextStore) => {\n return (context) => {\n const nativeContext = contextStore.get(context);\n if (nativeContext === undefined) {\n throw createInvalidStateError();\n }\n return (nativeContext);\n };\n};\n//# sourceMappingURL=get-native-context.js.map","export const createNativeOfflineAudioContextConstructor = (window) => {\n if (window === null) {\n return null;\n }\n if (window.hasOwnProperty('OfflineAudioContext')) {\n return window.OfflineAudioContext;\n }\n return window.hasOwnProperty('webkitOfflineAudioContext') ? window.webkitOfflineAudioContext : null;\n};\n//# sourceMappingURL=native-offline-audio-context-constructor.js.map","export const createIsNativeOfflineAudioContext = (nativeOfflineAudioContextConstructor) => {\n return (anything) => {\n return nativeOfflineAudioContextConstructor !== null && anything instanceof nativeOfflineAudioContextConstructor;\n };\n};\n//# sourceMappingURL=is-native-offline-audio-context.js.map","export const createEventTargetConstructor = (wrapEventListener) => {\n return class EventTarget {\n constructor(_nativeEventTarget) {\n this._nativeEventTarget = _nativeEventTarget;\n this._listeners = new WeakMap();\n }\n addEventListener(type, listener, options) {\n if (listener !== null) {\n let wrappedEventListener = this._listeners.get(listener);\n if (wrappedEventListener === undefined) {\n wrappedEventListener = wrapEventListener(this, listener);\n if (typeof listener === 'function') {\n this._listeners.set(listener, wrappedEventListener);\n }\n }\n this._nativeEventTarget.addEventListener(type, wrappedEventListener, options);\n }\n }\n dispatchEvent(event) {\n return this._nativeEventTarget.dispatchEvent(event);\n }\n removeEventListener(type, listener, options) {\n const wrappedEventListener = listener === null ? undefined : this._listeners.get(listener);\n this._nativeEventTarget.removeEventListener(type, wrappedEventListener === undefined ? null : wrappedEventListener, options);\n }\n };\n};\n//# sourceMappingURL=event-target-constructor.js.map","export const createNativeAudioContextConstructor = (window) => {\n if (window === null) {\n return null;\n }\n if (window.hasOwnProperty('AudioContext')) {\n return window.AudioContext;\n }\n return window.hasOwnProperty('webkitAudioContext') ? window.webkitAudioContext : null;\n};\n//# sourceMappingURL=native-audio-context-constructor.js.map","export const createIsNativeAudioContext = (nativeAudioContextConstructor) => {\n return (anything) => {\n return nativeAudioContextConstructor !== null && anything instanceof nativeAudioContextConstructor;\n };\n};\n//# sourceMappingURL=is-native-audio-context.js.map","export const createIsNativeAudioNode = (window) => {\n return (anything) => {\n return window !== null && typeof window.AudioNode === 'function' && anything instanceof window.AudioNode;\n };\n};\n//# sourceMappingURL=is-native-audio-node.js.map","export const createIsNativeAudioParam = (window) => {\n return (anything) => {\n return window !== null && typeof window.AudioParam === 'function' && anything instanceof window.AudioParam;\n };\n};\n//# sourceMappingURL=is-native-audio-param.js.map","import { isNativeAudioNode } from '../guards/native-audio-node';\nexport const wrapAudioNodeDisconnectMethod = (nativeAudioNode) => {\n const connections = new Map();\n nativeAudioNode.connect = ((connect) => {\n // tslint:disable-next-line:invalid-void\n return (destination, output = 0, input = 0) => {\n const returnValue = isNativeAudioNode(destination) ? connect(destination, output, input) : connect(destination, output);\n // Save the new connection only if the calls to connect above didn't throw an error.\n const connectionsToDestination = connections.get(destination);\n if (connectionsToDestination === undefined) {\n connections.set(destination, [{ input, output }]);\n }\n else {\n if (connectionsToDestination.every((connection) => connection.input !== input || connection.output !== output)) {\n connectionsToDestination.push({ input, output });\n }\n }\n return returnValue;\n };\n })(nativeAudioNode.connect.bind(nativeAudioNode));\n nativeAudioNode.disconnect = ((disconnect) => {\n return (destinationOrOutput, output, input) => {\n disconnect.apply(nativeAudioNode);\n if (destinationOrOutput === undefined) {\n connections.clear();\n }\n else if (typeof destinationOrOutput === 'number') {\n for (const [destination, connectionsToDestination] of connections) {\n const filteredConnections = connectionsToDestination.filter((connection) => connection.output !== destinationOrOutput);\n if (filteredConnections.length === 0) {\n connections.delete(destination);\n }\n else {\n connections.set(destination, filteredConnections);\n }\n }\n }\n else if (connections.has(destinationOrOutput)) {\n if (output === undefined) {\n connections.delete(destinationOrOutput);\n }\n else {\n const connectionsToDestination = connections.get(destinationOrOutput);\n if (connectionsToDestination !== undefined) {\n const filteredConnections = connectionsToDestination.filter((connection) => connection.output !== output && (connection.input !== input || input === undefined));\n if (filteredConnections.length === 0) {\n connections.delete(destinationOrOutput);\n }\n else {\n connections.set(destinationOrOutput, filteredConnections);\n }\n }\n }\n }\n for (const [destination, connectionsToDestination] of connections) {\n connectionsToDestination.forEach((connection) => {\n if (isNativeAudioNode(destination)) {\n nativeAudioNode.connect(destination, connection.output, connection.input);\n }\n else {\n nativeAudioNode.connect(destination, connection.output);\n }\n });\n }\n };\n })(nativeAudioNode.disconnect);\n};\n//# sourceMappingURL=wrap-audio-node-disconnect-method.js.map","export const createAddAudioNodeConnections = (audioNodeConnectionsStore) => {\n return (audioNode, audioNodeRenderer, nativeAudioNode) => {\n const activeInputs = [];\n for (let i = 0; i < nativeAudioNode.numberOfInputs; i += 1) {\n activeInputs.push(new Set());\n }\n audioNodeConnectionsStore.set(audioNode, {\n activeInputs,\n outputs: new Set(),\n passiveInputs: new WeakMap(),\n renderer: audioNodeRenderer\n });\n };\n};\n//# sourceMappingURL=add-audio-node-connections.js.map","import { deletePassiveInputConnectionToAudioNode } from '../helpers/delete-passive-input-connection-to-audio-node';\nimport { setInternalStateToActive } from '../helpers/set-internal-state-to-active';\nimport { setInternalStateToPassiveWhenNecessary } from '../helpers/set-internal-state-to-passive-when-necessary';\nexport const createAddConnectionToAudioNode = (addActiveInputConnectionToAudioNode, addPassiveInputConnectionToAudioNode, connectNativeAudioNodeToNativeAudioNode, deleteActiveInputConnectionToAudioNode, disconnectNativeAudioNodeFromNativeAudioNode, getAudioNodeConnections, getAudioNodeTailTime, getEventListenersOfAudioNode, getNativeAudioNode, insertElementInSet, isActiveAudioNode, isPartOfACycle, isPassiveAudioNode) => {\n return (source, destination, output, input, isOffline) => {\n const { activeInputs, passiveInputs } = getAudioNodeConnections(destination);\n const { outputs } = getAudioNodeConnections(source);\n const eventListeners = getEventListenersOfAudioNode(source);\n const eventListener = (isActive) => {\n const nativeDestinationAudioNode = getNativeAudioNode(destination);\n const nativeSourceAudioNode = getNativeAudioNode(source);\n if (isActive) {\n const partialConnection = deletePassiveInputConnectionToAudioNode(passiveInputs, source, output, input);\n addActiveInputConnectionToAudioNode(activeInputs, source, partialConnection, false);\n if (!isOffline && !isPartOfACycle(source)) {\n connectNativeAudioNodeToNativeAudioNode(nativeSourceAudioNode, nativeDestinationAudioNode, output, input);\n }\n if (isPassiveAudioNode(destination)) {\n setInternalStateToActive(destination);\n }\n }\n else {\n const partialConnection = deleteActiveInputConnectionToAudioNode(activeInputs, source, output, input);\n addPassiveInputConnectionToAudioNode(passiveInputs, input, partialConnection, false);\n if (!isOffline && !isPartOfACycle(source)) {\n disconnectNativeAudioNodeFromNativeAudioNode(nativeSourceAudioNode, nativeDestinationAudioNode, output, input);\n }\n const tailTime = getAudioNodeTailTime(destination);\n if (tailTime === 0) {\n if (isActiveAudioNode(destination)) {\n setInternalStateToPassiveWhenNecessary(destination, activeInputs);\n }\n }\n else {\n setTimeout(() => {\n if (isActiveAudioNode(destination)) {\n setInternalStateToPassiveWhenNecessary(destination, activeInputs);\n }\n }, tailTime * 1000);\n }\n }\n };\n if (insertElementInSet(outputs, [destination, output, input], (outputConnection) => outputConnection[0] === destination && outputConnection[1] === output && outputConnection[2] === input, true)) {\n eventListeners.add(eventListener);\n if (isActiveAudioNode(source)) {\n addActiveInputConnectionToAudioNode(activeInputs, source, [output, input, eventListener], true);\n }\n else {\n addPassiveInputConnectionToAudioNode(passiveInputs, input, [source, output, eventListener], true);\n }\n return true;\n }\n return false;\n };\n};\n//# sourceMappingURL=add-connection-to-audio-node.js.map","import { isAudioNodeOutputConnection } from '../guards/audio-node-output-connection';\nexport const createIncrementCycleCounterFactory = (cycleCounters, disconnectNativeAudioNodeFromNativeAudioNode, getAudioNodeConnections, getNativeAudioNode, getNativeAudioParam, isActiveAudioNode) => {\n return (isOffline) => {\n return (audioNode, count) => {\n const cycleCounter = cycleCounters.get(audioNode);\n if (cycleCounter === undefined) {\n if (!isOffline && isActiveAudioNode(audioNode)) {\n const nativeSourceAudioNode = getNativeAudioNode(audioNode);\n const { outputs } = getAudioNodeConnections(audioNode);\n for (const output of outputs) {\n if (isAudioNodeOutputConnection(output)) {\n const nativeDestinationAudioNode = getNativeAudioNode(output[0]);\n disconnectNativeAudioNodeFromNativeAudioNode(nativeSourceAudioNode, nativeDestinationAudioNode, output[1], output[2]);\n }\n else {\n const nativeDestinationAudioParam = getNativeAudioParam(output[0]);\n nativeSourceAudioNode.disconnect(nativeDestinationAudioParam, output[1]);\n }\n }\n }\n cycleCounters.set(audioNode, count);\n }\n else {\n cycleCounters.set(audioNode, cycleCounter + count);\n }\n };\n };\n};\n//# sourceMappingURL=increment-cycle-counter-factory.js.map","import { isAudioNodeOutputConnection } from '../guards/audio-node-output-connection';\nexport const createDecrementCycleCounter = (connectNativeAudioNodeToNativeAudioNode, cycleCounters, getAudioNodeConnections, getNativeAudioNode, getNativeAudioParam, getNativeContext, isActiveAudioNode, isNativeOfflineAudioContext) => {\n return (audioNode, count) => {\n const cycleCounter = cycleCounters.get(audioNode);\n if (cycleCounter === undefined) {\n throw new Error('Missing the expected cycle count.');\n }\n const nativeContext = getNativeContext(audioNode.context);\n const isOffline = isNativeOfflineAudioContext(nativeContext);\n if (cycleCounter === count) {\n cycleCounters.delete(audioNode);\n if (!isOffline && isActiveAudioNode(audioNode)) {\n const nativeSourceAudioNode = getNativeAudioNode(audioNode);\n const { outputs } = getAudioNodeConnections(audioNode);\n for (const output of outputs) {\n if (isAudioNodeOutputConnection(output)) {\n const nativeDestinationAudioNode = getNativeAudioNode(output[0]);\n connectNativeAudioNodeToNativeAudioNode(nativeSourceAudioNode, nativeDestinationAudioNode, output[1], output[2]);\n }\n else {\n const nativeDestinationAudioParam = getNativeAudioParam(output[0]);\n nativeSourceAudioNode.connect(nativeDestinationAudioParam, output[1]);\n }\n }\n }\n }\n else {\n cycleCounters.set(audioNode, cycleCounter - count);\n }\n };\n};\n//# sourceMappingURL=decrement-cycle-counter.js.map","import { isAudioNode } from '../guards/audio-node';\nimport { isDelayNode } from '../guards/delay-node';\nexport const createDetectCycles = (audioParamAudioNodeStore, getAudioNodeConnections, getValueForKey) => {\n return function detectCycles(chain, nextLink) {\n const audioNode = isAudioNode(nextLink) ? nextLink : getValueForKey(audioParamAudioNodeStore, nextLink);\n if (isDelayNode(audioNode)) {\n return [];\n }\n if (chain[0] === audioNode) {\n return [chain];\n }\n if (chain.includes(audioNode)) {\n return [];\n }\n const { outputs } = getAudioNodeConnections(audioNode);\n return Array.from(outputs)\n .map((outputConnection) => detectCycles([...chain, audioNode], outputConnection[0]))\n .reduce((mergedCycles, nestedCycles) => mergedCycles.concat(nestedCycles), []);\n };\n};\n//# sourceMappingURL=detect-cycles.js.map","export const isDelayNode = (audioNode) => {\n return 'delayTime' in audioNode;\n};\n//# sourceMappingURL=delay-node.js.map","export const createNativeAudioBufferConstructor = (window) => {\n if (window === null) {\n return null;\n }\n if (window.hasOwnProperty('AudioBuffer')) {\n return window.AudioBuffer;\n }\n return null;\n};\n//# sourceMappingURL=native-audio-buffer-constructor.js.map","export const createConvertNumberToUnsignedLong = (unit32Array) => {\n return (value) => {\n unit32Array[0] = value;\n return unit32Array[0];\n };\n};\n//# sourceMappingURL=convert-number-to-unsigned-long.js.map","export const createWrapAudioBufferCopyChannelMethods = (convertNumberToUnsignedLong, createIndexSizeError) => {\n return (audioBuffer) => {\n audioBuffer.copyFromChannel = (destination, channelNumberAsNumber, bufferOffsetAsNumber = 0) => {\n const bufferOffset = convertNumberToUnsignedLong(bufferOffsetAsNumber);\n const channelNumber = convertNumberToUnsignedLong(channelNumberAsNumber);\n if (channelNumber >= audioBuffer.numberOfChannels) {\n throw createIndexSizeError();\n }\n const audioBufferLength = audioBuffer.length;\n const channelData = audioBuffer.getChannelData(channelNumber);\n const destinationLength = destination.length;\n for (let i = bufferOffset < 0 ? -bufferOffset : 0; i + bufferOffset < audioBufferLength && i < destinationLength; i += 1) {\n destination[i] = channelData[i + bufferOffset];\n }\n };\n audioBuffer.copyToChannel = (source, channelNumberAsNumber, bufferOffsetAsNumber = 0) => {\n const bufferOffset = convertNumberToUnsignedLong(bufferOffsetAsNumber);\n const channelNumber = convertNumberToUnsignedLong(channelNumberAsNumber);\n if (channelNumber >= audioBuffer.numberOfChannels) {\n throw createIndexSizeError();\n }\n const audioBufferLength = audioBuffer.length;\n const channelData = audioBuffer.getChannelData(channelNumber);\n const sourceLength = source.length;\n for (let i = bufferOffset < 0 ? -bufferOffset : 0; i + bufferOffset < audioBufferLength && i < sourceLength; i += 1) {\n channelData[i + bufferOffset] = source[i];\n }\n };\n };\n};\n//# sourceMappingURL=wrap-audio-buffer-copy-channel-methods.js.map","export const createWrapAudioBufferCopyChannelMethodsOutOfBounds = (convertNumberToUnsignedLong) => {\n return (audioBuffer) => {\n audioBuffer.copyFromChannel = ((copyFromChannel) => {\n return (destination, channelNumberAsNumber, bufferOffsetAsNumber = 0) => {\n const bufferOffset = convertNumberToUnsignedLong(bufferOffsetAsNumber);\n const channelNumber = convertNumberToUnsignedLong(channelNumberAsNumber);\n if (bufferOffset < audioBuffer.length) {\n return copyFromChannel.call(audioBuffer, destination, channelNumber, bufferOffset);\n }\n };\n })(audioBuffer.copyFromChannel);\n audioBuffer.copyToChannel = ((copyToChannel) => {\n return (source, channelNumberAsNumber, bufferOffsetAsNumber = 0) => {\n const bufferOffset = convertNumberToUnsignedLong(bufferOffsetAsNumber);\n const channelNumber = convertNumberToUnsignedLong(channelNumberAsNumber);\n if (bufferOffset < audioBuffer.length) {\n return copyToChannel.call(audioBuffer, source, channelNumber, bufferOffset);\n }\n };\n })(audioBuffer.copyToChannel);\n };\n};\n//# sourceMappingURL=wrap-audio-buffer-copy-channel-methods-out-of-bounds.js.map","// Bug #33: Safari exposes an AudioBuffer but it can't be used as a constructor.\nexport const createTestAudioBufferConstructorSupport = (nativeAudioBufferConstructor) => {\n return () => {\n if (nativeAudioBufferConstructor === null) {\n return false;\n }\n try {\n new nativeAudioBufferConstructor({ length: 1, sampleRate: 44100 }); // tslint:disable-line:no-unused-expression\n }\n catch {\n return false;\n }\n return true;\n };\n};\n//# sourceMappingURL=test-audio-buffer-constructor-support.js.map","export const createAddSilentConnection = (createNativeGainNode) => {\n return (nativeContext, nativeAudioScheduledSourceNode) => {\n const nativeGainNode = createNativeGainNode(nativeContext, {\n channelCount: 1,\n channelCountMode: 'explicit',\n channelInterpretation: 'discrete',\n gain: 0\n });\n nativeAudioScheduledSourceNode.connect(nativeGainNode).connect(nativeContext.destination);\n const disconnect = () => {\n nativeAudioScheduledSourceNode.removeEventListener('ended', disconnect);\n nativeAudioScheduledSourceNode.disconnect(nativeGainNode);\n nativeGainNode.disconnect();\n };\n nativeAudioScheduledSourceNode.addEventListener('ended', disconnect);\n };\n};\n//# sourceMappingURL=add-silent-connection.js.map","export const createRenderInputsOfAudioParam = (getAudioNodeRenderer, getAudioParamConnections, isPartOfACycle) => {\n return async (audioParam, nativeOfflineAudioContext, nativeAudioParam, trace) => {\n const audioParamConnections = getAudioParamConnections(audioParam);\n await Promise.all(Array.from(audioParamConnections.activeInputs).map(async ([source, output]) => {\n const audioNodeRenderer = getAudioNodeRenderer(source);\n const renderedNativeAudioNode = await audioNodeRenderer.render(source, nativeOfflineAudioContext, trace);\n if (!isPartOfACycle(source)) {\n renderedNativeAudioNode.connect(nativeAudioParam, output);\n }\n }));\n };\n};\n//# sourceMappingURL=render-inputs-of-audio-param.js.map","export const createConnectAudioParam = (renderInputsOfAudioParam) => {\n return (nativeOfflineAudioContext, audioParam, nativeAudioParam, trace) => {\n return renderInputsOfAudioParam(audioParam, nativeOfflineAudioContext, nativeAudioParam, trace);\n };\n};\n//# sourceMappingURL=connect-audio-param.js.map","import { assignNativeAudioNodeAudioParamValue } from '../helpers/assign-native-audio-node-audio-param-value';\nimport { assignNativeAudioNodeOption } from '../helpers/assign-native-audio-node-option';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nimport { wrapAudioBufferSourceNodeStartMethodConsecutiveCalls } from '../helpers/wrap-audio-buffer-source-node-start-method-consecutive-calls';\nimport { wrapAudioScheduledSourceNodeStartMethodNegativeParameters } from '../helpers/wrap-audio-scheduled-source-node-start-method-negative-parameters';\nimport { wrapAudioScheduledSourceNodeStopMethodNegativeParameters } from '../helpers/wrap-audio-scheduled-source-node-stop-method-negative-parameters';\nexport const createNativeAudioBufferSourceNodeFactory = (addSilentConnection, cacheTestResult, testAudioBufferSourceNodeStartMethodConsecutiveCallsSupport, testAudioBufferSourceNodeStartMethodOffsetClampingSupport, testAudioBufferSourceNodeStopMethodNullifiedBufferSupport, testAudioScheduledSourceNodeStartMethodNegativeParametersSupport, testAudioScheduledSourceNodeStopMethodConsecutiveCallsSupport, testAudioScheduledSourceNodeStopMethodNegativeParametersSupport, wrapAudioBufferSourceNodeStartMethodOffsetClampling, wrapAudioBufferSourceNodeStopMethodNullifiedBuffer, wrapAudioScheduledSourceNodeStopMethodConsecutiveCalls) => {\n return (nativeContext, options) => {\n const nativeAudioBufferSourceNode = nativeContext.createBufferSource();\n assignNativeAudioNodeOptions(nativeAudioBufferSourceNode, options);\n assignNativeAudioNodeAudioParamValue(nativeAudioBufferSourceNode, options, 'playbackRate');\n assignNativeAudioNodeOption(nativeAudioBufferSourceNode, options, 'buffer');\n // Bug #149: Safari does not yet support the detune AudioParam.\n assignNativeAudioNodeOption(nativeAudioBufferSourceNode, options, 'loop');\n assignNativeAudioNodeOption(nativeAudioBufferSourceNode, options, 'loopEnd');\n assignNativeAudioNodeOption(nativeAudioBufferSourceNode, options, 'loopStart');\n // Bug #69: Safari does allow calls to start() of an already scheduled AudioBufferSourceNode.\n if (!cacheTestResult(testAudioBufferSourceNodeStartMethodConsecutiveCallsSupport, () => testAudioBufferSourceNodeStartMethodConsecutiveCallsSupport(nativeContext))) {\n wrapAudioBufferSourceNodeStartMethodConsecutiveCalls(nativeAudioBufferSourceNode);\n }\n // Bug #154 & #155: Safari does not handle offsets which are equal to or greater than the duration of the buffer.\n if (!cacheTestResult(testAudioBufferSourceNodeStartMethodOffsetClampingSupport, () => testAudioBufferSourceNodeStartMethodOffsetClampingSupport(nativeContext))) {\n wrapAudioBufferSourceNodeStartMethodOffsetClampling(nativeAudioBufferSourceNode);\n }\n // Bug #162: Safari does throw an error when stop() is called on an AudioBufferSourceNode which has no buffer assigned to it.\n if (!cacheTestResult(testAudioBufferSourceNodeStopMethodNullifiedBufferSupport, () => testAudioBufferSourceNodeStopMethodNullifiedBufferSupport(nativeContext))) {\n wrapAudioBufferSourceNodeStopMethodNullifiedBuffer(nativeAudioBufferSourceNode, nativeContext);\n }\n // Bug #44: Safari does not throw a RangeError yet.\n if (!cacheTestResult(testAudioScheduledSourceNodeStartMethodNegativeParametersSupport, () => testAudioScheduledSourceNodeStartMethodNegativeParametersSupport(nativeContext))) {\n wrapAudioScheduledSourceNodeStartMethodNegativeParameters(nativeAudioBufferSourceNode);\n }\n // Bug #19: Safari does not ignore calls to stop() of an already stopped AudioBufferSourceNode.\n if (!cacheTestResult(testAudioScheduledSourceNodeStopMethodConsecutiveCallsSupport, () => testAudioScheduledSourceNodeStopMethodConsecutiveCallsSupport(nativeContext))) {\n wrapAudioScheduledSourceNodeStopMethodConsecutiveCalls(nativeAudioBufferSourceNode, nativeContext);\n }\n // Bug #44: Only Firefox does not throw a RangeError yet.\n if (!cacheTestResult(testAudioScheduledSourceNodeStopMethodNegativeParametersSupport, () => testAudioScheduledSourceNodeStopMethodNegativeParametersSupport(nativeContext))) {\n wrapAudioScheduledSourceNodeStopMethodNegativeParameters(nativeAudioBufferSourceNode);\n }\n // Bug #175: Safari will not fire an ended event if the AudioBufferSourceNode is unconnected.\n addSilentConnection(nativeContext, nativeAudioBufferSourceNode);\n return nativeAudioBufferSourceNode;\n };\n};\n//# sourceMappingURL=native-audio-buffer-source-node-factory.js.map","import { createInvalidStateError } from '../factories/invalid-state-error';\nexport const wrapAudioBufferSourceNodeStartMethodConsecutiveCalls = (nativeAudioBufferSourceNode) => {\n nativeAudioBufferSourceNode.start = ((start) => {\n let isScheduled = false;\n return (when = 0, offset = 0, duration) => {\n if (isScheduled) {\n throw createInvalidStateError();\n }\n start.call(nativeAudioBufferSourceNode, when, offset, duration);\n isScheduled = true;\n };\n })(nativeAudioBufferSourceNode.start);\n};\n//# sourceMappingURL=wrap-audio-buffer-source-node-start-method-consecutive-calls.js.map","export const testAudioBufferSourceNodeStartMethodConsecutiveCallsSupport = (nativeContext) => {\n const nativeAudioBufferSourceNode = nativeContext.createBufferSource();\n nativeAudioBufferSourceNode.start();\n try {\n nativeAudioBufferSourceNode.start();\n }\n catch {\n return true;\n }\n return false;\n};\n//# sourceMappingURL=test-audio-buffer-source-node-start-method-consecutive-calls-support.js.map","export const testAudioBufferSourceNodeStartMethodOffsetClampingSupport = (nativeContext) => {\n const nativeAudioBufferSourceNode = nativeContext.createBufferSource();\n const nativeAudioBuffer = nativeContext.createBuffer(1, 1, 44100);\n nativeAudioBufferSourceNode.buffer = nativeAudioBuffer;\n try {\n nativeAudioBufferSourceNode.start(0, 1);\n }\n catch {\n return false;\n }\n return true;\n};\n//# sourceMappingURL=test-audio-buffer-source-node-start-method-offset-clamping-support.js.map","export const testAudioBufferSourceNodeStopMethodNullifiedBufferSupport = (nativeContext) => {\n const nativeAudioBufferSourceNode = nativeContext.createBufferSource();\n nativeAudioBufferSourceNode.start();\n try {\n nativeAudioBufferSourceNode.stop();\n }\n catch {\n return false;\n }\n return true;\n};\n//# sourceMappingURL=test-audio-buffer-source-node-stop-method-nullified-buffer-support.js.map","export const wrapAudioBufferSourceNodeStartMethodOffsetClamping = (nativeAudioBufferSourceNode) => {\n nativeAudioBufferSourceNode.start = ((start) => {\n return (when = 0, offset = 0, duration) => {\n const buffer = nativeAudioBufferSourceNode.buffer;\n // Bug #154: Safari does not clamp the offset if it is equal to or greater than the duration of the buffer.\n const clampedOffset = buffer === null ? offset : Math.min(buffer.duration, offset);\n // Bug #155: Safari does not handle the offset correctly if it would cause the buffer to be not be played at all.\n if (buffer !== null && clampedOffset > buffer.duration - 0.5 / nativeAudioBufferSourceNode.context.sampleRate) {\n start.call(nativeAudioBufferSourceNode, when, 0, 0);\n }\n else {\n start.call(nativeAudioBufferSourceNode, when, clampedOffset, duration);\n }\n };\n })(nativeAudioBufferSourceNode.start);\n};\n//# sourceMappingURL=wrap-audio-buffer-source-node-start-method-offset-clamping.js.map","export const createWrapAudioBufferSourceNodeStopMethodNullifiedBuffer = (overwriteAccessors) => {\n return (nativeAudioBufferSourceNode, nativeContext) => {\n const nullifiedBuffer = nativeContext.createBuffer(1, 1, 44100);\n if (nativeAudioBufferSourceNode.buffer === null) {\n nativeAudioBufferSourceNode.buffer = nullifiedBuffer;\n }\n overwriteAccessors(nativeAudioBufferSourceNode, 'buffer', (get) => () => {\n const value = get.call(nativeAudioBufferSourceNode);\n return value === nullifiedBuffer ? null : value;\n }, (set) => (value) => {\n return set.call(nativeAudioBufferSourceNode, value === null ? nullifiedBuffer : value);\n });\n };\n};\n//# sourceMappingURL=wrap-audio-buffer-source-node-stop-method-nullified-buffer.js.map","export const createRenderAutomation = (getAudioParamRenderer, renderInputsOfAudioParam) => {\n return (nativeOfflineAudioContext, audioParam, nativeAudioParam, trace) => {\n const audioParamRenderer = getAudioParamRenderer(audioParam);\n audioParamRenderer.replay(nativeAudioParam);\n return renderInputsOfAudioParam(audioParam, nativeOfflineAudioContext, nativeAudioParam, trace);\n };\n};\n//# sourceMappingURL=render-automation.js.map","export const createGetAudioParamRenderer = (getAudioParamConnections) => {\n return (audioParam) => {\n const audioParamConnections = getAudioParamConnections(audioParam);\n if (audioParamConnections.renderer === null) {\n throw new Error('Missing the renderer of the given AudioParam in the audio graph.');\n }\n return audioParamConnections.renderer;\n };\n};\n//# sourceMappingURL=get-audio-param-renderer.js.map","import { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createAudioBufferSourceNodeRendererFactory = (connectAudioParam, createNativeAudioBufferSourceNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode) => {\n return () => {\n const renderedNativeAudioBufferSourceNodes = new WeakMap();\n let start = null;\n let stop = null;\n const createAudioBufferSourceNode = async (proxy, nativeOfflineAudioContext, trace) => {\n let nativeAudioBufferSourceNode = getNativeAudioNode(proxy);\n /*\n * If the initially used nativeAudioBufferSourceNode was not constructed on the same OfflineAudioContext it needs to be created\n * again.\n */\n const nativeAudioBufferSourceNodeIsOwnedByContext = isOwnedByContext(nativeAudioBufferSourceNode, nativeOfflineAudioContext);\n if (!nativeAudioBufferSourceNodeIsOwnedByContext) {\n const options = {\n buffer: nativeAudioBufferSourceNode.buffer,\n channelCount: nativeAudioBufferSourceNode.channelCount,\n channelCountMode: nativeAudioBufferSourceNode.channelCountMode,\n channelInterpretation: nativeAudioBufferSourceNode.channelInterpretation,\n // Bug #149: Safari does not yet support the detune AudioParam.\n loop: nativeAudioBufferSourceNode.loop,\n loopEnd: nativeAudioBufferSourceNode.loopEnd,\n loopStart: nativeAudioBufferSourceNode.loopStart,\n playbackRate: nativeAudioBufferSourceNode.playbackRate.value\n };\n nativeAudioBufferSourceNode = createNativeAudioBufferSourceNode(nativeOfflineAudioContext, options);\n if (start !== null) {\n nativeAudioBufferSourceNode.start(...start);\n }\n if (stop !== null) {\n nativeAudioBufferSourceNode.stop(stop);\n }\n }\n renderedNativeAudioBufferSourceNodes.set(nativeOfflineAudioContext, nativeAudioBufferSourceNode);\n if (!nativeAudioBufferSourceNodeIsOwnedByContext) {\n // Bug #149: Safari does not yet support the detune AudioParam.\n await renderAutomation(nativeOfflineAudioContext, proxy.playbackRate, nativeAudioBufferSourceNode.playbackRate, trace);\n }\n else {\n // Bug #149: Safari does not yet support the detune AudioParam.\n await connectAudioParam(nativeOfflineAudioContext, proxy.playbackRate, nativeAudioBufferSourceNode.playbackRate, trace);\n }\n await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeAudioBufferSourceNode, trace);\n return nativeAudioBufferSourceNode;\n };\n return {\n set start(value) {\n start = value;\n },\n set stop(value) {\n stop = value;\n },\n render(proxy, nativeOfflineAudioContext, trace) {\n const renderedNativeAudioBufferSourceNode = renderedNativeAudioBufferSourceNodes.get(nativeOfflineAudioContext);\n if (renderedNativeAudioBufferSourceNode !== undefined) {\n return Promise.resolve(renderedNativeAudioBufferSourceNode);\n }\n return createAudioBufferSourceNode(proxy, nativeOfflineAudioContext, trace);\n }\n };\n };\n};\n//# sourceMappingURL=audio-buffer-source-node-renderer-factory.js.map","import { AutomationEventList } from 'automation-events';\nexport const createAudioParamFactory = (addAudioParamConnections, audioParamAudioNodeStore, audioParamStore, createAudioParamRenderer, createCancelAndHoldAutomationEvent, createCancelScheduledValuesAutomationEvent, createExponentialRampToValueAutomationEvent, createLinearRampToValueAutomationEvent, createSetTargetAutomationEvent, createSetValueAutomationEvent, createSetValueCurveAutomationEvent, nativeAudioContextConstructor, setValueAtTimeUntilPossible) => {\n return (audioNode, isAudioParamOfOfflineAudioContext, nativeAudioParam, maxValue = null, minValue = null) => {\n const automationEventList = new AutomationEventList(nativeAudioParam.defaultValue);\n const audioParamRenderer = isAudioParamOfOfflineAudioContext ? createAudioParamRenderer(automationEventList) : null;\n const audioParam = {\n get defaultValue() {\n return nativeAudioParam.defaultValue;\n },\n get maxValue() {\n return maxValue === null ? nativeAudioParam.maxValue : maxValue;\n },\n get minValue() {\n return minValue === null ? nativeAudioParam.minValue : minValue;\n },\n get value() {\n return nativeAudioParam.value;\n },\n set value(value) {\n nativeAudioParam.value = value;\n // Bug #98: Firefox & Safari do not yet treat the value setter like a call to setValueAtTime().\n audioParam.setValueAtTime(value, audioNode.context.currentTime);\n },\n cancelAndHoldAtTime(cancelTime) {\n // Bug #28: Firefox & Safari do not yet implement cancelAndHoldAtTime().\n if (typeof nativeAudioParam.cancelAndHoldAtTime === 'function') {\n if (audioParamRenderer === null) {\n automationEventList.flush(audioNode.context.currentTime);\n }\n automationEventList.add(createCancelAndHoldAutomationEvent(cancelTime));\n nativeAudioParam.cancelAndHoldAtTime(cancelTime);\n }\n else {\n const previousLastEvent = Array.from(automationEventList).pop();\n if (audioParamRenderer === null) {\n automationEventList.flush(audioNode.context.currentTime);\n }\n automationEventList.add(createCancelAndHoldAutomationEvent(cancelTime));\n const currentLastEvent = Array.from(automationEventList).pop();\n nativeAudioParam.cancelScheduledValues(cancelTime);\n if (previousLastEvent !== currentLastEvent && currentLastEvent !== undefined) {\n if (currentLastEvent.type === 'exponentialRampToValue') {\n nativeAudioParam.exponentialRampToValueAtTime(currentLastEvent.value, currentLastEvent.endTime);\n }\n else if (currentLastEvent.type === 'linearRampToValue') {\n nativeAudioParam.linearRampToValueAtTime(currentLastEvent.value, currentLastEvent.endTime);\n }\n else if (currentLastEvent.type === 'setValue') {\n nativeAudioParam.setValueAtTime(currentLastEvent.value, currentLastEvent.startTime);\n }\n else if (currentLastEvent.type === 'setValueCurve') {\n nativeAudioParam.setValueCurveAtTime(currentLastEvent.values, currentLastEvent.startTime, currentLastEvent.duration);\n }\n }\n }\n return audioParam;\n },\n cancelScheduledValues(cancelTime) {\n if (audioParamRenderer === null) {\n automationEventList.flush(audioNode.context.currentTime);\n }\n automationEventList.add(createCancelScheduledValuesAutomationEvent(cancelTime));\n nativeAudioParam.cancelScheduledValues(cancelTime);\n return audioParam;\n },\n exponentialRampToValueAtTime(value, endTime) {\n // Bug #45: Safari does not throw an error yet.\n if (value === 0) {\n throw new RangeError();\n }\n // Bug #187: Safari does not throw an error yet.\n if (!Number.isFinite(endTime) || endTime < 0) {\n throw new RangeError();\n }\n if (audioParamRenderer === null) {\n automationEventList.flush(audioNode.context.currentTime);\n }\n automationEventList.add(createExponentialRampToValueAutomationEvent(value, endTime));\n nativeAudioParam.exponentialRampToValueAtTime(value, endTime);\n return audioParam;\n },\n linearRampToValueAtTime(value, endTime) {\n if (audioParamRenderer === null) {\n automationEventList.flush(audioNode.context.currentTime);\n }\n automationEventList.add(createLinearRampToValueAutomationEvent(value, endTime));\n nativeAudioParam.linearRampToValueAtTime(value, endTime);\n return audioParam;\n },\n setTargetAtTime(target, startTime, timeConstant) {\n if (audioParamRenderer === null) {\n automationEventList.flush(audioNode.context.currentTime);\n }\n automationEventList.add(createSetTargetAutomationEvent(target, startTime, timeConstant));\n nativeAudioParam.setTargetAtTime(target, startTime, timeConstant);\n return audioParam;\n },\n setValueAtTime(value, startTime) {\n if (audioParamRenderer === null) {\n automationEventList.flush(audioNode.context.currentTime);\n }\n automationEventList.add(createSetValueAutomationEvent(value, startTime));\n nativeAudioParam.setValueAtTime(value, startTime);\n return audioParam;\n },\n setValueCurveAtTime(values, startTime, duration) {\n // Bug 183: Safari only accepts a Float32Array.\n const convertedValues = values instanceof Float32Array ? values : new Float32Array(values);\n /*\n * Bug #152: Safari does not correctly interpolate the values of the curve.\n * @todo Unfortunately there is no way to test for this behavior in a synchronous fashion which is why testing for the\n * existence of the webkitAudioContext is used as a workaround here.\n */\n if (nativeAudioContextConstructor !== null && nativeAudioContextConstructor.name === 'webkitAudioContext') {\n const endTime = startTime + duration;\n const sampleRate = audioNode.context.sampleRate;\n const firstSample = Math.ceil(startTime * sampleRate);\n const lastSample = Math.floor(endTime * sampleRate);\n const numberOfInterpolatedValues = lastSample - firstSample;\n const interpolatedValues = new Float32Array(numberOfInterpolatedValues);\n for (let i = 0; i < numberOfInterpolatedValues; i += 1) {\n const theoreticIndex = ((convertedValues.length - 1) / duration) * ((firstSample + i) / sampleRate - startTime);\n const lowerIndex = Math.floor(theoreticIndex);\n const upperIndex = Math.ceil(theoreticIndex);\n interpolatedValues[i] =\n lowerIndex === upperIndex\n ? convertedValues[lowerIndex]\n : (1 - (theoreticIndex - lowerIndex)) * convertedValues[lowerIndex] +\n (1 - (upperIndex - theoreticIndex)) * convertedValues[upperIndex];\n }\n if (audioParamRenderer === null) {\n automationEventList.flush(audioNode.context.currentTime);\n }\n automationEventList.add(createSetValueCurveAutomationEvent(interpolatedValues, startTime, duration));\n nativeAudioParam.setValueCurveAtTime(interpolatedValues, startTime, duration);\n const timeOfLastSample = lastSample / sampleRate;\n if (timeOfLastSample < endTime) {\n setValueAtTimeUntilPossible(audioParam, interpolatedValues[interpolatedValues.length - 1], timeOfLastSample);\n }\n setValueAtTimeUntilPossible(audioParam, convertedValues[convertedValues.length - 1], endTime);\n }\n else {\n if (audioParamRenderer === null) {\n automationEventList.flush(audioNode.context.currentTime);\n }\n automationEventList.add(createSetValueCurveAutomationEvent(convertedValues, startTime, duration));\n nativeAudioParam.setValueCurveAtTime(convertedValues, startTime, duration);\n }\n return audioParam;\n }\n };\n audioParamStore.set(audioParam, nativeAudioParam);\n audioParamAudioNodeStore.set(audioParam, audioNode);\n addAudioParamConnections(audioParam, audioParamRenderer);\n return audioParam;\n };\n};\n//# sourceMappingURL=audio-param-factory.js.map","export const createAddAudioParamConnections = (audioParamConnectionsStore) => {\n return (audioParam, audioParamRenderer) => {\n audioParamConnectionsStore.set(audioParam, { activeInputs: new Set(), passiveInputs: new WeakMap(), renderer: audioParamRenderer });\n };\n};\n//# sourceMappingURL=add-audio-param-connections.js.map","export const createAudioParamRenderer = (automationEventList) => {\n return {\n replay(audioParam) {\n for (const automationEvent of automationEventList) {\n if (automationEvent.type === 'exponentialRampToValue') {\n const { endTime, value } = automationEvent;\n audioParam.exponentialRampToValueAtTime(value, endTime);\n }\n else if (automationEvent.type === 'linearRampToValue') {\n const { endTime, value } = automationEvent;\n audioParam.linearRampToValueAtTime(value, endTime);\n }\n else if (automationEvent.type === 'setTarget') {\n const { startTime, target, timeConstant } = automationEvent;\n audioParam.setTargetAtTime(target, startTime, timeConstant);\n }\n else if (automationEvent.type === 'setValue') {\n const { startTime, value } = automationEvent;\n audioParam.setValueAtTime(value, startTime);\n }\n else if (automationEvent.type === 'setValueCurve') {\n const { duration, startTime, values } = automationEvent;\n audioParam.setValueCurveAtTime(values, startTime, duration);\n }\n else {\n throw new Error(\"Can't apply an unknown automation.\");\n }\n }\n }\n };\n};\n//# sourceMappingURL=audio-param-renderer.js.map","export const createAudioDestinationNodeConstructor = (audioNodeConstructor, createAudioDestinationNodeRenderer, createIndexSizeError, createInvalidStateError, createNativeAudioDestinationNode, getNativeContext, isNativeOfflineAudioContext, renderInputsOfAudioNode) => {\n return class AudioDestinationNode extends audioNodeConstructor {\n constructor(context, channelCount) {\n const nativeContext = getNativeContext(context);\n const isOffline = isNativeOfflineAudioContext(nativeContext);\n const nativeAudioDestinationNode = createNativeAudioDestinationNode(nativeContext, channelCount, isOffline);\n const audioDestinationNodeRenderer = ((isOffline ? createAudioDestinationNodeRenderer(renderInputsOfAudioNode) : null));\n super(context, false, nativeAudioDestinationNode, audioDestinationNodeRenderer);\n this._isNodeOfNativeOfflineAudioContext = isOffline;\n this._nativeAudioDestinationNode = nativeAudioDestinationNode;\n }\n get channelCount() {\n return this._nativeAudioDestinationNode.channelCount;\n }\n set channelCount(value) {\n // Bug #52: Chrome, Edge, Opera & Safari do not throw an exception at all.\n // Bug #54: Firefox does throw an IndexSizeError.\n if (this._isNodeOfNativeOfflineAudioContext) {\n throw createInvalidStateError();\n }\n // Bug #47: The AudioDestinationNode in Safari does not initialize the maxChannelCount property correctly.\n if (value > this._nativeAudioDestinationNode.maxChannelCount) {\n throw createIndexSizeError();\n }\n this._nativeAudioDestinationNode.channelCount = value;\n }\n get channelCountMode() {\n return this._nativeAudioDestinationNode.channelCountMode;\n }\n set channelCountMode(value) {\n // Bug #53: No browser does throw an exception yet.\n if (this._isNodeOfNativeOfflineAudioContext) {\n throw createInvalidStateError();\n }\n this._nativeAudioDestinationNode.channelCountMode = value;\n }\n get maxChannelCount() {\n return this._nativeAudioDestinationNode.maxChannelCount;\n }\n };\n};\n//# sourceMappingURL=audio-destination-node-constructor.js.map","export const createAudioDestinationNodeRenderer = (renderInputsOfAudioNode) => {\n let nativeAudioDestinationNodePromise = null;\n const createAudioDestinationNode = async (proxy, nativeOfflineAudioContext, trace) => {\n const nativeAudioDestinationNode = nativeOfflineAudioContext.destination;\n await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeAudioDestinationNode, trace);\n return nativeAudioDestinationNode;\n };\n return {\n render(proxy, nativeOfflineAudioContext, trace) {\n if (nativeAudioDestinationNodePromise === null) {\n nativeAudioDestinationNodePromise = createAudioDestinationNode(proxy, nativeOfflineAudioContext, trace);\n }\n return nativeAudioDestinationNodePromise;\n }\n };\n};\n//# sourceMappingURL=audio-destination-node-renderer-factory.js.map","export const createNativeAudioDestinationNodeFactory = (createNativeGainNode, overwriteAccessors) => {\n return (nativeContext, channelCount, isNodeOfNativeOfflineAudioContext) => {\n const nativeAudioDestinationNode = nativeContext.destination;\n // Bug #132: Safari does not have the correct channelCount.\n if (nativeAudioDestinationNode.channelCount !== channelCount) {\n try {\n nativeAudioDestinationNode.channelCount = channelCount;\n }\n catch {\n // Bug #169: Safari throws an error on each attempt to change the channelCount.\n }\n }\n // Bug #83: Safari does not have the correct channelCountMode.\n if (isNodeOfNativeOfflineAudioContext && nativeAudioDestinationNode.channelCountMode !== 'explicit') {\n nativeAudioDestinationNode.channelCountMode = 'explicit';\n }\n // Bug #47: The AudioDestinationNode in Safari does not initialize the maxChannelCount property correctly.\n if (nativeAudioDestinationNode.maxChannelCount === 0) {\n Object.defineProperty(nativeAudioDestinationNode, 'maxChannelCount', {\n value: channelCount\n });\n }\n // Bug #168: No browser does yet have an AudioDestinationNode with an output.\n const gainNode = createNativeGainNode(nativeContext, {\n channelCount,\n channelCountMode: nativeAudioDestinationNode.channelCountMode,\n channelInterpretation: nativeAudioDestinationNode.channelInterpretation,\n gain: 1\n });\n overwriteAccessors(gainNode, 'channelCount', (get) => () => get.call(gainNode), (set) => (value) => {\n set.call(gainNode, value);\n try {\n nativeAudioDestinationNode.channelCount = value;\n }\n catch (err) {\n // Bug #169: Safari throws an error on each attempt to change the channelCount.\n if (value > nativeAudioDestinationNode.maxChannelCount) {\n throw err;\n }\n }\n });\n overwriteAccessors(gainNode, 'channelCountMode', (get) => () => get.call(gainNode), (set) => (value) => {\n set.call(gainNode, value);\n nativeAudioDestinationNode.channelCountMode = value;\n });\n overwriteAccessors(gainNode, 'channelInterpretation', (get) => () => get.call(gainNode), (set) => (value) => {\n set.call(gainNode, value);\n nativeAudioDestinationNode.channelInterpretation = value;\n });\n Object.defineProperty(gainNode, 'maxChannelCount', {\n get: () => nativeAudioDestinationNode.maxChannelCount\n });\n // @todo This should be disconnected when the context is closed.\n gainNode.connect(nativeAudioDestinationNode);\n return gainNode;\n };\n};\n//# sourceMappingURL=native-audio-destination-node.js.map","import { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createBiquadFilterNodeRendererFactory = (connectAudioParam, createNativeBiquadFilterNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode) => {\n return () => {\n const renderedNativeBiquadFilterNodes = new WeakMap();\n const createBiquadFilterNode = async (proxy, nativeOfflineAudioContext, trace) => {\n let nativeBiquadFilterNode = getNativeAudioNode(proxy);\n /*\n * If the initially used nativeBiquadFilterNode was not constructed on the same OfflineAudioContext it needs to be created\n * again.\n */\n const nativeBiquadFilterNodeIsOwnedByContext = isOwnedByContext(nativeBiquadFilterNode, nativeOfflineAudioContext);\n if (!nativeBiquadFilterNodeIsOwnedByContext) {\n const options = {\n Q: nativeBiquadFilterNode.Q.value,\n channelCount: nativeBiquadFilterNode.channelCount,\n channelCountMode: nativeBiquadFilterNode.channelCountMode,\n channelInterpretation: nativeBiquadFilterNode.channelInterpretation,\n detune: nativeBiquadFilterNode.detune.value,\n frequency: nativeBiquadFilterNode.frequency.value,\n gain: nativeBiquadFilterNode.gain.value,\n type: nativeBiquadFilterNode.type\n };\n nativeBiquadFilterNode = createNativeBiquadFilterNode(nativeOfflineAudioContext, options);\n }\n renderedNativeBiquadFilterNodes.set(nativeOfflineAudioContext, nativeBiquadFilterNode);\n if (!nativeBiquadFilterNodeIsOwnedByContext) {\n await renderAutomation(nativeOfflineAudioContext, proxy.Q, nativeBiquadFilterNode.Q, trace);\n await renderAutomation(nativeOfflineAudioContext, proxy.detune, nativeBiquadFilterNode.detune, trace);\n await renderAutomation(nativeOfflineAudioContext, proxy.frequency, nativeBiquadFilterNode.frequency, trace);\n await renderAutomation(nativeOfflineAudioContext, proxy.gain, nativeBiquadFilterNode.gain, trace);\n }\n else {\n await connectAudioParam(nativeOfflineAudioContext, proxy.Q, nativeBiquadFilterNode.Q, trace);\n await connectAudioParam(nativeOfflineAudioContext, proxy.detune, nativeBiquadFilterNode.detune, trace);\n await connectAudioParam(nativeOfflineAudioContext, proxy.frequency, nativeBiquadFilterNode.frequency, trace);\n await connectAudioParam(nativeOfflineAudioContext, proxy.gain, nativeBiquadFilterNode.gain, trace);\n }\n await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeBiquadFilterNode, trace);\n return nativeBiquadFilterNode;\n };\n return {\n render(proxy, nativeOfflineAudioContext, trace) {\n const renderedNativeBiquadFilterNode = renderedNativeBiquadFilterNodes.get(nativeOfflineAudioContext);\n if (renderedNativeBiquadFilterNode !== undefined) {\n return Promise.resolve(renderedNativeBiquadFilterNode);\n }\n return createBiquadFilterNode(proxy, nativeOfflineAudioContext, trace);\n }\n };\n };\n};\n//# sourceMappingURL=biquad-filter-node-renderer-factory.js.map","export const createSetAudioNodeTailTime = (audioNodeTailTimeStore) => {\n return (audioNode, tailTime) => audioNodeTailTimeStore.set(audioNode, tailTime);\n};\n//# sourceMappingURL=set-audio-node-tail-time.js.map","export const createMonitorConnections = (insertElementInSet, isNativeAudioNode) => {\n return (nativeAudioNode, whenConnected, whenDisconnected) => {\n const connections = new Set();\n nativeAudioNode.connect = ((connect) => {\n // tslint:disable-next-line:invalid-void\n return (destination, output = 0, input = 0) => {\n const wasDisconnected = connections.size === 0;\n if (isNativeAudioNode(destination)) {\n // @todo TypeScript cannot infer the overloaded signature with 3 arguments yet.\n connect.call(nativeAudioNode, destination, output, input);\n insertElementInSet(connections, [destination, output, input], (connection) => connection[0] === destination && connection[1] === output && connection[2] === input, true);\n if (wasDisconnected) {\n whenConnected();\n }\n return destination;\n }\n connect.call(nativeAudioNode, destination, output);\n insertElementInSet(connections, [destination, output], (connection) => connection[0] === destination && connection[1] === output, true);\n if (wasDisconnected) {\n whenConnected();\n }\n return;\n };\n })(nativeAudioNode.connect);\n nativeAudioNode.disconnect = ((disconnect) => {\n return (destinationOrOutput, output, input) => {\n const wasConnected = connections.size > 0;\n if (destinationOrOutput === undefined) {\n disconnect.apply(nativeAudioNode);\n connections.clear();\n }\n else if (typeof destinationOrOutput === 'number') {\n // @todo TypeScript cannot infer the overloaded signature with 1 argument yet.\n disconnect.call(nativeAudioNode, destinationOrOutput);\n for (const connection of connections) {\n if (connection[1] === destinationOrOutput) {\n connections.delete(connection);\n }\n }\n }\n else {\n if (isNativeAudioNode(destinationOrOutput)) {\n // @todo TypeScript cannot infer the overloaded signature with 3 arguments yet.\n disconnect.call(nativeAudioNode, destinationOrOutput, output, input);\n }\n else {\n // @todo TypeScript cannot infer the overloaded signature with 2 arguments yet.\n disconnect.call(nativeAudioNode, destinationOrOutput, output);\n }\n for (const connection of connections) {\n if (connection[0] === destinationOrOutput &&\n (output === undefined || connection[1] === output) &&\n (input === undefined || connection[2] === input)) {\n connections.delete(connection);\n }\n }\n }\n const isDisconnected = connections.size === 0;\n if (wasConnected && isDisconnected) {\n whenDisconnected();\n }\n };\n })(nativeAudioNode.disconnect);\n return nativeAudioNode;\n };\n};\n//# sourceMappingURL=monitor-connections.js.map","export const createWrapChannelMergerNode = (createInvalidStateError, monitorConnections) => {\n return (nativeContext, channelMergerNode) => {\n // Bug #15: Safari does not return the default properties.\n channelMergerNode.channelCount = 1;\n channelMergerNode.channelCountMode = 'explicit';\n // Bug #16: Safari does not throw an error when setting a different channelCount or channelCountMode.\n Object.defineProperty(channelMergerNode, 'channelCount', {\n get: () => 1,\n set: () => {\n throw createInvalidStateError();\n }\n });\n Object.defineProperty(channelMergerNode, 'channelCountMode', {\n get: () => 'explicit',\n set: () => {\n throw createInvalidStateError();\n }\n });\n // Bug #20: Safari requires a connection of any kind to treat the input signal correctly.\n const audioBufferSourceNode = nativeContext.createBufferSource();\n const whenConnected = () => {\n const length = channelMergerNode.numberOfInputs;\n for (let i = 0; i < length; i += 1) {\n audioBufferSourceNode.connect(channelMergerNode, 0, i);\n }\n };\n const whenDisconnected = () => audioBufferSourceNode.disconnect(channelMergerNode);\n monitorConnections(channelMergerNode, whenConnected, whenDisconnected);\n };\n};\n//# sourceMappingURL=wrap-channel-merger-node.js.map","import { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nexport const createNativeChannelMergerNodeFactory = (nativeAudioContextConstructor, wrapChannelMergerNode) => {\n return (nativeContext, options) => {\n const nativeChannelMergerNode = nativeContext.createChannelMerger(options.numberOfInputs);\n /*\n * Bug #20: Safari requires a connection of any kind to treat the input signal correctly.\n * @todo Unfortunately there is no way to test for this behavior in a synchronous fashion which is why testing for the existence of\n * the webkitAudioContext is used as a workaround here.\n */\n if (nativeAudioContextConstructor !== null && nativeAudioContextConstructor.name === 'webkitAudioContext') {\n wrapChannelMergerNode(nativeContext, nativeChannelMergerNode);\n }\n assignNativeAudioNodeOptions(nativeChannelMergerNode, options);\n return nativeChannelMergerNode;\n };\n};\n//# sourceMappingURL=native-channel-merger-node-factory.js.map","import { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createChannelMergerNodeRendererFactory = (createNativeChannelMergerNode, getNativeAudioNode, renderInputsOfAudioNode) => {\n return () => {\n const renderedNativeAudioNodes = new WeakMap();\n const createAudioNode = async (proxy, nativeOfflineAudioContext, trace) => {\n let nativeAudioNode = getNativeAudioNode(proxy);\n // If the initially used nativeAudioNode was not constructed on the same OfflineAudioContext it needs to be created again.\n const nativeAudioNodeIsOwnedByContext = isOwnedByContext(nativeAudioNode, nativeOfflineAudioContext);\n if (!nativeAudioNodeIsOwnedByContext) {\n const options = {\n channelCount: nativeAudioNode.channelCount,\n channelCountMode: nativeAudioNode.channelCountMode,\n channelInterpretation: nativeAudioNode.channelInterpretation,\n numberOfInputs: nativeAudioNode.numberOfInputs\n };\n nativeAudioNode = createNativeChannelMergerNode(nativeOfflineAudioContext, options);\n }\n renderedNativeAudioNodes.set(nativeOfflineAudioContext, nativeAudioNode);\n await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeAudioNode, trace);\n return nativeAudioNode;\n };\n return {\n render(proxy, nativeOfflineAudioContext, trace) {\n const renderedNativeAudioNode = renderedNativeAudioNodes.get(nativeOfflineAudioContext);\n if (renderedNativeAudioNode !== undefined) {\n return Promise.resolve(renderedNativeAudioNode);\n }\n return createAudioNode(proxy, nativeOfflineAudioContext, trace);\n }\n };\n };\n};\n//# sourceMappingURL=channel-merger-node-renderer-factory.js.map","import { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createChannelSplitterNodeRendererFactory = (createNativeChannelSplitterNode, getNativeAudioNode, renderInputsOfAudioNode) => {\n return () => {\n const renderedNativeAudioNodes = new WeakMap();\n const createAudioNode = async (proxy, nativeOfflineAudioContext, trace) => {\n let nativeAudioNode = getNativeAudioNode(proxy);\n // If the initially used nativeAudioNode was not constructed on the same OfflineAudioContext it needs to be created again.\n const nativeAudioNodeIsOwnedByContext = isOwnedByContext(nativeAudioNode, nativeOfflineAudioContext);\n if (!nativeAudioNodeIsOwnedByContext) {\n const options = {\n channelCount: nativeAudioNode.channelCount,\n channelCountMode: nativeAudioNode.channelCountMode,\n channelInterpretation: nativeAudioNode.channelInterpretation,\n numberOfOutputs: nativeAudioNode.numberOfOutputs\n };\n nativeAudioNode = createNativeChannelSplitterNode(nativeOfflineAudioContext, options);\n }\n renderedNativeAudioNodes.set(nativeOfflineAudioContext, nativeAudioNode);\n await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeAudioNode, trace);\n return nativeAudioNode;\n };\n return {\n render(proxy, nativeOfflineAudioContext, trace) {\n const renderedNativeAudioNode = renderedNativeAudioNodes.get(nativeOfflineAudioContext);\n if (renderedNativeAudioNode !== undefined) {\n return Promise.resolve(renderedNativeAudioNode);\n }\n return createAudioNode(proxy, nativeOfflineAudioContext, trace);\n }\n };\n };\n};\n//# sourceMappingURL=channel-splitter-node-renderer-factory.js.map","export const sanitizeChannelSplitterOptions = (options) => {\n return { ...options, channelCount: options.numberOfOutputs };\n};\n//# sourceMappingURL=sanitize-channel-splitter-options.js.map","import { interceptConnections } from '../helpers/intercept-connections';\nexport const createNativeConstantSourceNodeFakerFactory = (addSilentConnection, createNativeAudioBufferSourceNode, createNativeGainNode, monitorConnections) => {\n return (nativeContext, { offset, ...audioNodeOptions }) => {\n const audioBuffer = nativeContext.createBuffer(1, 2, 44100);\n const audioBufferSourceNode = createNativeAudioBufferSourceNode(nativeContext, {\n buffer: null,\n channelCount: 2,\n channelCountMode: 'max',\n channelInterpretation: 'speakers',\n loop: false,\n loopEnd: 0,\n loopStart: 0,\n playbackRate: 1\n });\n const gainNode = createNativeGainNode(nativeContext, { ...audioNodeOptions, gain: offset });\n // Bug #5: Safari does not support copyFromChannel() and copyToChannel().\n const channelData = audioBuffer.getChannelData(0);\n // Bug #95: Safari does not play or loop one sample buffers.\n channelData[0] = 1;\n channelData[1] = 1;\n audioBufferSourceNode.buffer = audioBuffer;\n audioBufferSourceNode.loop = true;\n const nativeConstantSourceNodeFaker = {\n get bufferSize() {\n return undefined;\n },\n get channelCount() {\n return gainNode.channelCount;\n },\n set channelCount(value) {\n gainNode.channelCount = value;\n },\n get channelCountMode() {\n return gainNode.channelCountMode;\n },\n set channelCountMode(value) {\n gainNode.channelCountMode = value;\n },\n get channelInterpretation() {\n return gainNode.channelInterpretation;\n },\n set channelInterpretation(value) {\n gainNode.channelInterpretation = value;\n },\n get context() {\n return gainNode.context;\n },\n get inputs() {\n return [];\n },\n get numberOfInputs() {\n return audioBufferSourceNode.numberOfInputs;\n },\n get numberOfOutputs() {\n return gainNode.numberOfOutputs;\n },\n get offset() {\n return gainNode.gain;\n },\n get onended() {\n return audioBufferSourceNode.onended;\n },\n set onended(value) {\n audioBufferSourceNode.onended = value;\n },\n addEventListener(...args) {\n return audioBufferSourceNode.addEventListener(args[0], args[1], args[2]);\n },\n dispatchEvent(...args) {\n return audioBufferSourceNode.dispatchEvent(args[0]);\n },\n removeEventListener(...args) {\n return audioBufferSourceNode.removeEventListener(args[0], args[1], args[2]);\n },\n start(when = 0) {\n audioBufferSourceNode.start.call(audioBufferSourceNode, when);\n },\n stop(when = 0) {\n audioBufferSourceNode.stop.call(audioBufferSourceNode, when);\n }\n };\n const whenConnected = () => audioBufferSourceNode.connect(gainNode);\n const whenDisconnected = () => audioBufferSourceNode.disconnect(gainNode);\n // Bug #175: Safari will not fire an ended event if the AudioBufferSourceNode is unconnected.\n addSilentConnection(nativeContext, audioBufferSourceNode);\n return monitorConnections(interceptConnections(nativeConstantSourceNodeFaker, gainNode), whenConnected, whenDisconnected);\n };\n};\n//# sourceMappingURL=native-constant-source-node-faker-factory.js.map","import { assignNativeAudioNodeAudioParamValue } from '../helpers/assign-native-audio-node-audio-param-value';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nimport { wrapAudioScheduledSourceNodeStartMethodNegativeParameters } from '../helpers/wrap-audio-scheduled-source-node-start-method-negative-parameters';\nimport { wrapAudioScheduledSourceNodeStopMethodNegativeParameters } from '../helpers/wrap-audio-scheduled-source-node-stop-method-negative-parameters';\nexport const createNativeConstantSourceNodeFactory = (addSilentConnection, cacheTestResult, createNativeConstantSourceNodeFaker, testAudioScheduledSourceNodeStartMethodNegativeParametersSupport, testAudioScheduledSourceNodeStopMethodNegativeParametersSupport) => {\n return (nativeContext, options) => {\n // Bug #62: Safari does not support ConstantSourceNodes.\n if (nativeContext.createConstantSource === undefined) {\n return createNativeConstantSourceNodeFaker(nativeContext, options);\n }\n const nativeConstantSourceNode = nativeContext.createConstantSource();\n assignNativeAudioNodeOptions(nativeConstantSourceNode, options);\n assignNativeAudioNodeAudioParamValue(nativeConstantSourceNode, options, 'offset');\n // Bug #44: Safari does not throw a RangeError yet.\n if (!cacheTestResult(testAudioScheduledSourceNodeStartMethodNegativeParametersSupport, () => testAudioScheduledSourceNodeStartMethodNegativeParametersSupport(nativeContext))) {\n wrapAudioScheduledSourceNodeStartMethodNegativeParameters(nativeConstantSourceNode);\n }\n // Bug #44: Only Firefox does not throw a RangeError yet.\n if (!cacheTestResult(testAudioScheduledSourceNodeStopMethodNegativeParametersSupport, () => testAudioScheduledSourceNodeStopMethodNegativeParametersSupport(nativeContext))) {\n wrapAudioScheduledSourceNodeStopMethodNegativeParameters(nativeConstantSourceNode);\n }\n // Bug #175: Safari will not fire an ended event if the ConstantSourceNode is unconnected.\n addSilentConnection(nativeContext, nativeConstantSourceNode);\n return nativeConstantSourceNode;\n };\n};\n//# sourceMappingURL=native-constant-source-node-factory.js.map","import { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createConstantSourceNodeRendererFactory = (connectAudioParam, createNativeConstantSourceNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode) => {\n return () => {\n const renderedNativeConstantSourceNodes = new WeakMap();\n let start = null;\n let stop = null;\n const createConstantSourceNode = async (proxy, nativeOfflineAudioContext, trace) => {\n let nativeConstantSourceNode = getNativeAudioNode(proxy);\n /*\n * If the initially used nativeConstantSourceNode was not constructed on the same OfflineAudioContext it needs to be created\n * again.\n */\n const nativeConstantSourceNodeIsOwnedByContext = isOwnedByContext(nativeConstantSourceNode, nativeOfflineAudioContext);\n if (!nativeConstantSourceNodeIsOwnedByContext) {\n const options = {\n channelCount: nativeConstantSourceNode.channelCount,\n channelCountMode: nativeConstantSourceNode.channelCountMode,\n channelInterpretation: nativeConstantSourceNode.channelInterpretation,\n offset: nativeConstantSourceNode.offset.value\n };\n nativeConstantSourceNode = createNativeConstantSourceNode(nativeOfflineAudioContext, options);\n if (start !== null) {\n nativeConstantSourceNode.start(start);\n }\n if (stop !== null) {\n nativeConstantSourceNode.stop(stop);\n }\n }\n renderedNativeConstantSourceNodes.set(nativeOfflineAudioContext, nativeConstantSourceNode);\n if (!nativeConstantSourceNodeIsOwnedByContext) {\n await renderAutomation(nativeOfflineAudioContext, proxy.offset, nativeConstantSourceNode.offset, trace);\n }\n else {\n await connectAudioParam(nativeOfflineAudioContext, proxy.offset, nativeConstantSourceNode.offset, trace);\n }\n await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeConstantSourceNode, trace);\n return nativeConstantSourceNode;\n };\n return {\n set start(value) {\n start = value;\n },\n set stop(value) {\n stop = value;\n },\n render(proxy, nativeOfflineAudioContext, trace) {\n const renderedNativeConstantSourceNode = renderedNativeConstantSourceNodes.get(nativeOfflineAudioContext);\n if (renderedNativeConstantSourceNode !== undefined) {\n return Promise.resolve(renderedNativeConstantSourceNode);\n }\n return createConstantSourceNode(proxy, nativeOfflineAudioContext, trace);\n }\n };\n };\n};\n//# sourceMappingURL=constant-source-node-renderer-factory.js.map","import { assignNativeAudioNodeOption } from '../helpers/assign-native-audio-node-option';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nexport const createNativeConvolverNodeFactory = (createNotSupportedError, overwriteAccessors) => {\n return (nativeContext, options) => {\n const nativeConvolverNode = nativeContext.createConvolver();\n assignNativeAudioNodeOptions(nativeConvolverNode, options);\n // The normalize property needs to be set before setting the buffer.\n if (options.disableNormalization === nativeConvolverNode.normalize) {\n nativeConvolverNode.normalize = !options.disableNormalization;\n }\n assignNativeAudioNodeOption(nativeConvolverNode, options, 'buffer');\n // Bug #113: Safari does allow to set the channelCount to a value larger than 2.\n if (options.channelCount > 2) {\n throw createNotSupportedError();\n }\n overwriteAccessors(nativeConvolverNode, 'channelCount', (get) => () => get.call(nativeConvolverNode), (set) => (value) => {\n if (value > 2) {\n throw createNotSupportedError();\n }\n return set.call(nativeConvolverNode, value);\n });\n // Bug #114: Safari allows to set the channelCountMode to 'max'.\n if (options.channelCountMode === 'max') {\n throw createNotSupportedError();\n }\n overwriteAccessors(nativeConvolverNode, 'channelCountMode', (get) => () => get.call(nativeConvolverNode), (set) => (value) => {\n if (value === 'max') {\n throw createNotSupportedError();\n }\n return set.call(nativeConvolverNode, value);\n });\n return nativeConvolverNode;\n };\n};\n//# sourceMappingURL=native-convolver-node-factory.js.map","import { isNativeAudioNodeFaker } from '../guards/native-audio-node-faker';\nimport { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createConvolverNodeRendererFactory = (createNativeConvolverNode, getNativeAudioNode, renderInputsOfAudioNode) => {\n return () => {\n const renderedNativeConvolverNodes = new WeakMap();\n const createConvolverNode = async (proxy, nativeOfflineAudioContext, trace) => {\n let nativeConvolverNode = getNativeAudioNode(proxy);\n // If the initially used nativeConvolverNode was not constructed on the same OfflineAudioContext it needs to be created again.\n const nativeConvolverNodeIsOwnedByContext = isOwnedByContext(nativeConvolverNode, nativeOfflineAudioContext);\n if (!nativeConvolverNodeIsOwnedByContext) {\n const options = {\n buffer: nativeConvolverNode.buffer,\n channelCount: nativeConvolverNode.channelCount,\n channelCountMode: nativeConvolverNode.channelCountMode,\n channelInterpretation: nativeConvolverNode.channelInterpretation,\n disableNormalization: !nativeConvolverNode.normalize\n };\n nativeConvolverNode = createNativeConvolverNode(nativeOfflineAudioContext, options);\n }\n renderedNativeConvolverNodes.set(nativeOfflineAudioContext, nativeConvolverNode);\n if (isNativeAudioNodeFaker(nativeConvolverNode)) {\n await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeConvolverNode.inputs[0], trace);\n }\n else {\n await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeConvolverNode, trace);\n }\n return nativeConvolverNode;\n };\n return {\n render(proxy, nativeOfflineAudioContext, trace) {\n const renderedNativeConvolverNode = renderedNativeConvolverNodes.get(nativeOfflineAudioContext);\n if (renderedNativeConvolverNode !== undefined) {\n return Promise.resolve(renderedNativeConvolverNode);\n }\n return createConvolverNode(proxy, nativeOfflineAudioContext, trace);\n }\n };\n };\n};\n//# sourceMappingURL=convolver-node-renderer-factory.js.map","import { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createDelayNodeRendererFactory = (connectAudioParam, createNativeDelayNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode) => {\n return (maxDelayTime) => {\n const renderedNativeDelayNodes = new WeakMap();\n const createDelayNode = async (proxy, nativeOfflineAudioContext, trace) => {\n let nativeDelayNode = getNativeAudioNode(proxy);\n // If the initially used nativeDelayNode was not constructed on the same OfflineAudioContext it needs to be created again.\n const nativeDelayNodeIsOwnedByContext = isOwnedByContext(nativeDelayNode, nativeOfflineAudioContext);\n if (!nativeDelayNodeIsOwnedByContext) {\n const options = {\n channelCount: nativeDelayNode.channelCount,\n channelCountMode: nativeDelayNode.channelCountMode,\n channelInterpretation: nativeDelayNode.channelInterpretation,\n delayTime: nativeDelayNode.delayTime.value,\n maxDelayTime\n };\n nativeDelayNode = createNativeDelayNode(nativeOfflineAudioContext, options);\n }\n renderedNativeDelayNodes.set(nativeOfflineAudioContext, nativeDelayNode);\n if (!nativeDelayNodeIsOwnedByContext) {\n await renderAutomation(nativeOfflineAudioContext, proxy.delayTime, nativeDelayNode.delayTime, trace);\n }\n else {\n await connectAudioParam(nativeOfflineAudioContext, proxy.delayTime, nativeDelayNode.delayTime, trace);\n }\n await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeDelayNode, trace);\n return nativeDelayNode;\n };\n return {\n render(proxy, nativeOfflineAudioContext, trace) {\n const renderedNativeDelayNode = renderedNativeDelayNodes.get(nativeOfflineAudioContext);\n if (renderedNativeDelayNode !== undefined) {\n return Promise.resolve(renderedNativeDelayNode);\n }\n return createDelayNode(proxy, nativeOfflineAudioContext, trace);\n }\n };\n };\n};\n//# sourceMappingURL=delay-node-renderer-factory.js.map","import { assignNativeAudioNodeAudioParamValue } from '../helpers/assign-native-audio-node-audio-param-value';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nexport const createNativeDynamicsCompressorNodeFactory = (createNotSupportedError) => {\n return (nativeContext, options) => {\n const nativeDynamicsCompressorNode = nativeContext.createDynamicsCompressor();\n assignNativeAudioNodeOptions(nativeDynamicsCompressorNode, options);\n // Bug #108: Safari allows a channelCount of three and above.\n if (options.channelCount > 2) {\n throw createNotSupportedError();\n }\n // Bug #109: Only Chrome, Firefox and Opera disallow a channelCountMode of 'max'.\n if (options.channelCountMode === 'max') {\n throw createNotSupportedError();\n }\n assignNativeAudioNodeAudioParamValue(nativeDynamicsCompressorNode, options, 'attack');\n assignNativeAudioNodeAudioParamValue(nativeDynamicsCompressorNode, options, 'knee');\n assignNativeAudioNodeAudioParamValue(nativeDynamicsCompressorNode, options, 'ratio');\n assignNativeAudioNodeAudioParamValue(nativeDynamicsCompressorNode, options, 'release');\n assignNativeAudioNodeAudioParamValue(nativeDynamicsCompressorNode, options, 'threshold');\n return nativeDynamicsCompressorNode;\n };\n};\n//# sourceMappingURL=native-dynamics-compressor-node-factory.js.map","import { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createDynamicsCompressorNodeRendererFactory = (connectAudioParam, createNativeDynamicsCompressorNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode) => {\n return () => {\n const renderedNativeDynamicsCompressorNodes = new WeakMap();\n const createDynamicsCompressorNode = async (proxy, nativeOfflineAudioContext, trace) => {\n let nativeDynamicsCompressorNode = getNativeAudioNode(proxy);\n /*\n * If the initially used nativeDynamicsCompressorNode was not constructed on the same OfflineAudioContext it needs to be\n * created again.\n */\n const nativeDynamicsCompressorNodeIsOwnedByContext = isOwnedByContext(nativeDynamicsCompressorNode, nativeOfflineAudioContext);\n if (!nativeDynamicsCompressorNodeIsOwnedByContext) {\n const options = {\n attack: nativeDynamicsCompressorNode.attack.value,\n channelCount: nativeDynamicsCompressorNode.channelCount,\n channelCountMode: nativeDynamicsCompressorNode.channelCountMode,\n channelInterpretation: nativeDynamicsCompressorNode.channelInterpretation,\n knee: nativeDynamicsCompressorNode.knee.value,\n ratio: nativeDynamicsCompressorNode.ratio.value,\n release: nativeDynamicsCompressorNode.release.value,\n threshold: nativeDynamicsCompressorNode.threshold.value\n };\n nativeDynamicsCompressorNode = createNativeDynamicsCompressorNode(nativeOfflineAudioContext, options);\n }\n renderedNativeDynamicsCompressorNodes.set(nativeOfflineAudioContext, nativeDynamicsCompressorNode);\n if (!nativeDynamicsCompressorNodeIsOwnedByContext) {\n await renderAutomation(nativeOfflineAudioContext, proxy.attack, nativeDynamicsCompressorNode.attack, trace);\n await renderAutomation(nativeOfflineAudioContext, proxy.knee, nativeDynamicsCompressorNode.knee, trace);\n await renderAutomation(nativeOfflineAudioContext, proxy.ratio, nativeDynamicsCompressorNode.ratio, trace);\n await renderAutomation(nativeOfflineAudioContext, proxy.release, nativeDynamicsCompressorNode.release, trace);\n await renderAutomation(nativeOfflineAudioContext, proxy.threshold, nativeDynamicsCompressorNode.threshold, trace);\n }\n else {\n await connectAudioParam(nativeOfflineAudioContext, proxy.attack, nativeDynamicsCompressorNode.attack, trace);\n await connectAudioParam(nativeOfflineAudioContext, proxy.knee, nativeDynamicsCompressorNode.knee, trace);\n await connectAudioParam(nativeOfflineAudioContext, proxy.ratio, nativeDynamicsCompressorNode.ratio, trace);\n await connectAudioParam(nativeOfflineAudioContext, proxy.release, nativeDynamicsCompressorNode.release, trace);\n await connectAudioParam(nativeOfflineAudioContext, proxy.threshold, nativeDynamicsCompressorNode.threshold, trace);\n }\n await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeDynamicsCompressorNode, trace);\n return nativeDynamicsCompressorNode;\n };\n return {\n render(proxy, nativeOfflineAudioContext, trace) {\n const renderedNativeDynamicsCompressorNode = renderedNativeDynamicsCompressorNodes.get(nativeOfflineAudioContext);\n if (renderedNativeDynamicsCompressorNode !== undefined) {\n return Promise.resolve(renderedNativeDynamicsCompressorNode);\n }\n return createDynamicsCompressorNode(proxy, nativeOfflineAudioContext, trace);\n }\n };\n };\n};\n//# sourceMappingURL=dynamics-compressor-node-renderer-factory.js.map","import { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createGainNodeRendererFactory = (connectAudioParam, createNativeGainNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode) => {\n return () => {\n const renderedNativeGainNodes = new WeakMap();\n const createGainNode = async (proxy, nativeOfflineAudioContext, trace) => {\n let nativeGainNode = getNativeAudioNode(proxy);\n // If the initially used nativeGainNode was not constructed on the same OfflineAudioContext it needs to be created again.\n const nativeGainNodeIsOwnedByContext = isOwnedByContext(nativeGainNode, nativeOfflineAudioContext);\n if (!nativeGainNodeIsOwnedByContext) {\n const options = {\n channelCount: nativeGainNode.channelCount,\n channelCountMode: nativeGainNode.channelCountMode,\n channelInterpretation: nativeGainNode.channelInterpretation,\n gain: nativeGainNode.gain.value\n };\n nativeGainNode = createNativeGainNode(nativeOfflineAudioContext, options);\n }\n renderedNativeGainNodes.set(nativeOfflineAudioContext, nativeGainNode);\n if (!nativeGainNodeIsOwnedByContext) {\n await renderAutomation(nativeOfflineAudioContext, proxy.gain, nativeGainNode.gain, trace);\n }\n else {\n await connectAudioParam(nativeOfflineAudioContext, proxy.gain, nativeGainNode.gain, trace);\n }\n await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeGainNode, trace);\n return nativeGainNode;\n };\n return {\n render(proxy, nativeOfflineAudioContext, trace) {\n const renderedNativeGainNode = renderedNativeGainNodes.get(nativeOfflineAudioContext);\n if (renderedNativeGainNode !== undefined) {\n return Promise.resolve(renderedNativeGainNode);\n }\n return createGainNode(proxy, nativeOfflineAudioContext, trace);\n }\n };\n };\n};\n//# sourceMappingURL=gain-node-renderer-factory.js.map","import { testPromiseSupport } from '../helpers/test-promise-support';\nexport const createRenderNativeOfflineAudioContext = (cacheTestResult, createNativeGainNode, createNativeScriptProcessorNode, testOfflineAudioContextCurrentTimeSupport) => {\n return (nativeOfflineAudioContext) => {\n // Bug #21: Safari does not support promises yet.\n if (cacheTestResult(testPromiseSupport, () => testPromiseSupport(nativeOfflineAudioContext))) {\n // Bug #158: Chrome and Edge do not advance currentTime if it is not accessed while rendering the audio.\n return Promise.resolve(cacheTestResult(testOfflineAudioContextCurrentTimeSupport, testOfflineAudioContextCurrentTimeSupport)).then((isOfflineAudioContextCurrentTimeSupported) => {\n if (!isOfflineAudioContextCurrentTimeSupported) {\n const scriptProcessorNode = createNativeScriptProcessorNode(nativeOfflineAudioContext, 512, 0, 1);\n nativeOfflineAudioContext.oncomplete = () => {\n scriptProcessorNode.onaudioprocess = null; // tslint:disable-line:deprecation\n scriptProcessorNode.disconnect();\n };\n scriptProcessorNode.onaudioprocess = () => nativeOfflineAudioContext.currentTime; // tslint:disable-line:deprecation\n scriptProcessorNode.connect(nativeOfflineAudioContext.destination);\n }\n return nativeOfflineAudioContext.startRendering();\n });\n }\n return new Promise((resolve) => {\n // Bug #48: Safari does not render an OfflineAudioContext without any connected node.\n const gainNode = createNativeGainNode(nativeOfflineAudioContext, {\n channelCount: 1,\n channelCountMode: 'explicit',\n channelInterpretation: 'discrete',\n gain: 0\n });\n nativeOfflineAudioContext.oncomplete = (event) => {\n gainNode.disconnect();\n resolve(event.renderedBuffer);\n };\n gainNode.connect(nativeOfflineAudioContext.destination);\n nativeOfflineAudioContext.startRendering();\n });\n };\n};\n//# sourceMappingURL=render-native-offline-audio-context.js.map","export const createTestOfflineAudioContextCurrentTimeSupport = (createNativeGainNode, nativeOfflineAudioContextConstructor) => {\n return () => {\n if (nativeOfflineAudioContextConstructor === null) {\n return Promise.resolve(false);\n }\n const nativeOfflineAudioContext = new nativeOfflineAudioContextConstructor(1, 1, 44100);\n // Bug #48: Safari does not render an OfflineAudioContext without any connected node.\n const gainNode = createNativeGainNode(nativeOfflineAudioContext, {\n channelCount: 1,\n channelCountMode: 'explicit',\n channelInterpretation: 'discrete',\n gain: 0\n });\n // Bug #21: Safari does not support promises yet.\n return new Promise((resolve) => {\n nativeOfflineAudioContext.oncomplete = () => {\n gainNode.disconnect();\n resolve(nativeOfflineAudioContext.currentTime !== 0);\n };\n nativeOfflineAudioContext.startRendering();\n });\n };\n};\n//# sourceMappingURL=test-offline-audio-context-current-time-support.js.map","import { filterBuffer } from '../helpers/filter-buffer';\nimport { isOwnedByContext } from '../helpers/is-owned-by-context';\nconst filterFullBuffer = (renderedBuffer, nativeOfflineAudioContext, feedback, feedforward) => {\n const convertedFeedback = feedback instanceof Float64Array ? feedback : new Float64Array(feedback);\n const convertedFeedforward = feedforward instanceof Float64Array ? feedforward : new Float64Array(feedforward);\n const feedbackLength = convertedFeedback.length;\n const feedforwardLength = convertedFeedforward.length;\n const minLength = Math.min(feedbackLength, feedforwardLength);\n if (convertedFeedback[0] !== 1) {\n for (let i = 0; i < feedbackLength; i += 1) {\n convertedFeedforward[i] /= convertedFeedback[0];\n }\n for (let i = 1; i < feedforwardLength; i += 1) {\n convertedFeedback[i] /= convertedFeedback[0];\n }\n }\n const bufferLength = 32;\n const xBuffer = new Float32Array(bufferLength);\n const yBuffer = new Float32Array(bufferLength);\n const filteredBuffer = nativeOfflineAudioContext.createBuffer(renderedBuffer.numberOfChannels, renderedBuffer.length, renderedBuffer.sampleRate);\n const numberOfChannels = renderedBuffer.numberOfChannels;\n for (let i = 0; i < numberOfChannels; i += 1) {\n const input = renderedBuffer.getChannelData(i);\n const output = filteredBuffer.getChannelData(i);\n xBuffer.fill(0);\n yBuffer.fill(0);\n filterBuffer(convertedFeedback, feedbackLength, convertedFeedforward, feedforwardLength, minLength, xBuffer, yBuffer, 0, bufferLength, input, output);\n }\n return filteredBuffer;\n};\nexport const createIIRFilterNodeRendererFactory = (createNativeAudioBufferSourceNode, getNativeAudioNode, nativeOfflineAudioContextConstructor, renderInputsOfAudioNode, renderNativeOfflineAudioContext) => {\n return (feedback, feedforward) => {\n const renderedNativeAudioNodes = new WeakMap();\n let filteredBufferPromise = null;\n const createAudioNode = async (proxy, nativeOfflineAudioContext, trace) => {\n let nativeAudioBufferSourceNode = null;\n let nativeIIRFilterNode = getNativeAudioNode(proxy);\n // If the initially used nativeIIRFilterNode was not constructed on the same OfflineAudioContext it needs to be created again.\n const nativeIIRFilterNodeIsOwnedByContext = isOwnedByContext(nativeIIRFilterNode, nativeOfflineAudioContext);\n // Bug #9: Safari does not support IIRFilterNodes.\n if (nativeOfflineAudioContext.createIIRFilter === undefined) {\n nativeAudioBufferSourceNode = createNativeAudioBufferSourceNode(nativeOfflineAudioContext, {\n buffer: null,\n channelCount: 2,\n channelCountMode: 'max',\n channelInterpretation: 'speakers',\n loop: false,\n loopEnd: 0,\n loopStart: 0,\n playbackRate: 1\n });\n }\n else if (!nativeIIRFilterNodeIsOwnedByContext) {\n // @todo TypeScript defines the parameters of createIIRFilter() as arrays of numbers.\n nativeIIRFilterNode = nativeOfflineAudioContext.createIIRFilter(feedforward, feedback);\n }\n renderedNativeAudioNodes.set(nativeOfflineAudioContext, nativeAudioBufferSourceNode === null ? nativeIIRFilterNode : nativeAudioBufferSourceNode);\n if (nativeAudioBufferSourceNode !== null) {\n if (filteredBufferPromise === null) {\n if (nativeOfflineAudioContextConstructor === null) {\n throw new Error('Missing the native OfflineAudioContext constructor.');\n }\n const partialOfflineAudioContext = new nativeOfflineAudioContextConstructor(\n // Bug #47: The AudioDestinationNode in Safari gets not initialized correctly.\n proxy.context.destination.channelCount, \n // Bug #17: Safari does not yet expose the length.\n proxy.context.length, nativeOfflineAudioContext.sampleRate);\n filteredBufferPromise = (async () => {\n await renderInputsOfAudioNode(proxy, partialOfflineAudioContext, partialOfflineAudioContext.destination, trace);\n const renderedBuffer = await renderNativeOfflineAudioContext(partialOfflineAudioContext);\n return filterFullBuffer(renderedBuffer, nativeOfflineAudioContext, feedback, feedforward);\n })();\n }\n const filteredBuffer = await filteredBufferPromise;\n nativeAudioBufferSourceNode.buffer = filteredBuffer;\n nativeAudioBufferSourceNode.start(0);\n return nativeAudioBufferSourceNode;\n }\n await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeIIRFilterNode, trace);\n return nativeIIRFilterNode;\n };\n return {\n render(proxy, nativeOfflineAudioContext, trace) {\n const renderedNativeAudioNode = renderedNativeAudioNodes.get(nativeOfflineAudioContext);\n if (renderedNativeAudioNode !== undefined) {\n return Promise.resolve(renderedNativeAudioNode);\n }\n return createAudioNode(proxy, nativeOfflineAudioContext, trace);\n }\n };\n };\n};\n//# sourceMappingURL=iir-filter-node-renderer-factory.js.map","import { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nexport const createNativeIIRFilterNodeFactory = (createNativeIIRFilterNodeFaker) => {\n return (nativeContext, baseLatency, options) => {\n // Bug #9: Safari does not support IIRFilterNodes.\n if (nativeContext.createIIRFilter === undefined) {\n return createNativeIIRFilterNodeFaker(nativeContext, baseLatency, options);\n }\n // @todo TypeScript defines the parameters of createIIRFilter() as arrays of numbers.\n const nativeIIRFilterNode = nativeContext.createIIRFilter(options.feedforward, options.feedback);\n assignNativeAudioNodeOptions(nativeIIRFilterNode, options);\n return nativeIIRFilterNode;\n };\n};\n//# sourceMappingURL=native-iir-filter-node-factory.js.map","import { createInvalidAccessError } from '../factories/invalid-access-error';\nexport const wrapIIRFilterNodeGetFrequencyResponseMethod = (nativeIIRFilterNode) => {\n nativeIIRFilterNode.getFrequencyResponse = ((getFrequencyResponse) => {\n return (frequencyHz, magResponse, phaseResponse) => {\n if (frequencyHz.length !== magResponse.length || magResponse.length !== phaseResponse.length) {\n throw createInvalidAccessError();\n }\n return getFrequencyResponse.call(nativeIIRFilterNode, frequencyHz, magResponse, phaseResponse);\n };\n })(nativeIIRFilterNode.getFrequencyResponse);\n};\n//# sourceMappingURL=wrap-iir-filter-node-get-frequency-response-method.js.map","import { MOST_NEGATIVE_SINGLE_FLOAT, MOST_POSITIVE_SINGLE_FLOAT } from '../constants';\nexport const createAudioListenerFactory = (createAudioParam, createNativeChannelMergerNode, createNativeConstantSourceNode, createNativeScriptProcessorNode, isNativeOfflineAudioContext) => {\n return (context, nativeContext) => {\n const nativeListener = nativeContext.listener;\n // Bug #117: Only Chrome, Edge & Opera support the new interface already.\n const createFakeAudioParams = () => {\n const channelMergerNode = createNativeChannelMergerNode(nativeContext, {\n channelCount: 1,\n channelCountMode: 'explicit',\n channelInterpretation: 'speakers',\n numberOfInputs: 9\n });\n const isOffline = isNativeOfflineAudioContext(nativeContext);\n const scriptProcessorNode = createNativeScriptProcessorNode(nativeContext, 256, 9, 0);\n const createFakeAudioParam = (input, value) => {\n const constantSourceNode = createNativeConstantSourceNode(nativeContext, {\n channelCount: 1,\n channelCountMode: 'explicit',\n channelInterpretation: 'discrete',\n offset: value\n });\n constantSourceNode.connect(channelMergerNode, 0, input);\n // @todo This should be stopped when the context is closed.\n constantSourceNode.start();\n Object.defineProperty(constantSourceNode.offset, 'defaultValue', {\n get() {\n return value;\n }\n });\n /*\n * Bug #62 & #74: Safari does not support ConstantSourceNodes and does not export the correct values for maxValue and\n * minValue for GainNodes.\n */\n return createAudioParam({ context }, isOffline, constantSourceNode.offset, MOST_POSITIVE_SINGLE_FLOAT, MOST_NEGATIVE_SINGLE_FLOAT);\n };\n let lastOrientation = [0, 0, -1, 0, 1, 0];\n let lastPosition = [0, 0, 0];\n // tslint:disable-next-line:deprecation\n scriptProcessorNode.onaudioprocess = ({ inputBuffer }) => {\n const orientation = [\n inputBuffer.getChannelData(0)[0],\n inputBuffer.getChannelData(1)[0],\n inputBuffer.getChannelData(2)[0],\n inputBuffer.getChannelData(3)[0],\n inputBuffer.getChannelData(4)[0],\n inputBuffer.getChannelData(5)[0]\n ];\n if (orientation.some((value, index) => value !== lastOrientation[index])) {\n nativeListener.setOrientation(...orientation); // tslint:disable-line:deprecation\n lastOrientation = orientation;\n }\n const positon = [\n inputBuffer.getChannelData(6)[0],\n inputBuffer.getChannelData(7)[0],\n inputBuffer.getChannelData(8)[0]\n ];\n if (positon.some((value, index) => value !== lastPosition[index])) {\n nativeListener.setPosition(...positon); // tslint:disable-line:deprecation\n lastPosition = positon;\n }\n };\n channelMergerNode.connect(scriptProcessorNode);\n return {\n forwardX: createFakeAudioParam(0, 0),\n forwardY: createFakeAudioParam(1, 0),\n forwardZ: createFakeAudioParam(2, -1),\n positionX: createFakeAudioParam(6, 0),\n positionY: createFakeAudioParam(7, 0),\n positionZ: createFakeAudioParam(8, 0),\n upX: createFakeAudioParam(3, 0),\n upY: createFakeAudioParam(4, 1),\n upZ: createFakeAudioParam(5, 0)\n };\n };\n const { forwardX, forwardY, forwardZ, positionX, positionY, positionZ, upX, upY, upZ } = nativeListener.forwardX === undefined ? createFakeAudioParams() : nativeListener;\n return {\n get forwardX() {\n return forwardX;\n },\n get forwardY() {\n return forwardY;\n },\n get forwardZ() {\n return forwardZ;\n },\n get positionX() {\n return positionX;\n },\n get positionY() {\n return positionY;\n },\n get positionZ() {\n return positionZ;\n },\n get upX() {\n return upX;\n },\n get upY() {\n return upY;\n },\n get upZ() {\n return upZ;\n }\n };\n };\n};\n//# sourceMappingURL=audio-listener-factory.js.map","import { CONTEXT_STORE } from '../globals';\nexport const createMinimalBaseAudioContextConstructor = (audioDestinationNodeConstructor, createAudioListener, eventTargetConstructor, isNativeOfflineAudioContext, unrenderedAudioWorkletNodeStore, wrapEventListener) => {\n return class MinimalBaseAudioContext extends eventTargetConstructor {\n constructor(_nativeContext, numberOfChannels) {\n super(_nativeContext);\n this._nativeContext = _nativeContext;\n CONTEXT_STORE.set(this, _nativeContext);\n if (isNativeOfflineAudioContext(_nativeContext)) {\n unrenderedAudioWorkletNodeStore.set(_nativeContext, new Set());\n }\n this._destination = new audioDestinationNodeConstructor(this, numberOfChannels);\n this._listener = createAudioListener(this, _nativeContext);\n this._onstatechange = null;\n }\n get currentTime() {\n return this._nativeContext.currentTime;\n }\n get destination() {\n return this._destination;\n }\n get listener() {\n return this._listener;\n }\n get onstatechange() {\n return this._onstatechange;\n }\n set onstatechange(value) {\n const wrappedListener = typeof value === 'function' ? wrapEventListener(this, value) : null;\n this._nativeContext.onstatechange = wrappedListener;\n const nativeOnStateChange = this._nativeContext.onstatechange;\n this._onstatechange =\n nativeOnStateChange !== null && nativeOnStateChange === wrappedListener\n ? value\n : nativeOnStateChange;\n }\n get sampleRate() {\n return this._nativeContext.sampleRate;\n }\n get state() {\n return this._nativeContext.state;\n }\n };\n};\n//# sourceMappingURL=minimal-base-audio-context-constructor.js.map","import { assignNativeAudioNodeAudioParamValue } from '../helpers/assign-native-audio-node-audio-param-value';\nimport { assignNativeAudioNodeOption } from '../helpers/assign-native-audio-node-option';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nimport { wrapAudioScheduledSourceNodeStartMethodNegativeParameters } from '../helpers/wrap-audio-scheduled-source-node-start-method-negative-parameters';\nimport { wrapAudioScheduledSourceNodeStopMethodNegativeParameters } from '../helpers/wrap-audio-scheduled-source-node-stop-method-negative-parameters';\nexport const createNativeOscillatorNodeFactory = (addSilentConnection, cacheTestResult, testAudioScheduledSourceNodeStartMethodNegativeParametersSupport, testAudioScheduledSourceNodeStopMethodConsecutiveCallsSupport, testAudioScheduledSourceNodeStopMethodNegativeParametersSupport, wrapAudioScheduledSourceNodeStopMethodConsecutiveCalls) => {\n return (nativeContext, options) => {\n const nativeOscillatorNode = nativeContext.createOscillator();\n assignNativeAudioNodeOptions(nativeOscillatorNode, options);\n assignNativeAudioNodeAudioParamValue(nativeOscillatorNode, options, 'detune');\n assignNativeAudioNodeAudioParamValue(nativeOscillatorNode, options, 'frequency');\n if (options.periodicWave !== undefined) {\n nativeOscillatorNode.setPeriodicWave(options.periodicWave);\n }\n else {\n assignNativeAudioNodeOption(nativeOscillatorNode, options, 'type');\n }\n // Bug #44: Only Chrome, Edge & Opera throw a RangeError yet.\n if (!cacheTestResult(testAudioScheduledSourceNodeStartMethodNegativeParametersSupport, () => testAudioScheduledSourceNodeStartMethodNegativeParametersSupport(nativeContext))) {\n wrapAudioScheduledSourceNodeStartMethodNegativeParameters(nativeOscillatorNode);\n }\n // Bug #19: Safari does not ignore calls to stop() of an already stopped AudioBufferSourceNode.\n if (!cacheTestResult(testAudioScheduledSourceNodeStopMethodConsecutiveCallsSupport, () => testAudioScheduledSourceNodeStopMethodConsecutiveCallsSupport(nativeContext))) {\n wrapAudioScheduledSourceNodeStopMethodConsecutiveCalls(nativeOscillatorNode, nativeContext);\n }\n // Bug #44: Only Firefox does not throw a RangeError yet.\n if (!cacheTestResult(testAudioScheduledSourceNodeStopMethodNegativeParametersSupport, () => testAudioScheduledSourceNodeStopMethodNegativeParametersSupport(nativeContext))) {\n wrapAudioScheduledSourceNodeStopMethodNegativeParameters(nativeOscillatorNode);\n }\n // Bug #175: Safari will not fire an ended event if the OscillatorNode is unconnected.\n addSilentConnection(nativeContext, nativeOscillatorNode);\n return nativeOscillatorNode;\n };\n};\n//# sourceMappingURL=native-oscillator-node-factory.js.map","import { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createOscillatorNodeRendererFactory = (connectAudioParam, createNativeOscillatorNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode) => {\n return () => {\n const renderedNativeOscillatorNodes = new WeakMap();\n let periodicWave = null;\n let start = null;\n let stop = null;\n const createOscillatorNode = async (proxy, nativeOfflineAudioContext, trace) => {\n let nativeOscillatorNode = getNativeAudioNode(proxy);\n // If the initially used nativeOscillatorNode was not constructed on the same OfflineAudioContext it needs to be created again.\n const nativeOscillatorNodeIsOwnedByContext = isOwnedByContext(nativeOscillatorNode, nativeOfflineAudioContext);\n if (!nativeOscillatorNodeIsOwnedByContext) {\n const options = {\n channelCount: nativeOscillatorNode.channelCount,\n channelCountMode: nativeOscillatorNode.channelCountMode,\n channelInterpretation: nativeOscillatorNode.channelInterpretation,\n detune: nativeOscillatorNode.detune.value,\n frequency: nativeOscillatorNode.frequency.value,\n periodicWave: periodicWave === null ? undefined : periodicWave,\n type: nativeOscillatorNode.type\n };\n nativeOscillatorNode = createNativeOscillatorNode(nativeOfflineAudioContext, options);\n if (start !== null) {\n nativeOscillatorNode.start(start);\n }\n if (stop !== null) {\n nativeOscillatorNode.stop(stop);\n }\n }\n renderedNativeOscillatorNodes.set(nativeOfflineAudioContext, nativeOscillatorNode);\n if (!nativeOscillatorNodeIsOwnedByContext) {\n await renderAutomation(nativeOfflineAudioContext, proxy.detune, nativeOscillatorNode.detune, trace);\n await renderAutomation(nativeOfflineAudioContext, proxy.frequency, nativeOscillatorNode.frequency, trace);\n }\n else {\n await connectAudioParam(nativeOfflineAudioContext, proxy.detune, nativeOscillatorNode.detune, trace);\n await connectAudioParam(nativeOfflineAudioContext, proxy.frequency, nativeOscillatorNode.frequency, trace);\n }\n await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeOscillatorNode, trace);\n return nativeOscillatorNode;\n };\n return {\n set periodicWave(value) {\n periodicWave = value;\n },\n set start(value) {\n start = value;\n },\n set stop(value) {\n stop = value;\n },\n render(proxy, nativeOfflineAudioContext, trace) {\n const renderedNativeOscillatorNode = renderedNativeOscillatorNodes.get(nativeOfflineAudioContext);\n if (renderedNativeOscillatorNode !== undefined) {\n return Promise.resolve(renderedNativeOscillatorNode);\n }\n return createOscillatorNode(proxy, nativeOfflineAudioContext, trace);\n }\n };\n };\n};\n//# sourceMappingURL=oscillator-node-renderer-factory.js.map","export const createConnectedNativeAudioBufferSourceNodeFactory = (createNativeAudioBufferSourceNode) => {\n return (nativeContext, nativeAudioNode) => {\n const nativeAudioBufferSourceNode = createNativeAudioBufferSourceNode(nativeContext, {\n buffer: null,\n channelCount: 2,\n channelCountMode: 'max',\n channelInterpretation: 'speakers',\n loop: false,\n loopEnd: 0,\n loopStart: 0,\n playbackRate: 1\n });\n const nativeAudioBuffer = nativeContext.createBuffer(1, 2, 44100);\n nativeAudioBufferSourceNode.buffer = nativeAudioBuffer;\n nativeAudioBufferSourceNode.loop = true;\n nativeAudioBufferSourceNode.connect(nativeAudioNode);\n nativeAudioBufferSourceNode.start();\n return () => {\n nativeAudioBufferSourceNode.stop();\n nativeAudioBufferSourceNode.disconnect(nativeAudioNode);\n };\n };\n};\n//# sourceMappingURL=connected-native-audio-buffer-source-node-factory.js.map","import { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nimport { interceptConnections } from '../helpers/intercept-connections';\nexport const createNativeWaveShaperNodeFakerFactory = (createConnectedNativeAudioBufferSourceNode, createInvalidStateError, createNativeGainNode, isDCCurve, monitorConnections) => {\n return (nativeContext, { curve, oversample, ...audioNodeOptions }) => {\n const negativeWaveShaperNode = nativeContext.createWaveShaper();\n const positiveWaveShaperNode = nativeContext.createWaveShaper();\n assignNativeAudioNodeOptions(negativeWaveShaperNode, audioNodeOptions);\n assignNativeAudioNodeOptions(positiveWaveShaperNode, audioNodeOptions);\n const inputGainNode = createNativeGainNode(nativeContext, { ...audioNodeOptions, gain: 1 });\n const invertGainNode = createNativeGainNode(nativeContext, { ...audioNodeOptions, gain: -1 });\n const outputGainNode = createNativeGainNode(nativeContext, { ...audioNodeOptions, gain: 1 });\n const revertGainNode = createNativeGainNode(nativeContext, { ...audioNodeOptions, gain: -1 });\n let disconnectNativeAudioBufferSourceNode = null;\n let isConnected = false;\n let unmodifiedCurve = null;\n const nativeWaveShaperNodeFaker = {\n get bufferSize() {\n return undefined;\n },\n get channelCount() {\n return negativeWaveShaperNode.channelCount;\n },\n set channelCount(value) {\n inputGainNode.channelCount = value;\n invertGainNode.channelCount = value;\n negativeWaveShaperNode.channelCount = value;\n outputGainNode.channelCount = value;\n positiveWaveShaperNode.channelCount = value;\n revertGainNode.channelCount = value;\n },\n get channelCountMode() {\n return negativeWaveShaperNode.channelCountMode;\n },\n set channelCountMode(value) {\n inputGainNode.channelCountMode = value;\n invertGainNode.channelCountMode = value;\n negativeWaveShaperNode.channelCountMode = value;\n outputGainNode.channelCountMode = value;\n positiveWaveShaperNode.channelCountMode = value;\n revertGainNode.channelCountMode = value;\n },\n get channelInterpretation() {\n return negativeWaveShaperNode.channelInterpretation;\n },\n set channelInterpretation(value) {\n inputGainNode.channelInterpretation = value;\n invertGainNode.channelInterpretation = value;\n negativeWaveShaperNode.channelInterpretation = value;\n outputGainNode.channelInterpretation = value;\n positiveWaveShaperNode.channelInterpretation = value;\n revertGainNode.channelInterpretation = value;\n },\n get context() {\n return negativeWaveShaperNode.context;\n },\n get curve() {\n return unmodifiedCurve;\n },\n set curve(value) {\n // Bug #102: Safari does not throw an InvalidStateError when the curve has less than two samples.\n if (value !== null && value.length < 2) {\n throw createInvalidStateError();\n }\n if (value === null) {\n negativeWaveShaperNode.curve = value;\n positiveWaveShaperNode.curve = value;\n }\n else {\n const curveLength = value.length;\n const negativeCurve = new Float32Array(curveLength + 2 - (curveLength % 2));\n const positiveCurve = new Float32Array(curveLength + 2 - (curveLength % 2));\n negativeCurve[0] = value[0];\n positiveCurve[0] = -value[curveLength - 1];\n const length = Math.ceil((curveLength + 1) / 2);\n const centerIndex = (curveLength + 1) / 2 - 1;\n for (let i = 1; i < length; i += 1) {\n const theoreticIndex = (i / length) * centerIndex;\n const lowerIndex = Math.floor(theoreticIndex);\n const upperIndex = Math.ceil(theoreticIndex);\n negativeCurve[i] =\n lowerIndex === upperIndex\n ? value[lowerIndex]\n : (1 - (theoreticIndex - lowerIndex)) * value[lowerIndex] +\n (1 - (upperIndex - theoreticIndex)) * value[upperIndex];\n positiveCurve[i] =\n lowerIndex === upperIndex\n ? -value[curveLength - 1 - lowerIndex]\n : -((1 - (theoreticIndex - lowerIndex)) * value[curveLength - 1 - lowerIndex]) -\n (1 - (upperIndex - theoreticIndex)) * value[curveLength - 1 - upperIndex];\n }\n negativeCurve[length] = curveLength % 2 === 1 ? value[length - 1] : (value[length - 2] + value[length - 1]) / 2;\n negativeWaveShaperNode.curve = negativeCurve;\n positiveWaveShaperNode.curve = positiveCurve;\n }\n unmodifiedCurve = value;\n if (isConnected) {\n if (isDCCurve(unmodifiedCurve) && disconnectNativeAudioBufferSourceNode === null) {\n disconnectNativeAudioBufferSourceNode = createConnectedNativeAudioBufferSourceNode(nativeContext, inputGainNode);\n }\n else if (disconnectNativeAudioBufferSourceNode !== null) {\n disconnectNativeAudioBufferSourceNode();\n disconnectNativeAudioBufferSourceNode = null;\n }\n }\n },\n get inputs() {\n return [inputGainNode];\n },\n get numberOfInputs() {\n return negativeWaveShaperNode.numberOfInputs;\n },\n get numberOfOutputs() {\n return negativeWaveShaperNode.numberOfOutputs;\n },\n get oversample() {\n return negativeWaveShaperNode.oversample;\n },\n set oversample(value) {\n negativeWaveShaperNode.oversample = value;\n positiveWaveShaperNode.oversample = value;\n },\n addEventListener(...args) {\n return inputGainNode.addEventListener(args[0], args[1], args[2]);\n },\n dispatchEvent(...args) {\n return inputGainNode.dispatchEvent(args[0]);\n },\n removeEventListener(...args) {\n return inputGainNode.removeEventListener(args[0], args[1], args[2]);\n }\n };\n if (curve !== null) {\n // Only values of type Float32Array can be assigned to the curve property.\n nativeWaveShaperNodeFaker.curve = curve instanceof Float32Array ? curve : new Float32Array(curve);\n }\n if (oversample !== nativeWaveShaperNodeFaker.oversample) {\n nativeWaveShaperNodeFaker.oversample = oversample;\n }\n const whenConnected = () => {\n inputGainNode.connect(negativeWaveShaperNode).connect(outputGainNode);\n inputGainNode.connect(invertGainNode).connect(positiveWaveShaperNode).connect(revertGainNode).connect(outputGainNode);\n isConnected = true;\n if (isDCCurve(unmodifiedCurve)) {\n disconnectNativeAudioBufferSourceNode = createConnectedNativeAudioBufferSourceNode(nativeContext, inputGainNode);\n }\n };\n const whenDisconnected = () => {\n inputGainNode.disconnect(negativeWaveShaperNode);\n negativeWaveShaperNode.disconnect(outputGainNode);\n inputGainNode.disconnect(invertGainNode);\n invertGainNode.disconnect(positiveWaveShaperNode);\n positiveWaveShaperNode.disconnect(revertGainNode);\n revertGainNode.disconnect(outputGainNode);\n isConnected = false;\n if (disconnectNativeAudioBufferSourceNode !== null) {\n disconnectNativeAudioBufferSourceNode();\n disconnectNativeAudioBufferSourceNode = null;\n }\n };\n return monitorConnections(interceptConnections(nativeWaveShaperNodeFaker, outputGainNode), whenConnected, whenDisconnected);\n };\n};\n//# sourceMappingURL=native-wave-shaper-node-faker-factory.js.map","import { assignNativeAudioNodeOption } from '../helpers/assign-native-audio-node-option';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nexport const createNativeWaveShaperNodeFactory = (createConnectedNativeAudioBufferSourceNode, createInvalidStateError, createNativeWaveShaperNodeFaker, isDCCurve, monitorConnections, nativeAudioContextConstructor, overwriteAccessors) => {\n return (nativeContext, options) => {\n const nativeWaveShaperNode = nativeContext.createWaveShaper();\n /*\n * Bug #119: Safari does not correctly map the values.\n * @todo Unfortunately there is no way to test for this behavior in a synchronous fashion which is why testing for the existence of\n * the webkitAudioContext is used as a workaround here. Testing for the automationRate property is necessary because this workaround\n * isn't necessary anymore since v14.0.2 of Safari.\n */\n if (nativeAudioContextConstructor !== null &&\n nativeAudioContextConstructor.name === 'webkitAudioContext' &&\n nativeContext.createGain().gain.automationRate === undefined) {\n return createNativeWaveShaperNodeFaker(nativeContext, options);\n }\n assignNativeAudioNodeOptions(nativeWaveShaperNode, options);\n const curve = options.curve === null || options.curve instanceof Float32Array ? options.curve : new Float32Array(options.curve);\n // Bug #104: Chrome, Edge and Opera will throw an InvalidAccessError when the curve has less than two samples.\n if (curve !== null && curve.length < 2) {\n throw createInvalidStateError();\n }\n // Only values of type Float32Array can be assigned to the curve property.\n assignNativeAudioNodeOption(nativeWaveShaperNode, { curve }, 'curve');\n assignNativeAudioNodeOption(nativeWaveShaperNode, options, 'oversample');\n let disconnectNativeAudioBufferSourceNode = null;\n let isConnected = false;\n overwriteAccessors(nativeWaveShaperNode, 'curve', (get) => () => get.call(nativeWaveShaperNode), (set) => (value) => {\n set.call(nativeWaveShaperNode, value);\n if (isConnected) {\n if (isDCCurve(value) && disconnectNativeAudioBufferSourceNode === null) {\n disconnectNativeAudioBufferSourceNode = createConnectedNativeAudioBufferSourceNode(nativeContext, nativeWaveShaperNode);\n }\n else if (!isDCCurve(value) && disconnectNativeAudioBufferSourceNode !== null) {\n disconnectNativeAudioBufferSourceNode();\n disconnectNativeAudioBufferSourceNode = null;\n }\n }\n return value;\n });\n const whenConnected = () => {\n isConnected = true;\n if (isDCCurve(nativeWaveShaperNode.curve)) {\n disconnectNativeAudioBufferSourceNode = createConnectedNativeAudioBufferSourceNode(nativeContext, nativeWaveShaperNode);\n }\n };\n const whenDisconnected = () => {\n isConnected = false;\n if (disconnectNativeAudioBufferSourceNode !== null) {\n disconnectNativeAudioBufferSourceNode();\n disconnectNativeAudioBufferSourceNode = null;\n }\n };\n return monitorConnections(nativeWaveShaperNode, whenConnected, whenDisconnected);\n };\n};\n//# sourceMappingURL=native-wave-shaper-node-factory.js.map","import { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nimport { interceptConnections } from '../helpers/intercept-connections';\nexport const createNativePannerNodeFakerFactory = (connectNativeAudioNodeToNativeAudioNode, createInvalidStateError, createNativeChannelMergerNode, createNativeGainNode, createNativeScriptProcessorNode, createNativeWaveShaperNode, createNotSupportedError, disconnectNativeAudioNodeFromNativeAudioNode, monitorConnections) => {\n return (nativeContext, { coneInnerAngle, coneOuterAngle, coneOuterGain, distanceModel, maxDistance, orientationX, orientationY, orientationZ, panningModel, positionX, positionY, positionZ, refDistance, rolloffFactor, ...audioNodeOptions }) => {\n const pannerNode = nativeContext.createPanner();\n // Bug #125: Safari does not throw an error yet.\n if (audioNodeOptions.channelCount > 2) {\n throw createNotSupportedError();\n }\n // Bug #126: Safari does not throw an error yet.\n if (audioNodeOptions.channelCountMode === 'max') {\n throw createNotSupportedError();\n }\n assignNativeAudioNodeOptions(pannerNode, audioNodeOptions);\n const SINGLE_CHANNEL_OPTIONS = {\n channelCount: 1,\n channelCountMode: 'explicit',\n channelInterpretation: 'discrete'\n };\n const channelMergerNode = createNativeChannelMergerNode(nativeContext, {\n ...SINGLE_CHANNEL_OPTIONS,\n channelInterpretation: 'speakers',\n numberOfInputs: 6\n });\n const inputGainNode = createNativeGainNode(nativeContext, { ...audioNodeOptions, gain: 1 });\n const orientationXGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 1 });\n const orientationYGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 0 });\n const orientationZGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 0 });\n const positionXGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 0 });\n const positionYGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 0 });\n const positionZGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 0 });\n const scriptProcessorNode = createNativeScriptProcessorNode(nativeContext, 256, 6, 1);\n const waveShaperNode = createNativeWaveShaperNode(nativeContext, {\n ...SINGLE_CHANNEL_OPTIONS,\n curve: new Float32Array([1, 1]),\n oversample: 'none'\n });\n let lastOrientation = [orientationX, orientationY, orientationZ];\n let lastPosition = [positionX, positionY, positionZ];\n // tslint:disable-next-line:deprecation\n scriptProcessorNode.onaudioprocess = ({ inputBuffer }) => {\n const orientation = [\n inputBuffer.getChannelData(0)[0],\n inputBuffer.getChannelData(1)[0],\n inputBuffer.getChannelData(2)[0]\n ];\n if (orientation.some((value, index) => value !== lastOrientation[index])) {\n pannerNode.setOrientation(...orientation); // tslint:disable-line:deprecation\n lastOrientation = orientation;\n }\n const positon = [\n inputBuffer.getChannelData(3)[0],\n inputBuffer.getChannelData(4)[0],\n inputBuffer.getChannelData(5)[0]\n ];\n if (positon.some((value, index) => value !== lastPosition[index])) {\n pannerNode.setPosition(...positon); // tslint:disable-line:deprecation\n lastPosition = positon;\n }\n };\n Object.defineProperty(orientationYGainNode.gain, 'defaultValue', { get: () => 0 });\n Object.defineProperty(orientationZGainNode.gain, 'defaultValue', { get: () => 0 });\n Object.defineProperty(positionXGainNode.gain, 'defaultValue', { get: () => 0 });\n Object.defineProperty(positionYGainNode.gain, 'defaultValue', { get: () => 0 });\n Object.defineProperty(positionZGainNode.gain, 'defaultValue', { get: () => 0 });\n const nativePannerNodeFaker = {\n get bufferSize() {\n return undefined;\n },\n get channelCount() {\n return pannerNode.channelCount;\n },\n set channelCount(value) {\n // Bug #125: Safari does not throw an error yet.\n if (value > 2) {\n throw createNotSupportedError();\n }\n inputGainNode.channelCount = value;\n pannerNode.channelCount = value;\n },\n get channelCountMode() {\n return pannerNode.channelCountMode;\n },\n set channelCountMode(value) {\n // Bug #126: Safari does not throw an error yet.\n if (value === 'max') {\n throw createNotSupportedError();\n }\n inputGainNode.channelCountMode = value;\n pannerNode.channelCountMode = value;\n },\n get channelInterpretation() {\n return pannerNode.channelInterpretation;\n },\n set channelInterpretation(value) {\n inputGainNode.channelInterpretation = value;\n pannerNode.channelInterpretation = value;\n },\n get coneInnerAngle() {\n return pannerNode.coneInnerAngle;\n },\n set coneInnerAngle(value) {\n pannerNode.coneInnerAngle = value;\n },\n get coneOuterAngle() {\n return pannerNode.coneOuterAngle;\n },\n set coneOuterAngle(value) {\n pannerNode.coneOuterAngle = value;\n },\n get coneOuterGain() {\n return pannerNode.coneOuterGain;\n },\n set coneOuterGain(value) {\n // Bug #127: Safari does not throw an InvalidStateError yet.\n if (value < 0 || value > 1) {\n throw createInvalidStateError();\n }\n pannerNode.coneOuterGain = value;\n },\n get context() {\n return pannerNode.context;\n },\n get distanceModel() {\n return pannerNode.distanceModel;\n },\n set distanceModel(value) {\n pannerNode.distanceModel = value;\n },\n get inputs() {\n return [inputGainNode];\n },\n get maxDistance() {\n return pannerNode.maxDistance;\n },\n set maxDistance(value) {\n // Bug #128: Safari does not throw an error yet.\n if (value < 0) {\n throw new RangeError();\n }\n pannerNode.maxDistance = value;\n },\n get numberOfInputs() {\n return pannerNode.numberOfInputs;\n },\n get numberOfOutputs() {\n return pannerNode.numberOfOutputs;\n },\n get orientationX() {\n return orientationXGainNode.gain;\n },\n get orientationY() {\n return orientationYGainNode.gain;\n },\n get orientationZ() {\n return orientationZGainNode.gain;\n },\n get panningModel() {\n return pannerNode.panningModel;\n },\n set panningModel(value) {\n pannerNode.panningModel = value;\n },\n get positionX() {\n return positionXGainNode.gain;\n },\n get positionY() {\n return positionYGainNode.gain;\n },\n get positionZ() {\n return positionZGainNode.gain;\n },\n get refDistance() {\n return pannerNode.refDistance;\n },\n set refDistance(value) {\n // Bug #129: Safari does not throw an error yet.\n if (value < 0) {\n throw new RangeError();\n }\n pannerNode.refDistance = value;\n },\n get rolloffFactor() {\n return pannerNode.rolloffFactor;\n },\n set rolloffFactor(value) {\n // Bug #130: Safari does not throw an error yet.\n if (value < 0) {\n throw new RangeError();\n }\n pannerNode.rolloffFactor = value;\n },\n addEventListener(...args) {\n return inputGainNode.addEventListener(args[0], args[1], args[2]);\n },\n dispatchEvent(...args) {\n return inputGainNode.dispatchEvent(args[0]);\n },\n removeEventListener(...args) {\n return inputGainNode.removeEventListener(args[0], args[1], args[2]);\n }\n };\n if (coneInnerAngle !== nativePannerNodeFaker.coneInnerAngle) {\n nativePannerNodeFaker.coneInnerAngle = coneInnerAngle;\n }\n if (coneOuterAngle !== nativePannerNodeFaker.coneOuterAngle) {\n nativePannerNodeFaker.coneOuterAngle = coneOuterAngle;\n }\n if (coneOuterGain !== nativePannerNodeFaker.coneOuterGain) {\n nativePannerNodeFaker.coneOuterGain = coneOuterGain;\n }\n if (distanceModel !== nativePannerNodeFaker.distanceModel) {\n nativePannerNodeFaker.distanceModel = distanceModel;\n }\n if (maxDistance !== nativePannerNodeFaker.maxDistance) {\n nativePannerNodeFaker.maxDistance = maxDistance;\n }\n if (orientationX !== nativePannerNodeFaker.orientationX.value) {\n nativePannerNodeFaker.orientationX.value = orientationX;\n }\n if (orientationY !== nativePannerNodeFaker.orientationY.value) {\n nativePannerNodeFaker.orientationY.value = orientationY;\n }\n if (orientationZ !== nativePannerNodeFaker.orientationZ.value) {\n nativePannerNodeFaker.orientationZ.value = orientationZ;\n }\n if (panningModel !== nativePannerNodeFaker.panningModel) {\n nativePannerNodeFaker.panningModel = panningModel;\n }\n if (positionX !== nativePannerNodeFaker.positionX.value) {\n nativePannerNodeFaker.positionX.value = positionX;\n }\n if (positionY !== nativePannerNodeFaker.positionY.value) {\n nativePannerNodeFaker.positionY.value = positionY;\n }\n if (positionZ !== nativePannerNodeFaker.positionZ.value) {\n nativePannerNodeFaker.positionZ.value = positionZ;\n }\n if (refDistance !== nativePannerNodeFaker.refDistance) {\n nativePannerNodeFaker.refDistance = refDistance;\n }\n if (rolloffFactor !== nativePannerNodeFaker.rolloffFactor) {\n nativePannerNodeFaker.rolloffFactor = rolloffFactor;\n }\n if (lastOrientation[0] !== 1 || lastOrientation[1] !== 0 || lastOrientation[2] !== 0) {\n pannerNode.setOrientation(...lastOrientation); // tslint:disable-line:deprecation\n }\n if (lastPosition[0] !== 0 || lastPosition[1] !== 0 || lastPosition[2] !== 0) {\n pannerNode.setPosition(...lastPosition); // tslint:disable-line:deprecation\n }\n const whenConnected = () => {\n inputGainNode.connect(pannerNode);\n // Bug #119: Safari does not fully support the WaveShaperNode.\n connectNativeAudioNodeToNativeAudioNode(inputGainNode, waveShaperNode, 0, 0);\n waveShaperNode.connect(orientationXGainNode).connect(channelMergerNode, 0, 0);\n waveShaperNode.connect(orientationYGainNode).connect(channelMergerNode, 0, 1);\n waveShaperNode.connect(orientationZGainNode).connect(channelMergerNode, 0, 2);\n waveShaperNode.connect(positionXGainNode).connect(channelMergerNode, 0, 3);\n waveShaperNode.connect(positionYGainNode).connect(channelMergerNode, 0, 4);\n waveShaperNode.connect(positionZGainNode).connect(channelMergerNode, 0, 5);\n channelMergerNode.connect(scriptProcessorNode).connect(nativeContext.destination);\n };\n const whenDisconnected = () => {\n inputGainNode.disconnect(pannerNode);\n // Bug #119: Safari does not fully support the WaveShaperNode.\n disconnectNativeAudioNodeFromNativeAudioNode(inputGainNode, waveShaperNode, 0, 0);\n waveShaperNode.disconnect(orientationXGainNode);\n orientationXGainNode.disconnect(channelMergerNode);\n waveShaperNode.disconnect(orientationYGainNode);\n orientationYGainNode.disconnect(channelMergerNode);\n waveShaperNode.disconnect(orientationZGainNode);\n orientationZGainNode.disconnect(channelMergerNode);\n waveShaperNode.disconnect(positionXGainNode);\n positionXGainNode.disconnect(channelMergerNode);\n waveShaperNode.disconnect(positionYGainNode);\n positionYGainNode.disconnect(channelMergerNode);\n waveShaperNode.disconnect(positionZGainNode);\n positionZGainNode.disconnect(channelMergerNode);\n channelMergerNode.disconnect(scriptProcessorNode);\n scriptProcessorNode.disconnect(nativeContext.destination);\n };\n return monitorConnections(interceptConnections(nativePannerNodeFaker, pannerNode), whenConnected, whenDisconnected);\n };\n};\n//# sourceMappingURL=native-panner-node-faker-factory.js.map","import { assignNativeAudioNodeAudioParamValue } from '../helpers/assign-native-audio-node-audio-param-value';\nimport { assignNativeAudioNodeOption } from '../helpers/assign-native-audio-node-option';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nexport const createNativePannerNodeFactory = (createNativePannerNodeFaker) => {\n return (nativeContext, options) => {\n const nativePannerNode = nativeContext.createPanner();\n // Bug #124: Safari does not support modifying the orientation and the position with AudioParams.\n if (nativePannerNode.orientationX === undefined) {\n return createNativePannerNodeFaker(nativeContext, options);\n }\n assignNativeAudioNodeOptions(nativePannerNode, options);\n assignNativeAudioNodeAudioParamValue(nativePannerNode, options, 'orientationX');\n assignNativeAudioNodeAudioParamValue(nativePannerNode, options, 'orientationY');\n assignNativeAudioNodeAudioParamValue(nativePannerNode, options, 'orientationZ');\n assignNativeAudioNodeAudioParamValue(nativePannerNode, options, 'positionX');\n assignNativeAudioNodeAudioParamValue(nativePannerNode, options, 'positionY');\n assignNativeAudioNodeAudioParamValue(nativePannerNode, options, 'positionZ');\n assignNativeAudioNodeOption(nativePannerNode, options, 'coneInnerAngle');\n assignNativeAudioNodeOption(nativePannerNode, options, 'coneOuterAngle');\n assignNativeAudioNodeOption(nativePannerNode, options, 'coneOuterGain');\n assignNativeAudioNodeOption(nativePannerNode, options, 'distanceModel');\n assignNativeAudioNodeOption(nativePannerNode, options, 'maxDistance');\n assignNativeAudioNodeOption(nativePannerNode, options, 'panningModel');\n assignNativeAudioNodeOption(nativePannerNode, options, 'refDistance');\n assignNativeAudioNodeOption(nativePannerNode, options, 'rolloffFactor');\n return nativePannerNode;\n };\n};\n//# sourceMappingURL=native-panner-node-factory.js.map","import { isNativeAudioNodeFaker } from '../guards/native-audio-node-faker';\nimport { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createPannerNodeRendererFactory = (connectAudioParam, createNativeChannelMergerNode, createNativeConstantSourceNode, createNativeGainNode, createNativePannerNode, getNativeAudioNode, nativeOfflineAudioContextConstructor, renderAutomation, renderInputsOfAudioNode, renderNativeOfflineAudioContext) => {\n return () => {\n const renderedNativeAudioNodes = new WeakMap();\n let renderedBufferPromise = null;\n const createAudioNode = async (proxy, nativeOfflineAudioContext, trace) => {\n let nativeGainNode = null;\n let nativePannerNode = getNativeAudioNode(proxy);\n const commonAudioNodeOptions = {\n channelCount: nativePannerNode.channelCount,\n channelCountMode: nativePannerNode.channelCountMode,\n channelInterpretation: nativePannerNode.channelInterpretation\n };\n const commonNativePannerNodeOptions = {\n ...commonAudioNodeOptions,\n coneInnerAngle: nativePannerNode.coneInnerAngle,\n coneOuterAngle: nativePannerNode.coneOuterAngle,\n coneOuterGain: nativePannerNode.coneOuterGain,\n distanceModel: nativePannerNode.distanceModel,\n maxDistance: nativePannerNode.maxDistance,\n panningModel: nativePannerNode.panningModel,\n refDistance: nativePannerNode.refDistance,\n rolloffFactor: nativePannerNode.rolloffFactor\n };\n // If the initially used nativePannerNode was not constructed on the same OfflineAudioContext it needs to be created again.\n const nativePannerNodeIsOwnedByContext = isOwnedByContext(nativePannerNode, nativeOfflineAudioContext);\n // Bug #124: Safari does not support modifying the orientation and the position with AudioParams.\n if ('bufferSize' in nativePannerNode) {\n nativeGainNode = createNativeGainNode(nativeOfflineAudioContext, { ...commonAudioNodeOptions, gain: 1 });\n }\n else if (!nativePannerNodeIsOwnedByContext) {\n const options = {\n ...commonNativePannerNodeOptions,\n orientationX: nativePannerNode.orientationX.value,\n orientationY: nativePannerNode.orientationY.value,\n orientationZ: nativePannerNode.orientationZ.value,\n positionX: nativePannerNode.positionX.value,\n positionY: nativePannerNode.positionY.value,\n positionZ: nativePannerNode.positionZ.value\n };\n nativePannerNode = createNativePannerNode(nativeOfflineAudioContext, options);\n }\n renderedNativeAudioNodes.set(nativeOfflineAudioContext, nativeGainNode === null ? nativePannerNode : nativeGainNode);\n if (nativeGainNode !== null) {\n if (renderedBufferPromise === null) {\n if (nativeOfflineAudioContextConstructor === null) {\n throw new Error('Missing the native OfflineAudioContext constructor.');\n }\n const partialOfflineAudioContext = new nativeOfflineAudioContextConstructor(6, \n // Bug #17: Safari does not yet expose the length.\n proxy.context.length, nativeOfflineAudioContext.sampleRate);\n const nativeChannelMergerNode = createNativeChannelMergerNode(partialOfflineAudioContext, {\n channelCount: 1,\n channelCountMode: 'explicit',\n channelInterpretation: 'speakers',\n numberOfInputs: 6\n });\n nativeChannelMergerNode.connect(partialOfflineAudioContext.destination);\n renderedBufferPromise = (async () => {\n const nativeConstantSourceNodes = await Promise.all([\n proxy.orientationX,\n proxy.orientationY,\n proxy.orientationZ,\n proxy.positionX,\n proxy.positionY,\n proxy.positionZ\n ].map(async (audioParam, index) => {\n const nativeConstantSourceNode = createNativeConstantSourceNode(partialOfflineAudioContext, {\n channelCount: 1,\n channelCountMode: 'explicit',\n channelInterpretation: 'discrete',\n offset: index === 0 ? 1 : 0\n });\n await renderAutomation(partialOfflineAudioContext, audioParam, nativeConstantSourceNode.offset, trace);\n return nativeConstantSourceNode;\n }));\n for (let i = 0; i < 6; i += 1) {\n nativeConstantSourceNodes[i].connect(nativeChannelMergerNode, 0, i);\n nativeConstantSourceNodes[i].start(0);\n }\n return renderNativeOfflineAudioContext(partialOfflineAudioContext);\n })();\n }\n const renderedBuffer = await renderedBufferPromise;\n const inputGainNode = createNativeGainNode(nativeOfflineAudioContext, { ...commonAudioNodeOptions, gain: 1 });\n await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, inputGainNode, trace);\n const channelDatas = [];\n for (let i = 0; i < renderedBuffer.numberOfChannels; i += 1) {\n channelDatas.push(renderedBuffer.getChannelData(i));\n }\n let lastOrientation = [channelDatas[0][0], channelDatas[1][0], channelDatas[2][0]];\n let lastPosition = [channelDatas[3][0], channelDatas[4][0], channelDatas[5][0]];\n let gateGainNode = createNativeGainNode(nativeOfflineAudioContext, { ...commonAudioNodeOptions, gain: 1 });\n let partialPannerNode = createNativePannerNode(nativeOfflineAudioContext, {\n ...commonNativePannerNodeOptions,\n orientationX: lastOrientation[0],\n orientationY: lastOrientation[1],\n orientationZ: lastOrientation[2],\n positionX: lastPosition[0],\n positionY: lastPosition[1],\n positionZ: lastPosition[2]\n });\n inputGainNode.connect(gateGainNode).connect(partialPannerNode.inputs[0]);\n partialPannerNode.connect(nativeGainNode);\n for (let i = 128; i < renderedBuffer.length; i += 128) {\n const orientation = [channelDatas[0][i], channelDatas[1][i], channelDatas[2][i]];\n const positon = [channelDatas[3][i], channelDatas[4][i], channelDatas[5][i]];\n if (orientation.some((value, index) => value !== lastOrientation[index]) ||\n positon.some((value, index) => value !== lastPosition[index])) {\n lastOrientation = orientation;\n lastPosition = positon;\n const currentTime = i / nativeOfflineAudioContext.sampleRate;\n gateGainNode.gain.setValueAtTime(0, currentTime);\n gateGainNode = createNativeGainNode(nativeOfflineAudioContext, { ...commonAudioNodeOptions, gain: 0 });\n partialPannerNode = createNativePannerNode(nativeOfflineAudioContext, {\n ...commonNativePannerNodeOptions,\n orientationX: lastOrientation[0],\n orientationY: lastOrientation[1],\n orientationZ: lastOrientation[2],\n positionX: lastPosition[0],\n positionY: lastPosition[1],\n positionZ: lastPosition[2]\n });\n gateGainNode.gain.setValueAtTime(1, currentTime);\n inputGainNode.connect(gateGainNode).connect(partialPannerNode.inputs[0]);\n partialPannerNode.connect(nativeGainNode);\n }\n }\n return nativeGainNode;\n }\n if (!nativePannerNodeIsOwnedByContext) {\n await renderAutomation(nativeOfflineAudioContext, proxy.orientationX, nativePannerNode.orientationX, trace);\n await renderAutomation(nativeOfflineAudioContext, proxy.orientationY, nativePannerNode.orientationY, trace);\n await renderAutomation(nativeOfflineAudioContext, proxy.orientationZ, nativePannerNode.orientationZ, trace);\n await renderAutomation(nativeOfflineAudioContext, proxy.positionX, nativePannerNode.positionX, trace);\n await renderAutomation(nativeOfflineAudioContext, proxy.positionY, nativePannerNode.positionY, trace);\n await renderAutomation(nativeOfflineAudioContext, proxy.positionZ, nativePannerNode.positionZ, trace);\n }\n else {\n await connectAudioParam(nativeOfflineAudioContext, proxy.orientationX, nativePannerNode.orientationX, trace);\n await connectAudioParam(nativeOfflineAudioContext, proxy.orientationY, nativePannerNode.orientationY, trace);\n await connectAudioParam(nativeOfflineAudioContext, proxy.orientationZ, nativePannerNode.orientationZ, trace);\n await connectAudioParam(nativeOfflineAudioContext, proxy.positionX, nativePannerNode.positionX, trace);\n await connectAudioParam(nativeOfflineAudioContext, proxy.positionY, nativePannerNode.positionY, trace);\n await connectAudioParam(nativeOfflineAudioContext, proxy.positionZ, nativePannerNode.positionZ, trace);\n }\n if (isNativeAudioNodeFaker(nativePannerNode)) {\n await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativePannerNode.inputs[0], trace);\n }\n else {\n await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativePannerNode, trace);\n }\n return nativePannerNode;\n };\n return {\n render(proxy, nativeOfflineAudioContext, trace) {\n const renderedNativeGainNodeOrNativePannerNode = renderedNativeAudioNodes.get(nativeOfflineAudioContext);\n if (renderedNativeGainNodeOrNativePannerNode !== undefined) {\n return Promise.resolve(renderedNativeGainNodeOrNativePannerNode);\n }\n return createAudioNode(proxy, nativeOfflineAudioContext, trace);\n }\n };\n };\n};\n//# sourceMappingURL=panner-node-renderer-factory.js.map","export const createNativePeriodicWaveFactory = (createIndexSizeError) => {\n return (nativeContext, { disableNormalization, imag, real }) => {\n // Bug #180: Safari does not allow to use ordinary arrays.\n const convertedImag = imag instanceof Float32Array ? imag : new Float32Array(imag);\n const convertedReal = real instanceof Float32Array ? real : new Float32Array(real);\n const nativePeriodicWave = nativeContext.createPeriodicWave(convertedReal, convertedImag, { disableNormalization });\n // Bug #181: Safari does not throw an IndexSizeError so far if the given arrays have less than two values.\n if (Array.from(imag).length < 2) {\n throw createIndexSizeError();\n }\n return nativePeriodicWave;\n };\n};\n//# sourceMappingURL=native-periodic-wave-factory.js.map","export const sanitizePeriodicWaveOptions = (options) => {\n const { imag, real } = options;\n if (imag === undefined) {\n if (real === undefined) {\n return { ...options, imag: [0, 0], real: [0, 0] };\n }\n return { ...options, imag: Array.from(real, () => 0), real };\n }\n if (real === undefined) {\n return { ...options, imag, real: Array.from(imag, () => 0) };\n }\n return { ...options, imag, real };\n};\n//# sourceMappingURL=sanitize-periodic-wave-options.js.map","import { assignNativeAudioNodeAudioParamValue } from '../helpers/assign-native-audio-node-audio-param-value';\nimport { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nexport const createNativeStereoPannerNodeFactory = (createNativeStereoPannerNodeFaker, createNotSupportedError) => {\n return (nativeContext, options) => {\n const channelCountMode = options.channelCountMode;\n /*\n * Bug #105: The channelCountMode of 'clamped-max' should be supported. However it is not possible to write a polyfill for Safari\n * which supports it and therefore it can't be supported at all.\n */\n if (channelCountMode === 'clamped-max') {\n throw createNotSupportedError();\n }\n // Bug #105: Safari does not support the StereoPannerNode.\n if (nativeContext.createStereoPanner === undefined) {\n return createNativeStereoPannerNodeFaker(nativeContext, options);\n }\n const nativeStereoPannerNode = nativeContext.createStereoPanner();\n assignNativeAudioNodeOptions(nativeStereoPannerNode, options);\n assignNativeAudioNodeAudioParamValue(nativeStereoPannerNode, options, 'pan');\n /*\n * Bug #105: The channelCountMode of 'clamped-max' should be supported. However it is not possible to write a polyfill for Safari\n * which supports it and therefore it can't be supported at all.\n */\n Object.defineProperty(nativeStereoPannerNode, 'channelCountMode', {\n get: () => channelCountMode,\n set: (value) => {\n if (value !== channelCountMode) {\n throw createNotSupportedError();\n }\n }\n });\n return nativeStereoPannerNode;\n };\n};\n//# sourceMappingURL=native-stereo-panner-node-factory.js.map","import { interceptConnections } from '../helpers/intercept-connections';\nexport const createNativeStereoPannerNodeFakerFactory = (createNativeChannelMergerNode, createNativeChannelSplitterNode, createNativeGainNode, createNativeWaveShaperNode, createNotSupportedError, monitorConnections) => {\n // The curve has a size of 14bit plus 1 value to have an exact representation for zero. This value has been determined experimentally.\n const CURVE_SIZE = 16385;\n const DC_CURVE = new Float32Array([1, 1]);\n const HALF_PI = Math.PI / 2;\n const SINGLE_CHANNEL_OPTIONS = { channelCount: 1, channelCountMode: 'explicit', channelInterpretation: 'discrete' };\n const SINGLE_CHANNEL_WAVE_SHAPER_OPTIONS = { ...SINGLE_CHANNEL_OPTIONS, oversample: 'none' };\n const buildInternalGraphForMono = (nativeContext, inputGainNode, panGainNode, channelMergerNode) => {\n const leftWaveShaperCurve = new Float32Array(CURVE_SIZE);\n const rightWaveShaperCurve = new Float32Array(CURVE_SIZE);\n for (let i = 0; i < CURVE_SIZE; i += 1) {\n const x = (i / (CURVE_SIZE - 1)) * HALF_PI;\n leftWaveShaperCurve[i] = Math.cos(x);\n rightWaveShaperCurve[i] = Math.sin(x);\n }\n const leftGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 0 });\n // Bug #119: Safari does not fully support the WaveShaperNode.\n const leftWaveShaperNode = (createNativeWaveShaperNode(nativeContext, { ...SINGLE_CHANNEL_WAVE_SHAPER_OPTIONS, curve: leftWaveShaperCurve }));\n // Bug #119: Safari does not fully support the WaveShaperNode.\n const panWaveShaperNode = (createNativeWaveShaperNode(nativeContext, { ...SINGLE_CHANNEL_WAVE_SHAPER_OPTIONS, curve: DC_CURVE }));\n const rightGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 0 });\n // Bug #119: Safari does not fully support the WaveShaperNode.\n const rightWaveShaperNode = (createNativeWaveShaperNode(nativeContext, { ...SINGLE_CHANNEL_WAVE_SHAPER_OPTIONS, curve: rightWaveShaperCurve }));\n return {\n connectGraph() {\n inputGainNode.connect(leftGainNode);\n inputGainNode.connect(panWaveShaperNode.inputs === undefined ? panWaveShaperNode : panWaveShaperNode.inputs[0]);\n inputGainNode.connect(rightGainNode);\n panWaveShaperNode.connect(panGainNode);\n panGainNode.connect(leftWaveShaperNode.inputs === undefined ? leftWaveShaperNode : leftWaveShaperNode.inputs[0]);\n panGainNode.connect(rightWaveShaperNode.inputs === undefined ? rightWaveShaperNode : rightWaveShaperNode.inputs[0]);\n leftWaveShaperNode.connect(leftGainNode.gain);\n rightWaveShaperNode.connect(rightGainNode.gain);\n leftGainNode.connect(channelMergerNode, 0, 0);\n rightGainNode.connect(channelMergerNode, 0, 1);\n },\n disconnectGraph() {\n inputGainNode.disconnect(leftGainNode);\n inputGainNode.disconnect(panWaveShaperNode.inputs === undefined ? panWaveShaperNode : panWaveShaperNode.inputs[0]);\n inputGainNode.disconnect(rightGainNode);\n panWaveShaperNode.disconnect(panGainNode);\n panGainNode.disconnect(leftWaveShaperNode.inputs === undefined ? leftWaveShaperNode : leftWaveShaperNode.inputs[0]);\n panGainNode.disconnect(rightWaveShaperNode.inputs === undefined ? rightWaveShaperNode : rightWaveShaperNode.inputs[0]);\n leftWaveShaperNode.disconnect(leftGainNode.gain);\n rightWaveShaperNode.disconnect(rightGainNode.gain);\n leftGainNode.disconnect(channelMergerNode, 0, 0);\n rightGainNode.disconnect(channelMergerNode, 0, 1);\n }\n };\n };\n const buildInternalGraphForStereo = (nativeContext, inputGainNode, panGainNode, channelMergerNode) => {\n const leftInputForLeftOutputWaveShaperCurve = new Float32Array(CURVE_SIZE);\n const leftInputForRightOutputWaveShaperCurve = new Float32Array(CURVE_SIZE);\n const rightInputForLeftOutputWaveShaperCurve = new Float32Array(CURVE_SIZE);\n const rightInputForRightOutputWaveShaperCurve = new Float32Array(CURVE_SIZE);\n const centerIndex = Math.floor(CURVE_SIZE / 2);\n for (let i = 0; i < CURVE_SIZE; i += 1) {\n if (i > centerIndex) {\n const x = ((i - centerIndex) / (CURVE_SIZE - 1 - centerIndex)) * HALF_PI;\n leftInputForLeftOutputWaveShaperCurve[i] = Math.cos(x);\n leftInputForRightOutputWaveShaperCurve[i] = Math.sin(x);\n rightInputForLeftOutputWaveShaperCurve[i] = 0;\n rightInputForRightOutputWaveShaperCurve[i] = 1;\n }\n else {\n const x = (i / (CURVE_SIZE - 1 - centerIndex)) * HALF_PI;\n leftInputForLeftOutputWaveShaperCurve[i] = 1;\n leftInputForRightOutputWaveShaperCurve[i] = 0;\n rightInputForLeftOutputWaveShaperCurve[i] = Math.cos(x);\n rightInputForRightOutputWaveShaperCurve[i] = Math.sin(x);\n }\n }\n const channelSplitterNode = createNativeChannelSplitterNode(nativeContext, {\n channelCount: 2,\n channelCountMode: 'explicit',\n channelInterpretation: 'discrete',\n numberOfOutputs: 2\n });\n const leftInputForLeftOutputGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 0 });\n // Bug #119: Safari does not fully support the WaveShaperNode.\n const leftInputForLeftOutputWaveShaperNode = createNativeWaveShaperNode(nativeContext, {\n ...SINGLE_CHANNEL_WAVE_SHAPER_OPTIONS,\n curve: leftInputForLeftOutputWaveShaperCurve\n });\n const leftInputForRightOutputGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 0 });\n // Bug #119: Safari does not fully support the WaveShaperNode.\n const leftInputForRightOutputWaveShaperNode = createNativeWaveShaperNode(nativeContext, {\n ...SINGLE_CHANNEL_WAVE_SHAPER_OPTIONS,\n curve: leftInputForRightOutputWaveShaperCurve\n });\n // Bug #119: Safari does not fully support the WaveShaperNode.\n const panWaveShaperNode = (createNativeWaveShaperNode(nativeContext, { ...SINGLE_CHANNEL_WAVE_SHAPER_OPTIONS, curve: DC_CURVE }));\n const rightInputForLeftOutputGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 0 });\n // Bug #119: Safari does not fully support the WaveShaperNode.\n const rightInputForLeftOutputWaveShaperNode = createNativeWaveShaperNode(nativeContext, {\n ...SINGLE_CHANNEL_WAVE_SHAPER_OPTIONS,\n curve: rightInputForLeftOutputWaveShaperCurve\n });\n const rightInputForRightOutputGainNode = createNativeGainNode(nativeContext, { ...SINGLE_CHANNEL_OPTIONS, gain: 0 });\n // Bug #119: Safari does not fully support the WaveShaperNode.\n const rightInputForRightOutputWaveShaperNode = createNativeWaveShaperNode(nativeContext, {\n ...SINGLE_CHANNEL_WAVE_SHAPER_OPTIONS,\n curve: rightInputForRightOutputWaveShaperCurve\n });\n return {\n connectGraph() {\n inputGainNode.connect(channelSplitterNode);\n inputGainNode.connect(panWaveShaperNode.inputs === undefined ? panWaveShaperNode : panWaveShaperNode.inputs[0]);\n channelSplitterNode.connect(leftInputForLeftOutputGainNode, 0);\n channelSplitterNode.connect(leftInputForRightOutputGainNode, 0);\n channelSplitterNode.connect(rightInputForLeftOutputGainNode, 1);\n channelSplitterNode.connect(rightInputForRightOutputGainNode, 1);\n panWaveShaperNode.connect(panGainNode);\n panGainNode.connect(leftInputForLeftOutputWaveShaperNode.inputs === undefined\n ? leftInputForLeftOutputWaveShaperNode\n : leftInputForLeftOutputWaveShaperNode.inputs[0]);\n panGainNode.connect(leftInputForRightOutputWaveShaperNode.inputs === undefined\n ? leftInputForRightOutputWaveShaperNode\n : leftInputForRightOutputWaveShaperNode.inputs[0]);\n panGainNode.connect(rightInputForLeftOutputWaveShaperNode.inputs === undefined\n ? rightInputForLeftOutputWaveShaperNode\n : rightInputForLeftOutputWaveShaperNode.inputs[0]);\n panGainNode.connect(rightInputForRightOutputWaveShaperNode.inputs === undefined\n ? rightInputForRightOutputWaveShaperNode\n : rightInputForRightOutputWaveShaperNode.inputs[0]);\n leftInputForLeftOutputWaveShaperNode.connect(leftInputForLeftOutputGainNode.gain);\n leftInputForRightOutputWaveShaperNode.connect(leftInputForRightOutputGainNode.gain);\n rightInputForLeftOutputWaveShaperNode.connect(rightInputForLeftOutputGainNode.gain);\n rightInputForRightOutputWaveShaperNode.connect(rightInputForRightOutputGainNode.gain);\n leftInputForLeftOutputGainNode.connect(channelMergerNode, 0, 0);\n rightInputForLeftOutputGainNode.connect(channelMergerNode, 0, 0);\n leftInputForRightOutputGainNode.connect(channelMergerNode, 0, 1);\n rightInputForRightOutputGainNode.connect(channelMergerNode, 0, 1);\n },\n disconnectGraph() {\n inputGainNode.disconnect(channelSplitterNode);\n inputGainNode.disconnect(panWaveShaperNode.inputs === undefined ? panWaveShaperNode : panWaveShaperNode.inputs[0]);\n channelSplitterNode.disconnect(leftInputForLeftOutputGainNode, 0);\n channelSplitterNode.disconnect(leftInputForRightOutputGainNode, 0);\n channelSplitterNode.disconnect(rightInputForLeftOutputGainNode, 1);\n channelSplitterNode.disconnect(rightInputForRightOutputGainNode, 1);\n panWaveShaperNode.disconnect(panGainNode);\n panGainNode.disconnect(leftInputForLeftOutputWaveShaperNode.inputs === undefined\n ? leftInputForLeftOutputWaveShaperNode\n : leftInputForLeftOutputWaveShaperNode.inputs[0]);\n panGainNode.disconnect(leftInputForRightOutputWaveShaperNode.inputs === undefined\n ? leftInputForRightOutputWaveShaperNode\n : leftInputForRightOutputWaveShaperNode.inputs[0]);\n panGainNode.disconnect(rightInputForLeftOutputWaveShaperNode.inputs === undefined\n ? rightInputForLeftOutputWaveShaperNode\n : rightInputForLeftOutputWaveShaperNode.inputs[0]);\n panGainNode.disconnect(rightInputForRightOutputWaveShaperNode.inputs === undefined\n ? rightInputForRightOutputWaveShaperNode\n : rightInputForRightOutputWaveShaperNode.inputs[0]);\n leftInputForLeftOutputWaveShaperNode.disconnect(leftInputForLeftOutputGainNode.gain);\n leftInputForRightOutputWaveShaperNode.disconnect(leftInputForRightOutputGainNode.gain);\n rightInputForLeftOutputWaveShaperNode.disconnect(rightInputForLeftOutputGainNode.gain);\n rightInputForRightOutputWaveShaperNode.disconnect(rightInputForRightOutputGainNode.gain);\n leftInputForLeftOutputGainNode.disconnect(channelMergerNode, 0, 0);\n rightInputForLeftOutputGainNode.disconnect(channelMergerNode, 0, 0);\n leftInputForRightOutputGainNode.disconnect(channelMergerNode, 0, 1);\n rightInputForRightOutputGainNode.disconnect(channelMergerNode, 0, 1);\n }\n };\n };\n const buildInternalGraph = (nativeContext, channelCount, inputGainNode, panGainNode, channelMergerNode) => {\n if (channelCount === 1) {\n return buildInternalGraphForMono(nativeContext, inputGainNode, panGainNode, channelMergerNode);\n }\n if (channelCount === 2) {\n return buildInternalGraphForStereo(nativeContext, inputGainNode, panGainNode, channelMergerNode);\n }\n throw createNotSupportedError();\n };\n return (nativeContext, { channelCount, channelCountMode, pan, ...audioNodeOptions }) => {\n if (channelCountMode === 'max') {\n throw createNotSupportedError();\n }\n const channelMergerNode = createNativeChannelMergerNode(nativeContext, {\n ...audioNodeOptions,\n channelCount: 1,\n channelCountMode,\n numberOfInputs: 2\n });\n const inputGainNode = createNativeGainNode(nativeContext, { ...audioNodeOptions, channelCount, channelCountMode, gain: 1 });\n const panGainNode = createNativeGainNode(nativeContext, {\n channelCount: 1,\n channelCountMode: 'explicit',\n channelInterpretation: 'discrete',\n gain: pan\n });\n let { connectGraph, disconnectGraph } = buildInternalGraph(nativeContext, channelCount, inputGainNode, panGainNode, channelMergerNode);\n Object.defineProperty(panGainNode.gain, 'defaultValue', { get: () => 0 });\n Object.defineProperty(panGainNode.gain, 'maxValue', { get: () => 1 });\n Object.defineProperty(panGainNode.gain, 'minValue', { get: () => -1 });\n const nativeStereoPannerNodeFakerFactory = {\n get bufferSize() {\n return undefined;\n },\n get channelCount() {\n return inputGainNode.channelCount;\n },\n set channelCount(value) {\n if (inputGainNode.channelCount !== value) {\n if (isConnected) {\n disconnectGraph();\n }\n ({ connectGraph, disconnectGraph } = buildInternalGraph(nativeContext, value, inputGainNode, panGainNode, channelMergerNode));\n if (isConnected) {\n connectGraph();\n }\n }\n inputGainNode.channelCount = value;\n },\n get channelCountMode() {\n return inputGainNode.channelCountMode;\n },\n set channelCountMode(value) {\n if (value === 'clamped-max' || value === 'max') {\n throw createNotSupportedError();\n }\n inputGainNode.channelCountMode = value;\n },\n get channelInterpretation() {\n return inputGainNode.channelInterpretation;\n },\n set channelInterpretation(value) {\n inputGainNode.channelInterpretation = value;\n },\n get context() {\n return inputGainNode.context;\n },\n get inputs() {\n return [inputGainNode];\n },\n get numberOfInputs() {\n return inputGainNode.numberOfInputs;\n },\n get numberOfOutputs() {\n return inputGainNode.numberOfOutputs;\n },\n get pan() {\n return panGainNode.gain;\n },\n addEventListener(...args) {\n return inputGainNode.addEventListener(args[0], args[1], args[2]);\n },\n dispatchEvent(...args) {\n return inputGainNode.dispatchEvent(args[0]);\n },\n removeEventListener(...args) {\n return inputGainNode.removeEventListener(args[0], args[1], args[2]);\n }\n };\n let isConnected = false;\n const whenConnected = () => {\n connectGraph();\n isConnected = true;\n };\n const whenDisconnected = () => {\n disconnectGraph();\n isConnected = false;\n };\n return monitorConnections(interceptConnections(nativeStereoPannerNodeFakerFactory, channelMergerNode), whenConnected, whenDisconnected);\n };\n};\n//# sourceMappingURL=native-stereo-panner-node-faker-factory.js.map","import { isNativeAudioNodeFaker } from '../guards/native-audio-node-faker';\nimport { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createStereoPannerNodeRendererFactory = (connectAudioParam, createNativeStereoPannerNode, getNativeAudioNode, renderAutomation, renderInputsOfAudioNode) => {\n return () => {\n const renderedNativeStereoPannerNodes = new WeakMap();\n const createStereoPannerNode = async (proxy, nativeOfflineAudioContext, trace) => {\n let nativeStereoPannerNode = getNativeAudioNode(proxy);\n /*\n * If the initially used nativeStereoPannerNode was not constructed on the same OfflineAudioContext it needs to be created\n * again.\n */\n const nativeStereoPannerNodeIsOwnedByContext = isOwnedByContext(nativeStereoPannerNode, nativeOfflineAudioContext);\n if (!nativeStereoPannerNodeIsOwnedByContext) {\n const options = {\n channelCount: nativeStereoPannerNode.channelCount,\n channelCountMode: nativeStereoPannerNode.channelCountMode,\n channelInterpretation: nativeStereoPannerNode.channelInterpretation,\n pan: nativeStereoPannerNode.pan.value\n };\n nativeStereoPannerNode = createNativeStereoPannerNode(nativeOfflineAudioContext, options);\n }\n renderedNativeStereoPannerNodes.set(nativeOfflineAudioContext, nativeStereoPannerNode);\n if (!nativeStereoPannerNodeIsOwnedByContext) {\n await renderAutomation(nativeOfflineAudioContext, proxy.pan, nativeStereoPannerNode.pan, trace);\n }\n else {\n await connectAudioParam(nativeOfflineAudioContext, proxy.pan, nativeStereoPannerNode.pan, trace);\n }\n if (isNativeAudioNodeFaker(nativeStereoPannerNode)) {\n await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeStereoPannerNode.inputs[0], trace);\n }\n else {\n await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeStereoPannerNode, trace);\n }\n return nativeStereoPannerNode;\n };\n return {\n render(proxy, nativeOfflineAudioContext, trace) {\n const renderedNativeStereoPannerNode = renderedNativeStereoPannerNodes.get(nativeOfflineAudioContext);\n if (renderedNativeStereoPannerNode !== undefined) {\n return Promise.resolve(renderedNativeStereoPannerNode);\n }\n return createStereoPannerNode(proxy, nativeOfflineAudioContext, trace);\n }\n };\n };\n};\n//# sourceMappingURL=stereo-panner-node-renderer-factory.js.map","import { isNativeAudioNodeFaker } from '../guards/native-audio-node-faker';\nimport { isOwnedByContext } from '../helpers/is-owned-by-context';\nexport const createWaveShaperNodeRendererFactory = (createNativeWaveShaperNode, getNativeAudioNode, renderInputsOfAudioNode) => {\n return () => {\n const renderedNativeWaveShaperNodes = new WeakMap();\n const createWaveShaperNode = async (proxy, nativeOfflineAudioContext, trace) => {\n let nativeWaveShaperNode = getNativeAudioNode(proxy);\n // If the initially used nativeWaveShaperNode was not constructed on the same OfflineAudioContext it needs to be created again.\n const nativeWaveShaperNodeIsOwnedByContext = isOwnedByContext(nativeWaveShaperNode, nativeOfflineAudioContext);\n if (!nativeWaveShaperNodeIsOwnedByContext) {\n const options = {\n channelCount: nativeWaveShaperNode.channelCount,\n channelCountMode: nativeWaveShaperNode.channelCountMode,\n channelInterpretation: nativeWaveShaperNode.channelInterpretation,\n curve: nativeWaveShaperNode.curve,\n oversample: nativeWaveShaperNode.oversample\n };\n nativeWaveShaperNode = createNativeWaveShaperNode(nativeOfflineAudioContext, options);\n }\n renderedNativeWaveShaperNodes.set(nativeOfflineAudioContext, nativeWaveShaperNode);\n if (isNativeAudioNodeFaker(nativeWaveShaperNode)) {\n await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeWaveShaperNode.inputs[0], trace);\n }\n else {\n await renderInputsOfAudioNode(proxy, nativeOfflineAudioContext, nativeWaveShaperNode, trace);\n }\n return nativeWaveShaperNode;\n };\n return {\n render(proxy, nativeOfflineAudioContext, trace) {\n const renderedNativeWaveShaperNode = renderedNativeWaveShaperNodes.get(nativeOfflineAudioContext);\n if (renderedNativeWaveShaperNode !== undefined) {\n return Promise.resolve(renderedNativeWaveShaperNode);\n }\n return createWaveShaperNode(proxy, nativeOfflineAudioContext, trace);\n }\n };\n };\n};\n//# sourceMappingURL=wave-shaper-node-renderer-factory.js.map","export const createIsSecureContext = (window) => window !== null && window.isSecureContext;\n//# sourceMappingURL=is-secure-context.js.map","export const createExposeCurrentFrameAndCurrentTime = (window) => {\n return (currentTime, sampleRate, fn) => {\n Object.defineProperties(window, {\n currentFrame: {\n configurable: true,\n get() {\n return Math.round(currentTime * sampleRate);\n }\n },\n currentTime: {\n configurable: true,\n get() {\n return currentTime;\n }\n }\n });\n try {\n return fn();\n }\n finally {\n if (window !== null) {\n delete window.currentFrame;\n delete window.currentTime;\n }\n }\n };\n};\n//# sourceMappingURL=expose-current-frame-and-current-time.js.map","export const createGetOrCreateBackupOfflineAudioContext = (backupOfflineAudioContextStore, nativeOfflineAudioContextConstructor) => {\n return (nativeContext) => {\n let backupOfflineAudioContext = backupOfflineAudioContextStore.get(nativeContext);\n if (backupOfflineAudioContext !== undefined) {\n return backupOfflineAudioContext;\n }\n if (nativeOfflineAudioContextConstructor === null) {\n throw new Error('Missing the native OfflineAudioContext constructor.');\n }\n backupOfflineAudioContext = new nativeOfflineAudioContextConstructor(1, 1, 8000);\n backupOfflineAudioContextStore.set(nativeContext, backupOfflineAudioContext);\n return backupOfflineAudioContext;\n };\n};\n//# sourceMappingURL=get-or-create-backup-offline-audio-context.js.map","export const createNativeAudioWorkletNodeConstructor = (window) => {\n if (window === null) {\n return null;\n }\n return window.hasOwnProperty('AudioWorkletNode') ? window.AudioWorkletNode : null;\n};\n//# sourceMappingURL=native-audio-worklet-node-constructor.js.map","export const createEvaluateSource = (window) => {\n return (source) => new Promise((resolve, reject) => {\n if (window === null) {\n // Bug #182 Chrome, Edge and Opera do throw an instance of a SyntaxError instead of a DOMException.\n reject(new SyntaxError());\n return;\n }\n const head = window.document.head;\n if (head === null) {\n // Bug #182 Chrome, Edge and Opera do throw an instance of a SyntaxError instead of a DOMException.\n reject(new SyntaxError());\n }\n else {\n const script = window.document.createElement('script');\n // @todo Safari doesn't like URLs with a type of 'application/javascript; charset=utf-8'.\n const blob = new Blob([source], { type: 'application/javascript' });\n const url = URL.createObjectURL(blob);\n const originalOnErrorHandler = window.onerror;\n const removeErrorEventListenerAndRevokeUrl = () => {\n window.onerror = originalOnErrorHandler;\n URL.revokeObjectURL(url);\n };\n window.onerror = (message, src, lineno, colno, error) => {\n // @todo Edge thinks the source is the one of the html document.\n if (src === url || (src === window.location.href && lineno === 1 && colno === 1)) {\n removeErrorEventListenerAndRevokeUrl();\n reject(error);\n return false;\n }\n if (originalOnErrorHandler !== null) {\n return originalOnErrorHandler(message, src, lineno, colno, error);\n }\n };\n script.onerror = () => {\n removeErrorEventListenerAndRevokeUrl();\n // Bug #182 Chrome, Edge and Opera do throw an instance of a SyntaxError instead of a DOMException.\n reject(new SyntaxError());\n };\n script.onload = () => {\n removeErrorEventListenerAndRevokeUrl();\n resolve();\n };\n script.src = url;\n script.type = 'module';\n head.appendChild(script);\n }\n });\n};\n//# sourceMappingURL=evaluate-source.js.map","export const createFetchSource = (createAbortError) => {\n return async (url) => {\n try {\n const response = await fetch(url);\n if (response.ok) {\n return [await response.text(), response.url];\n }\n }\n catch {\n // Ignore errors.\n } // tslint:disable-line:no-empty\n throw createAbortError();\n };\n};\n//# sourceMappingURL=fetch-source.js.map","// Bug #179: Firefox does not allow to transfer any buffer which has been passed to the process() method as an argument.\nexport const createTestAudioWorkletProcessorPostMessageSupport = (nativeAudioWorkletNodeConstructor, nativeOfflineAudioContextConstructor) => {\n return async () => {\n // Bug #61: If there is no native AudioWorkletNode it gets faked and therefore it is no problem if the it doesn't exist.\n if (nativeAudioWorkletNodeConstructor === null) {\n return true;\n }\n if (nativeOfflineAudioContextConstructor === null) {\n return false;\n }\n const blob = new Blob(['class A extends AudioWorkletProcessor{process(i){this.port.postMessage(i,[i[0][0].buffer])}}registerProcessor(\"a\",A)'], {\n type: 'application/javascript; charset=utf-8'\n });\n const offlineAudioContext = new nativeOfflineAudioContextConstructor(1, 128, 8000);\n const url = URL.createObjectURL(blob);\n let isEmittingMessageEvents = false;\n let isEmittingProcessorErrorEvents = false;\n try {\n await offlineAudioContext.audioWorklet.addModule(url);\n const audioWorkletNode = new nativeAudioWorkletNodeConstructor(offlineAudioContext, 'a', { numberOfOutputs: 0 });\n const oscillator = offlineAudioContext.createOscillator();\n audioWorkletNode.port.onmessage = () => (isEmittingMessageEvents = true);\n audioWorkletNode.onprocessorerror = () => (isEmittingProcessorErrorEvents = true);\n oscillator.connect(audioWorkletNode);\n await offlineAudioContext.startRendering();\n }\n catch {\n // Ignore errors.\n }\n finally {\n URL.revokeObjectURL(url);\n }\n return isEmittingMessageEvents && !isEmittingProcessorErrorEvents;\n };\n};\n//# sourceMappingURL=test-audio-worklet-processor-post-message-support.js.map","export const createIsNativeContext = (isNativeAudioContext, isNativeOfflineAudioContext) => {\n return (anything) => {\n return isNativeAudioContext(anything) || isNativeOfflineAudioContext(anything);\n };\n};\n//# sourceMappingURL=is-native-context.js.map","import { detachArrayBuffer } from '../helpers/detach-array-buffer';\nimport { wrapAudioBufferGetChannelDataMethod } from '../helpers/wrap-audio-buffer-get-channel-data-method';\nexport const createDecodeAudioData = (audioBufferStore, cacheTestResult, createDataCloneError, createEncodingError, detachedArrayBuffers, getNativeContext, isNativeContext, testAudioBufferCopyChannelMethodsOutOfBoundsSupport, testPromiseSupport, wrapAudioBufferCopyChannelMethods, wrapAudioBufferCopyChannelMethodsOutOfBounds) => {\n return (anyContext, audioData) => {\n const nativeContext = isNativeContext(anyContext) ? anyContext : getNativeContext(anyContext);\n // Bug #43: Only Chrome, Edge and Opera do throw a DataCloneError.\n if (detachedArrayBuffers.has(audioData)) {\n const err = createDataCloneError();\n return Promise.reject(err);\n }\n // The audioData parameter maybe of a type which can't be added to a WeakSet.\n try {\n detachedArrayBuffers.add(audioData);\n }\n catch {\n // Ignore errors.\n }\n // Bug #21: Safari does not support promises yet.\n if (cacheTestResult(testPromiseSupport, () => testPromiseSupport(nativeContext))) {\n return nativeContext.decodeAudioData(audioData).then((audioBuffer) => {\n // Bug #157: Firefox does not allow the bufferOffset to be out-of-bounds.\n if (!cacheTestResult(testAudioBufferCopyChannelMethodsOutOfBoundsSupport, () => testAudioBufferCopyChannelMethodsOutOfBoundsSupport(audioBuffer))) {\n wrapAudioBufferCopyChannelMethodsOutOfBounds(audioBuffer);\n }\n audioBufferStore.add(audioBuffer);\n return audioBuffer;\n });\n }\n // Bug #21: Safari does not return a Promise yet.\n return new Promise((resolve, reject) => {\n const complete = () => {\n // Bug #133: Safari does neuter the ArrayBuffer.\n try {\n detachArrayBuffer(audioData);\n }\n catch {\n // Ignore errors.\n }\n };\n const fail = (err) => {\n reject(err);\n complete();\n };\n // Bug #26: Safari throws a synchronous error.\n try {\n // Bug #1: Safari requires a successCallback.\n nativeContext.decodeAudioData(audioData, (audioBuffer) => {\n // Bug #5: Safari does not support copyFromChannel() and copyToChannel().\n // Bug #100: Safari does throw a wrong error when calling getChannelData() with an out-of-bounds value.\n if (typeof audioBuffer.copyFromChannel !== 'function') {\n wrapAudioBufferCopyChannelMethods(audioBuffer);\n wrapAudioBufferGetChannelDataMethod(audioBuffer);\n }\n audioBufferStore.add(audioBuffer);\n complete();\n resolve(audioBuffer);\n }, (err) => {\n // Bug #4: Safari returns null instead of an error.\n if (err === null) {\n fail(createEncodingError());\n }\n else {\n fail(err);\n }\n });\n }\n catch (err) {\n fail(err);\n }\n });\n };\n};\n//# sourceMappingURL=decode-audio-data.js.map","export const detachArrayBuffer = (arrayBuffer) => {\n const { port1 } = new MessageChannel();\n port1.postMessage(arrayBuffer, [arrayBuffer]);\n};\n//# sourceMappingURL=detach-array-buffer.js.map","export const createDataCloneError = () => new DOMException('', 'DataCloneError');\n//# sourceMappingURL=data-clone-error.js.map","export const createEncodingError = () => new DOMException('', 'EncodingError');\n//# sourceMappingURL=encoding-error.js.map","export const createBaseAudioContextConstructor = (addAudioWorkletModule, analyserNodeConstructor, audioBufferConstructor, audioBufferSourceNodeConstructor, biquadFilterNodeConstructor, channelMergerNodeConstructor, channelSplitterNodeConstructor, constantSourceNodeConstructor, convolverNodeConstructor, decodeAudioData, delayNodeConstructor, dynamicsCompressorNodeConstructor, gainNodeConstructor, iIRFilterNodeConstructor, minimalBaseAudioContextConstructor, oscillatorNodeConstructor, pannerNodeConstructor, periodicWaveConstructor, stereoPannerNodeConstructor, waveShaperNodeConstructor) => {\n return class BaseAudioContext extends minimalBaseAudioContextConstructor {\n constructor(_nativeContext, numberOfChannels) {\n super(_nativeContext, numberOfChannels);\n this._nativeContext = _nativeContext;\n this._audioWorklet =\n addAudioWorkletModule === undefined\n ? undefined\n : {\n addModule: (moduleURL, options) => {\n return addAudioWorkletModule(this, moduleURL, options);\n }\n };\n }\n get audioWorklet() {\n return this._audioWorklet;\n }\n createAnalyser() {\n return new analyserNodeConstructor(this);\n }\n createBiquadFilter() {\n return new biquadFilterNodeConstructor(this);\n }\n createBuffer(numberOfChannels, length, sampleRate) {\n return new audioBufferConstructor({ length, numberOfChannels, sampleRate });\n }\n createBufferSource() {\n return new audioBufferSourceNodeConstructor(this);\n }\n createChannelMerger(numberOfInputs = 6) {\n return new channelMergerNodeConstructor(this, { numberOfInputs });\n }\n createChannelSplitter(numberOfOutputs = 6) {\n return new channelSplitterNodeConstructor(this, { numberOfOutputs });\n }\n createConstantSource() {\n return new constantSourceNodeConstructor(this);\n }\n createConvolver() {\n return new convolverNodeConstructor(this);\n }\n createDelay(maxDelayTime = 1) {\n return new delayNodeConstructor(this, { maxDelayTime });\n }\n createDynamicsCompressor() {\n return new dynamicsCompressorNodeConstructor(this);\n }\n createGain() {\n return new gainNodeConstructor(this);\n }\n createIIRFilter(feedforward, feedback) {\n return new iIRFilterNodeConstructor(this, { feedback, feedforward });\n }\n createOscillator() {\n return new oscillatorNodeConstructor(this);\n }\n createPanner() {\n return new pannerNodeConstructor(this);\n }\n createPeriodicWave(real, imag, constraints = { disableNormalization: false }) {\n return new periodicWaveConstructor(this, { ...constraints, imag, real });\n }\n createStereoPanner() {\n return new stereoPannerNodeConstructor(this);\n }\n createWaveShaper() {\n return new waveShaperNodeConstructor(this);\n }\n decodeAudioData(audioData, successCallback, errorCallback) {\n return decodeAudioData(this._nativeContext, audioData)\n .then((audioBuffer) => {\n if (typeof successCallback === 'function') {\n successCallback(audioBuffer);\n }\n return audioBuffer;\n })\n .catch((err) => {\n if (typeof errorCallback === 'function') {\n errorCallback(err);\n }\n throw err;\n });\n }\n };\n};\n//# sourceMappingURL=base-audio-context-constructor.js.map","export const createMediaElementAudioSourceNodeConstructor = (audioNodeConstructor, createNativeMediaElementAudioSourceNode, getNativeContext, isNativeOfflineAudioContext) => {\n return class MediaElementAudioSourceNode extends audioNodeConstructor {\n constructor(context, options) {\n const nativeContext = getNativeContext(context);\n const nativeMediaElementAudioSourceNode = createNativeMediaElementAudioSourceNode(nativeContext, options);\n // Bug #171: Safari allows to create a MediaElementAudioSourceNode with an OfflineAudioContext.\n if (isNativeOfflineAudioContext(nativeContext)) {\n throw TypeError();\n }\n super(context, true, nativeMediaElementAudioSourceNode, null);\n this._nativeMediaElementAudioSourceNode = nativeMediaElementAudioSourceNode;\n }\n get mediaElement() {\n return this._nativeMediaElementAudioSourceNode.mediaElement;\n }\n };\n};\n//# sourceMappingURL=media-element-audio-source-node-constructor.js.map","export const createNativeMediaElementAudioSourceNode = (nativeAudioContext, options) => {\n return nativeAudioContext.createMediaElementSource(options.mediaElement);\n};\n//# sourceMappingURL=native-media-element-audio-source-node.js.map","import { assignNativeAudioNodeOptions } from '../helpers/assign-native-audio-node-options';\nexport const createNativeMediaStreamAudioDestinationNode = (nativeAudioContext, options) => {\n const nativeMediaStreamAudioDestinationNode = nativeAudioContext.createMediaStreamDestination();\n assignNativeAudioNodeOptions(nativeMediaStreamAudioDestinationNode, options);\n // Bug #174: Safari does expose a wrong numberOfOutputs.\n if (nativeMediaStreamAudioDestinationNode.numberOfOutputs === 1) {\n Object.defineProperty(nativeMediaStreamAudioDestinationNode, 'numberOfOutputs', { get: () => 0 });\n }\n return nativeMediaStreamAudioDestinationNode;\n};\n//# sourceMappingURL=native-media-stream-audio-destination-node.js.map","export const createMediaStreamAudioSourceNodeConstructor = (audioNodeConstructor, createNativeMediaStreamAudioSourceNode, getNativeContext, isNativeOfflineAudioContext) => {\n return class MediaStreamAudioSourceNode extends audioNodeConstructor {\n constructor(context, options) {\n const nativeContext = getNativeContext(context);\n const nativeMediaStreamAudioSourceNode = createNativeMediaStreamAudioSourceNode(nativeContext, options);\n // Bug #172: Safari allows to create a MediaStreamAudioSourceNode with an OfflineAudioContext.\n if (isNativeOfflineAudioContext(nativeContext)) {\n throw new TypeError();\n }\n super(context, true, nativeMediaStreamAudioSourceNode, null);\n this._nativeMediaStreamAudioSourceNode = nativeMediaStreamAudioSourceNode;\n }\n get mediaStream() {\n return this._nativeMediaStreamAudioSourceNode.mediaStream;\n }\n };\n};\n//# sourceMappingURL=media-stream-audio-source-node-constructor.js.map","export const createNativeMediaStreamAudioSourceNode = (nativeAudioContext, { mediaStream }) => {\n const audioStreamTracks = mediaStream.getAudioTracks();\n /*\n * Bug #151: Safari does not use the audio track as input anymore if it gets removed from the mediaStream after construction.\n * Bug #159: Safari picks the first audio track if the MediaStream has more than one audio track.\n */\n audioStreamTracks.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));\n const filteredAudioStreamTracks = audioStreamTracks.slice(0, 1);\n const nativeMediaStreamAudioSourceNode = nativeAudioContext.createMediaStreamSource(new MediaStream(filteredAudioStreamTracks));\n /*\n * Bug #151 & #159: The given mediaStream gets reconstructed before it gets passed to the native node which is why the accessor needs\n * to be overwritten as it would otherwise expose the reconstructed version.\n */\n Object.defineProperty(nativeMediaStreamAudioSourceNode, 'mediaStream', { value: mediaStream });\n return nativeMediaStreamAudioSourceNode;\n};\n//# sourceMappingURL=native-media-stream-audio-source-node.js.map","export const createMediaStreamTrackAudioSourceNodeConstructor = (audioNodeConstructor, createNativeMediaStreamTrackAudioSourceNode, getNativeContext) => {\n return class MediaStreamTrackAudioSourceNode extends audioNodeConstructor {\n constructor(context, options) {\n const nativeContext = getNativeContext(context);\n const nativeMediaStreamTrackAudioSourceNode = createNativeMediaStreamTrackAudioSourceNode(nativeContext, options);\n super(context, true, nativeMediaStreamTrackAudioSourceNode, null);\n }\n };\n};\n//# sourceMappingURL=media-stream-track-audio-source-node-constructor.js.map","export const createNativeMediaStreamTrackAudioSourceNodeFactory = (createInvalidStateError, isNativeOfflineAudioContext) => {\n return (nativeAudioContext, { mediaStreamTrack }) => {\n // Bug #121: Only Firefox does yet support the MediaStreamTrackAudioSourceNode.\n if (typeof nativeAudioContext.createMediaStreamTrackSource === 'function') {\n return nativeAudioContext.createMediaStreamTrackSource(mediaStreamTrack);\n }\n const mediaStream = new MediaStream([mediaStreamTrack]);\n const nativeMediaStreamAudioSourceNode = nativeAudioContext.createMediaStreamSource(mediaStream);\n // Bug #120: Firefox does not throw an error if the mediaStream has no audio track.\n if (mediaStreamTrack.kind !== 'audio') {\n throw createInvalidStateError();\n }\n // Bug #172: Safari allows to create a MediaStreamAudioSourceNode with an OfflineAudioContext.\n if (isNativeOfflineAudioContext(nativeAudioContext)) {\n throw new TypeError();\n }\n return nativeMediaStreamAudioSourceNode;\n };\n};\n//# sourceMappingURL=native-media-stream-track-audio-source-node-factory.js.map","import { deactivateAudioGraph } from '../helpers/deactivate-audio-graph';\nimport { isValidLatencyHint } from '../helpers/is-valid-latency-hint';\nexport const createAudioContextConstructor = (baseAudioContextConstructor, createInvalidStateError, createNotSupportedError, createUnknownError, mediaElementAudioSourceNodeConstructor, mediaStreamAudioDestinationNodeConstructor, mediaStreamAudioSourceNodeConstructor, mediaStreamTrackAudioSourceNodeConstructor, nativeAudioContextConstructor) => {\n return class AudioContext extends baseAudioContextConstructor {\n constructor(options = {}) {\n if (nativeAudioContextConstructor === null) {\n throw new Error('Missing the native AudioContext constructor.');\n }\n const nativeAudioContext = new nativeAudioContextConstructor(options);\n // Bug #131 Safari returns null when there are four other AudioContexts running already.\n if (nativeAudioContext === null) {\n throw createUnknownError();\n }\n // Bug #51 Only Chrome, Edge and Opera throw an error if the given latencyHint is invalid.\n if (!isValidLatencyHint(options.latencyHint)) {\n throw new TypeError(`The provided value '${options.latencyHint}' is not a valid enum value of type AudioContextLatencyCategory.`);\n }\n // Bug #150 Safari does not support setting the sampleRate.\n if (options.sampleRate !== undefined && nativeAudioContext.sampleRate !== options.sampleRate) {\n throw createNotSupportedError();\n }\n super(nativeAudioContext, 2);\n const { latencyHint } = options;\n const { sampleRate } = nativeAudioContext;\n // @todo The values for 'balanced', 'interactive' and 'playback' are just copied from Chrome's implementation.\n this._baseLatency =\n typeof nativeAudioContext.baseLatency === 'number'\n ? nativeAudioContext.baseLatency\n : latencyHint === 'balanced'\n ? 512 / sampleRate\n : latencyHint === 'interactive' || latencyHint === undefined\n ? 256 / sampleRate\n : latencyHint === 'playback'\n ? 1024 / sampleRate\n : /*\n * @todo The min (256) and max (16384) values are taken from the allowed bufferSize values of a\n * ScriptProcessorNode.\n */\n (Math.max(2, Math.min(128, Math.round((latencyHint * sampleRate) / 128))) * 128) / sampleRate;\n this._nativeAudioContext = nativeAudioContext;\n // Bug #188: Safari will set the context's state to 'interrupted' in case the user switches tabs.\n if (nativeAudioContextConstructor.name === 'webkitAudioContext') {\n this._nativeGainNode = nativeAudioContext.createGain();\n this._nativeOscillatorNode = nativeAudioContext.createOscillator();\n this._nativeGainNode.gain.value = 1e-37;\n this._nativeOscillatorNode.connect(this._nativeGainNode).connect(nativeAudioContext.destination);\n this._nativeOscillatorNode.start();\n }\n else {\n this._nativeGainNode = null;\n this._nativeOscillatorNode = null;\n }\n this._state = null;\n /*\n * Bug #34: Chrome, Edge and Opera pretend to be running right away, but fire an onstatechange event when the state actually\n * changes to 'running'.\n */\n if (nativeAudioContext.state === 'running') {\n this._state = 'suspended';\n const revokeState = () => {\n if (this._state === 'suspended') {\n this._state = null;\n }\n nativeAudioContext.removeEventListener('statechange', revokeState);\n };\n nativeAudioContext.addEventListener('statechange', revokeState);\n }\n }\n get baseLatency() {\n return this._baseLatency;\n }\n get state() {\n return this._state !== null ? this._state : this._nativeAudioContext.state;\n }\n close() {\n // Bug #35: Firefox does not throw an error if the AudioContext was closed before.\n if (this.state === 'closed') {\n return this._nativeAudioContext.close().then(() => {\n throw createInvalidStateError();\n });\n }\n // Bug #34: If the state was set to suspended before it should be revoked now.\n if (this._state === 'suspended') {\n this._state = null;\n }\n return this._nativeAudioContext.close().then(() => {\n if (this._nativeGainNode !== null && this._nativeOscillatorNode !== null) {\n this._nativeOscillatorNode.stop();\n this._nativeGainNode.disconnect();\n this._nativeOscillatorNode.disconnect();\n }\n deactivateAudioGraph(this);\n });\n }\n createMediaElementSource(mediaElement) {\n return new mediaElementAudioSourceNodeConstructor(this, { mediaElement });\n }\n createMediaStreamDestination() {\n return new mediaStreamAudioDestinationNodeConstructor(this);\n }\n createMediaStreamSource(mediaStream) {\n return new mediaStreamAudioSourceNodeConstructor(this, { mediaStream });\n }\n createMediaStreamTrackSource(mediaStreamTrack) {\n return new mediaStreamTrackAudioSourceNodeConstructor(this, { mediaStreamTrack });\n }\n resume() {\n if (this._state === 'suspended') {\n return new Promise((resolve, reject) => {\n const resolvePromise = () => {\n this._nativeAudioContext.removeEventListener('statechange', resolvePromise);\n if (this._nativeAudioContext.state === 'running') {\n resolve();\n }\n else {\n this.resume().then(resolve, reject);\n }\n };\n this._nativeAudioContext.addEventListener('statechange', resolvePromise);\n });\n }\n return this._nativeAudioContext.resume().catch((err) => {\n // Bug #55: Chrome, Edge and Opera do throw an InvalidAccessError instead of an InvalidStateError.\n // Bug #56: Safari invokes the catch handler but without an error.\n if (err === undefined || err.code === 15) {\n throw createInvalidStateError();\n }\n throw err;\n });\n }\n suspend() {\n return this._nativeAudioContext.suspend().catch((err) => {\n // Bug #56: Safari invokes the catch handler but without an error.\n if (err === undefined) {\n throw createInvalidStateError();\n }\n throw err;\n });\n }\n };\n};\n//# sourceMappingURL=audio-context-constructor.js.map","export const createGetUnrenderedAudioWorkletNodes = (unrenderedAudioWorkletNodeStore) => {\n return (nativeContext) => {\n const unrenderedAudioWorkletNodes = unrenderedAudioWorkletNodeStore.get(nativeContext);\n if (unrenderedAudioWorkletNodes === undefined) {\n throw new Error('The context has no set of AudioWorkletNodes.');\n }\n return unrenderedAudioWorkletNodes;\n };\n};\n//# sourceMappingURL=get-unrendered-audio-worklet-nodes.js.map","export const createAddUnrenderedAudioWorkletNode = (getUnrenderedAudioWorkletNodes) => {\n return (nativeContext, audioWorkletNode) => {\n getUnrenderedAudioWorkletNodes(nativeContext).add(audioWorkletNode);\n };\n};\n//# sourceMappingURL=add-unrendered-audio-worklet-node.js.map","import { isNativeAudioNode } from '../guards/native-audio-node';\nexport const createConnectMultipleOutputs = (createIndexSizeError) => {\n return (outputAudioNodes, destination, output = 0, input = 0) => {\n const outputAudioNode = outputAudioNodes[output];\n if (outputAudioNode === undefined) {\n throw createIndexSizeError();\n }\n if (isNativeAudioNode(destination)) {\n return outputAudioNode.connect(destination, 0, input);\n }\n return outputAudioNode.connect(destination, 0);\n };\n};\n//# sourceMappingURL=connect-multiple-outputs.js.map","export const createDeleteUnrenderedAudioWorkletNode = (getUnrenderedAudioWorkletNodes) => {\n return (nativeContext, audioWorkletNode) => {\n getUnrenderedAudioWorkletNodes(nativeContext).delete(audioWorkletNode);\n };\n};\n//# sourceMappingURL=delete-unrendered-audio-worklet-node.js.map","export const createGetActiveAudioWorkletNodeInputs = (activeAudioWorkletNodeInputsStore, getValueForKey) => {\n return (nativeAudioWorkletNode) => getValueForKey(activeAudioWorkletNodeInputsStore, nativeAudioWorkletNode);\n};\n//# sourceMappingURL=get-active-audio-worklet-node-inputs.js.map","import { MOST_NEGATIVE_SINGLE_FLOAT, MOST_POSITIVE_SINGLE_FLOAT } from '../constants';\nimport { computeBufferSize } from '../helpers/compute-buffer-size';\nimport { copyFromChannel } from '../helpers/copy-from-channel';\nimport { copyToChannel } from '../helpers/copy-to-channel';\nimport { createAudioWorkletProcessor } from '../helpers/create-audio-worklet-processor';\nimport { createNestedArrays } from '../helpers/create-nested-arrays';\nimport { ReadOnlyMap } from '../read-only-map';\nexport const createNativeAudioWorkletNodeFakerFactory = (connectMultipleOutputs, createIndexSizeError, createInvalidStateError, createNativeChannelMergerNode, createNativeChannelSplitterNode, createNativeConstantSourceNode, createNativeGainNode, createNativeScriptProcessorNode, createNotSupportedError, disconnectMultipleOutputs, exposeCurrentFrameAndCurrentTime, getActiveAudioWorkletNodeInputs, monitorConnections) => {\n return (nativeContext, baseLatency, processorConstructor, options) => {\n if (options.numberOfInputs === 0 && options.numberOfOutputs === 0) {\n throw createNotSupportedError();\n }\n const outputChannelCount = Array.isArray(options.outputChannelCount)\n ? options.outputChannelCount\n : Array.from(options.outputChannelCount);\n // @todo Check if any of the channelCount values is greater than the implementation's maximum number of channels.\n if (outputChannelCount.some((channelCount) => channelCount < 1)) {\n throw createNotSupportedError();\n }\n if (outputChannelCount.length !== options.numberOfOutputs) {\n throw createIndexSizeError();\n }\n // Bug #61: This is not part of the standard but required for the faker to work.\n if (options.channelCountMode !== 'explicit') {\n throw createNotSupportedError();\n }\n const numberOfInputChannels = options.channelCount * options.numberOfInputs;\n const numberOfOutputChannels = outputChannelCount.reduce((sum, value) => sum + value, 0);\n const numberOfParameters = processorConstructor.parameterDescriptors === undefined ? 0 : processorConstructor.parameterDescriptors.length;\n // Bug #61: This is not part of the standard but required for the faker to work.\n if (numberOfInputChannels + numberOfParameters > 6 || numberOfOutputChannels > 6) {\n throw createNotSupportedError();\n }\n const messageChannel = new MessageChannel();\n const gainNodes = [];\n const inputChannelSplitterNodes = [];\n for (let i = 0; i < options.numberOfInputs; i += 1) {\n gainNodes.push(createNativeGainNode(nativeContext, {\n channelCount: options.channelCount,\n channelCountMode: options.channelCountMode,\n channelInterpretation: options.channelInterpretation,\n gain: 1\n }));\n inputChannelSplitterNodes.push(createNativeChannelSplitterNode(nativeContext, {\n channelCount: options.channelCount,\n channelCountMode: 'explicit',\n channelInterpretation: 'discrete',\n numberOfOutputs: options.channelCount\n }));\n }\n const constantSourceNodes = [];\n if (processorConstructor.parameterDescriptors !== undefined) {\n for (const { defaultValue, maxValue, minValue, name } of processorConstructor.parameterDescriptors) {\n const constantSourceNode = createNativeConstantSourceNode(nativeContext, {\n channelCount: 1,\n channelCountMode: 'explicit',\n channelInterpretation: 'discrete',\n offset: options.parameterData[name] !== undefined\n ? options.parameterData[name]\n : defaultValue === undefined\n ? 0\n : defaultValue\n });\n Object.defineProperties(constantSourceNode.offset, {\n defaultValue: {\n get: () => (defaultValue === undefined ? 0 : defaultValue)\n },\n maxValue: {\n get: () => (maxValue === undefined ? MOST_POSITIVE_SINGLE_FLOAT : maxValue)\n },\n minValue: {\n get: () => (minValue === undefined ? MOST_NEGATIVE_SINGLE_FLOAT : minValue)\n }\n });\n constantSourceNodes.push(constantSourceNode);\n }\n }\n const inputChannelMergerNode = createNativeChannelMergerNode(nativeContext, {\n channelCount: 1,\n channelCountMode: 'explicit',\n channelInterpretation: 'speakers',\n numberOfInputs: Math.max(1, numberOfInputChannels + numberOfParameters)\n });\n const bufferSize = computeBufferSize(baseLatency, nativeContext.sampleRate);\n const scriptProcessorNode = createNativeScriptProcessorNode(nativeContext, bufferSize, numberOfInputChannels + numberOfParameters, \n // Bug #87: Only Firefox will fire an AudioProcessingEvent if there is no connected output.\n Math.max(1, numberOfOutputChannels));\n const outputChannelSplitterNode = createNativeChannelSplitterNode(nativeContext, {\n channelCount: Math.max(1, numberOfOutputChannels),\n channelCountMode: 'explicit',\n channelInterpretation: 'discrete',\n numberOfOutputs: Math.max(1, numberOfOutputChannels)\n });\n const outputChannelMergerNodes = [];\n for (let i = 0; i < options.numberOfOutputs; i += 1) {\n outputChannelMergerNodes.push(createNativeChannelMergerNode(nativeContext, {\n channelCount: 1,\n channelCountMode: 'explicit',\n channelInterpretation: 'speakers',\n numberOfInputs: outputChannelCount[i]\n }));\n }\n for (let i = 0; i < options.numberOfInputs; i += 1) {\n gainNodes[i].connect(inputChannelSplitterNodes[i]);\n for (let j = 0; j < options.channelCount; j += 1) {\n inputChannelSplitterNodes[i].connect(inputChannelMergerNode, j, i * options.channelCount + j);\n }\n }\n const parameterMap = new ReadOnlyMap(processorConstructor.parameterDescriptors === undefined\n ? []\n : processorConstructor.parameterDescriptors.map(({ name }, index) => {\n const constantSourceNode = constantSourceNodes[index];\n constantSourceNode.connect(inputChannelMergerNode, 0, numberOfInputChannels + index);\n constantSourceNode.start(0);\n return [name, constantSourceNode.offset];\n }));\n inputChannelMergerNode.connect(scriptProcessorNode);\n let channelInterpretation = options.channelInterpretation;\n let onprocessorerror = null;\n // Bug #87: Expose at least one output to make this node connectable.\n const outputAudioNodes = options.numberOfOutputs === 0 ? [scriptProcessorNode] : outputChannelMergerNodes;\n const nativeAudioWorkletNodeFaker = {\n get bufferSize() {\n return bufferSize;\n },\n get channelCount() {\n return options.channelCount;\n },\n set channelCount(_) {\n // Bug #61: This is not part of the standard but required for the faker to work.\n throw createInvalidStateError();\n },\n get channelCountMode() {\n return options.channelCountMode;\n },\n set channelCountMode(_) {\n // Bug #61: This is not part of the standard but required for the faker to work.\n throw createInvalidStateError();\n },\n get channelInterpretation() {\n return channelInterpretation;\n },\n set channelInterpretation(value) {\n for (const gainNode of gainNodes) {\n gainNode.channelInterpretation = value;\n }\n channelInterpretation = value;\n },\n get context() {\n return scriptProcessorNode.context;\n },\n get inputs() {\n return gainNodes;\n },\n get numberOfInputs() {\n return options.numberOfInputs;\n },\n get numberOfOutputs() {\n return options.numberOfOutputs;\n },\n get onprocessorerror() {\n return onprocessorerror;\n },\n set onprocessorerror(value) {\n if (typeof onprocessorerror === 'function') {\n nativeAudioWorkletNodeFaker.removeEventListener('processorerror', onprocessorerror);\n }\n onprocessorerror = typeof value === 'function' ? value : null;\n if (typeof onprocessorerror === 'function') {\n nativeAudioWorkletNodeFaker.addEventListener('processorerror', onprocessorerror);\n }\n },\n get parameters() {\n return parameterMap;\n },\n get port() {\n return messageChannel.port2;\n },\n addEventListener(...args) {\n return scriptProcessorNode.addEventListener(args[0], args[1], args[2]);\n },\n connect: connectMultipleOutputs.bind(null, outputAudioNodes),\n disconnect: disconnectMultipleOutputs.bind(null, outputAudioNodes),\n dispatchEvent(...args) {\n return scriptProcessorNode.dispatchEvent(args[0]);\n },\n removeEventListener(...args) {\n return scriptProcessorNode.removeEventListener(args[0], args[1], args[2]);\n }\n };\n const patchedEventListeners = new Map();\n messageChannel.port1.addEventListener = ((addEventListener) => {\n return (...args) => {\n if (args[0] === 'message') {\n const unpatchedEventListener = typeof args[1] === 'function'\n ? args[1]\n : typeof args[1] === 'object' && args[1] !== null && typeof args[1].handleEvent === 'function'\n ? args[1].handleEvent\n : null;\n if (unpatchedEventListener !== null) {\n const patchedEventListener = patchedEventListeners.get(args[1]);\n if (patchedEventListener !== undefined) {\n args[1] = patchedEventListener;\n }\n else {\n args[1] = (event) => {\n exposeCurrentFrameAndCurrentTime(nativeContext.currentTime, nativeContext.sampleRate, () => unpatchedEventListener(event));\n };\n patchedEventListeners.set(unpatchedEventListener, args[1]);\n }\n }\n }\n return addEventListener.call(messageChannel.port1, args[0], args[1], args[2]);\n };\n })(messageChannel.port1.addEventListener);\n messageChannel.port1.removeEventListener = ((removeEventListener) => {\n return (...args) => {\n if (args[0] === 'message') {\n const patchedEventListener = patchedEventListeners.get(args[1]);\n if (patchedEventListener !== undefined) {\n patchedEventListeners.delete(args[1]);\n args[1] = patchedEventListener;\n }\n }\n return removeEventListener.call(messageChannel.port1, args[0], args[1], args[2]);\n };\n })(messageChannel.port1.removeEventListener);\n let onmessage = null;\n Object.defineProperty(messageChannel.port1, 'onmessage', {\n get: () => onmessage,\n set: (value) => {\n if (typeof onmessage === 'function') {\n messageChannel.port1.removeEventListener('message', onmessage);\n }\n onmessage = typeof value === 'function' ? value : null;\n if (typeof onmessage === 'function') {\n messageChannel.port1.addEventListener('message', onmessage);\n messageChannel.port1.start();\n }\n }\n });\n processorConstructor.prototype.port = messageChannel.port1;\n let audioWorkletProcessor = null;\n const audioWorkletProcessorPromise = createAudioWorkletProcessor(nativeContext, nativeAudioWorkletNodeFaker, processorConstructor, options);\n audioWorkletProcessorPromise.then((dWrkltPrcssr) => (audioWorkletProcessor = dWrkltPrcssr));\n const inputs = createNestedArrays(options.numberOfInputs, options.channelCount);\n const outputs = createNestedArrays(options.numberOfOutputs, outputChannelCount);\n const parameters = processorConstructor.parameterDescriptors === undefined\n ? []\n : processorConstructor.parameterDescriptors.reduce((prmtrs, { name }) => ({ ...prmtrs, [name]: new Float32Array(128) }), {});\n let isActive = true;\n const disconnectOutputsGraph = () => {\n if (options.numberOfOutputs > 0) {\n scriptProcessorNode.disconnect(outputChannelSplitterNode);\n }\n for (let i = 0, outputChannelSplitterNodeOutput = 0; i < options.numberOfOutputs; i += 1) {\n const outputChannelMergerNode = outputChannelMergerNodes[i];\n for (let j = 0; j < outputChannelCount[i]; j += 1) {\n outputChannelSplitterNode.disconnect(outputChannelMergerNode, outputChannelSplitterNodeOutput + j, j);\n }\n outputChannelSplitterNodeOutput += outputChannelCount[i];\n }\n };\n const activeInputIndexes = new Map();\n // tslint:disable-next-line:deprecation\n scriptProcessorNode.onaudioprocess = ({ inputBuffer, outputBuffer }) => {\n if (audioWorkletProcessor !== null) {\n const activeInputs = getActiveAudioWorkletNodeInputs(nativeAudioWorkletNodeFaker);\n for (let i = 0; i < bufferSize; i += 128) {\n for (let j = 0; j < options.numberOfInputs; j += 1) {\n for (let k = 0; k < options.channelCount; k += 1) {\n copyFromChannel(inputBuffer, inputs[j], k, k, i);\n }\n }\n if (processorConstructor.parameterDescriptors !== undefined) {\n processorConstructor.parameterDescriptors.forEach(({ name }, index) => {\n copyFromChannel(inputBuffer, parameters, name, numberOfInputChannels + index, i);\n });\n }\n for (let j = 0; j < options.numberOfInputs; j += 1) {\n for (let k = 0; k < outputChannelCount[j]; k += 1) {\n // The byteLength will be 0 when the ArrayBuffer was transferred.\n if (outputs[j][k].byteLength === 0) {\n outputs[j][k] = new Float32Array(128);\n }\n }\n }\n try {\n const potentiallyEmptyInputs = inputs.map((input, index) => {\n const activeInput = activeInputs[index];\n if (activeInput.size > 0) {\n activeInputIndexes.set(index, bufferSize / 128);\n return input;\n }\n const count = activeInputIndexes.get(index);\n if (count === undefined) {\n return [];\n }\n if (input.every((channelData) => channelData.every((sample) => sample === 0))) {\n if (count === 1) {\n activeInputIndexes.delete(index);\n }\n else {\n activeInputIndexes.set(index, count - 1);\n }\n }\n return input;\n });\n const activeSourceFlag = exposeCurrentFrameAndCurrentTime(nativeContext.currentTime + i / nativeContext.sampleRate, nativeContext.sampleRate, () => audioWorkletProcessor.process(potentiallyEmptyInputs, outputs, parameters));\n isActive = activeSourceFlag;\n for (let j = 0, outputChannelSplitterNodeOutput = 0; j < options.numberOfOutputs; j += 1) {\n for (let k = 0; k < outputChannelCount[j]; k += 1) {\n copyToChannel(outputBuffer, outputs[j], k, outputChannelSplitterNodeOutput + k, i);\n }\n outputChannelSplitterNodeOutput += outputChannelCount[j];\n }\n }\n catch (error) {\n isActive = false;\n nativeAudioWorkletNodeFaker.dispatchEvent(new ErrorEvent('processorerror', {\n colno: error.colno,\n filename: error.filename,\n lineno: error.lineno,\n message: error.message\n }));\n }\n if (!isActive) {\n for (let j = 0; j < options.numberOfInputs; j += 1) {\n gainNodes[j].disconnect(inputChannelSplitterNodes[j]);\n for (let k = 0; k < options.channelCount; k += 1) {\n inputChannelSplitterNodes[i].disconnect(inputChannelMergerNode, k, j * options.channelCount + k);\n }\n }\n if (processorConstructor.parameterDescriptors !== undefined) {\n const length = processorConstructor.parameterDescriptors.length;\n for (let j = 0; j < length; j += 1) {\n const constantSourceNode = constantSourceNodes[j];\n constantSourceNode.disconnect(inputChannelMergerNode, 0, numberOfInputChannels + j);\n constantSourceNode.stop();\n }\n }\n inputChannelMergerNode.disconnect(scriptProcessorNode);\n scriptProcessorNode.onaudioprocess = null; // tslint:disable-line:deprecation\n if (isConnected) {\n disconnectOutputsGraph();\n }\n else {\n disconnectFakeGraph();\n }\n break;\n }\n }\n }\n };\n let isConnected = false;\n // Bug #87: Only Firefox will fire an AudioProcessingEvent if there is no connected output.\n const nativeGainNode = createNativeGainNode(nativeContext, {\n channelCount: 1,\n channelCountMode: 'explicit',\n channelInterpretation: 'discrete',\n gain: 0\n });\n const connectFakeGraph = () => scriptProcessorNode.connect(nativeGainNode).connect(nativeContext.destination);\n const disconnectFakeGraph = () => {\n scriptProcessorNode.disconnect(nativeGainNode);\n nativeGainNode.disconnect();\n };\n const whenConnected = () => {\n if (isActive) {\n disconnectFakeGraph();\n if (options.numberOfOutputs > 0) {\n scriptProcessorNode.connect(outputChannelSplitterNode);\n }\n for (let i = 0, outputChannelSplitterNodeOutput = 0; i < options.numberOfOutputs; i += 1) {\n const outputChannelMergerNode = outputChannelMergerNodes[i];\n for (let j = 0; j < outputChannelCount[i]; j += 1) {\n outputChannelSplitterNode.connect(outputChannelMergerNode, outputChannelSplitterNodeOutput + j, j);\n }\n outputChannelSplitterNodeOutput += outputChannelCount[i];\n }\n }\n isConnected = true;\n };\n const whenDisconnected = () => {\n if (isActive) {\n connectFakeGraph();\n disconnectOutputsGraph();\n }\n isConnected = false;\n };\n connectFakeGraph();\n return monitorConnections(nativeAudioWorkletNodeFaker, whenConnected, whenDisconnected);\n };\n};\n//# sourceMappingURL=native-audio-worklet-node-faker-factory.js.map","import { NODE_TO_PROCESSOR_MAPS } from '../globals';\nimport { createAudioWorkletProcessorPromise } from './create-audio-worklet-processor-promise';\nexport const createAudioWorkletProcessor = (nativeContext, nativeAudioWorkletNode, processorConstructor, audioWorkletNodeOptions) => {\n let nodeToProcessorMap = NODE_TO_PROCESSOR_MAPS.get(nativeContext);\n if (nodeToProcessorMap === undefined) {\n nodeToProcessorMap = new WeakMap();\n NODE_TO_PROCESSOR_MAPS.set(nativeContext, nodeToProcessorMap);\n }\n const audioWorkletProcessorPromise = createAudioWorkletProcessorPromise(processorConstructor, audioWorkletNodeOptions);\n nodeToProcessorMap.set(nativeAudioWorkletNode, audioWorkletProcessorPromise);\n return audioWorkletProcessorPromise;\n};\n//# sourceMappingURL=create-audio-worklet-processor.js.map","import { testClonabilityOfAudioWorkletNodeOptions } from '../helpers/test-clonability-of-audio-worklet-node-options';\nexport const createNativeAudioWorkletNodeFactory = (createInvalidStateError, createNativeAudioWorkletNodeFaker, createNativeGainNode, createNotSupportedError, monitorConnections) => {\n return (nativeContext, baseLatency, nativeAudioWorkletNodeConstructor, name, processorConstructor, options) => {\n if (nativeAudioWorkletNodeConstructor !== null) {\n try {\n const nativeAudioWorkletNode = new nativeAudioWorkletNodeConstructor(nativeContext, name, options);\n const patchedEventListeners = new Map();\n let onprocessorerror = null;\n Object.defineProperties(nativeAudioWorkletNode, {\n /*\n * Bug #61: Overwriting the property accessors for channelCount and channelCountMode is necessary as long as some\n * browsers have no native implementation to achieve a consistent behavior.\n */\n channelCount: {\n get: () => options.channelCount,\n set: () => {\n throw createInvalidStateError();\n }\n },\n channelCountMode: {\n get: () => 'explicit',\n set: () => {\n throw createInvalidStateError();\n }\n },\n // Bug #156: Chrome and Edge do not yet fire an ErrorEvent.\n onprocessorerror: {\n get: () => onprocessorerror,\n set: (value) => {\n if (typeof onprocessorerror === 'function') {\n nativeAudioWorkletNode.removeEventListener('processorerror', onprocessorerror);\n }\n onprocessorerror = typeof value === 'function' ? value : null;\n if (typeof onprocessorerror === 'function') {\n nativeAudioWorkletNode.addEventListener('processorerror', onprocessorerror);\n }\n }\n }\n });\n nativeAudioWorkletNode.addEventListener = ((addEventListener) => {\n return (...args) => {\n if (args[0] === 'processorerror') {\n const unpatchedEventListener = typeof args[1] === 'function'\n ? args[1]\n : typeof args[1] === 'object' && args[1] !== null && typeof args[1].handleEvent === 'function'\n ? args[1].handleEvent\n : null;\n if (unpatchedEventListener !== null) {\n const patchedEventListener = patchedEventListeners.get(args[1]);\n if (patchedEventListener !== undefined) {\n args[1] = patchedEventListener;\n }\n else {\n args[1] = (event) => {\n // Bug #178: Chrome, Edge and Opera do fire an event of type error.\n if (event.type === 'error') {\n Object.defineProperties(event, {\n type: { value: 'processorerror' }\n });\n unpatchedEventListener(event);\n }\n else {\n unpatchedEventListener(new ErrorEvent(args[0], { ...event }));\n }\n };\n patchedEventListeners.set(unpatchedEventListener, args[1]);\n }\n }\n }\n // Bug #178: Chrome, Edge and Opera do fire an event of type error.\n addEventListener.call(nativeAudioWorkletNode, 'error', args[1], args[2]);\n return addEventListener.call(nativeAudioWorkletNode, ...args);\n };\n })(nativeAudioWorkletNode.addEventListener);\n nativeAudioWorkletNode.removeEventListener = ((removeEventListener) => {\n return (...args) => {\n if (args[0] === 'processorerror') {\n const patchedEventListener = patchedEventListeners.get(args[1]);\n if (patchedEventListener !== undefined) {\n patchedEventListeners.delete(args[1]);\n args[1] = patchedEventListener;\n }\n }\n // Bug #178: Chrome, Edge and Opera do fire an event of type error.\n removeEventListener.call(nativeAudioWorkletNode, 'error', args[1], args[2]);\n return removeEventListener.call(nativeAudioWorkletNode, args[0], args[1], args[2]);\n };\n })(nativeAudioWorkletNode.removeEventListener);\n /*\n * Bug #86: Chrome and Edge do not invoke the process() function if the corresponding AudioWorkletNode is unconnected but\n * has an output.\n */\n if (options.numberOfOutputs !== 0) {\n const nativeGainNode = createNativeGainNode(nativeContext, {\n channelCount: 1,\n channelCountMode: 'explicit',\n channelInterpretation: 'discrete',\n gain: 0\n });\n nativeAudioWorkletNode.connect(nativeGainNode).connect(nativeContext.destination);\n const whenConnected = () => nativeGainNode.disconnect();\n const whenDisconnected = () => nativeGainNode.connect(nativeContext.destination);\n // @todo Disconnect the connection when the process() function of the AudioWorkletNode returns false.\n return monitorConnections(nativeAudioWorkletNode, whenConnected, whenDisconnected);\n }\n return nativeAudioWorkletNode;\n }\n catch (err) {\n // Bug #60: Chrome, Edge & Opera throw an InvalidStateError instead of a NotSupportedError.\n if (err.code === 11) {\n throw createNotSupportedError();\n }\n throw err;\n }\n }\n // Bug #61: Only Chrome & Opera have an implementation of the AudioWorkletNode yet.\n if (processorConstructor === undefined) {\n throw createNotSupportedError();\n }\n testClonabilityOfAudioWorkletNodeOptions(options);\n return createNativeAudioWorkletNodeFaker(nativeContext, baseLatency, processorConstructor, options);\n };\n};\n//# sourceMappingURL=native-audio-worklet-node-factory.js.map","export const testClonabilityOfAudioWorkletNodeOptions = (audioWorkletNodeOptions) => {\n const { port1 } = new MessageChannel();\n try {\n // This will throw an error if the audioWorkletNodeOptions are not clonable.\n port1.postMessage(audioWorkletNodeOptions);\n }\n finally {\n port1.close();\n }\n};\n//# sourceMappingURL=test-clonability-of-audio-worklet-node-options.js.map","export const createGetBackupOfflineAudioContext = (backupOfflineAudioContextStore) => {\n return (nativeContext) => {\n return backupOfflineAudioContextStore.get(nativeContext);\n };\n};\n//# sourceMappingURL=get-backup-offline-audio-context.js.map","export const createSetActiveAudioWorkletNodeInputs = (activeAudioWorkletNodeInputsStore) => {\n return (nativeAudioWorkletNode, activeInputs) => {\n activeAudioWorkletNodeInputsStore.set(nativeAudioWorkletNode, activeInputs);\n };\n};\n//# sourceMappingURL=set-active-audio-worklet-node-inputs.js.map","export const sanitizeAudioWorkletNodeOptions = (options) => {\n return {\n ...options,\n outputChannelCount: options.outputChannelCount !== undefined\n ? options.outputChannelCount\n : options.numberOfInputs === 1 && options.numberOfOutputs === 1\n ? /*\n * Bug #61: This should be the computedNumberOfChannels, but unfortunately that is almost impossible to fake. That's why\n * the channelCountMode is required to be 'explicit' as long as there is not a native implementation in every browser. That\n * makes sure the computedNumberOfChannels is equivilant to the channelCount which makes it much easier to compute.\n */\n [options.channelCount]\n : Array.from({ length: options.numberOfOutputs }, () => 1)\n };\n};\n//# sourceMappingURL=sanitize-audio-worklet-node-options.js.map","import { deactivateAudioGraph } from '../helpers/deactivate-audio-graph';\nimport { isValidLatencyHint } from '../helpers/is-valid-latency-hint';\nexport const createMinimalAudioContextConstructor = (createInvalidStateError, createNotSupportedError, createUnknownError, minimalBaseAudioContextConstructor, nativeAudioContextConstructor) => {\n return class MinimalAudioContext extends minimalBaseAudioContextConstructor {\n constructor(options = {}) {\n if (nativeAudioContextConstructor === null) {\n throw new Error('Missing the native AudioContext constructor.');\n }\n const nativeAudioContext = new nativeAudioContextConstructor(options);\n // Bug #131 Safari returns null when there are four other AudioContexts running already.\n if (nativeAudioContext === null) {\n throw createUnknownError();\n }\n // Bug #51 Only Chrome Edge, and Opera throw an error if the given latencyHint is invalid.\n if (!isValidLatencyHint(options.latencyHint)) {\n throw new TypeError(`The provided value '${options.latencyHint}' is not a valid enum value of type AudioContextLatencyCategory.`);\n }\n // Bug #150 Safari does not support setting the sampleRate.\n if (options.sampleRate !== undefined && nativeAudioContext.sampleRate !== options.sampleRate) {\n throw createNotSupportedError();\n }\n super(nativeAudioContext, 2);\n const { latencyHint } = options;\n const { sampleRate } = nativeAudioContext;\n // @todo The values for 'balanced', 'interactive' and 'playback' are just copied from Chrome's implementation.\n this._baseLatency =\n typeof nativeAudioContext.baseLatency === 'number'\n ? nativeAudioContext.baseLatency\n : latencyHint === 'balanced'\n ? 512 / sampleRate\n : latencyHint === 'interactive' || latencyHint === undefined\n ? 256 / sampleRate\n : latencyHint === 'playback'\n ? 1024 / sampleRate\n : /*\n * @todo The min (256) and max (16384) values are taken from the allowed bufferSize values of a\n * ScriptProcessorNode.\n */\n (Math.max(2, Math.min(128, Math.round((latencyHint * sampleRate) / 128))) * 128) / sampleRate;\n this._nativeAudioContext = nativeAudioContext;\n // Bug #188: Safari will set the context's state to 'interrupted' in case the user switches tabs.\n if (nativeAudioContextConstructor.name === 'webkitAudioContext') {\n this._nativeGainNode = nativeAudioContext.createGain();\n this._nativeOscillatorNode = nativeAudioContext.createOscillator();\n this._nativeGainNode.gain.value = 1e-37;\n this._nativeOscillatorNode.connect(this._nativeGainNode).connect(nativeAudioContext.destination);\n this._nativeOscillatorNode.start();\n }\n else {\n this._nativeGainNode = null;\n this._nativeOscillatorNode = null;\n }\n this._state = null;\n /*\n * Bug #34: Chrome, Edge and Opera pretend to be running right away, but fire an onstatechange event when the state actually\n * changes to 'running'.\n */\n if (nativeAudioContext.state === 'running') {\n this._state = 'suspended';\n const revokeState = () => {\n if (this._state === 'suspended') {\n this._state = null;\n }\n nativeAudioContext.removeEventListener('statechange', revokeState);\n };\n nativeAudioContext.addEventListener('statechange', revokeState);\n }\n }\n get baseLatency() {\n return this._baseLatency;\n }\n get state() {\n return this._state !== null ? this._state : this._nativeAudioContext.state;\n }\n close() {\n // Bug #35: Firefox does not throw an error if the AudioContext was closed before.\n if (this.state === 'closed') {\n return this._nativeAudioContext.close().then(() => {\n throw createInvalidStateError();\n });\n }\n // Bug #34: If the state was set to suspended before it should be revoked now.\n if (this._state === 'suspended') {\n this._state = null;\n }\n return this._nativeAudioContext.close().then(() => {\n if (this._nativeGainNode !== null && this._nativeOscillatorNode !== null) {\n this._nativeOscillatorNode.stop();\n this._nativeGainNode.disconnect();\n this._nativeOscillatorNode.disconnect();\n }\n deactivateAudioGraph(this);\n });\n }\n resume() {\n if (this._state === 'suspended') {\n return new Promise((resolve, reject) => {\n const resolvePromise = () => {\n this._nativeAudioContext.removeEventListener('statechange', resolvePromise);\n if (this._nativeAudioContext.state === 'running') {\n resolve();\n }\n else {\n this.resume().then(resolve, reject);\n }\n };\n this._nativeAudioContext.addEventListener('statechange', resolvePromise);\n });\n }\n return this._nativeAudioContext.resume().catch((err) => {\n // Bug #55: Chrome, Edge and Opera do throw an InvalidAccessError instead of an InvalidStateError.\n // Bug #56: Safari invokes the catch handler but without an error.\n if (err === undefined || err.code === 15) {\n throw createInvalidStateError();\n }\n throw err;\n });\n }\n suspend() {\n return this._nativeAudioContext.suspend().catch((err) => {\n // Bug #56: Safari invokes the catch handler but without an error.\n if (err === undefined) {\n throw createInvalidStateError();\n }\n throw err;\n });\n }\n };\n};\n//# sourceMappingURL=minimal-audio-context-constructor.js.map","export const createCreateNativeOfflineAudioContext = (createNotSupportedError, nativeOfflineAudioContextConstructor) => {\n return (numberOfChannels, length, sampleRate) => {\n if (nativeOfflineAudioContextConstructor === null) {\n throw new Error('Missing the native OfflineAudioContext constructor.');\n }\n try {\n return new nativeOfflineAudioContextConstructor(numberOfChannels, length, sampleRate);\n }\n catch (err) {\n // Bug #143, #144 & #146: Safari throws a SyntaxError when numberOfChannels, length or sampleRate are invalid.\n if (err.name === 'SyntaxError') {\n throw createNotSupportedError();\n }\n throw err;\n }\n };\n};\n//# sourceMappingURL=create-native-offline-audio-context.js.map","import { wrapAudioBufferGetChannelDataMethod } from '../helpers/wrap-audio-buffer-get-channel-data-method';\nexport const createStartRendering = (audioBufferStore, cacheTestResult, getAudioNodeRenderer, getUnrenderedAudioWorkletNodes, renderNativeOfflineAudioContext, testAudioBufferCopyChannelMethodsOutOfBoundsSupport, wrapAudioBufferCopyChannelMethods, wrapAudioBufferCopyChannelMethodsOutOfBounds) => {\n const trace = [];\n return (destination, nativeOfflineAudioContext) => getAudioNodeRenderer(destination)\n .render(destination, nativeOfflineAudioContext, trace)\n /*\n * Bug #86 & #87: Invoking the renderer of an AudioWorkletNode might be necessary if it has no direct or indirect connection to the\n * destination.\n */\n .then(() => Promise.all(Array.from(getUnrenderedAudioWorkletNodes(nativeOfflineAudioContext)).map((audioWorkletNode) => getAudioNodeRenderer(audioWorkletNode).render(audioWorkletNode, nativeOfflineAudioContext, trace))))\n .then(() => renderNativeOfflineAudioContext(nativeOfflineAudioContext))\n .then((audioBuffer) => {\n // Bug #5: Safari does not support copyFromChannel() and copyToChannel().\n // Bug #100: Safari does throw a wrong error when calling getChannelData() with an out-of-bounds value.\n if (typeof audioBuffer.copyFromChannel !== 'function') {\n wrapAudioBufferCopyChannelMethods(audioBuffer);\n wrapAudioBufferGetChannelDataMethod(audioBuffer);\n // Bug #157: Firefox does not allow the bufferOffset to be out-of-bounds.\n }\n else if (!cacheTestResult(testAudioBufferCopyChannelMethodsOutOfBoundsSupport, () => testAudioBufferCopyChannelMethodsOutOfBoundsSupport(audioBuffer))) {\n wrapAudioBufferCopyChannelMethodsOutOfBounds(audioBuffer);\n }\n audioBufferStore.add(audioBuffer);\n return audioBuffer;\n });\n};\n//# sourceMappingURL=start-rendering.js.map","export const createIsAnyAudioContext = (contextStore, isNativeAudioContext) => {\n return (anything) => {\n const nativeContext = contextStore.get(anything);\n return isNativeAudioContext(nativeContext) || isNativeAudioContext(anything);\n };\n};\n//# sourceMappingURL=is-any-audio-context.js.map","export const createIsAnyAudioNode = (audioNodeStore, isNativeAudioNode) => {\n return (anything) => audioNodeStore.has(anything) || isNativeAudioNode(anything);\n};\n//# sourceMappingURL=is-any-audio-node.js.map","export const createIsAnyAudioParam = (audioParamStore, isNativeAudioParam) => {\n return (anything) => audioParamStore.has(anything) || isNativeAudioParam(anything);\n};\n//# sourceMappingURL=is-any-audio-param.js.map","export const createIsAnyOfflineAudioContext = (contextStore, isNativeOfflineAudioContext) => {\n return (anything) => {\n const nativeContext = contextStore.get(anything);\n return isNativeOfflineAudioContext(nativeContext) || isNativeOfflineAudioContext(anything);\n };\n};\n//# sourceMappingURL=is-any-offline-audio-context.js.map","export const createIsSupportedPromise = async (cacheTestResult, testAudioBufferCopyChannelMethodsSubarraySupport, testAudioContextCloseMethodSupport, testAudioContextDecodeAudioDataMethodTypeErrorSupport, testAudioContextOptionsSupport, testAudioNodeConnectMethodSupport, testAudioWorkletProcessorNoOutputsSupport, testChannelMergerNodeChannelCountSupport, testConstantSourceNodeAccurateSchedulingSupport, testConvolverNodeBufferReassignabilitySupport, testConvolverNodeChannelCountSupport, testDomExceptionContrucorSupport, testIsSecureContextSupport, testMediaStreamAudioSourceNodeMediaStreamWithoutAudioTrackSupport, testStereoPannerNodeDefaultValueSupport, testTransferablesSupport) => {\n if (cacheTestResult(testAudioBufferCopyChannelMethodsSubarraySupport, testAudioBufferCopyChannelMethodsSubarraySupport) &&\n cacheTestResult(testAudioContextCloseMethodSupport, testAudioContextCloseMethodSupport) &&\n cacheTestResult(testAudioContextOptionsSupport, testAudioContextOptionsSupport) &&\n cacheTestResult(testAudioNodeConnectMethodSupport, testAudioNodeConnectMethodSupport) &&\n cacheTestResult(testChannelMergerNodeChannelCountSupport, testChannelMergerNodeChannelCountSupport) &&\n cacheTestResult(testConstantSourceNodeAccurateSchedulingSupport, testConstantSourceNodeAccurateSchedulingSupport) &&\n cacheTestResult(testConvolverNodeBufferReassignabilitySupport, testConvolverNodeBufferReassignabilitySupport) &&\n cacheTestResult(testConvolverNodeChannelCountSupport, testConvolverNodeChannelCountSupport) &&\n cacheTestResult(testDomExceptionContrucorSupport, testDomExceptionContrucorSupport) &&\n cacheTestResult(testIsSecureContextSupport, testIsSecureContextSupport) &&\n cacheTestResult(testMediaStreamAudioSourceNodeMediaStreamWithoutAudioTrackSupport, testMediaStreamAudioSourceNodeMediaStreamWithoutAudioTrackSupport)) {\n const results = await Promise.all([\n cacheTestResult(testAudioContextDecodeAudioDataMethodTypeErrorSupport, testAudioContextDecodeAudioDataMethodTypeErrorSupport),\n cacheTestResult(testAudioWorkletProcessorNoOutputsSupport, testAudioWorkletProcessorNoOutputsSupport),\n cacheTestResult(testStereoPannerNodeDefaultValueSupport, testStereoPannerNodeDefaultValueSupport),\n cacheTestResult(testTransferablesSupport, testTransferablesSupport)\n ]);\n return results.every((result) => result);\n }\n return false;\n};\n//# sourceMappingURL=is-supported-promise.js.map","/*\n * Firefox up to version 67 didn't fully support the copyFromChannel() and copyToChannel() methods. Therefore testing one of those methods\n * is enough to know if the other one is supported as well.\n */\nexport const createTestAudioBufferCopyChannelMethodsSubarraySupport = (nativeOfflineAudioContextConstructor) => {\n return () => {\n if (nativeOfflineAudioContextConstructor === null) {\n return false;\n }\n const nativeOfflineAudioContext = new nativeOfflineAudioContextConstructor(1, 1, 44100);\n const nativeAudioBuffer = nativeOfflineAudioContext.createBuffer(1, 1, 44100);\n // Bug #5: Safari does not support copyFromChannel() and copyToChannel().\n if (nativeAudioBuffer.copyToChannel === undefined) {\n return true;\n }\n const source = new Float32Array(2);\n try {\n nativeAudioBuffer.copyFromChannel(source, 0, 0);\n }\n catch {\n return false;\n }\n return true;\n };\n};\n//# sourceMappingURL=test-audio-buffer-copy-channel-methods-subarray-support.js.map","export const createTestAudioContextCloseMethodSupport = (nativeAudioContextConstructor) => {\n return () => {\n if (nativeAudioContextConstructor === null) {\n return false;\n }\n // Try to check the prototype before constructing the AudioContext.\n if (nativeAudioContextConstructor.prototype !== undefined && nativeAudioContextConstructor.prototype.close !== undefined) {\n return true;\n }\n const audioContext = new nativeAudioContextConstructor();\n const isAudioContextClosable = audioContext.close !== undefined;\n try {\n audioContext.close();\n }\n catch {\n // Ignore errors.\n }\n return isAudioContextClosable;\n };\n};\n//# sourceMappingURL=test-audio-context-close-method-support.js.map","/**\n * Edge up to version 14, Firefox up to version 52, Safari up to version 9 and maybe other browsers\n * did not refuse to decode invalid parameters with a TypeError.\n */\nexport const createTestAudioContextDecodeAudioDataMethodTypeErrorSupport = (nativeOfflineAudioContextConstructor) => {\n return () => {\n if (nativeOfflineAudioContextConstructor === null) {\n return Promise.resolve(false);\n }\n const offlineAudioContext = new nativeOfflineAudioContextConstructor(1, 1, 44100);\n // Bug #21: Safari does not support promises yet.\n return new Promise((resolve) => {\n let isPending = true;\n const resolvePromise = (err) => {\n if (isPending) {\n isPending = false;\n offlineAudioContext.startRendering();\n resolve(err instanceof TypeError);\n }\n };\n let promise;\n // Bug #26: Safari throws a synchronous error.\n try {\n promise = offlineAudioContext\n // Bug #1: Safari requires a successCallback.\n .decodeAudioData(null, () => {\n // Ignore the success callback.\n }, resolvePromise);\n }\n catch (err) {\n resolvePromise(err);\n }\n // Bug #21: Safari does not support promises yet.\n if (promise !== undefined) {\n // Bug #6: Chrome, Edge, Firefox and Opera do not call the errorCallback.\n promise.catch(resolvePromise);\n }\n });\n };\n};\n//# sourceMappingURL=test-audio-context-decode-audio-data-method-type-error-support.js.map","export const createTestAudioContextOptionsSupport = (nativeAudioContextConstructor) => {\n return () => {\n if (nativeAudioContextConstructor === null) {\n return false;\n }\n let audioContext;\n try {\n audioContext = new nativeAudioContextConstructor({ latencyHint: 'balanced' });\n }\n catch {\n return false;\n }\n audioContext.close();\n return true;\n };\n};\n//# sourceMappingURL=test-audio-context-options-support.js.map","// Safari up to version 12.0 (but not v12.1) didn't return the destination in case it was an AudioNode.\nexport const createTestAudioNodeConnectMethodSupport = (nativeOfflineAudioContextConstructor) => {\n return () => {\n if (nativeOfflineAudioContextConstructor === null) {\n return false;\n }\n const nativeOfflineAudioContext = new nativeOfflineAudioContextConstructor(1, 1, 44100);\n const nativeGainNode = nativeOfflineAudioContext.createGain();\n const isSupported = nativeGainNode.connect(nativeGainNode) === nativeGainNode;\n nativeGainNode.disconnect(nativeGainNode);\n return isSupported;\n };\n};\n//# sourceMappingURL=test-audio-node-connect-method-support.js.map","/**\n * Chrome version 66 and 67 did not call the process() function of an AudioWorkletProcessor if it had no outputs. AudioWorklet support was\n * enabled by default in version 66.\n */\nexport const createTestAudioWorkletProcessorNoOutputsSupport = (nativeAudioWorkletNodeConstructor, nativeOfflineAudioContextConstructor) => {\n return async () => {\n // Bug #61: If there is no native AudioWorkletNode it gets faked and therefore it is no problem if the it doesn't exist.\n if (nativeAudioWorkletNodeConstructor === null) {\n return true;\n }\n if (nativeOfflineAudioContextConstructor === null) {\n return false;\n }\n const blob = new Blob(['class A extends AudioWorkletProcessor{process(){this.port.postMessage(0)}}registerProcessor(\"a\",A)'], {\n type: 'application/javascript; charset=utf-8'\n });\n const offlineAudioContext = new nativeOfflineAudioContextConstructor(1, 128, 8000);\n const url = URL.createObjectURL(blob);\n let isCallingProcess = false;\n try {\n await offlineAudioContext.audioWorklet.addModule(url);\n const audioWorkletNode = new nativeAudioWorkletNodeConstructor(offlineAudioContext, 'a', { numberOfOutputs: 0 });\n const oscillator = offlineAudioContext.createOscillator();\n audioWorkletNode.port.onmessage = () => (isCallingProcess = true);\n oscillator.connect(audioWorkletNode);\n oscillator.start(0);\n await offlineAudioContext.startRendering();\n if (!isCallingProcess) {\n await new Promise((resolve) => setTimeout(resolve, 5));\n }\n }\n catch {\n // Ignore errors.\n }\n finally {\n URL.revokeObjectURL(url);\n }\n return isCallingProcess;\n };\n};\n//# sourceMappingURL=test-audio-worklet-processor-no-outputs-support.js.map","/**\n * Firefox up to version 69 did not throw an error when setting a different channelCount or channelCountMode.\n */\nexport const createTestChannelMergerNodeChannelCountSupport = (nativeOfflineAudioContextConstructor) => {\n return () => {\n if (nativeOfflineAudioContextConstructor === null) {\n return false;\n }\n const offlineAudioContext = new nativeOfflineAudioContextConstructor(1, 1, 44100);\n const nativeChannelMergerNode = offlineAudioContext.createChannelMerger();\n /**\n * Bug #15: Safari does not return the default properties. It still needs to be patched. This test is supposed to test the support\n * in other browsers.\n */\n if (nativeChannelMergerNode.channelCountMode === 'max') {\n return true;\n }\n try {\n nativeChannelMergerNode.channelCount = 2;\n }\n catch {\n return true;\n }\n return false;\n };\n};\n//# sourceMappingURL=test-channel-merger-node-channel-count-support.js.map","export const createTestConstantSourceNodeAccurateSchedulingSupport = (nativeOfflineAudioContextConstructor) => {\n return () => {\n if (nativeOfflineAudioContextConstructor === null) {\n return false;\n }\n const nativeOfflineAudioContext = new nativeOfflineAudioContextConstructor(1, 1, 44100);\n // Bug #62: Safari does not support ConstantSourceNodes.\n if (nativeOfflineAudioContext.createConstantSource === undefined) {\n return true;\n }\n const nativeConstantSourceNode = nativeOfflineAudioContext.createConstantSource();\n /*\n * @todo This is using bug #75 to detect bug #70. That works because both bugs were unique to\n * the implementation of Firefox right now, but it could probably be done in a better way.\n */\n return nativeConstantSourceNode.offset.maxValue !== Number.POSITIVE_INFINITY;\n };\n};\n//# sourceMappingURL=test-constant-source-node-accurate-scheduling-support.js.map","// Opera up to version 57 did not allow to reassign the buffer of a ConvolverNode.\nexport const createTestConvolverNodeBufferReassignabilitySupport = (nativeOfflineAudioContextConstructor) => {\n return () => {\n if (nativeOfflineAudioContextConstructor === null) {\n return false;\n }\n const offlineAudioContext = new nativeOfflineAudioContextConstructor(1, 1, 44100);\n const nativeConvolverNode = offlineAudioContext.createConvolver();\n nativeConvolverNode.buffer = offlineAudioContext.createBuffer(1, 1, offlineAudioContext.sampleRate);\n try {\n nativeConvolverNode.buffer = offlineAudioContext.createBuffer(1, 1, offlineAudioContext.sampleRate);\n }\n catch {\n return false;\n }\n return true;\n };\n};\n//# sourceMappingURL=test-convolver-node-buffer-reassignability-support.js.map","// Chrome up to version v80, Edge up to version v80 and Opera up to version v67 did not allow to set the channelCount property of a ConvolverNode to 1. They also did not allow to set the channelCountMode to 'explicit'.\nexport const createTestConvolverNodeChannelCountSupport = (nativeOfflineAudioContextConstructor) => {\n return () => {\n if (nativeOfflineAudioContextConstructor === null) {\n return false;\n }\n const offlineAudioContext = new nativeOfflineAudioContextConstructor(1, 1, 44100);\n const nativeConvolverNode = offlineAudioContext.createConvolver();\n try {\n nativeConvolverNode.channelCount = 1;\n }\n catch {\n return false;\n }\n return true;\n };\n};\n//# sourceMappingURL=test-convolver-node-channel-count-support.js.map","export const createTestIsSecureContextSupport = (window) => {\n return () => window !== null && window.hasOwnProperty('isSecureContext');\n};\n//# sourceMappingURL=test-is-secure-context-support.js.map","// Firefox up to version 68 did not throw an error when creating a MediaStreamAudioSourceNode with a mediaStream that had no audio track.\nexport const createTestMediaStreamAudioSourceNodeMediaStreamWithoutAudioTrackSupport = (nativeAudioContextConstructor) => {\n return () => {\n if (nativeAudioContextConstructor === null) {\n return false;\n }\n const audioContext = new nativeAudioContextConstructor();\n try {\n audioContext.createMediaStreamSource(new MediaStream());\n return false;\n }\n catch (err) {\n return true;\n }\n };\n};\n//# sourceMappingURL=test-media-stream-audio-source-node-media-stream-without-audio-track-support.js.map","/**\n * Firefox up to version 62 did not kick off the processing of the StereoPannerNode if the value of pan was zero.\n */\nexport const createTestStereoPannerNodeDefaultValueSupport = (nativeOfflineAudioContextConstructor) => {\n return () => {\n if (nativeOfflineAudioContextConstructor === null) {\n return Promise.resolve(false);\n }\n const nativeOfflineAudioContext = new nativeOfflineAudioContextConstructor(1, 1, 44100);\n /*\n * Bug #105: Safari does not support the StereoPannerNode. Therefore the returned value should normally be false but the faker does\n * support the tested behaviour.\n */\n if (nativeOfflineAudioContext.createStereoPanner === undefined) {\n return Promise.resolve(true);\n }\n // Bug #62: Safari does not support ConstantSourceNodes.\n if (nativeOfflineAudioContext.createConstantSource === undefined) {\n return Promise.resolve(true);\n }\n const constantSourceNode = nativeOfflineAudioContext.createConstantSource();\n const stereoPanner = nativeOfflineAudioContext.createStereoPanner();\n constantSourceNode.channelCount = 1;\n constantSourceNode.offset.value = 1;\n stereoPanner.channelCount = 1;\n constantSourceNode.start();\n constantSourceNode.connect(stereoPanner).connect(nativeOfflineAudioContext.destination);\n return nativeOfflineAudioContext.startRendering().then((buffer) => buffer.getChannelData(0)[0] !== 1);\n };\n};\n//# sourceMappingURL=test-stereo-panner-node-default-value-support.js.map","/**\n * Assert that the statement is true, otherwise invoke the error.\n * @param statement\n * @param error The message which is passed into an Error\n */\nexport function assert(statement: boolean, error: string): void {\n\tif (!statement) {\n\t\tthrow new Error(error);\n\t}\n}\n\n/**\n * Make sure that the given value is within the range\n */\nexport function assertRange(value: number, gte: number, lte = Infinity): void {\n\tif (!(gte <= value && value <= lte)) {\n\t\tthrow new RangeError(`Value must be within [${gte}, ${lte}], got: ${value}`);\n\t}\n}\n\n/**\n * Make sure that the given value is within the range\n */\nexport function assertContextRunning(context: import(\"../context/BaseContext\").BaseContext): void {\n\t// add a warning if the context is not started\n\tif (!context.isOffline && context.state !== \"running\") {\n\t\twarn(\"The AudioContext is \\\"suspended\\\". Invoke Tone.start() from a user action to start the audio.\");\n\t}\n}\n\n/**\n * A basic logging interface\n */\ninterface Logger {\n\tlog: (args?: any[]) => void;\n\twarn: (args?: any[]) => void;\n}\n\n/**\n * The default logger is the console\n */\nlet defaultLogger: Logger = console;\n\n/**\n * Set the logging interface\n */\nexport function setLogger(logger: Logger): void {\n\tdefaultLogger = logger;\n}\n\n/**\n * Log anything\n */\nexport function log(...args: any[]): void {\n\tdefaultLogger.log(...args);\n}\n\n/**\n * Warn anything\n */\nexport function warn(...args: any[]): void {\n\tdefaultLogger.warn(...args);\n}\n","import { Note } from \"../type/Units\";\n\n/**\n * Test if the arg is undefined\n */\nexport function isUndef(arg: any): arg is undefined {\n\treturn typeof arg === \"undefined\";\n}\n\n/**\n * Test if the arg is not undefined\n */\nexport function isDefined<T>(arg: T | undefined): arg is T {\n\treturn !isUndef(arg);\n}\n\n/**\n * Test if the arg is a function\n */\nexport function isFunction(arg: any): arg is (a: any) => any {\n\treturn typeof arg === \"function\";\n}\n\n/**\n * Test if the argument is a number.\n */\nexport function isNumber(arg: any): arg is number {\n\treturn (typeof arg === \"number\");\n}\n\n/**\n * Test if the given argument is an object literal (i.e. `{}`);\n */\nexport function isObject(arg: any): arg is object {\n\treturn (Object.prototype.toString.call(arg) === \"[object Object]\" && arg.constructor === Object);\n}\n\n/**\n * Test if the argument is a boolean.\n */\nexport function isBoolean(arg: any): arg is boolean {\n\treturn (typeof arg === \"boolean\");\n}\n\n/**\n * Test if the argument is an Array\n */\nexport function isArray(arg: any): arg is any[] {\n\treturn (Array.isArray(arg));\n}\n\n/**\n * Test if the argument is a string.\n */\nexport function isString(arg: any): arg is string {\n\treturn (typeof arg === \"string\");\n}\n\n/**\n * Test if the argument is in the form of a note in scientific pitch notation.\n * e.g. \"C4\"\n */\nexport function isNote(arg: any): arg is Note {\n\treturn isString(arg) && /^([a-g]{1}(?:b|#|x|bb)?)(-?[0-9]+)/i.test(arg);\n}\n","import {\n\tAudioContext as stdAudioContext,\n\tAudioWorkletNode as stdAudioWorkletNode,\n\tOfflineAudioContext as stdOfflineAudioContext\n} from \"standardized-audio-context\";\nimport { assert } from \"../util/Debug\";\nimport { isDefined } from \"../util/TypeCheck\";\n\n/**\n * Create a new AudioContext\n */\nexport function createAudioContext(options?: AudioContextOptions): AudioContext {\n\treturn new stdAudioContext(options) as unknown as AudioContext;\n}\n\n/**\n * Create a new OfflineAudioContext\n */\nexport function createOfflineAudioContext(channels: number, length: number, sampleRate: number): OfflineAudioContext {\n\treturn new stdOfflineAudioContext(channels, length, sampleRate) as unknown as OfflineAudioContext;\n}\n\n/**\n * Either the online or offline audio context\n */\nexport type AnyAudioContext = AudioContext | OfflineAudioContext;\n\n/**\n * Interface for things that Tone.js adds to the window\n */\ninterface ToneWindow extends Window {\n\tTONE_SILENCE_LOGGING?: boolean;\n\tTONE_DEBUG_CLASS?: string;\n}\n\n/**\n * A reference to the window object\n * @hidden\n */\nexport const theWindow: ToneWindow | null = typeof self === \"object\" ? self : null;\n\n/**\n * If the browser has a window object which has an AudioContext\n * @hidden\n */\nexport const hasAudioContext = theWindow &&\n\t(theWindow.hasOwnProperty(\"AudioContext\") || theWindow.hasOwnProperty(\"webkitAudioContext\"));\n\nexport function createAudioWorkletNode(context: AnyAudioContext, name: string, options?: Partial<AudioWorkletNodeOptions>): AudioWorkletNode {\n\tassert(isDefined(stdAudioWorkletNode), \"This node only works in a secure context (https or localhost)\");\n\t// @ts-ignore\n\treturn new stdAudioWorkletNode(context, name, options);\n}\n\n/**\n * This promise resolves to a boolean which indicates if the \n * functionality is supported within the currently used browse. \n * Taken from [standardized-audio-context](https://github.com/chrisguttandin/standardized-audio-context#issupported)\n */\nexport { isSupported as supported } from \"standardized-audio-context\";\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Seconds } from \"../type/Units\";\n\nexport type TickerClockSource = \"worker\" | \"timeout\" | \"offline\";\n\n/**\n * A class which provides a reliable callback using either\n * a Web Worker, or if that isn't supported, falls back to setTimeout.\n */\nexport class Ticker {\n\n\t/**\n\t * Either \"worker\" or \"timeout\" or \"offline\"\n\t */\n\tprivate _type: TickerClockSource;\n\n\t/**\n\t * The update interval of the worker\n\t */\n\tprivate _updateInterval: Seconds;\n\n\t/**\n\t * The callback to invoke at regular intervals\n\t */\n\tprivate _callback: () => void;\n\n\t/**\n\t * track the callback interval\n\t */\n\tprivate _timeout!: ReturnType<typeof setTimeout>;\n\n\t/**\n\t * private reference to the worker\n\t */\n\tprivate _worker!: Worker;\n\n\tconstructor(callback: () => void, type: TickerClockSource, updateInterval: Seconds) {\n\n\t\tthis._callback = callback;\n\t\tthis._type = type;\n\t\tthis._updateInterval = updateInterval;\n\n\t\t// create the clock source for the first time\n\t\tthis._createClock();\n\t}\n\n\t/**\n\t * Generate a web worker\n\t */\n\tprivate _createWorker(): void {\n\n\t\tconst blob = new Blob([\n\t\t\t/* javascript */`\n\t\t\t// the initial timeout time\n\t\t\tlet timeoutTime = ${(this._updateInterval * 1000).toFixed(1)};\n\t\t\t// onmessage callback\n\t\t\tself.onmessage = function(msg){\n\t\t\t\ttimeoutTime = parseInt(msg.data);\n\t\t\t};\n\t\t\t// the tick function which posts a message\n\t\t\t// and schedules a new tick\n\t\t\tfunction tick(){\n\t\t\t\tsetTimeout(tick, timeoutTime);\n\t\t\t\tself.postMessage('tick');\n\t\t\t}\n\t\t\t// call tick initially\n\t\t\ttick();\n\t\t\t`\n\t\t], { type: \"text/javascript\" });\n\t\tconst blobUrl = URL.createObjectURL(blob);\n\t\tconst worker = new Worker(blobUrl);\n\n\t\tworker.onmessage = this._callback.bind(this);\n\n\t\tthis._worker = worker;\n\t}\n\n\t/**\n\t * Create a timeout loop\n\t */\n\tprivate _createTimeout(): void {\n\t\tthis._timeout = setTimeout(() => {\n\t\t\tthis._createTimeout();\n\t\t\tthis._callback();\n\t\t}, this._updateInterval * 1000);\n\t}\n\n\t/**\n\t * Create the clock source.\n\t */\n\tprivate _createClock(): void {\n\t\tif (this._type === \"worker\") {\n\t\t\ttry {\n\t\t\t\tthis._createWorker();\n\t\t\t} catch (e) {\n\t\t\t\t// workers not supported, fallback to timeout\n\t\t\t\tthis._type = \"timeout\";\n\t\t\t\tthis._createClock();\n\t\t\t}\n\t\t} else if (this._type === \"timeout\") {\n\t\t\tthis._createTimeout();\n\t\t}\n\t}\n\n\t/**\n\t * Clean up the current clock source\n\t */\n\tprivate _disposeClock(): void {\n\t\tif (this._timeout) {\n\t\t\tclearTimeout(this._timeout);\n\t\t\tthis._timeout = 0;\n\t\t}\n\t\tif (this._worker) {\n\t\t\tthis._worker.terminate();\n\t\t\tthis._worker.onmessage = null;\n\t\t}\n\t}\n\n\t/**\n\t * The rate in seconds the ticker will update\n\t */\n\tget updateInterval(): Seconds {\n\t\treturn this._updateInterval;\n\t}\n\tset updateInterval(interval: Seconds) {\n\t\tthis._updateInterval = Math.max(interval, 128 / 44100);\n\t\tif (this._type === \"worker\") {\n\t\t\tthis._worker.postMessage(Math.max(interval * 1000, 1));\n\t\t}\n\t}\n\n\t/**\n\t * The type of the ticker, either a worker or a timeout\n\t */\n\tget type(): TickerClockSource {\n\t\treturn this._type;\n\t}\n\tset type(type: TickerClockSource) {\n\t\tthis._disposeClock();\n\t\tthis._type = type;\n\t\tthis._createClock();\n\t}\n\n\t/**\n\t * Clean up\n\t */\n\tdispose(): void {\n\t\tthis._disposeClock();\n\t}\n}\n","import {\n\tAudioBuffer, isAnyAudioContext,\n\tisAnyAudioNode, isAnyAudioParam,\n\tisAnyOfflineAudioContext\n} from \"standardized-audio-context\";\n\n/**\n * Test if the given value is an instanceof AudioParam\n */\nexport function isAudioParam(arg: any): arg is AudioParam {\n\treturn isAnyAudioParam(arg);\n}\n\n/**\n * Test if the given value is an instanceof AudioNode\n */\nexport function isAudioNode(arg: any): arg is AudioNode {\n\treturn isAnyAudioNode(arg);\n}\n\n/**\n * Test if the arg is instanceof an OfflineAudioContext\n */\nexport function isOfflineAudioContext(arg: any): arg is OfflineAudioContext {\n\treturn isAnyOfflineAudioContext(arg);\n}\n\n/**\n * Test if the arg is an instanceof AudioContext\n */\nexport function isAudioContext(arg: any): arg is AudioContext {\n\treturn isAnyAudioContext(arg);\n}\n\n/**\n * Test if the arg is instanceof an AudioBuffer\n */\nexport function isAudioBuffer(arg: any): arg is AudioBuffer {\n\treturn arg instanceof AudioBuffer;\n}\n","import { isAudioBuffer, isAudioNode, isAudioParam } from \"./AdvancedTypeCheck\";\nimport { isDefined, isObject, isUndef } from \"./TypeCheck\";\n\ntype BaseToneOptions = import(\"../Tone\").BaseToneOptions;\n\n/**\n * Some objects should not be merged\n */\nfunction noCopy(key: string, arg: any): boolean {\n\treturn key === \"value\" || isAudioParam(arg) || isAudioNode(arg) || isAudioBuffer(arg);\n}\n\n/**\n * Recursively merge an object\n * @param target the object to merge into\n * @param sources the source objects to merge\n */\nexport function deepMerge<T>(target: T): T;\nexport function deepMerge<T, U>(target: T, source1: U): T & U;\nexport function deepMerge<T, U, V>(target: T, source1: U, source2: V): T & U & V;\nexport function deepMerge<T, U, V, W>(target: T, source1: U, source2: V, source3: W): T & U & V & W;\nexport function deepMerge(target: any, ...sources: any[]): any {\n\tif (!sources.length) {\n\t\treturn target; \n\t}\n\tconst source = sources.shift();\n\n\tif (isObject(target) && isObject(source)) {\n\t\tfor (const key in source) {\n\t\t\tif (noCopy(key, source[key])) {\n\t\t\t\ttarget[key] = source[key];\n\t\t\t} else if (isObject(source[key])) {\n\t\t\t\tif (!target[key]) {\n\t\t\t\t\tObject.assign(target, { [key]: {} }); \n\t\t\t\t}\n\t\t\t\tdeepMerge(target[key], source[key] as any);\n\t\t\t} else {\n\t\t\t\tObject.assign(target, { [key]: source[key] as any });\n\t\t\t}\n\t\t}\n\t}\n\t// @ts-ignore\n\treturn deepMerge(target, ...sources);\n}\n\n/**\n * Returns true if the two arrays have the same value for each of the elements\n */\nexport function deepEquals<T>(arrayA: T[], arrayB: T[]): boolean {\n\treturn arrayA.length === arrayB.length && arrayA.every((element, index) => arrayB[index] === element);\n}\n\n/**\n * Convert an args array into an object.\n */\nexport function optionsFromArguments<T extends object>(\n\tdefaults: T,\n\targsArray: IArguments,\n\tkeys: Array<keyof T> = [],\n\tobjKey?: keyof T,\n): T {\n\tconst opts: Partial<T> = {};\n\tconst args = Array.from(argsArray);\n\t// if the first argument is an object and has an object key\n\tif (isObject(args[0]) && objKey && !Reflect.has(args[0], objKey)) {\n\t\t// if it's not part of the defaults\n\t\tconst partOfDefaults = Object.keys(args[0]).some(key => Reflect.has(defaults, key));\n\t\tif (!partOfDefaults) {\n\t\t\t// merge that key\n\t\t\tdeepMerge(opts, { [objKey]: args[0] });\n\t\t\t// remove the obj key from the keys\n\t\t\tkeys.splice(keys.indexOf(objKey), 1);\n\t\t\t// shift the first argument off\n\t\t\targs.shift();\n\t\t}\n\t}\n\tif (args.length === 1 && isObject(args[0])) {\n\t\tdeepMerge(opts, args[0]);\n\t} else {\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tif (isDefined(args[i])) {\n\t\t\t\topts[keys[i]] = args[i];\n\t\t\t}\n\t\t}\n\t}\n\treturn deepMerge(defaults, opts);\n}\n\n/**\n * Return this instances default values by calling Constructor.getDefaults()\n */\nexport function getDefaultsFromInstance<T>(instance: T): BaseToneOptions {\n\ttype ToneClass = {\n\t\tconstructor: ToneClass;\n\t\tgetDefaults: () => BaseToneOptions;\n\t} & T;\n\n\treturn (instance as ToneClass).constructor.getDefaults();\n}\n\n/**\n * Returns the fallback if the given object is undefined.\n * Take an array of arguments and return a formatted options object.\n */\nexport function defaultArg<T>(given: T, fallback: T): T {\n\tif (isUndef(given)) {\n\t\treturn fallback;\n\t} else {\n\t\treturn given;\n\t}\n}\n\n/**\n * Remove all of the properties belonging to omit from obj.\n */\nexport function omitFromObject<T extends object, O extends string[]>(obj: T, omit: O): Omit<T, keyof O> {\n\tomit.forEach(prop => {\n\t\tif (Reflect.has(obj, prop)) {\n\t\t\tdelete obj[prop];\n\t\t}\n\t});\n\treturn obj;\n}\n","/**\n * Tone.js\n * @author Yotam Mann\n * @license http://opensource.org/licenses/MIT MIT License\n * @copyright 2014-2019 Yotam Mann\n */\nimport { version } from \"../version\";\nimport { theWindow } from \"./context/AudioContext\";\nimport { log } from \"./util/Debug\";\n\n//-------------------------------------\n// \tTONE\n//-------------------------------------\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface BaseToneOptions { }\n\n/**\n * Tone is the base class of all other classes.\n * \n * @category Core\n * @constructor\n */\nexport abstract class Tone {\n\n\t/**\n\t * The version number semver\n\t */\n\tstatic version: string = version;\n\n\t/**\n\t * The name of the class\n\t */\n\tprotected abstract name: string;\n\n\t/**\n\t * Returns all of the default options belonging to the class.\n\t */\n\tstatic getDefaults(): BaseToneOptions {\n\t\treturn {};\n\t}\n\n\t//-------------------------------------\n\t// \tDEBUGGING\n\t//-------------------------------------\n\n\t/**\n\t * Set this debug flag to log all events that happen in this class.\n\t */\n\tdebug = false;\n\n\t/**\n\t * Prints the outputs to the console log for debugging purposes.\n\t * Prints the contents only if either the object has a property\n\t * called `debug` set to true, or a variable called TONE_DEBUG_CLASS\n\t * is set to the name of the class.\n\t * @example\n\t * const osc = new Tone.Oscillator();\n\t * // prints all logs originating from this oscillator\n\t * osc.debug = true;\n\t * // calls to start/stop will print in the console\n\t * osc.start();\n\t */\n\tprotected log(...args: any[]): void {\n\t\t// if the object is either set to debug = true\n\t\t// or if there is a string on the Tone.global.with the class name\n\t\tif (this.debug || (theWindow && this.toString() === theWindow.TONE_DEBUG_CLASS)) {\n\t\t\tlog(this, ...args);\n\t\t}\n\t}\n\n\t//-------------------------------------\n\t// \tDISPOSING\n\t//-------------------------------------\n\n\t/**\n\t * Indicates if the instance was disposed\n\t */\n\tprivate _wasDisposed = false;\n\n\t/**\n\t * disconnect and dispose.\n\t */\n\tdispose(): this {\n\t\tthis._wasDisposed = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Indicates if the instance was disposed. 'Disposing' an\n\t * instance means that all of the Web Audio nodes that were\n\t * created for the instance are disconnected and freed for garbage collection.\n\t */\n\tget disposed(): boolean {\n\t\treturn this._wasDisposed;\n\t}\n\n\t/**\n\t * Convert the class to a string\n\t * @example\n\t * const osc = new Tone.Oscillator();\n\t * console.log(osc.toString());\n\t */\n\ttoString(): string {\n\t\treturn this.name;\n\t}\n}\n","/**\n * The threshold for correctness for operators. Less than one sample even \n * at very high sampling rates (e.g. `1e-6 < 1 / 192000`).\n */\nconst EPSILON = 1e-6;\n\n/**\n * Test if A is greater than B\n */\nexport function GT(a: number, b: number): boolean {\n\treturn a > b + EPSILON;\n}\n\n/**\n * Test if A is greater than or equal to B\n */\nexport function GTE(a: number, b: number): boolean {\n\treturn GT(a, b) || EQ(a, b);\n}\n\n/**\n * Test if A is less than B\n */\nexport function LT(a: number, b: number): boolean {\n\treturn a + EPSILON < b;\n}\n\n/**\n * Test if A is less than B\n */\nexport function EQ(a: number, b: number): boolean {\n\treturn Math.abs(a - b) < EPSILON;\n}\n\n/**\n * Clamp the value within the given range\n */\nexport function clamp(value: number, min: number, max: number): number {\n\treturn Math.max(Math.min(value, max), min);\n}\n","import { Tone } from \"../Tone\";\nimport { Seconds } from \"../type/Units\";\nimport { optionsFromArguments } from \"./Defaults\";\nimport { assert } from \"./Debug\";\nimport { EQ, GT, GTE, LT } from \"./Math\";\n\ntype TimelineSearchParam = \"ticks\" | \"time\";\n\n/**\n * The options object for Timeline\n */\ninterface TimelineOptions {\n\tmemory: number;\n\tincreasing: boolean;\n}\n\n/**\n * An event must have a time number\n */\nexport interface TimelineEvent {\n\ttime: number;\n}\n\n/**\n * A Timeline class for scheduling and maintaining state\n * along a timeline. All events must have a \"time\" property.\n * Internally, events are stored in time order for fast\n * retrieval.\n */\nexport class Timeline<GenericEvent extends TimelineEvent> extends Tone {\n\n\treadonly name: string = \"Timeline\";\n\n\t/**\n\t * The memory of the timeline, i.e.\n\t * how many events in the past it will retain\n\t */\n\tmemory: number;\n\n\t/**\n\t * The array of scheduled timeline events\n\t */\n\tprotected _timeline: GenericEvent[] = [];\n\n\t/**\n\t * If the time value must always be greater than or equal to the last \n\t * element on the list. \n\t */\n\tincreasing: boolean;\n\n\t/**\n\t * @param memory The number of previous events that are retained.\n\t */\n\tconstructor(memory?: number);\n\tconstructor(options?: Partial<TimelineOptions>);\n\tconstructor() {\n\t\tsuper();\n\t\tconst options = optionsFromArguments(Timeline.getDefaults(), arguments, [\"memory\"]);\n\n\t\tthis.memory = options.memory;\n\t\tthis.increasing = options.increasing;\n\t}\n\n\tstatic getDefaults(): TimelineOptions {\n\t\treturn {\n\t\t\tmemory: Infinity,\n\t\t\tincreasing: false,\n\t\t};\n\t}\n\n\t/**\n\t * The number of items in the timeline.\n\t */\n\tget length(): number {\n\t\treturn this._timeline.length;\n\t}\n\n\t/**\n\t * Insert an event object onto the timeline. Events must have a \"time\" attribute.\n\t * @param event The event object to insert into the timeline.\n\t */\n\tadd(event: GenericEvent): this {\n\t\t// the event needs to have a time attribute\n\t\tassert(Reflect.has(event, \"time\"), \"Timeline: events must have a time attribute\");\n\t\tevent.time = event.time.valueOf();\n\t\tif (this.increasing && this.length) {\n\t\t\tconst lastValue = this._timeline[this.length - 1] as GenericEvent;\n\t\t\tassert(GTE(event.time, lastValue.time), \"The time must be greater than or equal to the last scheduled time\");\n\t\t\tthis._timeline.push(event);\n\t\t} else {\n\t\t\tconst index = this._search(event.time);\n\t\t\tthis._timeline.splice(index + 1, 0, event);\n\t\t}\n\t\t// if the length is more than the memory, remove the previous ones\n\t\tif (this.length > this.memory) {\n\t\t\tconst diff = this.length - this.memory;\n\t\t\tthis._timeline.splice(0, diff);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Remove an event from the timeline.\n\t * @param {Object} event The event object to remove from the list.\n\t * @returns {Timeline} this\n\t */\n\tremove(event: GenericEvent): this {\n\t\tconst index = this._timeline.indexOf(event);\n\t\tif (index !== -1) {\n\t\t\tthis._timeline.splice(index, 1);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get the nearest event whose time is less than or equal to the given time.\n\t * @param time The time to query.\n\t */\n\tget(time: number, param: TimelineSearchParam = \"time\"): GenericEvent | null {\n\t\tconst index = this._search(time, param);\n\t\tif (index !== -1) {\n\t\t\treturn this._timeline[index];\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Return the first event in the timeline without removing it\n\t * @returns {Object} The first event object\n\t */\n\tpeek(): GenericEvent | undefined {\n\t\treturn this._timeline[0];\n\t}\n\n\t/**\n\t * Return the first event in the timeline and remove it\n\t */\n\tshift(): GenericEvent | undefined {\n\t\treturn this._timeline.shift();\n\t}\n\n\t/**\n\t * Get the event which is scheduled after the given time.\n\t * @param time The time to query.\n\t */\n\tgetAfter(time: number, param: TimelineSearchParam = \"time\"): GenericEvent | null {\n\t\tconst index = this._search(time, param);\n\t\tif (index + 1 < this._timeline.length) {\n\t\t\treturn this._timeline[index + 1];\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the event before the event at the given time.\n\t * @param time The time to query.\n\t */\n\tgetBefore(time: number): GenericEvent | null {\n\t\tconst len = this._timeline.length;\n\t\t// if it's after the last item, return the last item\n\t\tif (len > 0 && this._timeline[len - 1].time < time) {\n\t\t\treturn this._timeline[len - 1];\n\t\t}\n\t\tconst index = this._search(time);\n\t\tif (index - 1 >= 0) {\n\t\t\treturn this._timeline[index - 1];\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Cancel events at and after the given time\n\t * @param after The time to query.\n\t */\n\tcancel(after: number): this {\n\t\tif (this._timeline.length > 1) {\n\t\t\tlet index = this._search(after);\n\t\t\tif (index >= 0) {\n\t\t\t\tif (EQ(this._timeline[index].time, after)) {\n\t\t\t\t\t// get the first item with that time\n\t\t\t\t\tfor (let i = index; i >= 0; i--) {\n\t\t\t\t\t\tif (EQ(this._timeline[i].time, after)) {\n\t\t\t\t\t\t\tindex = i;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis._timeline = this._timeline.slice(0, index);\n\t\t\t\t} else {\n\t\t\t\t\tthis._timeline = this._timeline.slice(0, index + 1);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis._timeline = [];\n\t\t\t}\n\t\t} else if (this._timeline.length === 1) {\n\t\t\t// the first item's time\n\t\t\tif (GTE(this._timeline[0].time, after)) {\n\t\t\t\tthis._timeline = [];\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Cancel events before or equal to the given time.\n\t * @param time The time to cancel before.\n\t */\n\tcancelBefore(time: number): this {\n\t\tconst index = this._search(time);\n\t\tif (index >= 0) {\n\t\t\tthis._timeline = this._timeline.slice(index + 1);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns the previous event if there is one. null otherwise\n\t * @param event The event to find the previous one of\n\t * @return The event right before the given event\n\t */\n\tpreviousEvent(event: GenericEvent): GenericEvent | null {\n\t\tconst index = this._timeline.indexOf(event);\n\t\tif (index > 0) {\n\t\t\treturn this._timeline[index - 1];\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Does a binary search on the timeline array and returns the\n\t * nearest event index whose time is after or equal to the given time.\n\t * If a time is searched before the first index in the timeline, -1 is returned.\n\t * If the time is after the end, the index of the last item is returned.\n\t */\n\tprotected _search(time: number, param: TimelineSearchParam = \"time\"): number {\n\t\tif (this._timeline.length === 0) {\n\t\t\treturn -1;\n\t\t}\n\t\tlet beginning = 0;\n\t\tconst len = this._timeline.length;\n\t\tlet end = len;\n\t\tif (len > 0 && this._timeline[len - 1][param] <= time) {\n\t\t\treturn len - 1;\n\t\t}\n\t\twhile (beginning < end) {\n\t\t\t// calculate the midpoint for roughly equal partition\n\t\t\tlet midPoint = Math.floor(beginning + (end - beginning) / 2);\n\t\t\tconst event = this._timeline[midPoint];\n\t\t\tconst nextEvent = this._timeline[midPoint + 1];\n\t\t\tif (EQ(event[param], time)) {\n\t\t\t\t// choose the last one that has the same time\n\t\t\t\tfor (let i = midPoint; i < this._timeline.length; i++) {\n\t\t\t\t\tconst testEvent = this._timeline[i];\n\t\t\t\t\tif (EQ(testEvent[param], time)) {\n\t\t\t\t\t\tmidPoint = i;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn midPoint;\n\t\t\t} else if (LT(event[param], time) && GT(nextEvent[param], time)) {\n\t\t\t\treturn midPoint;\n\t\t\t} else if (GT(event[param], time)) {\n\t\t\t\t// search lower\n\t\t\t\tend = midPoint;\n\t\t\t} else {\n\t\t\t\t// search upper\n\t\t\t\tbeginning = midPoint + 1;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\n\t/**\n\t * Internal iterator. Applies extra safety checks for\n\t * removing items from the array.\n\t */\n\tprivate _iterate(\n\t\tcallback: (event: GenericEvent) => void,\n\t\tlowerBound = 0, upperBound = this._timeline.length - 1,\n\t): void {\n\t\tthis._timeline.slice(lowerBound, upperBound + 1).forEach(callback);\n\t}\n\n\t/**\n\t * Iterate over everything in the array\n\t * @param callback The callback to invoke with every item\n\t */\n\tforEach(callback: (event: GenericEvent) => void): this {\n\t\tthis._iterate(callback);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Iterate over everything in the array at or before the given time.\n\t * @param time The time to check if items are before\n\t * @param callback The callback to invoke with every item\n\t */\n\tforEachBefore(time: Seconds, callback: (event: GenericEvent) => void): this {\n\t\t// iterate over the items in reverse so that removing an item doesn't break things\n\t\tconst upperBound = this._search(time);\n\t\tif (upperBound !== -1) {\n\t\t\tthis._iterate(callback, 0, upperBound);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Iterate over everything in the array after the given time.\n\t * @param time The time to check if items are before\n\t * @param callback The callback to invoke with every item\n\t */\n\tforEachAfter(time: Seconds, callback: (event: GenericEvent) => void): this {\n\t\t// iterate over the items in reverse so that removing an item doesn't break things\n\t\tconst lowerBound = this._search(time);\n\t\tthis._iterate(callback, lowerBound + 1);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Iterate over everything in the array between the startTime and endTime.\n\t * The timerange is inclusive of the startTime, but exclusive of the endTime.\n\t * range = [startTime, endTime).\n\t * @param startTime The time to check if items are before\n\t * @param endTime The end of the test interval.\n\t * @param callback The callback to invoke with every item\n\t */\n\tforEachBetween(startTime: number, endTime: number, callback: (event: GenericEvent) => void): this {\n\t\tlet lowerBound = this._search(startTime);\n\t\tlet upperBound = this._search(endTime);\n\t\tif (lowerBound !== -1 && upperBound !== -1) {\n\t\t\tif (this._timeline[lowerBound].time !== startTime) {\n\t\t\t\tlowerBound += 1;\n\t\t\t}\n\t\t\t// exclusive of the end time\n\t\t\tif (this._timeline[upperBound].time === endTime) {\n\t\t\t\tupperBound -= 1;\n\t\t\t}\n\t\t\tthis._iterate(callback, lowerBound, upperBound);\n\t\t} else if (lowerBound === -1) {\n\t\t\tthis._iterate(callback, 0, upperBound);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Iterate over everything in the array at or after the given time. Similar to\n\t * forEachAfter, but includes the item(s) at the given time.\n\t * @param time The time to check if items are before\n\t * @param callback The callback to invoke with every item\n\t */\n\tforEachFrom(time: number, callback: (event: GenericEvent) => void): this {\n\t\t// iterate over the items in reverse so that removing an item doesn't break things\n\t\tlet lowerBound = this._search(time);\n\t\t// work backwards until the event time is less than time\n\t\twhile (lowerBound >= 0 && this._timeline[lowerBound].time >= time) {\n\t\t\tlowerBound--;\n\t\t}\n\t\tthis._iterate(callback, lowerBound + 1);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Iterate over everything in the array at the given time\n\t * @param time The time to check if items are before\n\t * @param callback The callback to invoke with every item\n\t */\n\tforEachAtTime(time: number, callback: (event: GenericEvent) => void): this {\n\t\t// iterate over the items in reverse so that removing an item doesn't break things\n\t\tconst upperBound = this._search(time);\n\t\tif (upperBound !== -1 && EQ(this._timeline[upperBound].time, time)) {\n\t\t\tlet lowerBound = upperBound;\n\t\t\tfor (let i = upperBound; i >= 0; i--) {\n\t\t\t\tif (EQ(this._timeline[i].time, time)) {\n\t\t\t\t\tlowerBound = i;\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._iterate(event => {\n\t\t\t\tcallback(event);\n\t\t\t}, lowerBound, upperBound);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clean up.\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._timeline = [];\n\t\treturn this;\n\t}\n}\n","//-------------------------------------\n// INITIALIZING NEW CONTEXT\n//-------------------------------------\n\ntype Context = import(\"./Context\").Context;\n\n/**\n * Array of callbacks to invoke when a new context is created\n */\nconst notifyNewContext: Array<(ctx: Context) => void> = [];\n\n/**\n * Used internally to setup a new Context\n */\nexport function onContextInit(cb: (ctx: Context) => void): void {\n\tnotifyNewContext.push(cb);\n}\n\n/**\n * Invoke any classes which need to also be initialized when a new context is created.\n */\nexport function initializeContext(ctx: Context): void {\n\t// add any additional modules\n\tnotifyNewContext.forEach(cb => cb(ctx));\n}\n\n/**\n * Array of callbacks to invoke when a new context is closed\n */\nconst notifyCloseContext: Array<(ctx: Context) => void> = [];\n\n/**\n * Used internally to tear down a Context\n */\nexport function onContextClose(cb: (ctx: Context) => void): void {\n\tnotifyCloseContext.push(cb);\n}\n\nexport function closeContext(ctx: Context): void {\n\t// remove any additional modules\n\tnotifyCloseContext.forEach(cb => cb(ctx));\n}\n","import { Tone } from \"../Tone\";\nimport { isUndef } from \"./TypeCheck\";\n\nexport interface EmitterEventObject {\n\t[event: string]: Array<(...args: any[]) => void>;\n}\n\n/**\n * Emitter gives classes which extend it\n * the ability to listen for and emit events.\n * Inspiration and reference from Jerome Etienne's [MicroEvent](https://github.com/jeromeetienne/microevent.js).\n * MIT (c) 2011 Jerome Etienne.\n * @category Core\n */\nexport class Emitter<EventType extends string = string> extends Tone {\n\n\treadonly name: string = \"Emitter\";\n\n\t/**\n\t * Private container for the events\n\t */\n\tprivate _events?: EmitterEventObject;\n\n\t/**\n\t * Bind a callback to a specific event.\n\t * @param event The name of the event to listen for.\n\t * @param callback The callback to invoke when the event is emitted\n\t */\n\ton(event: EventType, callback: (...args: any[]) => void): this {\n\t\t// split the event\n\t\tconst events = event.split(/\\W+/);\n\t\tevents.forEach(eventName => {\n\t\t\tif (isUndef(this._events)) {\n\t\t\t\tthis._events = {};\n\t\t\t}\n\t\t\tif (!this._events.hasOwnProperty(eventName)) {\n\t\t\t\tthis._events[eventName] = [];\n\t\t\t}\n\t\t\tthis._events[eventName].push(callback);\n\t\t});\n\t\treturn this;\n\t}\n\n\t/**\n\t * Bind a callback which is only invoked once\n\t * @param event The name of the event to listen for.\n\t * @param callback The callback to invoke when the event is emitted\n\t */\n\tonce(event: EventType, callback: (...args: any[]) => void): this {\n\t\tconst boundCallback = (...args: any[]) => {\n\t\t\t// invoke the callback\n\t\t\tcallback(...args);\n\t\t\t// remove the event\n\t\t\tthis.off(event, boundCallback);\n\t\t};\n\t\tthis.on(event, boundCallback);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Remove the event listener.\n\t * @param event The event to stop listening to.\n\t * @param callback The callback which was bound to the event with Emitter.on.\n\t * If no callback is given, all callbacks events are removed.\n\t */\n\toff(event: EventType, callback?: (...args: any[]) => void): this {\n\t\tconst events = event.split(/\\W+/);\n\t\tevents.forEach(eventName => {\n\t\t\tif (isUndef(this._events)) {\n\t\t\t\tthis._events = {};\n\t\t\t}\n\t\t\tif (this._events.hasOwnProperty(eventName)) {\n\t\t\t\tif (isUndef(callback)) {\n\t\t\t\t\tthis._events[eventName] = [];\n\t\t\t\t} else {\n\t\t\t\t\tconst eventList = this._events[eventName];\n\t\t\t\t\tfor (let i = eventList.length - 1; i >= 0; i--) {\n\t\t\t\t\t\tif (eventList[i] === callback) {\n\t\t\t\t\t\t\teventList.splice(i, 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn this;\n\t}\n\n\t/**\n\t * Invoke all of the callbacks bound to the event\n\t * with any arguments passed in.\n\t * @param event The name of the event.\n\t * @param args The arguments to pass to the functions listening.\n\t */\n\temit(event, ...args: any[]): this {\n\t\tif (this._events) {\n\t\t\tif (this._events.hasOwnProperty(event)) {\n\t\t\t\tconst eventList = this._events[event].slice(0);\n\t\t\t\tfor (let i = 0, len = eventList.length; i < len; i++) {\n\t\t\t\t\teventList[i].apply(this, args);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Add Emitter functions (on/off/emit) to the object\n\t */\n\tstatic mixin(constr: any): void {\n\t\t// instance._events = {};\n\t\t[\"on\", \"once\", \"off\", \"emit\"].forEach(name => {\n\t\t\tconst property = Object.getOwnPropertyDescriptor(Emitter.prototype, name) as PropertyDescriptor;\n\t\t\tObject.defineProperty(constr.prototype, name, property);\n\t\t});\n\t}\n\n\t/**\n\t * Clean up\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._events = undefined;\n\t\treturn this;\n\t}\n}\n","import { Seconds } from \"../type/Units\";\nimport { Emitter } from \"../util/Emitter\";\nimport { AnyAudioContext } from \"./AudioContext\";\n\ntype Draw = import(\"../util/Draw\").Draw;\ntype Destination = import(\"./Destination\").Destination;\ntype Transport = import(\"../clock/Transport\").Transport;\ntype Listener = import(\"./Listener\").Listener;\n\n// these are either not used in Tone.js or deprecated and not implemented.\nexport type ExcludedFromBaseAudioContext =\n\t| \"onstatechange\"\n\t| \"addEventListener\"\n\t| \"removeEventListener\"\n\t| \"listener\"\n\t| \"dispatchEvent\"\n\t| \"audioWorklet\"\n\t| \"destination\"\n\t| \"createScriptProcessor\";\n\n// the subset of the BaseAudioContext which Tone.Context implements.\nexport type BaseAudioContextSubset = Omit<\nBaseAudioContext,\nExcludedFromBaseAudioContext\n>;\n\nexport type ContextLatencyHint = AudioContextLatencyCategory;\n\nexport abstract class BaseContext\n\textends Emitter<\"statechange\" | \"tick\">\n\timplements BaseAudioContextSubset {\n\t//---------------------------\n\t// BASE AUDIO CONTEXT METHODS\n\t//---------------------------\n\tabstract createAnalyser(): AnalyserNode;\n\n\tabstract createOscillator(): OscillatorNode;\n\n\tabstract createBufferSource(): AudioBufferSourceNode;\n\n\tabstract createBiquadFilter(): BiquadFilterNode;\n\n\tabstract createBuffer(\n\t\t_numberOfChannels: number,\n\t\t_length: number,\n\t\t_sampleRate: number\n\t): AudioBuffer;\n\n\tabstract createChannelMerger(\n\t\t_numberOfInputs?: number | undefined\n\t): ChannelMergerNode;\n\n\tabstract createChannelSplitter(\n\t\t_numberOfOutputs?: number | undefined\n\t): ChannelSplitterNode;\n\n\tabstract createConstantSource(): ConstantSourceNode;\n\n\tabstract createConvolver(): ConvolverNode;\n\n\tabstract createDelay(_maxDelayTime?: number | undefined): DelayNode;\n\n\tabstract createDynamicsCompressor(): DynamicsCompressorNode;\n\n\tabstract createGain(): GainNode;\n\n\tabstract createIIRFilter(\n\t\t_feedForward: number[] | Float32Array,\n\t\t_feedback: number[] | Float32Array\n\t): IIRFilterNode;\n\n\tabstract createPanner(): PannerNode;\n\n\tabstract createPeriodicWave(\n\t\t_real: number[] | Float32Array,\n\t\t_imag: number[] | Float32Array,\n\t\t_constraints?: PeriodicWaveConstraints | undefined\n\t): PeriodicWave;\n\n\tabstract createStereoPanner(): StereoPannerNode;\n\n\tabstract createWaveShaper(): WaveShaperNode;\n\n\tabstract createMediaStreamSource(\n\t\t_stream: MediaStream\n\t): MediaStreamAudioSourceNode;\n\n\tabstract createMediaElementSource(\n\t\t_element: HTMLMediaElement\n\t): MediaElementAudioSourceNode;\n\n\tabstract createMediaStreamDestination(): MediaStreamAudioDestinationNode;\n\n\tabstract decodeAudioData(_audioData: ArrayBuffer): Promise<AudioBuffer>;\n\n\t//---------------------------\n\t// TONE AUDIO CONTEXT METHODS\n\t//---------------------------\n\n\tabstract createAudioWorkletNode(\n\t\t_name: string,\n\t\t_options?: Partial<AudioWorkletNodeOptions>\n\t): AudioWorkletNode;\n\n\tabstract get rawContext(): AnyAudioContext;\n\n\tabstract async addAudioWorkletModule(\n\t\t_url: string,\n\t\t_name: string\n\t): Promise<void>;\n\n\tabstract lookAhead: number;\n\n\tabstract latencyHint: ContextLatencyHint | Seconds;\n\n\tabstract resume(): Promise<void>;\n\n\tabstract setTimeout(\n\t\t_fn: (...args: any[]) => void,\n\t\t_timeout: Seconds\n\t): number;\n\n\tabstract clearTimeout(_id: number): this;\n\n\tabstract setInterval(\n\t\t_fn: (...args: any[]) => void,\n\t\t_interval: Seconds\n\t): number;\n\n\tabstract clearInterval(_id: number): this;\n\n\tabstract getConstant(_val: number): AudioBufferSourceNode;\n\n\tabstract get currentTime(): Seconds;\n\n\tabstract get state(): AudioContextState;\n\n\tabstract get sampleRate(): number;\n\n\tabstract get listener(): Listener;\n\n\tabstract get transport(): Transport;\n\n\tabstract get draw(): Draw;\n\n\tabstract get destination(): Destination;\n\n\tabstract now(): Seconds;\n\n\tabstract immediate(): Seconds;\n\n\t/*\n\t * This is a placeholder so that JSON.stringify does not throw an error\n\t * This matches what JSON.stringify(audioContext) returns on a native\n\t * audioContext instance.\n\t */\n\ttoJSON(): Record<string, any> {\n\t\treturn {};\n\t}\n\n\treadonly isOffline: boolean = false;\n}\n","import { Ticker, TickerClockSource } from \"../clock/Ticker\";\nimport { Seconds } from \"../type/Units\";\nimport { isAudioContext } from \"../util/AdvancedTypeCheck\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { Timeline } from \"../util/Timeline\";\nimport { isDefined, isString } from \"../util/TypeCheck\";\nimport {\n\tAnyAudioContext,\n\tcreateAudioContext,\n\tcreateAudioWorkletNode,\n} from \"./AudioContext\";\nimport { closeContext, initializeContext } from \"./ContextInitialization\";\nimport { BaseContext, ContextLatencyHint } from \"./BaseContext\";\nimport { assert } from \"../util/Debug\";\n\ntype Transport = import(\"../clock/Transport\").Transport;\ntype Destination = import(\"./Destination\").Destination;\ntype Listener = import(\"./Listener\").Listener;\ntype Draw = import(\"../util/Draw\").Draw;\n\nexport interface ContextOptions {\n\tclockSource: TickerClockSource;\n\tlatencyHint: ContextLatencyHint;\n\tlookAhead: Seconds;\n\tupdateInterval: Seconds;\n\tcontext: AnyAudioContext;\n}\n\nexport interface ContextTimeoutEvent {\n\tcallback: (...args: any[]) => void;\n\tid: number;\n\ttime: Seconds;\n}\n\n/**\n * Wrapper around the native AudioContext.\n * @category Core\n */\nexport class Context extends BaseContext {\n\treadonly name: string = \"Context\";\n\n\t/**\n\t * The amount of time into the future events are scheduled. Giving Web Audio\n\t * a short amount of time into the future to schedule events can reduce clicks and\n\t * improve performance. This value can be set to 0 to get the lowest latency.\n\t */\n\tlookAhead: Seconds;\n\n\t/**\n\t * private reference to the BaseAudioContext\n\t */\n\tprotected readonly _context: AnyAudioContext;\n\n\t/**\n\t * A reliable callback method\n\t */\n\tprivate readonly _ticker: Ticker;\n\n\t/**\n\t * The default latency hint\n\t */\n\tprivate _latencyHint!: ContextLatencyHint | Seconds;\n\n\t/**\n\t * An object containing all of the constants AudioBufferSourceNodes\n\t */\n\tprivate _constants = new Map<number, AudioBufferSourceNode>();\n\n\t/**\n\t * All of the setTimeout events.\n\t */\n\tprivate _timeouts: Timeline<ContextTimeoutEvent> = new Timeline();\n\n\t/**\n\t * The timeout id counter\n\t */\n\tprivate _timeoutIds = 0;\n\n\t/**\n\t * A reference the Transport singleton belonging to this context\n\t */\n\tprivate _transport!: Transport;\n\n\t/**\n\t * A reference the Listener singleton belonging to this context\n\t */\n\tprivate _listener!: Listener;\n\n\t/**\n\t * A reference the Destination singleton belonging to this context\n\t */\n\tprivate _destination!: Destination;\n\n\t/**\n\t * A reference the Transport singleton belonging to this context\n\t */\n\tprivate _draw!: Draw;\n\n\t/**\n\t * Private indicator if the context has been initialized\n\t */\n\tprivate _initialized = false;\n\n\t/**\n\t * Indicates if the context is an OfflineAudioContext or an AudioContext\n\t */\n\treadonly isOffline: boolean = false;\n\n\tconstructor(context?: AnyAudioContext);\n\tconstructor(options?: Partial<ContextOptions>);\n\tconstructor() {\n\t\tsuper();\n\t\tconst options = optionsFromArguments(Context.getDefaults(), arguments, [\n\t\t\t\"context\",\n\t\t]);\n\n\t\tif (options.context) {\n\t\t\tthis._context = options.context;\n\t\t} else {\n\t\t\tthis._context = createAudioContext({\n\t\t\t\tlatencyHint: options.latencyHint,\n\t\t\t});\n\t\t}\n\n\t\tthis._ticker = new Ticker(\n\t\t\tthis.emit.bind(this, \"tick\"),\n\t\t\toptions.clockSource,\n\t\t\toptions.updateInterval\n\t\t);\n\t\tthis.on(\"tick\", this._timeoutLoop.bind(this));\n\n\t\t// fwd events from the context\n\t\tthis._context.onstatechange = () => {\n\t\t\tthis.emit(\"statechange\", this.state);\n\t\t};\n\n\t\tthis._setLatencyHint(options.latencyHint);\n\t\tthis.lookAhead = options.lookAhead;\n\t}\n\n\tstatic getDefaults(): ContextOptions {\n\t\treturn {\n\t\t\tclockSource: \"worker\",\n\t\t\tlatencyHint: \"interactive\",\n\t\t\tlookAhead: 0.1,\n\t\t\tupdateInterval: 0.05,\n\t\t} as ContextOptions;\n\t}\n\n\t/**\n\t * Finish setting up the context. **You usually do not need to do this manually.**\n\t */\n\tprivate initialize(): this {\n\t\tif (!this._initialized) {\n\t\t\t// add any additional modules\n\t\t\tinitializeContext(this);\n\t\t\tthis._initialized = true;\n\t\t}\n\t\treturn this;\n\t}\n\n\t//---------------------------\n\t// BASE AUDIO CONTEXT METHODS\n\t//---------------------------\n\n\tcreateAnalyser(): AnalyserNode {\n\t\treturn this._context.createAnalyser();\n\t}\n\tcreateOscillator(): OscillatorNode {\n\t\treturn this._context.createOscillator();\n\t}\n\tcreateBufferSource(): AudioBufferSourceNode {\n\t\treturn this._context.createBufferSource();\n\t}\n\tcreateBiquadFilter(): BiquadFilterNode {\n\t\treturn this._context.createBiquadFilter();\n\t}\n\tcreateBuffer(\n\t\tnumberOfChannels: number,\n\t\tlength: number,\n\t\tsampleRate: number\n\t): AudioBuffer {\n\t\treturn this._context.createBuffer(numberOfChannels, length, sampleRate);\n\t}\n\tcreateChannelMerger(\n\t\tnumberOfInputs?: number | undefined\n\t): ChannelMergerNode {\n\t\treturn this._context.createChannelMerger(numberOfInputs);\n\t}\n\tcreateChannelSplitter(\n\t\tnumberOfOutputs?: number | undefined\n\t): ChannelSplitterNode {\n\t\treturn this._context.createChannelSplitter(numberOfOutputs);\n\t}\n\tcreateConstantSource(): ConstantSourceNode {\n\t\treturn this._context.createConstantSource();\n\t}\n\tcreateConvolver(): ConvolverNode {\n\t\treturn this._context.createConvolver();\n\t}\n\tcreateDelay(maxDelayTime?: number | undefined): DelayNode {\n\t\treturn this._context.createDelay(maxDelayTime);\n\t}\n\tcreateDynamicsCompressor(): DynamicsCompressorNode {\n\t\treturn this._context.createDynamicsCompressor();\n\t}\n\tcreateGain(): GainNode {\n\t\treturn this._context.createGain();\n\t}\n\tcreateIIRFilter(\n\t\tfeedForward: number[] | Float32Array,\n\t\tfeedback: number[] | Float32Array\n\t): IIRFilterNode {\n\t\t// @ts-ignore\n\t\treturn this._context.createIIRFilter(feedForward, feedback);\n\t}\n\tcreatePanner(): PannerNode {\n\t\treturn this._context.createPanner();\n\t}\n\tcreatePeriodicWave(\n\t\treal: number[] | Float32Array,\n\t\timag: number[] | Float32Array,\n\t\tconstraints?: PeriodicWaveConstraints | undefined\n\t): PeriodicWave {\n\t\treturn this._context.createPeriodicWave(real, imag, constraints);\n\t}\n\tcreateStereoPanner(): StereoPannerNode {\n\t\treturn this._context.createStereoPanner();\n\t}\n\tcreateWaveShaper(): WaveShaperNode {\n\t\treturn this._context.createWaveShaper();\n\t}\n\tcreateMediaStreamSource(stream: MediaStream): MediaStreamAudioSourceNode {\n\t\tassert(\n\t\t\tisAudioContext(this._context),\n\t\t\t\"Not available if OfflineAudioContext\"\n\t\t);\n\t\tconst context = this._context as AudioContext;\n\t\treturn context.createMediaStreamSource(stream);\n\t}\n\tcreateMediaElementSource(\n\t\telement: HTMLMediaElement\n\t): MediaElementAudioSourceNode {\n\t\tassert(\n\t\t\tisAudioContext(this._context),\n\t\t\t\"Not available if OfflineAudioContext\"\n\t\t);\n\t\tconst context = this._context as AudioContext;\n\t\treturn context.createMediaElementSource(element);\n\t}\n\tcreateMediaStreamDestination(): MediaStreamAudioDestinationNode {\n\t\tassert(\n\t\t\tisAudioContext(this._context),\n\t\t\t\"Not available if OfflineAudioContext\"\n\t\t);\n\t\tconst context = this._context as AudioContext;\n\t\treturn context.createMediaStreamDestination();\n\t}\n\tdecodeAudioData(audioData: ArrayBuffer): Promise<AudioBuffer> {\n\t\treturn this._context.decodeAudioData(audioData);\n\t}\n\n\t/**\n\t * The current time in seconds of the AudioContext.\n\t */\n\tget currentTime(): Seconds {\n\t\treturn this._context.currentTime;\n\t}\n\t/**\n\t * The current time in seconds of the AudioContext.\n\t */\n\tget state(): AudioContextState {\n\t\treturn this._context.state;\n\t}\n\t/**\n\t * The current time in seconds of the AudioContext.\n\t */\n\tget sampleRate(): number {\n\t\treturn this._context.sampleRate;\n\t}\n\n\t/**\n\t * The listener\n\t */\n\tget listener(): Listener {\n\t\tthis.initialize();\n\t\treturn this._listener;\n\t}\n\tset listener(l) {\n\t\tassert(\n\t\t\t!this._initialized,\n\t\t\t\"The listener cannot be set after initialization.\"\n\t\t);\n\t\tthis._listener = l;\n\t}\n\n\t/**\n\t * There is only one Transport per Context. It is created on initialization.\n\t */\n\tget transport(): Transport {\n\t\tthis.initialize();\n\t\treturn this._transport;\n\t}\n\tset transport(t: Transport) {\n\t\tassert(\n\t\t\t!this._initialized,\n\t\t\t\"The transport cannot be set after initialization.\"\n\t\t);\n\t\tthis._transport = t;\n\t}\n\n\t/**\n\t * This is the Draw object for the context which is useful for synchronizing the draw frame with the Tone.js clock.\n\t */\n\tget draw(): Draw {\n\t\tthis.initialize();\n\t\treturn this._draw;\n\t}\n\tset draw(d) {\n\t\tassert(!this._initialized, \"Draw cannot be set after initialization.\");\n\t\tthis._draw = d;\n\t}\n\n\t/**\n\t * A reference to the Context's destination node.\n\t */\n\tget destination(): Destination {\n\t\tthis.initialize();\n\t\treturn this._destination;\n\t}\n\tset destination(d: Destination) {\n\t\tassert(\n\t\t\t!this._initialized,\n\t\t\t\"The destination cannot be set after initialization.\"\n\t\t);\n\t\tthis._destination = d;\n\t}\n\n\t//--------------------------------------------\n\t// AUDIO WORKLET\n\t//--------------------------------------------\n\n\t/**\n\t * Maps a module name to promise of the addModule method\n\t */\n\tprivate _workletModules: Map<string, Promise<void>> = new Map();\n\n\t/**\n\t * Create an audio worklet node from a name and options. The module\n\t * must first be loaded using [[addAudioWorkletModule]].\n\t */\n\tcreateAudioWorkletNode(\n\t\tname: string,\n\t\toptions?: Partial<AudioWorkletNodeOptions>\n\t): AudioWorkletNode {\n\t\treturn createAudioWorkletNode(this.rawContext, name, options);\n\t}\n\n\t/**\n\t * Add an AudioWorkletProcessor module\n\t * @param url The url of the module\n\t * @param name The name of the module\n\t */\n\tasync addAudioWorkletModule(url: string, name: string): Promise<void> {\n\t\tassert(\n\t\t\tisDefined(this.rawContext.audioWorklet),\n\t\t\t\"AudioWorkletNode is only available in a secure context (https or localhost)\"\n\t\t);\n\t\tif (!this._workletModules.has(name)) {\n\t\t\tthis._workletModules.set(\n\t\t\t\tname,\n\t\t\t\tthis.rawContext.audioWorklet.addModule(url)\n\t\t\t);\n\t\t}\n\t\tawait this._workletModules.get(name);\n\t}\n\n\t/**\n\t * Returns a promise which resolves when all of the worklets have been loaded on this context\n\t */\n\tprotected async workletsAreReady(): Promise<void> {\n\t\tconst promises: Promise<void>[] = [];\n\t\tthis._workletModules.forEach((promise) => promises.push(promise));\n\t\tawait Promise.all(promises);\n\t}\n\n\t//---------------------------\n\t// TICKER\n\t//---------------------------\n\n\t/**\n\t * How often the interval callback is invoked.\n\t * This number corresponds to how responsive the scheduling\n\t * can be. context.updateInterval + context.lookAhead gives you the\n\t * total latency between scheduling an event and hearing it.\n\t */\n\tget updateInterval(): Seconds {\n\t\treturn this._ticker.updateInterval;\n\t}\n\tset updateInterval(interval: Seconds) {\n\t\tthis._ticker.updateInterval = interval;\n\t}\n\n\t/**\n\t * What the source of the clock is, either \"worker\" (default),\n\t * \"timeout\", or \"offline\" (none).\n\t */\n\tget clockSource(): TickerClockSource {\n\t\treturn this._ticker.type;\n\t}\n\tset clockSource(type: TickerClockSource) {\n\t\tthis._ticker.type = type;\n\t}\n\n\t/**\n\t * The type of playback, which affects tradeoffs between audio\n\t * output latency and responsiveness.\n\t * In addition to setting the value in seconds, the latencyHint also\n\t * accepts the strings \"interactive\" (prioritizes low latency),\n\t * \"playback\" (prioritizes sustained playback), \"balanced\" (balances\n\t * latency and performance).\n\t * @example\n\t * // prioritize sustained playback\n\t * const context = new Tone.Context({ latencyHint: \"playback\" });\n\t * // set this context as the global Context\n\t * Tone.setContext(context);\n\t * // the global context is gettable with Tone.getContext()\n\t * console.log(Tone.getContext().latencyHint);\n\t */\n\tget latencyHint(): ContextLatencyHint | Seconds {\n\t\treturn this._latencyHint;\n\t}\n\n\t/**\n\t * Update the lookAhead and updateInterval based on the latencyHint\n\t */\n\tprivate _setLatencyHint(hint: ContextLatencyHint | Seconds): void {\n\t\tlet lookAheadValue = 0;\n\t\tthis._latencyHint = hint;\n\t\tif (isString(hint)) {\n\t\t\tswitch (hint) {\n\t\t\t\tcase \"interactive\":\n\t\t\t\t\tlookAheadValue = 0.1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"playback\":\n\t\t\t\t\tlookAheadValue = 0.5;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"balanced\":\n\t\t\t\t\tlookAheadValue = 0.25;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.lookAhead = lookAheadValue;\n\t\tthis.updateInterval = lookAheadValue / 2;\n\t}\n\n\t/**\n\t * The unwrapped AudioContext or OfflineAudioContext\n\t */\n\tget rawContext(): AnyAudioContext {\n\t\treturn this._context;\n\t}\n\n\t/**\n\t * The current audio context time plus a short [[lookAhead]].\n\t */\n\tnow(): Seconds {\n\t\treturn this._context.currentTime + this.lookAhead;\n\t}\n\n\t/**\n\t * The current audio context time without the [[lookAhead]].\n\t * In most cases it is better to use [[now]] instead of [[immediate]] since\n\t * with [[now]] the [[lookAhead]] is applied equally to _all_ components including internal components,\n\t * to making sure that everything is scheduled in sync. Mixing [[now]] and [[immediate]]\n\t * can cause some timing issues. If no lookAhead is desired, you can set the [[lookAhead]] to `0`.\n\t */\n\timmediate(): Seconds {\n\t\treturn this._context.currentTime;\n\t}\n\n\t/**\n\t * Starts the audio context from a suspended state. This is required\n\t * to initially start the AudioContext. See [[Tone.start]]\n\t */\n\tresume(): Promise<void> {\n\t\tif (isAudioContext(this._context)) {\n\t\t\treturn this._context.resume();\n\t\t} else {\n\t\t\treturn Promise.resolve();\n\t\t}\n\t}\n\n\t/**\n\t * Close the context. Once closed, the context can no longer be used and\n\t * any AudioNodes created from the context will be silent.\n\t */\n\tasync close(): Promise<void> {\n\t\tif (isAudioContext(this._context)) {\n\t\t\tawait this._context.close();\n\t\t}\n\t\tif (this._initialized) {\n\t\t\tcloseContext(this);\n\t\t}\n\t}\n\n\t/**\n\t * **Internal** Generate a looped buffer at some constant value.\n\t */\n\tgetConstant(val: number): AudioBufferSourceNode {\n\t\tif (this._constants.has(val)) {\n\t\t\treturn this._constants.get(val) as AudioBufferSourceNode;\n\t\t} else {\n\t\t\tconst buffer = this._context.createBuffer(\n\t\t\t\t1,\n\t\t\t\t128,\n\t\t\t\tthis._context.sampleRate\n\t\t\t);\n\t\t\tconst arr = buffer.getChannelData(0);\n\t\t\tfor (let i = 0; i < arr.length; i++) {\n\t\t\t\tarr[i] = val;\n\t\t\t}\n\t\t\tconst constant = this._context.createBufferSource();\n\t\t\tconstant.channelCount = 1;\n\t\t\tconstant.channelCountMode = \"explicit\";\n\t\t\tconstant.buffer = buffer;\n\t\t\tconstant.loop = true;\n\t\t\tconstant.start(0);\n\t\t\tthis._constants.set(val, constant);\n\t\t\treturn constant;\n\t\t}\n\t}\n\n\t/**\n\t * Clean up. Also closes the audio context.\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._ticker.dispose();\n\t\tthis._timeouts.dispose();\n\t\tObject.keys(this._constants).map((val) =>\n\t\t\tthis._constants[val].disconnect()\n\t\t);\n\t\treturn this;\n\t}\n\n\t//---------------------------\n\t// TIMEOUTS\n\t//---------------------------\n\n\t/**\n\t * The private loop which keeps track of the context scheduled timeouts\n\t * Is invoked from the clock source\n\t */\n\tprivate _timeoutLoop(): void {\n\t\tconst now = this.now();\n\t\tlet firstEvent = this._timeouts.peek();\n\t\twhile (this._timeouts.length && firstEvent && firstEvent.time <= now) {\n\t\t\t// invoke the callback\n\t\t\tfirstEvent.callback();\n\t\t\t// shift the first event off\n\t\t\tthis._timeouts.shift();\n\t\t\t// get the next one\n\t\t\tfirstEvent = this._timeouts.peek();\n\t\t}\n\t}\n\n\t/**\n\t * A setTimeout which is guaranteed by the clock source.\n\t * Also runs in the offline context.\n\t * @param fn The callback to invoke\n\t * @param timeout The timeout in seconds\n\t * @returns ID to use when invoking Context.clearTimeout\n\t */\n\tsetTimeout(fn: (...args: any[]) => void, timeout: Seconds): number {\n\t\tthis._timeoutIds++;\n\t\tconst now = this.now();\n\t\tthis._timeouts.add({\n\t\t\tcallback: fn,\n\t\t\tid: this._timeoutIds,\n\t\t\ttime: now + timeout,\n\t\t});\n\t\treturn this._timeoutIds;\n\t}\n\n\t/**\n\t * Clears a previously scheduled timeout with Tone.context.setTimeout\n\t * @param id The ID returned from setTimeout\n\t */\n\tclearTimeout(id: number): this {\n\t\tthis._timeouts.forEach((event) => {\n\t\t\tif (event.id === id) {\n\t\t\t\tthis._timeouts.remove(event);\n\t\t\t}\n\t\t});\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clear the function scheduled by [[setInterval]]\n\t */\n\tclearInterval(id: number): this {\n\t\treturn this.clearTimeout(id);\n\t}\n\n\t/**\n\t * Adds a repeating event to the context's callback clock\n\t */\n\tsetInterval(fn: (...args: any[]) => void, interval: Seconds): number {\n\t\tconst id = ++this._timeoutIds;\n\t\tconst intervalFn = () => {\n\t\t\tconst now = this.now();\n\t\t\tthis._timeouts.add({\n\t\t\t\tcallback: () => {\n\t\t\t\t\t// invoke the callback\n\t\t\t\t\tfn();\n\t\t\t\t\t// invoke the event to repeat it\n\t\t\t\t\tintervalFn();\n\t\t\t\t},\n\t\t\t\tid,\n\t\t\t\ttime: now + interval,\n\t\t\t});\n\t\t};\n\t\t// kick it off\n\t\tintervalFn();\n\t\treturn id;\n\t}\n}\n","import { isArray } from \"./TypeCheck\";\n\n// return an interface which excludes certain keys\nexport type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;\n\n/**\n * Make the property not writable using `defineProperty`. Internal use only.\n */\nexport function readOnly(target: object, property: string | string[]): void {\n\tif (isArray(property)) {\n\t\tproperty.forEach(str => readOnly(target, str));\n\t} else {\n\t\tObject.defineProperty(target, property, {\n\t\t\tenumerable: true,\n\t\t\twritable: false,\n\t\t});\n\t}\n}\n\n/**\n * Make an attribute writeable. Internal use only.\n */\nexport function writable(target: object, property: string | string[]): void {\n\tif (isArray(property)) {\n\t\tproperty.forEach(str => writable(target, str));\n\t} else {\n\t\tObject.defineProperty(target, property, {\n\t\t\twritable: true,\n\t\t});\n\t}\n}\n\nexport const noOp: (...args: any[]) => any = () => {\n\t// no operation here!\n};\n\n/**\n * Recursive Partial taken from here: https://stackoverflow.com/a/51365037\n */\nexport type RecursivePartial<T> = {\n\t[P in keyof T]?:\n\tT[P] extends Array<infer U> ? Array<RecursivePartial<U>> :\n\t\tT[P] extends object ? RecursivePartial<T[P]> :\n\t\t\tT[P];\n};\n","import { getContext } from \"../Global\";\nimport { Tone } from \"../Tone\";\nimport { Samples, Seconds } from \"../type/Units\";\nimport { isAudioBuffer } from \"../util/AdvancedTypeCheck\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { noOp } from \"../util/Interface\";\nimport { isArray, isNumber, isString } from \"../util/TypeCheck\";\nimport { assert } from \"../util/Debug\";\n\ninterface ToneAudioBufferOptions {\n\turl?: string | AudioBuffer | ToneAudioBuffer;\n\treverse: boolean;\n\tonload: (buffer?: ToneAudioBuffer) => void;\n\tonerror: (error: Error) => void;\n}\n\n/**\n * AudioBuffer loading and storage. ToneAudioBuffer is used internally by all\n * classes that make requests for audio files such as Tone.Player,\n * Tone.Sampler and Tone.Convolver.\n * @example\n * const buffer = new Tone.ToneAudioBuffer(\"https://tonejs.github.io/audio/casio/A1.mp3\", () => {\n * \tconsole.log(\"loaded\");\n * });\n * @category Core\n */\nexport class ToneAudioBuffer extends Tone {\n\n\treadonly name: string = \"ToneAudioBuffer\";\n\n\t/**\n\t * stores the loaded AudioBuffer\n\t */\n\tprivate _buffer?: AudioBuffer;\n\n\t/**\n\t * indicates if the buffer should be reversed or not\n\t */\n\tprivate _reversed!: boolean;\n\n\t/**\n\t * Callback when the buffer is loaded.\n\t */\n\tonload: (buffer: ToneAudioBuffer) => void = noOp;\n\n\t/**\n\t *\n\t * @param url The url to load, or the audio buffer to set.\n\t * @param onload A callback which is invoked after the buffer is loaded.\n\t * It's recommended to use `ToneAudioBuffer.on('load', callback)` instead\n\t * since it will give you a callback when _all_ buffers are loaded.\n\t * @param onerror The callback to invoke if there is an error\n\t */\n\tconstructor(\n\t\turl?: string | ToneAudioBuffer | AudioBuffer,\n\t\tonload?: (buffer: ToneAudioBuffer) => void,\n\t\tonerror?: (error: Error) => void,\n\t);\n\tconstructor(options?: Partial<ToneAudioBufferOptions>);\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tconst options = optionsFromArguments(ToneAudioBuffer.getDefaults(), arguments, [\"url\", \"onload\", \"onerror\"]);\n\n\t\tthis.reverse = options.reverse;\n\t\tthis.onload = options.onload;\n\n\t\tif (options.url && isAudioBuffer(options.url) || options.url instanceof ToneAudioBuffer) {\n\t\t\tthis.set(options.url);\n\t\t} else if (isString(options.url)) {\n\t\t\t// initiate the download\n\t\t\tthis.load(options.url).catch(options.onerror);\n\t\t}\n\t}\n\n\tstatic getDefaults(): ToneAudioBufferOptions {\n\t\treturn {\n\t\t\tonerror: noOp,\n\t\t\tonload: noOp,\n\t\t\treverse: false,\n\t\t};\n\t}\n\n\t/**\n\t * The sample rate of the AudioBuffer\n\t */\n\tget sampleRate(): number {\n\t\tif (this._buffer) {\n\t\t\treturn this._buffer.sampleRate;\n\t\t} else {\n\t\t\treturn getContext().sampleRate;\n\t\t}\n\t}\n\n\t/**\n\t * Pass in an AudioBuffer or ToneAudioBuffer to set the value of this buffer.\n\t */\n\tset(buffer: AudioBuffer | ToneAudioBuffer): this {\n\t\tif (buffer instanceof ToneAudioBuffer) {\n\t\t\t// if it's loaded, set it\n\t\t\tif (buffer.loaded) {\n\t\t\t\tthis._buffer = buffer.get();\n\t\t\t} else {\n\t\t\t\t// otherwise when it's loaded, invoke it's callback\n\t\t\t\tbuffer.onload = () => {\n\t\t\t\t\tthis.set(buffer);\n\t\t\t\t\tthis.onload(this);\n\t\t\t\t};\n\t\t\t}\n\t\t} else {\n\t\t\tthis._buffer = buffer;\n\t\t}\n\t\t// reverse it initially\n\t\tif (this._reversed) {\n\t\t\tthis._reverse();\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * The audio buffer stored in the object.\n\t */\n\tget(): AudioBuffer | undefined {\n\t\treturn this._buffer;\n\t}\n\n\t/**\n\t * Makes an fetch request for the selected url then decodes the file as an audio buffer.\n\t * Invokes the callback once the audio buffer loads.\n\t * @param url The url of the buffer to load. filetype support depends on the browser.\n\t * @returns A Promise which resolves with this ToneAudioBuffer\n\t */\n\tasync load(url: string): Promise<this> {\n\t\tconst doneLoading: Promise<void> = ToneAudioBuffer.load(url).then(audioBuffer => {\n\t\t\tthis.set(audioBuffer);\n\t\t\t// invoke the onload method\n\t\t\tthis.onload(this);\n\t\t});\n\t\tToneAudioBuffer.downloads.push(doneLoading);\n\t\ttry {\n\t\t\tawait doneLoading;\n\t\t} finally {\n\t\t\t// remove the downloaded file\n\t\t\tconst index = ToneAudioBuffer.downloads.indexOf(doneLoading);\n\t\t\tToneAudioBuffer.downloads.splice(index, 1);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * clean up\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._buffer = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the audio buffer from the array.\n\t * To create a multichannel AudioBuffer, pass in a multidimensional array.\n\t * @param array The array to fill the audio buffer\n\t */\n\tfromArray(array: Float32Array | Float32Array[]): this {\n\t\tconst isMultidimensional = isArray(array) && array[0].length > 0;\n\t\tconst channels = isMultidimensional ? array.length : 1;\n\t\tconst len = isMultidimensional ? (array[0] as Float32Array).length : array.length;\n\t\tconst context = getContext();\n\t\tconst buffer = context.createBuffer(channels, len, context.sampleRate);\n\t\tconst multiChannelArray: Float32Array[] = !isMultidimensional && channels === 1 ?\n\t\t\t[array as Float32Array] : array as Float32Array[];\n\n\t\tfor (let c = 0; c < channels; c++) {\n\t\t\tbuffer.copyToChannel(multiChannelArray[c], c);\n\t\t}\n\t\tthis._buffer = buffer;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sums multiple channels into 1 channel\n\t * @param chanNum Optionally only copy a single channel from the array.\n\t */\n\ttoMono(chanNum?: number): this {\n\t\tif (isNumber(chanNum)) {\n\t\t\tthis.fromArray(this.toArray(chanNum));\n\t\t} else {\n\t\t\tlet outputArray = new Float32Array(this.length as number);\n\t\t\tconst numChannels = this.numberOfChannels;\n\t\t\tfor (let channel = 0; channel < numChannels; channel++) {\n\t\t\t\tconst channelArray = this.toArray(channel) as Float32Array;\n\t\t\t\tfor (let i = 0; i < channelArray.length; i++) {\n\t\t\t\t\toutputArray[i] += channelArray[i];\n\t\t\t\t}\n\t\t\t}\n\t\t\t// divide by the number of channels\n\t\t\toutputArray = outputArray.map(sample => sample / numChannels);\n\t\t\tthis.fromArray(outputArray);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get the buffer as an array. Single channel buffers will return a 1-dimensional\n\t * Float32Array, and multichannel buffers will return multidimensional arrays.\n\t * @param channel Optionally only copy a single channel from the array.\n\t */\n\ttoArray(channel?: number): Float32Array | Float32Array[] {\n\t\tif (isNumber(channel)) {\n\t\t\treturn this.getChannelData(channel);\n\t\t} else if (this.numberOfChannels === 1) {\n\t\t\treturn this.toArray(0);\n\t\t} else {\n\t\t\tconst ret: Float32Array[] = [];\n\t\t\tfor (let c = 0; c < this.numberOfChannels; c++) {\n\t\t\t\tret[c] = this.getChannelData(c);\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t}\n\n\t/**\n\t * Returns the Float32Array representing the PCM audio data for the specific channel.\n\t * @param channel The channel number to return\n\t * @return The audio as a TypedArray\n\t */\n\tgetChannelData(channel: number): Float32Array {\n\t\tif (this._buffer) {\n\t\t\treturn this._buffer.getChannelData(channel);\n\t\t} else {\n\t\t\treturn new Float32Array(0);\n\t\t}\n\t}\n\n\t/**\n\t * Cut a subsection of the array and return a buffer of the\n\t * subsection. Does not modify the original buffer\n\t * @param start The time to start the slice\n\t * @param end The end time to slice. If none is given will default to the end of the buffer\n\t */\n\tslice(start: Seconds, end: Seconds = this.duration): ToneAudioBuffer {\n\t\tconst startSamples = Math.floor(start * this.sampleRate);\n\t\tconst endSamples = Math.floor(end * this.sampleRate);\n\t\tassert(startSamples < endSamples, \"The start time must be less than the end time\");\n\t\tconst length = endSamples - startSamples;\n\t\tconst retBuffer = getContext().createBuffer(this.numberOfChannels, length, this.sampleRate);\n\t\tfor (let channel = 0; channel < this.numberOfChannels; channel++) {\n\t\t\tretBuffer.copyToChannel(this.getChannelData(channel).subarray(startSamples, endSamples), channel);\n\t\t}\n\t\treturn new ToneAudioBuffer(retBuffer);\n\t}\n\n\t/**\n\t * Reverse the buffer.\n\t */\n\tprivate _reverse(): this {\n\t\tif (this.loaded) {\n\t\t\tfor (let i = 0; i < this.numberOfChannels; i++) {\n\t\t\t\tthis.getChannelData(i).reverse();\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * If the buffer is loaded or not\n\t */\n\tget loaded(): boolean {\n\t\treturn this.length > 0;\n\t}\n\n\t/**\n\t * The duration of the buffer in seconds.\n\t */\n\tget duration(): Seconds {\n\t\tif (this._buffer) {\n\t\t\treturn this._buffer.duration;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\t/**\n\t * The length of the buffer in samples\n\t */\n\tget length(): Samples {\n\t\tif (this._buffer) {\n\t\t\treturn this._buffer.length;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\t/**\n\t * The number of discrete audio channels. Returns 0 if no buffer is loaded.\n\t */\n\tget numberOfChannels(): number {\n\t\tif (this._buffer) {\n\t\t\treturn this._buffer.numberOfChannels;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\t/**\n\t * Reverse the buffer.\n\t */\n\tget reverse(): boolean {\n\t\treturn this._reversed;\n\t}\n\tset reverse(rev: boolean) {\n\t\tif (this._reversed !== rev) {\n\t\t\tthis._reversed = rev;\n\t\t\tthis._reverse();\n\t\t}\n\t}\n\n\t//-------------------------------------\n\t// STATIC METHODS\n\t//-------------------------------------\n\n\t/**\n\t * A path which is prefixed before every url.\n\t */\n\tstatic baseUrl = \"\";\n\n\t/**\n\t * Create a ToneAudioBuffer from the array. To create a multichannel AudioBuffer,\n\t * pass in a multidimensional array.\n\t * @param array The array to fill the audio buffer\n\t * @return A ToneAudioBuffer created from the array\n\t */\n\tstatic fromArray(array: Float32Array | Float32Array[]): ToneAudioBuffer {\n\t\treturn (new ToneAudioBuffer()).fromArray(array);\n\t}\n\n\t/**\n\t * Creates a ToneAudioBuffer from a URL, returns a promise which resolves to a ToneAudioBuffer\n\t * @param url The url to load.\n\t * @return A promise which resolves to a ToneAudioBuffer\n\t */\n\tstatic async fromUrl(url: string): Promise<ToneAudioBuffer> {\n\t\tconst buffer = new ToneAudioBuffer();\n\t\treturn await buffer.load(url);\n\t}\n\n\t/**\n\t * All of the downloads\n\t */\n\tstatic downloads: Array<Promise<void>> = [];\n\n\t/**\n\t * Loads a url using fetch and returns the AudioBuffer.\n\t */\n\tstatic async load(url: string): Promise<AudioBuffer> {\n\n\t\t// test if the url contains multiple extensions\n\t\tconst matches = url.match(/\\[([^\\]\\[]+\\|.+)\\]$/);\n\t\tif (matches) {\n\t\t\tconst extensions = matches[1].split(\"|\");\n\t\t\tlet extension = extensions[0];\n\t\t\tfor (const ext of extensions) {\n\t\t\t\tif (ToneAudioBuffer.supportsType(ext)) {\n\t\t\t\t\textension = ext;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\turl = url.replace(matches[0], extension);\n\t\t}\n\n\t\t// make sure there is a slash between the baseUrl and the url\n\t\tconst baseUrl = ToneAudioBuffer.baseUrl === \"\" || ToneAudioBuffer.baseUrl.endsWith(\"/\") ? ToneAudioBuffer.baseUrl : ToneAudioBuffer.baseUrl + \"/\";\n\t\tconst response = await fetch(baseUrl + url);\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`could not load url: ${url}`);\n\t\t}\n\t\tconst arrayBuffer = await response.arrayBuffer();\n\n\t\tconst audioBuffer = await getContext().decodeAudioData(arrayBuffer);\n\n\t\treturn audioBuffer;\n\t}\n\n\t/**\n\t * Checks a url's extension to see if the current browser can play that file type.\n\t * @param url The url/extension to test\n\t * @return If the file extension can be played\n\t * @static\n\t * @example\n\t * Tone.ToneAudioBuffer.supportsType(\"wav\"); // returns true\n\t * Tone.ToneAudioBuffer.supportsType(\"path/to/file.wav\"); // returns true\n\t */\n\tstatic supportsType(url: string): boolean {\n\t\tconst extensions = url.split(\".\");\n\t\tconst extension = extensions[extensions.length - 1];\n\t\tconst response = document.createElement(\"audio\").canPlayType(\"audio/\" + extension);\n\t\treturn response !== \"\";\n\t}\n\n\t/**\n\t * Returns a Promise which resolves when all of the buffers have loaded\n\t */\n\tstatic async loaded(): Promise<void> {\n\t\t// this makes sure that the function is always async\n\t\tawait Promise.resolve();\n\t\twhile (ToneAudioBuffer.downloads.length) {\n\t\t\tawait ToneAudioBuffer.downloads[0];\n\t\t}\n\t}\n}\n","import { createOfflineAudioContext } from \"../context/AudioContext\";\nimport { Context } from \"../context/Context\";\nimport { Seconds } from \"../type/Units\";\nimport { isOfflineAudioContext } from \"../util/AdvancedTypeCheck\";\nimport { ToneAudioBuffer } from \"./ToneAudioBuffer\";\n\n/**\n * Wrapper around the OfflineAudioContext\n * @category Core\n * @example\n * // generate a single channel, 0.5 second buffer\n * const context = new Tone.OfflineContext(1, 0.5, 44100);\n * const osc = new Tone.Oscillator({ context });\n * context.render().then(buffer => {\n * \tconsole.log(buffer.numberOfChannels, buffer.duration);\n * });\n */\nexport class OfflineContext extends Context {\n\n\treadonly name: string = \"OfflineContext\";\n\n\t/**\n\t * A private reference to the duration\n\t */\n\tprivate readonly _duration: Seconds;\n\n\t/**\n\t * An artificial clock source\n\t */\n\tprivate _currentTime: Seconds = 0;\n\n\t/**\n\t * Private reference to the OfflineAudioContext.\n\t */\n\tprotected _context!: OfflineAudioContext;\n\n\treadonly isOffline: boolean = true;\n\n\t/**\n\t * @param channels The number of channels to render\n\t * @param duration The duration to render in seconds\n\t * @param sampleRate the sample rate to render at\n\t */\n\tconstructor(\n\t\tchannels: number,\n\t\tduration: Seconds, \n\t\tsampleRate: number,\n\t);\n\tconstructor(context: OfflineAudioContext);\n\tconstructor() {\n\n\t\tsuper({\n\t\t\tclockSource: \"offline\",\n\t\t\tcontext: isOfflineAudioContext(arguments[0]) ?\n\t\t\t\targuments[0] : createOfflineAudioContext(arguments[0], arguments[1] * arguments[2], arguments[2]),\n\t\t\tlookAhead: 0,\n\t\t\tupdateInterval: isOfflineAudioContext(arguments[0]) ?\n\t\t\t\t128 / arguments[0].sampleRate : 128 / arguments[2],\n\t\t});\n\n\t\tthis._duration = isOfflineAudioContext(arguments[0]) ?\n\t\t\targuments[0].length / arguments[0].sampleRate : arguments[1];\n\t}\n\n\t/**\n\t * Override the now method to point to the internal clock time\n\t */\n\tnow(): Seconds {\n\t\treturn this._currentTime;\n\t}\n\n\t/**\n\t * Same as this.now()\n\t */\n\tget currentTime(): Seconds {\n\t\treturn this._currentTime;\n\t}\n\n\t/**\n\t * Render just the clock portion of the audio context.\n\t */\n\tprivate async _renderClock(asynchronous: boolean): Promise<void> {\n\t\tlet index = 0;\n\t\twhile (this._duration - this._currentTime >= 0) {\n\n\t\t\t// invoke all the callbacks on that time\n\t\t\tthis.emit(\"tick\");\n\n\t\t\t// increment the clock in block-sized chunks\n\t\t\tthis._currentTime += 128 / this.sampleRate;\n\n\t\t\t// yield once a second of audio\n\t\t\tindex++;\n\t\t\tconst yieldEvery = Math.floor(this.sampleRate / 128);\n\t\t\tif (asynchronous && index % yieldEvery === 0) {\n\t\t\t\tawait new Promise(done => setTimeout(done, 1));\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Render the output of the OfflineContext\n\t * @param asynchronous If the clock should be rendered asynchronously, which will not block the main thread, but be slightly slower.\n\t */\n\tasync render(asynchronous = true): Promise<ToneAudioBuffer> {\n\t\tawait this.workletsAreReady();\n\t\tawait this._renderClock(asynchronous);\n\t\tconst buffer = await this._context.startRendering();\n\t\treturn new ToneAudioBuffer(buffer);\n\t}\n\n\t/**\n\t * Close the context\n\t */\n\tclose(): Promise<void> {\n\t\treturn Promise.resolve();\n\t}\n}\n","import { version } from \"../version\";\nimport { AnyAudioContext, hasAudioContext, theWindow } from \"./context/AudioContext\";\nimport { Context } from \"./context/Context\";\nimport { DummyContext } from \"./context/DummyContext\";\nimport { BaseContext } from \"./context/BaseContext\";\nimport { OfflineContext } from \"./context/OfflineContext\";\nimport { isAudioContext, isOfflineAudioContext } from \"./util/AdvancedTypeCheck\";\n\n/**\n * This dummy context is used to avoid throwing immediate errors when importing in Node.js\n */\nconst dummyContext = new DummyContext();\n\n/**\n * The global audio context which is getable and assignable through\n * getContext and setContext\n */\nlet globalContext: BaseContext = dummyContext;\n\n/**\n * Returns the default system-wide [[Context]]\n * @category Core\n */\nexport function getContext(): BaseContext {\n\tif (globalContext === dummyContext && hasAudioContext) {\n\t\tsetContext(new Context());\n\t}\n\treturn globalContext;\n}\n\n/**\n * Set the default audio context\n * @category Core\n */\nexport function setContext(context: BaseContext | AnyAudioContext): void {\n\tif (isAudioContext(context)) {\n\t\tglobalContext = new Context(context);\n\t} else if (isOfflineAudioContext(context)) {\n\t\tglobalContext = new OfflineContext(context);\n\t} else {\n\t\tglobalContext = context;\n\t}\n}\n\n/**\n * Most browsers will not play _any_ audio until a user\n * clicks something (like a play button). Invoke this method\n * on a click or keypress event handler to start the audio context.\n * More about the Autoplay policy\n * [here](https://developers.google.com/web/updates/2017/09/autoplay-policy-changes#webaudio)\n * @example\n * document.querySelector(\"button\").addEventListener(\"click\", async () => {\n * \tawait Tone.start();\n * \tconsole.log(\"context started\");\n * });\n * @category Core\n */\nexport function start(): Promise<void> {\n\treturn globalContext.resume();\n}\n\n/**\n * Log Tone.js + version in the console.\n */\nif (theWindow && !theWindow.TONE_SILENCE_LOGGING) {\n\tlet prefix = \"v\";\n\tif (version === \"dev\") {\n\t\tprefix = \"\";\n\t}\n\tconst printString = ` * Tone.js ${prefix}${version} * `;\n\t// eslint-disable-next-line no-console\n\tconsole.log(`%c${printString}`, \"background: #000; color: #fff\");\n}\n","import { BaseContext } from \"./BaseContext\";\nimport { Seconds } from \"../type/Units\";\nimport { AnyAudioContext } from \"./AudioContext\";\n\ntype Draw = import(\"../util/Draw\").Draw;\ntype Destination = import(\"./Destination\").Destination;\ntype Transport = import(\"../clock/Transport\").Transport;\ntype Listener = import(\"./Listener\").Listener;\n\nexport class DummyContext extends BaseContext {\n\t//---------------------------\n\t// BASE AUDIO CONTEXT METHODS\n\t//---------------------------\n\tcreateAnalyser(): AnalyserNode {\n\t\treturn {} as AnalyserNode;\n\t}\n\n\tcreateOscillator(): OscillatorNode {\n\t\treturn {} as OscillatorNode;\n\t}\n\n\tcreateBufferSource() {\n\t\treturn {} as AudioBufferSourceNode;\n\t}\n\n\tcreateBiquadFilter(): BiquadFilterNode {\n\t\treturn {} as BiquadFilterNode;\n\t}\n\n\tcreateBuffer(\n\t\t_numberOfChannels: number,\n\t\t_length: number,\n\t\t_sampleRate: number\n\t): AudioBuffer {\n\t\treturn {} as AudioBuffer;\n\t}\n\n\tcreateChannelMerger(\n\t\t_numberOfInputs?: number | undefined\n\t): ChannelMergerNode {\n\t\treturn {} as ChannelMergerNode;\n\t}\n\n\tcreateChannelSplitter(\n\t\t_numberOfOutputs?: number | undefined\n\t): ChannelSplitterNode {\n\t\treturn {} as ChannelSplitterNode;\n\t}\n\n\tcreateConstantSource(): ConstantSourceNode {\n\t\treturn {} as ConstantSourceNode;\n\t}\n\n\tcreateConvolver(): ConvolverNode {\n\t\treturn {} as ConvolverNode;\n\t}\n\n\tcreateDelay(_maxDelayTime?: number | undefined): DelayNode {\n\t\treturn {} as DelayNode;\n\t}\n\n\tcreateDynamicsCompressor(): DynamicsCompressorNode {\n\t\treturn {} as DynamicsCompressorNode;\n\t}\n\n\tcreateGain(): GainNode {\n\t\treturn {} as GainNode;\n\t}\n\n\tcreateIIRFilter(\n\t\t_feedForward: number[] | Float32Array,\n\t\t_feedback: number[] | Float32Array\n\t): IIRFilterNode {\n\t\treturn {} as IIRFilterNode;\n\t}\n\n\tcreatePanner(): PannerNode {\n\t\treturn {} as PannerNode;\n\t}\n\n\tcreatePeriodicWave(\n\t\t_real: number[] | Float32Array,\n\t\t_imag: number[] | Float32Array,\n\t\t_constraints?: PeriodicWaveConstraints | undefined\n\t): PeriodicWave {\n\t\treturn {} as PeriodicWave;\n\t}\n\n\tcreateStereoPanner(): StereoPannerNode {\n\t\treturn {} as StereoPannerNode;\n\t}\n\n\tcreateWaveShaper(): WaveShaperNode {\n\t\treturn {} as WaveShaperNode;\n\t}\n\n\tcreateMediaStreamSource(_stream: MediaStream): MediaStreamAudioSourceNode {\n\t\treturn {} as MediaStreamAudioSourceNode;\n\t}\n\n\tcreateMediaElementSource(\n\t\t_element: HTMLMediaElement\n\t): MediaElementAudioSourceNode {\n\t\treturn {} as MediaElementAudioSourceNode;\n\t}\n\n\tcreateMediaStreamDestination(): MediaStreamAudioDestinationNode {\n\t\treturn {} as MediaStreamAudioDestinationNode;\n\t}\n\n\tdecodeAudioData(_audioData: ArrayBuffer): Promise<AudioBuffer> {\n\t\treturn Promise.resolve({} as AudioBuffer);\n\t}\n\n\t//---------------------------\n\t// TONE AUDIO CONTEXT METHODS\n\t//---------------------------\n\n\tcreateAudioWorkletNode(\n\t\t_name: string,\n\t\t_options?: Partial<AudioWorkletNodeOptions>\n\t): AudioWorkletNode {\n\t\treturn {} as AudioWorkletNode;\n\t}\n\n\tget rawContext(): AnyAudioContext {\n\t\treturn {} as AnyAudioContext;\n\t}\n\n\tasync addAudioWorkletModule(_url: string, _name: string): Promise<void> {\n\t\treturn Promise.resolve();\n\t}\n\n\tlookAhead = 0;\n\n\tlatencyHint = 0;\n\n\tresume(): Promise<void> {\n\t\treturn Promise.resolve();\n\t}\n\n\tsetTimeout(_fn: (...args: any[]) => void, _timeout: Seconds): number {\n\t\treturn 0;\n\t}\n\n\tclearTimeout(_id: number): this {\n\t\treturn this;\n\t}\n\n\tsetInterval(_fn: (...args: any[]) => void, _interval: Seconds): number {\n\t\treturn 0;\n\t}\n\n\tclearInterval(_id: number): this {\n\t\treturn this;\n\t}\n\n\tgetConstant(_val: number): AudioBufferSourceNode {\n\t\treturn {} as AudioBufferSourceNode;\n\t}\n\n\tget currentTime(): Seconds {\n\t\treturn 0;\n\t}\n\n\tget state(): AudioContextState {\n\t\treturn {} as AudioContextState;\n\t}\n\n\tget sampleRate(): number {\n\t\treturn 0;\n\t}\n\n\tget listener(): Listener {\n\t\treturn {} as Listener;\n\t}\n\n\tget transport(): Transport {\n\t\treturn {} as Transport;\n\t}\n\n\tget draw(): Draw {\n\t\treturn {} as Draw;\n\t}\n\tset draw(_d) {}\n\n\tget destination(): Destination {\n\t\treturn {} as Destination;\n\t}\n\tset destination(_d: Destination) {}\n\n\tnow() {\n\t\treturn 0;\n\t}\n\n\timmediate() {\n\t\treturn 0;\n\t}\n\n\treadonly isOffline: boolean = false;\n}\n","import { Decibels, GainFactor, Hertz, Interval, MidiNote, NormalRange } from \"./Units\";\n\n/**\n * Equal power gain scale. Good for cross-fading.\n * @param percent (0-1)\n */\nexport function equalPowerScale(percent: NormalRange): number {\n\tconst piFactor = 0.5 * Math.PI;\n\treturn Math.sin(percent * piFactor);\n}\n\n/**\n * Convert decibels into gain.\n */\nexport function dbToGain(db: Decibels): GainFactor {\n\treturn Math.pow(10, db / 20);\n}\n\n/**\n * Convert gain to decibels.\n */\nexport function gainToDb(gain: GainFactor): Decibels {\n\treturn 20 * (Math.log(gain) / Math.LN10);\n}\n\n/**\n * Convert an interval (in semitones) to a frequency ratio.\n * @param interval the number of semitones above the base note\n * @example\n * Tone.intervalToFrequencyRatio(0); // 1\n * Tone.intervalToFrequencyRatio(12); // 2\n * Tone.intervalToFrequencyRatio(-12); // 0.5\n */\nexport function intervalToFrequencyRatio(interval: Interval): number {\n\treturn Math.pow(2, (interval / 12));\n}\n\n/**\n * The Global [concert tuning pitch](https://en.wikipedia.org/wiki/Concert_pitch) which is used\n * to generate all the other pitch values from notes. A4's values in Hertz.\n */\nlet A4: Hertz = 440;\n\nexport function getA4(): Hertz {\n\treturn A4;\n}\n\nexport function setA4(freq: Hertz): void {\n\tA4 = freq;\n}\n\n/**\n * Convert a frequency value to a MIDI note.\n * @param frequency The value to frequency value to convert.\n * @example\n * Tone.ftom(440); // returns 69\n */\nexport function ftom(frequency: Hertz): MidiNote {\n\treturn Math.round(ftomf(frequency)) as MidiNote;\n}\n\n/**\n * Convert a frequency to a floating point midi value\n */\nexport function ftomf(frequency: Hertz): number {\n\treturn 69 + 12 * Math.log2(frequency / A4);\n}\n\n/**\n * Convert a MIDI note to frequency value.\n * @param midi The midi number to convert.\n * @return The corresponding frequency value\n * @example\n * Tone.mtof(69); // 440\n */\nexport function mtof(midi: MidiNote): Hertz {\n\treturn A4 * Math.pow(2, (midi - 69) / 12);\n}\n","import { BaseContext } from \"../context/BaseContext\";\nimport { Tone } from \"../Tone\";\nimport { isDefined, isObject, isString, isUndef } from \"../util/TypeCheck\";\nimport { BPM, Hertz, MidiNote, Milliseconds, Samples, Seconds, Ticks, Time } from \"./Units\";\n\nexport type TimeValue = Time | TimeBaseClass<any, any>;\n\n/**\n * The units that the TimeBase can accept. extended by other classes\n */\nexport type TimeBaseUnit = \"s\" | \"n\" | \"t\" | \"m\" | \"i\" | \"hz\" | \"tr\" | \"samples\" | \"number\";\n\nexport interface TypeFunction {\n\tregexp: RegExp;\n\tmethod: (value: string, ...args: string[]) => number;\n}\n\nexport interface TimeExpression<Type extends number> {\n\t[key: string]: {\n\t\tregexp: RegExp;\n\t\tmethod: (value: string, ...args: string[]) => Type;\n\t};\n}\n\n/**\n * TimeBase is a flexible encoding of time which can be evaluated to and from a string.\n */\nexport abstract class TimeBaseClass<Type extends number, Unit extends string> extends Tone {\n\n\treadonly context: BaseContext;\n\n\t/**\n\t * The value of the units\n\t */\n\tprotected _val?: TimeValue;\n\n\t/**\n\t * The units of time\n\t */\n\tprotected _units?: Unit;\n\n\t/**\n\t * All of the conversion expressions\n\t */\n\tprotected _expressions: TimeExpression<Type>;\n\n\t/**\n\t * The default units\n\t */\n\treadonly defaultUnits: Unit = \"s\" as Unit;\n\n\t/**\n\t * @param context The context associated with the time value. Used to compute\n\t * Transport and context-relative timing.\n\t * @param value The time value as a number, string or object\n\t * @param units Unit values\n\t */\n\tconstructor(context: BaseContext, value?: TimeValue, units?: Unit) {\n\t\tsuper();\n\n\t\tthis._val = value;\n\t\tthis._units = units;\n\t\tthis.context = context;\n\t\tthis._expressions = this._getExpressions();\n\t}\n\n\t/**\n\t * All of the time encoding expressions\n\t */\n\tprotected _getExpressions(): TimeExpression<Type> {\n\t\treturn {\n\t\t\thz: {\n\t\t\t\tmethod: (value) => {\n\t\t\t\t\treturn this._frequencyToUnits(parseFloat(value));\n\t\t\t\t},\n\t\t\t\tregexp: /^(\\d+(?:\\.\\d+)?)hz$/i,\n\t\t\t},\n\t\t\ti: {\n\t\t\t\tmethod: (value) => {\n\t\t\t\t\treturn this._ticksToUnits(parseInt(value, 10));\n\t\t\t\t},\n\t\t\t\tregexp: /^(\\d+)i$/i,\n\t\t\t},\n\t\t\tm: {\n\t\t\t\tmethod: (value) => {\n\t\t\t\t\treturn this._beatsToUnits(parseInt(value, 10) * this._getTimeSignature());\n\t\t\t\t},\n\t\t\t\tregexp: /^(\\d+)m$/i,\n\t\t\t},\n\t\t\tn: {\n\t\t\t\tmethod: (value, dot) => {\n\t\t\t\t\tconst numericValue = parseInt(value, 10);\n\t\t\t\t\tconst scalar = dot === \".\" ? 1.5 : 1;\n\t\t\t\t\tif (numericValue === 1) {\n\t\t\t\t\t\treturn this._beatsToUnits(this._getTimeSignature()) * scalar as Type;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn this._beatsToUnits(4 / numericValue) * scalar as Type;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tregexp: /^(\\d+)n(\\.?)$/i,\n\t\t\t},\n\t\t\tnumber: {\n\t\t\t\tmethod: (value) => {\n\t\t\t\t\treturn this._expressions[this.defaultUnits].method.call(this, value);\n\t\t\t\t},\n\t\t\t\tregexp: /^(\\d+(?:\\.\\d+)?)$/,\n\t\t\t},\n\t\t\ts: {\n\t\t\t\tmethod: (value): Type => {\n\t\t\t\t\treturn this._secondsToUnits(parseFloat(value));\n\t\t\t\t},\n\t\t\t\tregexp: /^(\\d+(?:\\.\\d+)?)s$/,\n\t\t\t},\n\t\t\tsamples: {\n\t\t\t\tmethod: (value) => {\n\t\t\t\t\treturn parseInt(value, 10) / this.context.sampleRate as Type;\n\t\t\t\t},\n\t\t\t\tregexp: /^(\\d+)samples$/,\n\t\t\t},\n\t\t\tt: {\n\t\t\t\tmethod: (value) => {\n\t\t\t\t\tconst numericValue = parseInt(value, 10);\n\t\t\t\t\treturn this._beatsToUnits(8 / (Math.floor(numericValue) * 3));\n\t\t\t\t},\n\t\t\t\tregexp: /^(\\d+)t$/i,\n\t\t\t},\n\t\t\ttr: {\n\t\t\t\tmethod: (m, q, s) => {\n\t\t\t\t\tlet total = 0;\n\t\t\t\t\tif (m && m !== \"0\") {\n\t\t\t\t\t\ttotal += this._beatsToUnits(this._getTimeSignature() * parseFloat(m));\n\t\t\t\t\t}\n\t\t\t\t\tif (q && q !== \"0\") {\n\t\t\t\t\t\ttotal += this._beatsToUnits(parseFloat(q));\n\t\t\t\t\t}\n\t\t\t\t\tif (s && s !== \"0\") {\n\t\t\t\t\t\ttotal += this._beatsToUnits(parseFloat(s) / 4);\n\t\t\t\t\t}\n\t\t\t\t\treturn total as Type;\n\t\t\t\t},\n\t\t\t\tregexp: /^(\\d+(?:\\.\\d+)?):(\\d+(?:\\.\\d+)?):?(\\d+(?:\\.\\d+)?)?$/,\n\t\t\t},\n\t\t};\n\t}\n\n\t//-------------------------------------\n\t// \tVALUE OF\n\t//-------------------------------------\n\n\t/**\n\t * Evaluate the time value. Returns the time in seconds.\n\t */\n\tvalueOf(): Type {\n\t\tif (this._val instanceof TimeBaseClass) {\n\t\t\tthis.fromType(this._val);\n\t\t}\n\t\tif (isUndef(this._val)) {\n\t\t\treturn this._noArg();\n\t\t} else if (isString(this._val) && isUndef(this._units)) {\n\t\t\tfor (const units in this._expressions) {\n\t\t\t\tif (this._expressions[units].regexp.test(this._val.trim())) {\n\t\t\t\t\tthis._units = units as Unit;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (isObject(this._val)) {\n\t\t\tlet total = 0;\n\t\t\tfor (const typeName in this._val) {\n\t\t\t\tif (isDefined(this._val[typeName])) {\n\t\t\t\t\tconst quantity = this._val[typeName];\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tconst time = (new this.constructor(this.context, typeName)).valueOf() * quantity;\n\t\t\t\t\ttotal += time;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn total as Type;\n\t\t}\n\t\tif (isDefined(this._units)) {\n\t\t\tconst expr = this._expressions[this._units];\n\t\t\tconst matching = this._val.toString().trim().match(expr.regexp);\n\t\t\tif (matching) {\n\t\t\t\treturn expr.method.apply(this, matching.slice(1));\n\t\t\t} else {\n\t\t\t\treturn expr.method.call(this, this._val);\n\t\t\t}\n\t\t} else if (isString(this._val)) {\n\t\t\treturn parseFloat(this._val) as Type;\n\t\t} else {\n\t\t\treturn this._val as Type;\n\t\t}\n\t}\n\n\t//-------------------------------------\n\t// \tUNIT CONVERSIONS\n\t//-------------------------------------\n\n\t/**\n\t * Returns the value of a frequency in the current units\n\t */\n\tprotected _frequencyToUnits(freq: Hertz): Type {\n\t\treturn 1 / freq as Type;\n\t}\n\n\t/**\n\t * Return the value of the beats in the current units\n\t */\n\tprotected _beatsToUnits(beats: number): Type {\n\t\treturn (60 / this._getBpm()) * beats as Type;\n\t}\n\n\t/**\n\t * Returns the value of a second in the current units\n\t */\n\tprotected _secondsToUnits(seconds: Seconds): Type {\n\t\treturn seconds as Type;\n\t}\n\n\t/**\n\t * Returns the value of a tick in the current time units\n\t */\n\tprotected _ticksToUnits(ticks: Ticks): Type {\n\t\treturn (ticks * (this._beatsToUnits(1)) / this._getPPQ()) as Type;\n\t}\n\n\t/**\n\t * With no arguments, return 'now'\n\t */\n\tprotected _noArg(): Type {\n\t\treturn this._now();\n\t}\n\n\t//-------------------------------------\n\t// \tTEMPO CONVERSIONS\n\t//-------------------------------------\n\n\t/**\n\t * Return the bpm\n\t */\n\tprotected _getBpm(): BPM {\n\t\treturn this.context.transport.bpm.value;\n\t}\n\n\t/**\n\t * Return the timeSignature\n\t */\n\tprotected _getTimeSignature(): number {\n\t\treturn this.context.transport.timeSignature as number;\n\t}\n\n\t/**\n\t * Return the PPQ or 192 if Transport is not available\n\t */\n\tprotected _getPPQ(): number {\n\t\treturn this.context.transport.PPQ;\n\t}\n\n\t/**\n\t * Return the current time in whichever context is relevant\n\t */\n\tprotected abstract _now(): Type;\n\n\t//-------------------------------------\n\t// \tCONVERSION INTERFACE\n\t//-------------------------------------\n\n\t/**\n\t * Coerce a time type into this units type.\n\t * @param type Any time type units\n\t */\n\tfromType(type: TimeBaseClass<any, any>): this {\n\t\tthis._units = undefined;\n\t\tswitch (this.defaultUnits) {\n\t\t\tcase \"s\":\n\t\t\t\tthis._val = type.toSeconds();\n\t\t\t\tbreak;\n\t\t\tcase \"i\":\n\t\t\t\tthis._val = type.toTicks();\n\t\t\t\tbreak;\n\t\t\tcase \"hz\":\n\t\t\t\tthis._val = type.toFrequency();\n\t\t\t\tbreak;\n\t\t\tcase \"midi\":\n\t\t\t\tthis._val = type.toMidi();\n\t\t\t\tbreak;\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Return the value in seconds\n\t */\n\tabstract toSeconds(): Seconds;\n\n\t/**\n\t * Return the value as a Midi note\n\t */\n\tabstract toMidi(): MidiNote;\n\n\t/**\n\t * Convert the value into ticks\n\t */\n\tabstract toTicks(): Ticks;\n\n\t/**\n\t * Return the value in hertz\n\t */\n\ttoFrequency(): Hertz {\n\t\treturn 1 / this.toSeconds();\n\t}\n\n\t/**\n\t * Return the time in samples\n\t */\n\ttoSamples(): Samples {\n\t\treturn this.toSeconds() * this.context.sampleRate;\n\t}\n\n\t/**\n\t * Return the time in milliseconds.\n\t */\n\ttoMilliseconds(): Milliseconds {\n\t\treturn this.toSeconds() * 1000;\n\t}\n}\n","import { getContext } from \"../Global\";\nimport { ftom } from \"./Conversions\";\nimport { TimeBaseClass, TimeBaseUnit, TimeExpression, TimeValue } from \"./TimeBase\";\nimport { BarsBeatsSixteenths, MidiNote, Seconds, Subdivision, Ticks, Time } from \"./Units\";\n\n/**\n * TimeClass is a primitive type for encoding and decoding Time values.\n * TimeClass can be passed into the parameter of any method which takes time as an argument.\n * @param val The time value.\n * @param units The units of the value.\n * @example\n * const time = Tone.Time(\"4n\"); // a quarter note\n * @category Unit\n */\nexport class TimeClass<Type extends Seconds | Ticks = Seconds, Unit extends string = TimeBaseUnit>\n\textends TimeBaseClass<Type, Unit> {\n\n\treadonly name: string = \"TimeClass\";\n\n\tprotected _getExpressions(): TimeExpression<Type> {\n\t\treturn Object.assign(super._getExpressions(), {\n\t\t\tnow: {\n\t\t\t\tmethod: (capture: string): Type => {\n\t\t\t\t\treturn this._now() + new (this.constructor as typeof TimeClass)(this.context, capture).valueOf() as Type;\n\t\t\t\t},\n\t\t\t\tregexp: /^\\+(.+)/,\n\t\t\t},\n\t\t\tquantize: {\n\t\t\t\tmethod: (capture: string): Type => {\n\t\t\t\t\tconst quantTo = new TimeClass(this.context, capture).valueOf();\n\t\t\t\t\treturn this._secondsToUnits(this.context.transport.nextSubdivision(quantTo));\n\t\t\t\t},\n\t\t\t\tregexp: /^@(.+)/,\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * Quantize the time by the given subdivision. Optionally add a\n\t * percentage which will move the time value towards the ideal\n\t * quantized value by that percentage.\n\t * @param subdiv The subdivision to quantize to\n\t * @param percent Move the time value towards the quantized value by a percentage.\n\t * @example\n\t * Tone.Time(21).quantize(2); // returns 22\n\t * Tone.Time(0.6).quantize(\"4n\", 0.5); // returns 0.55\n\t */\n\tquantize(subdiv: Time, percent = 1): Type {\n\t\tconst subdivision = new (this.constructor as typeof TimeClass)(this.context, subdiv).valueOf();\n\t\tconst value = this.valueOf();\n\t\tconst multiple = Math.round(value / subdivision);\n\t\tconst ideal = multiple * subdivision;\n\t\tconst diff = ideal - value;\n\t\treturn value + diff * percent as Type;\n\t}\n\n\t//-------------------------------------\n\t// CONVERSIONS\n\t//-------------------------------------\n\t/**\n\t * Convert a Time to Notation. The notation values are will be the\n\t * closest representation between 1m to 128th note.\n\t * @return {Notation}\n\t * @example\n\t * // if the Transport is at 120bpm:\n\t * Tone.Time(2).toNotation(); // returns \"1m\"\n\t */\n\ttoNotation(): Subdivision {\n\t\tconst time = this.toSeconds();\n\t\tconst testNotations: Subdivision[] = [\"1m\"];\n\t\tfor (let power = 1; power < 9; power++) {\n\t\t\tconst subdiv = Math.pow(2, power);\n\t\t\ttestNotations.push(subdiv + \"n.\" as Subdivision);\n\t\t\ttestNotations.push(subdiv + \"n\" as Subdivision);\n\t\t\ttestNotations.push(subdiv + \"t\" as Subdivision);\n\t\t}\n\t\ttestNotations.push(\"0\");\n\t\t// find the closets notation representation\n\t\tlet closest = testNotations[0];\n\t\tlet closestSeconds = new TimeClass(this.context, testNotations[0]).toSeconds();\n\t\ttestNotations.forEach(notation => {\n\t\t\tconst notationSeconds = new TimeClass(this.context, notation).toSeconds();\n\t\t\tif (Math.abs(notationSeconds - time) < Math.abs(closestSeconds - time)) {\n\t\t\t\tclosest = notation;\n\t\t\t\tclosestSeconds = notationSeconds;\n\t\t\t}\n\t\t});\n\t\treturn closest;\n\t}\n\n\t/**\n\t * Return the time encoded as Bars:Beats:Sixteenths.\n\t */\n\ttoBarsBeatsSixteenths(): BarsBeatsSixteenths {\n\t\tconst quarterTime = this._beatsToUnits(1);\n\t\tlet quarters = this.valueOf() / quarterTime;\n\t\tquarters = parseFloat(quarters.toFixed(4));\n\t\tconst measures = Math.floor(quarters / this._getTimeSignature());\n\t\tlet sixteenths = (quarters % 1) * 4;\n\t\tquarters = Math.floor(quarters) % this._getTimeSignature();\n\t\tconst sixteenthString = sixteenths.toString();\n\t\tif (sixteenthString.length > 3) {\n\t\t\t// the additional parseFloat removes insignificant trailing zeroes\n\t\t\tsixteenths = parseFloat(parseFloat(sixteenthString).toFixed(3));\n\t\t}\n\t\tconst progress = [measures, quarters, sixteenths];\n\t\treturn progress.join(\":\");\n\t}\n\n\t/**\n\t * Return the time in ticks.\n\t */\n\ttoTicks(): Ticks {\n\t\tconst quarterTime = this._beatsToUnits(1);\n\t\tconst quarters = this.valueOf() / quarterTime;\n\t\treturn quarters * this._getPPQ();\n\t}\n\n\t/**\n\t * Return the time in seconds.\n\t */\n\ttoSeconds(): Seconds {\n\t\treturn this.valueOf();\n\t}\n\n\t/**\n\t * Return the value as a midi note.\n\t */\n\ttoMidi(): MidiNote {\n\t\treturn ftom(this.toFrequency());\n\t}\n\n\tprotected _now(): Type {\n\t\treturn this.context.now() as Type;\n\t}\n}\n\n/**\n * Create a TimeClass from a time string or number. The time is computed against the \n * global Tone.Context. To use a specific context, use [[TimeClass]]\n * @param value A value which represents time\n * @param units The value's units if they can't be inferred by the value.\n * @category Unit\n * @example\n * const time = Tone.Time(\"4n\").toSeconds();\n * console.log(time);\n * @example\n * const note = Tone.Time(1).toNotation();\n * console.log(note);\n * @example\n * const freq = Tone.Time(0.5).toFrequency();\n * console.log(freq);\n */\nexport function Time(value?: TimeValue, units?: TimeBaseUnit): TimeClass<Seconds> {\n\treturn new TimeClass(getContext(), value, units);\n}\n","import { getContext } from \"../Global\";\nimport { intervalToFrequencyRatio, mtof } from \"./Conversions\";\nimport { ftom, getA4, setA4 } from \"./Conversions\";\nimport { TimeClass } from \"./Time\";\nimport { TimeBaseUnit, TimeExpression, TimeValue } from \"./TimeBase\";\nimport { Frequency, Hertz, Interval, MidiNote, Note, Seconds, Ticks } from \"./Units\";\n\nexport type FrequencyUnit = TimeBaseUnit | \"midi\";\n\n/**\n * Frequency is a primitive type for encoding Frequency values.\n * Eventually all time values are evaluated to hertz using the `valueOf` method.\n * @example\n * Tone.Frequency(\"C3\"); // 261\n * Tone.Frequency(38, \"midi\");\n * Tone.Frequency(\"C3\").transpose(4);\n * @category Unit\n */\nexport class FrequencyClass<Type extends number = Hertz> extends TimeClass<Type, FrequencyUnit> {\n\n\treadonly name: string = \"Frequency\";\n\n\treadonly defaultUnits: FrequencyUnit = \"hz\";\n\n\t/**\n\t * The [concert tuning pitch](https://en.wikipedia.org/wiki/Concert_pitch) which is used\n\t * to generate all the other pitch values from notes. A4's values in Hertz.\n\t */\n\tstatic get A4(): Hertz {\n\t\treturn getA4();\n\t}\n\tstatic set A4(freq: Hertz) {\n\t\tsetA4(freq);\n\t}\n\n\t//-------------------------------------\n\t// \tAUGMENT BASE EXPRESSIONS\n\t//-------------------------------------\n\n\tprotected _getExpressions(): TimeExpression<Type> {\n\t\treturn Object.assign({}, super._getExpressions(), {\n\t\t\tmidi: {\n\t\t\t\tregexp: /^(\\d+(?:\\.\\d+)?midi)/,\n\t\t\t\tmethod(value): number {\n\t\t\t\t\tif (this.defaultUnits === \"midi\") {\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn FrequencyClass.mtof(value);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\tnote: {\n\t\t\t\tregexp: /^([a-g]{1}(?:b|#|x|bb)?)(-?[0-9]+)/i,\n\t\t\t\tmethod(pitch, octave): number {\n\t\t\t\t\tconst index = noteToScaleIndex[pitch.toLowerCase()];\n\t\t\t\t\tconst noteNumber = index + (parseInt(octave, 10) + 1) * 12;\n\t\t\t\t\tif (this.defaultUnits === \"midi\") {\n\t\t\t\t\t\treturn noteNumber;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn FrequencyClass.mtof(noteNumber);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\ttr: {\n\t\t\t\tregexp: /^(\\d+(?:\\.\\d+)?):(\\d+(?:\\.\\d+)?):?(\\d+(?:\\.\\d+)?)?/,\n\t\t\t\tmethod(m, q, s): number {\n\t\t\t\t\tlet total = 1;\n\t\t\t\t\tif (m && m !== \"0\") {\n\t\t\t\t\t\ttotal *= this._beatsToUnits(this._getTimeSignature() * parseFloat(m));\n\t\t\t\t\t}\n\t\t\t\t\tif (q && q !== \"0\") {\n\t\t\t\t\t\ttotal *= this._beatsToUnits(parseFloat(q));\n\t\t\t\t\t}\n\t\t\t\t\tif (s && s !== \"0\") {\n\t\t\t\t\t\ttotal *= this._beatsToUnits(parseFloat(s) / 4);\n\t\t\t\t\t}\n\t\t\t\t\treturn total;\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t}\n\n\t//-------------------------------------\n\t// \tEXPRESSIONS\n\t//-------------------------------------\n\n\t/**\n\t * Transposes the frequency by the given number of semitones.\n\t * @return A new transposed frequency\n\t * @example\n\t * Tone.Frequency(\"A4\").transpose(3); // \"C5\"\n\t */\n\ttranspose(interval: Interval): FrequencyClass {\n\t\treturn new FrequencyClass(this.context, this.valueOf() * intervalToFrequencyRatio(interval));\n\t}\n\n\t/**\n\t * Takes an array of semitone intervals and returns\n\t * an array of frequencies transposed by those intervals.\n\t * @return Returns an array of Frequencies\n\t * @example\n\t * Tone.Frequency(\"A4\").harmonize([0, 3, 7]); // [\"A4\", \"C5\", \"E5\"]\n\t */\n\tharmonize(intervals: Interval[]): FrequencyClass[] {\n\t\treturn intervals.map(interval => {\n\t\t\treturn this.transpose(interval);\n\t\t});\n\t}\n\n\t//-------------------------------------\n\t// \tUNIT CONVERSIONS\n\t//-------------------------------------\n\n\t/**\n\t * Return the value of the frequency as a MIDI note\n\t * @example\n\t * Tone.Frequency(\"C4\").toMidi(); // 60\n\t */\n\ttoMidi(): MidiNote {\n\t\treturn ftom(this.valueOf());\n\t}\n\n\t/**\n\t * Return the value of the frequency in Scientific Pitch Notation\n\t * @example\n\t * Tone.Frequency(69, \"midi\").toNote(); // \"A4\"\n\t */\n\ttoNote(): Note {\n\t\tconst freq = this.toFrequency();\n\t\tconst log = Math.log2(freq / FrequencyClass.A4);\n\t\tlet noteNumber = Math.round(12 * log) + 57;\n\t\tconst octave = Math.floor(noteNumber / 12);\n\t\tif (octave < 0) {\n\t\t\tnoteNumber += -12 * octave;\n\t\t}\n\t\tconst noteName = scaleIndexToNote[noteNumber % 12];\n\t\treturn noteName + octave.toString() as Note;\n\t}\n\n\t/**\n\t * Return the duration of one cycle in seconds.\n\t */\n\ttoSeconds(): Seconds {\n\t\treturn 1 / super.toSeconds();\n\t}\n\n\t/**\n\t * Return the duration of one cycle in ticks\n\t */\n\ttoTicks(): Ticks {\n\t\tconst quarterTime = this._beatsToUnits(1);\n\t\tconst quarters = this.valueOf() / quarterTime;\n\t\treturn Math.floor(quarters * this._getPPQ());\n\t}\n\n\t//-------------------------------------\n\t// \tUNIT CONVERSIONS HELPERS\n\t//-------------------------------------\n\n\t/**\n\t * With no arguments, return 0\n\t */\n\tprotected _noArg(): Type {\n\t\treturn 0 as Type;\n\t}\n\n\t/**\n\t * Returns the value of a frequency in the current units\n\t */\n\tprotected _frequencyToUnits(freq: Hertz): Type {\n\t\treturn freq as Type;\n\t}\n\n\t/**\n\t * Returns the value of a tick in the current time units\n\t */\n\tprotected _ticksToUnits(ticks: Ticks): Type {\n\t\treturn 1 / ((ticks * 60) / (this._getBpm() * this._getPPQ())) as Type;\n\t}\n\n\t/**\n\t * Return the value of the beats in the current units\n\t */\n\tprotected _beatsToUnits(beats: number): Type {\n\t\treturn 1 / super._beatsToUnits(beats) as Type;\n\t}\n\n\t/**\n\t * Returns the value of a second in the current units\n\t */\n\tprotected _secondsToUnits(seconds: Seconds): Type {\n\t\treturn 1 / seconds as Type;\n\t}\n\n\t/**\n\t * Convert a MIDI note to frequency value.\n\t * @param midi The midi number to convert.\n\t * @return The corresponding frequency value\n\t */\n\tstatic mtof(midi: MidiNote): Hertz {\n\t\treturn mtof(midi);\n\t}\n\n\t/**\n\t * Convert a frequency value to a MIDI note.\n\t * @param frequency The value to frequency value to convert.\n\t */\n\tstatic ftom(frequency: Hertz): MidiNote {\n\t\treturn ftom(frequency);\n\t}\n}\n\n//-------------------------------------\n// \tFREQUENCY CONVERSIONS\n//-------------------------------------\n\n/**\n * Note to scale index. \n * @hidden\n */\nconst noteToScaleIndex = {\n\tcbb: -2, cb: -1, c: 0, \"c#\": 1, cx: 2,\n\tdbb: 0, db: 1, d: 2, \"d#\": 3, dx: 4,\n\tebb: 2, eb: 3, e: 4, \"e#\": 5, ex: 6,\n\tfbb: 3, fb: 4, f: 5, \"f#\": 6, fx: 7,\n\tgbb: 5, gb: 6, g: 7, \"g#\": 8, gx: 9,\n\tabb: 7, ab: 8, a: 9, \"a#\": 10, ax: 11,\n\tbbb: 9, bb: 10, b: 11, \"b#\": 12, bx: 13,\n};\n\n/**\n * scale index to note (sharps)\n * @hidden\n */\nconst scaleIndexToNote = [\"C\", \"C#\", \"D\", \"D#\", \"E\", \"F\", \"F#\", \"G\", \"G#\", \"A\", \"A#\", \"B\"];\n\n/**\n * Convert a value into a FrequencyClass object.\n * @category Unit\n * @example\n * const midi = Tone.Frequency(\"C3\").toMidi();\n * console.log(midi);\n * @example\n * const hertz = Tone.Frequency(38, \"midi\").toFrequency();\n * console.log(hertz);\n */\nexport function Frequency(value?: TimeValue | Frequency, units?: FrequencyUnit): FrequencyClass {\n\treturn new FrequencyClass(getContext(), value, units);\n}\n","import { getContext } from \"../Global\";\nimport { Seconds, Ticks } from \"../type/Units\";\nimport { TimeClass } from \"./Time\";\nimport { TimeBaseUnit, TimeValue } from \"./TimeBase\";\n\n/**\n * TransportTime is a the time along the Transport's\n * timeline. It is similar to Tone.Time, but instead of evaluating\n * against the AudioContext's clock, it is evaluated against\n * the Transport's position. See [TransportTime wiki](https://github.com/Tonejs/Tone.js/wiki/TransportTime).\n * @category Unit\n */\nexport class TransportTimeClass<Type extends Seconds | Ticks = Seconds> extends TimeClass<Type> {\n\n\treadonly name: string = \"TransportTime\";\n\n\t/**\n\t * Return the current time in whichever context is relevant\n\t */\n\tprotected _now(): Type {\n\t\treturn this.context.transport.seconds as Type;\n\t}\n}\n\n/**\n * TransportTime is a the time along the Transport's\n * timeline. It is similar to [[Time]], but instead of evaluating\n * against the AudioContext's clock, it is evaluated against\n * the Transport's position. See [TransportTime wiki](https://github.com/Tonejs/Tone.js/wiki/TransportTime).\n * @category Unit\n */\nexport function TransportTime(value?: TimeValue, units?: TimeBaseUnit): TransportTimeClass {\n\treturn new TransportTimeClass(getContext(), value, units);\n}\n","import { getContext } from \"../Global\";\nimport { Tone } from \"../Tone\";\nimport { FrequencyClass } from \"../type/Frequency\";\nimport { TimeClass } from \"../type/Time\";\nimport { TransportTimeClass } from \"../type/TransportTime\";\nimport { Frequency, Hertz, Seconds, Ticks, Time } from \"../type/Units\";\nimport { getDefaultsFromInstance, optionsFromArguments } from \"../util/Defaults\";\nimport { RecursivePartial } from \"../util/Interface\";\nimport { isArray, isBoolean, isDefined, isNumber, isString, isUndef } from \"../util/TypeCheck\";\nimport { BaseContext } from \"./BaseContext\";\n\n/**\n * A unit which process audio\n */\nexport interface ToneWithContextOptions {\n\tcontext: BaseContext;\n}\n\n/**\n * The Base class for all nodes that have an AudioContext.\n */\nexport abstract class ToneWithContext<Options extends ToneWithContextOptions> extends Tone {\n\n\t/**\n\t * The context belonging to the node.\n\t */\n\treadonly context: BaseContext;\n\n\t/**\n\t * The default context to use if no AudioContext is passed in to the constructor.\n\t * Probably should not be set manually. Used internally.\n\t * @hidden\n\t */\n\treadonly defaultContext?: BaseContext;\n\n\t/**\n\t * Pass in a constructor as the first argument\n\t */\n\tconstructor(context?: BaseContext)\n\tconstructor(options?: Partial<ToneWithContextOptions>);\n\tconstructor() {\n\t\tsuper();\n\t\tconst options = optionsFromArguments(ToneWithContext.getDefaults(), arguments, [\"context\"]);\n\t\tif (this.defaultContext) {\n\t\t\tthis.context = this.defaultContext;\n\t\t} else {\n\t\t\tthis.context = options.context;\n\t\t}\n\t}\n\n\tstatic getDefaults(): ToneWithContextOptions {\n\t\treturn {\n\t\t\tcontext: getContext(),\n\t\t};\n\t}\n\n\t/**\n\t * Return the current time of the Context clock plus the lookAhead.\n\t * @example\n\t * setInterval(() => {\n\t * \tconsole.log(Tone.now());\n\t * }, 100);\n\t */\n\tnow(): Seconds {\n\t\treturn this.context.currentTime + this.context.lookAhead;\n\t}\n\n\t/**\n\t * Return the current time of the Context clock without any lookAhead.\n\t * @example\n\t * setInterval(() => {\n\t * \tconsole.log(Tone.immediate());\n\t * }, 100);\n\t */\n\timmediate(): Seconds {\n\t\treturn this.context.currentTime;\n\t}\n\n\t/**\n\t * The duration in seconds of one sample.\n\t * @example\n\t * console.log(Tone.Transport.sampleTime);\n\t */\n\tget sampleTime(): Seconds {\n\t\treturn 1 / this.context.sampleRate;\n\t}\n\n\t/**\n\t * The number of seconds of 1 processing block (128 samples)\n\t * @example\n\t * console.log(Tone.Destination.blockTime);\n\t */\n\tget blockTime(): Seconds {\n\t\treturn 128 / this.context.sampleRate;\n\t}\n\n\t/**\n\t * Convert the incoming time to seconds. \n\t * This is calculated against the current [[Tone.Transport]] bpm\n\t * @example\n\t * const gain = new Tone.Gain();\n\t * setInterval(() => console.log(gain.toSeconds(\"4n\")), 100);\n\t * // ramp the tempo to 60 bpm over 30 seconds\n\t * Tone.getTransport().bpm.rampTo(60, 30);\n\t */\n\ttoSeconds(time?: Time): Seconds {\n\t\treturn new TimeClass(this.context, time).toSeconds();\n\t}\n\n\t/**\n\t * Convert the input to a frequency number\n\t * @example\n\t * const gain = new Tone.Gain();\n\t * console.log(gain.toFrequency(\"4n\"));\n\t */\n\ttoFrequency(freq: Frequency): Hertz {\n\t\treturn new FrequencyClass(this.context, freq).toFrequency();\n\t}\n\n\t/**\n\t * Convert the input time into ticks\n\t * @example\n\t * const gain = new Tone.Gain();\n\t * console.log(gain.toTicks(\"4n\"));\n\t */\n\ttoTicks(time?: Time | TimeClass): Ticks {\n\t\treturn new TransportTimeClass(this.context, time).toTicks();\n\t}\n\n\t//-------------------------------------\n\t// \tGET/SET\n\t//-------------------------------------\n\n\t/**\n\t * Get a subset of the properties which are in the partial props\n\t */\n\tprotected _getPartialProperties(props: Options): Partial<Options> {\n\t\tconst options = this.get();\n\t\t// remove attributes from the prop that are not in the partial\n\t\tObject.keys(options).forEach(name => {\n\t\t\tif (isUndef(props[name])) {\n\t\t\t\tdelete options[name];\n\t\t\t}\n\t\t});\n\t\treturn options;\n\t}\n\n\t/**\n\t * Get the object's attributes.\n\t * @example\n\t * const osc = new Tone.Oscillator();\n\t * console.log(osc.get());\n\t */\n\tget(): Options {\n\t\tconst defaults = getDefaultsFromInstance(this) as Options;\n\t\tObject.keys(defaults).forEach(attribute => {\n\t\t\tif (Reflect.has(this, attribute)) {\n\t\t\t\tconst member = this[attribute];\n\t\t\t\tif (isDefined(member) && isDefined(member.value) && isDefined(member.setValueAtTime)) {\n\t\t\t\t\tdefaults[attribute] = member.value;\n\t\t\t\t} else if (member instanceof ToneWithContext) {\n\t\t\t\t\tdefaults[attribute] = member._getPartialProperties(defaults[attribute]);\n\t\t\t\t\t// otherwise make sure it's a serializable type\n\t\t\t\t} else if (isArray(member) || isNumber(member) || isString(member) || isBoolean(member)) {\n\t\t\t\t\tdefaults[attribute] = member;\n\t\t\t\t} else {\n\t\t\t\t\t// remove all undefined and unserializable attributes\n\t\t\t\t\tdelete defaults[attribute];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn defaults;\n\t}\n\n\t/**\n\t * Set multiple properties at once with an object.\n\t * @example\n\t * const filter = new Tone.Filter().toDestination();\n\t * // set values using an object\n\t * filter.set({\n\t * \tfrequency: \"C6\",\n\t * \ttype: \"highpass\"\n\t * });\n\t * const player = new Tone.Player(\"https://tonejs.github.io/audio/berklee/Analogsynth_octaves_highmid.mp3\").connect(filter);\n\t * player.autostart = true;\n\t */\n\tset(props: RecursivePartial<Options>): this {\n\t\tObject.keys(props).forEach(attribute => {\n\t\t\tif (Reflect.has(this, attribute) && isDefined(this[attribute])) {\n\t\t\t\tif (this[attribute] && isDefined(this[attribute].value) && isDefined(this[attribute].setValueAtTime)) {\n\t\t\t\t\t// small optimization\n\t\t\t\t\tif (this[attribute].value !== props[attribute]) {\n\t\t\t\t\t\tthis[attribute].value = props[attribute];\n\t\t\t\t\t}\n\t\t\t\t} else if (this[attribute] instanceof ToneWithContext) {\n\t\t\t\t\tthis[attribute].set(props[attribute]);\n\t\t\t\t} else {\n\t\t\t\t\tthis[attribute] = props[attribute];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn this;\n\t}\n}\n","import { Seconds } from \"../type/Units\";\nimport { Timeline, TimelineEvent } from \"./Timeline\";\nimport { assertRange } from \"./Debug\";\n\nexport type BasicPlaybackState = \"started\" | \"stopped\";\nexport type PlaybackState = BasicPlaybackState | \"paused\";\n\nexport interface StateTimelineEvent extends TimelineEvent {\n\tstate: PlaybackState;\n}\n\n/**\n * A Timeline State. Provides the methods: `setStateAtTime(\"state\", time)` and `getValueAtTime(time)`\n * @param initial The initial state of the StateTimeline. Defaults to `undefined`\n */\nexport class StateTimeline<AdditionalOptions extends {} = {}> extends Timeline<StateTimelineEvent & AdditionalOptions> {\n\n\treadonly name: string = \"StateTimeline\";\n\n\t/**\n\t * The initial state\n\t */\n\tprivate _initial: PlaybackState;\n\n\tconstructor(initial: PlaybackState = \"stopped\") {\n\t\tsuper();\n\t\tthis._initial = initial;\n\t\tthis.setStateAtTime(this._initial, 0);\n\t}\n\n\t/**\n\t * Returns the scheduled state scheduled before or at\n\t * the given time.\n\t * @param time The time to query.\n\t * @return The name of the state input in setStateAtTime.\n\t */\n\tgetValueAtTime(time: Seconds): PlaybackState {\n\t\tconst event = this.get(time);\n\t\tif (event !== null) {\n\t\t\treturn event.state;\n\t\t} else {\n\t\t\treturn this._initial;\n\t\t}\n\t}\n\n\t/**\n\t * Add a state to the timeline.\n\t * @param state The name of the state to set.\n\t * @param time The time to query.\n\t * @param options Any additional options that are needed in the timeline.\n\t */\n\tsetStateAtTime(state: PlaybackState, time: Seconds, options?: AdditionalOptions): this {\n\t\tassertRange(time, 0);\n\t\tthis.add(Object.assign({}, options, {\n\t\t\tstate,\n\t\t\ttime,\n\t\t}));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Return the event before the time with the given state\n\t * @param state The state to look for\n\t * @param time When to check before\n\t * @return The event with the given state before the time\n\t */\n\tgetLastState(state: PlaybackState, time: number): StateTimelineEvent & AdditionalOptions | undefined {\n\t\t// time = this.toSeconds(time);\n\t\tconst index = this._search(time);\n\t\tfor (let i = index; i >= 0; i--) {\n\t\t\tconst event = this._timeline[i];\n\t\t\tif (event.state === state) {\n\t\t\t\treturn event;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Return the event after the time with the given state\n\t * @param state The state to look for\n\t * @param time When to check from\n\t * @return The event with the given state after the time\n\t */\n\tgetNextState(state: PlaybackState, time: number): StateTimelineEvent & AdditionalOptions | undefined {\n\t\t// time = this.toSeconds(time);\n\t\tconst index = this._search(time);\n\t\tif (index !== -1) {\n\t\t\tfor (let i = index; i < this._timeline.length; i++) {\n\t\t\t\tconst event = this._timeline[i];\n\t\t\t\tif (event.state === state) {\n\t\t\t\t\treturn event;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import { AbstractParam } from \"../context/AbstractParam\";\nimport { dbToGain, gainToDb } from \"../type/Conversions\";\nimport { Decibels, Frequency, Positive, Time, UnitMap, UnitName } from \"../type/Units\";\nimport { isAudioParam } from \"../util/AdvancedTypeCheck\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { Timeline } from \"../util/Timeline\";\nimport { isDefined } from \"../util/TypeCheck\";\nimport { ToneWithContext, ToneWithContextOptions } from \"./ToneWithContext\";\nimport { EQ } from \"../util/Math\";\nimport { assert, assertRange } from \"../util/Debug\";\n\nexport interface ParamOptions<TypeName extends UnitName> extends ToneWithContextOptions {\n\tunits: TypeName;\n\tvalue?: UnitMap[TypeName];\n\tparam: AudioParam | Param<TypeName>;\n\tconvert: boolean;\n\tminValue?: number;\n\tmaxValue?: number;\n\tswappable?: boolean;\n}\n\n/**\n * the possible automation types\n */\ntype AutomationType = \"linearRampToValueAtTime\" | \"exponentialRampToValueAtTime\" | \"setValueAtTime\" | \"setTargetAtTime\" | \"cancelScheduledValues\";\n\ninterface TargetAutomationEvent {\n\ttype: \"setTargetAtTime\";\n\ttime: number;\n\tvalue: number;\n\tconstant: number;\n}\n\ninterface NormalAutomationEvent {\n\ttype: Exclude<AutomationType, \"setTargetAtTime\">;\n\ttime: number;\n\tvalue: number;\n}\n/**\n * The events on the automation\n */\nexport type AutomationEvent = NormalAutomationEvent | TargetAutomationEvent;\n\n/**\n * Param wraps the native Web Audio's AudioParam to provide\n * additional unit conversion functionality. It also\n * serves as a base-class for classes which have a single,\n * automatable parameter.\n * @category Core\n */\nexport class Param<TypeName extends UnitName = \"number\">\n\textends ToneWithContext<ParamOptions<TypeName>>\n\timplements AbstractParam<TypeName> {\n\n\treadonly name: string = \"Param\";\n\n\treadonly input: GainNode | AudioParam;\n\n\treadonly units: UnitName;\n\tconvert: boolean;\n\toverridden = false;\n\n\t/**\n\t * The timeline which tracks all of the automations.\n\t */\n\tprotected _events: Timeline<AutomationEvent>;\n\n\t/**\n\t * The native parameter to control\n\t */\n\tprotected _param: AudioParam;\n\n\t/**\n\t * The default value before anything is assigned\n\t */\n\tprotected _initialValue: number;\n\n\t/**\n\t * The minimum output value\n\t */\n\tprivate _minOutput = 1e-7;\n\n\t/**\n\t * Private reference to the min and max values if passed into the constructor\n\t */\n\tprivate readonly _minValue?: number;\n\tprivate readonly _maxValue?: number;\n\n\t/**\n\t * If the underlying AudioParam can be swapped out\n\t * using the setParam method. \n\t */\n\tprotected readonly _swappable: boolean;\n\n\t/**\n\t * @param param The AudioParam to wrap\n\t * @param units The unit name\n\t * @param convert Whether or not to convert the value to the target units\n\t */\n\tconstructor(param: AudioParam, units?: TypeName, convert?: boolean);\n\tconstructor(options: Partial<ParamOptions<TypeName>>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(Param.getDefaults(), arguments, [\"param\", \"units\", \"convert\"]));\n\n\t\tconst options = optionsFromArguments(Param.getDefaults(), arguments, [\"param\", \"units\", \"convert\"]);\n\n\t\tassert(isDefined(options.param) &&\n\t\t\t(isAudioParam(options.param) || options.param instanceof Param), \"param must be an AudioParam\");\n\n\t\twhile (!isAudioParam(options.param)) {\n\t\t\toptions.param = options.param._param;\n\t\t}\n\n\t\tthis._swappable = isDefined(options.swappable) ? options.swappable : false;\n\t\tif (this._swappable) {\n\t\t\tthis.input = this.context.createGain();\n\t\t\t// initialize\n\t\t\tthis._param = options.param;\n\t\t\tthis.input.connect(this._param);\n\t\t} else {\n\t\t\tthis._param = this.input = options.param;\n\t\t}\n\t\tthis._events = new Timeline<AutomationEvent>(1000);\n\t\tthis._initialValue = this._param.defaultValue;\n\t\tthis.units = options.units;\n\t\tthis.convert = options.convert;\n\t\tthis._minValue = options.minValue;\n\t\tthis._maxValue = options.maxValue;\n\n\t\t// if the value is defined, set it immediately\n\t\tif (isDefined(options.value) && options.value !== this._toType(this._initialValue)) {\n\t\t\tthis.setValueAtTime(options.value, 0);\n\t\t}\n\t}\n\n\tstatic getDefaults(): ParamOptions<any> {\n\t\treturn Object.assign(ToneWithContext.getDefaults(), {\n\t\t\tconvert: true,\n\t\t\tunits: \"number\" as UnitName,\n\t\t} as ParamOptions<any>);\n\t}\n\n\tget value(): UnitMap[TypeName] {\n\t\tconst now = this.now();\n\t\treturn this.getValueAtTime(now);\n\t}\n\tset value(value) {\n\t\tthis.cancelScheduledValues(this.now());\n\t\tthis.setValueAtTime(value, this.now());\n\t}\n\n\tget minValue(): number {\n\t\t// if it's not the default minValue, return it\n\t\tif (isDefined(this._minValue)) {\n\t\t\treturn this._minValue;\n\t\t} else if (this.units === \"time\" || this.units === \"frequency\" ||\n\t\t\tthis.units === \"normalRange\" || this.units === \"positive\" ||\n\t\t\tthis.units === \"transportTime\" || this.units === \"ticks\" ||\n\t\t\tthis.units === \"bpm\" || this.units === \"hertz\" || this.units === \"samples\") {\n\t\t\treturn 0;\n\t\t} else if (this.units === \"audioRange\") {\n\t\t\treturn -1;\n\t\t} else if (this.units === \"decibels\") {\n\t\t\treturn -Infinity;\n\t\t} else {\n\t\t\treturn this._param.minValue;\n\t\t}\n\t}\n\n\tget maxValue(): number {\n\t\tif (isDefined(this._maxValue)) {\n\t\t\treturn this._maxValue;\n\t\t} else if (this.units === \"normalRange\" ||\n\t\t\tthis.units === \"audioRange\") {\n\t\t\treturn 1;\n\t\t} else {\n\t\t\treturn this._param.maxValue;\n\t\t}\n\t}\n\n\t/**\n\t * Type guard based on the unit name\n\t */\n\tprivate _is<T>(arg: any, type: UnitName): arg is T {\n\t\treturn this.units === type;\n\t}\n\n\t/**\n\t * Make sure the value is always in the defined range\n\t */\n\tprivate _assertRange(value: number): number {\n\t\tif (isDefined(this.maxValue) && isDefined(this.minValue)) {\n\t\t\tassertRange(value, this._fromType(this.minValue), this._fromType(this.maxValue));\n\t\t}\n\t\treturn value;\n\t}\n\n\t/**\n\t * Convert the given value from the type specified by Param.units\n\t * into the destination value (such as Gain or Frequency).\n\t */\n\tprotected _fromType(val: UnitMap[TypeName]): number {\n\t\tif (this.convert && !this.overridden) {\n\t\t\tif (this._is<Time>(val, \"time\")) {\n\t\t\t\treturn this.toSeconds(val);\n\t\t\t} else if (this._is<Decibels>(val, \"decibels\")) {\n\t\t\t\treturn dbToGain(val);\n\t\t\t} else if (this._is<Frequency>(val, \"frequency\")) {\n\t\t\t\treturn this.toFrequency(val);\n\t\t\t} else {\n\t\t\t\treturn val as number;\n\t\t\t}\n\t\t} else if (this.overridden) {\n\t\t\t// if it's overridden, should only schedule 0s\n\t\t\treturn 0;\n\t\t} else {\n\t\t\treturn val as number;\n\t\t}\n\t}\n\n\t/**\n\t * Convert the parameters value into the units specified by Param.units.\n\t */\n\tprotected _toType(val: number): UnitMap[TypeName] {\n\t\tif (this.convert && this.units === \"decibels\") {\n\t\t\treturn gainToDb(val) as UnitMap[TypeName];\n\t\t} else {\n\t\t\treturn val as UnitMap[TypeName];\n\t\t}\n\t}\n\n\t//-------------------------------------\n\t// ABSTRACT PARAM INTERFACE\n\t// all docs are generated from ParamInterface.ts\n\t//-------------------------------------\n\n\tsetValueAtTime(value: UnitMap[TypeName], time: Time): this {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tconst numericValue = this._fromType(value);\n\t\tassert(isFinite(numericValue) && isFinite(computedTime),\n\t\t\t`Invalid argument(s) to setValueAtTime: ${JSON.stringify(value)}, ${JSON.stringify(time)}`);\n\t\tthis._assertRange(numericValue);\n\t\tthis.log(this.units, \"setValueAtTime\", value, computedTime);\n\t\tthis._events.add({\n\t\t\ttime: computedTime,\n\t\t\ttype: \"setValueAtTime\",\n\t\t\tvalue: numericValue,\n\t\t});\n\t\tthis._param.setValueAtTime(numericValue, computedTime);\n\t\treturn this;\n\t}\n\n\tgetValueAtTime(time: Time): UnitMap[TypeName] {\n\t\tconst computedTime = Math.max(this.toSeconds(time), 0);\n\t\tconst after = this._events.getAfter(computedTime);\n\t\tconst before = this._events.get(computedTime);\n\t\tlet value = this._initialValue;\n\t\t// if it was set by\n\t\tif (before === null) {\n\t\t\tvalue = this._initialValue;\n\t\t} else if (before.type === \"setTargetAtTime\" && (after === null || after.type === \"setValueAtTime\")) {\n\t\t\tconst previous = this._events.getBefore(before.time);\n\t\t\tlet previousVal;\n\t\t\tif (previous === null) {\n\t\t\t\tpreviousVal = this._initialValue;\n\t\t\t} else {\n\t\t\t\tpreviousVal = previous.value;\n\t\t\t}\n\t\t\tif (before.type === \"setTargetAtTime\") {\n\t\t\t\tvalue = this._exponentialApproach(before.time, previousVal, before.value, before.constant, computedTime);\n\t\t\t}\n\t\t} else if (after === null) {\n\t\t\tvalue = before.value;\n\t\t} else if (after.type === \"linearRampToValueAtTime\" || after.type === \"exponentialRampToValueAtTime\") {\n\t\t\tlet beforeValue = before.value;\n\t\t\tif (before.type === \"setTargetAtTime\") {\n\t\t\t\tconst previous = this._events.getBefore(before.time);\n\t\t\t\tif (previous === null) {\n\t\t\t\t\tbeforeValue = this._initialValue;\n\t\t\t\t} else {\n\t\t\t\t\tbeforeValue = previous.value;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (after.type === \"linearRampToValueAtTime\") {\n\t\t\t\tvalue = this._linearInterpolate(before.time, beforeValue, after.time, after.value, computedTime);\n\t\t\t} else {\n\t\t\t\tvalue = this._exponentialInterpolate(before.time, beforeValue, after.time, after.value, computedTime);\n\t\t\t}\n\t\t} else {\n\t\t\tvalue = before.value;\n\t\t}\n\t\treturn this._toType(value);\n\t}\n\n\tsetRampPoint(time: Time): this {\n\t\ttime = this.toSeconds(time);\n\t\tlet currentVal = this.getValueAtTime(time);\n\t\tthis.cancelAndHoldAtTime(time);\n\t\tif (this._fromType(currentVal) === 0) {\n\t\t\tcurrentVal = this._toType(this._minOutput);\n\t\t}\n\t\tthis.setValueAtTime(currentVal, time);\n\t\treturn this;\n\t}\n\n\tlinearRampToValueAtTime(value: UnitMap[TypeName], endTime: Time): this {\n\t\tconst numericValue = this._fromType(value);\n\t\tconst computedTime = this.toSeconds(endTime);\n\t\tassert(isFinite(numericValue) && isFinite(computedTime),\n\t\t\t`Invalid argument(s) to linearRampToValueAtTime: ${JSON.stringify(value)}, ${JSON.stringify(endTime)}`);\n\t\tthis._assertRange(numericValue);\n\t\tthis._events.add({\n\t\t\ttime: computedTime,\n\t\t\ttype: \"linearRampToValueAtTime\",\n\t\t\tvalue: numericValue,\n\t\t});\n\t\tthis.log(this.units, \"linearRampToValueAtTime\", value, computedTime);\n\t\tthis._param.linearRampToValueAtTime(numericValue, computedTime);\n\t\treturn this;\n\t}\n\n\texponentialRampToValueAtTime(value: UnitMap[TypeName], endTime: Time): this {\n\t\tlet numericValue = this._fromType(value);\n\t\t// the value can't be 0\n\t\tnumericValue = EQ(numericValue, 0) ? this._minOutput : numericValue;\n\t\tthis._assertRange(numericValue);\n\t\tconst computedTime = this.toSeconds(endTime);\n\t\tassert(isFinite(numericValue) && isFinite(computedTime),\n\t\t\t`Invalid argument(s) to exponentialRampToValueAtTime: ${JSON.stringify(value)}, ${JSON.stringify(endTime)}`);\n\t\t// store the event\n\t\tthis._events.add({\n\t\t\ttime: computedTime,\n\t\t\ttype: \"exponentialRampToValueAtTime\",\n\t\t\tvalue: numericValue,\n\t\t});\n\t\tthis.log(this.units, \"exponentialRampToValueAtTime\", value, computedTime);\n\t\tthis._param.exponentialRampToValueAtTime(numericValue, computedTime);\n\t\treturn this;\n\t}\n\n\texponentialRampTo(value: UnitMap[TypeName], rampTime: Time, startTime?: Time): this {\n\t\tstartTime = this.toSeconds(startTime);\n\t\tthis.setRampPoint(startTime);\n\t\tthis.exponentialRampToValueAtTime(value, startTime + this.toSeconds(rampTime));\n\t\treturn this;\n\t}\n\n\tlinearRampTo(value: UnitMap[TypeName], rampTime: Time, startTime?: Time): this {\n\t\tstartTime = this.toSeconds(startTime);\n\t\tthis.setRampPoint(startTime);\n\t\tthis.linearRampToValueAtTime(value, startTime + this.toSeconds(rampTime));\n\t\treturn this;\n\t}\n\n\ttargetRampTo(value: UnitMap[TypeName], rampTime: Time, startTime?: Time): this {\n\t\tstartTime = this.toSeconds(startTime);\n\t\tthis.setRampPoint(startTime);\n\t\tthis.exponentialApproachValueAtTime(value, startTime, rampTime);\n\t\treturn this;\n\t}\n\n\texponentialApproachValueAtTime(value: UnitMap[TypeName], time: Time, rampTime: Time): this {\n\t\ttime = this.toSeconds(time);\n\t\trampTime = this.toSeconds(rampTime);\n\t\tconst timeConstant = Math.log(rampTime + 1) / Math.log(200);\n\t\tthis.setTargetAtTime(value, time, timeConstant);\n\t\t// at 90% start a linear ramp to the final value\n\t\tthis.cancelAndHoldAtTime(time + rampTime * 0.9);\n\t\tthis.linearRampToValueAtTime(value, time + rampTime);\n\t\treturn this;\n\t}\n\n\tsetTargetAtTime(value: UnitMap[TypeName], startTime: Time, timeConstant: Positive): this {\n\t\tconst numericValue = this._fromType(value);\n\t\t// The value will never be able to approach without timeConstant > 0.\n\t\tassert(isFinite(timeConstant) && timeConstant > 0, \"timeConstant must be a number greater than 0\");\n\t\tconst computedTime = this.toSeconds(startTime);\n\t\tthis._assertRange(numericValue);\n\t\tassert(isFinite(numericValue) && isFinite(computedTime),\n\t\t\t`Invalid argument(s) to setTargetAtTime: ${JSON.stringify(value)}, ${JSON.stringify(startTime)}`);\n\t\tthis._events.add({\n\t\t\tconstant: timeConstant,\n\t\t\ttime: computedTime,\n\t\t\ttype: \"setTargetAtTime\",\n\t\t\tvalue: numericValue,\n\t\t});\n\t\tthis.log(this.units, \"setTargetAtTime\", value, computedTime, timeConstant);\n\t\tthis._param.setTargetAtTime(numericValue, computedTime, timeConstant);\n\t\treturn this;\n\t}\n\n\tsetValueCurveAtTime(values: UnitMap[TypeName][], startTime: Time, duration: Time, scaling = 1): this {\n\t\tduration = this.toSeconds(duration);\n\t\tstartTime = this.toSeconds(startTime);\n\t\tconst startingValue = this._fromType(values[0]) * scaling;\n\t\tthis.setValueAtTime(this._toType(startingValue), startTime);\n\t\tconst segTime = duration / (values.length - 1);\n\t\tfor (let i = 1; i < values.length; i++) {\n\t\t\tconst numericValue = this._fromType(values[i]) * scaling;\n\t\t\tthis.linearRampToValueAtTime(this._toType(numericValue), startTime + i * segTime);\n\t\t}\n\t\treturn this;\n\t}\n\n\tcancelScheduledValues(time: Time): this {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tassert(isFinite(computedTime), `Invalid argument to cancelScheduledValues: ${JSON.stringify(time)}`);\n\t\tthis._events.cancel(computedTime);\n\t\tthis._param.cancelScheduledValues(computedTime);\n\t\tthis.log(this.units, \"cancelScheduledValues\", computedTime);\n\t\treturn this;\n\t}\n\n\tcancelAndHoldAtTime(time: Time): this {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tconst valueAtTime = this._fromType(this.getValueAtTime(computedTime));\n\t\t// remove the schedule events\n\t\tassert(isFinite(computedTime), `Invalid argument to cancelAndHoldAtTime: ${JSON.stringify(time)}`);\n\n\t\tthis.log(this.units, \"cancelAndHoldAtTime\", computedTime, \"value=\" + valueAtTime);\n\t\t\n\t\t// if there is an event at the given computedTime\n\t\t// and that even is not a \"set\"\n\t\tconst before = this._events.get(computedTime);\n\t\tconst after = this._events.getAfter(computedTime);\n\t\tif (before && EQ(before.time, computedTime)) {\n\t\t\t// remove everything after\n\t\t\tif (after) {\n\t\t\t\tthis._param.cancelScheduledValues(after.time);\n\t\t\t\tthis._events.cancel(after.time);\n\t\t\t} else {\n\t\t\t\tthis._param.cancelAndHoldAtTime(computedTime);\n\t\t\t\tthis._events.cancel(computedTime + this.sampleTime);\n\t\t\t}\n\t\t} else if (after) {\n\t\t\tthis._param.cancelScheduledValues(after.time);\n\t\t\t// cancel the next event(s)\n\t\t\tthis._events.cancel(after.time);\n\t\t\tif (after.type === \"linearRampToValueAtTime\") {\n\t\t\t\tthis.linearRampToValueAtTime(this._toType(valueAtTime), computedTime);\n\t\t\t} else if (after.type === \"exponentialRampToValueAtTime\") {\n\t\t\t\tthis.exponentialRampToValueAtTime(this._toType(valueAtTime), computedTime);\n\t\t\t}\n\t\t}\n\n\t\t// set the value at the given time\n\t\tthis._events.add({\n\t\t\ttime: computedTime,\n\t\t\ttype: \"setValueAtTime\",\n\t\t\tvalue: valueAtTime,\n\t\t});\n\t\tthis._param.setValueAtTime(valueAtTime, computedTime);\n\t\treturn this;\n\t}\n\n\trampTo(value: UnitMap[TypeName], rampTime: Time = 0.1, startTime?: Time): this {\n\t\tif (this.units === \"frequency\" || this.units === \"bpm\" || this.units === \"decibels\") {\n\t\t\tthis.exponentialRampTo(value, rampTime, startTime);\n\t\t} else {\n\t\t\tthis.linearRampTo(value, rampTime, startTime);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Apply all of the previously scheduled events to the passed in Param or AudioParam.\n\t * The applied values will start at the context's current time and schedule\n\t * all of the events which are scheduled on this Param onto the passed in param.\n\t */\n\tapply(param: Param | AudioParam): this {\n\t\tconst now = this.context.currentTime;\n\t\t// set the param's value at the current time and schedule everything else\n\t\tparam.setValueAtTime(this.getValueAtTime(now) as number, now);\n\t\t// if the previous event was a curve, then set the rest of it\n\t\tconst previousEvent = this._events.get(now);\n\t\tif (previousEvent && previousEvent.type === \"setTargetAtTime\") {\n\t\t\t// approx it until the next event with linear ramps\n\t\t\tconst nextEvent = this._events.getAfter(previousEvent.time);\n\t\t\t// or for 2 seconds if there is no event\n\t\t\tconst endTime = nextEvent ? nextEvent.time : now + 2;\n\t\t\tconst subdivisions = (endTime - now) / 10;\n\t\t\tfor (let i = now; i < endTime; i += subdivisions) {\n\t\t\t\tparam.linearRampToValueAtTime(this.getValueAtTime(i) as number, i);\n\t\t\t}\n\t\t}\n\t\tthis._events.forEachAfter(this.context.currentTime, event => {\n\t\t\tif (event.type === \"cancelScheduledValues\") {\n\t\t\t\tparam.cancelScheduledValues(event.time);\n\t\t\t} else if (event.type === \"setTargetAtTime\") {\n\t\t\t\tparam.setTargetAtTime(event.value, event.time, event.constant);\n\t\t\t} else {\n\t\t\t\tparam[event.type](event.value, event.time);\n\t\t\t}\n\t\t});\n\t\treturn this;\n\t}\n\n\t/**\n\t * Replace the Param's internal AudioParam. Will apply scheduled curves \n\t * onto the parameter and replace the connections.\n\t */\n\tsetParam(param: AudioParam): this {\n\t\tassert(this._swappable, \"The Param must be assigned as 'swappable' in the constructor\");\n\t\tconst input = this.input as GainNode;\n\t\tinput.disconnect(this._param);\n\t\tthis.apply(param);\n\t\tthis._param = param;\n\t\tinput.connect(this._param);\n\t\treturn this;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._events.dispose();\n\t\treturn this;\n\t}\n\n\tget defaultValue(): UnitMap[TypeName] {\n\t\treturn this._toType(this._param.defaultValue);\n\t}\n\n\t//-------------------------------------\n\t// \tAUTOMATION CURVE CALCULATIONS\n\t// \tMIT License, copyright (c) 2014 Jordan Santell\n\t//-------------------------------------\n\n\t// Calculates the the value along the curve produced by setTargetAtTime\n\tprotected _exponentialApproach(t0: number, v0: number, v1: number, timeConstant: number, t: number): number {\n\t\treturn v1 + (v0 - v1) * Math.exp(-(t - t0) / timeConstant);\n\t}\n\n\t// Calculates the the value along the curve produced by linearRampToValueAtTime\n\tprotected _linearInterpolate(t0: number, v0: number, t1: number, v1: number, t: number): number {\n\t\treturn v0 + (v1 - v0) * ((t - t0) / (t1 - t0));\n\t}\n\n\t// Calculates the the value along the curve produced by exponentialRampToValueAtTime\n\tprotected _exponentialInterpolate(t0: number, v0: number, t1: number, v1: number, t: number): number {\n\t\treturn v0 * Math.pow(v1 / v0, (t - t0) / (t1 - t0));\n\t}\n}\n","import { isAudioNode, isAudioParam } from \"../util/AdvancedTypeCheck\";\nimport { isDefined } from \"../util/TypeCheck\";\nimport { Param } from \"./Param\";\nimport { ToneWithContext, ToneWithContextOptions } from \"./ToneWithContext\";\nimport { assert, warn } from \"../util/Debug\";\n\nexport type InputNode = ToneAudioNode | AudioNode | Param<any> | AudioParam;\nexport type OutputNode = ToneAudioNode | AudioNode;\n\ninterface ChannelProperties {\n\tchannelCount: number;\n\tchannelCountMode: ChannelCountMode;\n\tchannelInterpretation: ChannelInterpretation;\n}\n\n/**\n * The possible options for this node\n */\nexport type ToneAudioNodeOptions = ToneWithContextOptions;\n\n/**\n * ToneAudioNode is the base class for classes which process audio.\n */\nexport abstract class ToneAudioNode<Options extends ToneAudioNodeOptions = ToneAudioNodeOptions>\n\textends ToneWithContext<Options> {\n\n\t/**\n\t * The name of the class\n\t */\n\tabstract readonly name: string = \"ToneAudioNode\";\n\n\t/**\n\t * The input node or nodes. If the object is a source,\n\t * it does not have any input and this.input is undefined.\n\t */\n\tabstract input: InputNode | undefined;\n\n\t/**\n\t * The output nodes. If the object is a sink,\n\t * it does not have any output and this.output is undefined.\n\t */\n\tabstract output: OutputNode | undefined;\n\n\t/**\n\t * The number of inputs feeding into the AudioNode.\n\t * For source nodes, this will be 0.\n\t * @example\n\t * const node = new Tone.Gain();\n\t * console.log(node.numberOfInputs);\n\t */\n\tget numberOfInputs(): number {\n\t\tif (isDefined(this.input)) {\n\t\t\tif (isAudioParam(this.input) || this.input instanceof Param) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\treturn this.input.numberOfInputs;\n\t\t\t}\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\t/**\n\t * The number of outputs of the AudioNode.\n\t * @example\n\t * const node = new Tone.Gain();\n\t * console.log(node.numberOfOutputs);\n\t */\n\tget numberOfOutputs(): number {\n\t\tif (isDefined(this.output)) {\n\t\t\treturn this.output.numberOfOutputs;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\t/**\n\t * List all of the node that must be set to match the ChannelProperties\n\t */\n\tprotected _internalChannels: OutputNode[] = [];\n\n\t//-------------------------------------\n\t// AUDIO PROPERTIES\n\t//-------------------------------------\n\n\t/**\n\t * Used to decide which nodes to get/set properties on\n\t */\n\tprivate _isAudioNode(node: any): node is AudioNode | ToneAudioNode {\n\t\treturn isDefined(node) && (node instanceof ToneAudioNode || isAudioNode(node));\n\t}\n\n\t/**\n\t * Get all of the audio nodes (either internal or input/output) which together\n\t * make up how the class node responds to channel input/output\n\t */\n\tprivate _getInternalNodes(): OutputNode[] {\n\t\tconst nodeList = this._internalChannels.slice(0);\n\t\tif (this._isAudioNode(this.input)) {\n\t\t\tnodeList.push(this.input);\n\t\t}\n\t\tif (this._isAudioNode(this.output)) {\n\t\t\tif (this.input !== this.output) {\n\t\t\t\tnodeList.push(this.output);\n\t\t\t}\n\t\t}\n\t\treturn nodeList;\n\t}\n\n\t/**\n\t * Set the audio options for this node such as channelInterpretation\n\t * channelCount, etc.\n\t * @param options\n\t */\n\tprivate _setChannelProperties(options: ChannelProperties): void {\n\t\tconst nodeList = this._getInternalNodes();\n\t\tnodeList.forEach(node => {\n\t\t\tnode.channelCount = options.channelCount;\n\t\t\tnode.channelCountMode = options.channelCountMode;\n\t\t\tnode.channelInterpretation = options.channelInterpretation;\n\t\t});\n\t}\n\n\t/**\n\t * Get the current audio options for this node such as channelInterpretation\n\t * channelCount, etc.\n\t */\n\tprivate _getChannelProperties(): ChannelProperties {\n\t\tconst nodeList = this._getInternalNodes();\n\t\tassert(nodeList.length > 0, \"ToneAudioNode does not have any internal nodes\");\n\t\t// use the first node to get properties\n\t\t// they should all be the same\n\t\tconst node = nodeList[0];\n\t\treturn {\n\t\t\tchannelCount: node.channelCount,\n\t\t\tchannelCountMode: node.channelCountMode,\n\t\t\tchannelInterpretation: node.channelInterpretation,\n\t\t};\n\t}\n\n\t/**\n\t * channelCount is the number of channels used when up-mixing and down-mixing\n\t * connections to any inputs to the node. The default value is 2 except for\n\t * specific nodes where its value is specially determined.\n\t */\n\tget channelCount(): number {\n\t\treturn this._getChannelProperties().channelCount;\n\t}\n\tset channelCount(channelCount) {\n\t\tconst props = this._getChannelProperties();\n\t\t// merge it with the other properties\n\t\tthis._setChannelProperties(Object.assign(props, { channelCount }));\n\t}\n\n\t/**\n\t * channelCountMode determines how channels will be counted when up-mixing and\n\t * down-mixing connections to any inputs to the node.\n\t * The default value is \"max\". This attribute has no effect for nodes with no inputs.\n\t * * \"max\" - computedNumberOfChannels is the maximum of the number of channels of all connections to an input. In this mode channelCount is ignored.\n\t * * \"clamped-max\" - computedNumberOfChannels is determined as for \"max\" and then clamped to a maximum value of the given channelCount.\n\t * * \"explicit\" - computedNumberOfChannels is the exact value as specified by the channelCount.\n\t */\n\tget channelCountMode(): ChannelCountMode {\n\t\treturn this._getChannelProperties().channelCountMode;\n\t}\n\tset channelCountMode(channelCountMode) {\n\t\tconst props = this._getChannelProperties();\n\t\t// merge it with the other properties\n\t\tthis._setChannelProperties(Object.assign(props, { channelCountMode }));\n\t}\n\n\t/**\n\t * channelInterpretation determines how individual channels will be treated\n\t * when up-mixing and down-mixing connections to any inputs to the node.\n\t * The default value is \"speakers\".\n\t */\n\tget channelInterpretation(): ChannelInterpretation {\n\t\treturn this._getChannelProperties().channelInterpretation;\n\t}\n\tset channelInterpretation(channelInterpretation) {\n\t\tconst props = this._getChannelProperties();\n\t\t// merge it with the other properties\n\t\tthis._setChannelProperties(Object.assign(props, { channelInterpretation }));\n\t}\n\n\t//-------------------------------------\n\t// CONNECTIONS\n\t//-------------------------------------\n\n\t/**\n\t * connect the output of a ToneAudioNode to an AudioParam, AudioNode, or ToneAudioNode\n\t * @param destination The output to connect to\n\t * @param outputNum The output to connect from\n\t * @param inputNum The input to connect to\n\t */\n\tconnect(destination: InputNode, outputNum = 0, inputNum = 0): this {\n\t\tconnect(this, destination, outputNum, inputNum);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Connect the output to the context's destination node.\n\t * @example\n\t * const osc = new Tone.Oscillator(\"C2\").start();\n\t * osc.toDestination();\n\t */\n\ttoDestination(): this {\n\t\tthis.connect(this.context.destination);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Connect the output to the context's destination node.\n\t * See [[toDestination]]\n\t * @deprecated\n\t */\n\ttoMaster(): this {\n\t\twarn(\"toMaster() has been renamed toDestination()\");\n\t\treturn this.toDestination();\n\t}\n\n\t/**\n\t * disconnect the output\n\t */\n\tdisconnect(destination?: InputNode, outputNum = 0, inputNum = 0): this {\n\t\tdisconnect(this, destination, outputNum, inputNum);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Connect the output of this node to the rest of the nodes in series.\n\t * @example\n\t * const player = new Tone.Player(\"https://tonejs.github.io/audio/drum-samples/handdrum-loop.mp3\");\n\t * player.autostart = true;\n\t * const filter = new Tone.AutoFilter(4).start();\n\t * const distortion = new Tone.Distortion(0.5);\n\t * // connect the player to the filter, distortion and then to the master output\n\t * player.chain(filter, distortion, Tone.Destination);\n\t */\n\tchain(...nodes: InputNode[]): this {\n\t\tconnectSeries(this, ...nodes);\n\t\treturn this;\n\t}\n\n\t/**\n\t * connect the output of this node to the rest of the nodes in parallel.\n\t * @example\n\t * const player = new Tone.Player(\"https://tonejs.github.io/audio/drum-samples/conga-rhythm.mp3\");\n\t * player.autostart = true;\n\t * const pitchShift = new Tone.PitchShift(4).toDestination();\n\t * const filter = new Tone.Filter(\"G5\").toDestination();\n\t * // connect a node to the pitch shift and filter in parallel\n\t * player.fan(pitchShift, filter);\n\t */\n\tfan(...nodes: InputNode[]): this {\n\t\tnodes.forEach(node => this.connect(node));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Dispose and disconnect\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tif (isDefined(this.input)) {\n\t\t\tif (this.input instanceof ToneAudioNode) {\n\t\t\t\tthis.input.dispose();\n\t\t\t} else if (isAudioNode(this.input)) {\n\t\t\t\tthis.input.disconnect();\n\t\t\t}\n\t\t}\n\t\tif (isDefined(this.output)) {\n\t\t\tif (this.output instanceof ToneAudioNode) {\n\t\t\t\tthis.output.dispose();\n\t\t\t} else if (isAudioNode(this.output)) {\n\t\t\t\tthis.output.disconnect();\n\t\t\t}\n\t\t}\n\t\tthis._internalChannels = [];\n\t\treturn this;\n\t}\n}\n\n//-------------------------------------\n// CONNECTIONS\n//-------------------------------------\n\n/**\n * connect together all of the arguments in series\n * @param nodes\n */\nexport function connectSeries(...nodes: InputNode[]): void {\n\tconst first = nodes.shift();\n\tnodes.reduce((prev, current) => {\n\t\tif (prev instanceof ToneAudioNode) {\n\t\t\tprev.connect(current);\n\t\t} else if (isAudioNode(prev)) {\n\t\t\tconnect(prev, current);\n\t\t}\n\t\treturn current;\n\t}, first);\n}\n\n/**\n * Connect two nodes together so that signal flows from the\n * first node to the second. Optionally specify the input and output channels.\n * @param srcNode The source node\n * @param dstNode The destination node\n * @param outputNumber The output channel of the srcNode\n * @param inputNumber The input channel of the dstNode\n */\nexport function connect(srcNode: OutputNode, dstNode: InputNode, outputNumber = 0, inputNumber = 0): void {\n\n\tassert(isDefined(srcNode), \"Cannot connect from undefined node\");\n\tassert(isDefined(dstNode), \"Cannot connect to undefined node\");\n\n\tif (dstNode instanceof ToneAudioNode || isAudioNode(dstNode)) {\n\t\tassert(dstNode.numberOfInputs > 0, \"Cannot connect to node with no inputs\");\n\t}\n\tassert(srcNode.numberOfOutputs > 0, \"Cannot connect from node with no outputs\");\n\n\t// resolve the input of the dstNode\n\twhile ((dstNode instanceof ToneAudioNode || dstNode instanceof Param)) {\n\t\tif (isDefined(dstNode.input)) {\n\t\t\tdstNode = dstNode.input;\n\t\t}\n\t}\n\n\twhile (srcNode instanceof ToneAudioNode) {\n\t\tif (isDefined(srcNode.output)) {\n\t\t\tsrcNode = srcNode.output;\n\t\t}\n\t}\n\n\t// make the connection\n\tif (isAudioParam(dstNode)) {\n\t\tsrcNode.connect(dstNode as AudioParam, outputNumber);\n\t} else {\n\t\tsrcNode.connect(dstNode, outputNumber, inputNumber);\n\t}\n}\n\n/**\n * Disconnect a node from all nodes or optionally include a destination node and input/output channels.\n * @param srcNode The source node\n * @param dstNode The destination node\n * @param outputNumber The output channel of the srcNode\n * @param inputNumber The input channel of the dstNode\n */\nexport function disconnect(\n\tsrcNode: OutputNode,\n\tdstNode?: InputNode,\n\toutputNumber = 0,\n\tinputNumber = 0,\n): void {\n\n\t// resolve the destination node\n\tif (isDefined(dstNode)) {\n\t\twhile (dstNode instanceof ToneAudioNode) {\n\t\t\tdstNode = dstNode.input;\n\t\t}\n\t}\n\n\t// resolve the src node\n\twhile (!(isAudioNode(srcNode))) {\n\t\tif (isDefined(srcNode.output)) {\n\t\t\tsrcNode = srcNode.output;\n\t\t}\n\t}\n\n\tif (isAudioParam(dstNode)) {\n\t\tsrcNode.disconnect(dstNode, outputNumber);\n\t} else if (isAudioNode(dstNode)) {\n\t\tsrcNode.disconnect(dstNode, outputNumber, inputNumber);\n\t} else {\n\t\tsrcNode.disconnect();\n\t}\n}\n","import { Param } from \"../context/Param\";\nimport { UnitMap, UnitName } from \"../type/Units\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { readOnly } from \"../util/Interface\";\nimport { ToneAudioNode, ToneAudioNodeOptions } from \"./ToneAudioNode\";\n\ninterface GainOptions<TypeName extends UnitName> extends ToneAudioNodeOptions {\n\tgain: UnitMap[TypeName];\n\tunits: TypeName;\n\tconvert: boolean;\n\tminValue?: number;\n\tmaxValue?: number;\n}\n\n/**\n * A thin wrapper around the Native Web Audio GainNode.\n * The GainNode is a basic building block of the Web Audio\n * API and is useful for routing audio and adjusting gains.\n * @category Core\n * @example\n * return Tone.Offline(() => {\n * \tconst gainNode = new Tone.Gain(0).toDestination();\n * \tconst osc = new Tone.Oscillator(30).connect(gainNode).start();\n * \tgainNode.gain.rampTo(1, 0.1);\n * \tgainNode.gain.rampTo(0, 0.4, 0.2);\n * }, 0.7, 1);\n */\nexport class Gain<TypeName extends \"gain\" | \"decibels\" | \"normalRange\" = \"gain\"> extends ToneAudioNode<GainOptions<TypeName>> {\n\n\treadonly name: string = \"Gain\";\n\n\t/**\n\t * The gain parameter of the gain node.\n\t * @example\n\t * const gainNode = new Tone.Gain(0).toDestination();\n\t * const osc = new Tone.Oscillator().connect(gainNode).start();\n\t * gainNode.gain.rampTo(1, 0.1);\n\t * gainNode.gain.rampTo(0, 2, \"+0.5\");\n\t */\n\treadonly gain: Param<TypeName>;\n\n\t/**\n\t * The wrapped GainNode.\n\t */\n\tprivate _gainNode: GainNode = this.context.createGain();\n\n\t// input = output\n\treadonly input: GainNode = this._gainNode;\n\treadonly output: GainNode = this._gainNode;\n\n\t/**\n\t * @param gain The initial gain of the GainNode\n\t * @param units The units of the gain parameter.\n\t */\n\tconstructor(gain?: UnitMap[TypeName], units?: TypeName);\n\tconstructor(options?: Partial<GainOptions<TypeName>>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(Gain.getDefaults(), arguments, [\"gain\", \"units\"]));\n\t\tconst options = optionsFromArguments(Gain.getDefaults(), arguments, [\"gain\", \"units\"]);\n\n\t\tthis.gain = new Param({\n\t\t\tcontext: this.context,\n\t\t\tconvert: options.convert,\n\t\t\tparam: this._gainNode.gain,\n\t\t\tunits: options.units,\n\t\t\tvalue: options.gain,\n\t\t\tminValue: options.minValue,\n\t\t\tmaxValue: options.maxValue,\n\t\t});\n\t\treadOnly(this, \"gain\");\n\t}\n\n\tstatic getDefaults(): GainOptions<any> {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tconvert: true,\n\t\t\tgain: 1,\n\t\t\tunits: \"gain\",\n\t\t});\n\t}\n\n\t/**\n\t * Clean up.\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._gainNode.disconnect();\n\t\tthis.gain.dispose();\n\t\treturn this;\n\t}\n}\n","import { Gain } from \"../core/context/Gain\";\nimport {\n\tToneAudioNode,\n\tToneAudioNodeOptions,\n} from \"../core/context/ToneAudioNode\";\nimport { GainFactor, Seconds, Time } from \"../core/type/Units\";\nimport { noOp } from \"../core/util/Interface\";\nimport { assert } from \"../core/util/Debug\";\nimport { BasicPlaybackState } from \"../core/util/StateTimeline\";\n\nexport type OneShotSourceCurve = \"linear\" | \"exponential\";\n\ntype onEndedCallback = (source: OneShotSource<any>) => void;\n\nexport interface OneShotSourceOptions extends ToneAudioNodeOptions {\n\tonended: onEndedCallback;\n\tfadeIn: Time;\n\tfadeOut: Time;\n\tcurve: OneShotSourceCurve;\n}\n\n/**\n * Base class for fire-and-forget nodes\n */\nexport abstract class OneShotSource<\n\tOptions extends ToneAudioNodeOptions\n> extends ToneAudioNode<Options> {\n\t/**\n\t * The callback to invoke after the\n\t * source is done playing.\n\t */\n\tonended: onEndedCallback = noOp;\n\n\t/**\n\t * Sources do not have input nodes\n\t */\n\tinput: undefined;\n\n\t/**\n\t * The start time\n\t */\n\tprotected _startTime = -1;\n\n\t/**\n\t * The stop time\n\t */\n\tprotected _stopTime = -1;\n\n\t/**\n\t * The id of the timeout\n\t */\n\tprivate _timeout = -1;\n\n\t/**\n\t * The public output node\n\t */\n\toutput: Gain = new Gain({\n\t\tcontext: this.context,\n\t\tgain: 0,\n\t});\n\n\t/**\n\t * The output gain node.\n\t */\n\tprotected _gainNode = this.output;\n\n\t/**\n\t * The fadeIn time of the amplitude envelope.\n\t */\n\tprotected _fadeIn: Time;\n\n\t/**\n\t * The fadeOut time of the amplitude envelope.\n\t */\n\tprotected _fadeOut: Time;\n\n\t/**\n\t * The curve applied to the fades, either \"linear\" or \"exponential\"\n\t */\n\tprotected _curve: OneShotSourceCurve;\n\n\tconstructor(options: OneShotSourceOptions) {\n\t\tsuper(options);\n\n\t\tthis._fadeIn = options.fadeIn;\n\t\tthis._fadeOut = options.fadeOut;\n\t\tthis._curve = options.curve;\n\t\tthis.onended = options.onended;\n\t}\n\n\tstatic getDefaults(): OneShotSourceOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tcurve: \"linear\" as OneShotSourceCurve,\n\t\t\tfadeIn: 0,\n\t\t\tfadeOut: 0,\n\t\t\tonended: noOp,\n\t\t});\n\t}\n\n\t/**\n\t * Stop the source node\n\t */\n\tprotected abstract _stopSource(time: Seconds): void;\n\n\t/**\n\t * Start the source node at the given time\n\t * @param time When to start the node\n\t */\n\tprotected abstract start(time?: Time): this;\n\t/**\n\t * Start the source at the given time\n\t * @param time When to start the source\n\t */\n\tprotected _startGain(time: Seconds, gain: GainFactor = 1): this {\n\t\tassert(\n\t\t\tthis._startTime === -1,\n\t\t\t\"Source cannot be started more than once\"\n\t\t);\n\t\t// apply a fade in envelope\n\t\tconst fadeInTime = this.toSeconds(this._fadeIn);\n\n\t\t// record the start time\n\t\tthis._startTime = time + fadeInTime;\n\t\tthis._startTime = Math.max(this._startTime, this.context.currentTime);\n\n\t\t// schedule the envelope\n\t\tif (fadeInTime > 0) {\n\t\t\tthis._gainNode.gain.setValueAtTime(0, time);\n\t\t\tif (this._curve === \"linear\") {\n\t\t\t\tthis._gainNode.gain.linearRampToValueAtTime(\n\t\t\t\t\tgain,\n\t\t\t\t\ttime + fadeInTime\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis._gainNode.gain.exponentialApproachValueAtTime(\n\t\t\t\t\tgain,\n\t\t\t\t\ttime,\n\t\t\t\t\tfadeInTime\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tthis._gainNode.gain.setValueAtTime(gain, time);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Stop the source node at the given time.\n\t * @param time When to stop the source\n\t */\n\tstop(time?: Time): this {\n\t\tthis.log(\"stop\", time);\n\t\tthis._stopGain(this.toSeconds(time));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Stop the source at the given time\n\t * @param time When to stop the source\n\t */\n\tprotected _stopGain(time: Seconds): this {\n\t\tassert(this._startTime !== -1, \"'start' must be called before 'stop'\");\n\t\t// cancel the previous stop\n\t\tthis.cancelStop();\n\n\t\t// the fadeOut time\n\t\tconst fadeOutTime = this.toSeconds(this._fadeOut);\n\n\t\t// schedule the stop callback\n\t\tthis._stopTime = this.toSeconds(time) + fadeOutTime;\n\t\tthis._stopTime = Math.max(this._stopTime, this.context.currentTime);\n\t\tif (fadeOutTime > 0) {\n\t\t\t// start the fade out curve at the given time\n\t\t\tif (this._curve === \"linear\") {\n\t\t\t\tthis._gainNode.gain.linearRampTo(0, fadeOutTime, time);\n\t\t\t} else {\n\t\t\t\tthis._gainNode.gain.targetRampTo(0, fadeOutTime, time);\n\t\t\t}\n\t\t} else {\n\t\t\t// stop any ongoing ramps, and set the value to 0\n\t\t\tthis._gainNode.gain.cancelAndHoldAtTime(time);\n\t\t\tthis._gainNode.gain.setValueAtTime(0, time);\n\t\t}\n\t\tthis.context.clearTimeout(this._timeout);\n\t\tthis._timeout = this.context.setTimeout(() => {\n\t\t\t// allow additional time for the exponential curve to fully decay\n\t\t\tconst additionalTail =\n\t\t\t\tthis._curve === \"exponential\" ? fadeOutTime * 2 : 0;\n\t\t\tthis._stopSource(this.now() + additionalTail);\n\t\t\tthis._onended();\n\t\t}, this._stopTime - this.context.currentTime);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Invoke the onended callback\n\t */\n\tprotected _onended(): void {\n\t\tif (this.onended !== noOp) {\n\t\t\tthis.onended(this);\n\t\t\t// overwrite onended to make sure it only is called once\n\t\t\tthis.onended = noOp;\n\t\t\t// dispose when it's ended to free up for garbage collection only in the online context\n\t\t\tif (!this.context.isOffline) {\n\t\t\t\tconst disposeCallback = () => this.dispose();\n\t\t\t\t// @ts-ignore\n\t\t\t\tif (typeof window.requestIdleCallback !== \"undefined\") {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\twindow.requestIdleCallback(disposeCallback);\n\t\t\t\t} else {\n\t\t\t\t\tsetTimeout(disposeCallback, 1000);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get the playback state at the given time\n\t */\n\tgetStateAtTime = function(time: Time): BasicPlaybackState {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tif (\n\t\t\tthis._startTime !== -1 &&\n\t\t\tcomputedTime >= this._startTime &&\n\t\t\t(this._stopTime === -1 || computedTime <= this._stopTime)\n\t\t) {\n\t\t\treturn \"started\";\n\t\t} else {\n\t\t\treturn \"stopped\";\n\t\t}\n\t};\n\n\t/**\n\t * Get the playback state at the current time\n\t */\n\tget state(): BasicPlaybackState {\n\t\treturn this.getStateAtTime(this.now());\n\t}\n\n\t/**\n\t * Cancel a scheduled stop event\n\t */\n\tcancelStop(): this {\n\t\tthis.log(\"cancelStop\");\n\t\tassert(this._startTime !== -1, \"Source is not started\");\n\t\t// cancel the stop envelope\n\t\tthis._gainNode.gain.cancelScheduledValues(\n\t\t\tthis._startTime + this.sampleTime\n\t\t);\n\t\tthis.context.clearTimeout(this._timeout);\n\t\tthis._stopTime = -1;\n\t\treturn this;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._gainNode.disconnect();\n\t\treturn this;\n\t}\n}\n","import { connect } from \"../core/context/ToneAudioNode\";\nimport { Param } from \"../core/context/Param\";\nimport { Seconds, Time, UnitMap, UnitName } from \"../core/type/Units\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { OneShotSource, OneShotSourceOptions } from \"../source/OneShotSource\";\n\nexport interface ToneConstantSourceOptions<TypeName extends UnitName> extends OneShotSourceOptions {\n\tconvert: boolean;\n\toffset: UnitMap[TypeName];\n\tunits: TypeName;\n\tminValue?: number;\n\tmaxValue?: number;\n}\n\n/**\n * Wrapper around the native fire-and-forget ConstantSource.\n * Adds the ability to reschedule the stop method.\n * @category Signal\n */\nexport class ToneConstantSource<TypeName extends UnitName = \"number\"> extends OneShotSource<ToneConstantSourceOptions<TypeName>> {\n\n\treadonly name: string = \"ToneConstantSource\";\n\n\t/**\n\t * The signal generator\n\t */\n\tprivate _source = this.context.createConstantSource();\n\n\t/**\n\t * The offset of the signal generator\n\t */\n\treadonly offset: Param<TypeName>;\n\n\t/**\n\t * @param offset The offset value\n\t */\n\tconstructor(offset: UnitMap[TypeName]);\n\tconstructor(options?: Partial<ToneConstantSourceOptions<TypeName>>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(ToneConstantSource.getDefaults(), arguments, [\"offset\"]));\n\t\tconst options = optionsFromArguments(ToneConstantSource.getDefaults(), arguments, [\"offset\"]);\n\n\t\tconnect(this._source, this._gainNode);\n\n\t\tthis.offset = new Param({\n\t\t\tcontext: this.context,\n\t\t\tconvert: options.convert,\n\t\t\tparam: this._source.offset,\n\t\t\tunits: options.units,\n\t\t\tvalue: options.offset,\n\t\t\tminValue: options.minValue,\n\t\t\tmaxValue: options.maxValue,\n\t\t});\n\t}\n\n\tstatic getDefaults(): ToneConstantSourceOptions<any> {\n\t\treturn Object.assign(OneShotSource.getDefaults(), {\n\t\t\tconvert: true,\n\t\t\toffset: 1,\n\t\t\tunits: \"number\" as UnitName,\n\t\t});\n\t}\n\n\t/**\n\t * Start the source node at the given time\n\t * @param time When to start the source\n\t */\n\tstart(time?: Time): this {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tthis.log(\"start\", computedTime);\n\t\tthis._startGain(computedTime);\n\t\tthis._source.start(computedTime);\n\t\treturn this;\n\t}\n\n\tprotected _stopSource(time?: Seconds): void {\n\t\tthis._source.stop(time);\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tif (this.state === \"started\") {\n\t\t\tthis.stop();\n\t\t}\n\t\tthis._source.disconnect();\n\t\tthis.offset.dispose();\n\t\treturn this;\n\t}\n}\n","import { AbstractParam } from \"../core/context/AbstractParam\";\nimport { Param } from \"../core/context/Param\";\nimport { InputNode, OutputNode, ToneAudioNode, ToneAudioNodeOptions } from \"../core/context/ToneAudioNode\";\nimport { connect } from \"../core/context/ToneAudioNode\";\nimport { Time, UnitMap, UnitName } from \"../core/type/Units\";\nimport { isAudioParam } from \"../core/util/AdvancedTypeCheck\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { ToneConstantSource } from \"./ToneConstantSource\";\n\nexport interface SignalOptions<TypeName extends UnitName> extends ToneAudioNodeOptions {\n\tvalue: UnitMap[TypeName];\n\tunits: TypeName;\n\tconvert: boolean;\n\tminValue?: number;\n\tmaxValue?: number;\n}\n\n/**\n * A signal is an audio-rate value. Tone.Signal is a core component of the library.\n * Unlike a number, Signals can be scheduled with sample-level accuracy. Tone.Signal\n * has all of the methods available to native Web Audio\n * [AudioParam](http://webaudio.github.io/web-audio-api/#the-audioparam-interface)\n * as well as additional conveniences. Read more about working with signals\n * [here](https://github.com/Tonejs/Tone.js/wiki/Signals).\n *\n * @example\n * const osc = new Tone.Oscillator().toDestination().start();\n * // a scheduleable signal which can be connected to control an AudioParam or another Signal\n * const signal = new Tone.Signal({\n * \tvalue: \"C4\",\n * \tunits: \"frequency\"\n * }).connect(osc.frequency);\n * // the scheduled ramp controls the connected signal\n * signal.rampTo(\"C2\", 4, \"+0.5\");\n * @category Signal\n */\nexport class Signal<TypeName extends UnitName = \"number\"> extends ToneAudioNode<SignalOptions<any>>\n\timplements AbstractParam<TypeName> {\n\n\treadonly name: string = \"Signal\";\n\n\t/**\n\t * Indicates if the value should be overridden on connection.\n\t */\n\treadonly override: boolean = true;\n\n\t/**\n\t * The constant source node which generates the signal\n\t */\n\tprotected _constantSource: ToneConstantSource<TypeName>;\n\treadonly output: OutputNode;\n\tprotected _param: Param<TypeName>;\n\treadonly input: InputNode;\n\n\t/**\n\t * @param value Initial value of the signal\n\t * @param units The unit name, e.g. \"frequency\"\n\t */\n\tconstructor(value?: UnitMap[TypeName], units?: TypeName);\n\tconstructor(options?: Partial<SignalOptions<TypeName>>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Signal.getDefaults(), arguments, [\"value\", \"units\"]));\n\n\t\tconst options = optionsFromArguments(Signal.getDefaults(), arguments, [\"value\", \"units\"]) as SignalOptions<TypeName>;\n\n\t\tthis.output = this._constantSource = new ToneConstantSource({\n\t\t\tcontext: this.context,\n\t\t\tconvert: options.convert,\n\t\t\toffset: options.value,\n\t\t\tunits: options.units,\n\t\t\tminValue: options.minValue,\n\t\t\tmaxValue: options.maxValue,\n\t\t});\n\t\tthis._constantSource.start(0);\n\t\tthis.input = this._param = this._constantSource.offset;\n\t}\n\n\tstatic getDefaults(): SignalOptions<any> {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tconvert: true,\n\t\t\tunits: \"number\" as UnitName,\n\t\t\tvalue: 0,\n\t\t});\n\t}\n\n\tconnect(destination: InputNode, outputNum = 0, inputNum = 0): this {\n\t\t// start it only when connected to something\n\t\tconnectSignal(this, destination, outputNum, inputNum);\n\t\treturn this;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._param.dispose();\n\t\tthis._constantSource.dispose();\n\t\treturn this;\n\t}\n\n\t//-------------------------------------\n\t// ABSTRACT PARAM INTERFACE\n\t// just a proxy for the ConstantSourceNode's offset AudioParam\n\t// all docs are generated from AbstractParam.ts\n\t//-------------------------------------\n\n\tsetValueAtTime(value: UnitMap[TypeName], time: Time): this {\n\t\tthis._param.setValueAtTime(value, time);\n\t\treturn this;\n\t}\n\tgetValueAtTime(time: Time): UnitMap[TypeName] {\n\t\treturn this._param.getValueAtTime(time);\n\t}\n\tsetRampPoint(time: Time): this {\n\t\tthis._param.setRampPoint(time);\n\t\treturn this;\n\t}\n\tlinearRampToValueAtTime(value: UnitMap[TypeName], time: Time): this {\n\t\tthis._param.linearRampToValueAtTime(value, time);\n\t\treturn this;\n\t}\n\texponentialRampToValueAtTime(value: UnitMap[TypeName], time: Time): this {\n\t\tthis._param.exponentialRampToValueAtTime(value, time);\n\t\treturn this;\n\t}\n\texponentialRampTo(value: UnitMap[TypeName], rampTime: Time, startTime?: Time): this {\n\t\tthis._param.exponentialRampTo(value, rampTime, startTime);\n\t\treturn this;\n\t}\n\tlinearRampTo(value: UnitMap[TypeName], rampTime: Time, startTime?: Time): this {\n\t\tthis._param.linearRampTo(value, rampTime, startTime);\n\t\treturn this;\n\t}\n\ttargetRampTo(value: UnitMap[TypeName], rampTime: Time, startTime?: Time): this {\n\t\tthis._param.targetRampTo(value, rampTime, startTime);\n\t\treturn this;\n\t}\n\texponentialApproachValueAtTime(value: UnitMap[TypeName], time: Time, rampTime: Time): this {\n\t\tthis._param.exponentialApproachValueAtTime(value, time, rampTime);\n\t\treturn this;\n\t}\n\tsetTargetAtTime(value: UnitMap[TypeName], startTime: Time, timeConstant: number): this {\n\t\tthis._param.setTargetAtTime(value, startTime, timeConstant);\n\t\treturn this;\n\t}\n\tsetValueCurveAtTime(values: UnitMap[TypeName][], startTime: Time, duration: Time, scaling?: number): this {\n\t\tthis._param.setValueCurveAtTime(values, startTime, duration, scaling);\n\t\treturn this;\n\t}\n\tcancelScheduledValues(time: Time): this {\n\t\tthis._param.cancelScheduledValues(time);\n\t\treturn this;\n\t}\n\tcancelAndHoldAtTime(time: Time): this {\n\t\tthis._param.cancelAndHoldAtTime(time);\n\t\treturn this;\n\t}\n\trampTo(value: UnitMap[TypeName], rampTime: Time, startTime?: Time): this {\n\t\tthis._param.rampTo(value, rampTime, startTime);\n\t\treturn this;\n\t}\n\n\tget value(): UnitMap[TypeName] {\n\t\treturn this._param.value;\n\t}\n\tset value(value: UnitMap[TypeName]) {\n\t\tthis._param.value = value;\n\t}\n\n\tget convert(): boolean {\n\t\treturn this._param.convert;\n\t}\n\tset convert(convert: boolean) {\n\t\tthis._param.convert = convert;\n\t}\n\n\tget units(): UnitName {\n\t\treturn this._param.units;\n\t}\n\n\tget overridden(): boolean {\n\t\treturn this._param.overridden;\n\t}\n\tset overridden(overridden: boolean) {\n\t\tthis._param.overridden = overridden;\n\t}\n\n\tget maxValue(): number {\n\t\treturn this._param.maxValue;\n\t}\n\tget minValue(): number {\n\t\treturn this._param.minValue;\n\t}\n\n\t/**\n\t * See [[Param.apply]].\n\t */\n\tapply(param: Param | AudioParam): this {\n\t\tthis._param.apply(param);\n\t\treturn this;\n\t}\n}\n\n/**\n * When connecting from a signal, it's necessary to zero out the node destination\n * node if that node is also a signal. If the destination is not 0, then the values\n * will be summed. This method insures that the output of the destination signal will\n * be the same as the source signal, making the destination signal a pass through node.\n * @param signal The output signal to connect from\n * @param destination the destination to connect to\n * @param outputNum the optional output number\n * @param inputNum the input number\n */\nexport function connectSignal(signal: OutputNode, destination: InputNode, outputNum?: number, inputNum?: number): void {\n\tif (destination instanceof Param || isAudioParam(destination) ||\n\t\t(destination instanceof Signal && destination.override)) {\n\t\t// cancel changes\n\t\tdestination.cancelScheduledValues(0);\n\t\t// reset the value\n\t\tdestination.setValueAtTime(0, 0);\n\t\t// mark the value as overridden\n\t\tif (destination instanceof Signal) {\n\t\t\tdestination.overridden = true;\n\t\t}\n\t}\n\tconnect(signal, destination, outputNum, inputNum);\n}\n","import { AutomationEvent, Param, ParamOptions } from \"../context/Param\";\nimport { Seconds, Ticks, Time, UnitMap, UnitName } from \"../type/Units\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { Timeline } from \"../util/Timeline\";\nimport { isUndef } from \"../util/TypeCheck\";\n\ntype TickAutomationEvent = AutomationEvent & {\n\tticks: number;\n};\n\ninterface TickParamOptions<TypeName extends UnitName> extends ParamOptions<TypeName> {\n\tmultiplier: number;\n}\n\n/**\n * A Param class just for computing ticks. Similar to the [[Param]] class,\n * but offers conversion to BPM values as well as ability to compute tick\n * duration and elapsed ticks\n */\nexport class TickParam<TypeName extends \"hertz\" | \"bpm\"> extends Param<TypeName> {\n\n\treadonly name: string = \"TickParam\";\n\n\t/**\n\t * The timeline which tracks all of the automations.\n\t */\n\tprotected _events: Timeline<TickAutomationEvent> = new Timeline(Infinity);\n\n\t/**\n\t * The internal holder for the multiplier value\n\t */\n\tprivate _multiplier = 1;\n\n\t/**\n\t * @param param The AudioParam to wrap\n\t * @param units The unit name\n\t * @param convert Whether or not to convert the value to the target units\n\t */\n\t/**\n\t * @param value The initial value of the signal\n\t */\n\tconstructor(value?: number);\n\tconstructor(options: Partial<TickParamOptions<TypeName>>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(TickParam.getDefaults(), arguments, [\"value\"]));\n\t\tconst options = optionsFromArguments(TickParam.getDefaults(), arguments, [\"value\"]);\n\n\t\t// set the multiplier\n\t\tthis._multiplier = options.multiplier;\n\n\t\t// clear the ticks from the beginning\n\t\tthis._events.cancel(0);\n\t\t// set an initial event\n\t\tthis._events.add({\n\t\t\tticks: 0,\n\t\t\ttime: 0,\n\t\t\ttype: \"setValueAtTime\",\n\t\t\tvalue: this._fromType(options.value),\n\t\t});\n\t\tthis.setValueAtTime(options.value, 0);\n\t}\n\n\tstatic getDefaults(): TickParamOptions<any> {\n\t\treturn Object.assign(Param.getDefaults(), {\n\t\t\tmultiplier: 1,\n\t\t\tunits: \"hertz\",\n\t\t\tvalue: 1,\n\t\t});\n\t}\n\n\tsetTargetAtTime(value: UnitMap[TypeName], time: Time, constant: number): this {\n\t\t// approximate it with multiple linear ramps\n\t\ttime = this.toSeconds(time);\n\t\tthis.setRampPoint(time);\n\t\tconst computedValue = this._fromType(value);\n\n\t\t// start from previously scheduled value\n\t\tconst prevEvent = this._events.get(time) as TickAutomationEvent;\n\t\tconst segments = Math.round(Math.max(1 / constant, 1));\n\t\tfor (let i = 0; i <= segments; i++) {\n\t\t\tconst segTime = constant * i + time;\n\t\t\tconst rampVal = this._exponentialApproach(prevEvent.time, prevEvent.value, computedValue, constant, segTime);\n\t\t\tthis.linearRampToValueAtTime(this._toType(rampVal), segTime);\n\t\t}\n\t\treturn this;\n\t}\n\n\tsetValueAtTime(value: UnitMap[TypeName], time: Time): this {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tsuper.setValueAtTime(value, time);\n\t\tconst event = this._events.get(computedTime) as TickAutomationEvent;\n\t\tconst previousEvent = this._events.previousEvent(event);\n\t\tconst ticksUntilTime = this._getTicksUntilEvent(previousEvent, computedTime);\n\t\tevent.ticks = Math.max(ticksUntilTime, 0);\n\t\treturn this;\n\t}\n\n\tlinearRampToValueAtTime(value: UnitMap[TypeName], time: Time): this {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tsuper.linearRampToValueAtTime(value, time);\n\t\tconst event = this._events.get(computedTime) as TickAutomationEvent;\n\t\tconst previousEvent = this._events.previousEvent(event);\n\t\tconst ticksUntilTime = this._getTicksUntilEvent(previousEvent, computedTime);\n\t\tevent.ticks = Math.max(ticksUntilTime, 0);\n\t\treturn this;\n\t}\n\n\texponentialRampToValueAtTime(value: UnitMap[TypeName], time: Time): this {\n\t\t// aproximate it with multiple linear ramps\n\t\ttime = this.toSeconds(time);\n\t\tconst computedVal = this._fromType(value);\n\n\t\t// start from previously scheduled value\n\t\tconst prevEvent = this._events.get(time) as TickAutomationEvent;\n\t\t// approx 10 segments per second\n\t\tconst segments = Math.round(Math.max((time - prevEvent.time) * 10, 1));\n\t\tconst segmentDur = ((time - prevEvent.time) / segments);\n\t\tfor (let i = 0; i <= segments; i++) {\n\t\t\tconst segTime = segmentDur * i + prevEvent.time;\n\t\t\tconst rampVal = this._exponentialInterpolate(prevEvent.time, prevEvent.value, time, computedVal, segTime);\n\t\t\tthis.linearRampToValueAtTime(this._toType(rampVal), segTime);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns the tick value at the time. Takes into account\n\t * any automation curves scheduled on the signal.\n\t * @param event The time to get the tick count at\n\t * @return The number of ticks which have elapsed at the time given any automations.\n\t */\n\tprivate _getTicksUntilEvent(event: TickAutomationEvent | null, time: number): Ticks {\n\t\tif (event === null) {\n\t\t\tevent = {\n\t\t\t\tticks: 0,\n\t\t\t\ttime: 0,\n\t\t\t\ttype: \"setValueAtTime\",\n\t\t\t\tvalue: 0,\n\t\t\t};\n\t\t} else if (isUndef(event.ticks)) {\n\t\t\tconst previousEvent = this._events.previousEvent(event);\n\t\t\tevent.ticks = this._getTicksUntilEvent(previousEvent, event.time);\n\t\t}\n\t\tconst val0 = this._fromType(this.getValueAtTime(event.time));\n\t\tlet val1 = this._fromType(this.getValueAtTime(time));\n\t\t// if it's right on the line, take the previous value\n\t\tconst onTheLineEvent = this._events.get(time);\n\t\tif (onTheLineEvent && onTheLineEvent.time === time && onTheLineEvent.type === \"setValueAtTime\") {\n\t\t\tval1 = this._fromType(this.getValueAtTime(time - this.sampleTime));\n\t\t}\n\t\treturn 0.5 * (time - event.time) * (val0 + val1) + event.ticks;\n\t}\n\n\t/**\n\t * Returns the tick value at the time. Takes into account\n\t * any automation curves scheduled on the signal.\n\t * @param time The time to get the tick count at\n\t * @return The number of ticks which have elapsed at the time given any automations.\n\t */\n\tgetTicksAtTime(time: Time): Ticks {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tconst event = this._events.get(computedTime);\n\t\treturn Math.max(this._getTicksUntilEvent(event, computedTime), 0);\n\t}\n\n\t/**\n\t * Return the elapsed time of the number of ticks from the given time\n\t * @param ticks The number of ticks to calculate\n\t * @param time The time to get the next tick from\n\t * @return The duration of the number of ticks from the given time in seconds\n\t */\n\tgetDurationOfTicks(ticks: Ticks, time: Time): Seconds {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tconst currentTick = this.getTicksAtTime(time);\n\t\treturn this.getTimeOfTick(currentTick + ticks) - computedTime;\n\t}\n\n\t/**\n\t * Given a tick, returns the time that tick occurs at.\n\t * @return The time that the tick occurs.\n\t */\n\tgetTimeOfTick(tick: Ticks): Seconds {\n\t\tconst before = this._events.get(tick, \"ticks\");\n\t\tconst after = this._events.getAfter(tick, \"ticks\");\n\t\tif (before && before.ticks === tick) {\n\t\t\treturn before.time;\n\t\t} else if (before && after &&\n\t\t\tafter.type === \"linearRampToValueAtTime\" &&\n\t\t\tbefore.value !== after.value) {\n\t\t\tconst val0 = this._fromType(this.getValueAtTime(before.time));\n\t\t\tconst val1 = this._fromType(this.getValueAtTime(after.time));\n\t\t\tconst delta = (val1 - val0) / (after.time - before.time);\n\t\t\tconst k = Math.sqrt(Math.pow(val0, 2) - 2 * delta * (before.ticks - tick));\n\t\t\tconst sol1 = (-val0 + k) / delta;\n\t\t\tconst sol2 = (-val0 - k) / delta;\n\t\t\treturn (sol1 > 0 ? sol1 : sol2) + before.time;\n\t\t} else if (before) {\n\t\t\tif (before.value === 0) {\n\t\t\t\treturn Infinity;\n\t\t\t} else {\n\t\t\t\treturn before.time + (tick - before.ticks) / before.value;\n\t\t\t}\n\t\t} else {\n\t\t\treturn tick / this._initialValue;\n\t\t}\n\t}\n\n\t/**\n\t * Convert some number of ticks their the duration in seconds accounting\n\t * for any automation curves starting at the given time.\n\t * @param ticks The number of ticks to convert to seconds.\n\t * @param when When along the automation timeline to convert the ticks.\n\t * @return The duration in seconds of the ticks.\n\t */\n\tticksToTime(ticks: Ticks, when: Time): Seconds {\n\t\treturn this.getDurationOfTicks(ticks, when);\n\t}\n\n\t/**\n\t * The inverse of [[ticksToTime]]. Convert a duration in\n\t * seconds to the corresponding number of ticks accounting for any\n\t * automation curves starting at the given time.\n\t * @param duration The time interval to convert to ticks.\n\t * @param when When along the automation timeline to convert the ticks.\n\t * @return The duration in ticks.\n\t */\n\ttimeToTicks(duration: Time, when: Time): Ticks {\n\t\tconst computedTime = this.toSeconds(when);\n\t\tconst computedDuration = this.toSeconds(duration);\n\t\tconst startTicks = this.getTicksAtTime(computedTime);\n\t\tconst endTicks = this.getTicksAtTime(computedTime + computedDuration);\n\t\treturn endTicks - startTicks;\n\t}\n\n\t/**\n\t * Convert from the type when the unit value is BPM\n\t */\n\tprotected _fromType(val: UnitMap[TypeName]): number {\n\t\tif (this.units === \"bpm\" && this.multiplier) {\n\t\t\treturn 1 / (60 / val / this.multiplier);\n\t\t} else {\n\t\t\treturn super._fromType(val);\n\t\t}\n\t}\n\n\t/**\n\t * Special case of type conversion where the units === \"bpm\"\n\t */\n\tprotected _toType(val: number): UnitMap[TypeName] {\n\t\tif (this.units === \"bpm\" && this.multiplier) {\n\t\t\treturn (val / this.multiplier) * 60 as UnitMap[TypeName];\n\t\t} else {\n\t\t\treturn super._toType(val);\n\t\t}\n\t}\n\t/**\n\t * A multiplier on the bpm value. Useful for setting a PPQ relative to the base frequency value.\n\t */\n\tget multiplier(): number {\n\t\treturn this._multiplier;\n\t}\n\tset multiplier(m: number) {\n\t\t// get and reset the current value with the new multiplier\n\t\t// might be necessary to clear all the previous values\n\t\tconst currentVal = this.value;\n\t\tthis._multiplier = m;\n\t\tthis.cancelScheduledValues(0);\n\t\tthis.setValueAtTime(currentVal, 0);\n\t}\n}\n","import { Signal, SignalOptions } from \"../../signal/Signal\";\nimport { InputNode } from \"../context/ToneAudioNode\";\nimport { Seconds, Ticks, Time, UnitMap, UnitName } from \"../type/Units\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { TickParam } from \"./TickParam\";\n\ninterface TickSignalOptions<TypeName extends UnitName> extends SignalOptions<TypeName> {\n\tvalue: UnitMap[TypeName];\n\tmultiplier: number;\n}\n\n/**\n * TickSignal extends Tone.Signal, but adds the capability\n * to calculate the number of elapsed ticks. exponential and target curves\n * are approximated with multiple linear ramps.\n *\n * Thank you Bruno Dias, H. Sofia Pinto, and David M. Matos,\n * for your [WAC paper](https://smartech.gatech.edu/bitstream/handle/1853/54588/WAC2016-49.pdf)\n * describing integrating timing functions for tempo calculations.\n */\nexport class TickSignal<TypeName extends \"hertz\" | \"bpm\"> extends Signal<TypeName> {\n\n\treadonly name: string = \"TickSignal\";\n\n\t/**\n\t * The param which controls the output signal value\n\t */\n\tprotected _param: TickParam<TypeName>;\n\treadonly input: InputNode;\n\n\t/**\n\t * @param value The initial value of the signal\n\t */\n\tconstructor(value?: UnitMap[TypeName]);\n\tconstructor(options: Partial<TickSignalOptions<TypeName>>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(TickSignal.getDefaults(), arguments, [\"value\"]));\n\t\tconst options = optionsFromArguments(TickSignal.getDefaults(), arguments, [\"value\"]);\n\n\t\tthis.input = this._param = new TickParam({\n\t\t\tcontext: this.context,\n\t\t\tconvert: options.convert,\n\t\t\tmultiplier: options.multiplier,\n\t\t\tparam: this._constantSource.offset,\n\t\t\tunits: options.units,\n\t\t\tvalue: options.value,\n\t\t});\n\t}\n\n\tstatic getDefaults(): TickSignalOptions<any> {\n\t\treturn Object.assign(Signal.getDefaults(), {\n\t\t\tmultiplier: 1,\n\t\t\tunits: \"hertz\",\n\t\t\tvalue: 1,\n\t\t});\n\t}\n\n\tticksToTime(ticks: Ticks, when: Time): Seconds {\n\t\treturn this._param.ticksToTime(ticks, when);\n\t}\n\n\ttimeToTicks(duration: Time, when: Time): Ticks {\n\t\treturn this._param.timeToTicks(duration, when);\n\t}\n\n\tgetTimeOfTick(tick: Ticks): Seconds {\n\t\treturn this._param.getTimeOfTick(tick);\n\t}\n\n\tgetDurationOfTicks(ticks: Ticks, time: Time): Seconds {\n\t\treturn this._param.getDurationOfTicks(ticks, time);\n\t}\n\n\tgetTicksAtTime(time: Time): Ticks {\n\t\treturn this._param.getTicksAtTime(time);\n\t}\n\n\t/**\n\t * A multiplier on the bpm value. Useful for setting a PPQ relative to the base frequency value.\n\t */\n\tget multiplier(): number {\n\t\treturn this._param.multiplier;\n\t}\n\tset multiplier(m: number) {\n\t\tthis._param.multiplier = m;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._param.dispose();\n\t\treturn this;\n\t}\n}\n","import { ToneWithContext, ToneWithContextOptions } from \"../context/ToneWithContext\";\nimport { Seconds, Ticks, Time } from \"../type/Units\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { readOnly } from \"../util/Interface\";\nimport { PlaybackState, StateTimeline, StateTimelineEvent } from \"../util/StateTimeline\";\nimport { Timeline } from \"../util/Timeline\";\nimport { isDefined } from \"../util/TypeCheck\";\nimport { TickSignal } from \"./TickSignal\";\nimport { EQ } from \"../util/Math\";\n\ninterface TickSourceOptions extends ToneWithContextOptions {\n\tfrequency: number;\n\tunits: \"bpm\" | \"hertz\";\n}\n\ninterface TickSourceOffsetEvent {\n\tticks: number;\n\ttime: number;\n\tseconds: number;\n}\n\n/**\n * Uses [TickSignal](TickSignal) to track elapsed ticks with complex automation curves.\n */\nexport class TickSource<TypeName extends \"bpm\" | \"hertz\"> extends ToneWithContext<TickSourceOptions> {\n\n\treadonly name: string = \"TickSource\";\n\n\t/**\n\t * The frequency the callback function should be invoked.\n\t */\n\treadonly frequency: TickSignal<TypeName>;\n\n\t/**\n\t * The state timeline\n\t */\n\tprivate _state: StateTimeline = new StateTimeline();\n\n\t/**\n\t * The offset values of the ticks\n\t */\n\tprivate _tickOffset: Timeline<TickSourceOffsetEvent> = new Timeline();\n\n\t/**\n\t * @param frequency The initial frequency that the signal ticks at\n\t */\n\tconstructor(frequency?: number);\n\tconstructor(options?: Partial<TickSourceOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(TickSource.getDefaults(), arguments, [\"frequency\"]));\n\t\tconst options = optionsFromArguments(TickSource.getDefaults(), arguments, [\"frequency\"]);\n\n\t\tthis.frequency = new TickSignal({\n\t\t\tcontext: this.context,\n\t\t\tunits: options.units as TypeName,\n\t\t\tvalue: options.frequency,\n\t\t});\n\t\treadOnly(this, \"frequency\");\n\n\t\t// set the initial state\n\t\tthis._state.setStateAtTime(\"stopped\", 0);\n\t\t// add the first event\n\t\tthis.setTicksAtTime(0, 0);\n\t}\n\n\tstatic getDefaults(): TickSourceOptions {\n\t\treturn Object.assign({\n\t\t\tfrequency: 1,\n\t\t\tunits: \"hertz\" as \"hertz\",\n\t\t}, ToneWithContext.getDefaults());\n\t}\n\n\t/**\n\t * Returns the playback state of the source, either \"started\", \"stopped\" or \"paused\".\n\t */\n\tget state(): PlaybackState {\n\t\treturn this.getStateAtTime(this.now());\n\t}\n\n\t/**\n\t * Start the clock at the given time. Optionally pass in an offset\n\t * of where to start the tick counter from.\n\t * @param time The time the clock should start\n\t * @param offset The number of ticks to start the source at\n\t */\n\tstart(time: Time, offset?: Ticks): this {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tif (this._state.getValueAtTime(computedTime) !== \"started\") {\n\t\t\tthis._state.setStateAtTime(\"started\", computedTime);\n\t\t\tif (isDefined(offset)) {\n\t\t\t\tthis.setTicksAtTime(offset, computedTime);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Stop the clock. Stopping the clock resets the tick counter to 0.\n\t * @param time The time when the clock should stop.\n\t */\n\tstop(time: Time): this {\n\t\tconst computedTime = this.toSeconds(time);\n\t\t// cancel the previous stop\n\t\tif (this._state.getValueAtTime(computedTime) === \"stopped\") {\n\t\t\tconst event = this._state.get(computedTime);\n\t\t\tif (event && event.time > 0) {\n\t\t\t\tthis._tickOffset.cancel(event.time);\n\t\t\t\tthis._state.cancel(event.time);\n\t\t\t}\n\t\t}\n\t\tthis._state.cancel(computedTime);\n\t\tthis._state.setStateAtTime(\"stopped\", computedTime);\n\t\tthis.setTicksAtTime(0, computedTime);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Pause the clock. Pausing does not reset the tick counter.\n\t * @param time The time when the clock should stop.\n\t */\n\tpause(time: Time): this {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tif (this._state.getValueAtTime(computedTime) === \"started\") {\n\t\t\tthis._state.setStateAtTime(\"paused\", computedTime);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Cancel start/stop/pause and setTickAtTime events scheduled after the given time.\n\t * @param time When to clear the events after\n\t */\n\tcancel(time: Time): this {\n\t\ttime = this.toSeconds(time);\n\t\tthis._state.cancel(time);\n\t\tthis._tickOffset.cancel(time);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get the elapsed ticks at the given time\n\t * @param time When to get the tick value\n\t * @return The number of ticks\n\t */\n\tgetTicksAtTime(time?: Time): Ticks {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tconst stopEvent = this._state.getLastState(\"stopped\", computedTime) as StateTimelineEvent;\n\t\t// this event allows forEachBetween to iterate until the current time\n\t\tconst tmpEvent: StateTimelineEvent = { state: \"paused\", time: computedTime };\n\t\tthis._state.add(tmpEvent);\n\n\t\t// keep track of the previous offset event\n\t\tlet lastState = stopEvent;\n\t\tlet elapsedTicks = 0;\n\n\t\t// iterate through all the events since the last stop\n\t\tthis._state.forEachBetween(stopEvent.time, computedTime + this.sampleTime, e => {\n\t\t\tlet periodStartTime = lastState.time;\n\t\t\t// if there is an offset event in this period use that\n\t\t\tconst offsetEvent = this._tickOffset.get(e.time);\n\t\t\tif (offsetEvent && offsetEvent.time >= lastState.time) {\n\t\t\t\telapsedTicks = offsetEvent.ticks;\n\t\t\t\tperiodStartTime = offsetEvent.time;\n\t\t\t}\n\t\t\tif (lastState.state === \"started\" && e.state !== \"started\") {\n\t\t\t\telapsedTicks += this.frequency.getTicksAtTime(e.time) - this.frequency.getTicksAtTime(periodStartTime);\n\t\t\t}\n\t\t\tlastState = e;\n\t\t});\n\n\t\t// remove the temporary event\n\t\tthis._state.remove(tmpEvent);\n\n\t\t// return the ticks\n\t\treturn elapsedTicks;\n\t}\n\n\t/**\n\t * The number of times the callback was invoked. Starts counting at 0\n\t * and increments after the callback was invoked. Returns -1 when stopped.\n\t */\n\tget ticks(): Ticks {\n\t\treturn this.getTicksAtTime(this.now());\n\t}\n\tset ticks(t: Ticks) {\n\t\tthis.setTicksAtTime(t, this.now());\n\t}\n\n\t/**\n\t * The time since ticks=0 that the TickSource has been running. Accounts\n\t * for tempo curves\n\t */\n\tget seconds(): Seconds {\n\t\treturn this.getSecondsAtTime(this.now());\n\t}\n\tset seconds(s: Seconds) {\n\t\tconst now = this.now();\n\t\tconst ticks = this.frequency.timeToTicks(s, now);\n\t\tthis.setTicksAtTime(ticks, now);\n\t}\n\n\t/**\n\t * Return the elapsed seconds at the given time.\n\t * @param time When to get the elapsed seconds\n\t * @return The number of elapsed seconds\n\t */\n\tgetSecondsAtTime(time: Time): Seconds {\n\t\ttime = this.toSeconds(time);\n\t\tconst stopEvent = this._state.getLastState(\"stopped\", time) as StateTimelineEvent;\n\t\t// this event allows forEachBetween to iterate until the current time\n\t\tconst tmpEvent: StateTimelineEvent = { state: \"paused\", time };\n\t\tthis._state.add(tmpEvent);\n\n\t\t// keep track of the previous offset event\n\t\tlet lastState = stopEvent;\n\t\tlet elapsedSeconds = 0;\n\n\t\t// iterate through all the events since the last stop\n\t\tthis._state.forEachBetween(stopEvent.time, time + this.sampleTime, e => {\n\t\t\tlet periodStartTime = lastState.time;\n\t\t\t// if there is an offset event in this period use that\n\t\t\tconst offsetEvent = this._tickOffset.get(e.time);\n\t\t\tif (offsetEvent && offsetEvent.time >= lastState.time) {\n\t\t\t\telapsedSeconds = offsetEvent.seconds;\n\t\t\t\tperiodStartTime = offsetEvent.time;\n\t\t\t}\n\t\t\tif (lastState.state === \"started\" && e.state !== \"started\") {\n\t\t\t\telapsedSeconds += e.time - periodStartTime;\n\t\t\t}\n\t\t\tlastState = e;\n\t\t});\n\n\t\t// remove the temporary event\n\t\tthis._state.remove(tmpEvent);\n\n\t\t// return the ticks\n\t\treturn elapsedSeconds;\n\t}\n\n\t/**\n\t * Set the clock's ticks at the given time.\n\t * @param ticks The tick value to set\n\t * @param time When to set the tick value\n\t */\n\tsetTicksAtTime(ticks: Ticks, time: Time): this {\n\t\ttime = this.toSeconds(time);\n\t\tthis._tickOffset.cancel(time);\n\t\tthis._tickOffset.add({\n\t\t\tseconds: this.frequency.getDurationOfTicks(ticks, time),\n\t\t\tticks,\n\t\t\ttime,\n\t\t});\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns the scheduled state at the given time.\n\t * @param time The time to query.\n\t */\n\tgetStateAtTime(time: Time): PlaybackState {\n\t\ttime = this.toSeconds(time);\n\t\treturn this._state.getValueAtTime(time);\n\t}\n\n\t/**\n\t * Get the time of the given tick. The second argument\n\t * is when to test before. Since ticks can be set (with setTicksAtTime)\n\t * there may be multiple times for a given tick value.\n\t * @param tick The tick number.\n\t * @param before When to measure the tick value from.\n\t * @return The time of the tick\n\t */\n\tgetTimeOfTick(tick: Ticks, before = this.now()): Seconds {\n\t\tconst offset = this._tickOffset.get(before) as TickSourceOffsetEvent;\n\t\tconst event = this._state.get(before) as StateTimelineEvent;\n\t\tconst startTime = Math.max(offset.time, event.time);\n\t\tconst absoluteTicks = this.frequency.getTicksAtTime(startTime) + tick - offset.ticks;\n\t\treturn this.frequency.getTimeOfTick(absoluteTicks);\n\t}\n\n\t/**\n\t * Invoke the callback event at all scheduled ticks between the\n\t * start time and the end time\n\t * @param startTime The beginning of the search range\n\t * @param endTime The end of the search range\n\t * @param callback The callback to invoke with each tick\n\t */\n\tforEachTickBetween(startTime: number, endTime: number, callback: (when: Seconds, ticks: Ticks) => void): this {\n\t\t// only iterate through the sections where it is \"started\"\n\t\tlet lastStateEvent = this._state.get(startTime);\n\t\tthis._state.forEachBetween(startTime, endTime, event => {\n\t\t\tif (lastStateEvent && lastStateEvent.state === \"started\" && event.state !== \"started\") {\n\t\t\t\tthis.forEachTickBetween(Math.max(lastStateEvent.time, startTime), event.time - this.sampleTime, callback);\n\t\t\t}\n\t\t\tlastStateEvent = event;\n\t\t});\n\n\t\tlet error: Error | null = null;\n\n\t\tif (lastStateEvent && lastStateEvent.state === \"started\") {\n\t\t\tconst maxStartTime = Math.max(lastStateEvent.time, startTime);\n\t\t\t// figure out the difference between the frequency ticks and the\n\t\t\tconst startTicks = this.frequency.getTicksAtTime(maxStartTime);\n\t\t\tconst ticksAtStart = this.frequency.getTicksAtTime(lastStateEvent.time);\n\t\t\tconst diff = startTicks - ticksAtStart;\n\t\t\tlet offset = Math.ceil(diff) - diff;\n\t\t\t// guard against floating point issues\n\t\t\toffset = EQ(offset, 1) ? 0 : offset;\n\t\t\tlet nextTickTime = this.frequency.getTimeOfTick(startTicks + offset);\n\t\t\twhile (nextTickTime < endTime) {\n\t\t\t\ttry {\n\t\t\t\t\tcallback(nextTickTime, Math.round(this.getTicksAtTime(nextTickTime)));\n\t\t\t\t} catch (e) {\n\t\t\t\t\terror = e;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tnextTickTime += this.frequency.getDurationOfTicks(1, nextTickTime);\n\t\t\t}\n\t\t}\n\n\t\tif (error) {\n\t\t\tthrow error;\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clean up\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._state.dispose();\n\t\tthis._tickOffset.dispose();\n\t\tthis.frequency.dispose();\n\t\treturn this;\n\t}\n}\n","import { ToneWithContext, ToneWithContextOptions } from \"../context/ToneWithContext\";\nimport { Frequency, Hertz, Seconds, Ticks, Time } from \"../type/Units\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { Emitter } from \"../util/Emitter\";\nimport { noOp, readOnly } from \"../util/Interface\";\nimport { PlaybackState, StateTimeline } from \"../util/StateTimeline\";\nimport { TickSignal } from \"./TickSignal\";\nimport { TickSource } from \"./TickSource\";\nimport { assertContextRunning } from \"../util/Debug\";\n\ntype ClockCallback = (time: Seconds, ticks?: Ticks) => void;\n\ninterface ClockOptions extends ToneWithContextOptions {\n\tfrequency: Hertz;\n\tcallback: ClockCallback;\n\tunits: \"hertz\" | \"bpm\";\n}\n\ntype ClockEvent = \"start\" | \"stop\" | \"pause\";\n\n/**\n * A sample accurate clock which provides a callback at the given rate.\n * While the callback is not sample-accurate (it is still susceptible to\n * loose JS timing), the time passed in as the argument to the callback\n * is precise. For most applications, it is better to use Tone.Transport\n * instead of the Clock by itself since you can synchronize multiple callbacks.\n * @example\n * // the callback will be invoked approximately once a second\n * // and will print the time exactly once a second apart.\n * const clock = new Tone.Clock(time => {\n * \tconsole.log(time);\n * }, 1);\n * clock.start();\n * @category Core\n */\nexport class Clock<TypeName extends \"bpm\" | \"hertz\" = \"hertz\">\n\textends ToneWithContext<ClockOptions> implements Emitter<ClockEvent> {\n\n\treadonly name: string = \"Clock\";\n\n\t/**\n\t * The callback function to invoke at the scheduled tick.\n\t */\n\tcallback: ClockCallback = noOp;\n\n\t/**\n\t * The tick counter\n\t */\n\tprivate _tickSource: TickSource<TypeName>;\n\n\t/**\n\t * The last time the loop callback was invoked\n\t */\n\tprivate _lastUpdate = 0;\n\n\t/**\n\t * Keep track of the playback state\n\t */\n\tprivate _state: StateTimeline = new StateTimeline(\"stopped\");\n\n\t/**\n\t * Context bound reference to the _loop method\n\t * This is necessary to remove the event in the end.\n\t */\n\tprivate _boundLoop: () => void = this._loop.bind(this);\n\n\t/**\n\t * The rate the callback function should be invoked.\n\t */\n\tfrequency: TickSignal<TypeName>;\n\n\t/**\n\t * @param callback The callback to be invoked with the time of the audio event\n\t * @param frequency The rate of the callback\n\t */\n\tconstructor(callback?: ClockCallback, frequency?: Frequency);\n\tconstructor(options: Partial<ClockOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Clock.getDefaults(), arguments, [\"callback\", \"frequency\"]));\n\t\tconst options = optionsFromArguments(Clock.getDefaults(), arguments, [\"callback\", \"frequency\"]);\n\n\t\tthis.callback = options.callback;\n\t\tthis._tickSource = new TickSource({\n\t\t\tcontext: this.context,\n\t\t\tfrequency: options.frequency,\n\t\t\tunits: options.units,\n\t\t});\n\t\tthis._lastUpdate = 0;\n\t\tthis.frequency = this._tickSource.frequency;\n\t\treadOnly(this, \"frequency\");\n\n\t\t// add an initial state\n\t\tthis._state.setStateAtTime(\"stopped\", 0);\n\n\t\t// bind a callback to the worker thread\n\t\tthis.context.on(\"tick\", this._boundLoop);\n\t}\n\n\tstatic getDefaults(): ClockOptions {\n\t\treturn Object.assign(ToneWithContext.getDefaults(), {\n\t\t\tcallback: noOp as ClockCallback,\n\t\t\tfrequency: 1,\n\t\t\tunits: \"hertz\",\n\t\t}) as ClockOptions;\n\t}\n\n\t/**\n\t * Returns the playback state of the source, either \"started\", \"stopped\" or \"paused\".\n\t */\n\tget state(): PlaybackState {\n\t\treturn this._state.getValueAtTime(this.now());\n\t}\n\n\t/**\n\t * Start the clock at the given time. Optionally pass in an offset\n\t * of where to start the tick counter from.\n\t * @param time The time the clock should start\n\t * @param offset Where the tick counter starts counting from.\n\t */\n\tstart(time?: Time, offset?: Ticks): this {\n\t\t// make sure the context is running\n\t\tassertContextRunning(this.context);\n\t\t// start the loop\n\t\tconst computedTime = this.toSeconds(time);\n\t\tthis.log(\"start\", computedTime);\n\t\tif (this._state.getValueAtTime(computedTime) !== \"started\") {\n\t\t\tthis._state.setStateAtTime(\"started\", computedTime);\n\t\t\tthis._tickSource.start(computedTime, offset);\n\t\t\tif (computedTime < this._lastUpdate) {\n\t\t\t\tthis.emit(\"start\", computedTime, offset);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Stop the clock. Stopping the clock resets the tick counter to 0.\n\t * @param time The time when the clock should stop.\n\t * @example\n\t * const clock = new Tone.Clock(time => {\n\t * \tconsole.log(time);\n\t * }, 1);\n\t * clock.start();\n\t * // stop the clock after 10 seconds\n\t * clock.stop(\"+10\");\n\t */\n\tstop(time?: Time): this {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tthis.log(\"stop\", computedTime);\n\t\tthis._state.cancel(computedTime);\n\t\tthis._state.setStateAtTime(\"stopped\", computedTime);\n\t\tthis._tickSource.stop(computedTime);\n\t\tif (computedTime < this._lastUpdate) {\n\t\t\tthis.emit(\"stop\", computedTime);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Pause the clock. Pausing does not reset the tick counter.\n\t * @param time The time when the clock should stop.\n\t */\n\tpause(time?: Time): this {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tif (this._state.getValueAtTime(computedTime) === \"started\") {\n\t\t\tthis._state.setStateAtTime(\"paused\", computedTime);\n\t\t\tthis._tickSource.pause(computedTime);\n\t\t\tif (computedTime < this._lastUpdate) {\n\t\t\t\tthis.emit(\"pause\", computedTime);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * The number of times the callback was invoked. Starts counting at 0\n\t * and increments after the callback was invoked.\n\t */\n\tget ticks(): Ticks {\n\t\treturn Math.ceil(this.getTicksAtTime(this.now()));\n\t}\n\tset ticks(t: Ticks) {\n\t\tthis._tickSource.ticks = t;\n\t}\n\n\t/**\n\t * The time since ticks=0 that the Clock has been running. Accounts for tempo curves\n\t */\n\tget seconds(): Seconds {\n\t\treturn this._tickSource.seconds;\n\t}\n\tset seconds(s: Seconds) {\n\t\tthis._tickSource.seconds = s;\n\t}\n\n\t/**\n\t * Return the elapsed seconds at the given time.\n\t * @param time When to get the elapsed seconds\n\t * @return The number of elapsed seconds\n\t */\n\tgetSecondsAtTime(time: Time): Seconds {\n\t\treturn this._tickSource.getSecondsAtTime(time);\n\t}\n\n\t/**\n\t * Set the clock's ticks at the given time.\n\t * @param ticks The tick value to set\n\t * @param time When to set the tick value\n\t */\n\tsetTicksAtTime(ticks: Ticks, time: Time): this {\n\t\tthis._tickSource.setTicksAtTime(ticks, time);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get the time of the given tick. The second argument\n\t * is when to test before. Since ticks can be set (with setTicksAtTime)\n\t * there may be multiple times for a given tick value.\n\t * @param tick The tick number.\n\t * @param before When to measure the tick value from.\n\t * @return The time of the tick\n\t */\n\tgetTimeOfTick(tick: Ticks, before = this.now()): Seconds {\n\t\treturn this._tickSource.getTimeOfTick(tick, before);\n\t}\n\n\t/**\n\t * Get the clock's ticks at the given time.\n\t * @param time When to get the tick value\n\t * @return The tick value at the given time.\n\t */\n\tgetTicksAtTime(time?: Time): Ticks {\n\t\treturn this._tickSource.getTicksAtTime(time);\n\t}\n\n\t/**\n\t * Get the time of the next tick\n\t * @param offset The tick number.\n\t */\n\tnextTickTime(offset: Ticks, when: Time): Seconds {\n\t\tconst computedTime = this.toSeconds(when);\n\t\tconst currentTick = this.getTicksAtTime(computedTime);\n\t\treturn this._tickSource.getTimeOfTick(currentTick + offset, computedTime);\n\t}\n\n\t/**\n\t * The scheduling loop.\n\t */\n\tprivate _loop(): void {\n\n\t\tconst startTime = this._lastUpdate;\n\t\tconst endTime = this.now();\n\t\tthis._lastUpdate = endTime;\n\t\tthis.log(\"loop\", startTime, endTime);\n\n\t\tif (startTime !== endTime) {\n\t\t\t// the state change events\n\t\t\tthis._state.forEachBetween(startTime, endTime, e => {\n\t\t\t\tswitch (e.state) {\n\t\t\t\t\tcase \"started\":\n\t\t\t\t\t\tconst offset = this._tickSource.getTicksAtTime(e.time);\n\t\t\t\t\t\tthis.emit(\"start\", e.time, offset);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"stopped\":\n\t\t\t\t\t\tif (e.time !== 0) {\n\t\t\t\t\t\t\tthis.emit(\"stop\", e.time);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"paused\":\n\t\t\t\t\t\tthis.emit(\"pause\", e.time);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t});\n\t\t\t// the tick callbacks\n\t\t\tthis._tickSource.forEachTickBetween(startTime, endTime, (time, ticks) => {\n\t\t\t\tthis.callback(time, ticks);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Returns the scheduled state at the given time.\n\t * @param time The time to query.\n\t * @return The name of the state input in setStateAtTime.\n\t * @example\n\t * const clock = new Tone.Clock();\n\t * clock.start(\"+0.1\");\n\t * clock.getStateAtTime(\"+0.1\"); // returns \"started\"\n\t */\n\tgetStateAtTime(time: Time): PlaybackState {\n\t\tconst computedTime = this.toSeconds(time);\n\t\treturn this._state.getValueAtTime(computedTime);\n\t}\n\n\t/**\n\t * Clean up\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.context.off(\"tick\", this._boundLoop);\n\t\tthis._tickSource.dispose();\n\t\tthis._state.dispose();\n\t\treturn this;\n\t}\n\n\t//-------------------------------------\n\t// EMITTER MIXIN TO SATISFY COMPILER\n\t//-------------------------------------\n\n\ton!: (event: ClockEvent, callback: (...args: any[]) => void) => this;\n\tonce!: (event: ClockEvent, callback: (...args: any[]) => void) => this;\n\toff!: (event: ClockEvent, callback?: ((...args: any[]) => void) | undefined) => this;\n\temit!: (event: any, ...args: any[]) => this;\n}\n\nEmitter.mixin(Clock);\n","import { Param } from \"../context/Param\";\nimport { Seconds, Time } from \"../type/Units\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { readOnly } from \"../util/Interface\";\nimport { ToneAudioNode, ToneAudioNodeOptions } from \"./ToneAudioNode\";\n\nexport interface DelayOptions extends ToneAudioNodeOptions {\n\tdelayTime: Time;\n\tmaxDelay: Time;\n}\n\n/**\n * Wrapper around Web Audio's native [DelayNode](http://webaudio.github.io/web-audio-api/#the-delaynode-interface).\n * @category Core\n * @example\n * return Tone.Offline(() => {\n * \tconst delay = new Tone.Delay(0.1).toDestination();\n * \t// connect the signal to both the delay and the destination\n * \tconst pulse = new Tone.PulseOscillator().connect(delay).toDestination();\n * \t// start and stop the pulse\n * \tpulse.start(0).stop(0.01);\n * }, 0.5, 1);\n */\nexport class Delay extends ToneAudioNode<DelayOptions> {\n\n\treadonly name: string = \"Delay\";\n\n\t/**\n\t * Private holder of the max delay time\n\t */\n\tprivate _maxDelay: Seconds;\n\n\t/**\n\t * The amount of time the incoming signal is delayed.\n\t * @example\n\t * const delay = new Tone.Delay().toDestination();\n\t * // modulate the delayTime between 0.1 and 1 seconds\n\t * const delayLFO = new Tone.LFO(0.5, 0.1, 1).start().connect(delay.delayTime);\n\t * const pulse = new Tone.PulseOscillator().connect(delay).start();\n\t * // the change in delayTime causes the pitch to go up and down\n\t */\n\treadonly delayTime: Param<\"time\">;\n\n\t/**\n\t * Private reference to the internal DelayNode\n\t */\n\tprivate _delayNode: DelayNode;\n\treadonly input: DelayNode;\n\treadonly output: DelayNode;\n\n\t/**\n\t * @param delayTime The delay applied to the incoming signal.\n\t * @param maxDelay The maximum delay time.\n\t */\n\tconstructor(delayTime?: Time, maxDelay?: Time);\n\tconstructor(options?: Partial<DelayOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(Delay.getDefaults(), arguments, [\"delayTime\", \"maxDelay\"]));\n\n\t\tconst options = optionsFromArguments(Delay.getDefaults(), arguments, [\"delayTime\", \"maxDelay\"]);\n\n\t\tconst maxDelayInSeconds = this.toSeconds(options.maxDelay);\n\t\tthis._maxDelay = Math.max(maxDelayInSeconds, this.toSeconds(options.delayTime));\n\n\t\tthis._delayNode = this.input = this.output = this.context.createDelay(maxDelayInSeconds);\n\n\t\tthis.delayTime = new Param({\n\t\t\tcontext: this.context,\n\t\t\tparam: this._delayNode.delayTime,\n\t\t\tunits: \"time\",\n\t\t\tvalue: options.delayTime,\n\t\t\tminValue: 0,\n\t\t\tmaxValue: this.maxDelay,\n\t\t});\n\n\t\treadOnly(this, \"delayTime\");\n\t}\n\n\tstatic getDefaults(): DelayOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tdelayTime: 0,\n\t\t\tmaxDelay: 1,\n\t\t});\n\t}\n\n\t/**\n\t * The maximum delay time. This cannot be changed after\n\t * the value is passed into the constructor.\n\t */\n\tget maxDelay(): Seconds {\n\t\treturn this._maxDelay;\n\t}\n\n\t/**\n\t * Clean up.\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._delayNode.disconnect();\n\t\tthis.delayTime.dispose();\n\t\treturn this;\n\t}\n}\n","import { getContext, setContext } from \"../Global\";\nimport { Seconds } from \"../type/Units\";\nimport { OfflineContext } from \"./OfflineContext\";\nimport { ToneAudioBuffer } from \"./ToneAudioBuffer\";\n\n/**\n * Generate a buffer by rendering all of the Tone.js code within the callback using the OfflineAudioContext.\n * The OfflineAudioContext is capable of rendering much faster than real time in many cases.\n * The callback function also passes in an offline instance of [[Context]] which can be used\n * to schedule events along the Transport. \n * @param callback All Tone.js nodes which are created and scheduled within this callback are recorded into the output Buffer.\n * @param duration the amount of time to record for.\n * @return The promise which is invoked with the ToneAudioBuffer of the recorded output.\n * @example\n * // render 2 seconds of the oscillator\n * Tone.Offline(() => {\n * \t// only nodes created in this callback will be recorded\n * \tconst oscillator = new Tone.Oscillator().toDestination().start(0);\n * }, 2).then((buffer) => {\n * \t// do something with the output buffer\n * \tconsole.log(buffer);\n * });\n * @example\n * // can also schedule events along the Transport\n * // using the passed in Offline Transport\n * Tone.Offline(({ transport }) => {\n * \tconst osc = new Tone.Oscillator().toDestination();\n * \ttransport.schedule(time => {\n * \t\tosc.start(time).stop(time + 0.1);\n * \t}, 1);\n * \t// make sure to start the transport\n * \ttransport.start(0.2);\n * }, 4).then((buffer) => {\n * \t// do something with the output buffer\n * \tconsole.log(buffer);\n * });\n * @category Core\n */\nexport async function Offline(\n\tcallback: (context: OfflineContext) => Promise<void> | void,\n\tduration: Seconds,\n\tchannels = 2,\n\tsampleRate: number = getContext().sampleRate,\n): Promise<ToneAudioBuffer> {\n\t// set the OfflineAudioContext based on the current context\n\tconst originalContext = getContext();\n\n\tconst context = new OfflineContext(channels, duration, sampleRate);\n\tsetContext(context);\n\n\t// invoke the callback/scheduling\n\tawait callback(context);\n\n\t// then render the audio\n\tconst bufferPromise = context.render();\n\n\t// return the original AudioContext\n\tsetContext(originalContext);\n\n\t// await the rendering\n\tconst buffer = await bufferPromise;\n\n\t// return the audio\n\treturn new ToneAudioBuffer(buffer);\n}\n","import { Tone } from \"../Tone\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { noOp } from \"../util/Interface\";\nimport { isString } from \"../util/TypeCheck\";\nimport { ToneAudioBuffer } from \"./ToneAudioBuffer\";\nimport { assert } from \"../util/Debug\";\n\nexport interface ToneAudioBuffersUrlMap {\n\t[name: string]: string | AudioBuffer | ToneAudioBuffer;\n\t[name: number]: string | AudioBuffer | ToneAudioBuffer;\n}\n\ninterface ToneAudioBuffersOptions {\n\turls: ToneAudioBuffersUrlMap;\n\tonload: () => void;\n\tonerror?: (error: Error) => void;\n\tbaseUrl: string;\n}\n\n/**\n * A data structure for holding multiple buffers in a Map-like datastructure.\n *\n * @example\n * const pianoSamples = new Tone.ToneAudioBuffers({\n * \tA1: \"https://tonejs.github.io/audio/casio/A1.mp3\",\n * \tA2: \"https://tonejs.github.io/audio/casio/A2.mp3\",\n * }, () => {\n * \tconst player = new Tone.Player().toDestination();\n * \t// play one of the samples when they all load\n * \tplayer.buffer = pianoSamples.get(\"A2\");\n * \tplayer.start();\n * });\n * @example\n * // To pass in additional parameters in the second parameter\n * const buffers = new Tone.ToneAudioBuffers({\n * \t urls: {\n * \t\t A1: \"A1.mp3\",\n * \t\t A2: \"A2.mp3\",\n * \t },\n * \t onload: () => console.log(\"loaded\"),\n * \t baseUrl: \"https://tonejs.github.io/audio/casio/\"\n * });\n * @category Core\n */\nexport class ToneAudioBuffers extends Tone {\n\n\treadonly name: string = \"ToneAudioBuffers\";\n\n\t/**\n\t * All of the buffers\n\t */\n\tprivate _buffers: Map<string, ToneAudioBuffer> = new Map();\n\n\t/**\n\t * A path which is prefixed before every url.\n\t */\n\tbaseUrl: string;\n\n\t/**\n\t * Keep track of the number of loaded buffers\n\t */\n\tprivate _loadingCount = 0;\n\n\t/**\n\t * @param urls An object literal or array of urls to load.\n\t * @param onload The callback to invoke when the buffers are loaded.\n\t * @param baseUrl A prefix url to add before all the urls\n\t */\n\tconstructor(\n\t\turls?: ToneAudioBuffersUrlMap,\n\t\tonload?: () => void,\n\t\tbaseUrl?: string,\n\t);\n\tconstructor(options?: Partial<ToneAudioBuffersOptions>);\n\tconstructor() {\n\n\t\tsuper();\n\t\tconst options = optionsFromArguments(\n\t\t\tToneAudioBuffers.getDefaults(), arguments, [\"urls\", \"onload\", \"baseUrl\"], \"urls\",\n\t\t);\n\n\t\tthis.baseUrl = options.baseUrl;\n\t\t// add each one\n\t\tObject.keys(options.urls).forEach(name => {\n\t\t\tthis._loadingCount++;\n\t\t\tconst url = options.urls[name];\n\t\t\tthis.add(name, url, this._bufferLoaded.bind(this, options.onload), options.onerror);\n\t\t});\n\n\t}\n\n\tstatic getDefaults(): ToneAudioBuffersOptions {\n\t\treturn {\n\t\t\tbaseUrl: \"\",\n\t\t\tonerror: noOp,\n\t\t\tonload: noOp,\n\t\t\turls: {},\n\t\t};\n\t}\n\n\t/**\n\t * True if the buffers object has a buffer by that name.\n\t * @param name The key or index of the buffer.\n\t */\n\thas(name: string | number): boolean {\n\t\treturn this._buffers.has(name.toString());\n\t}\n\n\t/**\n\t * Get a buffer by name. If an array was loaded,\n\t * then use the array index.\n\t * @param name The key or index of the buffer.\n\t */\n\tget(name: string | number): ToneAudioBuffer {\n\t\tassert(this.has(name), `ToneAudioBuffers has no buffer named: ${name}`);\n\t\treturn this._buffers.get(name.toString()) as ToneAudioBuffer;\n\t}\n\n\t/**\n\t * A buffer was loaded. decrement the counter.\n\t */\n\tprivate _bufferLoaded(callback: () => void): void {\n\t\tthis._loadingCount--;\n\t\tif (this._loadingCount === 0 && callback) {\n\t\t\tcallback();\n\t\t}\n\t}\n\n\t/**\n\t * If the buffers are loaded or not\n\t */\n\tget loaded(): boolean {\n\t\treturn Array.from(this._buffers).every(([_, buffer]) => buffer.loaded);\n\t}\n\n\t/**\n\t * Add a buffer by name and url to the Buffers\n\t * @param name A unique name to give the buffer\n\t * @param url Either the url of the bufer, or a buffer which will be added with the given name.\n\t * @param callback The callback to invoke when the url is loaded.\n\t * @param onerror Invoked if the buffer can't be loaded\n\t */\n\tadd(\n\t\tname: string | number,\n\t\turl: string | AudioBuffer | ToneAudioBuffer,\n\t\tcallback: () => void = noOp,\n\t\tonerror: (e: Error) => void = noOp,\n\t): this {\n\t\tif (isString(url)) {\n\t\t\tthis._buffers.set(name.toString(), new ToneAudioBuffer(this.baseUrl + url, callback, onerror));\n\t\t} else {\n\t\t\tthis._buffers.set(name.toString(), new ToneAudioBuffer(url, callback, onerror));\n\t\t}\n\t\treturn this;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._buffers.forEach(buffer => buffer.dispose());\n\t\tthis._buffers.clear();\n\t\treturn this;\n\t}\n}\n","import { getContext } from \"../Global\";\nimport { ftom, mtof } from \"./Conversions\";\nimport { FrequencyClass, FrequencyUnit } from \"./Frequency\";\nimport { TimeValue } from \"./TimeBase\";\nimport { Hertz, Interval, MidiNote, Seconds, Ticks } from \"./Units\";\n\n/**\n * Midi is a primitive type for encoding Time values.\n * Midi can be constructed with or without the `new` keyword. Midi can be passed\n * into the parameter of any method which takes time as an argument.\n * @category Unit\n */\nexport class MidiClass extends FrequencyClass<MidiNote> {\n\n\treadonly name: string = \"MidiClass\";\n\n\treadonly defaultUnits = \"midi\";\n\n\t/**\n\t * Returns the value of a frequency in the current units\n\t */\n\tprotected _frequencyToUnits(freq: Hertz): MidiNote {\n\t\treturn ftom(super._frequencyToUnits(freq));\n\t}\n\n\t/**\n\t * Returns the value of a tick in the current time units\n\t */\n\tprotected _ticksToUnits(ticks: Ticks): MidiNote {\n\t\treturn ftom(super._ticksToUnits(ticks));\n\t}\n\n\t/**\n\t * Return the value of the beats in the current units\n\t */\n\tprotected _beatsToUnits(beats: number): MidiNote {\n\t\treturn ftom(super._beatsToUnits(beats));\n\t}\n\n\t/**\n\t * Returns the value of a second in the current units\n\t */\n\tprotected _secondsToUnits(seconds: Seconds): MidiNote {\n\t\treturn ftom(super._secondsToUnits(seconds));\n\t}\n\n\t/**\n\t * Return the value of the frequency as a MIDI note\n\t * @example\n\t * Tone.Midi(60).toMidi(); // 60\n\t */\n\ttoMidi(): MidiNote {\n\t\treturn this.valueOf();\n\t}\n\n\t/**\n\t * Return the value of the frequency as a MIDI note\n\t * @example\n\t * Tone.Midi(60).toFrequency(); // 261.6255653005986\n\t */\n\ttoFrequency(): Hertz {\n\t\treturn mtof(this.toMidi());\n\t}\n\n\t/**\n\t * Transposes the frequency by the given number of semitones.\n\t * @return A new transposed MidiClass\n\t * @example\n\t * Tone.Midi(\"A4\").transpose(3); // \"C5\"\n\t */\n\ttranspose(interval: Interval): MidiClass {\n\t\treturn new MidiClass(this.context, this.toMidi() + interval);\n\t}\n}\n\n/**\n * Convert a value into a FrequencyClass object.\n * @category Unit\n */\nexport function Midi(value?: TimeValue, units?: FrequencyUnit): MidiClass {\n\treturn new MidiClass(getContext(), value, units);\n}\n","import { getContext } from \"../Global\";\nimport { TimeBaseUnit, TimeValue } from \"./TimeBase\";\nimport { TransportTimeClass } from \"./TransportTime\";\nimport { Seconds, Ticks } from \"./Units\";\n\n/**\n * Ticks is a primitive type for encoding Time values.\n * Ticks can be constructed with or without the `new` keyword. Ticks can be passed\n * into the parameter of any method which takes time as an argument.\n * @example\n * const t = Tone.Ticks(\"4n\"); // a quarter note as ticks\n * @category Unit\n */\nexport class TicksClass extends TransportTimeClass<Ticks> {\n\n\treadonly name: string = \"Ticks\";\n\n\treadonly defaultUnits: TimeBaseUnit = \"i\";\n\n\t/**\n\t * Get the current time in the given units\n\t */\n\tprotected _now(): Ticks {\n\t\treturn this.context.transport.ticks;\n\t}\n\n\t/**\n\t * Return the value of the beats in the current units\n\t */\n\tprotected _beatsToUnits(beats: number): Ticks {\n\t\treturn this._getPPQ() * beats;\n\t}\n\n\t/**\n\t * Returns the value of a second in the current units\n\t */\n\tprotected _secondsToUnits(seconds: Seconds): Ticks {\n\t\treturn Math.floor(seconds / (60 / this._getBpm()) * this._getPPQ());\n\t}\n\n\t/**\n\t * Returns the value of a tick in the current time units\n\t */\n\tprotected _ticksToUnits(ticks: Ticks): Ticks {\n\t\treturn ticks;\n\t}\n\n\t/**\n\t * Return the time in ticks\n\t */\n\ttoTicks(): Ticks {\n\t\treturn this.valueOf() as Ticks;\n\t}\n\n\t/**\n\t * Return the time in seconds\n\t */\n\ttoSeconds(): Seconds {\n\t\treturn (this.valueOf() / this._getPPQ()) * (60 / this._getBpm());\n\t}\n}\n\n/**\n * Convert a time representation to ticks\n * @category Unit\n */\nexport function Ticks(value?: TimeValue, units?: TimeBaseUnit): TicksClass {\n\treturn new TicksClass(getContext(), value, units);\n}\n","import { ToneWithContext, ToneWithContextOptions } from \"../context/ToneWithContext\";\nimport { Seconds, Time } from \"../type/Units\";\nimport { Timeline, TimelineEvent } from \"./Timeline\";\nimport { onContextClose, onContextInit } from \"../context/ContextInitialization\";\n\ninterface DrawEvent extends TimelineEvent {\n\tcallback: () => void;\n}\n\n/**\n * Draw is useful for synchronizing visuals and audio events.\n * Callbacks from Tone.Transport or any of the Tone.Event classes\n * always happen _before_ the scheduled time and are not synchronized\n * to the animation frame so they are not good for triggering tightly\n * synchronized visuals and sound. Draw makes it easy to schedule\n * callbacks using the AudioContext time and uses requestAnimationFrame.\n * @example\n * Tone.Transport.schedule((time) => {\n * \t// use the time argument to schedule a callback with Draw\n * \tTone.Draw.schedule(() => {\n * \t\t// do drawing or DOM manipulation here\n * \t\tconsole.log(time);\n * \t}, time);\n * }, \"+0.5\");\n * Tone.Transport.start();\n * @category Core\n */\nexport class Draw extends ToneWithContext<ToneWithContextOptions> {\n\n\treadonly name: string = \"Draw\";\n\n\t/**\n\t * The duration after which events are not invoked.\n\t */\n\texpiration: Seconds = 0.25;\n\n\t/**\n\t * The amount of time before the scheduled time\n\t * that the callback can be invoked. Default is\n\t * half the time of an animation frame (0.008 seconds).\n\t */\n\tanticipation: Seconds = 0.008;\n\n\t/**\n\t * All of the events.\n\t */\n\tprivate _events: Timeline<DrawEvent> = new Timeline();\n\n\t/**\n\t * The draw loop\n\t */\n\tprivate _boundDrawLoop = this._drawLoop.bind(this);\n\n\t/**\n\t * The animation frame id\n\t */\n\tprivate _animationFrame = -1;\n\n\t/**\n\t * Schedule a function at the given time to be invoked\n\t * on the nearest animation frame.\n\t * @param callback Callback is invoked at the given time.\n\t * @param time The time relative to the AudioContext time to invoke the callback.\n\t * @example\n\t * Tone.Transport.scheduleRepeat(time => {\n\t * \tTone.Draw.schedule(() => console.log(time), time);\n\t * }, 1);\n\t * Tone.Transport.start();\n\t */\n\tschedule(callback: () => void, time: Time): this {\n\t\tthis._events.add({\n\t\t\tcallback,\n\t\t\ttime: this.toSeconds(time),\n\t\t});\n\t\t// start the draw loop on the first event\n\t\tif (this._events.length === 1) {\n\t\t\tthis._animationFrame = requestAnimationFrame(this._boundDrawLoop);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Cancel events scheduled after the given time\n\t * @param after Time after which scheduled events will be removed from the scheduling timeline.\n\t */\n\tcancel(after?: Time): this {\n\t\tthis._events.cancel(this.toSeconds(after));\n\t\treturn this;\n\t}\n\n\t/**\n\t * The draw loop\n\t */\n\tprivate _drawLoop(): void {\n\t\tconst now = this.context.currentTime;\n\t\twhile (this._events.length && (this._events.peek() as DrawEvent).time - this.anticipation <= now) {\n\t\t\tconst event = this._events.shift();\n\t\t\tif (event && now - event.time <= this.expiration) {\n\t\t\t\tevent.callback();\n\t\t\t}\n\t\t}\n\t\tif (this._events.length > 0) {\n\t\t\tthis._animationFrame = requestAnimationFrame(this._boundDrawLoop);\n\t\t}\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._events.dispose();\n\t\tcancelAnimationFrame(this._animationFrame);\n\t\treturn this;\n\t}\n}\n\n//-------------------------------------\n// \tINITIALIZATION\n//-------------------------------------\n\nonContextInit(context => {\n\tcontext.draw = new Draw({ context });\n});\n\nonContextClose(context => {\n\tcontext.draw.dispose();\n});\n","import { Tone } from \"../Tone\";\nimport { isDefined } from \"./TypeCheck\";\nimport { assert } from \"./Debug\";\n\n/**\n * An IntervalTimeline event must have a time and duration\n */\nexport interface IntervalTimelineEvent {\n\ttime: number;\n\tduration: number;\n\t[propName: string]: any;\n}\n\ntype IteratorCallback = (event: IntervalTimelineEvent) => void;\n\n/**\n * Similar to Tone.Timeline, but all events represent\n * intervals with both \"time\" and \"duration\" times. The\n * events are placed in a tree structure optimized\n * for querying an intersection point with the timeline\n * events. Internally uses an [Interval Tree](https://en.wikipedia.org/wiki/Interval_tree)\n * to represent the data.\n */\nexport class IntervalTimeline extends Tone {\n\n\treadonly name: string = \"IntervalTimeline\";\n\n\t/**\n\t * The root node of the inteval tree\n\t */\n\tprivate _root: IntervalNode | null = null;\n\n\t/**\n\t * Keep track of the length of the timeline.\n\t */\n\tprivate _length = 0;\n\n\t/**\n\t * The event to add to the timeline. All events must\n\t * have a time and duration value\n\t * @param event The event to add to the timeline\n\t */\n\tadd(event: IntervalTimelineEvent): this {\n\t\tassert(isDefined(event.time), \"Events must have a time property\");\n\t\tassert(isDefined(event.duration), \"Events must have a duration parameter\");\n\n\t\tevent.time = event.time.valueOf();\n\t\tlet node: IntervalNode | null = new IntervalNode(event.time, event.time + event.duration, event);\n\t\tif (this._root === null) {\n\t\t\tthis._root = node;\n\t\t} else {\n\t\t\tthis._root.insert(node);\n\t\t}\n\t\tthis._length++;\n\t\t// Restructure tree to be balanced\n\t\twhile (node !== null) {\n\t\t\tnode.updateHeight();\n\t\t\tnode.updateMax();\n\t\t\tthis._rebalance(node);\n\t\t\tnode = node.parent;\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Remove an event from the timeline.\n\t * @param event The event to remove from the timeline\n\t */\n\tremove(event: IntervalTimelineEvent): this {\n\t\tif (this._root !== null) {\n\t\t\tconst results: IntervalNode[] = [];\n\t\t\tthis._root.search(event.time, results);\n\t\t\tfor (const node of results) {\n\t\t\t\tif (node.event === event) {\n\t\t\t\t\tthis._removeNode(node);\n\t\t\t\t\tthis._length--;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * The number of items in the timeline.\n\t * @readOnly\n\t */\n\tget length(): number {\n\t\treturn this._length;\n\t}\n\n\t/**\n\t * Remove events whose time time is after the given time\n\t * @param after The time to query.\n\t */\n\tcancel(after: number): this {\n\t\tthis.forEachFrom(after, event => this.remove(event));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the root node as the given node\n\t */\n\tprivate _setRoot(node: IntervalNode | null): void {\n\t\tthis._root = node;\n\t\tif (this._root !== null) {\n\t\t\tthis._root.parent = null;\n\t\t}\n\t}\n\n\t/**\n\t * Replace the references to the node in the node's parent\n\t * with the replacement node.\n\t */\n\tprivate _replaceNodeInParent(node: IntervalNode, replacement: IntervalNode | null): void {\n\t\tif (node.parent !== null) {\n\t\t\tif (node.isLeftChild()) {\n\t\t\t\tnode.parent.left = replacement;\n\t\t\t} else {\n\t\t\t\tnode.parent.right = replacement;\n\t\t\t}\n\t\t\tthis._rebalance(node.parent);\n\t\t} else {\n\t\t\tthis._setRoot(replacement);\n\t\t}\n\t}\n\n\t/**\n\t * Remove the node from the tree and replace it with\n\t * a successor which follows the schema.\n\t */\n\tprivate _removeNode(node: IntervalNode): void {\n\t\tif (node.left === null && node.right === null) {\n\t\t\tthis._replaceNodeInParent(node, null);\n\t\t} else if (node.right === null) {\n\t\t\tthis._replaceNodeInParent(node, node.left);\n\t\t} else if (node.left === null) {\n\t\t\tthis._replaceNodeInParent(node, node.right);\n\t\t} else {\n\t\t\tconst balance = node.getBalance();\n\t\t\tlet replacement: IntervalNode;\n\t\t\tlet temp: IntervalNode | null = null;\n\t\t\tif (balance > 0) {\n\t\t\t\tif (node.left.right === null) {\n\t\t\t\t\treplacement = node.left;\n\t\t\t\t\treplacement.right = node.right;\n\t\t\t\t\ttemp = replacement;\n\t\t\t\t} else {\n\t\t\t\t\treplacement = node.left.right;\n\t\t\t\t\twhile (replacement.right !== null) {\n\t\t\t\t\t\treplacement = replacement.right;\n\t\t\t\t\t}\n\t\t\t\t\tif (replacement.parent) {\n\t\t\t\t\t\treplacement.parent.right = replacement.left;\n\t\t\t\t\t\ttemp = replacement.parent;\n\t\t\t\t\t\treplacement.left = node.left;\n\t\t\t\t\t\treplacement.right = node.right;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (node.right.left === null) {\n\t\t\t\treplacement = node.right;\n\t\t\t\treplacement.left = node.left;\n\t\t\t\ttemp = replacement;\n\t\t\t} else {\n\t\t\t\treplacement = node.right.left;\n\t\t\t\twhile (replacement.left !== null) {\n\t\t\t\t\treplacement = replacement.left;\n\t\t\t\t}\n\t\t\t\tif (replacement.parent) {\n\t\t\t\t\treplacement.parent.left = replacement.right;\n\t\t\t\t\ttemp = replacement.parent;\n\t\t\t\t\treplacement.left = node.left;\n\t\t\t\t\treplacement.right = node.right;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (node.parent !== null) {\n\t\t\t\tif (node.isLeftChild()) {\n\t\t\t\t\tnode.parent.left = replacement;\n\t\t\t\t} else {\n\t\t\t\t\tnode.parent.right = replacement;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis._setRoot(replacement);\n\t\t\t}\n\t\t\tif (temp) {\n\t\t\t\tthis._rebalance(temp);\n\t\t\t}\n\t\t}\n\t\tnode.dispose();\n\t}\n\n\t/**\n\t * Rotate the tree to the left\n\t */\n\tprivate _rotateLeft(node: IntervalNode): void {\n\t\tconst parent = node.parent;\n\t\tconst isLeftChild = node.isLeftChild();\n\n\t\t// Make node.right the new root of this sub tree (instead of node)\n\t\tconst pivotNode = node.right;\n\t\tif (pivotNode) {\n\t\t\tnode.right = pivotNode.left;\n\t\t\tpivotNode.left = node;\n\t\t}\n\n\t\tif (parent !== null) {\n\t\t\tif (isLeftChild) {\n\t\t\t\tparent.left = pivotNode;\n\t\t\t} else {\n\t\t\t\tparent.right = pivotNode;\n\t\t\t}\n\t\t} else {\n\t\t\tthis._setRoot(pivotNode);\n\t\t}\n\t}\n\n\t/**\n\t * Rotate the tree to the right\n\t */\n\tprivate _rotateRight(node: IntervalNode): void {\n\t\tconst parent = node.parent;\n\t\tconst isLeftChild = node.isLeftChild();\n\n\t\t// Make node.left the new root of this sub tree (instead of node)\n\t\tconst pivotNode = node.left;\n\t\tif (pivotNode) {\n\t\t\tnode.left = pivotNode.right;\n\t\t\tpivotNode.right = node;\n\t\t}\n\n\t\tif (parent !== null) {\n\t\t\tif (isLeftChild) {\n\t\t\t\tparent.left = pivotNode;\n\t\t\t} else {\n\t\t\t\tparent.right = pivotNode;\n\t\t\t}\n\t\t} else {\n\t\t\tthis._setRoot(pivotNode);\n\t\t}\n\t}\n\n\t/**\n\t * Balance the BST\n\t */\n\tprivate _rebalance(node: IntervalNode): void {\n\t\tconst balance = node.getBalance();\n\t\tif (balance > 1 && node.left) {\n\t\t\tif (node.left.getBalance() < 0) {\n\t\t\t\tthis._rotateLeft(node.left);\n\t\t\t} else {\n\t\t\t\tthis._rotateRight(node);\n\t\t\t}\n\t\t} else if (balance < -1 && node.right) {\n\t\t\tif (node.right.getBalance() > 0) {\n\t\t\t\tthis._rotateRight(node.right);\n\t\t\t} else {\n\t\t\t\tthis._rotateLeft(node);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get an event whose time and duration span the give time. Will\n\t * return the match whose \"time\" value is closest to the given time.\n\t * @return The event which spans the desired time\n\t */\n\tget(time: number): IntervalTimelineEvent | null {\n\t\tif (this._root !== null) {\n\t\t\tconst results: IntervalNode[] = [];\n\t\t\tthis._root.search(time, results);\n\t\t\tif (results.length > 0) {\n\t\t\t\tlet max = results[0];\n\t\t\t\tfor (let i = 1; i < results.length; i++) {\n\t\t\t\t\tif (results[i].low > max.low) {\n\t\t\t\t\t\tmax = results[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn max.event;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Iterate over everything in the timeline.\n\t * @param callback The callback to invoke with every item\n\t */\n\tforEach(callback: IteratorCallback): this {\n\t\tif (this._root !== null) {\n\t\t\tconst allNodes: IntervalNode[] = [];\n\t\t\tthis._root.traverse(node => allNodes.push(node));\n\t\t\tallNodes.forEach(node => {\n\t\t\t\tif (node.event) {\n\t\t\t\t\tcallback(node.event);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Iterate over everything in the array in which the given time\n\t * overlaps with the time and duration time of the event.\n\t * @param time The time to check if items are overlapping\n\t * @param callback The callback to invoke with every item\n\t */\n\tforEachAtTime(time: number, callback: IteratorCallback): this {\n\t\tif (this._root !== null) {\n\t\t\tconst results: IntervalNode[] = [];\n\t\t\tthis._root.search(time, results);\n\t\t\tresults.forEach(node => {\n\t\t\t\tif (node.event) {\n\t\t\t\t\tcallback(node.event);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Iterate over everything in the array in which the time is greater\n\t * than or equal to the given time.\n\t * @param time The time to check if items are before\n\t * @param callback The callback to invoke with every item\n\t */\n\tforEachFrom(time: number, callback: IteratorCallback): this {\n\t\tif (this._root !== null) {\n\t\t\tconst results: IntervalNode[] = [];\n\t\t\tthis._root.searchAfter(time, results);\n\t\t\tresults.forEach(node => {\n\t\t\t\tif (node.event) {\n\t\t\t\t\tcallback(node.event);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clean up\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tif (this._root !== null) {\n\t\t\tthis._root.traverse(node => node.dispose());\n\t\t}\n\t\tthis._root = null;\n\t\treturn this;\n\t}\n}\n\n//-------------------------------------\n// \tINTERVAL NODE HELPER\n//-------------------------------------\n\n/**\n * Represents a node in the binary search tree, with the addition\n * of a \"high\" value which keeps track of the highest value of\n * its children.\n * References:\n * https://brooknovak.wordpress.com/2013/12/07/augmented-interval-tree-in-c/\n * http://www.mif.vu.lt/~valdas/ALGORITMAI/LITERATURA/Cormen/Cormen.pdf\n * @param low\n * @param high\n */\nclass IntervalNode {\n\n\t// the event container\n\tevent: IntervalTimelineEvent | null;\n\t// the low value\n\tlow: number;\n\t// the high value\n\thigh: number;\n\t// the high value for this and all child nodes\n\tmax: number;\n\t// the nodes to the left\n\tprivate _left: IntervalNode | null = null;\n\t// the nodes to the right\n\tprivate _right: IntervalNode | null = null;\n\t// the parent node\n\tparent: IntervalNode | null = null;\n\t// the number of child nodes\n\theight = 0;\n\n\tconstructor(low: number, high: number, event: IntervalTimelineEvent) {\n\t\tthis.event = event;\n\t\t// the low value\n\t\tthis.low = low;\n\t\t// the high value\n\t\tthis.high = high;\n\t\t// the high value for this and all child nodes\n\t\tthis.max = this.high;\n\t}\n\n\t/**\n\t * Insert a node into the correct spot in the tree\n\t */\n\tinsert(node: IntervalNode): void {\n\t\tif (node.low <= this.low) {\n\t\t\tif (this.left === null) {\n\t\t\t\tthis.left = node;\n\t\t\t} else {\n\t\t\t\tthis.left.insert(node);\n\t\t\t}\n\t\t} else if (this.right === null) {\n\t\t\tthis.right = node;\n\t\t} else {\n\t\t\tthis.right.insert(node);\n\t\t}\n\t}\n\n\t/**\n\t * Search the tree for nodes which overlap\n\t * with the given point\n\t * @param point The point to query\n\t * @param results The array to put the results\n\t */\n\tsearch(point: number, results: IntervalNode[]): void {\n\t\t// If p is to the right of the rightmost point of any interval\n\t\t// in this node and all children, there won't be any matches.\n\t\tif (point > this.max) {\n\t\t\treturn;\n\t\t}\n\t\t// Search left children\n\t\tif (this.left !== null) {\n\t\t\tthis.left.search(point, results);\n\t\t}\n\t\t// Check this node\n\t\tif (this.low <= point && this.high > point) {\n\t\t\tresults.push(this);\n\t\t}\n\t\t// If p is to the left of the time of this interval,\n\t\t// then it can't be in any child to the right.\n\t\tif (this.low > point) {\n\t\t\treturn;\n\t\t}\n\t\t// Search right children\n\t\tif (this.right !== null) {\n\t\t\tthis.right.search(point, results);\n\t\t}\n\t}\n\n\t/**\n\t * Search the tree for nodes which are less\n\t * than the given point\n\t * @param point The point to query\n\t * @param results The array to put the results\n\t */\n\tsearchAfter(point: number, results: IntervalNode[]): void {\n\t\t// Check this node\n\t\tif (this.low >= point) {\n\t\t\tresults.push(this);\n\t\t\tif (this.left !== null) {\n\t\t\t\tthis.left.searchAfter(point, results);\n\t\t\t}\n\t\t}\n\t\t// search the right side\n\t\tif (this.right !== null) {\n\t\t\tthis.right.searchAfter(point, results);\n\t\t}\n\t}\n\n\t/**\n\t * Invoke the callback on this element and both it's branches\n\t * @param {Function} callback\n\t */\n\ttraverse(callback: (self: IntervalNode) => void): void {\n\t\tcallback(this);\n\t\tif (this.left !== null) {\n\t\t\tthis.left.traverse(callback);\n\t\t}\n\t\tif (this.right !== null) {\n\t\t\tthis.right.traverse(callback);\n\t\t}\n\t}\n\n\t/**\n\t * Update the height of the node\n\t */\n\tupdateHeight(): void {\n\t\tif (this.left !== null && this.right !== null) {\n\t\t\tthis.height = Math.max(this.left.height, this.right.height) + 1;\n\t\t} else if (this.right !== null) {\n\t\t\tthis.height = this.right.height + 1;\n\t\t} else if (this.left !== null) {\n\t\t\tthis.height = this.left.height + 1;\n\t\t} else {\n\t\t\tthis.height = 0;\n\t\t}\n\t}\n\n\t/**\n\t * Update the height of the node\n\t */\n\tupdateMax(): void {\n\t\tthis.max = this.high;\n\t\tif (this.left !== null) {\n\t\t\tthis.max = Math.max(this.max, this.left.max);\n\t\t}\n\t\tif (this.right !== null) {\n\t\t\tthis.max = Math.max(this.max, this.right.max);\n\t\t}\n\t}\n\n\t/**\n\t * The balance is how the leafs are distributed on the node\n\t * @return Negative numbers are balanced to the right\n\t */\n\tgetBalance(): number {\n\t\tlet balance = 0;\n\t\tif (this.left !== null && this.right !== null) {\n\t\t\tbalance = this.left.height - this.right.height;\n\t\t} else if (this.left !== null) {\n\t\t\tbalance = this.left.height + 1;\n\t\t} else if (this.right !== null) {\n\t\t\tbalance = -(this.right.height + 1);\n\t\t}\n\t\treturn balance;\n\t}\n\n\t/**\n\t * @returns true if this node is the left child of its parent\n\t */\n\tisLeftChild(): boolean {\n\t\treturn this.parent !== null && this.parent.left === this;\n\t}\n\n\t/**\n\t * get/set the left node\n\t */\n\tget left(): IntervalNode | null {\n\t\treturn this._left;\n\t}\n\n\tset left(node: IntervalNode | null) {\n\t\tthis._left = node;\n\t\tif (node !== null) {\n\t\t\tnode.parent = this;\n\t\t}\n\t\tthis.updateHeight();\n\t\tthis.updateMax();\n\t}\n\n\t/**\n\t * get/set the right node\n\t */\n\tget right(): IntervalNode | null {\n\t\treturn this._right;\n\t}\n\n\tset right(node: IntervalNode | null) {\n\t\tthis._right = node;\n\t\tif (node !== null) {\n\t\t\tnode.parent = this;\n\t\t}\n\t\tthis.updateHeight();\n\t\tthis.updateMax();\n\t}\n\n\t/**\n\t * null out references.\n\t */\n\tdispose(): void {\n\t\tthis.parent = null;\n\t\tthis._left = null;\n\t\tthis._right = null;\n\t\tthis.event = null;\n\t}\n}\n","import { Gain } from \"../../core/context/Gain\";\nimport { Param } from \"../../core/context/Param\";\nimport { ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { Decibels } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { readOnly } from \"../../core/util/Interface\";\n\ninterface VolumeOptions extends ToneAudioNodeOptions {\n\tvolume: Decibels;\n\tmute: boolean;\n}\n\n/**\n * Volume is a simple volume node, useful for creating a volume fader.\n *\n * @example\n * const vol = new Tone.Volume(-12).toDestination();\n * const osc = new Tone.Oscillator().connect(vol).start();\n * @category Component\n */\nexport class Volume extends ToneAudioNode<VolumeOptions> {\n\n\treadonly name: string = \"Volume\";\n\n\t/**\n\t * the output node\n\t */\n\toutput: Gain<\"decibels\">;\n\n\t/**\n\t * Input and output are the same\n\t */\n\tinput: Gain<\"decibels\">;\n\n\t/**\n\t * The unmuted volume\n\t */\n\tprivate _unmutedVolume: Decibels;\n\n\t/**\n\t * The volume control in decibels.\n\t * @example\n\t * const vol = new Tone.Volume().toDestination();\n\t * const osc = new Tone.Oscillator().connect(vol).start();\n\t * vol.volume.value = -20;\n\t */\n\tvolume: Param<\"decibels\">;\n\n\t/**\n\t * @param volume the initial volume in decibels\n\t */\n\tconstructor(volume?: Decibels);\n\tconstructor(options?: Partial<VolumeOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Volume.getDefaults(), arguments, [\"volume\"]));\n\t\tconst options = optionsFromArguments(Volume.getDefaults(), arguments, [\"volume\"]);\n\n\t\tthis.input = this.output = new Gain({\n\t\t\tcontext: this.context,\n\t\t\tgain: options.volume,\n\t\t\tunits: \"decibels\",\n\t\t});\n\t\tthis.volume = this.output.gain;\n\t\treadOnly(this, \"volume\");\n\t\tthis._unmutedVolume = options.volume;\n\n\t\t// set the mute initially\n\t\tthis.mute = options.mute;\n\t}\n\n\tstatic getDefaults(): VolumeOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tmute: false,\n\t\t\tvolume: 0,\n\t\t});\n\t}\n\n\t/**\n\t * Mute the output.\n\t * @example\n\t * const vol = new Tone.Volume(-12).toDestination();\n\t * const osc = new Tone.Oscillator().connect(vol).start();\n\t * // mute the output\n\t * vol.mute = true;\n\t */\n\tget mute(): boolean {\n\t\treturn this.volume.value === -Infinity;\n\t}\n\tset mute(mute: boolean) {\n\t\tif (!this.mute && mute) {\n\t\t\tthis._unmutedVolume = this.volume.value;\n\t\t\t// maybe it should ramp here?\n\t\t\tthis.volume.value = -Infinity;\n\t\t} else if (this.mute && !mute) {\n\t\t\tthis.volume.value = this._unmutedVolume;\n\t\t}\n\t}\n\n\t/**\n\t * clean up\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.input.dispose();\n\t\tthis.volume.dispose();\n\t\treturn this;\n\t}\n}\n","import { Volume } from \"../../component/channel/Volume\";\nimport { Decibels } from \"../type/Units\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { onContextClose, onContextInit } from \"./ContextInitialization\";\nimport { Gain } from \"./Gain\";\nimport { Param } from \"./Param\";\nimport { connectSeries, ToneAudioNode, ToneAudioNodeOptions } from \"./ToneAudioNode\";\n\ninterface DestinationOptions extends ToneAudioNodeOptions {\n\tvolume: Decibels;\n\tmute: boolean;\n}\n\n/**\n * A single master output which is connected to the\n * AudioDestinationNode (aka your speakers).\n * It provides useful conveniences such as the ability\n * to set the volume and mute the entire application.\n * It also gives you the ability to apply master effects to your application.\n *\n * @example\n * const oscillator = new Tone.Oscillator().start();\n * // the audio will go from the oscillator to the speakers\n * oscillator.connect(Tone.getDestination());\n * // a convenience for connecting to the master output is also provided:\n * oscillator.toDestination();\n * @category Core\n */\nexport class Destination extends ToneAudioNode<DestinationOptions> {\n\n\treadonly name: string = \"Destination\";\n\n\tinput: Volume = new Volume({ context: this.context });\n\toutput: Gain = new Gain({ context: this.context });\n\n\t/**\n\t * The volume of the master output in decibels. -Infinity is silent, and 0 is no change. \n\t * @example\n\t * const osc = new Tone.Oscillator().toDestination();\n\t * osc.start();\n\t * // ramp the volume down to silent over 10 seconds\n\t * Tone.getDestination().volume.rampTo(-Infinity, 10);\n\t */\n\tvolume: Param<\"decibels\"> = this.input.volume;\n\n\tconstructor(options: Partial<DestinationOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Destination.getDefaults(), arguments));\n\t\tconst options = optionsFromArguments(Destination.getDefaults(), arguments);\n\n\t\tconnectSeries(this.input, this.output, this.context.rawContext.destination);\n\n\t\tthis.mute = options.mute;\n\t\tthis._internalChannels = [this.input, this.context.rawContext.destination, this.output];\n\t}\n\n\tstatic getDefaults(): DestinationOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tmute: false,\n\t\t\tvolume: 0,\n\t\t});\n\t}\n\n\t/**\n\t * Mute the output.\n\t * @example\n\t * const oscillator = new Tone.Oscillator().start().toDestination();\n\t * setTimeout(() => {\n\t * \t// mute the output\n\t * \tTone.Destination.mute = true;\n\t * }, 1000);\n\t */\n\tget mute(): boolean {\n\t\treturn this.input.mute;\n\t}\n\tset mute(mute: boolean) {\n\t\tthis.input.mute = mute;\n\t}\n\n\t/**\n\t * Add a master effects chain. NOTE: this will disconnect any nodes which were previously\n\t * chained in the master effects chain.\n\t * @param args All arguments will be connected in a row and the Master will be routed through it.\n\t * @example\n\t * // route all audio through a filter and compressor\n\t * const lowpass = new Tone.Filter(800, \"lowpass\");\n\t * const compressor = new Tone.Compressor(-18);\n\t * Tone.Destination.chain(lowpass, compressor);\n\t */\n\tchain(...args: Array<AudioNode | ToneAudioNode>): this {\n\t\tthis.input.disconnect();\n\t\targs.unshift(this.input);\n\t\targs.push(this.output);\n\t\tconnectSeries(...args);\n\t\treturn this;\n\t}\n\n\t/**\n\t * The maximum number of channels the system can output\n\t * @example\n\t * console.log(Tone.Destination.maxChannelCount);\n\t */\n\tget maxChannelCount(): number {\n\t\treturn this.context.rawContext.destination.maxChannelCount;\n\t}\n\n\t/**\n\t * Clean up\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.volume.dispose();\n\t\treturn this;\n\t}\n}\n\n//-------------------------------------\n// \tINITIALIZATION\n//-------------------------------------\n\nonContextInit(context => {\n\tcontext.destination = new Destination({ context });\n});\n\nonContextClose(context => {\n\tcontext.destination.dispose();\n});\n","import { Timeline, TimelineEvent } from \"./Timeline\";\nimport { Tone } from \"../Tone\";\nimport { Seconds } from \"../type/Units\";\n\ninterface TimelineValueEvent<T> extends TimelineEvent {\n\tvalue: T;\n}\n\n/**\n * Represents a single value which is gettable and settable in a timed way\n */\nexport class TimelineValue<Type> extends Tone {\n\n\treadonly name: string = \"TimelineValue\";\n\n\t/**\n\t * The timeline which stores the values\n\t */\n\tprivate _timeline: Timeline<TimelineValueEvent<Type>> = new Timeline({ memory: 10 })\n\n\t/**\n\t * Hold the value to return if there is no scheduled values\n\t */\n\tprivate _initialValue: Type;\n\n\t/**\n\t * @param initialValue The value to return if there is no scheduled values\n\t */\n\tconstructor(initialValue: Type) {\n\n\t\tsuper();\n\t\tthis._initialValue = initialValue;\n\t}\n\n\t/**\n\t * Set the value at the given time\n\t */\n\tset(value: Type, time: Seconds): this {\n\t\tthis._timeline.add({\n\t\t\tvalue, time\n\t\t});\n\t\treturn this;\n\t}\n\t\n\t/**\n\t * Get the value at the given time\n\t */\n\tget(time: Seconds): Type {\n\t\tconst event = this._timeline.get(time);\n\t\tif (event) {\n\t\t\treturn event.value;\n\t\t} else {\n\t\t\treturn this._initialValue;\n\t\t}\n\t}\n}\n","import { Seconds, Ticks } from \"../type/Units\";\nimport { noOp } from \"../util/Interface\";\n\ntype Transport = import(\"../clock/Transport\").Transport;\n\nexport interface TransportEventOptions {\n\tcallback: (time: number) => void;\n\tonce: boolean;\n\ttime: Ticks;\n}\n\n/**\n * TransportEvent is an internal class used by [[Transport]]\n * to schedule events. Do no invoke this class directly, it is\n * handled from within Tone.Transport.\n */\nexport class TransportEvent {\n\n\t/**\n\t * Reference to the Transport that created it\n\t */\n\tprotected transport: Transport;\n\n\t/**\n\t * The unique id of the event\n\t */\n\tid: number = TransportEvent._eventId++;\n\n\t/**\n\t * The time the event starts\n\t */\n\ttime: Ticks;\n\n\t/**\n\t * The callback to invoke\n\t */\n\tprivate callback?: (time: Seconds) => void;\n\n\t/**\n\t * If the event should be removed after being invoked.\n\t */\n\tprivate _once: boolean;\n\n\t/**\n\t * The remaining value between the passed in time, and Math.floor(time).\n\t * This value is later added back when scheduling to get sub-tick precision. \n\t */\n\tprotected _remainderTime = 0;\n\n\t/**\n\t * @param transport The transport object which the event belongs to\n\t */\n\tconstructor(transport: Transport, opts: Partial<TransportEventOptions>) {\n\n\t\tconst options: TransportEventOptions = Object.assign(TransportEvent.getDefaults(), opts);\n\n\t\tthis.transport = transport;\n\t\tthis.callback = options.callback;\n\t\tthis._once = options.once;\n\t\tthis.time = Math.floor(options.time);\n\t\tthis._remainderTime = options.time - this.time;\n\t}\n\n\tstatic getDefaults(): TransportEventOptions {\n\t\treturn {\n\t\t\tcallback: noOp,\n\t\t\tonce: false,\n\t\t\ttime: 0,\n\t\t};\n\t}\n\n\t/**\n\t * Current ID counter\n\t */\n\tprivate static _eventId = 0;\n\n\t/**\n\t * Get the time and remainder time.\n\t */\n\tprotected get floatTime(): number {\n\t\treturn this.time + this._remainderTime;\n\t}\n\n\t/**\n\t * Invoke the event callback.\n\t * @param time The AudioContext time in seconds of the event\n\t */\n\tinvoke(time: Seconds): void {\n\t\tif (this.callback) {\n\t\t\tconst tickDuration = this.transport.bpm.getDurationOfTicks(1, time);\n\t\t\tthis.callback(time + this._remainderTime * tickDuration);\n\t\t\tif (this._once) {\n\t\t\t\tthis.transport.clear(this.id);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Clean up\n\t */\n\tdispose(): this {\n\t\tthis.callback = undefined;\n\t\treturn this;\n\t}\n}\n","import { BaseContext } from \"../context/BaseContext\";\nimport { TicksClass } from \"../type/Ticks\";\nimport { Seconds, Ticks, Time } from \"../type/Units\";\nimport { TransportEvent, TransportEventOptions } from \"./TransportEvent\";\nimport { GT, LT } from \"../util/Math\";\n\ntype Transport = import(\"../clock/Transport\").Transport;\n\ninterface TransportRepeatEventOptions extends TransportEventOptions {\n\tinterval: Ticks;\n\tduration: Ticks;\n}\n\n/**\n * TransportRepeatEvent is an internal class used by Tone.Transport\n * to schedule repeat events. This class should not be instantiated directly.\n */\nexport class TransportRepeatEvent extends TransportEvent {\n\n\t/**\n\t * When the event should stop repeating\n\t */\n\tprivate duration: Ticks;\n\n\t/**\n\t * The interval of the repeated event\n\t */\n\tprivate _interval: Ticks;\n\n\t/**\n\t * The ID of the current timeline event\n\t */\n\tprivate _currentId = -1;\n\n\t/**\n\t * The ID of the next timeline event\n\t */\n\tprivate _nextId = -1;\n\n\t/**\n\t * The time of the next event\n\t */\n\tprivate _nextTick = this.time;\n\n\t/**\n\t * a reference to the bound start method\n\t */\n\tprivate _boundRestart = this._restart.bind(this);\n\n\t/**\n\t * The audio context belonging to this event\n\t */\n\tprotected context: BaseContext;\n\n\t/**\n\t * @param transport The transport object which the event belongs to\n\t */\n\tconstructor(transport: Transport, opts: Partial<TransportRepeatEventOptions>) {\n\n\t\tsuper(transport, opts);\n\n\t\tconst options = Object.assign(TransportRepeatEvent.getDefaults(), opts);\n\n\t\tthis.duration = options.duration;\n\t\tthis._interval = options.interval;\n\t\tthis._nextTick = options.time;\n\t\tthis.transport.on(\"start\", this._boundRestart);\n\t\tthis.transport.on(\"loopStart\", this._boundRestart);\n\t\tthis.transport.on(\"ticks\", this._boundRestart);\n\t\tthis.context = this.transport.context;\n\t\tthis._restart();\n\t}\n\n\tstatic getDefaults(): TransportRepeatEventOptions {\n\t\treturn Object.assign({}, TransportEvent.getDefaults(), {\n\t\t\tduration: Infinity,\n\t\t\tinterval: 1,\n\t\t\tonce: false,\n\t\t});\n\t}\n\n\t/**\n\t * Invoke the callback. Returns the tick time which\n\t * the next event should be scheduled at.\n\t * @param time The AudioContext time in seconds of the event\n\t */\n\tinvoke(time: Seconds): void {\n\t\t// create more events if necessary\n\t\tthis._createEvents(time);\n\t\t// call the super class\n\t\tsuper.invoke(time);\n\t}\n\n\t/**\n\t * Create an event on the transport on the nextTick\n\t */\n\tprivate _createEvent(): number {\n\t\tif (LT(this._nextTick, this.floatTime + this.duration)) {\n\t\t\treturn this.transport.scheduleOnce(this.invoke.bind(this),\n\t\t\t\tnew TicksClass(this.context, this._nextTick).toSeconds());\n\t\t}\n\t\treturn -1;\n\t}\n\n\t/**\n\t * Push more events onto the timeline to keep up with the position of the timeline\n\t */\n\tprivate _createEvents(time: Seconds): void {\n\t\t// schedule the next event\n\t\t// const ticks = this.transport.getTicksAtTime(time);\n\t\t// if the next tick is within the bounds set by \"duration\"\n\t\tif (LT(this._nextTick + this._interval, this.floatTime + this.duration)) {\n\t\t\tthis._nextTick += this._interval;\n\t\t\tthis._currentId = this._nextId;\n\t\t\tthis._nextId = this.transport.scheduleOnce(this.invoke.bind(this),\n\t\t\t\tnew TicksClass(this.context, this._nextTick).toSeconds());\n\t\t}\n\t}\n\n\t/**\n\t * Re-compute the events when the transport time has changed from a start/ticks/loopStart event\n\t */\n\tprivate _restart(time?: Time): void {\n\t\tthis.transport.clear(this._currentId);\n\t\tthis.transport.clear(this._nextId);\n\t\t// start at the first event\n\t\tthis._nextTick = this.floatTime;\n\t\tconst ticks = this.transport.getTicksAtTime(time);\n\t\tif (GT(ticks, this.time)) {\n\t\t\t// the event is not being scheduled from the beginning and should be offset\n\t\t\tthis._nextTick = this.floatTime + Math.ceil((ticks - this.floatTime) / this._interval) * this._interval;\n\t\t}\n\t\tthis._currentId = this._createEvent();\n\t\tthis._nextTick += this._interval;\n\t\tthis._nextId = this._createEvent();\n\t}\n\n\t/**\n\t * Clean up\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.transport.clear(this._currentId);\n\t\tthis.transport.clear(this._nextId);\n\t\tthis.transport.off(\"start\", this._boundRestart);\n\t\tthis.transport.off(\"loopStart\", this._boundRestart);\n\t\tthis.transport.off(\"ticks\", this._boundRestart);\n\t\treturn this;\n\t}\n}\n","import { TimeClass } from \"../../core/type/Time\";\nimport { PlaybackState } from \"../../core/util/StateTimeline\";\nimport { TimelineValue } from \"../../core/util/TimelineValue\";\nimport { Signal } from \"../../signal/Signal\";\nimport { onContextClose, onContextInit } from \"../context/ContextInitialization\";\nimport { Gain } from \"../context/Gain\";\nimport { ToneWithContext, ToneWithContextOptions } from \"../context/ToneWithContext\";\nimport { TicksClass } from \"../type/Ticks\";\nimport { TransportTimeClass } from \"../type/TransportTime\";\nimport {\n\tBarsBeatsSixteenths, BPM, NormalRange, Seconds,\n\tSubdivision, Ticks, Time, TimeSignature, TransportTime\n} from \"../type/Units\";\nimport { optionsFromArguments } from \"../util/Defaults\";\nimport { Emitter } from \"../util/Emitter\";\nimport { readOnly, writable } from \"../util/Interface\";\nimport { IntervalTimeline } from \"../util/IntervalTimeline\";\nimport { Timeline } from \"../util/Timeline\";\nimport { isArray, isDefined } from \"../util/TypeCheck\";\nimport { Clock } from \"./Clock\";\nimport { TickParam } from \"./TickParam\";\nimport { TransportEvent } from \"./TransportEvent\";\nimport { TransportRepeatEvent } from \"./TransportRepeatEvent\";\n\ninterface TransportOptions extends ToneWithContextOptions {\n\tbpm: BPM;\n\tswing: NormalRange;\n\tswingSubdivision: Subdivision;\n\ttimeSignature: number;\n\tloopStart: Time;\n\tloopEnd: Time;\n\tppq: number;\n}\n\ntype TransportEventNames = \"start\" | \"stop\" | \"pause\" | \"loop\" | \"loopEnd\" | \"loopStart\" | \"ticks\";\n\ninterface SyncedSignalEvent {\n\tsignal: Signal;\n\tinitial: number;\n\tratio: Gain;\n}\n\ntype TransportCallback = (time: Seconds) => void;\n\n/**\n * Transport for timing musical events.\n * Supports tempo curves and time changes. Unlike browser-based timing (setInterval, requestAnimationFrame)\n * Transport timing events pass in the exact time of the scheduled event\n * in the argument of the callback function. Pass that time value to the object\n * you're scheduling. <br><br>\n * A single transport is created for you when the library is initialized.\n * <br><br>\n * The transport emits the events: \"start\", \"stop\", \"pause\", and \"loop\" which are\n * called with the time of that event as the argument.\n *\n * @example\n * const osc = new Tone.Oscillator().toDestination();\n * // repeated event every 8th note\n * Tone.Transport.scheduleRepeat((time) => {\n * \t// use the callback time to schedule events\n * \tosc.start(time).stop(time + 0.1);\n * }, \"8n\");\n * // transport must be started before it starts invoking events\n * Tone.Transport.start();\n * @category Core\n */\nexport class Transport extends ToneWithContext<TransportOptions> implements Emitter<TransportEventNames> {\n\n\treadonly name: string = \"Transport\";\n\n\t//-------------------------------------\n\t// \tLOOPING\n\t//-------------------------------------\n\n\t/**\n\t * If the transport loops or not.\n\t */\n\tprivate _loop: TimelineValue<boolean> = new TimelineValue(false);\n\n\t/**\n\t * The loop start position in ticks\n\t */\n\tprivate _loopStart: Ticks = 0;\n\n\t/**\n\t * The loop end position in ticks\n\t */\n\tprivate _loopEnd: Ticks = 0;\n\n\t//-------------------------------------\n\t// \tCLOCK/TEMPO\n\t//-------------------------------------\n\n\t/**\n\t * Pulses per quarter is the number of ticks per quarter note.\n\t */\n\tprivate _ppq: number;\n\n\t/**\n\t * watches the main oscillator for timing ticks\n\t * initially starts at 120bpm\n\t */\n\tprivate _clock: Clock<\"bpm\">;\n\n\t/**\n\t * The Beats Per Minute of the Transport.\n\t * @example\n\t * const osc = new Tone.Oscillator().toDestination();\n\t * Tone.Transport.bpm.value = 80;\n\t * // start/stop the oscillator every quarter note\n\t * Tone.Transport.scheduleRepeat(time => {\n\t * \tosc.start(time).stop(time + 0.1);\n\t * }, \"4n\");\n\t * Tone.Transport.start();\n\t * // ramp the bpm to 120 over 10 seconds\n\t * Tone.Transport.bpm.rampTo(120, 10);\n\t */\n\tbpm: TickParam<\"bpm\">;\n\n\t/**\n\t * The time signature, or more accurately the numerator\n\t * of the time signature over a denominator of 4.\n\t */\n\tprivate _timeSignature: number;\n\n\t//-------------------------------------\n\t// \tTIMELINE EVENTS\n\t//-------------------------------------\n\n\t/**\n\t * All the events in an object to keep track by ID\n\t */\n\tprivate _scheduledEvents = {};\n\n\t/**\n\t * The scheduled events.\n\t */\n\tprivate _timeline: Timeline<TransportEvent> = new Timeline();\n\n\t/**\n\t * Repeated events\n\t */\n\tprivate _repeatedEvents: IntervalTimeline = new IntervalTimeline();\n\n\t/**\n\t * All of the synced Signals\n\t */\n\tprivate _syncedSignals: SyncedSignalEvent[] = [];\n\n\t//-------------------------------------\n\t// \tSWING\n\t//-------------------------------------\n\n\t/**\n\t * The subdivision of the swing\n\t */\n\tprivate _swingTicks: Ticks;\n\n\t/**\n\t * The swing amount\n\t */\n\tprivate _swingAmount: NormalRange = 0;\n\n\tconstructor(options?: Partial<TransportOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Transport.getDefaults(), arguments));\n\t\tconst options = optionsFromArguments(Transport.getDefaults(), arguments);\n\n\t\t// CLOCK/TEMPO\n\t\tthis._ppq = options.ppq;\n\t\tthis._clock = new Clock({\n\t\t\tcallback: this._processTick.bind(this),\n\t\t\tcontext: this.context,\n\t\t\tfrequency: 0,\n\t\t\tunits: \"bpm\",\n\t\t});\n\t\tthis._bindClockEvents();\n\t\tthis.bpm = this._clock.frequency as unknown as TickParam<\"bpm\">;\n\t\tthis._clock.frequency.multiplier = options.ppq;\n\t\tthis.bpm.setValueAtTime(options.bpm, 0);\n\t\treadOnly(this, \"bpm\");\n\t\tthis._timeSignature = options.timeSignature;\n\n\t\t// SWING\n\t\tthis._swingTicks = options.ppq / 2; // 8n\n\t}\n\n\tstatic getDefaults(): TransportOptions {\n\t\treturn Object.assign(ToneWithContext.getDefaults(), {\n\t\t\tbpm: 120,\n\t\t\tloopEnd: \"4m\" as Subdivision,\n\t\t\tloopStart: 0,\n\t\t\tppq: 192,\n\t\t\tswing: 0,\n\t\t\tswingSubdivision: \"8n\" as Subdivision,\n\t\t\ttimeSignature: 4,\n\t\t});\n\t}\n\n\t//-------------------------------------\n\t// \tTICKS\n\t//-------------------------------------\n\n\t/**\n\t * called on every tick\n\t * @param tickTime clock relative tick time\n\t */\n\tprivate _processTick(tickTime: Seconds, ticks: Ticks): void {\n\t\t// do the loop test\n\t\tif (this._loop.get(tickTime)) {\n\t\t\tif (ticks >= this._loopEnd) {\n\t\t\t\tthis.emit(\"loopEnd\", tickTime);\n\t\t\t\tthis._clock.setTicksAtTime(this._loopStart, tickTime);\n\t\t\t\tticks = this._loopStart;\n\t\t\t\tthis.emit(\"loopStart\", tickTime, this._clock.getSecondsAtTime(tickTime));\n\t\t\t\tthis.emit(\"loop\", tickTime);\n\t\t\t}\n\t\t}\n\t\t// handle swing\n\t\tif (this._swingAmount > 0 &&\n\t\t\tticks % this._ppq !== 0 && // not on a downbeat\n\t\t\tticks % (this._swingTicks * 2) !== 0) {\n\t\t\t// add some swing\n\t\t\tconst progress = (ticks % (this._swingTicks * 2)) / (this._swingTicks * 2);\n\t\t\tconst amount = Math.sin((progress) * Math.PI) * this._swingAmount;\n\t\t\ttickTime += new TicksClass(this.context, this._swingTicks * 2 / 3).toSeconds() * amount;\n\t\t}\n\t\t// invoke the timeline events scheduled on this tick\n\t\tthis._timeline.forEachAtTime(ticks, event => event.invoke(tickTime));\n\t}\n\n\t//-------------------------------------\n\t// \tSCHEDULABLE EVENTS\n\t//-------------------------------------\n\n\t/**\n\t * Schedule an event along the timeline.\n\t * @param callback The callback to be invoked at the time.\n\t * @param time The time to invoke the callback at.\n\t * @return The id of the event which can be used for canceling the event.\n\t * @example\n\t * // schedule an event on the 16th measure\n\t * Tone.Transport.schedule((time) => {\n\t * \t// invoked on measure 16\n\t * \tconsole.log(\"measure 16!\");\n\t * }, \"16:0:0\");\n\t */\n\tschedule(callback: TransportCallback, time: TransportTime | TransportTimeClass): number {\n\t\tconst event = new TransportEvent(this, {\n\t\t\tcallback,\n\t\t\ttime: new TransportTimeClass(this.context, time).toTicks(),\n\t\t});\n\t\treturn this._addEvent(event, this._timeline);\n\t}\n\n\t/**\n\t * Schedule a repeated event along the timeline. The event will fire\n\t * at the `interval` starting at the `startTime` and for the specified\n\t * `duration`.\n\t * @param callback The callback to invoke.\n\t * @param interval The duration between successive callbacks. Must be a positive number.\n\t * @param startTime When along the timeline the events should start being invoked.\n\t * @param duration How long the event should repeat.\n\t * @return The ID of the scheduled event. Use this to cancel the event.\n\t * @example\n\t * const osc = new Tone.Oscillator().toDestination().start();\n\t * // a callback invoked every eighth note after the first measure\n\t * Tone.Transport.scheduleRepeat((time) => {\n\t * \tosc.start(time).stop(time + 0.1);\n\t * }, \"8n\", \"1m\");\n\t */\n\tscheduleRepeat(\n\t\tcallback: TransportCallback,\n\t\tinterval: Time | TimeClass,\n\t\tstartTime?: TransportTime | TransportTimeClass,\n\t\tduration: Time = Infinity,\n\t): number {\n\t\tconst event = new TransportRepeatEvent(this, {\n\t\t\tcallback,\n\t\t\tduration: new TimeClass(this.context, duration).toTicks(),\n\t\t\tinterval: new TimeClass(this.context, interval).toTicks(),\n\t\t\ttime: new TransportTimeClass(this.context, startTime).toTicks(),\n\t\t});\n\t\t// kick it off if the Transport is started\n\t\t// @ts-ignore\n\t\treturn this._addEvent(event, this._repeatedEvents);\n\t}\n\n\t/**\n\t * Schedule an event that will be removed after it is invoked.\n\t * @param callback The callback to invoke once.\n\t * @param time The time the callback should be invoked.\n\t * @returns The ID of the scheduled event.\n\t */\n\tscheduleOnce(callback: TransportCallback, time: TransportTime | TransportTimeClass): number {\n\t\tconst event = new TransportEvent(this, {\n\t\t\tcallback,\n\t\t\tonce: true,\n\t\t\ttime: new TransportTimeClass(this.context, time).toTicks(),\n\t\t});\n\t\treturn this._addEvent(event, this._timeline);\n\t}\n\n\t/**\n\t * Clear the passed in event id from the timeline\n\t * @param eventId The id of the event.\n\t */\n\tclear(eventId: number): this {\n\t\tif (this._scheduledEvents.hasOwnProperty(eventId)) {\n\t\t\tconst item = this._scheduledEvents[eventId.toString()];\n\t\t\titem.timeline.remove(item.event);\n\t\t\titem.event.dispose();\n\t\t\tdelete this._scheduledEvents[eventId.toString()];\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Add an event to the correct timeline. Keep track of the\n\t * timeline it was added to.\n\t * @returns the event id which was just added\n\t */\n\tprivate _addEvent(event: TransportEvent, timeline: Timeline<TransportEvent>): number {\n\t\tthis._scheduledEvents[event.id.toString()] = {\n\t\t\tevent,\n\t\t\ttimeline,\n\t\t};\n\t\ttimeline.add(event);\n\t\treturn event.id;\n\t}\n\n\t/**\n\t * Remove scheduled events from the timeline after\n\t * the given time. Repeated events will be removed\n\t * if their startTime is after the given time\n\t * @param after Clear all events after this time.\n\t */\n\tcancel(after: TransportTime = 0): this {\n\t\tconst computedAfter = this.toTicks(after);\n\t\tthis._timeline.forEachFrom(computedAfter, event => this.clear(event.id));\n\t\tthis._repeatedEvents.forEachFrom(computedAfter, event => this.clear(event.id));\n\t\treturn this;\n\t}\n\n\t//-------------------------------------\n\t// \tSTART/STOP/PAUSE\n\t//-------------------------------------\n\n\t/**\n\t * Bind start/stop/pause events from the clock and emit them.\n\t */\n\tprivate _bindClockEvents(): void {\n\t\tthis._clock.on(\"start\", (time, offset) => {\n\t\t\toffset = new TicksClass(this.context, offset).toSeconds();\n\t\t\tthis.emit(\"start\", time, offset);\n\t\t});\n\n\t\tthis._clock.on(\"stop\", (time) => {\n\t\t\tthis.emit(\"stop\", time);\n\t\t});\n\n\t\tthis._clock.on(\"pause\", (time) => {\n\t\t\tthis.emit(\"pause\", time);\n\t\t});\n\t}\n\n\t/**\n\t * Returns the playback state of the source, either \"started\", \"stopped\", or \"paused\"\n\t */\n\tget state(): PlaybackState {\n\t\treturn this._clock.getStateAtTime(this.now());\n\t}\n\n\t/**\n\t * Start the transport and all sources synced to the transport.\n\t * @param time The time when the transport should start.\n\t * @param offset The timeline offset to start the transport.\n\t * @example\n\t * // start the transport in one second starting at beginning of the 5th measure.\n\t * Tone.Transport.start(\"+1\", \"4:0:0\");\n\t */\n\tstart(time?: Time, offset?: TransportTime): this {\n\t\tlet offsetTicks;\n\t\tif (isDefined(offset)) {\n\t\t\toffsetTicks = this.toTicks(offset);\n\t\t}\n\t\t// start the clock\n\t\tthis._clock.start(time, offsetTicks);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Stop the transport and all sources synced to the transport.\n\t * @param time The time when the transport should stop.\n\t * @example\n\t * Tone.Transport.stop();\n\t */\n\tstop(time?: Time): this {\n\t\tthis._clock.stop(time);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Pause the transport and all sources synced to the transport.\n\t */\n\tpause(time?: Time): this {\n\t\tthis._clock.pause(time);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Toggle the current state of the transport. If it is\n\t * started, it will stop it, otherwise it will start the Transport.\n\t * @param time The time of the event\n\t */\n\ttoggle(time?: Time): this {\n\t\ttime = this.toSeconds(time);\n\t\tif (this._clock.getStateAtTime(time) !== \"started\") {\n\t\t\tthis.start(time);\n\t\t} else {\n\t\t\tthis.stop(time);\n\t\t}\n\t\treturn this;\n\t}\n\n\t//-------------------------------------\n\t// \tSETTERS/GETTERS\n\t//-------------------------------------\n\n\t/**\n\t * The time signature as just the numerator over 4.\n\t * For example 4/4 would be just 4 and 6/8 would be 3.\n\t * @example\n\t * // common time\n\t * Tone.Transport.timeSignature = 4;\n\t * // 7/8\n\t * Tone.Transport.timeSignature = [7, 8];\n\t * // this will be reduced to a single number\n\t * Tone.Transport.timeSignature; // returns 3.5\n\t */\n\tget timeSignature(): TimeSignature {\n\t\treturn this._timeSignature;\n\t}\n\tset timeSignature(timeSig: TimeSignature) {\n\t\tif (isArray(timeSig)) {\n\t\t\ttimeSig = (timeSig[0] / timeSig[1]) * 4;\n\t\t}\n\t\tthis._timeSignature = timeSig;\n\t}\n\n\t/**\n\t * When the Transport.loop = true, this is the starting position of the loop.\n\t */\n\tget loopStart(): Time {\n\t\treturn new TimeClass(this.context, this._loopStart, \"i\").toSeconds();\n\t}\n\tset loopStart(startPosition: Time) {\n\t\tthis._loopStart = this.toTicks(startPosition);\n\t}\n\n\t/**\n\t * When the Transport.loop = true, this is the ending position of the loop.\n\t */\n\tget loopEnd(): Time {\n\t\treturn new TimeClass(this.context, this._loopEnd, \"i\").toSeconds();\n\t}\n\tset loopEnd(endPosition: Time) {\n\t\tthis._loopEnd = this.toTicks(endPosition);\n\t}\n\n\t/**\n\t * If the transport loops or not.\n\t */\n\tget loop(): boolean {\n\t\treturn this._loop.get(this.now());\n\t}\n\tset loop(loop) {\n\t\tthis._loop.set(loop, this.now());\n\t}\n\n\t/**\n\t * Set the loop start and stop at the same time.\n\t * @example\n\t * // loop over the first measure\n\t * Tone.Transport.setLoopPoints(0, \"1m\");\n\t * Tone.Transport.loop = true;\n\t */\n\tsetLoopPoints(startPosition: TransportTime, endPosition: TransportTime): this {\n\t\tthis.loopStart = startPosition;\n\t\tthis.loopEnd = endPosition;\n\t\treturn this;\n\t}\n\n\t/**\n\t * The swing value. Between 0-1 where 1 equal to the note + half the subdivision.\n\t */\n\tget swing(): NormalRange {\n\t\treturn this._swingAmount;\n\t}\n\tset swing(amount: NormalRange) {\n\t\t// scale the values to a normal range\n\t\tthis._swingAmount = amount;\n\t}\n\n\t/**\n\t * Set the subdivision which the swing will be applied to.\n\t * The default value is an 8th note. Value must be less\n\t * than a quarter note.\n\t */\n\tget swingSubdivision(): Subdivision {\n\t\treturn new TicksClass(this.context, this._swingTicks).toNotation();\n\t}\n\tset swingSubdivision(subdivision: Subdivision) {\n\t\tthis._swingTicks = this.toTicks(subdivision);\n\t}\n\n\t/**\n\t * The Transport's position in Bars:Beats:Sixteenths.\n\t * Setting the value will jump to that position right away.\n\t */\n\tget position(): BarsBeatsSixteenths | Time {\n\t\tconst now = this.now();\n\t\tconst ticks = this._clock.getTicksAtTime(now);\n\t\treturn new TicksClass(this.context, ticks).toBarsBeatsSixteenths();\n\t}\n\tset position(progress: Time) {\n\t\tconst ticks = this.toTicks(progress);\n\t\tthis.ticks = ticks;\n\t}\n\n\t/**\n\t * The Transport's position in seconds\n\t * Setting the value will jump to that position right away.\n\t */\n\tget seconds(): Seconds {\n\t\treturn this._clock.seconds;\n\t}\n\tset seconds(s: Seconds) {\n\t\tconst now = this.now();\n\t\tconst ticks = this._clock.frequency.timeToTicks(s, now);\n\t\tthis.ticks = ticks;\n\t}\n\n\t/**\n\t * The Transport's loop position as a normalized value. Always\n\t * returns 0 if the transport if loop is not true.\n\t */\n\tget progress(): NormalRange {\n\t\tif (this.loop) {\n\t\t\tconst now = this.now();\n\t\t\tconst ticks = this._clock.getTicksAtTime(now);\n\t\t\treturn (ticks - this._loopStart) / (this._loopEnd - this._loopStart);\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\t/**\n\t * The transports current tick position.\n\t */\n\tget ticks(): Ticks {\n\t\treturn this._clock.ticks;\n\t}\n\tset ticks(t: Ticks) {\n\t\tif (this._clock.ticks !== t) {\n\t\t\tconst now = this.now();\n\t\t\t// stop everything synced to the transport\n\t\t\tif (this.state === \"started\") {\n\t\t\t\tconst ticks = this._clock.getTicksAtTime(now);\n\t\t\t\t// schedule to start on the next tick, #573\n\t\t\t\tconst remainingTick = this._clock.frequency.getDurationOfTicks(Math.ceil(ticks) - ticks, now);\n\t\t\t\tconst time = now + remainingTick;\n\t\t\t\tthis.emit(\"stop\", time);\n\t\t\t\tthis._clock.setTicksAtTime(t, time);\n\t\t\t\t// restart it with the new time\n\t\t\t\tthis.emit(\"start\", time, this._clock.getSecondsAtTime(time));\n\t\t\t} else {\n\t\t\t\tthis.emit(\"ticks\", now);\n\t\t\t\tthis._clock.setTicksAtTime(t, now);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get the clock's ticks at the given time.\n\t * @param time When to get the tick value\n\t * @return The tick value at the given time.\n\t */\n\tgetTicksAtTime(time?: Time): Ticks {\n\t\treturn this._clock.getTicksAtTime(time);\n\t}\n\n\t/**\n\t * Return the elapsed seconds at the given time.\n\t * @param time When to get the elapsed seconds\n\t * @return The number of elapsed seconds\n\t */\n\tgetSecondsAtTime(time: Time): Seconds {\n\t\treturn this._clock.getSecondsAtTime(time);\n\t}\n\n\t/**\n\t * Pulses Per Quarter note. This is the smallest resolution\n\t * the Transport timing supports. This should be set once\n\t * on initialization and not set again. Changing this value\n\t * after other objects have been created can cause problems.\n\t */\n\tget PPQ(): number {\n\t\treturn this._clock.frequency.multiplier;\n\t}\n\tset PPQ(ppq: number) {\n\t\tthis._clock.frequency.multiplier = ppq;\n\t}\n\n\t//-------------------------------------\n\t// \tSYNCING\n\t//-------------------------------------\n\n\t/**\n\t * Returns the time aligned to the next subdivision\n\t * of the Transport. If the Transport is not started,\n\t * it will return 0.\n\t * Note: this will not work precisely during tempo ramps.\n\t * @param subdivision The subdivision to quantize to\n\t * @return The context time of the next subdivision.\n\t * @example\n\t * // the transport must be started, otherwise returns 0\n\t * Tone.Transport.start(); \n\t * Tone.Transport.nextSubdivision(\"4n\");\n\t */\n\tnextSubdivision(subdivision?: Time): Seconds {\n\t\tsubdivision = this.toTicks(subdivision);\n\t\tif (this.state !== \"started\") {\n\t\t\t// if the transport's not started, return 0\n\t\t\treturn 0;\n\t\t} else {\n\t\t\tconst now = this.now();\n\t\t\t// the remainder of the current ticks and the subdivision\n\t\t\tconst transportPos = this.getTicksAtTime(now);\n\t\t\tconst remainingTicks = subdivision - transportPos % subdivision;\n\t\t\treturn this._clock.nextTickTime(remainingTicks, now);\n\t\t}\n\t}\n\n\t/**\n\t * Attaches the signal to the tempo control signal so that\n\t * any changes in the tempo will change the signal in the same\n\t * ratio.\n\t *\n\t * @param signal\n\t * @param ratio Optionally pass in the ratio between the two signals.\n\t * \t\t\tOtherwise it will be computed based on their current values.\n\t */\n\tsyncSignal(signal: Signal<any>, ratio?: number): this {\n\t\tif (!ratio) {\n\t\t\t// get the sync ratio\n\t\t\tconst now = this.now();\n\t\t\tif (signal.getValueAtTime(now) !== 0) {\n\t\t\t\tconst bpm = this.bpm.getValueAtTime(now);\n\t\t\t\tconst computedFreq = 1 / (60 / bpm / this.PPQ);\n\t\t\t\tratio = signal.getValueAtTime(now) / computedFreq;\n\t\t\t} else {\n\t\t\t\tratio = 0;\n\t\t\t}\n\t\t}\n\t\tconst ratioSignal = new Gain(ratio);\n\t\t// @ts-ignore\n\t\tthis.bpm.connect(ratioSignal);\n\t\t// @ts-ignore\n\t\tratioSignal.connect(signal._param);\n\t\tthis._syncedSignals.push({\n\t\t\tinitial: signal.value,\n\t\t\tratio: ratioSignal,\n\t\t\tsignal,\n\t\t});\n\t\tsignal.value = 0;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Unsyncs a previously synced signal from the transport's control.\n\t * See Transport.syncSignal.\n\t */\n\tunsyncSignal(signal: Signal<any>): this {\n\t\tfor (let i = this._syncedSignals.length - 1; i >= 0; i--) {\n\t\t\tconst syncedSignal = this._syncedSignals[i];\n\t\t\tif (syncedSignal.signal === signal) {\n\t\t\t\tsyncedSignal.ratio.dispose();\n\t\t\t\tsyncedSignal.signal.value = syncedSignal.initial;\n\t\t\t\tthis._syncedSignals.splice(i, 1);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clean up.\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._clock.dispose();\n\t\twritable(this, \"bpm\");\n\t\tthis._timeline.dispose();\n\t\tthis._repeatedEvents.dispose();\n\t\treturn this;\n\t}\n\n\t//-------------------------------------\n\t// EMITTER MIXIN TO SATISFY COMPILER\n\t//-------------------------------------\n\n\ton!: (event: TransportEventNames, callback: (...args: any[]) => void) => this;\n\tonce!: (event: TransportEventNames, callback: (...args: any[]) => void) => this;\n\toff!: (event: TransportEventNames, callback?: ((...args: any[]) => void) | undefined) => this;\n\temit!: (event: any, ...args: any[]) => this;\n}\n\nEmitter.mixin(Transport);\n\n//-------------------------------------\n// \tINITIALIZATION\n//-------------------------------------\n\nonContextInit(context => {\n\tcontext.transport = new Transport({ context });\n});\n\nonContextClose(context => {\n\tcontext.transport.dispose();\n});\n","import { Volume } from \"../component/channel/Volume\";\nimport \"../core/context/Destination\";\nimport \"../core/clock/Transport\";\nimport { Param } from \"../core/context/Param\";\nimport { OutputNode, ToneAudioNode, ToneAudioNodeOptions } from \"../core/context/ToneAudioNode\";\nimport { Decibels, Seconds, Time } from \"../core/type/Units\";\nimport { defaultArg } from \"../core/util/Defaults\";\nimport { noOp, readOnly } from \"../core/util/Interface\";\nimport { BasicPlaybackState, StateTimeline, StateTimelineEvent } from \"../core/util/StateTimeline\";\nimport { isDefined, isUndef } from \"../core/util/TypeCheck\";\nimport { assert, assertContextRunning } from \"../core/util/Debug\";\nimport { GT } from \"../core/util/Math\";\n\ntype onStopCallback = (source: Source<any>) => void;\n\nexport interface SourceOptions extends ToneAudioNodeOptions {\n\tvolume: Decibels;\n\tmute: boolean;\n\tonstop: onStopCallback;\n}\n\n/**\n * Base class for sources. \n * start/stop of this.context.transport.\n * \n * ```\n * // Multiple state change events can be chained together,\n * // but must be set in the correct order and with ascending times\n * // OK\n * state.start().stop(\"+0.2\");\n * // OK\n * state.start().stop(\"+0.2\").start(\"+0.4\").stop(\"+0.7\")\n * // BAD\n * state.stop(\"+0.2\").start();\n * // BAD\n * state.start(\"+0.3\").stop(\"+0.2\");\n * ```\n */\nexport abstract class Source<Options extends SourceOptions> extends ToneAudioNode<Options> {\n\n\t/**\n\t * The output volume node\n\t */\n\tprivate _volume: Volume;\n\n\t/**\n\t * The output note\n\t */\n\toutput: OutputNode;\n\n\t/**\n\t * Sources have no inputs\n\t */\n\tinput = undefined;\n\n\t/**\n\t * The volume of the output in decibels.\n\t * @example\n\t * const source = new Tone.PWMOscillator().toDestination();\n\t * source.volume.value = -6;\n\t */\n\tvolume: Param<\"decibels\">;\n\n\t/**\n\t * The callback to invoke when the source is stopped.\n\t */\n\tonstop: onStopCallback;\n\n\t/**\n\t * Keep track of the scheduled state.\n\t */\n\tprotected _state: StateTimeline<{\n\t\tduration?: Seconds;\n\t\toffset?: Seconds;\n\t\t/**\n\t\t * Either the buffer is explicitly scheduled to end using the stop method,\n\t\t * or it's implicitly ended when the buffer is over.\n\t\t */\n\t\timplicitEnd?: boolean;\n\t}> = new StateTimeline(\"stopped\");\n\n\t/**\n\t * The synced `start` callback function from the transport\n\t */\n\tprotected _synced = false;\n\n\t/**\n\t * Keep track of all of the scheduled event ids\n\t */\n\tprivate _scheduled: number[] = [];\n\n\t/**\n\t * Placeholder functions for syncing/unsyncing to transport\n\t */\n\tprivate _syncedStart: (time: Seconds, offset: Seconds) => void = noOp;\n\tprivate _syncedStop: (time: Seconds) => void = noOp;\n\n\tconstructor(options: SourceOptions) {\n\t\tsuper(options);\n\t\tthis._state.memory = 100;\n\t\tthis._state.increasing = true;\n\n\t\tthis._volume = this.output = new Volume({\n\t\t\tcontext: this.context,\n\t\t\tmute: options.mute,\n\t\t\tvolume: options.volume,\n\t\t});\n\t\tthis.volume = this._volume.volume;\n\t\treadOnly(this, \"volume\");\n\t\tthis.onstop = options.onstop;\n\t}\n\n\tstatic getDefaults(): SourceOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tmute: false,\n\t\t\tonstop: noOp,\n\t\t\tvolume: 0,\n\t\t});\n\t}\n\n\t/**\n\t * Returns the playback state of the source, either \"started\" or \"stopped\".\n\t * @example\n\t * const player = new Tone.Player(\"https://tonejs.github.io/audio/berklee/ahntone_c3.mp3\", () => {\n\t * \tplayer.start();\n\t * \tconsole.log(player.state);\n\t * }).toDestination();\n\t */\n\tget state(): BasicPlaybackState {\n\t\tif (this._synced) {\n\t\t\tif (this.context.transport.state === \"started\") {\n\t\t\t\treturn this._state.getValueAtTime(this.context.transport.seconds) as BasicPlaybackState;\n\t\t\t} else {\n\t\t\t\treturn \"stopped\";\n\t\t\t}\n\t\t} else {\n\t\t\treturn this._state.getValueAtTime(this.now()) as BasicPlaybackState;\n\t\t}\n\t}\n\n\t/**\n\t * Mute the output.\n\t * @example\n\t * const osc = new Tone.Oscillator().toDestination().start();\n\t * // mute the output\n\t * osc.mute = true;\n\t */\n\tget mute(): boolean {\n\t\treturn this._volume.mute;\n\t}\n\tset mute(mute: boolean) {\n\t\tthis._volume.mute = mute;\n\t}\n\n\t// overwrite these functions\n\tprotected abstract _start(time: Time, offset?: Time, duration?: Time): void;\n\tprotected abstract _stop(time: Time): void;\n\tprotected abstract _restart(time: Seconds, offset?: Time, duration?: Time): void;\n\n\t/**\n\t * Ensure that the scheduled time is not before the current time.\n\t * Should only be used when scheduled unsynced.\n\t */\n\tprivate _clampToCurrentTime(time: Seconds): Seconds {\n\t\tif (this._synced) {\n\t\t\treturn time;\n\t\t} else {\n\t\t\treturn Math.max(time, this.context.currentTime);\n\t\t}\n\t}\n\n\t/**\n\t * Start the source at the specified time. If no time is given,\n\t * start the source now.\n\t * @param time When the source should be started.\n\t * @example\n\t * const source = new Tone.Oscillator().toDestination();\n\t * source.start(\"+0.5\"); // starts the source 0.5 seconds from now\n\t */\n\tstart(time?: Time, offset?: Time, duration?: Time): this {\n\t\tlet computedTime = isUndef(time) && this._synced ? this.context.transport.seconds : this.toSeconds(time);\n\t\tcomputedTime = this._clampToCurrentTime(computedTime);\n\t\t// if it's started, stop it and restart it\n\t\tif (!this._synced && this._state.getValueAtTime(computedTime) === \"started\") {\n\t\t\t// time should be strictly greater than the previous start time\n\t\t\tassert(GT(computedTime, (this._state.get(computedTime) as StateTimelineEvent).time), \"Start time must be strictly greater than previous start time\");\n\t\t\tthis._state.cancel(computedTime);\n\t\t\tthis._state.setStateAtTime(\"started\", computedTime);\n\t\t\tthis.log(\"restart\", computedTime);\n\t\t\tthis.restart(computedTime, offset, duration);\n\t\t} else {\n\t\t\tthis.log(\"start\", computedTime);\n\t\t\tthis._state.setStateAtTime(\"started\", computedTime);\n\t\t\tif (this._synced) {\n\t\t\t\t// add the offset time to the event\n\t\t\t\tconst event = this._state.get(computedTime);\n\t\t\t\tif (event) {\n\t\t\t\t\tevent.offset = this.toSeconds(defaultArg(offset, 0));\n\t\t\t\t\tevent.duration = duration ? this.toSeconds(duration) : undefined;\n\t\t\t\t}\n\t\t\t\tconst sched = this.context.transport.schedule(t => {\n\t\t\t\t\tthis._start(t, offset, duration);\n\t\t\t\t}, computedTime);\n\t\t\t\tthis._scheduled.push(sched);\n\n\t\t\t\t// if the transport is already started\n\t\t\t\t// and the time is greater than where the transport is\n\t\t\t\tif (this.context.transport.state === \"started\" && \n\t\t\t\t\tthis.context.transport.getSecondsAtTime(this.immediate()) > computedTime) {\n\t\t\t\t\tthis._syncedStart(this.now(), this.context.transport.seconds);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tassertContextRunning(this.context);\n\t\t\t\tthis._start(computedTime, offset, duration);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Stop the source at the specified time. If no time is given,\n\t * stop the source now.\n\t * @param time When the source should be stopped.\n\t * @example\n\t * const source = new Tone.Oscillator().toDestination();\n\t * source.start();\n\t * source.stop(\"+0.5\"); // stops the source 0.5 seconds from now\n\t */\n\tstop(time?: Time): this {\n\t\tlet computedTime = isUndef(time) && this._synced ? this.context.transport.seconds : this.toSeconds(time);\n\t\tcomputedTime = this._clampToCurrentTime(computedTime);\n\t\tif (this._state.getValueAtTime(computedTime) === \"started\" || isDefined(this._state.getNextState(\"started\", computedTime))) {\n\t\t\tthis.log(\"stop\", computedTime);\n\t\t\tif (!this._synced) {\n\t\t\t\tthis._stop(computedTime);\n\t\t\t} else {\n\t\t\t\tconst sched = this.context.transport.schedule(this._stop.bind(this), computedTime);\n\t\t\t\tthis._scheduled.push(sched);\n\t\t\t}\n\t\t\tthis._state.cancel(computedTime);\n\t\t\tthis._state.setStateAtTime(\"stopped\", computedTime);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Restart the source.\n\t */\n\trestart(time?: Time, offset?: Time, duration?: Time): this {\n\t\ttime = this.toSeconds(time);\n\t\tif (this._state.getValueAtTime(time) === \"started\") {\n\t\t\tthis._state.cancel(time);\n\t\t\tthis._restart(time, offset, duration);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sync the source to the Transport so that all subsequent\n\t * calls to `start` and `stop` are synced to the TransportTime\n\t * instead of the AudioContext time.\n\t *\n\t * @example\n\t * const osc = new Tone.Oscillator().toDestination();\n\t * // sync the source so that it plays between 0 and 0.3 on the Transport's timeline\n\t * osc.sync().start(0).stop(0.3);\n\t * // start the transport.\n\t * Tone.Transport.start();\n\t * // set it to loop once a second\n\t * Tone.Transport.loop = true;\n\t * Tone.Transport.loopEnd = 1;\n\t */\n\tsync(): this {\n\t\tif (!this._synced) {\n\t\t\tthis._synced = true;\n\t\t\tthis._syncedStart = (time, offset) => {\n\t\t\t\tif (offset > 0) {\n\t\t\t\t\t// get the playback state at that time\n\t\t\t\t\tconst stateEvent = this._state.get(offset);\n\t\t\t\t\t// listen for start events which may occur in the middle of the sync'ed time\n\t\t\t\t\tif (stateEvent && stateEvent.state === \"started\" && stateEvent.time !== offset) {\n\t\t\t\t\t\t// get the offset\n\t\t\t\t\t\tconst startOffset = offset - this.toSeconds(stateEvent.time);\n\t\t\t\t\t\tlet duration: number | undefined;\n\t\t\t\t\t\tif (stateEvent.duration) {\n\t\t\t\t\t\t\tduration = this.toSeconds(stateEvent.duration) - startOffset;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis._start(time, this.toSeconds(stateEvent.offset) + startOffset, duration);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\tthis._syncedStop = time => {\n\t\t\t\tconst seconds = this.context.transport.getSecondsAtTime(Math.max(time - this.sampleTime, 0));\n\t\t\t\tif (this._state.getValueAtTime(seconds) === \"started\") {\n\t\t\t\t\tthis._stop(time);\n\t\t\t\t}\n\t\t\t};\n\t\t\tthis.context.transport.on(\"start\", this._syncedStart);\n\t\t\tthis.context.transport.on(\"loopStart\", this._syncedStart);\n\t\t\tthis.context.transport.on(\"stop\", this._syncedStop);\n\t\t\tthis.context.transport.on(\"pause\", this._syncedStop);\n\t\t\tthis.context.transport.on(\"loopEnd\", this._syncedStop);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Unsync the source to the Transport. See Source.sync\n\t */\n\tunsync(): this {\n\t\tif (this._synced) {\n\t\t\tthis.context.transport.off(\"stop\", this._syncedStop);\n\t\t\tthis.context.transport.off(\"pause\", this._syncedStop);\n\t\t\tthis.context.transport.off(\"loopEnd\", this._syncedStop);\n\t\t\tthis.context.transport.off(\"start\", this._syncedStart);\n\t\t\tthis.context.transport.off(\"loopStart\", this._syncedStart);\n\t\t}\n\t\tthis._synced = false;\n\t\t// clear all of the scheduled ids\n\t\tthis._scheduled.forEach(id => this.context.transport.clear(id));\n\t\tthis._scheduled = [];\n\t\tthis._state.cancel(0);\n\t\t// stop it also\n\t\tthis._stop(0);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clean up.\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.onstop = noOp;\n\t\tthis.unsync();\n\t\tthis._volume.dispose();\n\t\tthis._state.dispose();\n\t\treturn this;\n\t}\n}\n","import { connect } from \"../../core/context/ToneAudioNode\";\nimport { Param } from \"../../core/context/Param\";\nimport { ToneAudioBuffer } from \"../../core/context/ToneAudioBuffer\";\nimport { GainFactor, Positive, Seconds, Time } from \"../../core/type/Units\";\nimport { defaultArg, optionsFromArguments } from \"../../core/util/Defaults\";\nimport { noOp } from \"../../core/util/Interface\";\nimport { isDefined } from \"../../core/util/TypeCheck\";\nimport { assert } from \"../../core/util/Debug\";\nimport { OneShotSource, OneShotSourceCurve, OneShotSourceOptions } from \"../OneShotSource\";\nimport { EQ, GTE, LT } from \"../../core/util/Math\";\n\nexport type ToneBufferSourceCurve = OneShotSourceCurve;\n\nexport interface ToneBufferSourceOptions extends OneShotSourceOptions {\n\turl: string | AudioBuffer | ToneAudioBuffer;\n\tcurve: ToneBufferSourceCurve;\n\tplaybackRate: Positive;\n\tfadeIn: Time;\n\tfadeOut: Time;\n\tloopStart: Time;\n\tloopEnd: Time;\n\tloop: boolean;\n\tonload: () => void;\n\tonerror: (error: Error) => void;\n}\n\n/**\n * Wrapper around the native BufferSourceNode.\n * @category Source\n */\nexport class ToneBufferSource extends OneShotSource<ToneBufferSourceOptions> {\n\n\treadonly name: string = \"ToneBufferSource\";\n\n\t/**\n\t * The oscillator\n\t */\n\tprivate _source = this.context.createBufferSource();\n\tprotected _internalChannels = [this._source];\n\n\t/**\n\t * The frequency of the oscillator\n\t */\n\treadonly playbackRate: Param<\"positive\">;\n\n\t/**\n\t * The private instance of the buffer object\n\t */\n\tprivate _buffer: ToneAudioBuffer;\n\n\t/**\n\t * indicators if the source has started/stopped\n\t */\n\tprivate _sourceStarted = false;\n\tprivate _sourceStopped = false;\n\n\t/**\n\t * @param url The buffer to play or url to load\n\t * @param onload The callback to invoke when the buffer is done playing.\n\t */\n\tconstructor(url?: ToneAudioBuffer | AudioBuffer | string, onload?: () => void);\n\tconstructor(options?: Partial<ToneBufferSourceOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(ToneBufferSource.getDefaults(), arguments, [\"url\", \"onload\"]));\n\t\tconst options = optionsFromArguments(ToneBufferSource.getDefaults(), arguments, [\"url\", \"onload\"]);\n\n\t\tconnect(this._source, this._gainNode);\n\t\tthis._source.onended = () => this._stopSource();\n\n\t\t/**\n\t\t * The playbackRate of the buffer\n\t\t */\n\t\tthis.playbackRate = new Param({\n\t\t\tcontext: this.context,\n\t\t\tparam: this._source.playbackRate,\n\t\t\tunits: \"positive\",\n\t\t\tvalue: options.playbackRate,\n\t\t});\n\n\t\t// set some values initially\n\t\tthis.loop = options.loop;\n\t\tthis.loopStart = options.loopStart;\n\t\tthis.loopEnd = options.loopEnd;\n\t\tthis._buffer = new ToneAudioBuffer(options.url, options.onload, options.onerror);\n\n\t\tthis._internalChannels.push(this._source);\n\t}\n\n\tstatic getDefaults(): ToneBufferSourceOptions {\n\t\treturn Object.assign(OneShotSource.getDefaults(), {\n\t\t\turl: new ToneAudioBuffer(),\n\t\t\tloop: false,\n\t\t\tloopEnd: 0,\n\t\t\tloopStart: 0,\n\t\t\tonload: noOp,\n\t\t\tonerror: noOp,\n\t\t\tplaybackRate: 1,\n\t\t});\n\t}\n\n\t/**\n\t * The fadeIn time of the amplitude envelope.\n\t */\n\tget fadeIn(): Time {\n\t\treturn this._fadeIn;\n\t}\n\tset fadeIn(t: Time) {\n\t\tthis._fadeIn = t;\n\t}\n\n\t/**\n\t * The fadeOut time of the amplitude envelope.\n\t */\n\tget fadeOut(): Time {\n\t\treturn this._fadeOut;\n\t}\n\tset fadeOut(t: Time) {\n\t\tthis._fadeOut = t;\n\t}\n\n\t/**\n\t * The curve applied to the fades, either \"linear\" or \"exponential\"\n\t */\n\tget curve(): ToneBufferSourceCurve {\n\t\treturn this._curve;\n\t}\n\tset curve(t) {\n\t\tthis._curve = t;\n\t}\n\n\t/**\n\t * Start the buffer\n\t * @param time When the player should start.\n\t * @param offset The offset from the beginning of the sample to start at.\n\t * @param duration How long the sample should play. If no duration is given, it will default to the full length of the sample (minus any offset)\n\t * @param gain The gain to play the buffer back at.\n\t */\n\tstart(time?: Time, offset?: Time, duration?: Time, gain: GainFactor = 1): this {\n\t\tassert(this.buffer.loaded, \"buffer is either not set or not loaded\");\n\t\tconst computedTime = this.toSeconds(time);\n\n\t\t// apply the gain envelope\n\t\tthis._startGain(computedTime, gain);\n\n\t\t// if it's a loop the default offset is the loopstart point\n\t\tif (this.loop) {\n\t\t\toffset = defaultArg(offset, this.loopStart);\n\t\t} else {\n\t\t\t// otherwise the default offset is 0\n\t\t\toffset = defaultArg(offset, 0);\n\t\t}\n\t\t// make sure the offset is not less than 0\n\t\tlet computedOffset = Math.max(this.toSeconds(offset), 0);\n\n\t\t// start the buffer source\n\t\tif (this.loop) {\n\t\t\t// modify the offset if it's greater than the loop time\n\t\t\tconst loopEnd = this.toSeconds(this.loopEnd) || this.buffer.duration;\n\t\t\tconst loopStart = this.toSeconds(this.loopStart);\n\t\t\tconst loopDuration = loopEnd - loopStart;\n\t\t\t// move the offset back\n\t\t\tif (GTE(computedOffset, loopEnd)) {\n\t\t\t\tcomputedOffset = ((computedOffset - loopStart) % loopDuration) + loopStart;\n\t\t\t}\n\t\t\t// when the offset is very close to the duration, set it to 0\n\t\t\tif (EQ(computedOffset, this.buffer.duration)) {\n\t\t\t\tcomputedOffset = 0;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// this.buffer.loaded would have return false if the AudioBuffer was undefined\n\t\tthis._source.buffer = this.buffer.get() as AudioBuffer;\n\t\tthis._source.loopEnd = this.toSeconds(this.loopEnd) || this.buffer.duration;\n\t\tif (LT(computedOffset, this.buffer.duration)) {\n\t\t\tthis._sourceStarted = true;\n\t\t\tthis._source.start(computedTime, computedOffset);\n\t\t}\n\n\t\t// if a duration is given, schedule a stop\n\t\tif (isDefined(duration)) {\n\t\t\tlet computedDur = this.toSeconds(duration);\n\t\t\t// make sure it's never negative\n\t\t\tcomputedDur = Math.max(computedDur, 0);\n\t\t\tthis.stop(computedTime + computedDur);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tprotected _stopSource(time?: Seconds): void {\n\t\tif (!this._sourceStopped && this._sourceStarted) {\n\t\t\tthis._sourceStopped = true;\n\t\t\tthis._source.stop(this.toSeconds(time));\n\t\t\tthis._onended();\n\t\t}\n\t}\n\n\t/**\n\t * If loop is true, the loop will start at this position.\n\t */\n\tget loopStart(): Time {\n\t\treturn this._source.loopStart;\n\t}\n\tset loopStart(loopStart: Time) {\n\t\tthis._source.loopStart = this.toSeconds(loopStart);\n\t}\n\n\t/**\n\t * If loop is true, the loop will end at this position.\n\t */\n\tget loopEnd(): Time {\n\t\treturn this._source.loopEnd;\n\t}\n\tset loopEnd(loopEnd: Time) {\n\t\tthis._source.loopEnd = this.toSeconds(loopEnd);\n\t}\n\n\t/**\n\t * The audio buffer belonging to the player.\n\t */\n\tget buffer(): ToneAudioBuffer {\n\t\treturn this._buffer;\n\t}\n\tset buffer(buffer: ToneAudioBuffer) {\n\t\tthis._buffer.set(buffer);\n\t}\n\n\t/**\n\t * If the buffer should loop once it's over.\n\t */\n\tget loop(): boolean {\n\t\treturn this._source.loop;\n\t}\n\tset loop(loop: boolean) {\n\t\tthis._source.loop = loop;\n\t\tif (this._sourceStarted) {\n\t\t\tthis.cancelStop();\n\t\t}\n\t}\n\n\t/**\n\t * Clean up.\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._source.onended = null;\n\t\tthis._source.disconnect();\n\t\tthis._buffer.dispose();\n\t\tthis.playbackRate.dispose();\n\t\treturn this;\n\t}\n}\n","import { ToneAudioBuffer } from \"../core/context/ToneAudioBuffer\";\nimport { Positive, Time } from \"../core/type/Units\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { assert } from \"../core/util/Debug\";\nimport { Source, SourceOptions } from \"../source/Source\";\nimport { ToneBufferSource } from \"./buffer/ToneBufferSource\";\n\nexport type NoiseType = \"white\" | \"brown\" | \"pink\";\n\nexport interface NoiseOptions extends SourceOptions {\n\ttype: NoiseType;\n\tplaybackRate: Positive;\n\tfadeIn: Time;\n\tfadeOut: Time;\n}\n\n/**\n * Noise is a noise generator. It uses looped noise buffers to save on performance.\n * Noise supports the noise types: \"pink\", \"white\", and \"brown\". Read more about\n * colors of noise on [Wikipedia](https://en.wikipedia.org/wiki/Colors_of_noise).\n *\n * @example\n * // initialize the noise and start\n * const noise = new Tone.Noise(\"pink\").start();\n * // make an autofilter to shape the noise\n * const autoFilter = new Tone.AutoFilter({\n * \tfrequency: \"8n\",\n * \tbaseFrequency: 200,\n * \toctaves: 8\n * }).toDestination().start();\n * // connect the noise\n * noise.connect(autoFilter);\n * // start the autofilter LFO\n * autoFilter.start();\n * @category Source\n */\nexport class Noise extends Source<NoiseOptions> {\n\n\treadonly name: string = \"Noise\";\n\n\t/**\n\t * Private reference to the source\n\t */\n\tprivate _source: ToneBufferSource | null = null;\n\n\t/**\n\t * private reference to the type\n\t */\n\tprivate _type!: NoiseType;\n\n\t/**\n\t * The playback rate of the noise. Affects\n\t * the \"frequency\" of the noise.\n\t */\n\tprivate _playbackRate: Positive;\n\n\t/**\n\t * The fadeIn time of the amplitude envelope.\n\t */\n\tprotected _fadeIn: Time;\n\n\t/**\n\t * The fadeOut time of the amplitude envelope.\n\t */\n\tprotected _fadeOut: Time;\n\n\t/**\n\t * @param type the noise type (white|pink|brown)\n\t */\n\tconstructor(type?: NoiseType);\n\tconstructor(options?: Partial<NoiseOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(Noise.getDefaults(), arguments, [\"type\"]));\n\t\tconst options = optionsFromArguments(Noise.getDefaults(), arguments, [\"type\"]);\n\n\t\tthis._playbackRate = options.playbackRate;\n\t\tthis.type = options.type;\n\t\tthis._fadeIn = options.fadeIn;\n\t\tthis._fadeOut = options.fadeOut;\n\t}\n\n\tstatic getDefaults(): NoiseOptions {\n\t\treturn Object.assign(Source.getDefaults(), {\n\t\t\tfadeIn: 0,\n\t\t\tfadeOut: 0,\n\t\t\tplaybackRate: 1,\n\t\t\ttype: \"white\" as NoiseType,\n\t\t});\n\t}\n\n\t/**\n\t * The type of the noise. Can be \"white\", \"brown\", or \"pink\".\n\t * @example\n\t * const noise = new Tone.Noise().toDestination().start();\n\t * noise.type = \"brown\";\n\t */\n\tget type(): NoiseType {\n\t\treturn this._type;\n\t}\n\tset type(type: NoiseType) {\n\t\tassert(type in _noiseBuffers, \"Noise: invalid type: \" + type);\n\t\tif (this._type !== type) {\n\t\t\tthis._type = type;\n\t\t\t// if it's playing, stop and restart it\n\t\t\tif (this.state === \"started\") {\n\t\t\t\tconst now = this.now();\n\t\t\t\tthis._stop(now);\n\t\t\t\tthis._start(now);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * The playback rate of the noise. Affects\n\t * the \"frequency\" of the noise.\n\t */\n\tget playbackRate(): Positive {\n\t\treturn this._playbackRate;\n\t}\n\tset playbackRate(rate: Positive) {\n\t\tthis._playbackRate = rate;\n\t\tif (this._source) {\n\t\t\tthis._source.playbackRate.value = rate;\n\t\t}\n\t}\n\n\t/**\n\t * internal start method\n\t */\n\tprotected _start(time?: Time): void {\n\t\tconst buffer = _noiseBuffers[this._type];\n\t\tthis._source = new ToneBufferSource({\n\t\t\turl: buffer,\n\t\t\tcontext: this.context,\n\t\t\tfadeIn: this._fadeIn,\n\t\t\tfadeOut: this._fadeOut,\n\t\t\tloop: true,\n\t\t\tonended: () => this.onstop(this),\n\t\t\tplaybackRate: this._playbackRate,\n\t\t}).connect(this.output);\n\t\tthis._source.start(this.toSeconds(time), Math.random() * (buffer.duration - 0.001));\n\t}\n\n\t/**\n\t * internal stop method\n\t */\n\tprotected _stop(time?: Time): void {\n\t\tif (this._source) {\n\t\t\tthis._source.stop(this.toSeconds(time));\n\t\t\tthis._source = null;\n\t\t}\n\t}\n\n\t/**\n\t * The fadeIn time of the amplitude envelope.\n\t */\n\tget fadeIn(): Time {\n\t\treturn this._fadeIn;\n\t}\n\tset fadeIn(time) {\n\t\tthis._fadeIn = time;\n\t\tif (this._source) {\n\t\t\tthis._source.fadeIn = this._fadeIn;\n\t\t}\n\t}\n\n\t/**\n\t * The fadeOut time of the amplitude envelope.\n\t */\n\tget fadeOut(): Time {\n\t\treturn this._fadeOut;\n\t}\n\tset fadeOut(time) {\n\t\tthis._fadeOut = time;\n\t\tif (this._source) {\n\t\t\tthis._source.fadeOut = this._fadeOut;\n\t\t}\n\t}\n\n\tprotected _restart(time?: Time): void {\n\t\t// TODO could be optimized by cancelling the buffer source 'stop'\n\t\tthis._stop(time);\n\t\tthis._start(time);\n\t}\n\n\t/**\n\t * Clean up.\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tif (this._source) {\n\t\t\tthis._source.disconnect();\n\t\t}\n\t\treturn this;\n\t}\n}\n\n//--------------------\n// THE NOISE BUFFERS\n//--------------------\n\n// Noise buffer stats\nconst BUFFER_LENGTH = 44100 * 5;\nconst NUM_CHANNELS = 2;\n\n/**\n * The cached noise buffers\n */\ninterface NoiseCache {\n\t[key: string]: ToneAudioBuffer | null;\n}\n\n/**\n * Cache the noise buffers\n */\nconst _noiseCache: NoiseCache = {\n\tbrown: null,\n\tpink: null,\n\twhite: null,\n};\n\n/**\n * The noise arrays. Generated on initialization.\n * borrowed heavily from https://github.com/zacharydenton/noise.js\n * (c) 2013 Zach Denton (MIT)\n */\nconst _noiseBuffers = {\n\tget brown(): ToneAudioBuffer {\n\t\tif (!_noiseCache.brown) {\n\t\t\tconst buffer: Float32Array[] = [];\n\t\t\tfor (let channelNum = 0; channelNum < NUM_CHANNELS; channelNum++) {\n\t\t\t\tconst channel = new Float32Array(BUFFER_LENGTH);\n\t\t\t\tbuffer[channelNum] = channel;\n\t\t\t\tlet lastOut = 0.0;\n\t\t\t\tfor (let i = 0; i < BUFFER_LENGTH; i++) {\n\t\t\t\t\tconst white = Math.random() * 2 - 1;\n\t\t\t\t\tchannel[i] = (lastOut + (0.02 * white)) / 1.02;\n\t\t\t\t\tlastOut = channel[i];\n\t\t\t\t\tchannel[i] *= 3.5; // (roughly) compensate for gain\n\t\t\t\t}\n\t\t\t}\n\t\t\t_noiseCache.brown = new ToneAudioBuffer().fromArray(buffer);\n\t\t}\n\t\treturn _noiseCache.brown;\n\t},\n\n\tget pink(): ToneAudioBuffer {\n\t\tif (!_noiseCache.pink) {\n\t\t\tconst buffer: Float32Array[] = [];\n\t\t\tfor (let channelNum = 0; channelNum < NUM_CHANNELS; channelNum++) {\n\t\t\t\tconst channel = new Float32Array(BUFFER_LENGTH);\n\t\t\t\tbuffer[channelNum] = channel;\n\t\t\t\tlet b0, b1, b2, b3, b4, b5, b6;\n\t\t\t\tb0 = b1 = b2 = b3 = b4 = b5 = b6 = 0.0;\n\t\t\t\tfor (let i = 0; i < BUFFER_LENGTH; i++) {\n\t\t\t\t\tconst white = Math.random() * 2 - 1;\n\t\t\t\t\tb0 = 0.99886 * b0 + white * 0.0555179;\n\t\t\t\t\tb1 = 0.99332 * b1 + white * 0.0750759;\n\t\t\t\t\tb2 = 0.96900 * b2 + white * 0.1538520;\n\t\t\t\t\tb3 = 0.86650 * b3 + white * 0.3104856;\n\t\t\t\t\tb4 = 0.55000 * b4 + white * 0.5329522;\n\t\t\t\t\tb5 = -0.7616 * b5 - white * 0.0168980;\n\t\t\t\t\tchannel[i] = b0 + b1 + b2 + b3 + b4 + b5 + b6 + white * 0.5362;\n\t\t\t\t\tchannel[i] *= 0.11; // (roughly) compensate for gain\n\t\t\t\t\tb6 = white * 0.115926;\n\t\t\t\t}\n\t\t\t}\n\t\t\t_noiseCache.pink = new ToneAudioBuffer().fromArray(buffer);\n\t\t}\n\t\treturn _noiseCache.pink;\n\t},\n\n\tget white(): ToneAudioBuffer {\n\t\tif (!_noiseCache.white) {\n\t\t\tconst buffer: Float32Array[] = [];\n\t\t\tfor (let channelNum = 0; channelNum < NUM_CHANNELS; channelNum++) {\n\t\t\t\tconst channel = new Float32Array(BUFFER_LENGTH);\n\t\t\t\tbuffer[channelNum] = channel;\n\t\t\t\tfor (let i = 0; i < BUFFER_LENGTH; i++) {\n\t\t\t\t\tchannel[i] = Math.random() * 2 - 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t_noiseCache.white = new ToneAudioBuffer().fromArray(buffer);\n\t\t}\n\t\treturn _noiseCache.white;\n\t},\n};\n","import { connect, OutputNode, ToneAudioNode, ToneAudioNodeOptions } from \"../core/context/ToneAudioNode\";\nimport { Decibels } from \"../core/type/Units\";\nimport { Volume } from \"../component/channel/Volume\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { assert } from \"../core/util/Debug\";\nimport { Param } from \"../core/context/Param\";\nimport { readOnly } from \"../core/util/Interface\";\nimport { isDefined, isNumber } from \"../core/util/TypeCheck\";\n\nexport interface UserMediaOptions extends ToneAudioNodeOptions {\n\tvolume: Decibels;\n\tmute: boolean;\n}\n/**\n * UserMedia uses MediaDevices.getUserMedia to open up and external microphone or audio input. \n * Check [MediaDevices API Support](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)\n * to see which browsers are supported. Access to an external input\n * is limited to secure (HTTPS) connections.\n * @example\n * const meter = new Tone.Meter();\n * const mic = new Tone.UserMedia().connect(meter);\n * mic.open().then(() => {\n * \t// promise resolves when input is available\n * \tconsole.log(\"mic open\");\n * \t// print the incoming mic levels in decibels\n * \tsetInterval(() => console.log(meter.getValue()), 100);\n * }).catch(e => {\n * \t// promise is rejected when the user doesn't have or allow mic access\n * \tconsole.log(\"mic not open\");\n * });\n * @category Source\n */\n\nexport class UserMedia extends ToneAudioNode<UserMediaOptions> {\n\n\treadonly name: string = \"UserMedia\";\n\n\treadonly input: undefined;\n\treadonly output: OutputNode;\n\n\t/**\n\t * The MediaStreamNode\n\t */\n\tprivate _mediaStream?: MediaStreamAudioSourceNode;\n\n\t/**\n\t * The media stream created by getUserMedia.\n\t */\n\tprivate _stream?: MediaStream;\n\n\t/**\n\t * The open device\n\t */\n\tprivate _device?: MediaDeviceInfo;\n\n\t/**\n\t * The output volume node\n\t */\n\tprivate _volume: Volume;\n\n\t/**\n\t * The volume of the output in decibels.\n\t */\n\treadonly volume: Param<\"decibels\">;\n\n\t/**\n\t * @param volume The level of the input in decibels\n\t */\n\tconstructor(volume?: Decibels);\n\tconstructor(options?: Partial<UserMediaOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(UserMedia.getDefaults(), arguments, [\"volume\"]));\n\t\tconst options = optionsFromArguments(UserMedia.getDefaults(), arguments, [\"volume\"]);\n\n\t\tthis._volume = this.output = new Volume({\n\t\t\tcontext: this.context,\n\t\t\tvolume: options.volume,\n\t\t});\n\t\tthis.volume = this._volume.volume;\n\t\treadOnly(this, \"volume\");\n\t\tthis.mute = options.mute;\n\t}\n\n\tstatic getDefaults(): UserMediaOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tmute: false,\n\t\t\tvolume: 0\n\t\t});\n\t}\n\n\t/**\n\t * Open the media stream. If a string is passed in, it is assumed\n\t * to be the label or id of the stream, if a number is passed in,\n\t * it is the input number of the stream.\n\t * @param labelOrId The label or id of the audio input media device.\n\t * With no argument, the default stream is opened.\n\t * @return The promise is resolved when the stream is open.\n\t */\n\tasync open(labelOrId?: string | number): Promise<this> {\n\t\tassert(UserMedia.supported, \"UserMedia is not supported\");\n\t\t// close the previous stream\n\t\tif (this.state === \"started\") {\n\t\t\tthis.close();\n\t\t}\n\t\tconst devices = await UserMedia.enumerateDevices();\n\t\tif (isNumber(labelOrId)) {\n\t\t\tthis._device = devices[labelOrId];\n\t\t} else {\n\t\t\tthis._device = devices.find((device) => {\n\t\t\t\treturn device.label === labelOrId || device.deviceId === labelOrId;\n\t\t\t});\n\t\t\t// didn't find a matching device\n\t\t\tif (!this._device && devices.length > 0) {\n\t\t\t\tthis._device = devices[0];\n\t\t\t}\n\t\t\tassert(isDefined(this._device), `No matching device ${labelOrId}`);\n\t\t}\n\t\t// do getUserMedia\n\t\tconst constraints = {\n\t\t\taudio: {\n\t\t\t\techoCancellation: false,\n\t\t\t\tsampleRate: this.context.sampleRate,\n\t\t\t\tnoiseSuppression: false,\n\t\t\t\tmozNoiseSuppression: false,\n\t\t\t}\n\t\t};\n\t\tif (this._device) {\n\t\t\t// @ts-ignore\n\t\t\tconstraints.audio.deviceId = this._device.deviceId;\n\t\t}\n\t\tconst stream = await navigator.mediaDevices.getUserMedia(constraints);\n\t\t// start a new source only if the previous one is closed\n\t\tif (!this._stream) {\n\t\t\tthis._stream = stream;\n\t\t\t// Wrap a MediaStreamSourceNode around the live input stream.\n\t\t\tconst mediaStreamNode = this.context.createMediaStreamSource(stream);\n\t\t\t// Connect the MediaStreamSourceNode to a gate gain node\n\t\t\tconnect(mediaStreamNode, this.output);\n\t\t\tthis._mediaStream = mediaStreamNode;\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Close the media stream\n\t */\n\tclose(): this {\n\t\tif (this._stream && this._mediaStream) {\n\t\t\tthis._stream.getAudioTracks().forEach((track) => {\n\t\t\t\ttrack.stop();\n\t\t\t});\n\t\t\tthis._stream = undefined;\n\t\t\t// remove the old media stream\n\t\t\tthis._mediaStream.disconnect();\n\t\t\tthis._mediaStream = undefined;\n\t\t}\n\t\tthis._device = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns a promise which resolves with the list of audio input devices available.\n\t * @return The promise that is resolved with the devices\n\t * @example\n\t * Tone.UserMedia.enumerateDevices().then((devices) => {\n\t * \t// print the device labels\n\t * \tconsole.log(devices.map(device => device.label));\n\t * });\n\t */\n\tstatic async enumerateDevices(): Promise<MediaDeviceInfo[]> {\n\t\tconst allDevices = await navigator.mediaDevices.enumerateDevices();\n\t\treturn allDevices.filter(device => {\n\t\t\treturn device.kind === \"audioinput\";\n\t\t});\n\t}\n\n\t/**\n\t * Returns the playback state of the source, \"started\" when the microphone is open\n\t * and \"stopped\" when the mic is closed.\n\t */\n\tget state() {\n\t\treturn this._stream && this._stream.active ? \"started\" : \"stopped\";\n\t}\n\n\t/**\n\t * Returns an identifier for the represented device that is\n\t * persisted across sessions. It is un-guessable by other applications and\n\t * unique to the origin of the calling application. It is reset when the\n\t * user clears cookies (for Private Browsing, a different identifier is\n\t * used that is not persisted across sessions). Returns undefined when the\n\t * device is not open.\n\t */\n\tget deviceId(): string | undefined {\n\t\tif (this._device) {\n\t\t\treturn this._device.deviceId;\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Returns a group identifier. Two devices have the\n\t * same group identifier if they belong to the same physical device.\n\t * Returns null when the device is not open.\n\t */\n\tget groupId(): string | undefined {\n\t\tif (this._device) {\n\t\t\treturn this._device.groupId;\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Returns a label describing this device (for example \"Built-in Microphone\").\n\t * Returns undefined when the device is not open or label is not available\n\t * because of permissions.\n\t */\n\tget label(): string | undefined {\n\t\tif (this._device) {\n\t\t\treturn this._device.label;\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Mute the output.\n\t * @example\n\t * const mic = new Tone.UserMedia();\n\t * mic.open().then(() => {\n\t * \t// promise resolves when input is available\n\t * });\n\t * // mute the output\n\t * mic.mute = true;\n\t */\n\tget mute(): boolean {\n\t\treturn this._volume.mute;\n\t}\n\tset mute(mute) {\n\t\tthis._volume.mute = mute;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.close();\n\t\tthis._volume.dispose();\n\t\tthis.volume.dispose();\n\t\treturn this;\n\t}\n\n\t/**\n\t * If getUserMedia is supported by the browser.\n\t */\n\tstatic get supported(): boolean {\n\t\treturn isDefined(navigator.mediaDevices) &&\n\t\t\tisDefined(navigator.mediaDevices.getUserMedia);\n\t}\n}\n","import { AudioRange, Cents, Degrees, Frequency, Positive } from \"../../core/type/Units\";\nimport { Omit } from \"../../core/util/Interface\";\nimport { Signal } from \"../../signal/Signal\";\nimport { SourceOptions } from \"../Source\";\nimport { OfflineContext } from \"../../core/context/OfflineContext\";\n\n/**\n * The common interface of all Oscillators\n */\nexport interface ToneOscillatorInterface {\n\n\t/**\n\t * The oscillator type without the partialsCount appended to the end\n\t * @example\n\t * const osc = new Tone.Oscillator();\n\t * osc.type = \"sine2\";\n\t * console.log(osc.baseType); // \"sine\"\n\t */\n\tbaseType: OscillatorType | \"pulse\" | \"pwm\";\n\n\t/**\n\t * The oscillator's type. Also capable of setting the first x number of partials of the oscillator. \n\t * For example: \"sine4\" would set be the first 4 partials of the sine wave and \"triangle8\" would \n\t * set the first 8 partials of the triangle wave.\n\t * @example\n\t * return Tone.Offline(() => {\n\t * \tconst osc = new Tone.Oscillator().toDestination().start();\n\t * \tosc.type = \"sine2\";\n\t * }, 0.1, 1);\n\t */\n\ttype: ExtendedToneOscillatorType;\n\n\t/**\n\t * The frequency value of the oscillator\n\t * @example\n\t * const osc = new Tone.FMOscillator(\"Bb4\").toDestination().start();\n\t * osc.frequency.rampTo(\"D2\", 3);\n\t */\n\treadonly frequency: Signal<\"frequency\">;\n\n\t/**\n\t * The detune value in cents (100th of a semitone).\n\t * @example\n\t * const osc = new Tone.PulseOscillator(\"F3\").toDestination().start();\n\t * // pitch it 1 octave = 12 semitones = 1200 cents\n\t * osc.detune.setValueAtTime(-1200, Tone.now());\n\t * osc.detune.setValueAtTime(1200, Tone.now() + 0.5);\n\t * osc.detune.linearRampToValueAtTime(0, Tone.now() + 1);\n\t * osc.stop(Tone.now() + 1.5);\n\t */\n\treadonly detune: Signal<\"cents\">;\n\n\t/**\n\t * The phase is the starting position within the oscillator's cycle. For example\n\t * a phase of 180 would start halfway through the oscillator's cycle. \n\t * @example\n\t * return Tone.Offline(() => {\n\t * \tconst osc = new Tone.Oscillator({\n\t * \t\tfrequency: 20,\n\t * \t\tphase: 90\n\t * \t}).toDestination().start();\n\t * }, 0.1, 1);\n\t */\n\tphase: Degrees;\n\n\t/**\n\t * The partials describes the relative amplitude of each of the harmonics of the oscillator. \n\t * The first value in the array is the first harmonic (i.e. the fundamental frequency), the \n\t * second harmonic is an octave up, the third harmonic is an octave and a fifth, etc. The resulting\n\t * oscillator output is composed of a sine tone at the relative amplitude at each of the harmonic intervals. \n\t * \n\t * Setting this value will automatically set the type to \"custom\".\n\t * The value is an empty array when the type is not \"custom\".\n\t * @example\n\t * const osc = new Tone.Oscillator(\"F3\").toDestination().start();\n\t * setInterval(() => {\n\t * \t// generate 8 random partials\n\t * \tosc.partials = new Array(8).fill(0).map(() => Math.random());\n\t * }, 1000);\n\t */\n\tpartials: number[];\n\n\t/**\n\t * 'partialCount' offers an alternative way to set the number of used partials.\n\t * When partialCount is 0, the maximum number of partials are used when representing\n\t * the waveform using the periodicWave. When 'partials' is set, this value is\n\t * not settable, but equals the length of the partials array. A square wave wave\n\t * is composed of only odd harmonics up through the harmonic series. Partial count\n\t * can limit the number of harmonics which are used to generate the waveform.\n\t * @example\n\t * const osc = new Tone.Oscillator(\"C3\", \"square\").toDestination().start();\n\t * osc.partialCount = 1;\n\t * setInterval(() => {\n\t * \tosc.partialCount++;\n\t * \tconsole.log(osc.partialCount);\n\t * }, 500);\n\t */\n\tpartialCount?: number;\n\n\t/**\n\t * Returns an array of values which represents the waveform.\n\t * @param length The length of the waveform to return\n\t */\n\tasArray(length: number): Promise<Float32Array>;\n}\n\n/**\n * Render a segment of the oscillator to an offline context and return the results as an array\n */\nexport async function generateWaveform(instance: any, length: number): Promise<Float32Array> {\n\tconst duration = length / instance.context.sampleRate;\n\tconst context = new OfflineContext(1, duration, instance.context.sampleRate);\n\tconst clone = new instance.constructor(Object.assign(instance.get(), {\n\t\t// should do 2 iterations\n\t\tfrequency: 2 / duration,\n\t\t// zero out the detune\n\t\tdetune: 0,\n\t\tcontext\n\t})).toDestination();\n\tclone.start(0);\n\tconst buffer = await context.render();\n\treturn buffer.getChannelData(0);\n}\n\n/**\n * Oscillators with partials\n */\ntype SineWithPartials =\n\t\"sine1\" | \"sine2\" | \"sine3\" | \"sine4\" | \"sine5\" | \"sine6\" | \"sine7\" | \"sine8\" | \"sine9\" |\n\t\"sine10\" | \"sine11\" | \"sine12\" | \"sine13\" | \"sine14\" | \"sine15\" | \"sine16\" | \"sine17\" | \"sine18\" | \"sine19\" |\n\t\"sine20\" | \"sine21\" | \"sine22\" | \"sine23\" | \"sine24\" | \"sine25\" | \"sine26\" | \"sine27\" | \"sine28\" | \"sine29\" |\n\t\"sine30\" | \"sine31\" | \"sine32\";\n\ntype SquareWithPartials =\n\t\"square1\" | \"square2\" | \"square3\" | \"square4\" | \"square5\" | \"square6\" | \"square7\" | \"square8\" | \"square9\" |\n\t\"square10\" | \"square11\" | \"square12\" | \"square13\" | \"square14\" | \"square15\" | \"square16\" | \"square17\" | \"square18\" | \"square19\" |\n\t\"square20\" | \"square21\" | \"square22\" | \"square23\" | \"square24\" | \"square25\" | \"square26\" | \"square27\" | \"square28\" | \"square29\" |\n\t\"square30\" | \"square31\" | \"square32\";\n\ntype SawtoothWithPartials =\n\t\"sawtooth1\" | \"sawtooth2\" | \"sawtooth3\" | \"sawtooth4\" | \"sawtooth5\" | \"sawtooth6\" | \"sawtooth7\" | \"sawtooth8\" | \"sawtooth9\" |\n\t\"sawtooth10\" | \"sawtooth11\" | \"sawtooth12\" | \"sawtooth13\" | \"sawtooth14\" | \"sawtooth15\" | \"sawtooth16\" | \"sawtooth17\" | \"sawtooth18\" | \"sawtooth19\" |\n\t\"sawtooth20\" | \"sawtooth21\" | \"sawtooth22\" | \"sawtooth23\" | \"sawtooth24\" | \"sawtooth25\" | \"sawtooth26\" | \"sawtooth27\" | \"sawtooth28\" | \"sawtooth29\" |\n\t\"sawtooth30\" | \"sawtooth31\" | \"sawtooth32\";\n\ntype TriangleWithPartials =\n\t\"triangle1\" | \"triangle2\" | \"triangle3\" | \"triangle4\" | \"triangle5\" | \"triangle6\" | \"triangle7\" | \"triangle8\" | \"triangle9\" |\n\t\"triangle10\" | \"triangle11\" | \"triangle12\" | \"triangle13\" | \"triangle14\" | \"triangle15\" | \"triangle16\" | \"triangle17\" | \"triangle18\" | \"triangle19\" |\n\t\"triangle20\" | \"triangle21\" | \"triangle22\" | \"triangle23\" | \"triangle24\" | \"triangle25\" | \"triangle26\" | \"triangle27\" | \"triangle28\" | \"triangle29\" |\n\t\"triangle30\" | \"triangle31\" | \"triangle32\";\n\ntype TypeWithPartials = SineWithPartials | SquareWithPartials | TriangleWithPartials | SawtoothWithPartials;\n\ninterface BaseOscillatorOptions extends SourceOptions {\n\tfrequency: Frequency;\n\tdetune: Cents;\n\tphase: Degrees;\n}\n\nexport type NonCustomOscillatorType = Exclude<OscillatorType, \"custom\">;\n\ntype AllNonCustomOscillatorType = NonCustomOscillatorType | TypeWithPartials;\n\nexport type ToneOscillatorType = AllNonCustomOscillatorType | \"custom\";\n\nexport type ExtendedToneOscillatorType = ToneOscillatorType | \"pwm\" | \"pulse\";\n\n/**\n * Oscillator Interfaces\n */\ninterface ToneCustomOscillatorOptions extends BaseOscillatorOptions {\n\ttype: \"custom\";\n\tpartials: number[];\n}\n\ninterface ToneTypeOscillatorOptions extends BaseOscillatorOptions {\n\ttype: NonCustomOscillatorType;\n\tpartialCount?: number;\n}\n\ninterface TonePartialOscillatorOptions extends BaseOscillatorOptions {\n\ttype: TypeWithPartials;\n}\n\nexport type ToneOscillatorConstructorOptions = ToneCustomOscillatorOptions | ToneTypeOscillatorOptions | TonePartialOscillatorOptions;\n\nexport interface ToneOscillatorOptions extends BaseOscillatorOptions {\n\ttype: ToneOscillatorType;\n\tpartialCount: number;\n\tpartials: number[];\n}\n\n/**\n * FMOscillator Interface\n */\ninterface FMBaseOscillatorOptions extends BaseOscillatorOptions {\n\tharmonicity: Positive;\n\tmodulationIndex: Positive;\n\tmodulationType: AllNonCustomOscillatorType;\n}\n\ninterface FMCustomOscillatorOptions extends FMBaseOscillatorOptions {\n\ttype: \"custom\";\n\tpartials: number[];\n}\n\ninterface FMTypeOscillatorOptions extends FMBaseOscillatorOptions {\n\ttype: NonCustomOscillatorType;\n\tpartialsCount?: number;\n}\n\ninterface FMPartialsOscillatorOptions extends FMBaseOscillatorOptions {\n\ttype: TypeWithPartials;\n}\n\nexport type FMConstructorOptions = FMTypeOscillatorOptions | FMCustomOscillatorOptions | FMPartialsOscillatorOptions;\n\nexport interface FMOscillatorOptions extends ToneOscillatorOptions {\n\tharmonicity: Positive;\n\tmodulationIndex: Positive;\n\tmodulationType: AllNonCustomOscillatorType;\n}\n\n/**\n * AMOscillator Interface\n */\ninterface AMBaseOscillatorOptions extends BaseOscillatorOptions {\n\tharmonicity: Positive;\n\tmodulationType: AllNonCustomOscillatorType;\n}\n\ninterface AMCustomOscillatorOptions extends AMBaseOscillatorOptions {\n\ttype: \"custom\";\n\tpartials: number[];\n}\n\ninterface AMTypeOscillatorOptions extends AMBaseOscillatorOptions {\n\ttype: NonCustomOscillatorType;\n\tpartialsCount?: number;\n}\n\ninterface AMPartialsOscillatorOptions extends AMBaseOscillatorOptions {\n\ttype: TypeWithPartials;\n}\n\nexport type AMConstructorOptions = AMCustomOscillatorOptions | AMTypeOscillatorOptions | AMPartialsOscillatorOptions;\n\nexport interface AMOscillatorOptions extends ToneOscillatorOptions {\n\tharmonicity: Positive;\n\tmodulationType: AllNonCustomOscillatorType;\n}\n/**\n * FatOscillator\n */\ninterface FatBaseOscillatorOptions extends BaseOscillatorOptions {\n\tspread: Cents;\n\tcount: Positive;\n}\n\ninterface FatCustomOscillatorOptions extends FatBaseOscillatorOptions {\n\ttype: \"custom\";\n\tpartials: number[];\n}\n\ninterface FatTypeOscillatorOptions extends FatBaseOscillatorOptions {\n\ttype: NonCustomOscillatorType;\n\tpartialCount?: number;\n}\n\ninterface FatPartialsOscillatorOptions extends FatBaseOscillatorOptions {\n\ttype: TypeWithPartials;\n}\n\nexport type FatConstructorOptions = FatCustomOscillatorOptions | FatTypeOscillatorOptions | FatPartialsOscillatorOptions;\n\nexport interface FatOscillatorOptions extends ToneOscillatorOptions {\n\tspread: Cents;\n\tcount: Positive;\n}\n\n/**\n * Pulse Oscillator\n */\nexport interface PulseOscillatorOptions extends BaseOscillatorOptions {\n\ttype: \"pulse\";\n\twidth: AudioRange;\n}\n\n/**\n * PWM Oscillator\n */\nexport interface PWMOscillatorOptions extends BaseOscillatorOptions {\n\ttype: \"pwm\";\n\tmodulationFrequency: Frequency;\n}\n\n/**\n * OMNI OSCILLATOR\n */\n\n/**\n * FM Oscillators with partials\n */\ntype FMSineWithPartials =\n\t\"fmsine1\" | \"fmsine2\" | \"fmsine3\" | \"fmsine4\" | \"fmsine5\" | \"fmsine6\" | \"fmsine7\" | \"fmsine8\" | \"fmsine9\" |\n\t\"fmsine10\" | \"fmsine11\" | \"fmsine12\" | \"fmsine13\" | \"fmsine14\" | \"fmsine15\" | \"fmsine16\" | \"fmsine17\" | \"fmsine18\" | \"fmsine19\" |\n\t\"fmsine20\" | \"fmsine21\" | \"fmsine22\" | \"fmsine23\" | \"fmsine24\" | \"fmsine25\" | \"fmsine26\" | \"fmsine27\" | \"fmsine28\" | \"fmsine29\" |\n\t\"fmsine30\" | \"fmsine31\" | \"fmsine32\";\n\ntype FMSquareWithPartials =\n\t\"fmsquare1\" | \"fmsquare2\" | \"fmsquare3\" | \"fmsquare4\" | \"fmsquare5\" | \"fmsquare6\" | \"fmsquare7\" | \"fmsquare8\" | \"fmsquare9\" |\n\t\"fmsquare10\" | \"fmsquare11\" | \"fmsquare12\" | \"fmsquare13\" | \"fmsquare14\" | \"fmsquare15\" | \"fmsquare16\" | \"fmsquare17\" | \"fmsquare18\" | \"fmsquare19\" |\n\t\"fmsquare20\" | \"fmsquare21\" | \"fmsquare22\" | \"fmsquare23\" | \"fmsquare24\" | \"fmsquare25\" | \"fmsquare26\" | \"fmsquare27\" | \"fmsquare28\" | \"fmsquare29\" |\n\t\"fmsquare30\" | \"fmsquare31\" | \"fmsquare32\";\n\ntype FMSawtoothWithPartials =\n\t\"fmsawtooth1\" | \"fmsawtooth2\" | \"fmsawtooth3\" | \"fmsawtooth4\" | \"fmsawtooth5\" | \"fmsawtooth6\" | \"fmsawtooth7\" | \"fmsawtooth8\" | \"fmsawtooth9\" |\n\t\"fmsawtooth10\" | \"fmsawtooth11\" | \"fmsawtooth12\" | \"fmsawtooth13\" | \"fmsawtooth14\" | \"fmsawtooth15\" | \"fmsawtooth16\" | \"fmsawtooth17\" | \"fmsawtooth18\" | \"fmsawtooth19\" |\n\t\"fmsawtooth20\" | \"fmsawtooth21\" | \"fmsawtooth22\" | \"fmsawtooth23\" | \"fmsawtooth24\" | \"fmsawtooth25\" | \"fmsawtooth26\" | \"fmsawtooth27\" | \"fmsawtooth28\" | \"fmsawtooth29\" |\n\t\"fmsawtooth30\" | \"fmsawtooth31\" | \"fmsawtooth32\";\n\ntype FMTriangleWithPartials =\n\t\"fmtriangle1\" | \"fmtriangle2\" | \"fmtriangle3\" | \"fmtriangle4\" | \"fmtriangle5\" | \"fmtriangle6\" | \"fmtriangle7\" | \"fmtriangle8\" | \"fmtriangle9\" |\n\t\"fmtriangle10\" | \"fmtriangle11\" | \"fmtriangle12\" | \"fmtriangle13\" | \"fmtriangle14\" | \"fmtriangle15\" | \"fmtriangle16\" | \"fmtriangle17\" | \"fmtriangle18\" | \"fmtriangle19\" |\n\t\"fmtriangle20\" | \"fmtriangle21\" | \"fmtriangle22\" | \"fmtriangle23\" | \"fmtriangle24\" | \"fmtriangle25\" | \"fmtriangle26\" | \"fmtriangle27\" | \"fmtriangle28\" | \"fmtriangle29\" |\n\t\"fmtriangle30\" | \"fmtriangle31\" | \"fmtriangle32\";\n\ntype FMTypeWithPartials = FMSineWithPartials | FMSquareWithPartials | FMSawtoothWithPartials | FMTriangleWithPartials;\n\n/**\n * AM Oscillators with partials\n */\ntype AMSineWithPartials =\n\t\"amsine1\" | \"amsine2\" | \"amsine3\" | \"amsine4\" | \"amsine5\" | \"amsine6\" | \"amsine7\" | \"amsine8\" | \"amsine9\" |\n\t\"amsine10\" | \"amsine11\" | \"amsine12\" | \"amsine13\" | \"amsine14\" | \"amsine15\" | \"amsine16\" | \"amsine17\" | \"amsine18\" | \"amsine19\" |\n\t\"amsine20\" | \"amsine21\" | \"amsine22\" | \"amsine23\" | \"amsine24\" | \"amsine25\" | \"amsine26\" | \"amsine27\" | \"amsine28\" | \"amsine29\" |\n\t\"amsine30\" | \"amsine31\" | \"amsine32\";\n\ntype AMSquareWithPartials =\n\t\"amsquare1\" | \"amsquare2\" | \"amsquare3\" | \"amsquare4\" | \"amsquare5\" | \"amsquare6\" | \"amsquare7\" | \"amsquare8\" | \"amsquare9\" |\n\t\"amsquare10\" | \"amsquare11\" | \"amsquare12\" | \"amsquare13\" | \"amsquare14\" | \"amsquare15\" | \"amsquare16\" | \"amsquare17\" | \"amsquare18\" | \"amsquare19\" |\n\t\"amsquare20\" | \"amsquare21\" | \"amsquare22\" | \"amsquare23\" | \"amsquare24\" | \"amsquare25\" | \"amsquare26\" | \"amsquare27\" | \"amsquare28\" | \"amsquare29\" |\n\t\"amsquare30\" | \"amsquare31\" | \"amsquare32\";\n\ntype AMSawtoothWithPartials =\n\t\"amsawtooth1\" | \"amsawtooth2\" | \"amsawtooth3\" | \"amsawtooth4\" | \"amsawtooth5\" | \"amsawtooth6\" | \"amsawtooth7\" | \"amsawtooth8\" | \"amsawtooth9\" |\n\t\"amsawtooth10\" | \"amsawtooth11\" | \"amsawtooth12\" | \"amsawtooth13\" | \"amsawtooth14\" | \"amsawtooth15\" | \"amsawtooth16\" | \"amsawtooth17\" | \"amsawtooth18\" | \"amsawtooth19\" |\n\t\"amsawtooth20\" | \"amsawtooth21\" | \"amsawtooth22\" | \"amsawtooth23\" | \"amsawtooth24\" | \"amsawtooth25\" | \"amsawtooth26\" | \"amsawtooth27\" | \"amsawtooth28\" | \"amsawtooth29\" |\n\t\"amsawtooth30\" | \"amsawtooth31\" | \"amsawtooth32\";\n\ntype AMTriangleWithPartials =\n\t\"amtriangle1\" | \"amtriangle2\" | \"amtriangle3\" | \"amtriangle4\" | \"amtriangle5\" | \"amtriangle6\" | \"amtriangle7\" | \"amtriangle8\" | \"amtriangle9\" |\n\t\"amtriangle10\" | \"amtriangle11\" | \"amtriangle12\" | \"amtriangle13\" | \"amtriangle14\" | \"amtriangle15\" | \"amtriangle16\" | \"amtriangle17\" | \"amtriangle18\" | \"amtriangle19\" |\n\t\"amtriangle20\" | \"amtriangle21\" | \"amtriangle22\" | \"amtriangle23\" | \"amtriangle24\" | \"amtriangle25\" | \"amtriangle26\" | \"amtriangle27\" | \"amtriangle28\" | \"amtriangle29\" |\n\t\"amtriangle30\" | \"amtriangle31\" | \"amtriangle32\";\n\ntype AMTypeWithPartials = AMSineWithPartials | AMSquareWithPartials | AMSawtoothWithPartials | AMTriangleWithPartials;\n\n/**\n * Fat Oscillators with partials\n */\ntype FatSineWithPartials =\n\t\"fatsine1\" | \"fatsine2\" | \"fatsine3\" | \"fatsine4\" | \"fatsine5\" | \"fatsine6\" | \"fatsine7\" | \"fatsine8\" | \"fatsine9\" |\n\t\"fatsine10\" | \"fatsine11\" | \"fatsine12\" | \"fatsine13\" | \"fatsine14\" | \"fatsine15\" | \"fatsine16\" | \"fatsine17\" | \"fatsine18\" | \"fatsine19\" |\n\t\"fatsine20\" | \"fatsine21\" | \"fatsine22\" | \"fatsine23\" | \"fatsine24\" | \"fatsine25\" | \"fatsine26\" | \"fatsine27\" | \"fatsine28\" | \"fatsine29\" |\n\t\"fatsine30\" | \"fatsine31\" | \"fatsine32\";\n\ntype FatSquareWithPartials =\n\t\"fatsquare1\" | \"fatsquare2\" | \"fatsquare3\" | \"fatsquare4\" | \"fatsquare5\" | \"fatsquare6\" | \"fatsquare7\" | \"fatsquare8\" | \"fatsquare9\" |\n\t\"fatsquare10\" | \"fatsquare11\" | \"fatsquare12\" | \"fatsquare13\" | \"fatsquare14\" | \"fatsquare15\" | \"fatsquare16\" | \"fatsquare17\" | \"fatsquare18\" | \"fatsquare19\" |\n\t\"fatsquare20\" | \"fatsquare21\" | \"fatsquare22\" | \"fatsquare23\" | \"fatsquare24\" | \"fatsquare25\" | \"fatsquare26\" | \"fatsquare27\" | \"fatsquare28\" | \"fatsquare29\" |\n\t\"fatsquare30\" | \"fatsquare31\" | \"fatsquare32\";\n\ntype FatSawtoothWithPartials =\n\t\"fatsawtooth1\" | \"fatsawtooth2\" | \"fatsawtooth3\" | \"fatsawtooth4\" | \"fatsawtooth5\" | \"fatsawtooth6\" | \"fatsawtooth7\" | \"fatsawtooth8\" | \"fatsawtooth9\" |\n\t\"fatsawtooth10\" | \"fatsawtooth11\" | \"fatsawtooth12\" | \"fatsawtooth13\" | \"fatsawtooth14\" | \"fatsawtooth15\" | \"fatsawtooth16\" | \"fatsawtooth17\" | \"fatsawtooth18\" | \"fatsawtooth19\" |\n\t\"fatsawtooth20\" | \"fatsawtooth21\" | \"fatsawtooth22\" | \"fatsawtooth23\" | \"fatsawtooth24\" | \"fatsawtooth25\" | \"fatsawtooth26\" | \"fatsawtooth27\" | \"fatsawtooth28\" | \"fatsawtooth29\" |\n\t\"fatsawtooth30\" | \"fatsawtooth31\" | \"fatsawtooth32\";\n\ntype FatTriangleWithPartials =\n\t\"fattriangle1\" | \"fattriangle2\" | \"fattriangle3\" | \"fattriangle4\" | \"fattriangle5\" | \"fattriangle6\" | \"fattriangle7\" | \"fattriangle8\" | \"fattriangle9\" |\n\t\"fattriangle10\" | \"fattriangle11\" | \"fattriangle12\" | \"fattriangle13\" | \"fattriangle14\" | \"fattriangle15\" | \"fattriangle16\" | \"fattriangle17\" | \"fattriangle18\" | \"fattriangle19\" |\n\t\"fattriangle20\" | \"fattriangle21\" | \"fattriangle22\" | \"fattriangle23\" | \"fattriangle24\" | \"fattriangle25\" | \"fattriangle26\" | \"fattriangle27\" | \"fattriangle28\" | \"fattriangle29\" |\n\t\"fattriangle30\" | \"fattriangle31\" | \"fattriangle32\";\n\ntype FatTypeWithPartials = FatSineWithPartials | FatSquareWithPartials | FatSawtoothWithPartials | FatTriangleWithPartials;\n\n/**\n * Omni FM\n */\ninterface OmniFMCustomOscillatorOptions extends FMBaseOscillatorOptions {\n\ttype: \"fmcustom\";\n\tpartials: number[];\n}\n\ninterface OmniFMTypeOscillatorOptions extends FMBaseOscillatorOptions {\n\ttype: \"fmsine\" | \"fmsquare\" | \"fmsawtooth\" | \"fmtriangle\";\n\tpartialsCount?: number;\n}\n\ninterface OmniFMPartialsOscillatorOptions extends FMBaseOscillatorOptions {\n\ttype: FMTypeWithPartials;\n}\n\n/**\n * Omni AM\n */\ninterface OmniAMCustomOscillatorOptions extends AMBaseOscillatorOptions {\n\ttype: \"amcustom\";\n\tpartials: number[];\n}\n\ninterface OmniAMTypeOscillatorOptions extends AMBaseOscillatorOptions {\n\ttype: \"amsine\" | \"amsquare\" | \"amsawtooth\" | \"amtriangle\";\n\tpartialsCount?: number;\n}\n\ninterface OmniAMPartialsOscillatorOptions extends AMBaseOscillatorOptions {\n\ttype: AMTypeWithPartials;\n}\n\n/**\n * Omni Fat\n */\ninterface OmniFatCustomOscillatorOptions extends FatBaseOscillatorOptions {\n\ttype: \"fatcustom\";\n\tpartials: number[];\n}\n\ninterface OmniFatTypeOscillatorOptions extends FatBaseOscillatorOptions {\n\ttype: \"fatsine\" | \"fatsquare\" | \"fatsawtooth\" | \"fattriangle\";\n\tpartialsCount?: number;\n}\n\ninterface OmniFatPartialsOscillatorOptions extends FatBaseOscillatorOptions {\n\ttype: FatTypeWithPartials;\n}\n\nexport type OmniOscillatorType =\n\t\"fatsine\" | \"fatsquare\" | \"fatsawtooth\" | \"fattriangle\" | \"fatcustom\" | FatTypeWithPartials |\n\t\"fmsine\" | \"fmsquare\" | \"fmsawtooth\" | \"fmtriangle\" | \"fmcustom\" | FMTypeWithPartials |\n\t\"amsine\" | \"amsquare\" | \"amsawtooth\" | \"amtriangle\" | \"amcustom\" | AMTypeWithPartials |\n\tTypeWithPartials | OscillatorType | \"pulse\" | \"pwm\";\n\nexport type OmniOscillatorOptions =\n\tPulseOscillatorOptions | PWMOscillatorOptions |\n\tOmniFatCustomOscillatorOptions | OmniFatTypeOscillatorOptions | OmniFatPartialsOscillatorOptions |\n\tOmniFMCustomOscillatorOptions | OmniFMTypeOscillatorOptions | OmniFMPartialsOscillatorOptions |\n\tOmniAMCustomOscillatorOptions | OmniAMTypeOscillatorOptions | OmniAMPartialsOscillatorOptions |\n\tToneOscillatorConstructorOptions;\n\ntype OmitSourceOptions<T extends BaseOscillatorOptions> = Omit<T, \"frequency\" | \"detune\" | \"context\">;\n\n/**\n * The settable options for the omni oscillator inside of the source which excludes certain attributes that are defined by the parent class\n */\nexport type OmniOscillatorSynthOptions =\n\tOmitSourceOptions<PulseOscillatorOptions> | OmitSourceOptions<PWMOscillatorOptions> |\n\tOmitSourceOptions<OmniFatCustomOscillatorOptions> | OmitSourceOptions<OmniFatTypeOscillatorOptions> | OmitSourceOptions<OmniFatPartialsOscillatorOptions> |\n\tOmitSourceOptions<OmniFMCustomOscillatorOptions> | OmitSourceOptions<OmniFMTypeOscillatorOptions> | OmitSourceOptions<OmniFMPartialsOscillatorOptions> |\n\tOmitSourceOptions<OmniAMCustomOscillatorOptions> | OmitSourceOptions<OmniAMTypeOscillatorOptions> | OmitSourceOptions<OmniAMPartialsOscillatorOptions> |\n\tOmitSourceOptions<ToneCustomOscillatorOptions> | OmitSourceOptions<ToneTypeOscillatorOptions> | OmitSourceOptions<TonePartialOscillatorOptions>\n","import { connect } from \"../../core/context/ToneAudioNode\";\nimport { Param } from \"../../core/context/Param\";\nimport { Cents, Frequency, Seconds, Time } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { OneShotSource, OneShotSourceOptions } from \"../OneShotSource\";\nimport { readOnly } from \"../../core/util/Interface\";\n\nexport interface ToneOscillatorNodeOptions extends OneShotSourceOptions {\n\tfrequency: Frequency;\n\tdetune: Cents;\n\ttype: OscillatorType;\n}\n\n/**\n * Wrapper around the native fire-and-forget OscillatorNode.\n * Adds the ability to reschedule the stop method.\n * ***[[Oscillator]] is better for most use-cases***\n * @category Source\n */\nexport class ToneOscillatorNode extends OneShotSource<ToneOscillatorNodeOptions> {\n\n\treadonly name: string = \"ToneOscillatorNode\";\n\n\t/**\n\t * The oscillator\n\t */\n\tprivate _oscillator = this.context.createOscillator();\n\tprotected _internalChannels = [this._oscillator];\n\n\t/**\n\t * The frequency of the oscillator\n\t */\n\treadonly frequency: Param<\"frequency\">;\n\n\t/**\n\t * The detune of the oscillator\n\t */\n\treadonly detune: Param<\"cents\">;\n\n\t/**\n\t * @param frequency The frequency value\n\t * @param type The basic oscillator type\n\t */\n\tconstructor(\n\t\tfrequency: Frequency,\n\t\ttype: OscillatorType,\n\t);\n\tconstructor(options?: Partial<ToneOscillatorNodeOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(ToneOscillatorNode.getDefaults(), arguments, [\"frequency\", \"type\"]));\n\t\tconst options = optionsFromArguments(ToneOscillatorNode.getDefaults(), arguments, [\"frequency\", \"type\"]);\n\n\t\tconnect(this._oscillator, this._gainNode);\n\n\t\tthis.type = options.type;\n\n\t\tthis.frequency = new Param({\n\t\t\tcontext: this.context,\n\t\t\tparam: this._oscillator.frequency,\n\t\t\tunits: \"frequency\",\n\t\t\tvalue: options.frequency,\n\t\t});\n\n\t\tthis.detune = new Param({\n\t\t\tcontext: this.context,\n\t\t\tparam: this._oscillator.detune,\n\t\t\tunits: \"cents\",\n\t\t\tvalue: options.detune,\n\t\t});\n\n\t\treadOnly(this, [\"frequency\", \"detune\"]);\n\t}\n\n\tstatic getDefaults(): ToneOscillatorNodeOptions {\n\t\treturn Object.assign(OneShotSource.getDefaults(), {\n\t\t\tdetune: 0,\n\t\t\tfrequency: 440,\n\t\t\ttype: \"sine\" as OscillatorType,\n\t\t});\n\t}\n\n\t/**\n\t * Start the oscillator node at the given time\n\t * @param time When to start the oscillator\n\t */\n\tstart(time?: Time): this {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tthis.log(\"start\", computedTime);\n\t\tthis._startGain(computedTime);\n\t\tthis._oscillator.start(computedTime);\n\t\treturn this;\n\t}\n\n\tprotected _stopSource(time?: Seconds): void {\n\t\tthis._oscillator.stop(time);\n\t}\n\n\t/**\n\t * Sets an arbitrary custom periodic waveform given a PeriodicWave.\n\t * @param periodicWave PeriodicWave should be created with context.createPeriodicWave\n\t */\n\tsetPeriodicWave(periodicWave: PeriodicWave): this {\n\t\tthis._oscillator.setPeriodicWave(periodicWave);\n\t\treturn this;\n\t}\n\n\t/**\n\t * The oscillator type. Either 'sine', 'sawtooth', 'square', or 'triangle'\n\t */\n\tget type(): OscillatorType {\n\t\treturn this._oscillator.type;\n\t}\n\tset type(type: OscillatorType) {\n\t\tthis._oscillator.type = type;\n\t}\n\n\t/**\n\t * Clean up.\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tif (this.state === \"started\") {\n\t\t\tthis.stop();\n\t\t}\n\t\tthis._oscillator.disconnect();\n\t\tthis.frequency.dispose();\n\t\tthis.detune.dispose();\n\t\treturn this;\n\t}\n}\n","import { AudioRange, Degrees, Frequency, Radians, Time } from \"../../core/type/Units\";\nimport { deepEquals, optionsFromArguments } from \"../../core/util/Defaults\";\nimport { readOnly } from \"../../core/util/Interface\";\nimport { isDefined } from \"../../core/util/TypeCheck\";\nimport { Signal } from \"../../signal/Signal\";\nimport { Source } from \"../Source\";\nimport {\n\tgenerateWaveform, ToneOscillatorConstructorOptions, ToneOscillatorInterface,\n\tToneOscillatorOptions, ToneOscillatorType\n} from \"./OscillatorInterface\";\nimport { ToneOscillatorNode } from \"./ToneOscillatorNode\";\nimport { assertRange } from \"../../core/util/Debug\";\nimport { clamp } from \"../../core/util/Math\";\nexport { ToneOscillatorOptions, ToneOscillatorType } from \"./OscillatorInterface\";\n/**\n * Oscillator supports a number of features including\n * phase rotation, multiple oscillator types (see Oscillator.type),\n * and Transport syncing (see Oscillator.syncFrequency).\n *\n * @example\n * // make and start a 440hz sine tone\n * const osc = new Tone.Oscillator(440, \"sine\").toDestination().start();\n * @category Source\n */\nexport class Oscillator extends Source<ToneOscillatorOptions> implements ToneOscillatorInterface {\n\n\treadonly name: string = \"Oscillator\";\n\n\t/**\n\t * the main oscillator\n\t */\n\tprivate _oscillator: ToneOscillatorNode | null = null;\n\n\t/**\n\t * The frequency control.\n\t */\n\tfrequency: Signal<\"frequency\">;\n\n\t/**\n\t * The detune control signal.\n\t */\n\tdetune: Signal<\"cents\">;\n\n\t/**\n\t * the periodic wave\n\t */\n\tprivate _wave?: PeriodicWave;\n\n\t/**\n\t * The partials of the oscillator\n\t */\n\tprivate _partials: number[];\n\n\t/**\n\t * The number of partials to limit or extend the periodic wave by\n\t */\n\tprivate _partialCount: number;\n\n\t/**\n\t * the phase of the oscillator between 0 - 360\n\t */\n\tprivate _phase!: Radians;\n\n\t/**\n\t * the type of the oscillator\n\t */\n\tprivate _type: ToneOscillatorType;\n\n\t/**\n\t * @param frequency Starting frequency\n\t * @param type The oscillator type. Read more about type below.\n\t */\n\tconstructor(frequency?: Frequency, type?: ToneOscillatorType);\n\tconstructor(options?: Partial<ToneOscillatorConstructorOptions>)\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Oscillator.getDefaults(), arguments, [\"frequency\", \"type\"]));\n\t\tconst options = optionsFromArguments(Oscillator.getDefaults(), arguments, [\"frequency\", \"type\"]);\n\n\t\tthis.frequency = new Signal<\"frequency\">({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"frequency\",\n\t\t\tvalue: options.frequency,\n\t\t});\n\t\treadOnly(this, \"frequency\");\n\n\t\tthis.detune = new Signal<\"cents\">({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"cents\",\n\t\t\tvalue: options.detune,\n\t\t});\n\t\treadOnly(this, \"detune\");\n\n\t\tthis._partials = options.partials;\n\t\tthis._partialCount = options.partialCount;\n\t\tthis._type = options.type;\n\n\t\tif (options.partialCount && options.type !== \"custom\") {\n\t\t\tthis._type = this.baseType + options.partialCount.toString() as ToneOscillatorType;\n\t\t}\n\t\tthis.phase = options.phase;\n\t}\n\n\tstatic getDefaults(): ToneOscillatorOptions {\n\t\treturn Object.assign(Source.getDefaults(), {\n\t\t\tdetune: 0,\n\t\t\tfrequency: 440,\n\t\t\tpartialCount: 0,\n\t\t\tpartials: [],\n\t\t\tphase: 0,\n\t\t\ttype: \"sine\" as const,\n\t\t});\n\t}\n\n\t/**\n\t * start the oscillator\n\t */\n\tprotected _start(time?: Time): void {\n\t\tconst computedTime = this.toSeconds(time);\n\t\t// new oscillator with previous values\n\t\tconst oscillator = new ToneOscillatorNode({\n\t\t\tcontext: this.context,\n\t\t\tonended: () => this.onstop(this),\n\t\t});\n\t\tthis._oscillator = oscillator;\n\t\tif (this._wave) {\n\t\t\tthis._oscillator.setPeriodicWave(this._wave);\n\t\t} else {\n\t\t\tthis._oscillator.type = this._type as OscillatorType;\n\t\t}\n\t\t// connect the control signal to the oscillator frequency & detune\n\t\tthis._oscillator.connect(this.output);\n\t\tthis.frequency.connect(this._oscillator.frequency);\n\t\tthis.detune.connect(this._oscillator.detune);\n\n\t\t// start the oscillator\n\t\tthis._oscillator.start(computedTime);\n\t}\n\n\t/**\n\t * stop the oscillator\n\t */\n\tprotected _stop(time?: Time): void {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tif (this._oscillator) {\n\t\t\tthis._oscillator.stop(computedTime);\n\t\t}\n\t}\n\n\t/**\n\t * Restart the oscillator. Does not stop the oscillator, but instead\n\t * just cancels any scheduled 'stop' from being invoked.\n\t */\n\tprotected _restart(time?: Time): this {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tthis.log(\"restart\", computedTime);\n\t\tif (this._oscillator) {\n\t\t\tthis._oscillator.cancelStop();\n\t\t}\n\t\tthis._state.cancel(computedTime);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sync the signal to the Transport's bpm. Any changes to the transports bpm,\n\t * will also affect the oscillators frequency.\n\t * @example\n\t * const osc = new Tone.Oscillator().toDestination().start();\n\t * osc.frequency.value = 440;\n\t * // the ratio between the bpm and the frequency will be maintained\n\t * osc.syncFrequency();\n\t * // double the tempo\n\t * Tone.Transport.bpm.value *= 2;\n\t * // the frequency of the oscillator is doubled to 880\n\t */\n\tsyncFrequency(): this {\n\t\tthis.context.transport.syncSignal(this.frequency);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Unsync the oscillator's frequency from the Transport.\n\t * See Oscillator.syncFrequency\n\t */\n\tunsyncFrequency(): this {\n\t\tthis.context.transport.unsyncSignal(this.frequency);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Cache the periodic waves to avoid having to redo computations\n\t */\n\tprivate static _periodicWaveCache: Array<{\n\t\tpartials: number[];\n\t\tphase: number;\n\t\ttype: string;\n\t\tpartialCount: number;\n\t\treal: Float32Array;\n\t\timag: Float32Array;\n\t\twave: PeriodicWave;\n\t}> = [];\n\n\t/**\n\t * Get a cached periodic wave. Avoids having to recompute\n\t * the oscillator values when they have already been computed\n\t * with the same values.\n\t */\n\tprivate _getCachedPeriodicWave(): { real: Float32Array; imag: Float32Array; partials: number[]; wave: PeriodicWave } | undefined {\n\t\tif (this._type === \"custom\") {\n\t\t\tconst oscProps = Oscillator._periodicWaveCache.find(description => {\n\t\t\t\treturn description.phase === this._phase &&\n\t\t\t\t\tdeepEquals(description.partials, this._partials);\n\t\t\t});\n\t\t\treturn oscProps;\n\t\t} else {\n\t\t\tconst oscProps = Oscillator._periodicWaveCache.find(description => {\n\t\t\t\treturn description.type === this._type &&\n\t\t\t\t\tdescription.phase === this._phase;\n\t\t\t});\n\t\t\tthis._partialCount = oscProps ? oscProps.partialCount : this._partialCount;\n\t\t\treturn oscProps;\n\t\t}\n\t}\n\n\tget type(): ToneOscillatorType {\n\t\treturn this._type;\n\t}\n\tset type(type) {\n\t\tthis._type = type;\n\t\tconst isBasicType = [\"sine\", \"square\", \"sawtooth\", \"triangle\"].indexOf(type) !== -1;\n\t\tif (this._phase === 0 && isBasicType) {\n\t\t\tthis._wave = undefined;\n\t\t\tthis._partialCount = 0;\n\t\t\t// just go with the basic approach\n\t\t\tif (this._oscillator !== null) {\n\t\t\t\t// already tested that it's a basic type\n\t\t\t\tthis._oscillator.type = type as OscillatorType;\n\t\t\t}\n\t\t} else {\n\t\t\t// first check if the value is cached\n\t\t\tconst cache = this._getCachedPeriodicWave();\n\t\t\tif (isDefined(cache)) {\n\t\t\t\tconst { partials, wave } = cache;\n\t\t\t\tthis._wave = wave;\n\t\t\t\tthis._partials = partials;\n\t\t\t\tif (this._oscillator !== null) {\n\t\t\t\t\tthis._oscillator.setPeriodicWave(this._wave);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst [real, imag] = this._getRealImaginary(type, this._phase);\n\t\t\t\tconst periodicWave = this.context.createPeriodicWave(real, imag);\n\t\t\t\tthis._wave = periodicWave;\n\t\t\t\tif (this._oscillator !== null) {\n\t\t\t\t\tthis._oscillator.setPeriodicWave(this._wave);\n\t\t\t\t}\n\t\t\t\t// set the cache\n\t\t\t\tOscillator._periodicWaveCache.push({\n\t\t\t\t\timag,\n\t\t\t\t\tpartialCount: this._partialCount,\n\t\t\t\t\tpartials: this._partials,\n\t\t\t\t\tphase: this._phase,\n\t\t\t\t\treal,\n\t\t\t\t\ttype: this._type,\n\t\t\t\t\twave: this._wave,\n\t\t\t\t});\n\t\t\t\tif (Oscillator._periodicWaveCache.length > 100) {\n\t\t\t\t\tOscillator._periodicWaveCache.shift();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tget baseType(): OscillatorType {\n\t\treturn (this._type as string).replace(this.partialCount.toString(), \"\") as OscillatorType;\n\t}\n\tset baseType(baseType) {\n\t\tif (this.partialCount && this._type !== \"custom\" && baseType !== \"custom\") {\n\t\t\tthis.type = baseType + this.partialCount as ToneOscillatorType;\n\t\t} else {\n\t\t\tthis.type = baseType;\n\t\t}\n\t}\n\n\tget partialCount(): number {\n\t\treturn this._partialCount;\n\t}\n\tset partialCount(p) {\n\t\tassertRange(p, 0);\n\t\tlet type = this._type;\n\t\tconst partial = /^(sine|triangle|square|sawtooth)(\\d+)$/.exec(this._type);\n\t\tif (partial) {\n\t\t\ttype = partial[1] as OscillatorType;\n\t\t}\n\t\tif (this._type !== \"custom\") {\n\t\t\tif (p === 0) {\n\t\t\t\tthis.type = type;\n\t\t\t} else {\n\t\t\t\tthis.type = type + p.toString() as ToneOscillatorType;\n\t\t\t}\n\t\t} else {\n\t\t\t// extend or shorten the partials array\n\t\t\tconst fullPartials = new Float32Array(p);\n\t\t\t// copy over the partials array\n\t\t\tthis._partials.forEach((v, i) => fullPartials[i] = v);\n\t\t\tthis._partials = Array.from(fullPartials);\n\t\t\tthis.type = this._type;\n\t\t}\n\t}\n\n\t/**\n\t * Returns the real and imaginary components based\n\t * on the oscillator type.\n\t * @returns [real: Float32Array, imaginary: Float32Array]\n\t */\n\tprivate _getRealImaginary(type: ToneOscillatorType, phase: Radians): Float32Array[] {\n\t\tconst fftSize = 4096;\n\t\tlet periodicWaveSize = fftSize / 2;\n\n\t\tconst real = new Float32Array(periodicWaveSize);\n\t\tconst imag = new Float32Array(periodicWaveSize);\n\n\t\tlet partialCount = 1;\n\t\tif (type === \"custom\") {\n\t\t\tpartialCount = this._partials.length + 1;\n\t\t\tthis._partialCount = this._partials.length;\n\t\t\tperiodicWaveSize = partialCount;\n\t\t\t// if the partial count is 0, don't bother doing any computation\n\t\t\tif (this._partials.length === 0) {\n\t\t\t\treturn [real, imag];\n\t\t\t}\n\t\t} else {\n\t\t\tconst partial = /^(sine|triangle|square|sawtooth)(\\d+)$/.exec(type);\n\t\t\tif (partial) {\n\t\t\t\tpartialCount = parseInt(partial[2], 10) + 1;\n\t\t\t\tthis._partialCount = parseInt(partial[2], 10);\n\t\t\t\ttype = partial[1] as ToneOscillatorType;\n\t\t\t\tpartialCount = Math.max(partialCount, 2);\n\t\t\t\tperiodicWaveSize = partialCount;\n\t\t\t} else {\n\t\t\t\tthis._partialCount = 0;\n\t\t\t}\n\t\t\tthis._partials = [];\n\t\t}\n\n\t\tfor (let n = 1; n < periodicWaveSize; ++n) {\n\t\t\tconst piFactor = 2 / (n * Math.PI);\n\t\t\tlet b;\n\t\t\tswitch (type) {\n\t\t\t\tcase \"sine\":\n\t\t\t\t\tb = (n <= partialCount) ? 1 : 0;\n\t\t\t\t\tthis._partials[n - 1] = b;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"square\":\n\t\t\t\t\tb = (n & 1) ? 2 * piFactor : 0;\n\t\t\t\t\tthis._partials[n - 1] = b;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"sawtooth\":\n\t\t\t\t\tb = piFactor * ((n & 1) ? 1 : -1);\n\t\t\t\t\tthis._partials[n - 1] = b;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"triangle\":\n\t\t\t\t\tif (n & 1) {\n\t\t\t\t\t\tb = 2 * (piFactor * piFactor) * ((((n - 1) >> 1) & 1) ? -1 : 1);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tb = 0;\n\t\t\t\t\t}\n\t\t\t\t\tthis._partials[n - 1] = b;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"custom\":\n\t\t\t\t\tb = this._partials[n - 1];\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new TypeError(\"Oscillator: invalid type: \" + type);\n\t\t\t}\n\t\t\tif (b !== 0) {\n\t\t\t\treal[n] = -b * Math.sin(phase * n);\n\t\t\t\timag[n] = b * Math.cos(phase * n);\n\t\t\t} else {\n\t\t\t\treal[n] = 0;\n\t\t\t\timag[n] = 0;\n\t\t\t}\n\t\t}\n\t\treturn [real, imag];\n\t}\n\n\t/**\n\t * Compute the inverse FFT for a given phase.\n\t */\n\tprivate _inverseFFT(real: Float32Array, imag: Float32Array, phase: Radians): number {\n\t\tlet sum = 0;\n\t\tconst len = real.length;\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tsum += real[i] * Math.cos(i * phase) + imag[i] * Math.sin(i * phase);\n\t\t}\n\t\treturn sum;\n\t}\n\n\t/**\n\t * Returns the initial value of the oscillator when stopped.\n\t * E.g. a \"sine\" oscillator with phase = 90 would return an initial value of -1.\n\t */\n\tgetInitialValue(): AudioRange {\n\t\tconst [real, imag] = this._getRealImaginary(this._type, 0);\n\t\tlet maxValue = 0;\n\t\tconst twoPi = Math.PI * 2;\n\t\tconst testPositions = 32;\n\t\t// check for peaks in 16 places\n\t\tfor (let i = 0; i < testPositions; i++) {\n\t\t\tmaxValue = Math.max(this._inverseFFT(real, imag, (i / testPositions) * twoPi), maxValue);\n\t\t}\n\t\treturn clamp(-this._inverseFFT(real, imag, this._phase) / maxValue, -1, 1);\n\t}\n\n\tget partials(): number[] {\n\t\treturn this._partials.slice(0, this.partialCount);\n\t}\n\tset partials(partials) {\n\t\tthis._partials = partials;\n\t\tthis._partialCount = this._partials.length;\n\t\tif (partials.length) {\n\t\t\tthis.type = \"custom\";\n\t\t}\n\t}\n\n\tget phase(): Degrees {\n\t\treturn this._phase * (180 / Math.PI);\n\t}\n\tset phase(phase) {\n\t\tthis._phase = phase * Math.PI / 180;\n\t\t// reset the type\n\t\tthis.type = this._type;\n\t}\n\n\tasync asArray(length = 1024): Promise<Float32Array> {\n\t\treturn generateWaveform(this, length);\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tif (this._oscillator !== null) {\n\t\t\tthis._oscillator.dispose();\n\t\t}\n\t\tthis._wave = undefined;\n\t\tthis.frequency.dispose();\n\t\tthis.detune.dispose();\n\t\treturn this;\n\t}\n}\n","import { optionsFromArguments } from \"../core/util/Defaults\";\nimport { InputNode, ToneAudioNode, ToneAudioNodeOptions } from \"../core/context/ToneAudioNode\";\nimport { connectSignal } from \"./Signal\";\n\nexport type SignalOperatorOptions = ToneAudioNodeOptions;\n\n/**\n * A signal operator has an input and output and modifies the signal.\n */\nexport abstract class SignalOperator<Options extends SignalOperatorOptions> extends ToneAudioNode<Options> {\n\n\tconstructor(options?: Partial<Options>);\n\tconstructor() {\n\t\tsuper(Object.assign(optionsFromArguments(SignalOperator.getDefaults(), arguments, [\"context\"])));\n\t}\n\n\tconnect(destination: InputNode, outputNum = 0, inputNum = 0): this {\n\t\tconnectSignal(this, destination, outputNum, inputNum);\n\t\treturn this;\n\t}\n}\n","import { ToneAudioNodeOptions } from \"../core/context/ToneAudioNode\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { isArray, isFunction } from \"../core/util/TypeCheck\";\nimport { assert } from \"../core/util/Debug\";\nimport { Signal } from \"./Signal\";\nimport { SignalOperator } from \"./SignalOperator\";\n\nexport type WaveShaperMappingFn = (value: number, index?: number) => number;\n\ntype WaveShaperMapping = WaveShaperMappingFn | number[] | Float32Array;\n\ninterface WaveShaperOptions extends ToneAudioNodeOptions {\n\tmapping?: WaveShaperMapping;\n\tlength: number;\n\tcurve?: number[] | Float32Array;\n}\n\n/**\n * Wraps the native Web Audio API\n * [WaveShaperNode](http://webaudio.github.io/web-audio-api/#the-waveshapernode-interface).\n *\n * @example\n * const osc = new Tone.Oscillator().toDestination().start();\n * // multiply the output of the signal by 2 using the waveshaper's function\n * const timesTwo = new Tone.WaveShaper((val) => val * 2, 2048).connect(osc.frequency);\n * const signal = new Tone.Signal(440).connect(timesTwo);\n * @category Signal\n */\nexport class WaveShaper extends SignalOperator<WaveShaperOptions> {\n\n\treadonly name: string = \"WaveShaper\";\n\n\t/**\n\t * the waveshaper node\n\t */\n\tprivate _shaper: WaveShaperNode = this.context.createWaveShaper();\n\n\t/**\n\t * The input to the waveshaper node.\n\t */\n\tinput = this._shaper;\n\n\t/**\n\t * The output from the waveshaper node\n\t */\n\toutput = this._shaper;\n\n\t/**\n\t * @param mapping The function used to define the values.\n\t * The mapping function should take two arguments:\n\t * the first is the value at the current position\n\t * and the second is the array position.\n\t * If the argument is an array, that array will be\n\t * set as the wave shaping function. The input\n\t * signal is an AudioRange [-1, 1] value and the output\n\t * signal can take on any numerical values.\n\t *\n\t * @param bufferLen The length of the WaveShaperNode buffer.\n\t */\n\tconstructor(mapping?: WaveShaperMapping, length?: number);\n\tconstructor(options?: Partial<WaveShaperOptions>);\n\tconstructor() {\n\t\tsuper(Object.assign(optionsFromArguments(WaveShaper.getDefaults(), arguments, [\"mapping\", \"length\"])));\n\t\tconst options = optionsFromArguments(WaveShaper.getDefaults(), arguments, [\"mapping\", \"length\"]);\n\n\t\tif (isArray(options.mapping) || options.mapping instanceof Float32Array) {\n\t\t\tthis.curve = Float32Array.from(options.mapping);\n\t\t} else if (isFunction(options.mapping)) {\n\t\t\tthis.setMap(options.mapping, options.length);\n\t\t}\n\t}\n\n\tstatic getDefaults(): WaveShaperOptions {\n\t\treturn Object.assign(Signal.getDefaults(), {\n\t\t\tlength: 1024,\n\t\t});\n\t}\n\n\t/**\n\t * Uses a mapping function to set the value of the curve.\n\t * @param mapping The function used to define the values.\n\t * The mapping function take two arguments:\n\t * the first is the value at the current position\n\t * which goes from -1 to 1 over the number of elements\n\t * in the curve array. The second argument is the array position.\n\t * @example\n\t * const shaper = new Tone.WaveShaper();\n\t * // map the input signal from [-1, 1] to [0, 10]\n\t * shaper.setMap((val, index) => (val + 1) * 5);\n\t */\n\tsetMap(mapping: WaveShaperMappingFn, length = 1024): this {\n\t\tconst array = new Float32Array(length);\n\t\tfor (let i = 0, len = length; i < len; i++) {\n\t\t\tconst normalized = (i / (len - 1)) * 2 - 1;\n\t\t\tarray[i] = mapping(normalized, i);\n\t\t}\n\t\tthis.curve = array;\n\t\treturn this;\n\t}\n\n\t/**\n\t * The array to set as the waveshaper curve. For linear curves\n\t * array length does not make much difference, but for complex curves\n\t * longer arrays will provide smoother interpolation.\n\t */\n\tget curve(): Float32Array | null {\n\t\treturn this._shaper.curve;\n\t}\n\n\tset curve(mapping: Float32Array | null) {\n\t\tthis._shaper.curve = mapping;\n\t}\n\n\t/**\n\t * Specifies what type of oversampling (if any) should be used when\n\t * applying the shaping curve. Can either be \"none\", \"2x\" or \"4x\".\n\t */\n\tget oversample(): OverSampleType {\n\t\treturn this._shaper.oversample;\n\t}\n\n\tset oversample(oversampling: OverSampleType) {\n\t\tconst isOverSampleType = [\"none\", \"2x\", \"4x\"].some(str => str.includes(oversampling));\n\t\tassert(isOverSampleType, \"oversampling must be either 'none', '2x', or '4x'\");\n\t\tthis._shaper.oversample = oversampling;\n\t}\n\n\t/**\n\t * Clean up.\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._shaper.disconnect();\n\t\treturn this;\n\t}\n}\n","import { ToneAudioNodeOptions } from \"../core/context/ToneAudioNode\";\nimport { SignalOperator } from \"./SignalOperator\";\nimport { WaveShaper } from \"./WaveShaper\";\n\n/**\n * AudioToGain converts an input in AudioRange [-1,1] to NormalRange [0,1].\n * See [[GainToAudio]].\n * @category Signal\n */\nexport class AudioToGain extends SignalOperator<ToneAudioNodeOptions> {\n\n\treadonly name: string = \"AudioToGain\";\n\n\t/**\n\t * The node which converts the audio ranges\n\t */\n\tprivate _norm = new WaveShaper({\n\t\tcontext: this.context,\n\t\tmapping: x => (x + 1) / 2,\n\t});\n\n\t/**\n\t * The AudioRange input [-1, 1]\n\t */\n\tinput = this._norm;\n\n\t/**\n\t * The GainRange output [0, 1]\n\t */\n\toutput = this._norm;\n\n\t/**\n\t * clean up\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._norm.dispose();\n\t\treturn this;\n\t}\n}\n","import { Gain } from \"../core/context/Gain\";\nimport { Param } from \"../core/context/Param\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { Signal, SignalOptions } from \"./Signal\";\nimport { InputNode, OutputNode } from \"../core/context/ToneAudioNode\";\n\n/**\n * Multiply two incoming signals. Or, if a number is given in the constructor,\n * multiplies the incoming signal by that value.\n *\n * @example\n * // multiply two signals\n * const mult = new Tone.Multiply();\n * const sigA = new Tone.Signal(3);\n * const sigB = new Tone.Signal(4);\n * sigA.connect(mult);\n * sigB.connect(mult.factor);\n * // output of mult is 12.\n * @example\n * // multiply a signal and a number\n * const mult = new Tone.Multiply(10);\n * const sig = new Tone.Signal(2).connect(mult);\n * // the output of mult is 20.\n * @category Signal\n */\nexport class Multiply<TypeName extends \"number\" | \"positive\" = \"number\"> extends Signal<TypeName> {\n\n\treadonly name: string = \"Multiply\";\n\n\t/**\n\t * Indicates if the value should be overridden on connection\n\t */\n\treadonly override = false;\n\n\t/**\n\t * the input gain node\n\t */\n\tprivate _mult: Gain;\n\n\t/**\n\t * The multiplicand input.\n\t */\n\tinput: InputNode;\n\n\t/**\n\t * The product of the input and [[factor]]\n\t */\n\toutput: OutputNode;\n\n\t/**\n\t * The multiplication factor. Can be set directly or a signal can be connected to it.\n\t */\n\tfactor: Param<TypeName>;\n\n\t/**\n\t * @param value Constant value to multiple\n\t */\n\tconstructor(value?: number);\n\tconstructor(options?: Partial<SignalOptions<TypeName>>);\n\tconstructor() {\n\t\tsuper(Object.assign(optionsFromArguments(Multiply.getDefaults(), arguments, [\"value\"])));\n\t\tconst options = optionsFromArguments(Multiply.getDefaults(), arguments, [\"value\"]);\n\n\t\tthis._mult = this.input = this.output = new Gain({\n\t\t\tcontext: this.context,\n\t\t\tminValue: options.minValue,\n\t\t\tmaxValue: options.maxValue,\n\t\t});\n\n\t\tthis.factor = this._param = this._mult.gain as unknown as Param<TypeName>;\n\t\tthis.factor.setValueAtTime(options.value, 0);\n\t}\n\n\tstatic getDefaults(): SignalOptions<any> {\n\t\treturn Object.assign(Signal.getDefaults(), {\n\t\t\tvalue: 0,\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._mult.dispose();\n\t\treturn this;\n\t}\n}\n","import { Gain } from \"../../core/context/Gain\";\nimport { Degrees, Frequency, Seconds } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { readOnly } from \"../../core/util/Interface\";\nimport { AudioToGain } from \"../../signal/AudioToGain\";\nimport { Multiply } from \"../../signal/Multiply\";\nimport { Signal } from \"../../signal/Signal\";\nimport { Source } from \"../Source\";\nimport { Oscillator } from \"./Oscillator\";\nimport {\n\tAMConstructorOptions, AMOscillatorOptions,\n\tgenerateWaveform, NonCustomOscillatorType,\n\tToneOscillatorInterface,\n\tToneOscillatorType\n} from \"./OscillatorInterface\";\n\nexport { AMOscillatorOptions } from \"./OscillatorInterface\";\n\n/**\n * An amplitude modulated oscillator node. It is implemented with\n * two oscillators, one which modulators the other's amplitude\n * through a gain node.\n * ```\n * +-------------+ +----------+\n * | Carrier Osc +>------> GainNode |\n * +-------------+ | +--->Output\n * +---> gain |\n * +---------------+ | +----------+\n * | Modulator Osc +>---+\n * +---------------+\n * ```\n * @example\n * return Tone.Offline(() => {\n * \tconst amOsc = new Tone.AMOscillator(30, \"sine\", \"square\").toDestination().start();\n * }, 0.2, 1);\n * @category Source\n */\nexport class AMOscillator extends Source<AMOscillatorOptions> implements ToneOscillatorInterface {\n\n\treadonly name: string = \"AMOscillator\";\n\n\t/**\n\t * The carrier oscillator\n\t */\n\tprivate _carrier: Oscillator;\n\n\treadonly frequency: Signal<\"frequency\">;\n\treadonly detune: Signal<\"cents\">;\n\n\t/**\n\t * The modulating oscillator\n\t */\n\tprivate _modulator: Oscillator;\n\n\t/**\n\t * convert the -1,1 output to 0,1\n\t */\n\tprivate _modulationScale = new AudioToGain({ context: this.context });\n\n\t/**\n\t * Harmonicity is the frequency ratio between the carrier and the modulator oscillators.\n\t * A harmonicity of 1 gives both oscillators the same frequency.\n\t * Harmonicity = 2 means a change of an octave.\n\t * @example\n\t * const amOsc = new Tone.AMOscillator(\"D2\").toDestination().start();\n\t * Tone.Transport.scheduleRepeat(time => {\n\t * \tamOsc.harmonicity.setValueAtTime(1, time);\n\t * \tamOsc.harmonicity.setValueAtTime(0.5, time + 0.5);\n\t * \tamOsc.harmonicity.setValueAtTime(1.5, time + 1);\n\t * \tamOsc.harmonicity.setValueAtTime(1, time + 2);\n\t * \tamOsc.harmonicity.linearRampToValueAtTime(2, time + 4);\n\t * }, 4);\n\t * Tone.Transport.start();\n\t */\n\treadonly harmonicity: Signal<\"positive\">;\n\n\t/**\n\t * the node where the modulation happens\n\t */\n\tprivate _modulationNode = new Gain({\n\t\tcontext: this.context,\n\t});\n\n\t/**\n\t * @param frequency The starting frequency of the oscillator.\n\t * @param type The type of the carrier oscillator.\n\t * @param modulationType The type of the modulator oscillator.\n\t */\n\tconstructor(frequency?: Frequency, type?: ToneOscillatorType, modulationType?: ToneOscillatorType);\n\tconstructor(options?: Partial<AMConstructorOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(AMOscillator.getDefaults(), arguments, [\"frequency\", \"type\", \"modulationType\"]));\n\t\tconst options = optionsFromArguments(AMOscillator.getDefaults(), arguments, [\"frequency\", \"type\", \"modulationType\"]);\n\n\t\tthis._carrier = new Oscillator({\n\t\t\tcontext: this.context,\n\t\t\tdetune: options.detune,\n\t\t\tfrequency: options.frequency,\n\t\t\tonstop: () => this.onstop(this),\n\t\t\tphase: options.phase,\n\t\t\ttype: options.type,\n\t\t} as OscillatorOptions);\n\t\tthis.frequency = this._carrier.frequency,\n\t\tthis.detune = this._carrier.detune;\n\n\t\tthis._modulator = new Oscillator({\n\t\t\tcontext: this.context,\n\t\t\tphase: options.phase,\n\t\t\ttype: options.modulationType,\n\t\t} as OscillatorOptions);\n\n\t\tthis.harmonicity = new Multiply({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"positive\",\n\t\t\tvalue: options.harmonicity,\n\t\t});\n\n\t\t// connections\n\t\tthis.frequency.chain(this.harmonicity, this._modulator.frequency);\n\t\tthis._modulator.chain(this._modulationScale, this._modulationNode.gain);\n\t\tthis._carrier.chain(this._modulationNode, this.output);\n\n\t\treadOnly(this, [\"frequency\", \"detune\", \"harmonicity\"]);\n\t}\n\n\tstatic getDefaults(): AMOscillatorOptions {\n\t\treturn Object.assign(Oscillator.getDefaults(), {\n\t\t\tharmonicity: 1,\n\t\t\tmodulationType: \"square\" as NonCustomOscillatorType,\n\t\t});\n\t}\n\n\t/**\n\t * start the oscillator\n\t */\n\tprotected _start(time: Seconds): void {\n\t\tthis._modulator.start(time);\n\t\tthis._carrier.start(time);\n\t}\n\n\t/**\n\t * stop the oscillator\n\t */\n\tprotected _stop(time: Seconds): void {\n\t\tthis._modulator.stop(time);\n\t\tthis._carrier.stop(time);\n\t}\n\n\tprotected _restart(time: Seconds): void {\n\t\tthis._modulator.restart(time);\n\t\tthis._carrier.restart(time);\n\t}\n\n\t/**\n\t * The type of the carrier oscillator\n\t */\n\tget type(): ToneOscillatorType {\n\t\treturn this._carrier.type;\n\t}\n\tset type(type: ToneOscillatorType) {\n\t\tthis._carrier.type = type;\n\t}\n\n\tget baseType(): OscillatorType {\n\t\treturn this._carrier.baseType;\n\t}\n\tset baseType(baseType: OscillatorType) {\n\t\tthis._carrier.baseType = baseType;\n\t}\n\n\tget partialCount(): number {\n\t\treturn this._carrier.partialCount;\n\t}\n\tset partialCount(partialCount: number) {\n\t\tthis._carrier.partialCount = partialCount;\n\t}\n\n\t/**\n\t * The type of the modulator oscillator\n\t */\n\tget modulationType(): ToneOscillatorType {\n\t\treturn this._modulator.type;\n\t}\n\tset modulationType(type: ToneOscillatorType) {\n\t\tthis._modulator.type = type;\n\t}\n\n\tget phase(): Degrees {\n\t\treturn this._carrier.phase;\n\t}\n\tset phase(phase: Degrees) {\n\t\tthis._carrier.phase = phase;\n\t\tthis._modulator.phase = phase;\n\t}\n\n\tget partials(): number[] {\n\t\treturn this._carrier.partials;\n\t}\n\tset partials(partials: number[]) {\n\t\tthis._carrier.partials = partials;\n\t}\n\n\tasync asArray(length = 1024): Promise<Float32Array> {\n\t\treturn generateWaveform(this, length);\n\t}\n\n\t/**\n\t * Clean up.\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.frequency.dispose();\n\t\tthis.detune.dispose();\n\t\tthis.harmonicity.dispose();\n\t\tthis._carrier.dispose();\n\t\tthis._modulator.dispose();\n\t\tthis._modulationNode.dispose();\n\t\tthis._modulationScale.dispose();\n\t\treturn this;\n\t}\n}\n","import { Gain } from \"../../core/context/Gain\";\nimport { Degrees, Frequency, Seconds, Time } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { readOnly } from \"../../core/util/Interface\";\nimport { Multiply } from \"../../signal/Multiply\";\nimport { Signal } from \"../../signal/Signal\";\nimport { Source } from \"../Source\";\nimport { Oscillator } from \"./Oscillator\";\nimport {\n\tFMConstructorOptions, FMOscillatorOptions,\n\tgenerateWaveform, NonCustomOscillatorType, ToneOscillatorInterface, ToneOscillatorType\n} from \"./OscillatorInterface\";\n\nexport { FMOscillatorOptions } from \"./OscillatorInterface\";\n/**\n * FMOscillator implements a frequency modulation synthesis\n * ```\n * +-------------+\n * +---------------+ +-------------+ | Carrier Osc |\n * | Modulator Osc +>-------> GainNode | | +--->Output\n * +---------------+ | +>----> frequency |\n * +--> gain | +-------------+\n * | +-------------+\n * +-----------------+ |\n * | modulationIndex +>--+\n * +-----------------+\n * ```\n *\n * @example\n * return Tone.Offline(() => {\n * \tconst fmOsc = new Tone.FMOscillator({\n * \t\tfrequency: 200,\n * \t\ttype: \"square\",\n * \t\tmodulationType: \"triangle\",\n * \t\tharmonicity: 0.2,\n * \t\tmodulationIndex: 3\n * \t}).toDestination().start();\n * }, 0.1, 1);\n * @category Source\n */\nexport class FMOscillator extends Source<FMOscillatorOptions> implements ToneOscillatorInterface {\n\n\treadonly name: string = \"FMOscillator\";\n\n\t/**\n\t * The carrier oscillator\n\t */\n\tprivate _carrier: Oscillator;\n\n\treadonly frequency: Signal<\"frequency\">;\n\treadonly detune: Signal<\"cents\">;\n\n\t/**\n\t * The modulating oscillator\n\t */\n\tprivate _modulator: Oscillator;\n\n\t/**\n\t * Harmonicity is the frequency ratio between the carrier and the modulator oscillators.\n\t * A harmonicity of 1 gives both oscillators the same frequency.\n\t * Harmonicity = 2 means a change of an octave.\n\t * @example\n\t * const fmOsc = new Tone.FMOscillator(\"D2\").toDestination().start();\n\t * // pitch the modulator an octave below carrier\n\t * fmOsc.harmonicity.value = 0.5;\n\t */\n\treadonly harmonicity: Signal<\"positive\">;\n\n\t/**\n\t * The modulation index which is in essence the depth or amount of the modulation. In other terms it is the\n\t * ratio of the frequency of the modulating signal (mf) to the amplitude of the\n\t * modulating signal (ma) -- as in ma/mf.\n\t */\n\treadonly modulationIndex: Signal<\"positive\">;\n\n\t/**\n\t * the node where the modulation happens\n\t */\n\tprivate _modulationNode: Gain = new Gain({\n\t\tcontext: this.context,\n\t\tgain: 0,\n\t});\n\n\t/**\n\t * @param frequency The starting frequency of the oscillator.\n\t * @param type The type of the carrier oscillator.\n\t * @param modulationType The type of the modulator oscillator.\n\t */\n\tconstructor(frequency?: Frequency, type?: ToneOscillatorType, modulationType?: ToneOscillatorType);\n\tconstructor(options?: Partial<FMConstructorOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(FMOscillator.getDefaults(), arguments, [\"frequency\", \"type\", \"modulationType\"]));\n\t\tconst options = optionsFromArguments(FMOscillator.getDefaults(), arguments, [\"frequency\", \"type\", \"modulationType\"]);\n\n\t\tthis._carrier = new Oscillator({\n\t\t\tcontext: this.context,\n\t\t\tdetune: options.detune,\n\t\t\tfrequency: 0,\n\t\t\tonstop: () => this.onstop(this),\n\t\t\tphase: options.phase,\n\t\t\ttype: options.type,\n\t\t} as OscillatorOptions);\n\n\t\tthis.detune = this._carrier.detune;\n\n\t\tthis.frequency = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"frequency\",\n\t\t\tvalue: options.frequency,\n\t\t});\n\n\t\tthis._modulator = new Oscillator({\n\t\t\tcontext: this.context,\n\t\t\tphase: options.phase,\n\t\t\ttype: options.modulationType,\n\t\t} as OscillatorOptions);\n\n\t\tthis.harmonicity = new Multiply({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"positive\",\n\t\t\tvalue: options.harmonicity,\n\t\t});\n\n\t\tthis.modulationIndex = new Multiply({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"positive\",\n\t\t\tvalue: options.modulationIndex,\n\t\t});\n\n\t\t// connections\n\t\tthis.frequency.connect(this._carrier.frequency);\n\t\tthis.frequency.chain(this.harmonicity, this._modulator.frequency);\n\t\tthis.frequency.chain(this.modulationIndex, this._modulationNode);\n\t\tthis._modulator.connect(this._modulationNode.gain);\n\t\tthis._modulationNode.connect(this._carrier.frequency);\n\t\tthis._carrier.connect(this.output);\n\t\tthis.detune.connect(this._modulator.detune);\n\n\t\treadOnly(this, [\"modulationIndex\", \"frequency\", \"detune\", \"harmonicity\"]);\n\t}\n\n\tstatic getDefaults(): FMOscillatorOptions {\n\t\treturn Object.assign(Oscillator.getDefaults(), {\n\t\t\tharmonicity: 1,\n\t\t\tmodulationIndex: 2,\n\t\t\tmodulationType: \"square\" as NonCustomOscillatorType,\n\t\t});\n\t}\n\n\t/**\n\t * start the oscillator\n\t */\n\tprotected _start(time: Time): void {\n\t\tthis._modulator.start(time);\n\t\tthis._carrier.start(time);\n\t}\n\n\t/**\n\t * stop the oscillator\n\t */\n\tprotected _stop(time: Time): void {\n\t\tthis._modulator.stop(time);\n\t\tthis._carrier.stop(time);\n\t}\n\n\tprotected _restart(time: Seconds): this {\n\t\tthis._modulator.restart(time);\n\t\tthis._carrier.restart(time);\n\t\treturn this;\n\t}\n\n\tget type(): ToneOscillatorType {\n\t\treturn this._carrier.type;\n\t}\n\tset type(type: ToneOscillatorType) {\n\t\tthis._carrier.type = type;\n\t}\n\n\tget baseType(): OscillatorType {\n\t\treturn this._carrier.baseType;\n\t}\n\tset baseType(baseType: OscillatorType) {\n\t\tthis._carrier.baseType = baseType;\n\t}\n\n\tget partialCount(): number {\n\t\treturn this._carrier.partialCount;\n\t}\n\tset partialCount(partialCount: number) {\n\t\tthis._carrier.partialCount = partialCount;\n\t}\n\n\t/**\n\t * The type of the modulator oscillator\n\t */\n\tget modulationType(): ToneOscillatorType {\n\t\treturn this._modulator.type;\n\t}\n\tset modulationType(type: ToneOscillatorType) {\n\t\tthis._modulator.type = type;\n\t}\n\n\tget phase(): Degrees {\n\t\treturn this._carrier.phase;\n\t}\n\tset phase(phase: Degrees) {\n\t\tthis._carrier.phase = phase;\n\t\tthis._modulator.phase = phase;\n\t}\n\n\tget partials(): number[] {\n\t\treturn this._carrier.partials;\n\t}\n\tset partials(partials: number[]) {\n\t\tthis._carrier.partials = partials;\n\t}\n\n\tasync asArray(length = 1024): Promise<Float32Array> {\n\t\treturn generateWaveform(this, length);\n\t}\n\n\t/**\n\t * Clean up.\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.frequency.dispose();\n\t\tthis.harmonicity.dispose();\n\t\tthis._carrier.dispose();\n\t\tthis._modulator.dispose();\n\t\tthis._modulationNode.dispose();\n\t\tthis.modulationIndex.dispose();\n\t\treturn this;\n\t}\n}\n","import { Gain } from \"../../core/context/Gain\";\nimport { AudioRange, Degrees, Frequency, Seconds, Time } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { readOnly } from \"../../core/util/Interface\";\nimport { Signal } from \"../../signal/Signal\";\nimport { WaveShaper } from \"../../signal/WaveShaper\";\nimport { Source } from \"../Source\";\nimport { Oscillator } from \"./Oscillator\";\nimport { generateWaveform, PulseOscillatorOptions, ToneOscillatorInterface } from \"./OscillatorInterface\";\n\nexport { PulseOscillatorOptions } from \"./OscillatorInterface\";\n\n/**\n * PulseOscillator is an oscillator with control over pulse width,\n * also known as the duty cycle. At 50% duty cycle (width = 0) the wave is\n * a square wave.\n * [Read more](https://wigglewave.wordpress.com/2014/08/16/pulse-waveforms-and-harmonics/).\n * ```\n * width = -0.25 width = 0.0 width = 0.25\n *\n * +-----+ +-------+ + +-------+ +-+\n * | | | | | | |\n * | | | | | | |\n * +-+ +-------+ + +-------+ +-----+\n *\n *\n * width = -0.5 width = 0.5\n *\n * +---+ +-------+ +---+\n * | | | |\n * | | | |\n * +---+ +-------+ +---+\n *\n *\n * width = -0.75 width = 0.75\n *\n * +-+ +-------+ +-----+\n * | | | |\n * | | | |\n * +-----+ +-------+ +-+\n * ```\n * @example\n * return Tone.Offline(() => {\n * \tconst pulse = new Tone.PulseOscillator(50, 0.4).toDestination().start();\n * }, 0.1, 1);\n * @category Source\n */\nexport class PulseOscillator extends Source<PulseOscillatorOptions> implements ToneOscillatorInterface {\n\n\treadonly name: string = \"PulseOscillator\";\n\n\t/**\n\t * The width of the pulse.\n\t * @example\n\t * return Tone.Offline(() => {\n\t * \tconst pulse = new Tone.PulseOscillator(20, 0.8).toDestination().start();\n\t * }, 0.1, 1);\n\t */\n\treadonly width: Signal<\"audioRange\">;\n\n\t/**\n\t * gate the width amount\n\t */\n\tprivate _widthGate: Gain = new Gain({\n\t\tcontext: this.context,\n\t\tgain: 0,\n\t});\n\n\t/**\n\t * the sawtooth oscillator\n\t */\n\tprivate _triangle: Oscillator;\n\n\t/**\n\t * The frequency control.\n\t */\n\treadonly frequency: Signal<\"frequency\">;\n\n\t/**\n\t * The detune in cents.\n\t */\n\treadonly detune: Signal<\"cents\">;\n\n\t/**\n\t * Threshold the signal to turn it into a square\n\t */\n\tprivate _thresh = new WaveShaper({\n\t\tcontext: this.context,\n\t\tmapping: val => val <= 0 ? -1 : 1,\n\t});\n\n\t/**\n\t * @param frequency The frequency of the oscillator\n\t * @param width The width of the pulse\n\t */\n\tconstructor(frequency?: Frequency, width?: AudioRange);\n\tconstructor(options?: Partial<PulseOscillatorOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(PulseOscillator.getDefaults(), arguments, [\"frequency\", \"width\"]));\n\t\tconst options = optionsFromArguments(PulseOscillator.getDefaults(), arguments, [\"frequency\", \"width\"]);\n\n\t\tthis.width = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"audioRange\",\n\t\t\tvalue: options.width,\n\t\t});\n\n\t\tthis._triangle = new Oscillator({\n\t\t\tcontext: this.context,\n\t\t\tdetune: options.detune,\n\t\t\tfrequency: options.frequency,\n\t\t\tonstop: () => this.onstop(this),\n\t\t\tphase: options.phase,\n\t\t\ttype: \"triangle\",\n\t\t});\n\t\tthis.frequency = this._triangle.frequency;\n\t\tthis.detune = this._triangle.detune;\n\n\t\t// connections\n\t\tthis._triangle.chain(this._thresh, this.output);\n\t\tthis.width.chain(this._widthGate, this._thresh);\n\t\treadOnly(this, [\"width\", \"frequency\", \"detune\"]);\n\t}\n\n\tstatic getDefaults(): PulseOscillatorOptions {\n\t\treturn Object.assign(Source.getDefaults(), {\n\t\t\tdetune: 0,\n\t\t\tfrequency: 440,\n\t\t\tphase: 0,\n\t\t\ttype: \"pulse\" as \"pulse\",\n\t\t\twidth: 0.2,\n\t\t});\n\t}\n\n\t/**\n\t * start the oscillator\n\t */\n\tprotected _start(time: Time): void {\n\t\ttime = this.toSeconds(time);\n\t\tthis._triangle.start(time);\n\t\tthis._widthGate.gain.setValueAtTime(1, time);\n\t}\n\n\t/**\n\t * stop the oscillator\n\t */\n\tprotected _stop(time: Time): void {\n\t\ttime = this.toSeconds(time);\n\t\tthis._triangle.stop(time);\n\t\t// the width is still connected to the output.\n\t\t// that needs to be stopped also\n\t\tthis._widthGate.gain.cancelScheduledValues(time);\n\t\tthis._widthGate.gain.setValueAtTime(0, time);\n\t}\n\n\tprotected _restart(time: Seconds): void {\n\t\tthis._triangle.restart(time);\n\t\tthis._widthGate.gain.cancelScheduledValues(time);\n\t\tthis._widthGate.gain.setValueAtTime(1, time);\n\t}\n\n\t/**\n\t * The phase of the oscillator in degrees.\n\t */\n\tget phase(): Degrees {\n\t\treturn this._triangle.phase;\n\t}\n\tset phase(phase: Degrees) {\n\t\tthis._triangle.phase = phase;\n\t}\n\n\t/**\n\t * The type of the oscillator. Always returns \"pulse\".\n\t */\n\tget type(): \"pulse\" {\n\t\treturn \"pulse\";\n\t}\n\n\t/**\n\t * The baseType of the oscillator. Always returns \"pulse\".\n\t */\n\tget baseType(): \"pulse\" {\n\t\treturn \"pulse\";\n\t}\n\n\t/**\n\t * The partials of the waveform. Cannot set partials for this waveform type\n\t */\n\tget partials(): number[] {\n\t\treturn [];\n\t}\n\n\t/**\n\t * No partials for this waveform type.\n\t */\n\tget partialCount(): number {\n\t\treturn 0;\n\t}\n\n\t/**\n\t * *Internal use* The carrier oscillator type is fed through the \n\t * waveshaper node to create the pulse. Using different carrier oscillators\n\t * changes oscillator's behavior. \n\t */\n\tset carrierType(type: \"triangle\" | \"sine\") {\n\t\tthis._triangle.type = type;\n\t}\n\n\tasync asArray(length = 1024): Promise<Float32Array> {\n\t\treturn generateWaveform(this, length);\n\t}\n\n\t/**\n\t * Clean up method.\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._triangle.dispose();\n\t\tthis.width.dispose();\n\t\tthis._widthGate.dispose();\n\t\tthis._thresh.dispose();\n\t\treturn this;\n\t}\n}\n","import { Cents, Degrees, Frequency, Seconds, Time } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { noOp, readOnly } from \"../../core/util/Interface\";\nimport { Signal } from \"../../signal/Signal\";\nimport { Source } from \"../Source\";\nimport { Oscillator } from \"./Oscillator\";\nimport {\n\tFatConstructorOptions, FatOscillatorOptions,\n\tgenerateWaveform, NonCustomOscillatorType, ToneOscillatorInterface, ToneOscillatorType\n} from \"./OscillatorInterface\";\nimport { assertRange } from \"../../core/util/Debug\";\n\nexport { FatOscillatorOptions } from \"./OscillatorInterface\";\n\n/**\n * FatOscillator is an array of oscillators with detune spread between the oscillators\n * @example\n * const fatOsc = new Tone.FatOscillator(\"Ab3\", \"sawtooth\", 40).toDestination().start();\n * @category Source\n */\nexport class FatOscillator extends Source<FatOscillatorOptions> implements ToneOscillatorInterface {\n\n\treadonly name: string = \"FatOscillator\";\n\n\treadonly frequency: Signal<\"frequency\">;\n\treadonly detune: Signal<\"cents\">;\n\n\t/**\n\t * The array of oscillators\n\t */\n\tprivate _oscillators: Oscillator[] = [];\n\n\t/**\n\t * The total spread of the oscillators\n\t */\n\tprivate _spread: Cents;\n\n\t/**\n\t * The type of the oscillator\n\t */\n\tprivate _type: ToneOscillatorType;\n\n\t/**\n\t * The phase of the oscillators\n\t */\n\tprivate _phase: Degrees;\n\n\t/**\n\t * The partials array\n\t */\n\tprivate _partials: number[];\n\n\t/**\n\t * The number of partials to use\n\t */\n\tprivate _partialCount: number;\n\n\t/**\n\t * @param frequency The oscillator's frequency.\n\t * @param type The type of the oscillator.\n\t * @param spread The detune spread between the oscillators.\n\t */\n\tconstructor(frequency?: Frequency, type?: ToneOscillatorType, spread?: Cents);\n\tconstructor(options?: Partial<FatConstructorOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(FatOscillator.getDefaults(), arguments, [\"frequency\", \"type\", \"spread\"]));\n\t\tconst options = optionsFromArguments(FatOscillator.getDefaults(), arguments, [\"frequency\", \"type\", \"spread\"]);\n\n\t\tthis.frequency = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"frequency\",\n\t\t\tvalue: options.frequency,\n\t\t});\n\t\tthis.detune = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"cents\",\n\t\t\tvalue: options.detune,\n\t\t});\n\n\t\tthis._spread = options.spread;\n\t\tthis._type = options.type;\n\t\tthis._phase = options.phase;\n\t\tthis._partials = options.partials;\n\t\tthis._partialCount = options.partialCount;\n\n\t\t// set the count initially\n\t\tthis.count = options.count;\n\n\t\treadOnly(this, [\"frequency\", \"detune\"]);\n\t}\n\n\tstatic getDefaults(): FatOscillatorOptions {\n\t\treturn Object.assign(Oscillator.getDefaults(), {\n\t\t\tcount: 3,\n\t\t\tspread: 20,\n\t\t\ttype: \"sawtooth\",\n\t\t});\n\t}\n\n\t/**\n\t * start the oscillator\n\t */\n\tprotected _start(time: Time): void {\n\t\ttime = this.toSeconds(time);\n\t\tthis._forEach(osc => osc.start(time));\n\t}\n\n\t/**\n\t * stop the oscillator\n\t */\n\tprotected _stop(time: Time): void {\n\t\ttime = this.toSeconds(time);\n\t\tthis._forEach(osc => osc.stop(time));\n\t}\n\n\tprotected _restart(time: Seconds): void {\n\t\tthis._forEach(osc => osc.restart(time));\n\t}\n\n\t/**\n\t * Iterate over all of the oscillators\n\t */\n\tprivate _forEach(iterator: (osc: Oscillator, index: number) => void): void {\n\t\tfor (let i = 0; i < this._oscillators.length; i++) {\n\t\t\titerator(this._oscillators[i], i);\n\t\t}\n\t}\n\n\t/**\n\t * The type of the oscillator\n\t */\n\tget type(): ToneOscillatorType {\n\t\treturn this._type;\n\t}\n\tset type(type: ToneOscillatorType) {\n\t\tthis._type = type;\n\t\tthis._forEach(osc => osc.type = type);\n\t}\n\n\t/**\n\t * The detune spread between the oscillators. If \"count\" is\n\t * set to 3 oscillators and the \"spread\" is set to 40,\n\t * the three oscillators would be detuned like this: [-20, 0, 20]\n\t * for a total detune spread of 40 cents.\n\t * @example\n\t * const fatOsc = new Tone.FatOscillator().toDestination().start();\n\t * fatOsc.spread = 70;\n\t */\n\tget spread(): Cents {\n\t\treturn this._spread;\n\t}\n\tset spread(spread: Cents) {\n\t\tthis._spread = spread;\n\t\tif (this._oscillators.length > 1) {\n\t\t\tconst start = -spread / 2;\n\t\t\tconst step = spread / (this._oscillators.length - 1);\n\t\t\tthis._forEach((osc, i) => osc.detune.value = start + step * i);\n\t\t}\n\t}\n\n\t/**\n\t * The number of detuned oscillators. Must be an integer greater than 1.\n\t * @example\n\t * const fatOsc = new Tone.FatOscillator(\"C#3\", \"sawtooth\").toDestination().start();\n\t * // use 4 sawtooth oscillators\n\t * fatOsc.count = 4;\n\t */\n\tget count(): number {\n\t\treturn this._oscillators.length;\n\t}\n\tset count(count: number) {\n\t\tassertRange(count, 1);\n\t\tif (this._oscillators.length !== count) {\n\t\t\t// dispose the previous oscillators\n\t\t\tthis._forEach(osc => osc.dispose());\n\t\t\tthis._oscillators = [];\n\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\tconst osc = new Oscillator({\n\t\t\t\t\tcontext: this.context,\n\t\t\t\t\tvolume: -6 - count * 1.1,\n\t\t\t\t\ttype: this._type as NonCustomOscillatorType,\n\t\t\t\t\tphase: this._phase + (i / count) * 360,\n\t\t\t\t\tpartialCount: this._partialCount,\n\t\t\t\t\tonstop: i === 0 ? () => this.onstop(this) : noOp,\n\t\t\t\t});\n\t\t\t\tif (this.type === \"custom\") {\n\t\t\t\t\tosc.partials = this._partials;\n\t\t\t\t}\n\t\t\t\tthis.frequency.connect(osc.frequency);\n\t\t\t\tthis.detune.connect(osc.detune);\n\t\t\t\tosc.detune.overridden = false;\n\t\t\t\tosc.connect(this.output);\n\t\t\t\tthis._oscillators[i] = osc;\n\t\t\t}\n\t\t\t// set the spread\n\t\t\tthis.spread = this._spread;\n\t\t\tif (this.state === \"started\") {\n\t\t\t\tthis._forEach(osc => osc.start());\n\t\t\t}\n\t\t}\n\t}\n\n\tget phase(): Degrees {\n\t\treturn this._phase;\n\t}\n\tset phase(phase: Degrees) {\n\t\tthis._phase = phase;\n\t\tthis._forEach((osc, i) => osc.phase = this._phase + (i / this.count) * 360);\n\t}\n\n\tget baseType(): OscillatorType {\n\t\treturn this._oscillators[0].baseType;\n\t}\n\tset baseType(baseType: OscillatorType) {\n\t\tthis._forEach(osc => osc.baseType = baseType);\n\t\tthis._type = this._oscillators[0].type;\n\t}\n\n\tget partials(): number[] {\n\t\treturn this._oscillators[0].partials;\n\t}\n\tset partials(partials: number[]) {\n\t\tthis._partials = partials;\n\t\tthis._partialCount = this._partials.length;\n\t\tif (partials.length) {\n\t\t\tthis._type = \"custom\";\n\t\t\tthis._forEach(osc => osc.partials = partials);\n\t\t}\n\t}\n\n\tget partialCount(): number {\n\t\treturn this._oscillators[0].partialCount;\n\t}\n\tset partialCount(partialCount: number) {\n\t\tthis._partialCount = partialCount;\n\t\tthis._forEach(osc => osc.partialCount = partialCount);\n\t\tthis._type = this._oscillators[0].type;\n\t}\n\n\tasync asArray(length = 1024): Promise<Float32Array> {\n\t\treturn generateWaveform(this, length);\n\t}\n\n\t/**\n\t * Clean up.\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.frequency.dispose();\n\t\tthis.detune.dispose();\n\t\tthis._forEach(osc => osc.dispose());\n\t\treturn this;\n\t}\n}\n","import { Degrees, Frequency, Seconds, Time } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { readOnly } from \"../../core/util/Interface\";\nimport { Multiply } from \"../../signal/Multiply\";\nimport { Signal } from \"../../signal/Signal\";\nimport { Source } from \"../Source\";\nimport { Oscillator } from \"./Oscillator\";\nimport { generateWaveform, PWMOscillatorOptions, ToneOscillatorInterface } from \"./OscillatorInterface\";\nimport { PulseOscillator } from \"./PulseOscillator\";\n\nexport { PWMOscillatorOptions } from \"./OscillatorInterface\";\n\n/**\n * PWMOscillator modulates the width of a Tone.PulseOscillator\n * at the modulationFrequency. This has the effect of continuously\n * changing the timbre of the oscillator by altering the harmonics\n * generated.\n * @example\n * return Tone.Offline(() => {\n * \tconst pwm = new Tone.PWMOscillator(60, 0.3).toDestination().start();\n * }, 0.1, 1);\n * @category Source\n */\nexport class PWMOscillator extends Source<PWMOscillatorOptions> implements ToneOscillatorInterface {\n\n\treadonly name: string = \"PWMOscillator\";\n\n\treadonly sourceType = \"pwm\";\n\n\t/**\n\t * the pulse oscillator\n\t */\n\tprivate _pulse: PulseOscillator;\n\t/**\n\t * the modulator\n\t */\n\tprivate _modulator: Oscillator;\n\n\t/**\n\t * Scale the oscillator so it doesn't go silent\n\t * at the extreme values.\n\t */\n\tprivate _scale: Multiply = new Multiply({\n\t\tcontext: this.context,\n\t\tvalue: 2,\n\t});\n\n\t/**\n\t * The frequency control.\n\t */\n\treadonly frequency: Signal<\"frequency\">;\n\n\t/**\n\t * The detune of the oscillator.\n\t */\n\treadonly detune: Signal<\"cents\">;\n\n\t/**\n\t * The width modulation rate of the oscillator.\n\t * @example\n\t * return Tone.Offline(() => {\n\t * \tconst osc = new Tone.PWMOscillator(20, 2).toDestination().start();\n\t * }, 0.1, 1);\n\t */\n\treadonly modulationFrequency: Signal<\"frequency\">;\n\n\t/**\n\t * @param {Frequency} frequency The starting frequency of the oscillator.\n\t * @param {Frequency} modulationFrequency The modulation frequency of the width of the pulse.\n\t */\n\tconstructor(frequency?: Frequency, modulationFrequency?: Frequency);\n\tconstructor(options?: Partial<PWMOscillatorOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(PWMOscillator.getDefaults(), arguments, [\"frequency\", \"modulationFrequency\"]));\n\t\tconst options = optionsFromArguments(PWMOscillator.getDefaults(), arguments, [\"frequency\", \"modulationFrequency\"]);\n\n\t\tthis._pulse = new PulseOscillator({\n\t\t\tcontext: this.context,\n\t\t\tfrequency: options.modulationFrequency,\n\t\t});\n\t\t// change the pulse oscillator type\n\t\tthis._pulse.carrierType = \"sine\";\n\n\t\tthis.modulationFrequency = this._pulse.frequency;\n\n\t\tthis._modulator = new Oscillator({\n\t\t\tcontext: this.context,\n\t\t\tdetune: options.detune,\n\t\t\tfrequency: options.frequency,\n\t\t\tonstop: () => this.onstop(this),\n\t\t\tphase: options.phase,\n\t\t});\n\n\t\tthis.frequency = this._modulator.frequency;\n\t\tthis.detune = this._modulator.detune;\n\n\t\t// connections\n\t\tthis._modulator.chain(this._scale, this._pulse.width);\n\t\tthis._pulse.connect(this.output);\n\t\treadOnly(this, [\"modulationFrequency\", \"frequency\", \"detune\"]);\n\t}\n\n\tstatic getDefaults(): PWMOscillatorOptions {\n\t\treturn Object.assign(Source.getDefaults(), {\n\t\t\tdetune: 0,\n\t\t\tfrequency: 440,\n\t\t\tmodulationFrequency: 0.4,\n\t\t\tphase: 0,\n\t\t\ttype: \"pwm\" as \"pwm\",\n\t\t});\n\t}\n\t/**\n\t * start the oscillator\n\t */\n\tprotected _start(time: Time): void {\n\t\ttime = this.toSeconds(time);\n\t\tthis._modulator.start(time);\n\t\tthis._pulse.start(time);\n\t}\n\n\t/**\n\t * stop the oscillator\n\t */\n\tprotected _stop(time: Time): void {\n\t\ttime = this.toSeconds(time);\n\t\tthis._modulator.stop(time);\n\t\tthis._pulse.stop(time);\n\t}\n\n\t/**\n\t * restart the oscillator\n\t */\n\tprotected _restart(time: Seconds): void {\n\t\tthis._modulator.restart(time);\n\t\tthis._pulse.restart(time);\n\t}\n\n\t/**\n\t * The type of the oscillator. Always returns \"pwm\".\n\t */\n\tget type(): \"pwm\" {\n\t\treturn \"pwm\";\n\t}\n\n\t/**\n\t * The baseType of the oscillator. Always returns \"pwm\".\n\t */\n\tget baseType(): \"pwm\" {\n\t\treturn \"pwm\";\n\t}\n\n\t/**\n\t * The partials of the waveform. Cannot set partials for this waveform type\n\t */\n\tget partials(): number[] {\n\t\treturn [];\n\t}\n\n\t/**\n\t * No partials for this waveform type.\n\t */\n\tget partialCount(): number {\n\t\treturn 0;\n\t}\n\n\t/**\n\t * The phase of the oscillator in degrees.\n\t */\n\tget phase(): Degrees {\n\t\treturn this._modulator.phase;\n\t}\n\tset phase(phase: Degrees) {\n\t\tthis._modulator.phase = phase;\n\t}\n\n\tasync asArray(length = 1024): Promise<Float32Array> {\n\t\treturn generateWaveform(this, length);\n\t}\n\n\t/**\n\t * Clean up.\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._pulse.dispose();\n\t\tthis._scale.dispose();\n\t\tthis._modulator.dispose();\n\t\treturn this;\n\t}\n}\n","import { Cents, Degrees, Frequency, Seconds, Time } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { readOnly } from \"../../core/util/Interface\";\nimport { isNumber, isString } from \"../../core/util/TypeCheck\";\nimport { Signal } from \"../../signal/Signal\";\nimport { Source } from \"../Source\";\nimport { AMOscillator } from \"./AMOscillator\";\nimport { FatOscillator } from \"./FatOscillator\";\nimport { FMOscillator } from \"./FMOscillator\";\nimport { Oscillator } from \"./Oscillator\";\nimport {\n\tgenerateWaveform,\n\tOmniOscillatorOptions, \n\tOmniOscillatorType, ToneOscillatorInterface, ToneOscillatorType\n} from \"./OscillatorInterface\";\nimport { PulseOscillator } from \"./PulseOscillator\";\nimport { PWMOscillator } from \"./PWMOscillator\";\n\nexport { OmniOscillatorOptions } from \"./OscillatorInterface\";\n\n/**\n * All of the oscillator types that OmniOscillator can take on\n */\ntype AnyOscillator = Oscillator | PWMOscillator | PulseOscillator | FatOscillator | AMOscillator | FMOscillator;\n\n/**\n * All of the Oscillator constructor types mapped to their name.\n */\ninterface OmniOscillatorSource {\n\t\"fm\": FMOscillator;\n\t\"am\": AMOscillator;\n\t\"pwm\": PWMOscillator;\n\t\"pulse\": PulseOscillator;\n\t\"oscillator\": Oscillator;\n\t\"fat\": FatOscillator;\n}\n\n/**\n * The available oscillator types.\n */\nexport type OmniOscSourceType = keyof OmniOscillatorSource;\n\n// Conditional Types\ntype IsAmOrFmOscillator<Osc, Ret> = Osc extends AMOscillator ? Ret : Osc extends FMOscillator ? Ret : undefined;\ntype IsFatOscillator<Osc, Ret> = Osc extends FatOscillator ? Ret : undefined;\ntype IsPWMOscillator<Osc, Ret> = Osc extends PWMOscillator ? Ret : undefined;\ntype IsPulseOscillator<Osc, Ret> = Osc extends PulseOscillator ? Ret : undefined;\ntype IsFMOscillator<Osc, Ret> = Osc extends FMOscillator ? Ret : undefined;\n\ntype AnyOscillatorConstructor = new (...args: any[]) => AnyOscillator;\n\nconst OmniOscillatorSourceMap: {\n\t[key in OmniOscSourceType]: AnyOscillatorConstructor\n} = {\n\tam: AMOscillator,\n\tfat: FatOscillator,\n\tfm: FMOscillator,\n\toscillator: Oscillator,\n\tpulse: PulseOscillator,\n\tpwm: PWMOscillator,\n};\n\n/**\n * OmniOscillator aggregates all of the oscillator types into one. \n * @example\n * return Tone.Offline(() => {\n * \tconst omniOsc = new Tone.OmniOscillator(\"C#4\", \"pwm\").toDestination().start();\n * }, 0.1, 1);\n * @category Source\n */\nexport class OmniOscillator<OscType extends AnyOscillator>\n\textends Source<OmniOscillatorOptions>\n\timplements Omit<ToneOscillatorInterface, \"type\"> {\n\n\treadonly name: string = \"OmniOscillator\";\n\n\treadonly frequency: Signal<\"frequency\">;\n\treadonly detune: Signal<\"cents\">;\n\n\t/**\n\t * The oscillator that can switch types\n\t */\n\tprivate _oscillator!: AnyOscillator;\n\n\t/**\n\t * the type of the oscillator source\n\t */\n\tprivate _sourceType!: OmniOscSourceType;\n\n\t/**\n\t * @param frequency The initial frequency of the oscillator.\n\t * @param type The type of the oscillator.\n\t */\n\tconstructor(frequency?: Frequency, type?: OmniOscillatorType);\n\tconstructor(options?: Partial<OmniOscillatorOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(OmniOscillator.getDefaults(), arguments, [\"frequency\", \"type\"]));\n\t\tconst options = optionsFromArguments(OmniOscillator.getDefaults(), arguments, [\"frequency\", \"type\"]);\n\n\t\tthis.frequency = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"frequency\",\n\t\t\tvalue: options.frequency,\n\t\t});\n\t\tthis.detune = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"cents\",\n\t\t\tvalue: options.detune,\n\t\t});\n\t\treadOnly(this, [\"frequency\", \"detune\"]);\n\n\t\t// set the options\n\t\tthis.set(options);\n\t}\n\n\tstatic getDefaults(): OmniOscillatorOptions {\n\t\treturn Object.assign(\n\t\t\tOscillator.getDefaults(),\n\t\t\tFMOscillator.getDefaults(),\n\t\t\tAMOscillator.getDefaults(),\n\t\t\tFatOscillator.getDefaults(),\n\t\t\tPulseOscillator.getDefaults(),\n\t\t\tPWMOscillator.getDefaults(),\n\t\t);\n\t}\n\n\t/**\n\t * start the oscillator\n\t */\n\tprotected _start(time: Time): void {\n\t\tthis._oscillator.start(time);\n\t}\n\n\t/**\n\t * start the oscillator\n\t */\n\tprotected _stop(time: Time): void {\n\t\tthis._oscillator.stop(time);\n\t}\n\n\tprotected _restart(time: Seconds): this {\n\t\tthis._oscillator.restart(time);\n\t\treturn this;\n\t}\n\n\t/**\n\t * The type of the oscillator. Can be any of the basic types: sine, square, triangle, sawtooth. Or\n\t * prefix the basic types with \"fm\", \"am\", or \"fat\" to use the FMOscillator, AMOscillator or FatOscillator\n\t * types. The oscillator could also be set to \"pwm\" or \"pulse\". All of the parameters of the\n\t * oscillator's class are accessible when the oscillator is set to that type, but throws an error\n\t * when it's not. \n\t * @example\n\t * const omniOsc = new Tone.OmniOscillator().toDestination().start();\n\t * omniOsc.type = \"pwm\";\n\t * // modulationFrequency is parameter which is available\n\t * // only when the type is \"pwm\".\n\t * omniOsc.modulationFrequency.value = 0.5;\n\t */\n\tget type(): OmniOscillatorType {\n\t\tlet prefix = \"\";\n\t\tif ([\"am\", \"fm\", \"fat\"].some(p => this._sourceType === p)) {\n\t\t\tprefix = this._sourceType;\n\t\t}\n\t\treturn prefix + this._oscillator.type as OmniOscillatorType;\n\t}\n\tset type(type) {\n\t\tif (type.substr(0, 2) === \"fm\") {\n\t\t\tthis._createNewOscillator(\"fm\");\n\t\t\tthis._oscillator = this._oscillator as FMOscillator;\n\t\t\tthis._oscillator.type = type.substr(2) as ToneOscillatorType;\n\t\t} else if (type.substr(0, 2) === \"am\") {\n\t\t\tthis._createNewOscillator(\"am\");\n\t\t\tthis._oscillator = this._oscillator as AMOscillator;\n\t\t\tthis._oscillator.type = type.substr(2) as ToneOscillatorType;\n\t\t} else if (type.substr(0, 3) === \"fat\") {\n\t\t\tthis._createNewOscillator(\"fat\");\n\t\t\tthis._oscillator = this._oscillator as FatOscillator;\n\t\t\tthis._oscillator.type = type.substr(3) as ToneOscillatorType;\n\t\t} else if (type === \"pwm\") {\n\t\t\tthis._createNewOscillator(\"pwm\");\n\t\t\tthis._oscillator = this._oscillator as PWMOscillator;\n\t\t} else if (type === \"pulse\") {\n\t\t\tthis._createNewOscillator(\"pulse\");\n\t\t} else {\n\t\t\tthis._createNewOscillator(\"oscillator\");\n\t\t\tthis._oscillator = this._oscillator as Oscillator;\n\t\t\tthis._oscillator.type = (type as ToneOscillatorType);\n\t\t}\n\t}\n\n\t/**\n\t * The value is an empty array when the type is not \"custom\".\n\t * This is not available on \"pwm\" and \"pulse\" oscillator types.\n\t * See [[Oscillator.partials]]\n\t */\n\tget partials(): number[] {\n\t\treturn this._oscillator.partials;\n\t}\n\tset partials(partials) {\n\t\tif (!this._getOscType(this._oscillator, \"pulse\") && !this._getOscType(this._oscillator, \"pwm\")) {\n\t\t\tthis._oscillator.partials = partials;\n\t\t}\n\t}\n\n\tget partialCount(): number {\n\t\treturn this._oscillator.partialCount;\n\t}\n\tset partialCount(partialCount) {\n\t\tif (!this._getOscType(this._oscillator, \"pulse\") && !this._getOscType(this._oscillator, \"pwm\")) {\n\t\t\tthis._oscillator.partialCount = partialCount;\n\t\t}\n\t}\n\n\tset(props: Partial<OmniOscillatorOptions>): this {\n\t\t// make sure the type is set first\n\t\tif (Reflect.has(props, \"type\") && props.type) {\n\t\t\tthis.type = props.type;\n\t\t}\n\t\t// then set the rest\n\t\tsuper.set(props);\n\t\treturn this;\n\t}\n\n\t/**\n\t * connect the oscillator to the frequency and detune signals\n\t */\n\tprivate _createNewOscillator(oscType: OmniOscSourceType): void {\n\t\tif (oscType !== this._sourceType) {\n\t\t\tthis._sourceType = oscType;\n\t\t\tconst OscConstructor = OmniOscillatorSourceMap[oscType];\n\t\t\t// short delay to avoid clicks on the change\n\t\t\tconst now = this.now();\n\t\t\tif (this._oscillator) {\n\t\t\t\tconst oldOsc = this._oscillator;\n\t\t\t\toldOsc.stop(now);\n\t\t\t\t// dispose the old one\n\t\t\t\tthis.context.setTimeout(() => oldOsc.dispose(), this.blockTime);\n\t\t\t}\n\t\t\tthis._oscillator = new OscConstructor({\n\t\t\t\tcontext: this.context,\n\t\t\t});\n\t\t\tthis.frequency.connect(this._oscillator.frequency);\n\t\t\tthis.detune.connect(this._oscillator.detune);\n\t\t\tthis._oscillator.connect(this.output);\n\t\t\tthis._oscillator.onstop = () => this.onstop(this);\n\t\t\tif (this.state === \"started\") {\n\t\t\t\tthis._oscillator.start(now);\n\t\t\t}\n\t\t}\n\t}\n\n\tget phase(): Degrees {\n\t\treturn this._oscillator.phase;\n\t}\n\tset phase(phase) {\n\t\tthis._oscillator.phase = phase;\n\t}\n\n\t/**\n\t * The source type of the oscillator.\n\t * @example\n\t * const omniOsc = new Tone.OmniOscillator(440, \"fmsquare\");\n\t * console.log(omniOsc.sourceType); // 'fm'\n\t */\n\tget sourceType(): OmniOscSourceType {\n\t\treturn this._sourceType;\n\t}\n\tset sourceType(sType) {\n\t\t// the basetype defaults to sine\n\t\tlet baseType = \"sine\";\n\t\tif (this._oscillator.type !== \"pwm\" && this._oscillator.type !== \"pulse\") {\n\t\t\tbaseType = this._oscillator.type;\n\t\t}\n\n\t\t// set the type\n\t\tif (sType === \"fm\") {\n\t\t\tthis.type = \"fm\" + baseType as OmniOscillatorType;\n\t\t} else if (sType === \"am\") {\n\t\t\tthis.type = \"am\" + baseType as OmniOscillatorType;\n\t\t} else if (sType === \"fat\") {\n\t\t\tthis.type = \"fat\" + baseType as OmniOscillatorType;\n\t\t} else if (sType === \"oscillator\") {\n\t\t\tthis.type = baseType as OmniOscillatorType;\n\t\t} else if (sType === \"pulse\") {\n\t\t\tthis.type = \"pulse\";\n\t\t} else if (sType === \"pwm\") {\n\t\t\tthis.type = \"pwm\";\n\t\t}\n\t}\n\n\tprivate _getOscType<SourceType extends OmniOscSourceType>(\n\t\tosc: AnyOscillator,\n\t\tsourceType: SourceType,\n\t): osc is OmniOscillatorSource[SourceType] {\n\t\treturn osc instanceof OmniOscillatorSourceMap[sourceType];\n\t}\n\n\t/**\n\t * The base type of the oscillator. See [[Oscillator.baseType]]\n\t * @example\n\t * const omniOsc = new Tone.OmniOscillator(440, \"fmsquare4\");\n\t * console.log(omniOsc.sourceType, omniOsc.baseType, omniOsc.partialCount);\n\t */\n\tget baseType(): OscillatorType | \"pwm\" | \"pulse\" {\n\t\treturn this._oscillator.baseType;\n\t}\n\tset baseType(baseType) {\n\t\tif (!this._getOscType(this._oscillator, \"pulse\") &&\n\t\t\t!this._getOscType(this._oscillator, \"pwm\") &&\n\t\t\tbaseType !== \"pulse\" && baseType !== \"pwm\") {\n\t\t\tthis._oscillator.baseType = baseType;\n\t\t}\n\t}\n\n\t/**\n\t * The width of the oscillator when sourceType === \"pulse\".\n\t * See [[PWMOscillator.width]]\n\t */\n\tget width(): IsPulseOscillator<OscType, Signal<\"audioRange\">> {\n\t\tif (this._getOscType(this._oscillator, \"pulse\")) {\n\t\t\treturn this._oscillator.width as IsPulseOscillator<OscType, Signal<\"audioRange\">>;\n\t\t} else {\n\t\t\treturn undefined as IsPulseOscillator<OscType, Signal<\"audioRange\">>;\n\t\t}\n\t}\n\n\t/**\n\t * The number of detuned oscillators when sourceType === \"fat\".\n\t * See [[FatOscillator.count]]\n\t */\n\tget count(): IsFatOscillator<OscType, number> {\n\t\tif (this._getOscType(this._oscillator, \"fat\")) {\n\t\t\treturn this._oscillator.count as IsFatOscillator<OscType, number>;\n\t\t} else {\n\t\t\treturn undefined as IsFatOscillator<OscType, number>;\n\t\t}\n\t}\n\tset count(count) {\n\t\tif (this._getOscType(this._oscillator, \"fat\") && isNumber(count)) {\n\t\t\tthis._oscillator.count = count;\n\t\t}\n\t}\n\n\t/**\n\t * The detune spread between the oscillators when sourceType === \"fat\".\n\t * See [[FatOscillator.count]]\n\t */\n\tget spread(): IsFatOscillator<OscType, Cents> {\n\t\tif (this._getOscType(this._oscillator, \"fat\")) {\n\t\t\treturn this._oscillator.spread as IsFatOscillator<OscType, Cents>;\n\t\t} else {\n\t\t\treturn undefined as IsFatOscillator<OscType, Cents>;\n\t\t}\n\t}\n\tset spread(spread) {\n\t\tif (this._getOscType(this._oscillator, \"fat\") && isNumber(spread)) {\n\t\t\tthis._oscillator.spread = spread;\n\t\t}\n\t}\n\n\t/**\n\t * The type of the modulator oscillator. Only if the oscillator is set to \"am\" or \"fm\" types. \n\t * See [[AMOscillator]] or [[FMOscillator]]\n\t */\n\tget modulationType(): IsAmOrFmOscillator<OscType, ToneOscillatorType> {\n\t\tif (this._getOscType(this._oscillator, \"fm\") || this._getOscType(this._oscillator, \"am\")) {\n\t\t\treturn this._oscillator.modulationType as IsAmOrFmOscillator<OscType, ToneOscillatorType>;\n\t\t} else {\n\t\t\treturn undefined as IsAmOrFmOscillator<OscType, ToneOscillatorType>;\n\t\t}\n\t}\n\tset modulationType(mType) {\n\t\tif ((this._getOscType(this._oscillator, \"fm\") || this._getOscType(this._oscillator, \"am\")) && isString(mType)) {\n\t\t\tthis._oscillator.modulationType = mType;\n\t\t}\n\t}\n\n\t/**\n\t * The modulation index when the sourceType === \"fm\"\n\t * See [[FMOscillator]].\n\t */\n\tget modulationIndex(): IsFMOscillator<OscType, Signal<\"positive\">> {\n\t\tif (this._getOscType(this._oscillator, \"fm\")) {\n\t\t\treturn this._oscillator.modulationIndex as IsFMOscillator<OscType, Signal<\"positive\">>;\n\t\t} else {\n\t\t\treturn undefined as IsFMOscillator<OscType, Signal<\"positive\">>;\n\t\t}\n\t}\n\n\t/**\n\t * Harmonicity is the frequency ratio between the carrier and the modulator oscillators.\n\t * See [[AMOscillator]] or [[FMOscillator]]\n\t */\n\tget harmonicity(): IsAmOrFmOscillator<OscType, Signal<\"positive\">> {\n\t\tif (this._getOscType(this._oscillator, \"fm\") || this._getOscType(this._oscillator, \"am\")) {\n\t\t\treturn this._oscillator.harmonicity as IsAmOrFmOscillator<OscType, Signal<\"positive\">>;\n\t\t} else {\n\t\t\treturn undefined as IsAmOrFmOscillator<OscType, Signal<\"positive\">>;\n\t\t}\n\t}\n\n\t/**\n\t * The modulationFrequency Signal of the oscillator when sourceType === \"pwm\"\n\t * see [[PWMOscillator]]\n\t * @min 0.1\n\t * @max 5\n\t */\n\tget modulationFrequency(): IsPWMOscillator<OscType, Signal<\"frequency\">> {\n\t\tif (this._getOscType(this._oscillator, \"pwm\")) {\n\t\t\treturn this._oscillator.modulationFrequency as IsPWMOscillator<OscType, Signal<\"frequency\">>;\n\t\t} else {\n\t\t\treturn undefined as IsPWMOscillator<OscType, Signal<\"frequency\">>;\n\t\t}\n\t}\n\n\tasync asArray(length = 1024): Promise<Float32Array> {\n\t\treturn generateWaveform(this, length);\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.detune.dispose();\n\t\tthis.frequency.dispose();\n\t\tthis._oscillator.dispose();\n\t\treturn this;\n\t}\n}\n","import { connectSeries } from \"../core/context/ToneAudioNode\";\nimport { Gain } from \"../core/context/Gain\";\nimport { Param } from \"../core/context/Param\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { Signal, SignalOptions } from \"./Signal\";\n\n/**\n * Add a signal and a number or two signals. When no value is\n * passed into the constructor, Tone.Add will sum input and `addend`\n * If a value is passed into the constructor, the it will be added to the input.\n *\n * @example\n * return Tone.Offline(() => {\n * \tconst add = new Tone.Add(2).toDestination();\n * \tadd.addend.setValueAtTime(1, 0.2);\n * \tconst signal = new Tone.Signal(2);\n * \t// add a signal and a scalar\n * \tsignal.connect(add);\n * \tsignal.setValueAtTime(1, 0.1);\n * }, 0.5, 1);\n * @category Signal\n */\nexport class Add extends Signal {\n\n\toverride = false;\n\n\treadonly name: string = \"Add\";\n\n\t/**\n\t * the summing node\n\t */\n\tprivate _sum: Gain = new Gain({ context: this.context });\n\treadonly input = this._sum;\n\treadonly output = this._sum;\n\n\t/**\n\t * The value which is added to the input signal\n\t */\n\treadonly addend: Param<\"number\"> = this._param;\n\n\t/**\n\t * @param value If no value is provided, will sum the input and [[addend]].\n\t */\n\tconstructor(value?: number);\n\tconstructor(options?: Partial<SignalOptions<\"number\">>);\n\tconstructor() {\n\t\tsuper(Object.assign(optionsFromArguments(Add.getDefaults(), arguments, [\"value\"])));\n\n\t\tconnectSeries(this._constantSource, this._sum);\n\t}\n\n\tstatic getDefaults(): SignalOptions<\"number\"> {\n\t\treturn Object.assign(Signal.getDefaults(), {\n\t\t\tvalue: 0,\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._sum.dispose();\n\t\treturn this;\n\t}\n}\n","import { InputNode, OutputNode, ToneAudioNodeOptions } from \"../core/context/ToneAudioNode\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { Add } from \"./Add\";\nimport { Multiply } from \"./Multiply\";\nimport { SignalOperator } from \"./SignalOperator\";\n\nexport interface ScaleOptions extends ToneAudioNodeOptions {\n\tmin: number;\n\tmax: number;\n}\n\n/**\n * Performs a linear scaling on an input signal.\n * Scales a NormalRange input to between\n * outputMin and outputMax.\n *\n * @example\n * const scale = new Tone.Scale(50, 100);\n * const signal = new Tone.Signal(0.5).connect(scale);\n * // the output of scale equals 75\n * @category Signal\n */\nexport class Scale<Options extends ScaleOptions = ScaleOptions> extends SignalOperator<Options> {\n\n\treadonly name: string = \"Scale\";\n\n\tinput: InputNode;\n\toutput: OutputNode;\n\n\t/**\n\t * Hold the multiple\n\t */\n\tprotected _mult: Multiply;\n\n\t/**\n\t * Hold the adder\n\t */\n\tprotected _add: Add;\n\n\t/**\n\t * Private reference to the min value\n\t */\n\tprivate _min: number;\n\n\t/**\n\t * Private reference to the max value\n\t */\n\tprivate _max: number;\n\n\t/**\n\t * @param min The output value when the input is 0.\n\t * @param max The output value when the input is 1.\n\t */\n\tconstructor(min?: number, max?: number);\n\tconstructor(options?: Partial<ScaleOptions>);\n\tconstructor() {\n\t\tsuper(Object.assign(optionsFromArguments(Scale.getDefaults(), arguments, [\"min\", \"max\"])));\n\t\tconst options = optionsFromArguments(Scale.getDefaults(), arguments, [\"min\", \"max\"]);\n\n\t\tthis._mult = this.input = new Multiply({\n\t\t\tcontext: this.context,\n\t\t\tvalue: options.max - options.min,\n\t\t});\n\n\t\tthis._add = this.output = new Add({\n\t\t\tcontext: this.context,\n\t\t\tvalue: options.min,\n\t\t});\n\n\t\tthis._min = options.min;\n\t\tthis._max = options.max;\n\n\t\tthis.input.connect(this.output);\n\t}\n\n\tstatic getDefaults(): ScaleOptions {\n\t\treturn Object.assign(SignalOperator.getDefaults(), {\n\t\t\tmax: 1,\n\t\t\tmin: 0,\n\t\t});\n\t}\n\n\t/**\n\t * The minimum output value. This number is output when the value input value is 0.\n\t */\n\tget min(): number {\n\t\treturn this._min;\n\t}\n\tset min(min) {\n\t\tthis._min = min;\n\t\tthis._setRange();\n\t}\n\n\t/**\n\t * The maximum output value. This number is output when the value input value is 1.\n\t */\n\tget max(): number {\n\t\treturn this._max;\n\t}\n\tset max(max) {\n\t\tthis._max = max;\n\t\tthis._setRange();\n\t}\n\n\t/**\n\t * set the values\n\t */\n\tprivate _setRange(): void {\n\t\tthis._add.value = this._min;\n\t\tthis._mult.value = this._max - this._min;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._add.dispose();\n\t\tthis._mult.dispose();\n\t\treturn this;\n\t}\n}\n","import { Gain } from \"../core/context/Gain\";\nimport { connect, disconnect, ToneAudioNodeOptions } from \"../core/context/ToneAudioNode\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { SignalOperator } from \"./SignalOperator\";\n\n/**\n * Tone.Zero outputs 0's at audio-rate. The reason this has to be\n * it's own class is that many browsers optimize out Tone.Signal\n * with a value of 0 and will not process nodes further down the graph.\n * @category Signal\n */\nexport class Zero extends SignalOperator<ToneAudioNodeOptions> {\n\n\treadonly name: string = \"Zero\";\n\n\t/**\n\t * The gain node which connects the constant source to the output\n\t */\n\tprivate _gain = new Gain({ context: this.context });\n\n\t/**\n\t * Only outputs 0\n\t */\n\toutput = this._gain;\n\n\t/**\n\t * no input node\n\t */\n\tinput = undefined;\n\n\tconstructor(options?: Partial<ToneAudioNodeOptions>);\n\tconstructor() {\n\t\tsuper(Object.assign(optionsFromArguments(Zero.getDefaults(), arguments)));\n\t\tconnect(this.context.getConstant(0), this._gain);\n\t}\n\n\t/**\n\t * clean up\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tdisconnect(this.context.getConstant(0), this._gain);\n\t\treturn this;\n\t}\n}\n","import { Gain } from \"../../core/context/Gain\";\nimport { Param } from \"../../core/context/Param\";\nimport { InputNode, OutputNode, ToneAudioNode } from \"../../core/context/ToneAudioNode\";\nimport { Degrees, Frequency, NormalRange, Time, UnitName } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { readOnly } from \"../../core/util/Interface\";\nimport { BasicPlaybackState } from \"../../core/util/StateTimeline\";\nimport { AudioToGain } from \"../../signal/AudioToGain\";\nimport { Scale } from \"../../signal/Scale\";\nimport { connectSignal, Signal } from \"../../signal/Signal\";\nimport { Zero } from \"../../signal/Zero\";\nimport { Oscillator, ToneOscillatorType } from \"./Oscillator\";\nimport { ToneOscillatorConstructorOptions, ToneOscillatorOptions } from \"./OscillatorInterface\";\n\nexport type LFOOptions = {\n\tmin: number;\n\tmax: number;\n\tamplitude: NormalRange;\n\tunits: UnitName;\n} & ToneOscillatorOptions;\n\n/**\n * LFO stands for low frequency oscillator. LFO produces an output signal\n * which can be attached to an AudioParam or Tone.Signal\n * in order to modulate that parameter with an oscillator. The LFO can\n * also be synced to the transport to start/stop and change when the tempo changes.\n * @example\n * return Tone.Offline(() => {\n * \tconst lfo = new Tone.LFO(\"4n\", 400, 4000).start().toDestination();\n * }, 0.5, 1);\n * @category Source\n */\nexport class LFO extends ToneAudioNode<LFOOptions> {\n\n\treadonly name: string = \"LFO\";\n\n\t/**\n\t * The oscillator.\n\t */\n\tprivate _oscillator: Oscillator;\n\n\t/**\n\t * The gain of the output\n\t */\n\tprivate _amplitudeGain: Gain<\"normalRange\">;\n\n\t/**\n\t * The amplitude of the LFO, which controls the output range between\n\t * the min and max output. For example if the min is -10 and the max\n\t * is 10, setting the amplitude to 0.5 would make the LFO modulate\n\t * between -5 and 5.\n\t */\n\treadonly amplitude: Param<\"normalRange\">;\n\n\t/**\n\t * The signal which is output when the LFO is stopped\n\t */\n\tprivate _stoppedSignal: Signal<\"audioRange\">;\n\n\t/**\n\t * Just outputs zeros. This is used so that scaled signal is not\n\t * optimized to silence.\n\t */\n\tprivate _zeros: Zero;\n\n\t/**\n\t * The value that the LFO outputs when it's stopped\n\t */\n\tprivate _stoppedValue = 0;\n\n\t/**\n\t * Convert the oscillators audio range to an output between 0-1 so it can be scaled\n\t */\n\tprivate _a2g: AudioToGain;\n\n\t/**\n\t * Scales the final output to the min and max value\n\t */\n\tprivate _scaler: Scale;\n\n\t/**\n\t * The output of the LFO\n\t */\n\treadonly output: OutputNode;\n\n\t/**\n\t * There is no input node\n\t */\n\treadonly input: undefined;\n\n\t/**\n\t * A private placeholder for the units\n\t */\n\tprivate _units: UnitName = \"number\";\n\n\t/**\n\t * If the input value is converted using the [[units]]\n\t */\n\tconvert = true;\n\n\t/**\n\t * The frequency value of the LFO\n\t */\n\treadonly frequency: Signal<\"frequency\">;\n\n\t/**\n\t * @param frequency The frequency of the oscillation.\n\t * Typically, LFOs will be in the frequency range of 0.1 to 10 hertz.\n\t * @param min The minimum output value of the LFO.\n\t * @param max The maximum value of the LFO.\n\t */\n\tconstructor(frequency?: Frequency, min?: number, max?: number);\n\tconstructor(options?: Partial<LFOOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(LFO.getDefaults(), arguments, [\"frequency\", \"min\", \"max\"]));\n\t\tconst options = optionsFromArguments(LFO.getDefaults(), arguments, [\"frequency\", \"min\", \"max\"]);\n\n\t\tthis._oscillator = new Oscillator(options as ToneOscillatorConstructorOptions);\n\n\t\tthis.frequency = this._oscillator.frequency;\n\n\t\tthis._amplitudeGain = new Gain({\n\t\t\tcontext: this.context,\n\t\t\tgain: options.amplitude,\n\t\t\tunits: \"normalRange\",\n\t\t});\n\t\tthis.amplitude = this._amplitudeGain.gain;\n\t\tthis._stoppedSignal = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"audioRange\",\n\t\t\tvalue: 0,\n\t\t});\n\t\tthis._zeros = new Zero({ context: this.context });\n\t\tthis._a2g = new AudioToGain({ context: this.context });\n\t\tthis._scaler = this.output = new Scale({\n\t\t\tcontext: this.context,\n\t\t\tmax: options.max,\n\t\t\tmin: options.min,\n\t\t});\n\n\t\tthis.units = options.units;\n\t\tthis.min = options.min;\n\t\tthis.max = options.max;\n\n\t\t// connect it up\n\t\tthis._oscillator.chain(this._amplitudeGain, this._a2g, this._scaler);\n\t\tthis._zeros.connect(this._a2g);\n\t\tthis._stoppedSignal.connect(this._a2g);\n\t\treadOnly(this, [\"amplitude\", \"frequency\"]);\n\t\tthis.phase = options.phase;\n\t}\n\n\tstatic getDefaults(): LFOOptions {\n\t\treturn Object.assign(Oscillator.getDefaults(), {\n\t\t\tamplitude: 1,\n\t\t\tfrequency: \"4n\",\n\t\t\tmax: 1,\n\t\t\tmin: 0,\n\t\t\ttype: \"sine\",\n\t\t\tunits: \"number\" as UnitName,\n\t\t});\n\t}\n\n\t/**\n\t * Start the LFO.\n\t * @param time The time the LFO will start\n\t */\n\tstart(time?: Time): this {\n\t\ttime = this.toSeconds(time);\n\t\tthis._stoppedSignal.setValueAtTime(0, time);\n\t\tthis._oscillator.start(time);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Stop the LFO.\n\t * @param time The time the LFO will stop\n\t */\n\tstop(time?: Time): this {\n\t\ttime = this.toSeconds(time);\n\t\tthis._stoppedSignal.setValueAtTime(this._stoppedValue, time);\n\t\tthis._oscillator.stop(time);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sync the start/stop/pause to the transport\n\t * and the frequency to the bpm of the transport\n\t * @example\n\t * const lfo = new Tone.LFO(\"8n\");\n\t * lfo.sync().start(0);\n\t * // the rate of the LFO will always be an eighth note, even as the tempo changes\n\t */\n\tsync(): this {\n\t\tthis._oscillator.sync();\n\t\tthis._oscillator.syncFrequency();\n\t\treturn this;\n\t}\n\n\t/**\n\t * unsync the LFO from transport control\n\t */\n\tunsync(): this {\n\t\tthis._oscillator.unsync();\n\t\tthis._oscillator.unsyncFrequency();\n\t\treturn this;\n\t}\n\n\t/**\n\t * After the oscillator waveform is updated, reset the `_stoppedSignal` value to match the updated waveform\n\t */\n\tprivate _setStoppedValue() {\n\t\tthis._stoppedValue = this._oscillator.getInitialValue();\n\t\tthis._stoppedSignal.value = this._stoppedValue;\n\t}\n\n\t/**\n\t * The minimum output of the LFO.\n\t */\n\tget min(): number {\n\t\treturn this._toType(this._scaler.min);\n\t}\n\tset min(min) {\n\t\tmin = this._fromType(min);\n\t\tthis._scaler.min = min;\n\t}\n\n\t/**\n\t * The maximum output of the LFO.\n\t */\n\tget max(): number {\n\t\treturn this._toType(this._scaler.max);\n\t}\n\tset max(max) {\n\t\tmax = this._fromType(max);\n\t\tthis._scaler.max = max;\n\t}\n\n\t/**\n\t * The type of the oscillator: See [[Oscillator.type]]\n\t */\n\tget type(): ToneOscillatorType {\n\t\treturn this._oscillator.type;\n\t}\n\tset type(type) {\n\t\tthis._oscillator.type = type;\n\t\tthis._setStoppedValue();\n\t}\n\n\t/**\n\t * The oscillator's partials array: See [[Oscillator.partials]]\n\t */\n\tget partials(): number[] {\n\t\treturn this._oscillator.partials;\n\t}\n\tset partials(partials) {\n\t\tthis._oscillator.partials = partials;\n\t\tthis._setStoppedValue();\n\t}\n\n\t/**\n\t * The phase of the LFO.\n\t */\n\tget phase(): Degrees {\n\t\treturn this._oscillator.phase;\n\t}\n\tset phase(phase) {\n\t\tthis._oscillator.phase = phase;\n\t\tthis._setStoppedValue();\n\t}\n\n\t/**\n\t * The output units of the LFO.\n\t */\n\tget units(): UnitName {\n\t\treturn this._units;\n\t}\n\tset units(val) {\n\t\tconst currentMin = this.min;\n\t\tconst currentMax = this.max;\n\t\t// convert the min and the max\n\t\tthis._units = val;\n\t\tthis.min = currentMin;\n\t\tthis.max = currentMax;\n\t}\n\n\t/**\n\t * Returns the playback state of the source, either \"started\" or \"stopped\".\n\t */\n\tget state(): BasicPlaybackState {\n\t\treturn this._oscillator.state;\n\t}\n\n\t/**\n\t * @param node the destination to connect to\n\t * @param outputNum the optional output number\n\t * @param inputNum the input number\n\t */\n\tconnect(node: InputNode, outputNum?: number, inputNum?: number): this {\n\t\tif (node instanceof Param || node instanceof Signal) {\n\t\t\tthis.convert = node.convert;\n\t\t\tthis.units = node.units;\n\t\t}\n\t\tconnectSignal(this, node, outputNum, inputNum);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Private methods borrowed from Param\n\t */\n\t// @ts-ignore\n\tprivate _fromType = Param.prototype._fromType;\n\t// @ts-ignore\n\tprivate _toType = Param.prototype._toType;\n\t// @ts-ignore\n\tprivate _is = Param.prototype._is;\n\t// @ts-ignore\n\tprivate _clampValue = Param.prototype._clampValue;\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._oscillator.dispose();\n\t\tthis._stoppedSignal.dispose();\n\t\tthis._zeros.dispose();\n\t\tthis._scaler.dispose();\n\t\tthis._a2g.dispose();\n\t\tthis._amplitudeGain.dispose();\n\t\tthis.amplitude.dispose();\n\t\treturn this;\n\t}\n}\n","import { assertRange } from \"./Debug\";\nimport { Time } from \"../type/Units\";\n\n/**\n * Assert that the number is in the given range.\n */\nexport function range(min: number, max = Infinity) {\n\tconst valueMap: WeakMap<any, number> = new WeakMap();\n\treturn function(target: any, propertyKey: string | symbol) {\n\t\tReflect.defineProperty(\n\t\t\ttarget,\n\t\t\tpropertyKey,\n\t\t\t{\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tget: function() {\n\t\t\t\t\treturn valueMap.get(this);\n\t\t\t\t},\n\t\t\t\tset: function(newValue: number) {\n\t\t\t\t\tassertRange(newValue, min, max);\n\t\t\t\t\tvalueMap.set(this, newValue);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t};\n}\n\n/**\n * Convert the time to seconds and assert that the time is in between the two\n * values when being set.\n */\nexport function timeRange(min: number, max = Infinity) {\n\tconst valueMap: WeakMap<any, Time> = new WeakMap();\n\treturn function(target: any, propertyKey: string) {\n\t\tReflect.defineProperty(\n\t\t\ttarget,\n\t\t\tpropertyKey,\n\t\t\t{\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tget: function() {\n\t\t\t\t\treturn valueMap.get(this);\n\t\t\t\t},\n\t\t\t\tset: function(newValue: Time) {\n\t\t\t\t\tassertRange(this.toSeconds(newValue), min, max);\n\t\t\t\t\tvalueMap.set(this, newValue);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t};\n}\n","import { ToneAudioBuffer } from \"../../core/context/ToneAudioBuffer\";\nimport { Positive, Seconds, Time } from \"../../core/type/Units\";\nimport { defaultArg, optionsFromArguments } from \"../../core/util/Defaults\";\nimport { noOp } from \"../../core/util/Interface\";\nimport { isUndef } from \"../../core/util/TypeCheck\";\nimport { Source, SourceOptions } from \"../Source\";\nimport { ToneBufferSource } from \"./ToneBufferSource\";\nimport { assertRange } from \"../../core/util/Debug\";\nimport { timeRange } from \"../../core/util/Decorator\";\n\nexport interface PlayerOptions extends SourceOptions {\n\tonload: () => void;\n\tonerror: (error: Error) => void;\n\tplaybackRate: Positive;\n\tloop: boolean;\n\tautostart: boolean;\n\tloopStart: Time;\n\tloopEnd: Time;\n\treverse: boolean;\n\tfadeIn: Time;\n\tfadeOut: Time;\n\turl?: ToneAudioBuffer | string | AudioBuffer;\n}\n\n/**\n * Player is an audio file player with start, loop, and stop functions.\n * @example\n * const player = new Tone.Player(\"https://tonejs.github.io/audio/berklee/gong_1.mp3\").toDestination();\n * // play as soon as the buffer is loaded\n * player.autostart = true;\n * @category Source\n */\nexport class Player extends Source<PlayerOptions> {\n\n\treadonly name: string = \"Player\";\n\n\t/**\n\t * If the file should play as soon\n\t * as the buffer is loaded.\n\t */\n\tautostart: boolean;\n\n\t/**\n\t * The buffer\n\t */\n\tprivate _buffer: ToneAudioBuffer;\n\n\t/**\n\t * if the buffer should loop once it's over\n\t */\n\tprivate _loop: boolean;\n\n\t/**\n\t * if 'loop' is true, the loop will start at this position\n\t */\n\tprivate _loopStart: Time;\n\n\t/**\n\t * if 'loop' is true, the loop will end at this position\n\t */\n\tprivate _loopEnd: Time;\n\n\t/**\n\t * the playback rate\n\t */\n\tprivate _playbackRate: Positive;\n\n\t/**\n\t * All of the active buffer source nodes\n\t */\n\tprivate _activeSources: Set<ToneBufferSource> = new Set();\n\n\t/**\n\t * The fadeIn time of the amplitude envelope.\n\t */\n\t@timeRange(0)\n\tfadeIn: Time;\n\n\t/**\n\t * The fadeOut time of the amplitude envelope.\n\t */\n\t@timeRange(0)\n\tfadeOut: Time;\n\n\t/**\n\t * @param url Either the AudioBuffer or the url from which to load the AudioBuffer\n\t * @param onload The function to invoke when the buffer is loaded.\n\t */\n\tconstructor(url?: string | AudioBuffer | ToneAudioBuffer, onload?: () => void);\n\tconstructor(options?: Partial<PlayerOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Player.getDefaults(), arguments, [\"url\", \"onload\"]));\n\t\tconst options = optionsFromArguments(Player.getDefaults(), arguments, [\"url\", \"onload\"]);\n\n\t\tthis._buffer = new ToneAudioBuffer({\n\t\t\tonload: this._onload.bind(this, options.onload),\n\t\t\tonerror: options.onerror,\n\t\t\treverse: options.reverse,\n\t\t\turl: options.url,\n\t\t});\n\t\tthis.autostart = options.autostart;\n\t\tthis._loop = options.loop;\n\t\tthis._loopStart = options.loopStart;\n\t\tthis._loopEnd = options.loopEnd;\n\t\tthis._playbackRate = options.playbackRate;\n\t\tthis.fadeIn = options.fadeIn;\n\t\tthis.fadeOut = options.fadeOut;\n\t}\n\n\tstatic getDefaults(): PlayerOptions {\n\t\treturn Object.assign(Source.getDefaults(), {\n\t\t\tautostart: false,\n\t\t\tfadeIn: 0,\n\t\t\tfadeOut: 0,\n\t\t\tloop: false,\n\t\t\tloopEnd: 0,\n\t\t\tloopStart: 0,\n\t\t\tonload: noOp,\n\t\t\tonerror: noOp,\n\t\t\tplaybackRate: 1,\n\t\t\treverse: false,\n\t\t});\n\t}\n\n\t/**\n\t * Load the audio file as an audio buffer.\n\t * Decodes the audio asynchronously and invokes\n\t * the callback once the audio buffer loads.\n\t * Note: this does not need to be called if a url\n\t * was passed in to the constructor. Only use this\n\t * if you want to manually load a new url.\n\t * @param url The url of the buffer to load. Filetype support depends on the browser.\n\t */\n\tasync load(url: string): Promise<this> {\n\t\tawait this._buffer.load(url);\n\t\tthis._onload();\n\t\treturn this;\n\t}\n\n\t/**\n\t * Internal callback when the buffer is loaded.\n\t */\n\tprivate _onload(callback: () => void = noOp): void {\n\t\tcallback();\n\t\tif (this.autostart) {\n\t\t\tthis.start();\n\t\t}\n\t}\n\n\t/**\n\t * Internal callback when the buffer is done playing.\n\t */\n\tprivate _onSourceEnd(source: ToneBufferSource): void {\n\t\t// invoke the onstop function\n\t\tthis.onstop(this);\n\n\t\t// delete the source from the active sources\n\t\tthis._activeSources.delete(source);\n\t\tif (this._activeSources.size === 0 && !this._synced &&\n\t\t\tthis._state.getValueAtTime(this.now()) === \"started\") {\n\t\t\t// remove the 'implicitEnd' event and replace with an explicit end\n\t\t\tthis._state.cancel(this.now());\n\t\t\tthis._state.setStateAtTime(\"stopped\", this.now());\n\t\t}\n\t}\n\n\t/**\n\t * Play the buffer at the given startTime. Optionally add an offset\n\t * and/or duration which will play the buffer from a position\n\t * within the buffer for the given duration.\n\t *\n\t * @param time When the player should start.\n\t * @param offset The offset from the beginning of the sample to start at.\n\t * @param duration How long the sample should play. If no duration is given, it will default to the full length of the sample (minus any offset)\n\t */\n\tstart(time?: Time, offset?: Time, duration?: Time): this {\n\t\tsuper.start(time, offset, duration);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Internal start method\n\t */\n\tprotected _start(startTime?: Time, offset?: Time, duration?: Time): void {\n\t\t// if it's a loop the default offset is the loopStart point\n\t\tif (this._loop) {\n\t\t\toffset = defaultArg(offset, this._loopStart);\n\t\t} else {\n\t\t\t// otherwise the default offset is 0\n\t\t\toffset = defaultArg(offset, 0);\n\t\t}\n\n\t\t// compute the values in seconds\n\t\tconst computedOffset = this.toSeconds(offset);\n\n\t\t// compute the duration which is either the passed in duration of the buffer.duration - offset\n\t\tconst origDuration = duration;\n\t\tduration = defaultArg(duration, Math.max(this._buffer.duration - computedOffset, 0));\n\t\tlet computedDuration = this.toSeconds(duration);\n\n\t\t// scale it by the playback rate\n\t\tcomputedDuration = computedDuration / this._playbackRate;\n\n\t\t// get the start time\n\t\tstartTime = this.toSeconds(startTime);\n\n\t\t// make the source\n\t\tconst source = new ToneBufferSource({\n\t\t\turl: this._buffer,\n\t\t\tcontext: this.context,\n\t\t\tfadeIn: this.fadeIn,\n\t\t\tfadeOut: this.fadeOut,\n\t\t\tloop: this._loop,\n\t\t\tloopEnd: this._loopEnd,\n\t\t\tloopStart: this._loopStart,\n\t\t\tonended: this._onSourceEnd.bind(this),\n\t\t\tplaybackRate: this._playbackRate,\n\t\t}).connect(this.output);\n\n\t\t// set the looping properties\n\t\tif (!this._loop && !this._synced) {\n\t\t\t// cancel the previous stop\n\t\t\tthis._state.cancel(startTime + computedDuration);\n\t\t\t// if it's not looping, set the state change at the end of the sample\n\t\t\tthis._state.setStateAtTime(\"stopped\", startTime + computedDuration, {\n\t\t\t\timplicitEnd: true,\n\t\t\t});\n\t\t}\n\n\t\t// add it to the array of active sources\n\t\tthis._activeSources.add(source);\n\n\t\t// start it\n\t\tif (this._loop && isUndef(origDuration)) {\n\t\t\tsource.start(startTime, computedOffset);\n\t\t} else {\n\t\t\t// subtract the fade out time\n\t\t\tsource.start(startTime, computedOffset, computedDuration - this.toSeconds(this.fadeOut));\n\t\t}\n\t}\n\n\t/**\n\t * Stop playback.\n\t */\n\tprotected _stop(time?: Time): void {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tthis._activeSources.forEach(source => source.stop(computedTime));\n\t}\n\n\t/**\n\t * Stop and then restart the player from the beginning (or offset)\n\t * @param time When the player should start.\n\t * @param offset The offset from the beginning of the sample to start at.\n\t * @param duration How long the sample should play. If no duration is given, \n\t * \t\t\t\t\tit will default to the full length of the sample (minus any offset)\n\t */\n\trestart(time?: Seconds, offset?: Time, duration?: Time): this {\n\t\tsuper.restart(time, offset, duration);\n\t\treturn this;\n\t}\n\n\tprotected _restart(time?: Seconds, offset?: Time, duration?: Time): void {\n\t\tthis._stop(time);\n\t\tthis._start(time, offset, duration);\n\t}\n\n\t/**\n\t * Seek to a specific time in the player's buffer. If the\n\t * source is no longer playing at that time, it will stop.\n\t * @param offset The time to seek to.\n\t * @param when The time for the seek event to occur.\n\t * @example\n\t * const player = new Tone.Player(\"https://tonejs.github.io/audio/berklee/gurgling_theremin_1.mp3\", () => {\n\t * \tplayer.start();\n\t * \t// seek to the offset in 1 second from now\n\t * \tplayer.seek(0.4, \"+1\");\n\t * }).toDestination();\n\t */\n\tseek(offset: Time, when?: Time): this {\n\t\tconst computedTime = this.toSeconds(when);\n\t\tif (this._state.getValueAtTime(computedTime) === \"started\") {\n\t\t\tconst computedOffset = this.toSeconds(offset);\n\t\t\t// if it's currently playing, stop it\n\t\t\tthis._stop(computedTime);\n\t\t\t// restart it at the given time\n\t\t\tthis._start(computedTime, computedOffset);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the loop start and end. Will only loop if loop is set to true.\n\t * @param loopStart The loop start time\n\t * @param loopEnd The loop end time\n\t * @example\n\t * const player = new Tone.Player(\"https://tonejs.github.io/audio/berklee/malevoices_aa2_F3.mp3\").toDestination();\n\t * // loop between the given points\n\t * player.setLoopPoints(0.2, 0.3);\n\t * player.loop = true;\n\t * player.autostart = true;\n\t */\n\tsetLoopPoints(loopStart: Time, loopEnd: Time): this {\n\t\tthis.loopStart = loopStart;\n\t\tthis.loopEnd = loopEnd;\n\t\treturn this;\n\t}\n\n\t/**\n\t * If loop is true, the loop will start at this position.\n\t */\n\tget loopStart(): Time {\n\t\treturn this._loopStart;\n\t}\n\tset loopStart(loopStart) {\n\t\tthis._loopStart = loopStart;\n\t\tif (this.buffer.loaded) {\n\t\t\tassertRange(this.toSeconds(loopStart), 0, this.buffer.duration);\n\t\t}\n\t\t// get the current source\n\t\tthis._activeSources.forEach(source => {\n\t\t\tsource.loopStart = loopStart;\n\t\t});\n\t}\n\n\t/**\n\t * If loop is true, the loop will end at this position.\n\t */\n\tget loopEnd(): Time {\n\t\treturn this._loopEnd;\n\t}\n\tset loopEnd(loopEnd) {\n\t\tthis._loopEnd = loopEnd;\n\t\tif (this.buffer.loaded) {\n\t\t\tassertRange(this.toSeconds(loopEnd), 0, this.buffer.duration);\n\t\t}\n\t\t// get the current source\n\t\tthis._activeSources.forEach(source => {\n\t\t\tsource.loopEnd = loopEnd;\n\t\t});\n\t}\n\n\t/**\n\t * The audio buffer belonging to the player.\n\t */\n\tget buffer(): ToneAudioBuffer {\n\t\treturn this._buffer;\n\t}\n\tset buffer(buffer) {\n\t\tthis._buffer.set(buffer);\n\t}\n\n\t/**\n\t * If the buffer should loop once it's over.\n\t * @example\n\t * const player = new Tone.Player(\"https://tonejs.github.io/audio/drum-samples/breakbeat.mp3\").toDestination();\n\t * player.loop = true;\n\t * player.autostart = true;\n\t */\n\tget loop(): boolean {\n\t\treturn this._loop;\n\t}\n\tset loop(loop) {\n\t\t// if no change, do nothing\n\t\tif (this._loop === loop) {\n\t\t\treturn;\n\t\t}\n\t\tthis._loop = loop;\n\t\t// set the loop of all of the sources\n\t\tthis._activeSources.forEach(source => {\n\t\t\tsource.loop = loop;\n\t\t});\n\t\tif (loop) {\n\t\t\t// remove the next stopEvent\n\t\t\tconst stopEvent = this._state.getNextState(\"stopped\", this.now());\n\t\t\tif (stopEvent) {\n\t\t\t\tthis._state.cancel(stopEvent.time);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Normal speed is 1. The pitch will change with the playback rate.\n\t * @example\n\t * const player = new Tone.Player(\"https://tonejs.github.io/audio/berklee/femalevoices_aa2_A5.mp3\").toDestination();\n\t * // play at 1/4 speed\n\t * player.playbackRate = 0.25;\n\t * // play as soon as the buffer is loaded\n\t * player.autostart = true;\n\t */\n\tget playbackRate(): Positive {\n\t\treturn this._playbackRate;\n\t}\n\tset playbackRate(rate) {\n\t\tthis._playbackRate = rate;\n\t\tconst now = this.now();\n\n\t\t// cancel the stop event since it's at a different time now\n\t\tconst stopEvent = this._state.getNextState(\"stopped\", now);\n\t\tif (stopEvent && stopEvent.implicitEnd) {\n\t\t\tthis._state.cancel(stopEvent.time);\n\t\t\tthis._activeSources.forEach(source => source.cancelStop());\n\t\t}\n\n\t\t// set all the sources\n\t\tthis._activeSources.forEach(source => {\n\t\t\tsource.playbackRate.setValueAtTime(rate, now);\n\t\t});\n\t}\n\n\t/**\n\t * If the buffer should be reversed\n\t * @example\n\t * const player = new Tone.Player(\"https://tonejs.github.io/audio/berklee/chime_1.mp3\").toDestination();\n\t * player.autostart = true;\n\t * player.reverse = true;\n\t */\n\tget reverse(): boolean {\n\t\treturn this._buffer.reverse;\n\t}\n\tset reverse(rev) {\n\t\tthis._buffer.reverse = rev;\n\t}\n\n\t/**\n\t * If the buffer is loaded\n\t */\n\tget loaded(): boolean {\n\t\treturn this._buffer.loaded;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\t// disconnect all of the players\n\t\tthis._activeSources.forEach(source => source.dispose());\n\t\tthis._activeSources.clear();\n\t\tthis._buffer.dispose();\n\t\treturn this;\n\t}\n}\n","import { Volume } from \"../../component/channel/Volume\";\nimport { Param } from \"../../core/context/Param\";\nimport { ToneAudioBuffer } from \"../../core/context/ToneAudioBuffer\";\nimport { ToneAudioBuffers, ToneAudioBuffersUrlMap } from \"../../core/context/ToneAudioBuffers\";\nimport { OutputNode, ToneAudioNode } from \"../../core/context/ToneAudioNode\";\nimport { Decibels, Time } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { assert } from \"../../core/util/Debug\";\nimport { noOp, readOnly } from \"../../core/util/Interface\";\nimport { BasicPlaybackState } from \"../../core/util/StateTimeline\";\nimport { Source, SourceOptions } from \"../Source\";\nimport { Player } from \"./Player\";\n\nexport interface PlayersOptions extends SourceOptions {\n\turls: ToneAudioBuffersUrlMap;\n\tvolume: Decibels;\n\tmute: boolean;\n\tonload: () => void;\n\tonerror: (error: Error) => void;\n\tbaseUrl: string;\n\tfadeIn: Time;\n\tfadeOut: Time;\n}\n\n/**\n * Players combines multiple [[Player]] objects.\n * @category Source\n */\nexport class Players extends ToneAudioNode<PlayersOptions> {\n\n\treadonly name: string = \"Players\";\n\n\t/**\n\t * The output volume node\n\t */\n\tprivate _volume: Volume;\n\n\t/**\n\t * The volume of the output in decibels.\n\t */\n\treadonly volume: Param<\"decibels\">;\n\n\t/**\n\t * The combined output of all of the players\n\t */\n\treadonly output: OutputNode;\n\n\t/**\n\t * Players has no input.\n\t */\n\treadonly input = undefined;\n\n\t/**\n\t * The container of all of the players\n\t */\n\tprivate _players: Map<string, Player> = new Map();\n\n\t/**\n\t * The container of all the buffers\n\t */\n\tprivate _buffers: ToneAudioBuffers;\n\n\t/**\n\t * private holder of the fadeIn time\n\t */\n\tprivate _fadeIn: Time;\n\n\t/**\n\t * private holder of the fadeOut time\n\t */\n\tprivate _fadeOut: Time;\n\n\t/**\n\t * @param urls An object mapping a name to a url.\n\t * @param onload The function to invoke when all buffers are loaded.\n\t */\n\tconstructor(urls?: ToneAudioBuffersUrlMap, onload?: () => void);\n\t/**\n\t * @param urls An object mapping a name to a url.\n\t * @param options The remaining options associated with the players\n\t */\n\tconstructor(urls?: ToneAudioBuffersUrlMap, options?: Partial<Omit<PlayersOptions, \"urls\">>);\n\tconstructor(options?: Partial<PlayersOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(Players.getDefaults(), arguments, [\"urls\", \"onload\"], \"urls\"));\n\t\tconst options = optionsFromArguments(Players.getDefaults(), arguments, [\"urls\", \"onload\"], \"urls\");\n\n\t\t/**\n\t\t * The output volume node\n\t\t */\n\t\tthis._volume = this.output = new Volume({\n\t\t\tcontext: this.context,\n\t\t\tvolume: options.volume,\n\t\t});\n\n\t\tthis.volume = this._volume.volume;\n\t\treadOnly(this, \"volume\");\n\t\tthis._buffers = new ToneAudioBuffers({\n\t\t\turls: options.urls, \n\t\t\tonload: options.onload, \n\t\t\tbaseUrl: options.baseUrl,\n\t\t\tonerror: options.onerror\n\t\t});\n\t\t// mute initially\n\t\tthis.mute = options.mute;\n\t\tthis._fadeIn = options.fadeIn;\n\t\tthis._fadeOut = options.fadeOut;\n\t}\n\n\tstatic getDefaults(): PlayersOptions {\n\t\treturn Object.assign(Source.getDefaults(), {\n\t\t\tbaseUrl: \"\",\n\t\t\tfadeIn: 0,\n\t\t\tfadeOut: 0,\n\t\t\tmute: false,\n\t\t\tonload: noOp,\n\t\t\tonerror: noOp,\n\t\t\turls: {},\n\t\t\tvolume: 0,\n\t\t});\n\t}\n\n\t/**\n\t * Mute the output.\n\t */\n\tget mute(): boolean {\n\t\treturn this._volume.mute;\n\t}\n\tset mute(mute) {\n\t\tthis._volume.mute = mute;\n\t}\n\n\t/**\n\t * The fadeIn time of the envelope applied to the source.\n\t */\n\tget fadeIn(): Time {\n\t\treturn this._fadeIn;\n\t}\n\tset fadeIn(fadeIn) {\n\t\tthis._fadeIn = fadeIn;\n\t\tthis._players.forEach(player => {\n\t\t\tplayer.fadeIn = fadeIn;\n\t\t});\n\t}\n\n\t/**\n\t * The fadeOut time of the each of the sources.\n\t */\n\tget fadeOut(): Time {\n\t\treturn this._fadeOut;\n\t}\n\tset fadeOut(fadeOut) {\n\t\tthis._fadeOut = fadeOut;\n\t\tthis._players.forEach(player => {\n\t\t\tplayer.fadeOut = fadeOut;\n\t\t});\n\t}\n\n\t/**\n\t * The state of the players object. Returns \"started\" if any of the players are playing.\n\t */\n\tget state(): BasicPlaybackState {\n\t\tconst playing = Array.from(this._players).some(([_, player]) => player.state === \"started\");\n\t\treturn playing ? \"started\" : \"stopped\";\n\t}\n\n\t/**\n\t * True if the buffers object has a buffer by that name.\n\t * @param name The key or index of the buffer.\n\t */\n\thas(name: string): boolean {\n\t\treturn this._buffers.has(name);\n\t}\n\n\t/**\n\t * Get a player by name.\n\t * @param name The players name as defined in the constructor object or `add` method.\n\t */\n\tplayer(name: string): Player {\n\t\tassert(this.has(name), `No Player with the name ${name} exists on this object`);\n\t\tif (!this._players.has(name)) {\n\t\t\tconst player = new Player({\n\t\t\t\tcontext: this.context,\n\t\t\t\tfadeIn: this._fadeIn,\n\t\t\t\tfadeOut: this._fadeOut,\n\t\t\t\turl: this._buffers.get(name),\n\t\t\t}).connect(this.output);\n\t\t\tthis._players.set(name, player);\n\t\t}\n\t\treturn this._players.get(name) as Player;\n\t}\n\n\t/**\n\t * If all the buffers are loaded or not\n\t */\n\tget loaded(): boolean {\n\t\treturn this._buffers.loaded;\n\t}\n\n\t/**\n\t * Add a player by name and url to the Players\n\t * @param name A unique name to give the player\n\t * @param url Either the url of the bufer or a buffer which will be added with the given name.\n\t * @param callback The callback to invoke when the url is loaded.\n\t */\n\tadd(name: string, url: string | ToneAudioBuffer | AudioBuffer, callback?: () => void): this {\n\t\tassert(!this._buffers.has(name), \"A buffer with that name already exists on this object\");\n\t\tthis._buffers.add(name, url, callback);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Stop all of the players at the given time\n\t * @param time The time to stop all of the players.\n\t */\n\tstopAll(time?: Time): this {\n\t\tthis._players.forEach(player => player.stop(time));\n\t\treturn this;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._volume.dispose();\n\t\tthis.volume.dispose();\n\t\tthis._players.forEach(player => player.dispose());\n\t\tthis._buffers.dispose();\n\t\treturn this;\n\t}\n}\n","import { Source, SourceOptions } from \"../Source\";\nimport { noOp } from \"../../core/util/Interface\";\nimport { ToneAudioBuffer } from \"../../core/context/ToneAudioBuffer\";\nimport { defaultArg, optionsFromArguments } from \"../../core/util/Defaults\";\nimport { Clock } from \"../../core/clock/Clock\";\nimport { Cents, Positive, Seconds, Time } from \"../../core/type/Units\";\nimport { ToneBufferSource } from \"./ToneBufferSource\";\nimport { intervalToFrequencyRatio } from \"../../core/type/Conversions\";\nimport { assertRange } from \"../../core/util/Debug\";\n\ninterface GrainPlayerOptions extends SourceOptions {\n\tonload: () => void;\n\tonerror: (error: Error) => void;\n\treverse: boolean;\n\turl?: ToneAudioBuffer | string | AudioBuffer;\n\toverlap: Seconds;\n\tgrainSize: Seconds;\n\tplaybackRate: Positive;\n\tdetune: Cents;\n\tloop: boolean;\n\tloopStart: Time;\n\tloopEnd: Time;\n}\n\n/**\n * GrainPlayer implements [granular synthesis](https://en.wikipedia.org/wiki/Granular_synthesis).\n * Granular Synthesis enables you to adjust pitch and playback rate independently. The grainSize is the\n * amount of time each small chunk of audio is played for and the overlap is the\n * amount of crossfading transition time between successive grains.\n * @category Source\n */\nexport class GrainPlayer extends Source<GrainPlayerOptions> {\n\n\treadonly name: string = \"GrainPlayer\";\n\n\t/**\n\t * The audio buffer belonging to the player.\n\t */\n\tbuffer: ToneAudioBuffer;\n\n\t/**\n\t * Create a repeating tick to schedule the grains.\n\t */\n\tprivate _clock: Clock;\n\n\t/**\n\t * Internal loopStart value\n\t */\n\tprivate _loopStart = 0;\n\n\t/**\n\t * Internal loopStart value\n\t */\n\tprivate _loopEnd = 0;\n\n\t/**\n\t * All of the currently playing BufferSources\n\t */\n\tprivate _activeSources: ToneBufferSource[] = [];\n\n\t/**\n\t * Internal reference to the playback rate\n\t */\n\tprivate _playbackRate: Positive;\n\n\t/**\n\t * Internal grain size reference;\n\t */\n\tprivate _grainSize: Seconds;\n\n\t/**\n\t * Internal overlap reference;\n\t */\n\tprivate _overlap: Seconds;\n\n\t/**\n\t * Adjust the pitch independently of the playbackRate.\n\t */\n\tdetune: Cents;\n\n\t/**\n\t * If the buffer should loop back to the loopStart when completed\n\t */\n\tloop: boolean;\n\n\t/**\n\t * @param url Either the AudioBuffer or the url from which to load the AudioBuffer\n\t * @param onload The function to invoke when the buffer is loaded.\n\t */\n\tconstructor(url?: string | AudioBuffer | ToneAudioBuffer, onload?: () => void);\n\tconstructor(options?: Partial<GrainPlayerOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(GrainPlayer.getDefaults(), arguments, [\"url\", \"onload\"]));\n\t\tconst options = optionsFromArguments(GrainPlayer.getDefaults(), arguments, [\"url\", \"onload\"]);\n\n\t\tthis.buffer = new ToneAudioBuffer({\n\t\t\tonload: options.onload,\n\t\t\tonerror: options.onerror,\n\t\t\treverse: options.reverse,\n\t\t\turl: options.url,\n\t\t});\n\t\tthis._clock = new Clock({\n\t\t\tcontext: this.context,\n\t\t\tcallback: this._tick.bind(this),\n\t\t\tfrequency: 1 / options.grainSize\n\t\t});\n\t\tthis._playbackRate = options.playbackRate;\n\t\tthis._grainSize = options.grainSize;\n\t\tthis._overlap = options.overlap;\n\t\tthis.detune = options.detune;\n\n\t\t// setup\n\t\tthis.overlap = options.overlap;\n\t\tthis.loop = options.loop;\n\t\tthis.playbackRate = options.playbackRate;\n\t\tthis.grainSize = options.grainSize;\n\t\tthis.loopStart = options.loopStart;\n\t\tthis.loopEnd = options.loopEnd;\n\t\tthis.reverse = options.reverse;\n\t\tthis._clock.on(\"stop\", this._onstop.bind(this));\n\t}\n\n\tstatic getDefaults(): GrainPlayerOptions {\n\t\treturn Object.assign(Source.getDefaults(), {\n\t\t\tonload: noOp,\n\t\t\tonerror: noOp,\n\t\t\toverlap: 0.1,\n\t\t\tgrainSize: 0.2,\n\t\t\tplaybackRate: 1,\n\t\t\tdetune: 0,\n\t\t\tloop: false,\n\t\t\tloopStart: 0,\n\t\t\tloopEnd: 0,\n\t\t\treverse: false\n\t\t});\n\t}\n\n\t/**\n\t * Internal start method\n\t */\n\tprotected _start(time?: Time, offset?: Time, duration?: Time): void {\n\t\toffset = defaultArg(offset, 0);\n\t\toffset = this.toSeconds(offset);\n\t\ttime = this.toSeconds(time);\n\n\t\tconst grainSize = 1 / this._clock.frequency.getValueAtTime(time);\n\t\tthis._clock.start(time, offset / grainSize);\n\n\t\tif (duration) {\n\t\t\tthis.stop(time + this.toSeconds(duration));\n\t\t}\n\t}\n\n\t/**\n\t * Stop and then restart the player from the beginning (or offset)\n\t * @param time When the player should start.\n\t * @param offset The offset from the beginning of the sample to start at.\n\t * @param duration How long the sample should play. If no duration is given, \n\t * \t\t\t\t\tit will default to the full length of the sample (minus any offset)\n\t */\n\trestart(time?: Seconds, offset?: Time, duration?: Time): this {\n\t\tsuper.restart(time, offset, duration);\n\t\treturn this;\n\t}\n\n\tprotected _restart(time?: Seconds, offset?: Time, duration?: Time): void {\n\t\tthis._stop(time);\n\t\tthis._start(time, offset, duration);\n\t}\n\n\t/**\n\t * Internal stop method\n\t */\n\tprotected _stop(time?: Time): void {\n\t\tthis._clock.stop(time);\n\t}\n\n\t/**\n\t * Invoked when the clock is stopped\n\t */\n\tprivate _onstop(time: Seconds): void {\n\t\t// stop the players\n\t\tthis._activeSources.forEach((source) => {\n\t\t\tsource.fadeOut = 0;\n\t\t\tsource.stop(time);\n\t\t});\n\t\tthis.onstop(this);\n\t}\n\n\t/**\n\t * Invoked on each clock tick. scheduled a new grain at this time.\n\t */\n\tprivate _tick(time: Seconds): void {\n\t\t// check if it should stop looping\n\t\tconst ticks = this._clock.getTicksAtTime(time);\n\t\tconst offset = ticks * this._grainSize;\n\t\tthis.log(\"offset\", offset);\n\n\t\tif (!this.loop && offset > this.buffer.duration) {\n\t\t\tthis.stop(time);\n\t\t\treturn;\n\t\t}\n\n\t\t// at the beginning of the file, the fade in should be 0\n\t\tconst fadeIn = offset < this._overlap ? 0 : this._overlap;\n\n\t\t// create a buffer source\n\t\tconst source = new ToneBufferSource({\n\t\t\tcontext: this.context,\n\t\t\turl: this.buffer,\n\t\t\tfadeIn: fadeIn,\n\t\t\tfadeOut: this._overlap,\n\t\t\tloop: this.loop,\n\t\t\tloopStart: this._loopStart,\n\t\t\tloopEnd: this._loopEnd,\n\t\t\t// compute the playbackRate based on the detune\n\t\t\tplaybackRate: intervalToFrequencyRatio(this.detune / 100)\n\t\t}).connect(this.output);\n\n\t\tsource.start(time, this._grainSize * ticks);\n\t\tsource.stop(time + this._grainSize / this.playbackRate);\n\n\t\t// add it to the active sources\n\t\tthis._activeSources.push(source);\n\t\t// remove it when it's done\n\t\tsource.onended = () => {\n\t\t\tconst index = this._activeSources.indexOf(source);\n\t\t\tif (index !== -1) {\n\t\t\t\tthis._activeSources.splice(index, 1);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * The playback rate of the sample\n\t */\n\tget playbackRate(): Positive {\n\t\treturn this._playbackRate;\n\t}\n\tset playbackRate(rate) {\n\t\tassertRange(rate, 0.001);\n\t\tthis._playbackRate = rate;\n\t\tthis.grainSize = this._grainSize;\n\t}\n\n\t/**\n\t * The loop start time.\n\t */\n\tget loopStart(): Time {\n\t\treturn this._loopStart;\n\t}\n\tset loopStart(time) {\n\t\tif (this.buffer.loaded) {\n\t\t\tassertRange(this.toSeconds(time), 0, this.buffer.duration);\n\t\t}\n\t\tthis._loopStart = this.toSeconds(time);\n\t}\n\n\t/**\n\t * The loop end time.\n\t */\n\tget loopEnd(): Time {\n\t\treturn this._loopEnd;\n\t}\n\tset loopEnd(time) {\n\t\tif (this.buffer.loaded) {\n\t\t\tassertRange(this.toSeconds(time), 0, this.buffer.duration);\n\t\t}\n\t\tthis._loopEnd = this.toSeconds(time);\n\t}\n\n\t/**\n\t * The direction the buffer should play in\n\t */\n\tget reverse() {\n\t\treturn this.buffer.reverse;\n\t}\n\n\tset reverse(rev) {\n\t\tthis.buffer.reverse = rev;\n\t}\n\n\t/**\n\t * The size of each chunk of audio that the\n\t * buffer is chopped into and played back at.\n\t */\n\tget grainSize(): Time {\n\t\treturn this._grainSize;\n\t}\n\tset grainSize(size) {\n\t\tthis._grainSize = this.toSeconds(size);\n\t\tthis._clock.frequency.setValueAtTime(this._playbackRate / this._grainSize, this.now());\n\t}\n\n\t/**\n\t * The duration of the cross-fade between successive grains.\n\t */\n\tget overlap(): Time {\n\t\treturn this._overlap;\n\t}\n\tset overlap(time) {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tassertRange(computedTime, 0);\n\t\tthis._overlap = computedTime;\n\t}\n\n\t/**\n\t * If all the buffer is loaded\n\t */\n\tget loaded(): boolean {\n\t\treturn this.buffer.loaded;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.buffer.dispose();\n\t\tthis._clock.dispose();\n\t\tthis._activeSources.forEach((source) => source.dispose());\n\t\treturn this;\n\t}\n}\n","import { ToneAudioNodeOptions } from \"../core/context/ToneAudioNode\";\nimport { SignalOperator } from \"./SignalOperator\";\nimport { WaveShaper } from \"./WaveShaper\";\n\n/**\n * Return the absolute value of an incoming signal.\n *\n * @example\n * return Tone.Offline(() => {\n * \tconst abs = new Tone.Abs().toDestination();\n * \tconst signal = new Tone.Signal(1);\n * \tsignal.rampTo(-1, 0.5);\n * \tsignal.connect(abs);\n * }, 0.5, 1);\n * @category Signal\n */\nexport class Abs extends SignalOperator<ToneAudioNodeOptions> {\n\n\treadonly name: string = \"Abs\";\n\n\t/**\n\t * The node which converts the audio ranges\n\t */\n\tprivate _abs = new WaveShaper({\n\t\tcontext: this.context,\n\t\tmapping: val => {\n\t\t\tif (Math.abs(val) < 0.001) {\n\t\t\t\treturn 0;\n\t\t\t} else {\n\t\t\t\treturn Math.abs(val);\n\t\t\t}\n\t\t},\n\t});\n\n\t/**\n\t * The AudioRange input [-1, 1]\n\t */\n\tinput = this._abs;\n\n\t/**\n\t * The output range [0, 1]\n\t */\n\toutput = this._abs;\n\n\t/**\n\t * clean up\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._abs.dispose();\n\t\treturn this;\n\t}\n}\n","import { ToneAudioNodeOptions } from \"../core/context/ToneAudioNode\";\nimport { SignalOperator } from \"./SignalOperator\";\nimport { WaveShaper } from \"./WaveShaper\";\n\n/**\n * GainToAudio converts an input in NormalRange [0,1] to AudioRange [-1,1].\n * See [[AudioToGain]].\n * @category Signal\n */\nexport class GainToAudio extends SignalOperator<ToneAudioNodeOptions> {\n\n\treadonly name: string = \"GainToAudio\";\n\n\t/**\n\t * The node which converts the audio ranges\n\t */\n\tprivate _norm = new WaveShaper({\n\t\tcontext: this.context,\n\t\tmapping: x => Math.abs(x) * 2 - 1,\n\t});\n\n\t/**\n\t * The NormalRange input [0, 1]\n\t */\n\tinput = this._norm;\n\n\t/**\n\t * The AudioRange output [-1, 1]\n\t */\n\toutput = this._norm;\n\n\t/**\n\t * clean up\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._norm.dispose();\n\t\treturn this;\n\t}\n}\n","import { ToneAudioNodeOptions } from \"../core/context/ToneAudioNode\";\nimport { Multiply } from \"./Multiply\";\nimport { SignalOperator } from \"./SignalOperator\";\n\n/**\n * Negate the incoming signal. i.e. an input signal of 10 will output -10\n *\n * @example\n * const neg = new Tone.Negate();\n * const sig = new Tone.Signal(-2).connect(neg);\n * // output of neg is positive 2.\n * @category Signal\n */\nexport class Negate extends SignalOperator<ToneAudioNodeOptions> {\n\n\treadonly name: string = \"Negate\";\n\n\t/**\n\t * negation is done by multiplying by -1\n\t */\n\tprivate _multiply: Multiply = new Multiply({\n\t\tcontext: this.context,\n\t\tvalue: -1,\n\t});\n\n\t/**\n\t * The input and output are equal to the multiply node\n\t */\n\tinput = this._multiply;\n\toutput = this._multiply;\n\n\t/**\n\t * clean up\n\t * @returns {Negate} this\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._multiply.dispose();\n\t\treturn this;\n\t}\n}\n","import { connectSeries } from \"../core/context/ToneAudioNode\";\nimport { Gain } from \"../core/context/Gain\";\nimport { Param } from \"../core/context/Param\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { Negate } from \"../signal/Negate\";\nimport { Signal, SignalOptions } from \"../signal/Signal\";\n\n/**\n * Subtract the signal connected to the input is subtracted from the signal connected\n * The subtrahend.\n *\n * @example\n * // subtract a scalar from a signal\n * const sub = new Tone.Subtract(1);\n * const sig = new Tone.Signal(4).connect(sub);\n * // the output of sub is 3.\n * @example\n * // subtract two signals\n * const sub = new Tone.Subtract();\n * const sigA = new Tone.Signal(10);\n * const sigB = new Tone.Signal(2.5);\n * sigA.connect(sub);\n * sigB.connect(sub.subtrahend);\n * // output of sub is 7.5\n * @category Signal\n */\nexport class Subtract extends Signal {\n\n\toverride = false;\n\n\treadonly name: string = \"Subtract\";\n\n\t/**\n\t * the summing node\n\t */\n\tprivate _sum: Gain = new Gain({ context: this.context });\n\treadonly input: Gain = this._sum;\n\treadonly output: Gain = this._sum;\n\n\t/**\n\t * Negate the input of the second input before connecting it to the summing node.\n\t */\n\tprivate _neg: Negate = new Negate({ context: this.context });\n\n\t/**\n\t * The value which is subtracted from the main signal\n\t */\n\tsubtrahend: Param<\"number\"> = this._param;\n\n\t/**\n\t * @param value The value to subtract from the incoming signal. If the value\n\t * is omitted, it will subtract the second signal from the first.\n\t */\n\tconstructor(value?: number);\n\tconstructor(options?: Partial<SignalOptions<\"number\">>);\n\tconstructor() {\n\t\tsuper(Object.assign(optionsFromArguments(Subtract.getDefaults(), arguments, [\"value\"])));\n\n\t\tconnectSeries(this._constantSource, this._neg, this._sum);\n\t}\n\n\tstatic getDefaults(): SignalOptions<\"number\"> {\n\t\treturn Object.assign(Signal.getDefaults(), {\n\t\t\tvalue: 0,\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._neg.dispose();\n\t\tthis._sum.dispose();\n\t\treturn this;\n\t}\n}\n","import { SignalOperator, SignalOperatorOptions } from \"./SignalOperator\";\nimport { Multiply } from \"./Multiply\";\nimport { ToneAudioNode } from \"../core/context/ToneAudioNode\";\nimport { WaveShaper } from \"./WaveShaper\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\n\nexport type GreaterThanZeroOptions = SignalOperatorOptions\n\n/**\n * GreaterThanZero outputs 1 when the input is strictly greater than zero\n * @example\n * return Tone.Offline(() => {\n * \tconst gt0 = new Tone.GreaterThanZero().toDestination();\n * \tconst sig = new Tone.Signal(0.5).connect(gt0);\n * \tsig.setValueAtTime(-1, 0.05);\n * }, 0.1, 1);\n * @category Signal\n */\nexport class GreaterThanZero extends SignalOperator<GreaterThanZeroOptions> {\n\n\treadonly name: string = \"GreaterThanZero\";\n\n\t/**\n\t * The waveshaper\n\t */\n\tprivate _thresh: WaveShaper;\n\n\t/**\n\t * Scale the first thresholded signal by a large value.\n\t * this will help with values which are very close to 0\n\t */\n\tprivate _scale: Multiply;\n\n\treadonly output: ToneAudioNode;\n\treadonly input: ToneAudioNode;\n\n\tconstructor(options?: Partial<GreaterThanZeroOptions>);\n\tconstructor() {\n\t\tsuper(Object.assign(optionsFromArguments(GreaterThanZero.getDefaults(), arguments)));\n\n\t\tthis._thresh = this.output = new WaveShaper({\n\t\t\tcontext: this.context,\n\t\t\tlength: 127,\n\t\t\tmapping: (val) => {\n\t\t\t\tif (val <= 0) {\n\t\t\t\t\treturn 0;\n\t\t\t\t} else {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t\tthis._scale = this.input = new Multiply({\n\t\t\tcontext: this.context,\n\t\t\tvalue: 10000\n\t\t});\n\n\t\t// connections\n\t\tthis._scale.connect(this._thresh);\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._scale.dispose();\n\t\tthis._thresh.dispose();\n\t\treturn this;\n\t}\n}\n","import { ToneAudioNode } from \"../core/context/ToneAudioNode\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { Subtract } from \"./Subtract\";\nimport { Signal, SignalOptions } from \"./Signal\";\nimport { GreaterThanZero } from \"./GreaterThanZero\";\nimport { readOnly } from \"../core/util/Interface\";\nimport { Param } from \"../core/context/Param\";\n\nexport type GreaterThanOptions = SignalOptions<\"number\">;\n\n/**\n * Output 1 if the signal is greater than the value, otherwise outputs 0.\n * can compare two signals or a signal and a number.\n * \n * @example\n * return Tone.Offline(() => {\n * \tconst gt = new Tone.GreaterThan(2).toDestination();\n * \tconst sig = new Tone.Signal(4).connect(gt);\n * }, 0.1, 1);\n * @category Signal\n */\nexport class GreaterThan extends Signal<\"number\"> {\n\n\treadonly name: string = \"GreaterThan\"\n\n\treadonly override: boolean = false;\n\n\treadonly input: ToneAudioNode;\n\treadonly output: ToneAudioNode;\n\n\t/**\n\t * compare that amount to zero after subtracting\n\t */\n\tprivate _gtz: GreaterThanZero;\n\n\t/**\n\t * Subtract the value from the input node\n\t */\n\tprivate _subtract: Subtract;\n\n\t/**\n\t * The signal to compare to the incoming signal against.\n\t * @example\n\t * return Tone.Offline(() => {\n\t * \t// change the comparison value\n\t * \tconst gt = new Tone.GreaterThan(1.5).toDestination();\n\t * \tconst signal = new Tone.Signal(1).connect(gt);\n\t * \tgt.comparator.setValueAtTime(0.5, 0.1);\n\t * }, 0.5, 1);\n\t */\n\treadonly comparator: Param<\"number\">\n\n\t/**\n\t * @param value The value to compare to\n\t */\n\tconstructor(value?: number);\n\tconstructor(options?: Partial<GreaterThanOptions>);\n\tconstructor() {\n\t\tsuper(Object.assign(optionsFromArguments(GreaterThan.getDefaults(), arguments, [\"value\"])));\n\t\tconst options = optionsFromArguments(GreaterThan.getDefaults(), arguments, [\"value\"]);\n\n\t\tthis._subtract = this.input = new Subtract({\n\t\t\tcontext: this.context,\n\t\t\tvalue: options.value\n\t\t});\n\t\tthis._gtz = this.output = new GreaterThanZero({ context: this.context });\n\n\t\tthis.comparator = this._param = this._subtract.subtrahend;\n\t\treadOnly(this, \"comparator\");\n\n\t\t// connect\n\t\tthis._subtract.connect(this._gtz);\n\t}\n\n\tstatic getDefaults(): GreaterThanOptions {\n\t\treturn Object.assign(Signal.getDefaults(), {\n\t\t\tvalue: 0,\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._gtz.dispose();\n\t\tthis._subtract.dispose();\n\t\tthis.comparator.dispose();\n\t\treturn this;\n\t}\n}\n","import { WaveShaper, WaveShaperMappingFn } from \"./WaveShaper\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { SignalOperator } from \"./SignalOperator\";\nimport { ToneAudioNodeOptions } from \"../core/context/ToneAudioNode\";\n\nexport interface PowOptions extends ToneAudioNodeOptions {\n\tvalue: number;\n}\n\n/**\n * Pow applies an exponent to the incoming signal. The incoming signal must be AudioRange [-1, 1]\n *\n * @example\n * const pow = new Tone.Pow(2);\n * const sig = new Tone.Signal(0.5).connect(pow);\n * // output of pow is 0.25. \n * @category Signal\n */\nexport class Pow extends SignalOperator<PowOptions> {\n\n\treadonly name: string = \"Pow\";\n\n\tprivate _exponent: number;\n\n\tprivate _exponentScaler: WaveShaper;\n\n\tinput: WaveShaper;\n\n\toutput: WaveShaper;\n\n\t/**\n\t * @param value Constant exponent value to use\n\t */\n\tconstructor(value?: number);\n\tconstructor(options?: Partial<PowOptions>);\n\tconstructor() {\n\t\tsuper(Object.assign(optionsFromArguments(Pow.getDefaults(), arguments, [\"value\"])));\n\t\tconst options = optionsFromArguments(Pow.getDefaults(), arguments, [\"value\"]);\n\n\t\tthis._exponentScaler = this.input = this.output = new WaveShaper({\n\t\t\tcontext: this.context,\n\t\t\tmapping: this._expFunc(options.value),\n\t\t\tlength: 8192,\n\t\t});\n\n\t\tthis._exponent = options.value;\n\t}\n\n\tstatic getDefaults(): PowOptions {\n\t\treturn Object.assign(SignalOperator.getDefaults(), {\n\t\t\tvalue: 1,\n\t\t});\n\t}\n\n\t/**\n\t * the function which maps the waveshaper\n\t * @param exponent exponent value\n\t */\n\tprivate _expFunc(exponent: number): WaveShaperMappingFn {\n\t\treturn (val: number) => {\n\t\t\treturn Math.pow(Math.abs(val), exponent);\n\t\t};\n\t}\n\n\t/**\n\t * The value of the exponent.\n\t */\n\tget value(): number {\n\t\treturn this._exponent;\n\t}\n\tset value(exponent: number) {\n\t\tthis._exponent = exponent;\n\t\tthis._exponentScaler.setMap(this._expFunc(this._exponent));\n\t}\n\n\t/**\n\t * Clean up.\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._exponentScaler.dispose();\n\t\treturn this;\n\t}\n}\n","import { Scale, ScaleOptions } from \"./Scale\";\nimport { Positive } from \"../core/type/Units\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { Pow } from \"./Pow\";\n\nexport interface ScaleExpOptions extends ScaleOptions {\n\texponent: Positive;\n}\n\n/**\n * Performs an exponential scaling on an input signal.\n * Scales a NormalRange value [0,1] exponentially\n * to the output range of outputMin to outputMax.\n * @example\n * const scaleExp = new Tone.ScaleExp(0, 100, 2);\n * const signal = new Tone.Signal(0.5).connect(scaleExp);\n * @category Signal\n */\nexport class ScaleExp extends Scale<ScaleExpOptions> {\n\n\treadonly name: string = \"ScaleExp\";\n\n\t/**\n\t * The exponent scaler\n\t */\n\tprivate _exp: Pow;\n\n\t/**\n\t * @param min The output value when the input is 0.\n\t * @param max The output value when the input is 1.\n\t * @param exponent The exponent which scales the incoming signal.\n\t */\n\tconstructor(min?: number, max?: number, exponent?: number);\n\tconstructor(options?: Partial<ScaleExpOptions>);\n\tconstructor() {\n\t\tsuper(Object.assign(optionsFromArguments(ScaleExp.getDefaults(), arguments, [\"min\", \"max\", \"exponent\"])));\n\t\tconst options = optionsFromArguments(ScaleExp.getDefaults(), arguments, [\"min\", \"max\", \"exponent\"]);\n\n\t\tthis.input = this._exp = new Pow({\n\t\t\tcontext: this.context,\n\t\t\tvalue: options.exponent,\n\t\t});\n\t\tthis._exp.connect(this._mult);\n\t}\n\n\tstatic getDefaults(): ScaleExpOptions {\n\t\treturn Object.assign(Scale.getDefaults(), {\n\t\t\texponent: 1,\n\t\t});\n\t}\n\n\t/**\n\t * Instead of interpolating linearly between the [[min]] and\n\t * [[max]] values, setting the exponent will interpolate between\n\t * the two values with an exponential curve.\n\t */\n\tget exponent(): Positive {\n\t\treturn this._exp.value;\n\t}\n\tset exponent(exp) {\n\t\tthis._exp.value = exp;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._exp.dispose();\n\t\treturn this;\n\t}\n}\n","import { Signal, SignalOptions } from \"./Signal\";\nimport { NormalRange, Seconds, Time, TransportTime, UnitMap, UnitName } from \"../core/type/Units\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { TransportTimeClass } from \"../core/type/TransportTime\";\nimport { ToneConstantSource } from \"./ToneConstantSource\";\nimport { OutputNode } from \"../core/context/ToneAudioNode\";\n\n/**\n * Adds the ability to synchronize the signal to the [[Transport]]\n */\nexport class SyncedSignal<TypeName extends UnitName = \"number\"> extends Signal<TypeName> {\n\n\treadonly name: string = \"SyncedSignal\";\n\t\n\t/**\n\t * Don't override when something is connected to the input\n\t */\n\treadonly override = false;\n\n\treadonly output: OutputNode;\n\n\t/**\n\t * Keep track of the last value as an optimization.\n\t */\n\tprivate _lastVal: UnitMap[TypeName];\n\n\t/**\n\t * The ID returned from scheduleRepeat\n\t */\n\tprivate _synced: number;\n\n\t/**\n\t * Remember the callback value\n\t */\n\tprivate _syncedCallback: () => void;\n\n\t/**\n\t * @param value Initial value of the signal\n\t * @param units The unit name, e.g. \"frequency\"\n\t */\n\tconstructor(value?: UnitMap[TypeName], units?: TypeName);\n\tconstructor(options?: Partial<SignalOptions<TypeName>>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Signal.getDefaults(), arguments, [\"value\", \"units\"]));\n\t\tconst options = optionsFromArguments(Signal.getDefaults(), arguments, [\"value\", \"units\"]) as SignalOptions<TypeName>;\n\n\t\tthis._lastVal = options.value;\n\t\tthis._synced = this.context.transport.scheduleRepeat(this._onTick.bind(this), \"1i\");\n\n\t\tthis._syncedCallback = this._anchorValue.bind(this);\n\t\tthis.context.transport.on(\"start\", this._syncedCallback);\n\t\tthis.context.transport.on(\"pause\", this._syncedCallback);\n\t\tthis.context.transport.on(\"stop\", this._syncedCallback);\n\n\t\t// disconnect the constant source from the output and replace it with another one\n\t\tthis._constantSource.disconnect();\n\t\tthis._constantSource.stop(0);\n\n\t\t// create a new one\n\t\tthis._constantSource = this.output = new ToneConstantSource<TypeName>({ \n\t\t\tcontext: this.context,\n\t\t\toffset: options.value,\n\t\t\tunits: options.units,\n\t\t}).start(0);\n\t\tthis.setValueAtTime(options.value, 0);\n\t}\n\n\t/**\n\t * Callback which is invoked every tick.\n\t */\n\tprivate _onTick(time: Seconds): void {\n\t\tconst val = super.getValueAtTime(this.context.transport.seconds);\n\t\t// approximate ramp curves with linear ramps\n\t\tif (this._lastVal !== val) {\n\t\t\tthis._lastVal = val;\n\t\t\tthis._constantSource.offset.setValueAtTime(val, time);\n\t\t}\n\t}\n\n\t/**\n\t * Anchor the value at the start and stop of the Transport\n\t */\n\tprivate _anchorValue(time: Seconds): void {\n\t\tconst val = super.getValueAtTime(this.context.transport.seconds);\n\t\tthis._lastVal = val;\n\t\tthis._constantSource.offset.cancelAndHoldAtTime(time);\n\t\tthis._constantSource.offset.setValueAtTime(val, time);\n\t}\n\n\tgetValueAtTime(time: TransportTime): UnitMap[TypeName] {\n\t\tconst computedTime = new TransportTimeClass(this.context, time).toSeconds();\n\t\treturn super.getValueAtTime(computedTime);\n\t}\n\t\n\tsetValueAtTime(value: UnitMap[TypeName], time: TransportTime) {\n\t\tconst computedTime = new TransportTimeClass(this.context, time).toSeconds();\n\t\tsuper.setValueAtTime(value, computedTime);\n\t\treturn this;\n\t}\n\n\tlinearRampToValueAtTime(value: UnitMap[TypeName], time: TransportTime) {\n\t\tconst computedTime = new TransportTimeClass(this.context, time).toSeconds();\n\t\tsuper.linearRampToValueAtTime(value, computedTime);\n\t\treturn this;\n\t}\n\n\texponentialRampToValueAtTime(value: UnitMap[TypeName], time: TransportTime) {\n\t\tconst computedTime = new TransportTimeClass(this.context, time).toSeconds();\n\t\tsuper.exponentialRampToValueAtTime(value, computedTime);\n\t\treturn this;\n\t}\n\n\tsetTargetAtTime(value, startTime: TransportTime, timeConstant: number): this {\n\t\tconst computedTime = new TransportTimeClass(this.context, startTime).toSeconds();\n\t\tsuper.setTargetAtTime(value, computedTime, timeConstant);\n\t\treturn this;\n\t}\n\n\tcancelScheduledValues(startTime: TransportTime): this {\n\t\tconst computedTime = new TransportTimeClass(this.context, startTime).toSeconds();\n\t\tsuper.cancelScheduledValues(computedTime);\n\t\treturn this;\n\t}\n\n\tsetValueCurveAtTime(values: UnitMap[TypeName][], startTime: TransportTime, duration: Time, scaling: NormalRange): this {\n\t\tconst computedTime = new TransportTimeClass(this.context, startTime).toSeconds();\n\t\tduration = this.toSeconds(duration);\n\t\tsuper.setValueCurveAtTime(values, computedTime, duration, scaling);\n\t\treturn this;\n\t}\n\n\tcancelAndHoldAtTime(time: TransportTime): this {\n\t\tconst computedTime = new TransportTimeClass(this.context, time).toSeconds();\n\t\tsuper.cancelAndHoldAtTime(computedTime);\n\t\treturn this;\n\t}\n\t\n\tsetRampPoint(time: TransportTime): this {\n\t\tconst computedTime = new TransportTimeClass(this.context, time).toSeconds();\n\t\tsuper.setRampPoint(computedTime);\n\t\treturn this;\n\t}\n\t\n\texponentialRampTo(value: UnitMap[TypeName], rampTime: Time, startTime?: TransportTime): this {\n\t\tconst computedTime = new TransportTimeClass(this.context, startTime).toSeconds();\n\t\tsuper.exponentialRampTo(value, rampTime, computedTime);\n\t\treturn this;\n\t}\n\t\n\tlinearRampTo(value: UnitMap[TypeName], rampTime: Time, startTime?: TransportTime): this {\n\t\tconst computedTime = new TransportTimeClass(this.context, startTime).toSeconds();\n\t\tsuper.linearRampTo(value, rampTime, computedTime);\n\t\treturn this;\n\t}\n\n\ttargetRampTo(value: UnitMap[TypeName], rampTime: Time, startTime?: TransportTime): this {\n\t\tconst computedTime = new TransportTimeClass(this.context, startTime).toSeconds();\n\t\tsuper.targetRampTo(value, rampTime, computedTime);\n\t\treturn this;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.context.transport.clear(this._synced);\n\t\tthis.context.transport.off(\"start\", this._syncedCallback);\n\t\tthis.context.transport.off(\"pause\", this._syncedCallback);\n\t\tthis.context.transport.off(\"stop\", this._syncedCallback);\n\t\tthis._constantSource.dispose();\n\t\treturn this;\n\t}\n}\n","import { InputNode, OutputNode } from \"../../core/context/ToneAudioNode\";\nimport { ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { NormalRange, Time } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { isArray, isObject, isString } from \"../../core/util/TypeCheck\";\nimport { connectSignal, Signal } from \"../../signal/Signal\";\nimport { OfflineContext } from \"../../core/context/OfflineContext\";\nimport { assert } from \"../../core/util/Debug\";\nimport { range, timeRange } from \"../../core/util/Decorator\";\n\ntype BasicEnvelopeCurve = \"linear\" | \"exponential\";\ntype InternalEnvelopeCurve = BasicEnvelopeCurve | number[];\nexport type EnvelopeCurve = EnvelopeCurveName | number[];\n\nexport interface EnvelopeOptions extends ToneAudioNodeOptions {\n\tattack: Time;\n\tdecay: Time;\n\tsustain: NormalRange;\n\trelease: Time;\n\tattackCurve: EnvelopeCurve;\n\treleaseCurve: EnvelopeCurve;\n\tdecayCurve: BasicEnvelopeCurve;\n}\n\n/**\n * Envelope is an [ADSR](https://en.wikipedia.org/wiki/Synthesizer#ADSR_envelope)\n * envelope generator. Envelope outputs a signal which\n * can be connected to an AudioParam or Tone.Signal.\n * ```\n * /\\\n * / \\\n * / \\\n * / \\\n * / \\___________\n * / \\\n * / \\\n * / \\\n * / \\\n * ```\n * @example\n * return Tone.Offline(() => {\n * \tconst env = new Tone.Envelope({\n * \t\tattack: 0.1,\n * \t\tdecay: 0.2,\n * \t\tsustain: 0.5,\n * \t\trelease: 0.8,\n * \t}).toDestination();\n * \tenv.triggerAttackRelease(0.5);\n * }, 1.5, 1);\n * @category Component\n */\nexport class Envelope extends ToneAudioNode<EnvelopeOptions> {\n\n\treadonly name: string = \"Envelope\";\n\n\t/**\n\t * When triggerAttack is called, the attack time is the amount of\n\t * time it takes for the envelope to reach it's maximum value.\n\t * ```\n\t * /\\\n\t * /X \\\n\t * /XX \\\n\t * /XXX \\\n\t * /XXXX \\___________\n\t * /XXXXX \\\n\t * /XXXXXX \\\n\t * /XXXXXXX \\\n\t * /XXXXXXXX \\\n\t * ```\n\t * @min 0\n\t * @max 2\n\t */\n\t@timeRange(0)\n\tattack: Time;\n\n\t/**\n\t * After the attack portion of the envelope, the value will fall\n\t * over the duration of the decay time to it's sustain value.\n\t * ```\n\t * /\\\n\t * / X\\\n\t * / XX\\\n\t * / XXX\\\n\t * / XXXX\\___________\n\t * / XXXXX \\\n\t * / XXXXX \\\n\t * / XXXXX \\\n\t * / XXXXX \\\n\t * ```\n\t * @min 0\n\t * @max 2\n\t */\n\t@timeRange(0)\n\tdecay: Time;\n\n\t/**\n\t * The sustain value is the value\n\t * which the envelope rests at after triggerAttack is\n\t * called, but before triggerRelease is invoked.\n\t * ```\n\t * /\\\n\t * / \\\n\t * / \\\n\t * / \\\n\t * / \\___________\n\t * / XXXXXXXXXXX\\\n\t * / XXXXXXXXXXX \\\n\t * / XXXXXXXXXXX \\\n\t * / XXXXXXXXXXX \\\n\t * ```\n\t */\n\t@range(0, 1)\n\tsustain: NormalRange;\n\n\t/**\n\t * After triggerRelease is called, the envelope's\n\t * value will fall to it's miminum value over the\n\t * duration of the release time.\n\t * ```\n\t * /\\\n\t * / \\\n\t * / \\\n\t * / \\\n\t * / \\___________\n\t * / X\\\n\t * / XX\\\n\t * / XXX\\\n\t * / XXXX\\\n\t * ```\n\t * @min 0\n\t * @max 5\n\t */\n\t@timeRange(0)\n\trelease: Time;\n\n\t/**\n\t * The automation curve type for the attack\n\t */\n\tprivate _attackCurve!: InternalEnvelopeCurve;\n\n\t/**\n\t * The automation curve type for the decay\n\t */\n\tprivate _decayCurve!: BasicEnvelopeCurve;\n\n\t/**\n\t * The automation curve type for the release\n\t */\n\tprivate _releaseCurve!: InternalEnvelopeCurve;\n\n\t/**\n\t * the signal which is output.\n\t */\n\tprotected _sig: Signal<\"normalRange\"> = new Signal({\n\t\tcontext: this.context,\n\t\tvalue: 0,\n\t});\n\n\t/**\n\t * The output signal of the envelope\n\t */\n\toutput: OutputNode = this._sig;\n\n\t/**\n\t * Envelope has no input\n\t */\n\tinput: InputNode | undefined = undefined;\n\n\t/**\n\t * @param attack The amount of time it takes for the envelope to go from\n\t * 0 to it's maximum value.\n\t * @param decay\tThe period of time after the attack that it takes for the envelope\n\t * \tto fall to the sustain value. Value must be greater than 0.\n\t * @param sustain\tThe percent of the maximum value that the envelope rests at until\n\t * \tthe release is triggered.\n\t * @param release\tThe amount of time after the release is triggered it takes to reach 0.\n\t * \tValue must be greater than 0.\n\t */\n\tconstructor(attack?: Time, decay?: Time, sustain?: NormalRange, release?: Time);\n\tconstructor(options?: Partial<EnvelopeOptions>)\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Envelope.getDefaults(), arguments, [\"attack\", \"decay\", \"sustain\", \"release\"]));\n\t\tconst options = optionsFromArguments(Envelope.getDefaults(), arguments, [\"attack\", \"decay\", \"sustain\", \"release\"]);\n\n\t\tthis.attack = options.attack;\n\t\tthis.decay = options.decay;\n\t\tthis.sustain = options.sustain;\n\t\tthis.release = options.release;\n\t\tthis.attackCurve = options.attackCurve;\n\t\tthis.releaseCurve = options.releaseCurve;\n\t\tthis.decayCurve = options.decayCurve;\n\t}\n\n\tstatic getDefaults(): EnvelopeOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tattack: 0.01,\n\t\t\tattackCurve: \"linear\" as EnvelopeCurveName,\n\t\t\tdecay: 0.1,\n\t\t\tdecayCurve: \"exponential\" as BasicEnvelopeCurve,\n\t\t\trelease: 1,\n\t\t\treleaseCurve: \"exponential\" as EnvelopeCurveName,\n\t\t\tsustain: 0.5,\n\t\t});\n\t}\n\n\t/**\n\t * Read the current value of the envelope. Useful for\n\t * synchronizing visual output to the envelope.\n\t */\n\tget value(): NormalRange {\n\t\treturn this.getValueAtTime(this.now());\n\t}\n\n\t/**\n\t * Get the curve\n\t * @param curve\n\t * @param direction In/Out\n\t * @return The curve name\n\t */\n\tprivate _getCurve(curve: InternalEnvelopeCurve, direction: EnvelopeDirection): EnvelopeCurve {\n\t\tif (isString(curve)) {\n\t\t\treturn curve;\n\t\t} else {\n\t\t\t// look up the name in the curves array\n\t\t\tlet curveName: EnvelopeCurveName;\n\t\t\tfor (curveName in EnvelopeCurves) {\n\t\t\t\tif (EnvelopeCurves[curveName][direction] === curve) {\n\t\t\t\t\treturn curveName;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// return the custom curve\n\t\t\treturn curve;\n\t\t}\n\t}\n\n\t/**\n\t * Assign a the curve to the given name using the direction\n\t * @param name\n\t * @param direction In/Out\n\t * @param curve\n\t */\n\tprivate _setCurve(\n\t\tname: \"_attackCurve\" | \"_decayCurve\" | \"_releaseCurve\",\n\t\tdirection: EnvelopeDirection,\n\t\tcurve: EnvelopeCurve,\n\t): void {\n\t\t// check if it's a valid type\n\t\tif (isString(curve) && Reflect.has(EnvelopeCurves, curve)) {\n\t\t\tconst curveDef = EnvelopeCurves[curve];\n\t\t\tif (isObject(curveDef)) {\n\t\t\t\tif (name !== \"_decayCurve\") {\n\t\t\t\t\tthis[name] = curveDef[direction];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis[name] = curveDef;\n\t\t\t}\n\t\t} else if (isArray(curve) && name !== \"_decayCurve\") {\n\t\t\tthis[name] = curve;\n\t\t} else {\n\t\t\tthrow new Error(\"Envelope: invalid curve: \" + curve);\n\t\t}\n\t}\n\n\t/**\n\t * The shape of the attack.\n\t * Can be any of these strings:\n\t * * \"linear\"\n\t * * \"exponential\"\n\t * * \"sine\"\n\t * * \"cosine\"\n\t * * \"bounce\"\n\t * * \"ripple\"\n\t * * \"step\"\n\t *\n\t * Can also be an array which describes the curve. Values\n\t * in the array are evenly subdivided and linearly\n\t * interpolated over the duration of the attack.\n\t * @example\n\t * return Tone.Offline(() => {\n\t * \tconst env = new Tone.Envelope(0.4).toDestination();\n\t * \tenv.attackCurve = \"linear\";\n\t * \tenv.triggerAttack();\n\t * }, 1, 1);\n\t */\n\tget attackCurve(): EnvelopeCurve {\n\t\treturn this._getCurve(this._attackCurve, \"In\");\n\t}\n\tset attackCurve(curve) {\n\t\tthis._setCurve(\"_attackCurve\", \"In\", curve);\n\t}\n\n\t/**\n\t * The shape of the release. See the attack curve types.\n\t * @example\n\t * return Tone.Offline(() => {\n\t * \tconst env = new Tone.Envelope({\n\t * \t\trelease: 0.8\n\t * \t}).toDestination();\n\t * \tenv.triggerAttack();\n\t * \t// release curve could also be defined by an array\n\t * \tenv.releaseCurve = [1, 0.3, 0.4, 0.2, 0.7, 0];\n\t * \tenv.triggerRelease(0.2);\n\t * }, 1, 1);\n\t */\n\tget releaseCurve(): EnvelopeCurve {\n\t\treturn this._getCurve(this._releaseCurve, \"Out\");\n\t}\n\tset releaseCurve(curve) {\n\t\tthis._setCurve(\"_releaseCurve\", \"Out\", curve);\n\t}\n\n\t/**\n\t * The shape of the decay either \"linear\" or \"exponential\"\n\t * @example\n\t * return Tone.Offline(() => {\n\t * \tconst env = new Tone.Envelope({\n\t * \t\tsustain: 0.1,\n\t * \t\tdecay: 0.5\n\t * \t}).toDestination();\n\t * \tenv.decayCurve = \"linear\";\n\t * \tenv.triggerAttack();\n\t * }, 1, 1);\n\t */\n\tget decayCurve(): BasicEnvelopeCurve {\n\t\treturn this._decayCurve;\n\t}\n\tset decayCurve(curve) {\n\t\tassert([\"linear\", \"exponential\"].some(c => c === curve), `Invalid envelope curve: ${curve}`);\n\t\tthis._decayCurve = curve;\n\t}\n\n\t/**\n\t * Trigger the attack/decay portion of the ADSR envelope.\n\t * @param time When the attack should start.\n\t * @param velocity The velocity of the envelope scales the vales.\n\t * number between 0-1\n\t * @example\n\t * const env = new Tone.AmplitudeEnvelope().toDestination();\n\t * const osc = new Tone.Oscillator().connect(env).start();\n\t * // trigger the attack 0.5 seconds from now with a velocity of 0.2\n\t * env.triggerAttack(\"+0.5\", 0.2);\n\t */\n\ttriggerAttack(time?: Time, velocity: NormalRange = 1): this {\n\t\tthis.log(\"triggerAttack\", time, velocity);\n\t\ttime = this.toSeconds(time);\n\t\tconst originalAttack = this.toSeconds(this.attack);\n\t\tlet attack = originalAttack;\n\t\tconst decay = this.toSeconds(this.decay);\n\t\t// check if it's not a complete attack\n\t\tconst currentValue = this.getValueAtTime(time);\n\t\tif (currentValue > 0) {\n\t\t\t// subtract the current value from the attack time\n\t\t\tconst attackRate = 1 / attack;\n\t\t\tconst remainingDistance = 1 - currentValue;\n\t\t\t// the attack is now the remaining time\n\t\t\tattack = remainingDistance / attackRate;\n\t\t}\n\t\t// attack\n\t\tif (attack < this.sampleTime) {\n\t\t\tthis._sig.cancelScheduledValues(time);\n\t\t\t// case where the attack time is 0 should set instantly\n\t\t\tthis._sig.setValueAtTime(velocity, time);\n\t\t} else if (this._attackCurve === \"linear\") {\n\t\t\tthis._sig.linearRampTo(velocity, attack, time);\n\t\t} else if (this._attackCurve === \"exponential\") {\n\t\t\tthis._sig.targetRampTo(velocity, attack, time);\n\t\t} else {\n\t\t\tthis._sig.cancelAndHoldAtTime(time);\n\t\t\tlet curve = this._attackCurve;\n\t\t\t// find the starting position in the curve\n\t\t\tfor (let i = 1; i < curve.length; i++) {\n\t\t\t\t// the starting index is between the two values\n\t\t\t\tif (curve[i - 1] <= currentValue && currentValue <= curve[i]) {\n\t\t\t\t\tcurve = this._attackCurve.slice(i);\n\t\t\t\t\t// the first index is the current value\n\t\t\t\t\tcurve[0] = currentValue;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._sig.setValueCurveAtTime(curve, time, attack, velocity);\n\t\t}\n\t\t// decay\n\t\tif (decay && this.sustain < 1) {\n\t\t\tconst decayValue = velocity * this.sustain;\n\t\t\tconst decayStart = time + attack;\n\t\t\tthis.log(\"decay\", decayStart);\n\t\t\tif (this._decayCurve === \"linear\") {\n\t\t\t\tthis._sig.linearRampToValueAtTime(decayValue, decay + decayStart);\n\t\t\t} else {\n\t\t\t\tthis._sig.exponentialApproachValueAtTime(decayValue, decayStart, decay);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Triggers the release of the envelope.\n\t * @param time When the release portion of the envelope should start.\n\t * @example\n\t * const env = new Tone.AmplitudeEnvelope().toDestination();\n\t * const osc = new Tone.Oscillator({\n\t * \ttype: \"sawtooth\"\n\t * }).connect(env).start();\n\t * env.triggerAttack();\n\t * // trigger the release half a second after the attack\n\t * env.triggerRelease(\"+0.5\");\n\t */\n\ttriggerRelease(time?: Time): this {\n\t\tthis.log(\"triggerRelease\", time);\n\t\ttime = this.toSeconds(time);\n\t\tconst currentValue = this.getValueAtTime(time);\n\t\tif (currentValue > 0) {\n\t\t\tconst release = this.toSeconds(this.release);\n\t\t\tif (release < this.sampleTime) {\n\t\t\t\tthis._sig.setValueAtTime(0, time);\n\t\t\t} else if (this._releaseCurve === \"linear\") {\n\t\t\t\tthis._sig.linearRampTo(0, release, time);\n\t\t\t} else if (this._releaseCurve === \"exponential\") {\n\t\t\t\tthis._sig.targetRampTo(0, release, time);\n\t\t\t} else {\n\t\t\t\tassert(isArray(this._releaseCurve), \"releaseCurve must be either 'linear', 'exponential' or an array\");\n\t\t\t\tthis._sig.cancelAndHoldAtTime(time);\n\t\t\t\tthis._sig.setValueCurveAtTime(this._releaseCurve, time, release, currentValue);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get the scheduled value at the given time. This will\n\t * return the unconverted (raw) value.\n\t * @example\n\t * const env = new Tone.Envelope(0.5, 1, 0.4, 2);\n\t * env.triggerAttackRelease(2);\n\t * setInterval(() => console.log(env.getValueAtTime(Tone.now())), 100);\n\t */\n\tgetValueAtTime(time: Time): NormalRange {\n\t\treturn this._sig.getValueAtTime(time);\n\t}\n\n\t/**\n\t * triggerAttackRelease is shorthand for triggerAttack, then waiting\n\t * some duration, then triggerRelease.\n\t * @param duration The duration of the sustain.\n\t * @param time When the attack should be triggered.\n\t * @param velocity The velocity of the envelope.\n\t * @example\n\t * const env = new Tone.AmplitudeEnvelope().toDestination();\n\t * const osc = new Tone.Oscillator().connect(env).start();\n\t * // trigger the release 0.5 seconds after the attack\n\t * env.triggerAttackRelease(0.5);\n\t */\n\ttriggerAttackRelease(duration: Time, time?: Time, velocity: NormalRange = 1): this {\n\t\ttime = this.toSeconds(time);\n\t\tthis.triggerAttack(time, velocity);\n\t\tthis.triggerRelease(time + this.toSeconds(duration));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Cancels all scheduled envelope changes after the given time.\n\t */\n\tcancel(after?: Time): this {\n\t\tthis._sig.cancelScheduledValues(this.toSeconds(after));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Connect the envelope to a destination node.\n\t */\n\tconnect(destination: InputNode, outputNumber = 0, inputNumber = 0): this {\n\t\tconnectSignal(this, destination, outputNumber, inputNumber);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Render the envelope curve to an array of the given length. \n\t * Good for visualizing the envelope curve. Rescales the duration of the\n\t * envelope to fit the length.\n\t */\n\tasync asArray(length = 1024): Promise<Float32Array> {\n\t\tconst duration = length / this.context.sampleRate;\n\t\tconst context = new OfflineContext(1, duration, this.context.sampleRate);\n\t\t// normalize the ADSR for the given duration with 20% sustain time\n\t\tconst attackPortion = this.toSeconds(this.attack) + this.toSeconds(this.decay);\n\t\tconst envelopeDuration = attackPortion + this.toSeconds(this.release);\n\t\tconst sustainTime = envelopeDuration * 0.1;\n\t\tconst totalDuration = envelopeDuration + sustainTime;\n\t\t// @ts-ignore\n\t\tconst clone = new this.constructor(Object.assign(this.get(), {\n\t\t\tattack: duration * this.toSeconds(this.attack) / totalDuration,\n\t\t\tdecay: duration * this.toSeconds(this.decay) / totalDuration,\n\t\t\trelease: duration * this.toSeconds(this.release) / totalDuration,\n\t\t\tcontext\n\t\t})) as Envelope;\n\t\tclone._sig.toDestination();\n\t\tclone.triggerAttackRelease(duration * (attackPortion + sustainTime) / totalDuration, 0);\n\t\tconst buffer = await context.render();\n\t\treturn buffer.getChannelData(0);\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._sig.dispose();\n\t\treturn this;\n\t}\n}\n\ninterface EnvelopeCurveObject {\n\tIn: number[];\n\tOut: number[];\n}\n\ntype EnvelopeDirection = keyof EnvelopeCurveObject;\n\ninterface EnvelopeCurveMap {\n\tlinear: \"linear\";\n\texponential: \"exponential\";\n\tbounce: EnvelopeCurveObject;\n\tcosine: EnvelopeCurveObject;\n\tsine: EnvelopeCurveObject;\n\tripple: EnvelopeCurveObject;\n\tstep: EnvelopeCurveObject;\n}\n\ntype EnvelopeCurveName = keyof EnvelopeCurveMap;\n\n/**\n * Generate some complex envelope curves.\n */\nconst EnvelopeCurves: EnvelopeCurveMap = (() => {\n\n\tconst curveLen = 128;\n\n\tlet i: number;\n\tlet k: number;\n\n\t// cosine curve\n\tconst cosineCurve: number[] = [];\n\tfor (i = 0; i < curveLen; i++) {\n\t\tcosineCurve[i] = Math.sin((i / (curveLen - 1)) * (Math.PI / 2));\n\t}\n\n\t// ripple curve\n\tconst rippleCurve: number[] = [];\n\tconst rippleCurveFreq = 6.4;\n\tfor (i = 0; i < curveLen - 1; i++) {\n\t\tk = (i / (curveLen - 1));\n\t\tconst sineWave = Math.sin(k * (Math.PI * 2) * rippleCurveFreq - Math.PI / 2) + 1;\n\t\trippleCurve[i] = sineWave / 10 + k * 0.83;\n\t}\n\trippleCurve[curveLen - 1] = 1;\n\n\t// stairs curve\n\tconst stairsCurve: number[] = [];\n\tconst steps = 5;\n\tfor (i = 0; i < curveLen; i++) {\n\t\tstairsCurve[i] = Math.ceil((i / (curveLen - 1)) * steps) / steps;\n\t}\n\n\t// in-out easing curve\n\tconst sineCurve: number[] = [];\n\tfor (i = 0; i < curveLen; i++) {\n\t\tk = i / (curveLen - 1);\n\t\tsineCurve[i] = 0.5 * (1 - Math.cos(Math.PI * k));\n\t}\n\n\t// a bounce curve\n\tconst bounceCurve: number[] = [];\n\tfor (i = 0; i < curveLen; i++) {\n\t\tk = i / (curveLen - 1);\n\t\tconst freq = Math.pow(k, 3) * 4 + 0.2;\n\t\tconst val = Math.cos(freq * Math.PI * 2 * k);\n\t\tbounceCurve[i] = Math.abs(val * (1 - k));\n\t}\n\n\t/**\n\t * Invert a value curve to make it work for the release\n\t */\n\tfunction invertCurve(curve: number[]): number[] {\n\t\tconst out = new Array(curve.length);\n\t\tfor (let j = 0; j < curve.length; j++) {\n\t\t\tout[j] = 1 - curve[j];\n\t\t}\n\t\treturn out;\n\t}\n\n\t/**\n\t * reverse the curve\n\t */\n\tfunction reverseCurve(curve: number[]): number[] {\n\t\treturn curve.slice(0).reverse();\n\t}\n\n\t/**\n\t * attack and release curve arrays\n\t */\n\treturn {\n\t\tbounce: {\n\t\t\tIn: invertCurve(bounceCurve),\n\t\t\tOut: bounceCurve,\n\t\t},\n\t\tcosine: {\n\t\t\tIn: cosineCurve,\n\t\t\tOut: reverseCurve(cosineCurve),\n\t\t},\n\t\texponential: \"exponential\" as \"exponential\",\n\t\tlinear: \"linear\" as \"linear\",\n\t\tripple: {\n\t\t\tIn: rippleCurve,\n\t\t\tOut: invertCurve(rippleCurve),\n\t\t},\n\t\tsine: {\n\t\t\tIn: sineCurve,\n\t\t\tOut: invertCurve(sineCurve),\n\t\t},\n\t\tstep: {\n\t\t\tIn: stairsCurve,\n\t\t\tOut: invertCurve(stairsCurve),\n\t\t},\n\t};\n})();\n","import { Volume } from \"../component/channel/Volume\";\nimport { Param } from \"../core/context/Param\";\nimport { OutputNode, ToneAudioNode, ToneAudioNodeOptions } from \"../core/context/ToneAudioNode\";\nimport { Decibels, Frequency, NormalRange, Time } from \"../core/type/Units\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { readOnly } from \"../core/util/Interface\";\n\nexport interface InstrumentOptions extends ToneAudioNodeOptions {\n\tvolume: Decibels;\n}\n\n/**\n * Base-class for all instruments\n */\nexport abstract class Instrument<Options extends InstrumentOptions> extends ToneAudioNode<Options> {\n\n\t/**\n\t * The output and volume triming node\n\t */\n\tprivate _volume: Volume;\n\toutput: OutputNode;\n\n\t/**\n\t * The instrument only has an output\n\t */\n\tinput: undefined;\n\n\t/**\n\t * The volume of the output in decibels.\n\t * @example\n\t * const amSynth = new Tone.AMSynth().toDestination();\n\t * amSynth.volume.value = -6;\n\t * amSynth.triggerAttackRelease(\"G#3\", 0.2);\n\t */\n\tvolume: Param<\"decibels\">;\n\n\t/**\n\t * Keep track of all events scheduled to the transport\n\t * when the instrument is 'synced'\n\t */\n\tprivate _scheduledEvents: number[] = [];\n\n\t/**\n\t * If the instrument is currently synced\n\t */\n\tprivate _synced = false;\n\n\tconstructor(options?: Partial<InstrumentOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Instrument.getDefaults(), arguments));\n\t\tconst options = optionsFromArguments(Instrument.getDefaults(), arguments);\n\n\t\tthis._volume = this.output = new Volume({\n\t\t\tcontext: this.context,\n\t\t\tvolume: options.volume,\n\t\t});\n\t\tthis.volume = this._volume.volume;\n\t\treadOnly(this, \"volume\");\n\t}\n\n\tstatic getDefaults(): InstrumentOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tvolume: 0,\n\t\t});\n\t}\n\n\t/**\n\t * Sync the instrument to the Transport. All subsequent calls of\n\t * [[triggerAttack]] and [[triggerRelease]] will be scheduled along the transport.\n\t * @example\n\t * const fmSynth = new Tone.FMSynth().toDestination();\n\t * fmSynth.volume.value = -6;\n\t * fmSynth.sync();\n\t * // schedule 3 notes when the transport first starts\n\t * fmSynth.triggerAttackRelease(\"C4\", \"8n\", 0);\n\t * fmSynth.triggerAttackRelease(\"E4\", \"8n\", \"8n\");\n\t * fmSynth.triggerAttackRelease(\"G4\", \"8n\", \"4n\");\n\t * // start the transport to hear the notes\n\t * Tone.Transport.start();\n\t */\n\tsync(): this {\n\t\tif (this._syncState()) {\n\t\t\tthis._syncMethod(\"triggerAttack\", 1);\n\t\t\tthis._syncMethod(\"triggerRelease\", 0);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * set _sync\n\t */\n\tprotected _syncState(): boolean {\n\t\tlet changed = false;\n\t\tif (!this._synced) {\n\t\t\tthis._synced = true;\n\t\t\tchanged = true;\n\t\t}\n\t\treturn changed;\n\t}\n\n\t/**\n\t * Wrap the given method so that it can be synchronized\n\t * @param method Which method to wrap and sync\n\t * @param timePosition What position the time argument appears in\n\t */\n\tprotected _syncMethod(method: string, timePosition: number): void {\n\t\tconst originalMethod = this[\"_original_\" + method] = this[method];\n\t\tthis[method] = (...args: any[]) => {\n\t\t\tconst time = args[timePosition];\n\t\t\tconst id = this.context.transport.schedule((t) => {\n\t\t\t\targs[timePosition] = t;\n\t\t\t\toriginalMethod.apply(this, args);\n\t\t\t}, time);\n\t\t\tthis._scheduledEvents.push(id);\n\t\t};\n\t}\n\n\t/**\n\t * Unsync the instrument from the Transport\n\t */\n\tunsync(): this {\n\t\tthis._scheduledEvents.forEach(id => this.context.transport.clear(id));\n\t\tthis._scheduledEvents = [];\n\t\tif (this._synced) {\n\t\t\tthis._synced = false;\n\t\t\tthis.triggerAttack = this._original_triggerAttack;\n\t\t\tthis.triggerRelease = this._original_triggerRelease;\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Trigger the attack and then the release after the duration.\n\t * @param note The note to trigger.\n\t * @param duration How long the note should be held for before\n\t * triggering the release. This value must be greater than 0.\n\t * @param time When the note should be triggered.\n\t * @param velocity The velocity the note should be triggered at.\n\t * @example\n\t * const synth = new Tone.Synth().toDestination();\n\t * // trigger \"C4\" for the duration of an 8th note\n\t * synth.triggerAttackRelease(\"C4\", \"8n\");\n\t */\n\ttriggerAttackRelease(note: Frequency, duration: Time, time?: Time, velocity?: NormalRange): this {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tconst computedDuration = this.toSeconds(duration);\n\t\tthis.triggerAttack(note, computedTime, velocity);\n\t\tthis.triggerRelease(computedTime + computedDuration);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Start the instrument's note.\n\t * @param note the note to trigger\n\t * @param time the time to trigger the ntoe\n\t * @param velocity the velocity to trigger the note (betwee 0-1)\n\t */\n\tabstract triggerAttack(note: Frequency, time?: Time, velocity?: NormalRange): this;\n\tprivate _original_triggerAttack = this.triggerAttack;\n\n\t/**\n\t * Trigger the release phase of the current note.\n\t * @param time when to trigger the release\n\t */\n\tabstract triggerRelease(...args: any[]): this;\n\tprivate _original_triggerRelease = this.triggerRelease;\n\n\t/**\n\t * clean up\n\t * @returns {Instrument} this\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._volume.dispose();\n\t\tthis.unsync();\n\t\tthis._scheduledEvents = [];\n\t\treturn this;\n\t}\n}\n","import { FrequencyClass } from \"../core/type/Frequency\";\nimport { Cents, Frequency, NormalRange, Seconds, Time } from \"../core/type/Units\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { noOp } from \"../core/util/Interface\";\nimport { Instrument, InstrumentOptions } from \"../instrument/Instrument\";\nimport { Signal } from \"../signal/Signal\";\nimport { timeRange } from \"../core/util/Decorator\";\n\ntype onSilenceCallback = (instrument: Monophonic<any>) => void;\n\nexport interface MonophonicOptions extends InstrumentOptions {\n\tportamento: Seconds;\n\tonsilence: onSilenceCallback;\n\tdetune: Cents;\n}\n\n/**\n * Abstract base class for other monophonic instruments to extend.\n */\nexport abstract class Monophonic<Options extends MonophonicOptions> extends Instrument<Options> {\n\n\t/**\n\t * The glide time between notes.\n\t */\n\t@timeRange(0)\n\tportamento: Seconds;\n\n\t/**\n\t * Invoked when the release has finished and the output is silent.\n\t */\n\tonsilence: onSilenceCallback;\n\n\t/**\n\t * The instrument's frequency signal.\n\t */\n\tabstract readonly frequency: Signal<\"frequency\">;\n\n\t/**\n\t * The instrument's detune control signal.\n\t */\n\tabstract readonly detune: Signal<\"cents\">;\n\n\tconstructor(options?: Partial<MonophonicOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Monophonic.getDefaults(), arguments));\n\t\tconst options = optionsFromArguments(Monophonic.getDefaults(), arguments);\n\n\t\tthis.portamento = options.portamento;\n\t\tthis.onsilence = options.onsilence;\n\t}\n\n\tstatic getDefaults(): MonophonicOptions {\n\t\treturn Object.assign(Instrument.getDefaults(), {\n\t\t\tdetune: 0,\n\t\t\tonsilence: noOp,\n\t\t\tportamento: 0,\n\t\t});\n\t}\n\n\t/**\n\t * Trigger the attack of the note optionally with a given velocity.\n\t * @param note The note to trigger.\n\t * @param time When the note should start.\n\t * @param velocity The velocity scaler determines how \"loud\" the note will be triggered.\n\t * @example\n\t * const synth = new Tone.Synth().toDestination();\n\t * // trigger the note a half second from now at half velocity\n\t * synth.triggerAttack(\"C4\", \"+0.5\", 0.5);\n\t */\n\ttriggerAttack(note: Frequency | FrequencyClass, time?: Time, velocity: NormalRange = 1): this {\n\t\tthis.log(\"triggerAttack\", note, time, velocity);\n\t\tconst seconds = this.toSeconds(time);\n\t\tthis._triggerEnvelopeAttack(seconds, velocity);\n\t\tthis.setNote(note, seconds);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Trigger the release portion of the envelope\n\t * @param time If no time is given, the release happens immediatly\n\t * @example\n\t * const synth = new Tone.Synth().toDestination();\n\t * synth.triggerAttack(\"C4\");\n\t * // trigger the release a second from now\n\t * synth.triggerRelease(\"+1\");\n\t */\n\ttriggerRelease(time?: Time): this {\n\t\tthis.log(\"triggerRelease\", time);\n\t\tconst seconds = this.toSeconds(time);\n\t\tthis._triggerEnvelopeRelease(seconds);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Internal method which starts the envelope attack\n\t */\n\tprotected abstract _triggerEnvelopeAttack(time: Seconds, velocity: NormalRange): void;\n\n\t/**\n\t * Internal method which starts the envelope release\n\t */\n\tprotected abstract _triggerEnvelopeRelease(time: Seconds): void;\n\n\t/**\n\t * Get the level of the output at the given time. Measures\n\t * the envelope(s) value at the time.\n\t * @param time The time to query the envelope value\n\t * @return The output level between 0-1\n\t */\n\tabstract getLevelAtTime(time: Time): NormalRange;\n\n\t/**\n\t * Set the note at the given time. If no time is given, the note\n\t * will set immediately.\n\t * @param note The note to change to.\n\t * @param time The time when the note should be set.\n\t * @example\n\t * const synth = new Tone.Synth().toDestination();\n\t * synth.triggerAttack(\"C4\");\n\t * // change to F#6 in one quarter note from now.\n\t * synth.setNote(\"F#6\", \"+4n\");\n\t */\n\tsetNote(note: Frequency | FrequencyClass, time?: Time): this {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tconst computedFrequency = note instanceof FrequencyClass ? note.toFrequency() : note;\n\t\tif (this.portamento > 0 && this.getLevelAtTime(computedTime) > 0.05) {\n\t\t\tconst portTime = this.toSeconds(this.portamento);\n\t\t\tthis.frequency.exponentialRampTo(computedFrequency, portTime, computedTime);\n\t\t} else {\n\t\t\tthis.frequency.setValueAtTime(computedFrequency, computedTime);\n\t\t}\n\t\treturn this;\n\t}\n}\n","import { Gain } from \"../../core/context/Gain\";\nimport { NormalRange, Time } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { Envelope, EnvelopeOptions } from \"./Envelope\";\n\n/**\n * AmplitudeEnvelope is a Tone.Envelope connected to a gain node.\n * Unlike Tone.Envelope, which outputs the envelope's value, AmplitudeEnvelope accepts\n * an audio signal as the input and will apply the envelope to the amplitude\n * of the signal.\n * Read more about ADSR Envelopes on [Wikipedia](https://en.wikipedia.org/wiki/Synthesizer#ADSR_envelope).\n *\n * @example\n * return Tone.Offline(() => {\n * \tconst ampEnv = new Tone.AmplitudeEnvelope({\n * \t\tattack: 0.1,\n * \t\tdecay: 0.2,\n * \t\tsustain: 1.0,\n * \t\trelease: 0.8\n * \t}).toDestination();\n * \t// create an oscillator and connect it\n * \tconst osc = new Tone.Oscillator().connect(ampEnv).start();\n * \t// trigger the envelopes attack and release \"8t\" apart\n * \tampEnv.triggerAttackRelease(\"8t\");\n * }, 1.5, 1);\n * @category Component\n */\nexport class AmplitudeEnvelope extends Envelope {\n\n\treadonly name: string = \"AmplitudeEnvelope\";\n\n\tprivate _gainNode: Gain = new Gain({\n\t\tcontext: this.context,\n\t\tgain: 0,\n\t});\n\toutput: Gain = this._gainNode;\n\tinput: Gain = this._gainNode;\n\n\t/**\n\t * @param attack The amount of time it takes for the envelope to go from 0 to it's maximum value.\n\t * @param decay\tThe period of time after the attack that it takes for the envelope\n\t * \tto fall to the sustain value. Value must be greater than 0.\n\t * @param sustain\tThe percent of the maximum value that the envelope rests at until\n\t * \tthe release is triggered.\n\t * @param release\tThe amount of time after the release is triggered it takes to reach 0.\n\t * \tValue must be greater than 0.\n\t */\n\tconstructor(attack?: Time, decay?: Time, sustain?: NormalRange, release?: Time);\n\tconstructor(options?: Partial<EnvelopeOptions>)\n\tconstructor() {\n\t\tsuper(optionsFromArguments(AmplitudeEnvelope.getDefaults(), arguments, [\"attack\", \"decay\", \"sustain\", \"release\"]));\n\t\tthis._sig.connect(this._gainNode.gain);\n\t\tthis.output = this._gainNode;\n\t\tthis.input = this._gainNode;\n\t}\n\n\t/**\n\t * Clean up\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._gainNode.dispose();\n\t\treturn this;\n\t}\n}\n","import { AmplitudeEnvelope } from \"../component/envelope/AmplitudeEnvelope\";\nimport { Envelope, EnvelopeOptions } from \"../component/envelope/Envelope\";\nimport { ToneAudioNode, ToneAudioNodeOptions } from \"../core/context/ToneAudioNode\";\nimport { NormalRange, Seconds, Time } from \"../core/type/Units\";\nimport { omitFromObject, optionsFromArguments } from \"../core/util/Defaults\";\nimport { readOnly } from \"../core/util/Interface\";\nimport { RecursivePartial } from \"../core/util/Interface\";\nimport { Signal } from \"../signal/Signal\";\nimport { OmniOscillator } from \"../source/oscillator/OmniOscillator\";\nimport { OmniOscillatorOptions, OmniOscillatorSynthOptions } from \"../source/oscillator/OscillatorInterface\";\nimport { Source } from \"../source/Source\";\nimport { Monophonic, MonophonicOptions } from \"./Monophonic\";\n\nexport interface SynthOptions extends MonophonicOptions {\n\toscillator: OmniOscillatorSynthOptions;\n\tenvelope: Omit<EnvelopeOptions, keyof ToneAudioNodeOptions>;\n}\n\n/**\n * Synth is composed simply of a [[OmniOscillator]] routed through an [[AmplitudeEnvelope]].\n * ```\n * +----------------+ +-------------------+\n * | OmniOscillator +>--> AmplitudeEnvelope +>--> Output\n * +----------------+ +-------------------+\n * ```\n * @example\n * const synth = new Tone.Synth().toDestination();\n * synth.triggerAttackRelease(\"C4\", \"8n\");\n * @category Instrument\n */\nexport class Synth<Options extends SynthOptions = SynthOptions> extends Monophonic<Options> {\n\n\treadonly name: string = \"Synth\";\n\n\t/**\n\t * The oscillator.\n\t */\n\treadonly oscillator: OmniOscillator<any>;\n\n\t/**\n\t * The frequency signal\n\t */\n\treadonly frequency: Signal<\"frequency\">;\n\n\t/**\n\t * The detune signal\n\t */\n\treadonly detune: Signal<\"cents\">;\n\n\t/**\n\t * The envelope\n\t */\n\treadonly envelope: AmplitudeEnvelope;\n\n\t/**\n\t * @param options the options available for the synth.\n\t */\n\tconstructor(options?: RecursivePartial<SynthOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(Synth.getDefaults(), arguments));\n\t\tconst options = optionsFromArguments(Synth.getDefaults(), arguments);\n\n\t\tthis.oscillator = new OmniOscillator(Object.assign({\n\t\t\tcontext: this.context,\n\t\t\tdetune: options.detune,\n\t\t\tonstop: () => this.onsilence(this),\n\t\t}, options.oscillator));\n\n\t\tthis.frequency = this.oscillator.frequency;\n\t\tthis.detune = this.oscillator.detune;\n\n\t\tthis.envelope = new AmplitudeEnvelope(Object.assign({\n\t\t\tcontext: this.context,\n\t\t}, options.envelope));\n\n\t\t// connect the oscillators to the output\n\t\tthis.oscillator.chain(this.envelope, this.output);\n\t\treadOnly(this, [\"oscillator\", \"frequency\", \"detune\", \"envelope\"]);\n\t}\n\n\tstatic getDefaults(): SynthOptions {\n\t\treturn Object.assign(Monophonic.getDefaults(), {\n\t\t\tenvelope: Object.assign(\n\t\t\t\tomitFromObject(Envelope.getDefaults(), Object.keys(ToneAudioNode.getDefaults())),\n\t\t\t\t{\n\t\t\t\t\tattack: 0.005,\n\t\t\t\t\tdecay: 0.1,\n\t\t\t\t\trelease: 1,\n\t\t\t\t\tsustain: 0.3,\n\t\t\t\t},\n\t\t\t),\n\t\t\toscillator: Object.assign(\n\t\t\t\tomitFromObject(OmniOscillator.getDefaults(), [...Object.keys(Source.getDefaults()), \"frequency\", \"detune\"]),\n\t\t\t\t{\n\t\t\t\t\ttype: \"triangle\",\n\t\t\t\t},\n\t\t\t) as OmniOscillatorOptions,\n\t\t});\n\t}\n\n\t/**\n\t * start the attack portion of the envelope\n\t * @param time the time the attack should start\n\t * @param velocity the velocity of the note (0-1)\n\t */\n\tprotected _triggerEnvelopeAttack(time: Seconds, velocity: number): void {\n\t\t// the envelopes\n\t\tthis.envelope.triggerAttack(time, velocity);\n\t\tthis.oscillator.start(time);\n\t\t// if there is no release portion, stop the oscillator\n\t\tif (this.envelope.sustain === 0) {\n\t\t\tconst computedAttack = this.toSeconds(this.envelope.attack);\n\t\t\tconst computedDecay = this.toSeconds(this.envelope.decay);\n\t\t\tthis.oscillator.stop(time + computedAttack + computedDecay);\n\t\t}\n\t}\n\n\t/**\n\t * start the release portion of the envelope\n\t * @param time the time the release should start\n\t */\n\tprotected _triggerEnvelopeRelease(time: Seconds): void {\n\t\tthis.envelope.triggerRelease(time);\n\t\tthis.oscillator.stop(time + this.toSeconds(this.envelope.release));\n\t}\n\n\tgetLevelAtTime(time: Time): NormalRange {\n\t\ttime = this.toSeconds(time);\n\t\treturn this.envelope.getValueAtTime(time);\n\t}\n\n\t/**\n\t * clean up\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.oscillator.dispose();\n\t\tthis.envelope.dispose();\n\t\treturn this;\n\t}\n}\n","import { Signal } from \"../signal/Signal\";\nimport { Multiply } from \"../signal/Multiply\";\nimport { Gain } from \"../core/context/Gain\";\nimport { NormalRange, Positive, Seconds, Time } from \"../core/type/Units\";\nimport { Envelope, EnvelopeOptions } from \"../component/envelope/Envelope\";\nimport { ToneAudioNode, ToneAudioNodeOptions } from \"../core/context/ToneAudioNode\";\nimport { Monophonic } from \"./Monophonic\";\nimport { OmniOscillator } from \"../source/oscillator/OmniOscillator\";\nimport { OmniOscillatorSynthOptions } from \"../source/oscillator/OscillatorInterface\";\nimport { Source } from \"../source/Source\";\nimport { Synth, SynthOptions } from \"./Synth\";\nimport { AmplitudeEnvelope } from \"../component/envelope/AmplitudeEnvelope\";\nimport { readOnly, RecursivePartial } from \"../core/util/Interface\";\nimport { omitFromObject, optionsFromArguments } from \"../core/util/Defaults\";\n\nexport interface ModulationSynthOptions extends SynthOptions {\n\tharmonicity: Positive;\n\tmodulationEnvelope: Omit<EnvelopeOptions, keyof ToneAudioNodeOptions>;\n\tmodulation: OmniOscillatorSynthOptions;\n}\n/**\n * Base class for both AM and FM synths\n */\nexport abstract class ModulationSynth<Options extends ModulationSynthOptions> extends Monophonic<Options> {\n\n\treadonly name: string = \"ModulationSynth\";\n\n\t/**\n\t * The carrier voice.\n\t */\n\tprotected _carrier: Synth;\n\n\t/**\n\t * The modulator voice.\n\t */\n\n\tprotected _modulator: Synth;\n\n\t/**\n\t * The carrier's oscillator\n\t */\n\treadonly oscillator: OmniOscillator<any>;\n\n\t/**\n\t * The carrier's envelope\n\t */\n\treadonly envelope: AmplitudeEnvelope;\n\n\t/**\n\t * The modulator's oscillator which is applied to the amplitude of the oscillator\n\t */\n\treadonly modulation: OmniOscillator<any>;\n\n\t/**\n\t * The modulator's envelope\n\t */\n\treadonly modulationEnvelope: AmplitudeEnvelope;\n\n\t/**\n\t * The frequency control\n\t */\n\treadonly frequency: Signal<\"frequency\">;\n\n\t/**\n\t * The detune in cents\n\t */\n\treadonly detune: Signal<\"cents\">;\n\n\t/**\n\t * Harmonicity is the ratio between the two voices. A harmonicity of\n\t * 1 is no change. Harmonicity = 2 means a change of an octave.\n\t * @example\n\t * const amSynth = new Tone.AMSynth().toDestination();\n\t * // pitch the modulator an octave below oscillator\n\t * amSynth.harmonicity.value = 0.5;\n\t * amSynth.triggerAttackRelease(\"C5\", \"4n\");\n\t */\n\treadonly harmonicity: Multiply;\n\n\t/**\n\t * The node where the modulation happens\n\t */\n\tprotected _modulationNode: Gain;\n\n\tconstructor(options?: RecursivePartial<ModulationSynthOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(ModulationSynth.getDefaults(), arguments));\n\t\tconst options = optionsFromArguments(ModulationSynth.getDefaults(), arguments);\n\n\t\tthis._carrier = new Synth({\n\t\t\tcontext: this.context,\n\t\t\toscillator: options.oscillator,\n\t\t\tenvelope: options.envelope,\n\t\t\tonsilence: () => this.onsilence(this),\n\t\t\tvolume: -10,\n\t\t});\n\t\tthis._modulator = new Synth({\n\t\t\tcontext: this.context,\n\t\t\toscillator: options.modulation,\n\t\t\tenvelope: options.modulationEnvelope,\n\t\t\tvolume: -10,\n\t\t});\n\n\t\tthis.oscillator = this._carrier.oscillator;\n\t\tthis.envelope = this._carrier.envelope;\n\t\tthis.modulation = this._modulator.oscillator;\n\t\tthis.modulationEnvelope = this._modulator.envelope;\n\n\t\tthis.frequency = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"frequency\",\n\t\t});\n\t\tthis.detune = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tvalue: options.detune,\n\t\t\tunits: \"cents\"\n\t\t});\n\t\tthis.harmonicity = new Multiply({\n\t\t\tcontext: this.context,\n\t\t\tvalue: options.harmonicity,\n\t\t\tminValue: 0,\n\t\t});\n\t\tthis._modulationNode = new Gain({\n\t\t\tcontext: this.context,\n\t\t\tgain: 0,\n\t\t});\n\n\t\treadOnly(this, [\"frequency\", \"harmonicity\", \"oscillator\", \"envelope\", \"modulation\", \"modulationEnvelope\", \"detune\"]);\n\t}\n\n\tstatic getDefaults(): ModulationSynthOptions {\n\t\treturn Object.assign(Monophonic.getDefaults(), {\n\t\t\tharmonicity: 3,\n\t\t\toscillator: Object.assign(\n\t\t\t\tomitFromObject(OmniOscillator.getDefaults(), [\n\t\t\t\t\t...Object.keys(Source.getDefaults()),\n\t\t\t\t\t\"frequency\",\n\t\t\t\t\t\"detune\"\n\t\t\t\t]),\n\t\t\t\t{\n\t\t\t\t\ttype: \"sine\"\n\t\t\t\t}\n\t\t\t) as OmniOscillatorSynthOptions,\n\t\t\tenvelope: Object.assign(\n\t\t\t\tomitFromObject(\n\t\t\t\t\tEnvelope.getDefaults(),\n\t\t\t\t\tObject.keys(ToneAudioNode.getDefaults())\n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\tattack: 0.01,\n\t\t\t\t\tdecay: 0.01,\n\t\t\t\t\tsustain: 1,\n\t\t\t\t\trelease: 0.5\n\t\t\t\t}\n\t\t\t),\n\t\t\tmodulation: Object.assign(\n\t\t\t\tomitFromObject(OmniOscillator.getDefaults(), [\n\t\t\t\t\t...Object.keys(Source.getDefaults()),\n\t\t\t\t\t\"frequency\",\n\t\t\t\t\t\"detune\"\n\t\t\t\t]),\n\t\t\t\t{\n\t\t\t\t\ttype: \"square\"\n\t\t\t\t}\n\t\t\t) as OmniOscillatorSynthOptions,\n\t\t\tmodulationEnvelope: Object.assign(\n\t\t\t\tomitFromObject(\n\t\t\t\t\tEnvelope.getDefaults(),\n\t\t\t\t\tObject.keys(ToneAudioNode.getDefaults())\n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\tattack: 0.5,\n\t\t\t\t\tdecay: 0.0,\n\t\t\t\t\tsustain: 1,\n\t\t\t\t\trelease: 0.5\n\t\t\t\t}\n\t\t\t)\n\t\t});\n\t}\n\n\t/**\n\t * Trigger the attack portion of the note\n\t */\n\tprotected _triggerEnvelopeAttack(time: Seconds, velocity: number): void {\n\t\t// @ts-ignore\n\t\tthis._carrier._triggerEnvelopeAttack(time, velocity);\n\t\t// @ts-ignore\n\t\tthis._modulator._triggerEnvelopeAttack(time, velocity);\n\t}\n\n\t/**\n\t * Trigger the release portion of the note\n\t */\n\tprotected _triggerEnvelopeRelease(time: Seconds) {\n\t\t// @ts-ignore\n\t\tthis._carrier._triggerEnvelopeRelease(time);\n\t\t// @ts-ignore\n\t\tthis._modulator._triggerEnvelopeRelease(time);\n\t\treturn this;\n\t}\n\n\tgetLevelAtTime(time: Time): NormalRange {\n\t\ttime = this.toSeconds(time);\n\t\treturn this.envelope.getValueAtTime(time);\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._carrier.dispose();\n\t\tthis._modulator.dispose();\n\t\tthis.frequency.dispose();\n\t\tthis.detune.dispose();\n\t\tthis.harmonicity.dispose();\n\t\tthis._modulationNode.dispose();\n\t\treturn this;\n\t}\n}\n","import { AudioToGain } from \"../signal/AudioToGain\";\nimport { RecursivePartial } from \"../core/util/Interface\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { ModulationSynth, ModulationSynthOptions } from \"./ModulationSynth\";\n\nexport type AMSynthOptions = ModulationSynthOptions;\n\n/**\n * AMSynth uses the output of one Tone.Synth to modulate the\n * amplitude of another Tone.Synth. The harmonicity (the ratio between\n * the two signals) affects the timbre of the output signal greatly.\n * Read more about Amplitude Modulation Synthesis on\n * [SoundOnSound](https://web.archive.org/web/20160404103653/http://www.soundonsound.com:80/sos/mar00/articles/synthsecrets.htm).\n *\n * @example\n * const synth = new Tone.AMSynth().toDestination();\n * synth.triggerAttackRelease(\"C4\", \"4n\");\n * \n * @category Instrument\n */\nexport class AMSynth extends ModulationSynth<AMSynthOptions> {\n\n\treadonly name: string = \"AMSynth\";\n\n\t/**\n\t * Scale the oscillator from -1,1 to 0-1\n\t */\n\tprivate _modulationScale: AudioToGain;\n\n\tconstructor(options?: RecursivePartial<AMSynthOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(AMSynth.getDefaults(), arguments));\n\n\t\tthis._modulationScale = new AudioToGain({\n\t\t\tcontext: this.context,\n\t\t});\n\n\t\t// control the two voices frequency\n\t\tthis.frequency.connect(this._carrier.frequency);\n\t\tthis.frequency.chain(this.harmonicity, this._modulator.frequency);\n\t\tthis.detune.fan(this._carrier.detune, this._modulator.detune);\n\t\tthis._modulator.chain(this._modulationScale, this._modulationNode.gain);\n\t\tthis._carrier.chain(this._modulationNode, this.output);\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._modulationScale.dispose();\n\t\treturn this;\n\t}\n}\n","import { ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { Cents, Frequency, GainFactor } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { Param } from \"../../core/context/Param\";\nimport { assert } from \"../../core/util/Debug\";\n\nexport interface BiquadFilterOptions extends ToneAudioNodeOptions {\n\tfrequency: Frequency;\n\tdetune: Cents;\n\tQ: number;\n\ttype: BiquadFilterType;\n\tgain: GainFactor;\n}\n\n/**\n * Thin wrapper around the native Web Audio [BiquadFilterNode](https://webaudio.github.io/web-audio-api/#biquadfilternode). \n * BiquadFilter is similar to [[Filter]] but doesn't have the option to set the \"rolloff\" value. \n * @category Component\n */\nexport class BiquadFilter extends ToneAudioNode<BiquadFilterOptions> {\n\treadonly name: string = \"BiquadFilter\";\n\n\treadonly input: BiquadFilterNode;\n\treadonly output: BiquadFilterNode;\n\n\t/**\n\t * The frequency of the filter\n\t */\n\treadonly frequency: Param<\"frequency\">;\n\n\t/**\n\t * A detune value, in cents, for the frequency.\n\t */\n\treadonly detune: Param<\"cents\">;\n\t\n\t/**\n\t * The Q factor of the filter.\n\t * For lowpass and highpass filters the Q value is interpreted to be in dB. \n\t * For these filters the nominal range is [−𝑄𝑙𝑖𝑚,𝑄𝑙𝑖𝑚] where 𝑄𝑙𝑖𝑚 is the largest value for which 10𝑄/20 does not overflow. This is approximately 770.63678.\n\t * For the bandpass, notch, allpass, and peaking filters, this value is a linear value. \n\t * The value is related to the bandwidth of the filter and hence should be a positive value. The nominal range is \n\t * [0,3.4028235𝑒38], the upper limit being the most-positive-single-float.\n\t * This is not used for the lowshelf and highshelf filters.\n\t */\n\treadonly Q: Param<\"number\">;\n\n\t/**\n\t * The gain of the filter. Its value is in dB units. The gain is only used for lowshelf, highshelf, and peaking filters.\n\t */\n\treadonly gain: Param<\"decibels\">;\n\n\tprivate readonly _filter: BiquadFilterNode;\n\n\t/**\n\t * @param frequency The cutoff frequency of the filter.\n\t * @param type The type of filter.\n\t */\n\tconstructor(frequency?: Frequency, type?: BiquadFilterType);\n\tconstructor(options?: Partial<BiquadFilterOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(BiquadFilter.getDefaults(), arguments, [\"frequency\", \"type\"]));\n\t\tconst options = optionsFromArguments(BiquadFilter.getDefaults(), arguments, [\"frequency\", \"type\"]);\n\n\t\tthis._filter = this.context.createBiquadFilter();\n\t\tthis.input = this.output = this._filter;\n\n\t\tthis.Q = new Param({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"number\",\n\t\t\tvalue: options.Q,\n\t\t\tparam: this._filter.Q,\n\t\t});\n\t\t\n\t\tthis.frequency = new Param({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"frequency\",\n\t\t\tvalue: options.frequency,\n\t\t\tparam: this._filter.frequency,\n\t\t});\n\t\t\n\t\tthis.detune = new Param({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"cents\",\n\t\t\tvalue: options.detune,\n\t\t\tparam: this._filter.detune,\n\t\t});\n\t\t\n\t\tthis.gain = new Param({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"decibels\",\n\t\t\tconvert: false,\n\t\t\tvalue: options.gain,\n\t\t\tparam: this._filter.gain,\n\t\t});\n\n\t\tthis.type = options.type;\n\t}\n\n\tstatic getDefaults(): BiquadFilterOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tQ: 1,\n\t\t\ttype: \"lowpass\" as const,\n\t\t\tfrequency: 350,\n\t\t\tdetune: 0,\n\t\t\tgain: 0,\n\t\t});\n\t}\n\n\t/**\n\t * The type of this BiquadFilterNode. For a complete list of types and their attributes, see the\n\t * [Web Audio API](https://webaudio.github.io/web-audio-api/#dom-biquadfiltertype-lowpass)\n\t */\n\tget type(): BiquadFilterType {\n\t\treturn this._filter.type;\n\t}\n\tset type(type) {\n\t\tconst types: BiquadFilterType[] = [\"lowpass\", \"highpass\", \"bandpass\",\n\t\t\t\"lowshelf\", \"highshelf\", \"notch\", \"allpass\", \"peaking\"];\n\t\tassert(types.indexOf(type) !== -1, `Invalid filter type: ${type}`);\n\t\tthis._filter.type = type;\n\t}\n\n\t/**\n\t * Get the frequency response curve. This curve represents how the filter\n\t * responses to frequencies between 20hz-20khz.\n\t * @param len The number of values to return\n\t * @return The frequency response curve between 20-20kHz\n\t */\n\tgetFrequencyResponse(len = 128): Float32Array {\n\t\t// start with all 1s\n\t\tconst freqValues = new Float32Array(len);\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tconst norm = Math.pow(i / len, 2);\n\t\t\tconst freq = norm * (20000 - 20) + 20;\n\t\t\tfreqValues[i] = freq;\n\t\t}\n\t\tconst magValues = new Float32Array(len);\n\t\tconst phaseValues = new Float32Array(len);\n\t\t// clone the filter to remove any connections which may be changing the value\n\t\tconst filterClone = this.context.createBiquadFilter();\n\t\tfilterClone.type = this.type;\n\t\tfilterClone.Q.value = this.Q.value;\n\t\tfilterClone.frequency.value = this.frequency.value as number;\n\t\tfilterClone.gain.value = this.gain.value as number;\n\t\tfilterClone.getFrequencyResponse(freqValues, magValues, phaseValues);\n\t\treturn magValues;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._filter.disconnect();\n\t\tthis.Q.dispose();\n\t\tthis.frequency.dispose();\n\t\tthis.gain.dispose();\n\t\tthis.detune.dispose();\n\t\treturn this;\n\t}\n}\n","import { Gain } from \"../../core/context/Gain\";\nimport { connectSeries, ToneAudioNode } from \"../../core/context/ToneAudioNode\";\nimport { Frequency } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { readOnly, writable } from \"../../core/util/Interface\";\nimport { isNumber } from \"../../core/util/TypeCheck\";\nimport { Signal } from \"../../signal/Signal\";\nimport { assert } from \"../../core/util/Debug\";\nimport { BiquadFilter, BiquadFilterOptions } from \"./BiquadFilter\";\n\nexport type FilterRollOff = -12 | -24 | -48 | -96;\n\nexport type FilterOptions = BiquadFilterOptions & {\n\trolloff: FilterRollOff;\n}\n\n/**\n * Tone.Filter is a filter which allows for all of the same native methods\n * as the [BiquadFilterNode](http://webaudio.github.io/web-audio-api/#the-biquadfilternode-interface).\n * Tone.Filter has the added ability to set the filter rolloff at -12\n * (default), -24 and -48.\n * @example\n * const filter = new Tone.Filter(1500, \"highpass\").toDestination();\n * filter.frequency.rampTo(20000, 10);\n * const noise = new Tone.Noise().connect(filter).start();\n * @category Component\n */\nexport class Filter extends ToneAudioNode<FilterOptions> {\n\n\treadonly name: string = \"Filter\";\n\n\treadonly input = new Gain({ context: this.context });\n\treadonly output = new Gain({ context: this.context });\n\tprivate _filters: BiquadFilter[] = [];\n\n\t/**\n\t * the rolloff value of the filter\n\t */\n\tprivate _rolloff!: FilterRollOff;\n\tprivate _type: BiquadFilterType;\n\n\t/**\n\t * The Q or Quality of the filter\n\t */\n\treadonly Q: Signal<\"positive\">;\n\n\t/**\n\t * The cutoff frequency of the filter.\n\t */\n\treadonly frequency: Signal<\"frequency\">;\n\n\t/**\n\t * The detune parameter\n\t */\n\treadonly detune: Signal<\"cents\">;\n\n\t/**\n\t * The gain of the filter, only used in certain filter types\n\t */\n\treadonly gain: Signal<\"decibels\">;\n\n\t/**\n\t * @param frequency The cutoff frequency of the filter.\n\t * @param type The type of filter.\n\t * @param rolloff The drop in decibels per octave after the cutoff frequency\n\t */\n\tconstructor(frequency?: Frequency, type?: BiquadFilterType, rolloff?: FilterRollOff);\n\tconstructor(options?: Partial<FilterOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(Filter.getDefaults(), arguments, [\"frequency\", \"type\", \"rolloff\"]));\n\t\tconst options = optionsFromArguments(Filter.getDefaults(), arguments, [\"frequency\", \"type\", \"rolloff\"]);\n\n\t\tthis._filters = [];\n\n\t\tthis.Q = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"positive\",\n\t\t\tvalue: options.Q,\n\t\t});\n\t\tthis.frequency = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"frequency\",\n\t\t\tvalue: options.frequency,\n\t\t});\n\t\tthis.detune = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"cents\",\n\t\t\tvalue: options.detune,\n\t\t});\n\t\tthis.gain = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"decibels\",\n\t\t\tconvert: false,\n\t\t\tvalue: options.gain,\n\t\t});\n\t\tthis._type = options.type;\n\t\tthis.rolloff = options.rolloff;\n\t\treadOnly(this, [\"detune\", \"frequency\", \"gain\", \"Q\"]);\n\t}\n\n\tstatic getDefaults(): FilterOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tQ: 1,\n\t\t\tdetune: 0,\n\t\t\tfrequency: 350,\n\t\t\tgain: 0,\n\t\t\trolloff: -12 as FilterRollOff,\n\t\t\ttype: \"lowpass\" as BiquadFilterType,\n\t\t});\n\t}\n\n\t/**\n\t * The type of the filter. Types: \"lowpass\", \"highpass\",\n\t * \"bandpass\", \"lowshelf\", \"highshelf\", \"notch\", \"allpass\", or \"peaking\".\n\t */\n\tget type(): BiquadFilterType {\n\t\treturn this._type;\n\t}\n\tset type(type: BiquadFilterType) {\n\t\tconst types: BiquadFilterType[] = [\"lowpass\", \"highpass\", \"bandpass\",\n\t\t\t\"lowshelf\", \"highshelf\", \"notch\", \"allpass\", \"peaking\"];\n\t\tassert(types.indexOf(type) !== -1, `Invalid filter type: ${type}`);\n\t\tthis._type = type;\n\t\tthis._filters.forEach(filter => filter.type = type);\n\t}\n\n\t/**\n\t * The rolloff of the filter which is the drop in db\n\t * per octave. Implemented internally by cascading filters.\n\t * Only accepts the values -12, -24, -48 and -96.\n\t */\n\tget rolloff(): FilterRollOff {\n\t\treturn this._rolloff;\n\t}\n\tset rolloff(rolloff) {\n\t\tconst rolloffNum = isNumber(rolloff) ? rolloff : parseInt(rolloff, 10) as FilterRollOff;\n\t\tconst possibilities = [-12, -24, -48, -96];\n\t\tlet cascadingCount = possibilities.indexOf(rolloffNum);\n\t\t// check the rolloff is valid\n\t\tassert(cascadingCount !== -1, `rolloff can only be ${possibilities.join(\", \")}`);\n\t\tcascadingCount += 1;\n\n\t\tthis._rolloff = rolloffNum;\n\t\tthis.input.disconnect();\n\t\tthis._filters.forEach(filter => filter.disconnect());\n\n\t\tthis._filters = new Array(cascadingCount);\n\t\tfor (let count = 0; count < cascadingCount; count++) {\n\t\t\tconst filter = new BiquadFilter({\n\t\t\t\tcontext: this.context,\n\t\t\t});\n\t\t\tfilter.type = this._type;\n\t\t\tthis.frequency.connect(filter.frequency);\n\t\t\tthis.detune.connect(filter.detune);\n\t\t\tthis.Q.connect(filter.Q);\n\t\t\tthis.gain.connect(filter.gain);\n\t\t\tthis._filters[count] = filter;\n\t\t}\n\t\tthis._internalChannels = this._filters;\n\t\tconnectSeries(this.input, ...this._internalChannels, this.output);\n\t}\n\n\t/**\n\t * Get the frequency response curve. This curve represents how the filter\n\t * responses to frequencies between 20hz-20khz.\n\t * @param len The number of values to return\n\t * @return The frequency response curve between 20-20kHz\n\t */\n\tgetFrequencyResponse(len = 128): Float32Array {\n\t\tconst filterClone = new BiquadFilter({\n\t\t\tfrequency: this.frequency.value,\n\t\t\tgain: this.gain.value,\n\t\t\tQ: this.Q.value,\n\t\t\ttype: this._type,\n\t\t\tdetune: this.detune.value,\n\t\t});\n\t\t// start with all 1s\n\t\tconst totalResponse = new Float32Array(len).map(() => 1);\n\t\tthis._filters.forEach(() => {\n\t\t\tconst response = filterClone.getFrequencyResponse(len);\n\t\t\tresponse.forEach((val, i) => totalResponse[i] *= val);\n\t\t});\n\t\tfilterClone.dispose();\n\t\treturn totalResponse;\n\t}\n\n\t/**\n\t * Clean up.\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._filters.forEach(filter => {\n\t\t\tfilter.dispose();\n\t\t});\n\t\twritable(this, [\"detune\", \"frequency\", \"gain\", \"Q\"]);\n\t\tthis.frequency.dispose();\n\t\tthis.Q.dispose();\n\t\tthis.detune.dispose();\n\t\tthis.gain.dispose();\n\t\treturn this;\n\t}\n}\n","import { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { Frequency, Hertz, NormalRange, Time } from \"../../core/type/Units\";\nimport { Envelope, EnvelopeOptions } from \"./Envelope\";\nimport { Scale } from \"../../signal/Scale\";\nimport { Pow } from \"../../signal/Pow\";\nimport { assertRange } from \"../../core/util/Debug\";\n\nexport interface FrequencyEnvelopeOptions extends EnvelopeOptions {\n\tbaseFrequency: Frequency;\n\toctaves: number;\n\texponent: number;\n}\n/**\n * FrequencyEnvelope is an [[Envelope]] which ramps between [[baseFrequency]]\n * and [[octaves]]. It can also have an optional [[exponent]] to adjust the curve\n * which it ramps. \n * @example\n * const oscillator = new Tone.Oscillator().toDestination().start();\n * const freqEnv = new Tone.FrequencyEnvelope({\n * \tattack: 0.2,\n * \tbaseFrequency: \"C2\",\n * \toctaves: 4\n * });\n * freqEnv.connect(oscillator.frequency);\n * freqEnv.triggerAttack();\n * @category Component\n */\nexport class FrequencyEnvelope extends Envelope {\n\n\treadonly name: string = \"FrequencyEnvelope\";\n\n\t/**\n\t * Private reference to the base frequency as a number\n\t */\n\tprivate _baseFrequency: Hertz;\n\n\t/**\n\t * The number of octaves\n\t */\n\tprivate _octaves: number;\n\n\t/**\n\t * Internal scaler from 0-1 to the final output range\n\t */\n\tprivate _scale: Scale;\n\n\t/**\n\t * Apply a power curve to the output\n\t */\n\tprivate _exponent: Pow;\n\n\t/**\n\t * @param attack\tthe attack time in seconds\n\t * @param decay\t\tthe decay time in seconds\n\t * @param sustain \ta percentage (0-1) of the full amplitude\n\t * @param release\tthe release time in seconds\n\t */\n\tconstructor(attack?: Time, decay?: Time, sustain?: NormalRange, release?: Time);\n\tconstructor(options?: Partial<FrequencyEnvelopeOptions>)\n\tconstructor() {\n\t\tsuper(optionsFromArguments(FrequencyEnvelope.getDefaults(), arguments, [\"attack\", \"decay\", \"sustain\", \"release\"]));\n\t\tconst options = optionsFromArguments(FrequencyEnvelope.getDefaults(), arguments, [\"attack\", \"decay\", \"sustain\", \"release\"]);\n\n\t\tthis._octaves = options.octaves;\n\t\tthis._baseFrequency = this.toFrequency(options.baseFrequency);\n\n\t\tthis._exponent = this.input = new Pow({\n\t\t\tcontext: this.context,\n\t\t\tvalue: options.exponent\n\t\t});\n\t\tthis._scale = this.output = new Scale({\n\t\t\tcontext: this.context,\n\t\t\tmin: this._baseFrequency,\n\t\t\tmax: this._baseFrequency * Math.pow(2, this._octaves),\n\t\t});\n\t\tthis._sig.chain(this._exponent, this._scale);\n\t}\n\n\tstatic getDefaults(): FrequencyEnvelopeOptions {\n\t\treturn Object.assign(Envelope.getDefaults(), {\n\t\t\tbaseFrequency: 200,\n\t\t\texponent: 1,\n\t\t\toctaves: 4,\n\t\t});\n\t}\n\n\t/**\n\t * The envelope's minimum output value. This is the value which it\n\t * starts at.\n\t */\n\tget baseFrequency(): Frequency {\n\t\treturn this._baseFrequency;\n\t}\n\tset baseFrequency(min) {\n\t\tconst freq = this.toFrequency(min);\n\t\tassertRange(freq, 0);\n\t\tthis._baseFrequency = freq;\n\t\tthis._scale.min = this._baseFrequency;\n\t\t// update the max value when the min changes\n\t\tthis.octaves = this._octaves;\n\t}\n\n\t/**\n\t * The number of octaves above the baseFrequency that the\n\t * envelope will scale to.\n\t */\n\tget octaves(): number {\n\t\treturn this._octaves;\n\t}\n\tset octaves(octaves: number) {\n\t\tthis._octaves = octaves;\n\t\tthis._scale.max = this._baseFrequency * Math.pow(2, octaves);\n\t}\n\n\t/**\n\t * The envelope's exponent value.\n\t */\n\tget exponent(): number {\n\t\treturn this._exponent.value;\n\t}\n\tset exponent(exponent) {\n\t\tthis._exponent.value = exponent;\n\t}\n\n\t/**\n\t * Clean up\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._exponent.dispose();\n\t\tthis._scale.dispose();\n\t\treturn this;\n\t}\n}\n","import { AmplitudeEnvelope } from \"../component/envelope/AmplitudeEnvelope\";\nimport { Envelope, EnvelopeOptions } from \"../component/envelope/Envelope\";\nimport { Filter, FilterOptions } from \"../component/filter/Filter\";\nimport { omitFromObject, optionsFromArguments } from \"../core/util/Defaults\";\nimport { readOnly, RecursivePartial } from \"../core/util/Interface\";\nimport { Monophonic, MonophonicOptions } from \"../instrument/Monophonic\";\nimport { OmniOscillator } from \"../source/oscillator/OmniOscillator\";\nimport { Source } from \"../source/Source\";\nimport { FrequencyEnvelope, FrequencyEnvelopeOptions } from \"../component/envelope/FrequencyEnvelope\";\nimport { NormalRange, Seconds, Time } from \"../core/type/Units\";\nimport { Signal } from \"../signal/Signal\";\nimport { ToneAudioNode, ToneAudioNodeOptions } from \"../core/context/ToneAudioNode\";\nimport { OmniOscillatorSynthOptions } from \"../source/oscillator/OscillatorInterface\";\n\nexport interface MonoSynthOptions extends MonophonicOptions {\n\toscillator: OmniOscillatorSynthOptions;\n\tenvelope: Omit<EnvelopeOptions, keyof ToneAudioNodeOptions>;\n\tfilterEnvelope: Omit<FrequencyEnvelopeOptions, keyof ToneAudioNodeOptions>;\n\tfilter: Omit<FilterOptions, keyof ToneAudioNodeOptions>;\n}\n\n/**\n * MonoSynth is composed of one `oscillator`, one `filter`, and two `envelopes`.\n * The amplitude of the Oscillator and the cutoff frequency of the\n * Filter are controlled by Envelopes.\n * <img src=\"https://docs.google.com/drawings/d/1gaY1DF9_Hzkodqf8JI1Cg2VZfwSElpFQfI94IQwad38/pub?w=924&h=240\">\n * @example\n * const synth = new Tone.MonoSynth({\n * \toscillator: {\n * \t\ttype: \"square\"\n * \t},\n * \tenvelope: {\n * \t\tattack: 0.1\n * \t}\n * }).toDestination();\n * synth.triggerAttackRelease(\"C4\", \"8n\");\n * @category Instrument\n */\nexport class MonoSynth extends Monophonic<MonoSynthOptions> {\n\n\treadonly name = \"MonoSynth\";\n\n\t/**\n\t * The oscillator.\n\t */\n\treadonly oscillator: OmniOscillator<any>;\n\n\t/**\n\t * The frequency control.\n\t */\n\treadonly frequency: Signal<\"frequency\">;\n\n\t/**\n\t * The detune control.\n\t */\n\treadonly detune: Signal<\"cents\">;\n\n\t/**\n\t * The filter.\n\t */\n\treadonly filter: Filter;\n\n\t/**\n\t * The filter envelope.\n\t */\n\treadonly filterEnvelope: FrequencyEnvelope;\n\n\t/**\n\t * The amplitude envelope.\n\t */\n\treadonly envelope: AmplitudeEnvelope;\n\n\tconstructor(options?: RecursivePartial<MonoSynthOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(MonoSynth.getDefaults(), arguments));\n\t\tconst options = optionsFromArguments(MonoSynth.getDefaults(), arguments);\n\n\t\tthis.oscillator = new OmniOscillator(Object.assign(options.oscillator, {\n\t\t\tcontext: this.context,\n\t\t\tdetune: options.detune,\n\t\t\tonstop: () => this.onsilence(this),\n\t\t}));\n\t\tthis.frequency = this.oscillator.frequency;\n\t\tthis.detune = this.oscillator.detune;\n\t\tthis.filter = new Filter(Object.assign(options.filter, { context: this.context }));\n\t\tthis.filterEnvelope = new FrequencyEnvelope(Object.assign(options.filterEnvelope, { context: this.context }));\n\t\tthis.envelope = new AmplitudeEnvelope(Object.assign(options.envelope, { context: this.context }));\n\n\t\t// connect the oscillators to the output\n\t\tthis.oscillator.chain(this.filter, this.envelope, this.output);\n\n\t\t// connect the filter envelope\n\t\tthis.filterEnvelope.connect(this.filter.frequency);\n\n\t\treadOnly(this, [\"oscillator\", \"frequency\", \"detune\", \"filter\", \"filterEnvelope\", \"envelope\"]);\n\t}\n\n\tstatic getDefaults(): MonoSynthOptions {\n\t\treturn Object.assign(Monophonic.getDefaults(), {\n\t\t\tenvelope: Object.assign(\n\t\t\t\tomitFromObject(Envelope.getDefaults(), Object.keys(ToneAudioNode.getDefaults())),\n\t\t\t\t{\n\t\t\t\t\tattack: 0.005,\n\t\t\t\t\tdecay: 0.1,\n\t\t\t\t\trelease: 1,\n\t\t\t\t\tsustain: 0.9,\n\t\t\t\t},\n\t\t\t),\n\t\t\tfilter: Object.assign(\n\t\t\t\tomitFromObject(Filter.getDefaults(), Object.keys(ToneAudioNode.getDefaults())),\n\t\t\t\t{\n\t\t\t\t\tQ: 1,\n\t\t\t\t\trolloff: -12,\n\t\t\t\t\ttype: \"lowpass\",\n\t\t\t\t},\n\t\t\t),\n\t\t\tfilterEnvelope: Object.assign(\n\t\t\t\tomitFromObject(FrequencyEnvelope.getDefaults(), Object.keys(ToneAudioNode.getDefaults())),\n\t\t\t\t{\n\t\t\t\t\tattack: 0.6,\n\t\t\t\t\tbaseFrequency: 200,\n\t\t\t\t\tdecay: 0.2,\n\t\t\t\t\texponent: 2,\n\t\t\t\t\toctaves: 3,\n\t\t\t\t\trelease: 2,\n\t\t\t\t\tsustain: 0.5,\n\t\t\t\t}\n\t\t\t),\n\t\t\toscillator: Object.assign(\n\t\t\t\tomitFromObject(OmniOscillator.getDefaults(), Object.keys(Source.getDefaults())),\n\t\t\t\t{\n\t\t\t\t\ttype: \"sawtooth\",\n\t\t\t\t},\n\t\t\t) as OmniOscillatorSynthOptions,\n\t\t});\n\t}\n\n\t/**\n\t * start the attack portion of the envelope\n\t * @param time the time the attack should start\n\t * @param velocity the velocity of the note (0-1)\n\t */\n\tprotected _triggerEnvelopeAttack(time: Seconds, velocity = 1): void {\n\t\tthis.envelope.triggerAttack(time, velocity);\n\t\tthis.filterEnvelope.triggerAttack(time);\n\t\tthis.oscillator.start(time);\n\t\tif (this.envelope.sustain === 0) {\n\t\t\tconst computedAttack = this.toSeconds(this.envelope.attack);\n\t\t\tconst computedDecay = this.toSeconds(this.envelope.decay);\n\t\t\tthis.oscillator.stop(time + computedAttack + computedDecay);\n\t\t}\n\t}\n\n\t/**\n\t * start the release portion of the envelope\n\t * @param time the time the release should start\n\t */\n\tprotected _triggerEnvelopeRelease(time: Seconds): void {\n\t\tthis.envelope.triggerRelease(time);\n\t\tthis.filterEnvelope.triggerRelease(time);\n\t\tthis.oscillator.stop(time + this.toSeconds(this.envelope.release));\n\t}\n\n\tgetLevelAtTime(time: Time): NormalRange {\n\t\ttime = this.toSeconds(time);\n\t\treturn this.envelope.getValueAtTime(time);\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.oscillator.dispose();\n\t\tthis.envelope.dispose();\n\t\tthis.filterEnvelope.dispose();\n\t\tthis.filter.dispose();\n\t\treturn this;\n\t}\n}\n","import { Monophonic, MonophonicOptions } from \"./Monophonic\";\nimport { MonoSynth, MonoSynthOptions } from \"./MonoSynth\";\nimport { Signal } from \"../signal/Signal\";\nimport { readOnly, RecursivePartial } from \"../core/util/Interface\";\nimport { LFO } from \"../source/oscillator/LFO\";\nimport { Gain, } from \"../core/context/Gain\";\nimport { Multiply } from \"../signal/Multiply\";\nimport { Frequency, NormalRange, Positive, Seconds, Time } from \"../core/type/Units\";\nimport { deepMerge, omitFromObject, optionsFromArguments } from \"../core/util/Defaults\";\nimport { Param } from \"../core/context/Param\";\n\nexport interface DuoSynthOptions extends MonophonicOptions {\n\tvoice0: Omit<MonoSynthOptions, keyof MonophonicOptions>;\n\tvoice1: Omit<MonoSynthOptions, keyof MonophonicOptions>;\n\tharmonicity: Positive;\n\tvibratoRate: Frequency;\n\tvibratoAmount: Positive;\n}\n\n/**\n * DuoSynth is a monophonic synth composed of two [[MonoSynths]] run in parallel with control over the\n * frequency ratio between the two voices and vibrato effect.\n * @example\n * const duoSynth = new Tone.DuoSynth().toDestination();\n * duoSynth.triggerAttackRelease(\"C4\", \"2n\");\n * @category Instrument\n */\nexport class DuoSynth extends Monophonic<DuoSynthOptions> {\n\n\treadonly name: string = \"DuoSynth\";\n\n\treadonly frequency: Signal<\"frequency\">;\n\treadonly detune: Signal<\"cents\">;\n\n\t/**\n\t * the first voice\n\t */\n\treadonly voice0: MonoSynth;\n\n\t/**\n\t * the second voice\n\t */\n\treadonly voice1: MonoSynth;\n\n\t/**\n\t * The amount of vibrato\n\t */\n\tpublic vibratoAmount: Param<\"normalRange\">;\n\n\t/**\n\t * the vibrato frequency\n\t */\n\tpublic vibratoRate: Signal<\"frequency\">;\n\n\t/**\n\t * Harmonicity is the ratio between the two voices. A harmonicity of\n\t * 1 is no change. Harmonicity = 2 means a change of an octave.\n\t * @example\n\t * const duoSynth = new Tone.DuoSynth().toDestination();\n\t * duoSynth.triggerAttackRelease(\"C4\", \"2n\");\n\t * // pitch voice1 an octave below voice0\n\t * duoSynth.harmonicity.value = 0.5;\n\t */\n\tpublic harmonicity: Signal<\"positive\">;\n\n\t/**\n\t * The vibrato LFO.\n\t */\n\tprivate _vibrato: LFO;\n\n\t/**\n\t * the vibrato gain\n\t */\n\tprivate _vibratoGain: Gain<\"normalRange\">;\n\n\tconstructor(options?: RecursivePartial<DuoSynthOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(DuoSynth.getDefaults(), arguments));\n\t\tconst options = optionsFromArguments(DuoSynth.getDefaults(), arguments);\n\n\t\tthis.voice0 = new MonoSynth(Object.assign(options.voice0, {\n\t\t\tcontext: this.context,\n\t\t\tonsilence: () => this.onsilence(this)\n\t\t}));\n\t\tthis.voice1 = new MonoSynth(Object.assign(options.voice1, {\n\t\t\tcontext: this.context,\n\t\t}));\n\n\t\tthis.harmonicity = new Multiply({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"positive\",\n\t\t\tvalue: options.harmonicity,\n\t\t});\n\n\t\tthis._vibrato = new LFO({\n\t\t\tfrequency: options.vibratoRate,\n\t\t\tcontext: this.context,\n\t\t\tmin: -50,\n\t\t\tmax: 50\n\t\t});\n\t\t// start the vibrato immediately\n\t\tthis._vibrato.start();\n\t\tthis.vibratoRate = this._vibrato.frequency;\n\t\tthis._vibratoGain = new Gain({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"normalRange\",\n\t\t\tgain: options.vibratoAmount\n\t\t});\n\t\tthis.vibratoAmount = this._vibratoGain.gain;\n\n\t\tthis.frequency = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"frequency\",\n\t\t\tvalue: 440\n\t\t});\n\t\tthis.detune = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"cents\",\n\t\t\tvalue: options.detune\n\t\t});\n\n\t\t// control the two voices frequency\n\t\tthis.frequency.connect(this.voice0.frequency);\n\t\tthis.frequency.chain(this.harmonicity, this.voice1.frequency);\n\n\t\tthis._vibrato.connect(this._vibratoGain);\n\t\tthis._vibratoGain.fan(this.voice0.detune, this.voice1.detune);\n\n\t\tthis.detune.fan(this.voice0.detune, this.voice1.detune);\n\n\t\tthis.voice0.connect(this.output);\n\t\tthis.voice1.connect(this.output);\n\n\t\treadOnly(this, [\"voice0\", \"voice1\", \"frequency\", \"vibratoAmount\", \"vibratoRate\"]);\n\t}\n\n\tgetLevelAtTime(time: Time): NormalRange {\n\t\ttime = this.toSeconds(time);\n\t\treturn this.voice0.envelope.getValueAtTime(time) + this.voice1.envelope.getValueAtTime(time);\n\t}\n\n\tstatic getDefaults(): DuoSynthOptions {\n\t\treturn deepMerge(Monophonic.getDefaults(), {\n\t\t\tvibratoAmount: 0.5,\n\t\t\tvibratoRate: 5,\n\t\t\tharmonicity: 1.5,\n\t\t\tvoice0: deepMerge(\n\t\t\t\tomitFromObject(MonoSynth.getDefaults(), Object.keys(Monophonic.getDefaults())),\n\t\t\t\t{\n\t\t\t\t\tfilterEnvelope: {\n\t\t\t\t\t\tattack: 0.01,\n\t\t\t\t\t\tdecay: 0.0,\n\t\t\t\t\t\tsustain: 1,\n\t\t\t\t\t\trelease: 0.5\n\t\t\t\t\t},\n\t\t\t\t\tenvelope: {\n\t\t\t\t\t\tattack: 0.01,\n\t\t\t\t\t\tdecay: 0.0,\n\t\t\t\t\t\tsustain: 1,\n\t\t\t\t\t\trelease: 0.5\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\tvoice1: deepMerge(\n\t\t\t\tomitFromObject(MonoSynth.getDefaults(), Object.keys(Monophonic.getDefaults())),\n\t\t\t\t{\n\n\t\t\t\t\tfilterEnvelope: {\n\t\t\t\t\t\tattack: 0.01,\n\t\t\t\t\t\tdecay: 0.0,\n\t\t\t\t\t\tsustain: 1,\n\t\t\t\t\t\trelease: 0.5\n\t\t\t\t\t},\n\t\t\t\t\tenvelope: {\n\t\t\t\t\t\tattack: 0.01,\n\t\t\t\t\t\tdecay: 0.0,\n\t\t\t\t\t\tsustain: 1,\n\t\t\t\t\t\trelease: 0.5\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t}) as DuoSynthOptions;\n\t}\n\t/**\n\t * Trigger the attack portion of the note\n\t */\n\tprotected _triggerEnvelopeAttack(time: Seconds, velocity: number): void {\n\t\t// @ts-ignore\n\t\tthis.voice0._triggerEnvelopeAttack(time, velocity);\n\t\t// @ts-ignore\n\t\tthis.voice1._triggerEnvelopeAttack(time, velocity);\n\t}\n\n\t/**\n\t * Trigger the release portion of the note\n\t */\n\tprotected _triggerEnvelopeRelease(time: Seconds) {\n\t\t// @ts-ignore\n\t\tthis.voice0._triggerEnvelopeRelease(time);\n\t\t// @ts-ignore\n\t\tthis.voice1._triggerEnvelopeRelease(time);\n\t\treturn this;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.voice0.dispose();\n\t\tthis.voice1.dispose();\n\t\tthis.frequency.dispose();\n\t\tthis.detune.dispose();\n\t\tthis._vibrato.dispose();\n\t\tthis.vibratoRate.dispose();\n\t\tthis._vibratoGain.dispose();\n\t\tthis.harmonicity.dispose();\n\t\treturn this;\n\t}\n}\n\n","import { Positive } from \"../core/type/Units\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { RecursivePartial } from \"../core/util/Interface\";\nimport { Multiply } from \"../signal/Multiply\";\nimport { ModulationSynth, ModulationSynthOptions } from \"./ModulationSynth\";\n\nexport interface FMSynthOptions extends ModulationSynthOptions {\n\tmodulationIndex: Positive;\n}\n\n/**\n * FMSynth is composed of two Tone.Synths where one Tone.Synth modulates\n * the frequency of a second Tone.Synth. A lot of spectral content\n * can be explored using the modulationIndex parameter. Read more about\n * frequency modulation synthesis on Sound On Sound: [Part 1](https://web.archive.org/web/20160403123704/http://www.soundonsound.com/sos/apr00/articles/synthsecrets.htm), [Part 2](https://web.archive.org/web/20160403115835/http://www.soundonsound.com/sos/may00/articles/synth.htm).\n *\n * @example\n * const fmSynth = new Tone.FMSynth().toDestination();\n * fmSynth.triggerAttackRelease(\"C5\", \"4n\");\n * \n * @category Instrument\n */\n\nexport class FMSynth extends ModulationSynth<FMSynthOptions> {\n\treadonly name: string = \"FMSynth\";\n\n\t/**\n\t * The modulation index which essentially the depth or amount of the modulation. It is the\n\t * ratio of the frequency of the modulating signal (mf) to the amplitude of the\n\t * modulating signal (ma) -- as in ma/mf.\n\t */\n\treadonly modulationIndex: Multiply;\n\n\tconstructor(options?: RecursivePartial<FMSynthOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(FMSynth.getDefaults(), arguments));\n\t\tconst options = optionsFromArguments(FMSynth.getDefaults(), arguments);\n\n\t\tthis.modulationIndex = new Multiply({\n\t\t\tcontext: this.context,\n\t\t\tvalue: options.modulationIndex,\n\t\t});\n\n\t\t// control the two voices frequency\n\t\tthis.frequency.connect(this._carrier.frequency);\n\t\tthis.frequency.chain(this.harmonicity, this._modulator.frequency);\n\t\tthis.frequency.chain(this.modulationIndex, this._modulationNode);\n\t\tthis.detune.fan(this._carrier.detune, this._modulator.detune);\n\t\tthis._modulator.connect(this._modulationNode.gain);\n\t\tthis._modulationNode.connect(this._carrier.frequency);\n\t\tthis._carrier.connect(this.output);\n\t}\n\n\tstatic getDefaults(): FMSynthOptions {\n\t\treturn Object.assign(ModulationSynth.getDefaults(), {\n\t\t\tmodulationIndex: 10,\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.modulationIndex.dispose();\n\t\treturn this;\n\t}\n}\n","import { Envelope, EnvelopeOptions } from \"../component/envelope/Envelope\";\nimport { Filter } from \"../component/filter/Filter\";\nimport { Gain } from \"../core/context/Gain\";\nimport { ToneAudioNode, ToneAudioNodeOptions } from \"../core/context/ToneAudioNode\";\nimport { Frequency, NormalRange, Positive, Seconds, Time } from \"../core/type/Units\";\nimport { deepMerge, omitFromObject, optionsFromArguments } from \"../core/util/Defaults\";\nimport { noOp, RecursivePartial } from \"../core/util/Interface\";\nimport { Multiply } from \"../signal/Multiply\";\nimport { Scale } from \"../signal/Scale\";\nimport { Signal } from \"../signal/Signal\";\nimport { FMOscillator } from \"../source/oscillator/FMOscillator\";\nimport { Monophonic, MonophonicOptions } from \"./Monophonic\";\n\nexport interface MetalSynthOptions extends MonophonicOptions {\n\tharmonicity: Positive;\n\tmodulationIndex: Positive;\n\toctaves: number;\n\tresonance: Frequency;\n\tenvelope: Omit<EnvelopeOptions, keyof ToneAudioNodeOptions>;\n}\n\n/**\n * Inharmonic ratio of frequencies based on the Roland TR-808\n * Taken from https://ccrma.stanford.edu/papers/tr-808-cymbal-physically-informed-circuit-bendable-digital-model\n */\nconst inharmRatios: number[] = [1.0, 1.483, 1.932, 2.546, 2.630, 3.897];\n\n/**\n * A highly inharmonic and spectrally complex source with a highpass filter\n * and amplitude envelope which is good for making metallophone sounds.\n * Based on CymbalSynth by [@polyrhythmatic](https://github.com/polyrhythmatic).\n * Inspiration from [Sound on Sound](https://shorturl.at/rSZ12).\n * @category Instrument\n */\nexport class MetalSynth extends Monophonic<MetalSynthOptions> {\n\n\treadonly name: string = \"MetalSynth\";\n\n\t/**\n\t * The frequency of the cymbal\n\t */\n\treadonly frequency: Signal<\"frequency\">;\n\n\t/**\n\t * The detune applied to the oscillators\n\t */\n\treadonly detune: Signal<\"cents\">;\n\n\t/**\n\t * The array of FMOscillators\n\t */\n\tprivate _oscillators: FMOscillator[] = [];\n\n\t/**\n\t * The frequency multipliers\n\t */\n\tprivate _freqMultipliers: Multiply[] = [];\n\n\t/**\n\t * The gain node for the envelope.\n\t */\n\tprivate _amplitude: Gain;\n\n\t/**\n\t * Highpass the output\n\t */\n\tprivate _highpass: Filter;\n\n\t/**\n\t * The number of octaves the highpass\n\t * filter frequency ramps\n\t */\n\tprivate _octaves: number;\n\n\t/**\n\t * Scale the body envelope for the highpass filter\n\t */\n\tprivate _filterFreqScaler: Scale;\n\n\t/**\n\t * The envelope which is connected both to the\n\t * amplitude and a highpass filter's cutoff frequency.\n\t * The lower-limit of the filter is controlled by the [[resonance]]\n\t */\n\treadonly envelope: Envelope;\n\n\tconstructor(options?: RecursivePartial<MetalSynthOptions>)\n\tconstructor() {\n\t\tsuper(optionsFromArguments(MetalSynth.getDefaults(), arguments));\n\t\tconst options = optionsFromArguments(MetalSynth.getDefaults(), arguments);\n\n\t\tthis.detune = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"cents\",\n\t\t\tvalue: options.detune,\n\t\t});\n\n\t\tthis.frequency = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"frequency\",\n\t\t});\n\n\t\tthis._amplitude = new Gain({\n\t\t\tcontext: this.context,\n\t\t\tgain: 0,\n\t\t}).connect(this.output);\n\n\t\tthis._highpass = new Filter({\n\t\t\t// Q: -3.0102999566398125,\n\t\t\tQ: 0,\n\t\t\tcontext: this.context,\n\t\t\ttype: \"highpass\",\n\t\t}).connect(this._amplitude);\n\n\t\tfor (let i = 0; i < inharmRatios.length; i++) {\n\t\t\tconst osc = new FMOscillator({\n\t\t\t\tcontext: this.context,\n\t\t\t\tharmonicity: options.harmonicity,\n\t\t\t\tmodulationIndex: options.modulationIndex,\n\t\t\t\tmodulationType: \"square\",\n\t\t\t\tonstop: i === 0 ? () => this.onsilence(this) : noOp,\n\t\t\t\ttype: \"square\",\n\t\t\t});\n\t\t\tosc.connect(this._highpass);\n\t\t\tthis._oscillators[i] = osc;\n\n\t\t\tconst mult = new Multiply({\n\t\t\t\tcontext: this.context,\n\t\t\t\tvalue: inharmRatios[i],\n\t\t\t});\n\t\t\tthis._freqMultipliers[i] = mult;\n\t\t\tthis.frequency.chain(mult, osc.frequency);\n\t\t\tthis.detune.connect(osc.detune);\n\t\t}\n\n\t\tthis._filterFreqScaler = new Scale({\n\t\t\tcontext: this.context,\n\t\t\tmax: 7000,\n\t\t\tmin: this.toFrequency(options.resonance),\n\t\t});\n\n\t\tthis.envelope = new Envelope({\n\t\t\tattack: options.envelope.attack,\n\t\t\tattackCurve: \"linear\",\n\t\t\tcontext: this.context,\n\t\t\tdecay: options.envelope.decay,\n\t\t\trelease: options.envelope.release,\n\t\t\tsustain: 0,\n\t\t});\n\n\t\tthis.envelope.chain(this._filterFreqScaler, this._highpass.frequency);\n\t\tthis.envelope.connect(this._amplitude.gain);\n\t\t// set the octaves\n\t\tthis._octaves = options.octaves;\n\t\tthis.octaves = options.octaves;\n\t}\n\n\tstatic getDefaults(): MetalSynthOptions {\n\t\treturn deepMerge(Monophonic.getDefaults(), {\n\t\t\tenvelope: Object.assign(\n\t\t\t\tomitFromObject(Envelope.getDefaults(), Object.keys(ToneAudioNode.getDefaults())),\n\t\t\t\t{\n\t\t\t\t\tattack: 0.001,\n\t\t\t\t\tdecay: 1.4,\n\t\t\t\t\trelease: 0.2,\n\t\t\t\t},\n\t\t\t),\n\t\t\tharmonicity: 5.1,\n\t\t\tmodulationIndex: 32,\n\t\t\toctaves: 1.5,\n\t\t\tresonance: 4000,\n\t\t});\n\t}\n\n\t/**\n\t * Trigger the attack.\n\t * @param time When the attack should be triggered.\n\t * @param velocity The velocity that the envelope should be triggered at.\n\t */\n\tprotected _triggerEnvelopeAttack(time: Seconds, velocity: NormalRange = 1): this {\n\t\tthis.envelope.triggerAttack(time, velocity);\n\t\tthis._oscillators.forEach(osc => osc.start(time));\n\t\tif (this.envelope.sustain === 0) {\n\t\t\tthis._oscillators.forEach(osc => {\n\t\t\t\tosc.stop(time + this.toSeconds(this.envelope.attack) + this.toSeconds(this.envelope.decay));\n\t\t\t});\n\t\t}\n\t\treturn this;\n\t}\n\t\n\t/**\n\t * Trigger the release of the envelope.\n\t * @param time When the release should be triggered.\n\t */\n\tprotected _triggerEnvelopeRelease(time: Seconds): this {\n\t\tthis.envelope.triggerRelease(time);\n\t\tthis._oscillators.forEach(osc => osc.stop(time + this.toSeconds(this.envelope.release)));\n\t\treturn this;\n\t}\n\n\tgetLevelAtTime(time: Time): NormalRange {\n\t\ttime = this.toSeconds(time);\n\t\treturn this.envelope.getValueAtTime(time);\n\t}\n\n\t/**\n\t * The modulationIndex of the oscillators which make up the source.\n\t * see [[FMOscillator.modulationIndex]]\n\t * @min 1\n\t * @max 100\n\t */\n\tget modulationIndex(): number {\n\t\treturn this._oscillators[0].modulationIndex.value;\n\t}\n\tset modulationIndex(val) {\n\t\tthis._oscillators.forEach(osc => (osc.modulationIndex.value = val));\n\t}\n\n\t/**\n\t * The harmonicity of the oscillators which make up the source.\n\t * see Tone.FMOscillator.harmonicity\n\t * @min 0.1\n\t * @max 10\n\t */\n\tget harmonicity(): number {\n\t\treturn this._oscillators[0].harmonicity.value;\n\t}\n\tset harmonicity(val) {\n\t\tthis._oscillators.forEach(osc => (osc.harmonicity.value = val));\n\t}\n\n\t/**\n\t * The lower level of the highpass filter which is attached to the envelope.\n\t * This value should be between [0, 7000]\n\t * @min 0\n\t * @max 7000\n\t */\n\tget resonance(): Frequency {\n\t\treturn this._filterFreqScaler.min;\n\t}\n\tset resonance(val) {\n\t\tthis._filterFreqScaler.min = this.toFrequency(val);\n\t\tthis.octaves = this._octaves;\n\t}\n\n\t/**\n\t * The number of octaves above the \"resonance\" frequency\n\t * that the filter ramps during the attack/decay envelope\n\t * @min 0\n\t * @max 8\n\t */\n\tget octaves(): number {\n\t\treturn this._octaves;\n\t}\n\tset octaves(val) {\n\t\tthis._octaves = val;\n\t\tthis._filterFreqScaler.max = this._filterFreqScaler.min * Math.pow(2, val);\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._oscillators.forEach(osc => osc.dispose());\n\t\tthis._freqMultipliers.forEach(freqMult => freqMult.dispose());\n\t\tthis.frequency.dispose();\n\t\tthis.detune.dispose();\n\t\tthis._filterFreqScaler.dispose();\n\t\tthis._amplitude.dispose();\n\t\tthis.envelope.dispose();\n\t\tthis._highpass.dispose();\n\t\treturn this;\n\t}\n}\n","import { FrequencyClass } from \"../core/type/Frequency\";\nimport { Frequency, Positive, Time } from \"../core/type/Units\";\nimport { deepMerge, optionsFromArguments } from \"../core/util/Defaults\";\nimport { readOnly, RecursivePartial } from \"../core/util/Interface\";\nimport { Monophonic } from \"./Monophonic\";\nimport { Synth, SynthOptions } from \"./Synth\";\nimport { range, timeRange } from \"../core/util/Decorator\";\n\nexport interface MembraneSynthOptions extends SynthOptions {\n\tpitchDecay: Time;\n\toctaves: Positive;\n}\n\n/**\n * MembraneSynth makes kick and tom sounds using a single oscillator\n * with an amplitude envelope and frequency ramp. A Tone.OmniOscillator\n * is routed through a Tone.AmplitudeEnvelope to the output. The drum\n * quality of the sound comes from the frequency envelope applied\n * during MembraneSynth.triggerAttack(note). The frequency envelope\n * starts at <code>note * .octaves</code> and ramps to <code>note</code>\n * over the duration of <code>.pitchDecay</code>.\n * @example\n * const synth = new Tone.MembraneSynth().toDestination();\n * synth.triggerAttackRelease(\"C2\", \"8n\");\n * @category Instrument\n */\nexport class MembraneSynth extends Synth<MembraneSynthOptions> {\n\n\treadonly name: string = \"MembraneSynth\";\n\n\t/**\n\t * The number of octaves the pitch envelope ramps.\n\t * @min 0.5\n\t * @max 8\n\t */\n\t@range(0)\n\toctaves: Positive;\n\n\t/**\n\t * The amount of time the frequency envelope takes.\n\t * @min 0\n\t * @max 0.5\n\t */\n\t@timeRange(0)\n\tpitchDecay: Time;\n\n\t/**\n\t * Portamento is ignored in this synth. use pitch decay instead.\n\t */\n\treadonly portamento = 0;\n\n\t/**\n\t * @param options the options available for the synth see defaults\n\t */\n\tconstructor(options?: RecursivePartial<MembraneSynthOptions>)\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(MembraneSynth.getDefaults(), arguments));\n\t\tconst options = optionsFromArguments(MembraneSynth.getDefaults(), arguments);\n\n\t\tthis.pitchDecay = options.pitchDecay;\n\t\tthis.octaves = options.octaves;\n\t\treadOnly(this, [\"oscillator\", \"envelope\"]);\n\t}\n\n\tstatic getDefaults(): MembraneSynthOptions {\n\t\treturn deepMerge(Monophonic.getDefaults(), Synth.getDefaults(), {\n\t\t\tenvelope: {\n\t\t\t\tattack: 0.001,\n\t\t\t\tattackCurve: \"exponential\",\n\t\t\t\tdecay: 0.4,\n\t\t\t\trelease: 1.4,\n\t\t\t\tsustain: 0.01,\n\t\t\t},\n\t\t\toctaves: 10,\n\t\t\toscillator: {\n\t\t\t\ttype: \"sine\",\n\t\t\t},\n\t\t\tpitchDecay: 0.05,\n\t\t});\n\t}\n\n\tsetNote(note: Frequency | FrequencyClass, time?: Time): this {\n\t\tconst seconds = this.toSeconds(time);\n\t\tconst hertz = this.toFrequency(note instanceof FrequencyClass ? note.toFrequency() : note);\n\t\tconst maxNote = hertz * this.octaves;\n\t\tthis.oscillator.frequency.setValueAtTime(maxNote, seconds);\n\t\tthis.oscillator.frequency.exponentialRampToValueAtTime(hertz, seconds + this.toSeconds(this.pitchDecay));\n\t\treturn this;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\treturn this;\n\t}\n}\n","import { AmplitudeEnvelope } from \"../component/envelope/AmplitudeEnvelope\";\nimport { NormalRange, Time } from \"../core/type/Units\";\nimport { omitFromObject, optionsFromArguments } from \"../core/util/Defaults\";\nimport { RecursivePartial } from \"../core/util/Interface\";\nimport { Noise, NoiseOptions } from \"../source/Noise\";\nimport { Instrument, InstrumentOptions } from \"./Instrument\";\nimport { ToneAudioNode, ToneAudioNodeOptions } from \"../core/context/ToneAudioNode\";\nimport { Envelope, EnvelopeOptions } from \"../component/envelope/Envelope\";\nimport { Source } from \"../source/Source\";\n\nexport interface NoiseSynthOptions extends InstrumentOptions {\n\tenvelope: Omit<EnvelopeOptions, keyof ToneAudioNodeOptions>;\n\tnoise: Omit<NoiseOptions, keyof ToneAudioNodeOptions>;\n}\n\n/**\n * Tone.NoiseSynth is composed of [[Noise]] through an [[AmplitudeEnvelope]]. \n * ```\n * +-------+ +-------------------+\n * | Noise +>--> AmplitudeEnvelope +>--> Output\n * +-------+ +-------------------+\n * ```\n * @example\n * const noiseSynth = new Tone.NoiseSynth().toDestination();\n * noiseSynth.triggerAttackRelease(\"8n\", 0.05);\n * @category Instrument\n */\nexport class NoiseSynth extends Instrument<NoiseSynthOptions> {\n\n\treadonly name = \"NoiseSynth\";\n\n\t/**\n\t * The noise source.\n\t */\n\treadonly noise: Noise;\n\n\t/**\n\t * The amplitude envelope.\n\t */\n\treadonly envelope: AmplitudeEnvelope;\n\n\tconstructor(options?: RecursivePartial<NoiseSynthOptions>)\n\tconstructor() {\n\t\tsuper(optionsFromArguments(NoiseSynth.getDefaults(), arguments));\n\t\tconst options = optionsFromArguments(NoiseSynth.getDefaults(), arguments);\n\t\tthis.noise = new Noise(Object.assign({\n\t\t\tcontext: this.context,\n\t\t}, options.noise));\n\n\t\tthis.envelope = new AmplitudeEnvelope(Object.assign({\n\t\t\tcontext: this.context,\n\t\t}, options.envelope));\n\n\t\t// connect the noise to the output\n\t\tthis.noise.chain(this.envelope, this.output);\n\t}\n\n\tstatic getDefaults(): NoiseSynthOptions {\n\t\treturn Object.assign(Instrument.getDefaults(), {\n\t\t\tenvelope: Object.assign(\n\t\t\t\tomitFromObject(Envelope.getDefaults(), Object.keys(ToneAudioNode.getDefaults())),\n\t\t\t\t{\n\t\t\t\t\tdecay: 0.1,\n\t\t\t\t\tsustain: 0.0,\n\t\t\t\t},\n\t\t\t),\n\t\t\tnoise: Object.assign(\n\t\t\t\tomitFromObject(Noise.getDefaults(), Object.keys(Source.getDefaults())),\n\t\t\t\t{\n\t\t\t\t\ttype: \"white\",\n\t\t\t\t},\n\t\t\t),\n\t\t});\n\t}\n\n\t/**\n\t * Start the attack portion of the envelopes. Unlike other\n\t * instruments, Tone.NoiseSynth doesn't have a note.\n\t * @example\n\t * const noiseSynth = new Tone.NoiseSynth().toDestination();\n\t * noiseSynth.triggerAttack();\n\t */\n\ttriggerAttack(time?: Time, velocity: NormalRange = 1): this {\n\t\ttime = this.toSeconds(time);\n\t\t// the envelopes\n\t\tthis.envelope.triggerAttack(time, velocity);\n\t\t// start the noise\n\t\tthis.noise.start(time);\n\t\tif (this.envelope.sustain === 0) {\n\t\t\tthis.noise.stop(time + this.toSeconds(this.envelope.attack) + this.toSeconds(this.envelope.decay));\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Start the release portion of the envelopes.\n\t */\n\ttriggerRelease(time?: Time): this {\n\t\ttime = this.toSeconds(time);\n\t\tthis.envelope.triggerRelease(time);\n\t\tthis.noise.stop(time + this.toSeconds(this.envelope.release));\n\t\treturn this;\n\t}\n\n\tsync(): this {\n\t\tif (this._syncState()) {\n\t\t\tthis._syncMethod(\"triggerAttack\", 0);\n\t\t\tthis._syncMethod(\"triggerRelease\", 0);\n\t\t}\n\t\treturn this;\n\t}\n\n\ttriggerAttackRelease(duration: Time, time?: Time, velocity: NormalRange = 1): this {\n\t\ttime = this.toSeconds(time);\n\t\tduration = this.toSeconds(duration);\n\t\tthis.triggerAttack(time, velocity);\n\t\tthis.triggerRelease(time + duration);\n\t\treturn this;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.noise.dispose();\n\t\tthis.envelope.dispose();\n\t\treturn this;\n\t}\n}\n","/**\n * All of the classes or functions which are loaded into the AudioWorkletGlobalScope\n */\nconst workletContext: Set<string> = new Set();\n\n/**\n * Add a class to the AudioWorkletGlobalScope\n */\nexport function addToWorklet(classOrFunction: string) {\n\tworkletContext.add(classOrFunction);\n}\n\n/**\n * Register a processor in the AudioWorkletGlobalScope with the given name\n */\nexport function registerProcessor(name: string, classDesc: string) {\n\tconst processor = /* javascript */`registerProcessor(\"${name}\", ${classDesc})`;\n\tworkletContext.add(processor);\n}\n\n/**\n * Get all of the modules which have been registered to the AudioWorkletGlobalScope\n */\nexport function getWorkletGlobalScope(): string {\n\treturn Array.from(workletContext).join(\"\\n\");\n}\n","import { ToneAudioNode, ToneAudioNodeOptions } from \"../context/ToneAudioNode\";\nimport { noOp } from \"../util/Interface\";\nimport { getWorkletGlobalScope } from \"./WorkletGlobalScope\";\n\nexport type ToneAudioWorkletOptions = ToneAudioNodeOptions;\n\nexport abstract class ToneAudioWorklet<Options extends ToneAudioWorkletOptions> extends ToneAudioNode<Options> {\n\n\treadonly name: string = \"ToneAudioWorklet\";\n\n\t/**\n\t * The processing node\n\t */\n\tprotected _worklet!: AudioWorkletNode;\n\n\t/**\n\t * A dummy gain node to create a dummy audio param from\n\t */\n\tprivate _dummyGain: GainNode;\n\n\t/**\n\t * A dummy audio param to use when creating Params\n\t */\n\tprotected _dummyParam: AudioParam;\n\n\t/**\n\t * The constructor options for the node\n\t */\n\tprotected workletOptions: Partial<AudioWorkletNodeOptions> = {};\n\n\t/**\n\t * Get the name of the audio worklet\n\t */\n\tprotected abstract _audioWorkletName(): string;\n\n\t/**\n\t * Invoked when the module is loaded and the node is created\n\t */\n\tprotected abstract onReady(node: AudioWorkletNode): void;\n\n\t/**\n\t * Callback which is invoked when there is an error in the processing\n\t */\n\tonprocessorerror: (e: string) => void = noOp;\n\n\tconstructor(options: Options) {\n\t\tsuper(options);\n\n\t\tconst blobUrl = URL.createObjectURL(new Blob([getWorkletGlobalScope()], { type: \"text/javascript\" }));\n\t\tconst name = this._audioWorkletName();\n\n\t\tthis._dummyGain = this.context.createGain();\n\t\tthis._dummyParam = this._dummyGain.gain;\n\n\t\t// Register the processor\n\t\tthis.context.addAudioWorkletModule(blobUrl, name).then(() => {\n\t\t\t// create the worklet when it's read\n\t\t\tif (!this.disposed) {\n\t\t\t\tthis._worklet = this.context.createAudioWorkletNode(name, this.workletOptions);\n\t\t\t\tthis._worklet.onprocessorerror = this.onprocessorerror.bind(this);\n\t\t\t\tthis.onReady(this._worklet);\n\t\t\t}\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._dummyGain.disconnect();\n\t\tif (this._worklet) {\n\t\t\tthis._worklet.port.postMessage(\"dispose\");\n\t\t\tthis._worklet.disconnect();\n\t\t}\n\t\treturn this;\n\t}\n\n}\n","import { addToWorklet } from \"./WorkletGlobalScope\";\n\nconst toneAudioWorkletProcessor = /* javascript */ `\n\t/**\n\t * The base AudioWorkletProcessor for use in Tone.js. Works with the [[ToneAudioWorklet]]. \n\t */\n\tclass ToneAudioWorkletProcessor extends AudioWorkletProcessor {\n\n\t\tconstructor(options) {\n\t\t\t\n\t\t\tsuper(options);\n\t\t\t/**\n\t\t\t * If the processor was disposed or not. Keep alive until it's disposed.\n\t\t\t */\n\t\t\tthis.disposed = false;\n\t\t \t/** \n\t\t\t * The number of samples in the processing block\n\t\t\t */\n\t\t\tthis.blockSize = 128;\n\t\t\t/**\n\t\t\t * the sample rate\n\t\t\t */\n\t\t\tthis.sampleRate = sampleRate;\n\n\t\t\tthis.port.onmessage = (event) => {\n\t\t\t\t// when it receives a dispose \n\t\t\t\tif (event.data === \"dispose\") {\n\t\t\t\t\tthis.disposed = true;\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t}\n`;\n\naddToWorklet(toneAudioWorkletProcessor);\n","import \"./ToneAudioWorkletProcessor.worklet\";\nimport { addToWorklet } from \"./WorkletGlobalScope\";\n\nexport const singleIOProcess = /* javascript */ `\n\t/**\n\t * Abstract class for a single input/output processor. \n\t * has a 'generate' function which processes one sample at a time\n\t */\n\tclass SingleIOProcessor extends ToneAudioWorkletProcessor {\n\n\t\tconstructor(options) {\n\t\t\tsuper(Object.assign(options, {\n\t\t\t\tnumberOfInputs: 1,\n\t\t\t\tnumberOfOutputs: 1\n\t\t\t}));\n\t\t\t/**\n\t\t\t * Holds the name of the parameter and a single value of that\n\t\t\t * parameter at the current sample\n\t\t\t * @type { [name: string]: number }\n\t\t\t */\n\t\t\tthis.params = {}\n\t\t}\n\n\t\t/**\n\t\t * Generate an output sample from the input sample and parameters\n\t\t * @abstract\n\t\t * @param input number\n\t\t * @param channel number\n\t\t * @param parameters { [name: string]: number }\n\t\t * @returns number\n\t\t */\n\t\tgenerate(){}\n\n\t\t/**\n\t\t * Update the private params object with the \n\t\t * values of the parameters at the given index\n\t\t * @param parameters { [name: string]: Float32Array },\n\t\t * @param index number\n\t\t */\n\t\tupdateParams(parameters, index) {\n\t\t\tfor (const paramName in parameters) {\n\t\t\t\tconst param = parameters[paramName];\n\t\t\t\tif (param.length > 1) {\n\t\t\t\t\tthis.params[paramName] = parameters[paramName][index];\n\t\t\t\t} else {\n\t\t\t\t\tthis.params[paramName] = parameters[paramName][0];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Process a single frame of the audio\n\t\t * @param inputs Float32Array[][]\n\t\t * @param outputs Float32Array[][]\n\t\t */\n\t\tprocess(inputs, outputs, parameters) {\n\t\t\tconst input = inputs[0];\n\t\t\tconst output = outputs[0];\n\t\t\t// get the parameter values\n\t\t\tconst channelCount = Math.max(input && input.length || 0, output.length);\n\t\t\tfor (let sample = 0; sample < this.blockSize; sample++) {\n\t\t\t\tthis.updateParams(parameters, sample);\n\t\t\t\tfor (let channel = 0; channel < channelCount; channel++) {\n\t\t\t\t\tconst inputSample = input && input.length ? input[channel][sample] : 0;\n\t\t\t\t\toutput[channel][sample] = this.generate(inputSample, channel, this.params);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn !this.disposed;\n\t\t}\n\t};\n`;\n\naddToWorklet(singleIOProcess);\n","import { addToWorklet } from \"./WorkletGlobalScope\";\n\nconst delayLine = /* javascript */ `\n\t/**\n\t * A multichannel buffer for use within an AudioWorkletProcessor as a delay line\n\t */\n\tclass DelayLine {\n\t\t\n\t\tconstructor(size, channels) {\n\t\t\tthis.buffer = [];\n\t\t\tthis.writeHead = []\n\t\t\tthis.size = size;\n\n\t\t\t// create the empty channels\n\t\t\tfor (let i = 0; i < channels; i++) {\n\t\t\t\tthis.buffer[i] = new Float32Array(this.size);\n\t\t\t\tthis.writeHead[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Push a value onto the end\n\t\t * @param channel number\n\t\t * @param value number\n\t\t */\n\t\tpush(channel, value) {\n\t\t\tthis.writeHead[channel] += 1;\n\t\t\tif (this.writeHead[channel] > this.size) {\n\t\t\t\tthis.writeHead[channel] = 0;\n\t\t\t}\n\t\t\tthis.buffer[channel][this.writeHead[channel]] = value;\n\t\t}\n\n\t\t/**\n\t\t * Get the recorded value of the channel given the delay\n\t\t * @param channel number\n\t\t * @param delay number delay samples\n\t\t */\n\t\tget(channel, delay) {\n\t\t\tlet readHead = this.writeHead[channel] - Math.floor(delay);\n\t\t\tif (readHead < 0) {\n\t\t\t\treadHead += this.size;\n\t\t\t}\n\t\t\treturn this.buffer[channel][readHead];\n\t\t}\n\t}\n`;\n\naddToWorklet(delayLine);\n","import \"../../core/worklet/SingleIOProcessor.worklet\";\nimport \"../../core/worklet/DelayLine.worklet\";\nimport { registerProcessor } from \"../../core/worklet/WorkletGlobalScope\";\n\nexport const workletName = \"feedback-comb-filter\";\n\nconst feedbackCombFilter = /* javascript */`\n\tclass FeedbackCombFilterWorklet extends SingleIOProcessor {\n\n\t\tconstructor(options) {\n\t\t\tsuper(options);\n\t\t\tthis.delayLine = new DelayLine(this.sampleRate, options.channelCount || 2);\n\t\t}\n\n\t\tstatic get parameterDescriptors() {\n\t\t\treturn [{\n\t\t\t\tname: \"delayTime\",\n\t\t\t\tdefaultValue: 0.1,\n\t\t\t\tminValue: 0,\n\t\t\t\tmaxValue: 1,\n\t\t\t\tautomationRate: \"k-rate\"\n\t\t\t}, {\n\t\t\t\tname: \"feedback\",\n\t\t\t\tdefaultValue: 0.5,\n\t\t\t\tminValue: 0,\n\t\t\t\tmaxValue: 0.9999,\n\t\t\t\tautomationRate: \"k-rate\"\n\t\t\t}];\n\t\t}\n\n\t\tgenerate(input, channel, parameters) {\n\t\t\tconst delayedSample = this.delayLine.get(channel, parameters.delayTime * this.sampleRate);\n\t\t\tthis.delayLine.push(channel, input + delayedSample * parameters.feedback);\n\t\t\treturn delayedSample;\n\t\t}\n\t}\n`;\n\nregisterProcessor(workletName, feedbackCombFilter);\n","import { Gain } from \"../../core/context/Gain\";\nimport { Param } from \"../../core/context/Param\";\nimport { connectSeries, ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { NormalRange, Time } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { readOnly, RecursivePartial } from \"../../core/util/Interface\";\nimport { ToneAudioWorklet } from \"../../core/worklet/ToneAudioWorklet\";\nimport { workletName } from \"./FeedbackCombFilter.worklet\";\n\nexport interface FeedbackCombFilterOptions extends ToneAudioNodeOptions {\n\tdelayTime: Time;\n\tresonance: NormalRange;\n}\n\n/**\n * Comb filters are basic building blocks for physical modeling. Read more\n * about comb filters on [CCRMA's website](https://ccrma.stanford.edu/~jos/pasp/Feedback_Comb_Filters.html).\n * \n * This comb filter is implemented with the AudioWorkletNode which allows it to have feedback delays less than the \n * Web Audio processing block of 128 samples. There is a polyfill for browsers that don't yet support the \n * AudioWorkletNode, but it will add some latency and have slower performance than the AudioWorkletNode. \n * @category Component\n */\nexport class FeedbackCombFilter extends ToneAudioWorklet<FeedbackCombFilterOptions> {\n\n\treadonly name = \"FeedbackCombFilter\";\n\n\t/**\n\t * The amount of delay of the comb filter.\n\t */\n\treadonly delayTime: Param<\"time\">;\n\n\t/**\n\t * The amount of feedback of the delayed signal.\n\t */\n\treadonly resonance: Param<\"normalRange\">;\n\n\treadonly input: Gain;\n\treadonly output: Gain;\n\n\t/**\n\t * @param delayTime The delay time of the filter.\n\t * @param resonance The amount of feedback the filter has.\n\t */\n\tconstructor(delayTime?: Time, resonance?: NormalRange);\n\tconstructor(options?: RecursivePartial<FeedbackCombFilterOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(FeedbackCombFilter.getDefaults(), arguments, [\"delayTime\", \"resonance\"]));\n\t\tconst options = optionsFromArguments(FeedbackCombFilter.getDefaults(), arguments, [\"delayTime\", \"resonance\"]);\n\n\t\tthis.input = new Gain({ context: this.context });\n\t\tthis.output = new Gain({ context: this.context });\n\n\t\tthis.delayTime = new Param<\"time\">({\n\t\t\tcontext: this.context,\n\t\t\tvalue: options.delayTime,\n\t\t\tunits: \"time\",\n\t\t\tminValue: 0,\n\t\t\tmaxValue: 1,\n\t\t\tparam: this._dummyParam,\n\t\t\tswappable: true,\n\t\t});\n\n\t\tthis.resonance = new Param<\"normalRange\">({\n\t\t\tcontext: this.context,\n\t\t\tvalue: options.resonance,\n\t\t\tunits: \"normalRange\",\n\t\t\tparam: this._dummyParam,\n\t\t\tswappable: true,\n\t\t});\n\n\t\treadOnly(this, [\"resonance\", \"delayTime\"]);\n\t}\n\n\tprotected _audioWorkletName(): string {\n\t\treturn workletName;\n\t}\n\n\t/**\n\t * The default parameters\n\t */\n\tstatic getDefaults(): FeedbackCombFilterOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tdelayTime: 0.1,\n\t\t\tresonance: 0.5,\n\t\t});\n\t}\n\n\tonReady(node: AudioWorkletNode) {\n\t\tconnectSeries(this.input, node, this.output);\n\t\tconst delayTime = node.parameters.get(\"delayTime\") as AudioParam;;\n\t\tthis.delayTime.setParam(delayTime);\n\t\tconst feedback = node.parameters.get(\"feedback\") as AudioParam;;\n\t\tthis.resonance.setParam(feedback);\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.input.dispose();\n\t\tthis.output.dispose();\n\t\tthis.delayTime.dispose();\n\t\tthis.resonance.dispose();\n\t\treturn this;\n\t}\n}\n","import { ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { Frequency } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { Gain } from \"../../core/context/Gain\";\n\nexport type OnePoleFilterType = \"highpass\" | \"lowpass\";\n\nexport interface OnePoleFilterOptions extends ToneAudioNodeOptions {\n\tfrequency: Frequency;\n\ttype: OnePoleFilterType;\n}\n\n/**\n * A one pole filter with 6db-per-octave rolloff. Either \"highpass\" or \"lowpass\". \n * Note that changing the type or frequency may result in a discontinuity which\n * can sound like a click or pop. \n * References: \n * * http://www.earlevel.com/main/2012/12/15/a-one-pole-filter/ \n * * http://www.dspguide.com/ch19/2.htm\n * * https://github.com/vitaliy-bobrov/js-rocks/blob/master/src/app/audio/effects/one-pole-filters.ts\n * @category Component\n */\nexport class OnePoleFilter extends ToneAudioNode<OnePoleFilterOptions> {\n\t\n\treadonly name: string = \"OnePoleFilter\";\n\n\t/**\n\t * Hold the current frequency\n\t */\n\tprivate _frequency: Frequency;\n\n\t/**\n\t * the current one pole type\n\t */\n\tprivate _type: OnePoleFilterType;\n\n\t/**\n\t * the current one pole filter\n\t */\n\tprivate _filter!: IIRFilterNode;\n\n\treadonly input: Gain;\n\treadonly output: Gain;\n\n\t/**\n\t * @param frequency The frequency\n\t * @param type The filter type, either \"lowpass\" or \"highpass\"\n\t */\n\tconstructor(frequency?: Frequency, type?: OnePoleFilterType);\n\tconstructor(options?: Partial<OnePoleFilterOptions>)\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(OnePoleFilter.getDefaults(), arguments, [\"frequency\", \"type\"]));\n\t\tconst options = optionsFromArguments(OnePoleFilter.getDefaults(), arguments, [\"frequency\", \"type\"]);\n\n\t\tthis._frequency = options.frequency;\n\t\tthis._type = options.type;\n\t\tthis.input = new Gain({ context: this.context });\n\t\tthis.output = new Gain({ context: this.context });\n\t\tthis._createFilter();\n\t}\n\n\tstatic getDefaults(): OnePoleFilterOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tfrequency: 880,\n\t\t\ttype: \"lowpass\" as OnePoleFilterType\n\t\t});\n\t}\n\n\t/**\n\t * Create a filter and dispose the old one\n\t */\n\tprivate _createFilter() {\n\t\tconst oldFilter = this._filter;\n\t\tconst freq = this.toFrequency(this._frequency);\n\t\tconst t = 1 / (2 * Math.PI * freq);\n\t\tif (this._type === \"lowpass\") {\n\t\t\tconst a0 = 1 / (t * this.context.sampleRate);\n\t\t\tconst b1 = a0 - 1;\n\t\t\tthis._filter = this.context.createIIRFilter([a0, 0], [1, b1]);\n\t\t} else {\n\t\t\tconst b1 = 1 / (t * this.context.sampleRate) - 1;\n\t\t\tthis._filter = this.context.createIIRFilter([1, -1], [1, b1]);\n\t\t}\n\t\t\n\t\tthis.input.chain(this._filter, this.output);\n\t\tif (oldFilter) {\n\t\t\t// dispose it on the next block\n\t\t\tthis.context.setTimeout(() => {\n\t\t\t\tif (!this.disposed) {\n\t\t\t\t\tthis.input.disconnect(oldFilter);\n\t\t\t\t\toldFilter.disconnect();\n\t\t\t\t}\n\t\t\t}, this.blockTime);\n\t\t}\n\t}\n\n\t/**\n\t * The frequency value. \n\t */\n\tget frequency(): Frequency {\n\t\treturn this._frequency;\n\t}\n\tset frequency(fq) {\n\t\tthis._frequency = fq;\n\t\tthis._createFilter();\n\t}\n\t\n\t/**\n\t * The OnePole Filter type, either \"highpass\" or \"lowpass\"\n\t */\n\tget type(): OnePoleFilterType {\n\t\treturn this._type;\n\t}\n\tset type(t) {\n\t\tthis._type = t;\n\t\tthis._createFilter();\n\t}\n\n\t/**\n\t * Get the frequency response curve. This curve represents how the filter\n\t * responses to frequencies between 20hz-20khz.\n\t * @param len The number of values to return\n\t * @return The frequency response curve between 20-20kHz\n\t */\n\tgetFrequencyResponse(len = 128): Float32Array {\n\t\tconst freqValues = new Float32Array(len);\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tconst norm = Math.pow(i / len, 2);\n\t\t\tconst freq = norm * (20000 - 20) + 20;\n\t\t\tfreqValues[i] = freq;\n\t\t}\n\t\tconst magValues = new Float32Array(len);\n\t\tconst phaseValues = new Float32Array(len);\n\t\tthis._filter.getFrequencyResponse(freqValues, magValues, phaseValues);\n\t\treturn magValues;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.input.dispose();\n\t\tthis.output.dispose();\n\t\tthis._filter.disconnect();\n\t\treturn this;\n\t}\n}\n","import { Param } from \"../../core/context/Param\";\nimport { InputNode, OutputNode, ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { Frequency, NormalRange, Time } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { RecursivePartial } from \"../../core/util/Interface\";\nimport { FeedbackCombFilter } from \"./FeedbackCombFilter\";\nimport { OnePoleFilter } from \"./OnePoleFilter\";\n\ninterface LowpassCombFilterOptions extends ToneAudioNodeOptions {\n\tdelayTime: Time;\n\tresonance: NormalRange;\n\tdampening: Frequency;\n}\n\n/**\n * A lowpass feedback comb filter. It is similar to\n * [[FeedbackCombFilter]], but includes a lowpass filter.\n * @category Component\n */\nexport class LowpassCombFilter extends ToneAudioNode<LowpassCombFilterOptions> {\n\n\treadonly name = \"LowpassCombFilter\";\n\n\t/**\n\t * The delay node\n\t */\n\tprivate _combFilter: FeedbackCombFilter;\n\n\t/**\n\t * The lowpass filter\n\t */\n\tprivate _lowpass: OnePoleFilter;\n\n\t/**\n\t * The delayTime of the comb filter.\n\t */\n\treadonly delayTime: Param<\"time\">;\n\n\t/**\n\t * The amount of feedback of the delayed signal.\n\t */\n\treadonly resonance: Param<\"normalRange\">;\n\n\treadonly input: InputNode;\n\treadonly output: OutputNode;\n\n\t/**\n\t * @param delayTime The delay time of the comb filter\n\t * @param resonance The resonance (feedback) of the comb filter\n\t * @param dampening The cutoff of the lowpass filter dampens the signal as it is fedback.\n\t */\n\tconstructor(delayTime?: Time, resonance?: NormalRange, dampening?: Frequency);\n\tconstructor(options?: RecursivePartial<LowpassCombFilterOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(LowpassCombFilter.getDefaults(), arguments, [\"delayTime\", \"resonance\", \"dampening\"]));\n\t\tconst options = optionsFromArguments(LowpassCombFilter.getDefaults(), arguments, [\"delayTime\", \"resonance\", \"dampening\"]);\n\n\t\tthis._combFilter = this.output = new FeedbackCombFilter({\n\t\t\tcontext: this.context,\n\t\t\tdelayTime: options.delayTime,\n\t\t\tresonance: options.resonance,\n\t\t});\n\t\tthis.delayTime = this._combFilter.delayTime;\n\t\tthis.resonance = this._combFilter.resonance;\n\n\t\tthis._lowpass = this.input = new OnePoleFilter({\n\t\t\tcontext: this.context,\n\t\t\tfrequency: options.dampening,\n\t\t\ttype: \"lowpass\",\n\t\t});\n\n\t\t// connections\n\t\tthis._lowpass.connect(this._combFilter);\n\t}\n\n\tstatic getDefaults(): LowpassCombFilterOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tdampening: 3000,\n\t\t\tdelayTime: 0.1,\n\t\t\tresonance: 0.5,\n\t\t});\n\t}\n\t\n\t/**\n\t * The dampening control of the feedback\n\t */\n\tget dampening(): Frequency {\n\t\treturn this._lowpass.frequency;\n\t}\n\tset dampening(fq) {\n\t\tthis._lowpass.frequency = fq;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._combFilter.dispose();\n\t\tthis._lowpass.dispose();\n\t\treturn this;\n\t}\n}\n","import { Frequency, NormalRange, Time } from \"../core/type/Units\";\nimport { LowpassCombFilter } from \"../component/filter/LowpassCombFilter\";\nimport { deepMerge } from \"../core/util/Defaults\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { RecursivePartial } from \"../core/util/Interface\";\nimport { Noise } from \"../source/Noise\";\nimport { Instrument, InstrumentOptions } from \"./Instrument\";\n\nexport interface PluckSynthOptions extends InstrumentOptions {\n\tattackNoise: number;\n\tdampening: Frequency;\n\tresonance: NormalRange;\n\trelease: Time;\n}\n\n/**\n * Karplus-String string synthesis.\n * @example\n * const plucky = new Tone.PluckSynth().toDestination();\n * plucky.triggerAttack(\"C4\", \"+0.5\");\n * plucky.triggerAttack(\"C3\", \"+1\");\n * plucky.triggerAttack(\"C2\", \"+1.5\");\n * plucky.triggerAttack(\"C1\", \"+2\");\n * @category Instrument\n */\nexport class PluckSynth extends Instrument<PluckSynthOptions> {\n\n\treadonly name = \"PluckSynth\";\n\n\t/**\n\t * Noise burst at the beginning\n\t */\n\tprivate _noise: Noise;\n\tprivate _lfcf: LowpassCombFilter;\n\n\t/**\n\t * The amount of noise at the attack.\n\t * Nominal range of [0.1, 20]\n\t * @min 0.1\n\t * @max 20\n\t */\n\tattackNoise: number;\n\n\t/**\n\t * The amount of resonance of the pluck. Also correlates to the sustain duration.\n\t */\n\tresonance: NormalRange;\n\n\t/**\n\t * The release time which corresponds to a resonance ramp down to 0\n\t */\n\trelease: Time;\n\n\tconstructor(options?: RecursivePartial<PluckSynthOptions>)\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(PluckSynth.getDefaults(), arguments));\n\t\tconst options = optionsFromArguments(PluckSynth.getDefaults(), arguments);\n\n\t\tthis._noise = new Noise({\n\t\t\tcontext: this.context,\n\t\t\ttype: \"pink\"\n\t\t});\n\n\t\tthis.attackNoise = options.attackNoise;\n\n\t\tthis._lfcf = new LowpassCombFilter({\n\t\t\tcontext: this.context,\n\t\t\tdampening: options.dampening,\n\t\t\tresonance: options.resonance,\n\t\t});\n\n\t\tthis.resonance = options.resonance;\n\t\tthis.release = options.release;\n\n\t\tthis._noise.connect(this._lfcf);\n\t\tthis._lfcf.connect(this.output);\n\t}\n\n\tstatic getDefaults(): PluckSynthOptions {\n\t\treturn deepMerge(Instrument.getDefaults(), {\n\t\t\tattackNoise: 1,\n\t\t\tdampening: 4000,\n\t\t\tresonance: 0.7,\n\t\t\trelease: 1,\n\t\t});\n\t}\n\n\t/**\n\t * The dampening control. i.e. the lowpass filter frequency of the comb filter\n\t * @min 0\n\t * @max 7000\n\t */\n\tget dampening(): Frequency {\n\t\treturn this._lfcf.dampening;\n\t}\n\tset dampening(fq) {\n\t\tthis._lfcf.dampening = fq;\n\t}\n\n\ttriggerAttack(note: Frequency, time?: Time): this {\n\t\tconst freq = this.toFrequency(note);\n\t\ttime = this.toSeconds(time);\n\t\tconst delayAmount = 1 / freq;\n\t\tthis._lfcf.delayTime.setValueAtTime(delayAmount, time);\n\t\tthis._noise.start(time);\n\t\tthis._noise.stop(time + delayAmount * this.attackNoise);\n\t\tthis._lfcf.resonance.cancelScheduledValues(time);\n\t\tthis._lfcf.resonance.setValueAtTime(this.resonance, time);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Ramp down the [[resonance]] to 0 over the duration of the release time.\n\t */\n\ttriggerRelease(time?: Time): this {\n\t\tthis._lfcf.resonance.linearRampTo(0, this.release, time);\n\t\treturn this;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._noise.dispose();\n\t\tthis._lfcf.dispose();\n\t\treturn this;\n\t}\n}\n","import { MidiClass } from \"../core/type/Midi\";\nimport { Frequency, MidiNote, NormalRange, Seconds, Time } from \"../core/type/Units\";\nimport { deepMerge, omitFromObject, optionsFromArguments } from \"../core/util/Defaults\";\nimport { RecursivePartial } from \"../core/util/Interface\";\nimport { isArray, isNumber } from \"../core/util/TypeCheck\";\nimport { Instrument, InstrumentOptions } from \"./Instrument\";\nimport { MembraneSynth, MembraneSynthOptions } from \"./MembraneSynth\";\nimport { FMSynth, FMSynthOptions } from \"./FMSynth\";\nimport { AMSynth, AMSynthOptions } from \"./AMSynth\";\nimport { MonoSynth, MonoSynthOptions } from \"./MonoSynth\";\nimport { MetalSynth, MetalSynthOptions } from \"./MetalSynth\";\nimport { Monophonic } from \"./Monophonic\";\nimport { Synth, SynthOptions } from \"./Synth\";\nimport { assert, warn } from \"../core/util/Debug\";\n\ntype VoiceConstructor<V> = {\n\tgetDefaults: () => VoiceOptions<V>;\n} & (new (...args: any[]) => V);\n\ntype OmitMonophonicOptions<T> = Omit<T, \"context\" | \"onsilence\">;\n\ntype VoiceOptions<T> =\n\tT extends MembraneSynth ? MembraneSynthOptions :\n\t\tT extends MetalSynth ? MetalSynthOptions :\n\t\t\tT extends FMSynth ? FMSynthOptions :\n\t\t\t\tT extends MonoSynth ? MonoSynthOptions :\n\t\t\t\t\tT extends AMSynth ? AMSynthOptions :\n\t\t\t\t\t\tT extends Synth ? SynthOptions :\n\t\t\t\t\t\t\tnever;\n\n/**\n * The settable synth options. excludes monophonic options.\n */\ntype PartialVoiceOptions<T> = RecursivePartial<OmitMonophonicOptions<VoiceOptions<T>>>;\n\nexport interface PolySynthOptions<Voice> extends InstrumentOptions {\n\tmaxPolyphony: number;\n\tvoice: VoiceConstructor<Voice>;\n\toptions: PartialVoiceOptions<Voice>;\n}\n\n/**\n * PolySynth handles voice creation and allocation for any\n * instruments passed in as the second paramter. PolySynth is\n * not a synthesizer by itself, it merely manages voices of\n * one of the other types of synths, allowing any of the\n * monophonic synthesizers to be polyphonic.\n *\n * @example\n * const synth = new Tone.PolySynth().toDestination();\n * // set the attributes across all the voices using 'set'\n * synth.set({ detune: -1200 });\n * // play a chord\n * synth.triggerAttackRelease([\"C4\", \"E4\", \"A4\"], 1);\n * @category Instrument\n */\nexport class PolySynth<Voice extends Monophonic<any> = Synth> extends Instrument<VoiceOptions<Voice>> {\n\n\treadonly name: string = \"PolySynth\";\n\n\t/**\n\t * The voices which are not currently in use\n\t */\n\tprivate _availableVoices: Voice[] = [];\n\n\t/**\n\t * The currently active voices\n\t */\n\tprivate _activeVoices: Array<{ midi: MidiNote; voice: Voice; released: boolean }> = [];\n\n\t/**\n\t * All of the allocated voices for this synth.\n\t */\n\tprivate _voices: Voice[] = [];\n\n\t/**\n\t * The options that are set on the synth.\n\t */\n\tprivate options: VoiceOptions<Voice>;\n\n\t/**\n\t * The polyphony limit.\n\t */\n\tmaxPolyphony: number;\n\n\t/**\n\t * The voice constructor\n\t */\n\tprivate readonly voice: VoiceConstructor<Voice>;\n\n\t/**\n\t * A voice used for holding the get/set values\n\t */\n\tprivate _dummyVoice: Voice;\n\n\t/**\n\t * The GC timeout. Held so that it could be cancelled when the node is disposed.\n\t */\n\tprivate _gcTimeout = -1;\n\n\t/**\n\t * A moving average of the number of active voices\n\t */\n\tprivate _averageActiveVoices = 0;\n\n\t/**\n\t * @param voice The constructor of the voices\n\t * @param options\tThe options object to set the synth voice\n\t */\n\tconstructor(\n\t\tvoice?: VoiceConstructor<Voice>,\n\t\toptions?: PartialVoiceOptions<Voice>,\n\t);\n\tconstructor(options?: Partial<PolySynthOptions<Voice>>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(PolySynth.getDefaults(), arguments, [\"voice\", \"options\"]));\n\t\tconst options = optionsFromArguments(PolySynth.getDefaults(), arguments, [\"voice\", \"options\"]);\n\n\t\t// check against the old API (pre 14.3.0)\n\t\tassert(!isNumber(options.voice), \"DEPRECATED: The polyphony count is no longer the first argument.\");\n\n\t\tconst defaults = options.voice.getDefaults();\n\t\tthis.options = Object.assign(defaults, options.options) as VoiceOptions<Voice>;\n\t\tthis.voice = options.voice as unknown as VoiceConstructor<Voice>;\n\t\tthis.maxPolyphony = options.maxPolyphony;\n\n\t\t// create the first voice\n\t\tthis._dummyVoice = this._getNextAvailableVoice() as Voice;\n\t\t// remove it from the voices list\n\t\tconst index = this._voices.indexOf(this._dummyVoice);\n\t\tthis._voices.splice(index, 1);\n\t\t// kick off the GC interval\n\t\tthis._gcTimeout = this.context.setInterval(this._collectGarbage.bind(this), 1);\n\t}\n\n\tstatic getDefaults(): PolySynthOptions<Synth> {\n\t\treturn Object.assign(Instrument.getDefaults(), {\n\t\t\tmaxPolyphony: 32,\n\t\t\toptions: {},\n\t\t\tvoice: Synth,\n\t\t});\n\t}\n\n\t/**\n\t * The number of active voices.\n\t */\n\tget activeVoices(): number {\n\t\treturn this._activeVoices.length;\n\t}\n\n\t/**\n\t * Invoked when the source is done making sound, so that it can be\n\t * readded to the pool of available voices\n\t */\n\tprivate _makeVoiceAvailable(voice: Voice): void {\n\t\tthis._availableVoices.push(voice);\n\t\t// remove the midi note from 'active voices'\n\t\tconst activeVoiceIndex = this._activeVoices.findIndex((e) => e.voice === voice);\n\t\tthis._activeVoices.splice(activeVoiceIndex, 1);\n\t}\n\n\t/**\n\t * Get an available voice from the pool of available voices.\n\t * If one is not available and the maxPolyphony limit is reached,\n\t * steal a voice, otherwise return null.\n\t */\n\tprivate _getNextAvailableVoice(): Voice | undefined {\n\t\t// if there are available voices, return the first one\n\t\tif (this._availableVoices.length) {\n\t\t\treturn this._availableVoices.shift();\n\t\t} else if (this._voices.length < this.maxPolyphony) {\n\t\t\t// otherwise if there is still more maxPolyphony, make a new voice\n\t\t\tconst voice = new this.voice(Object.assign(this.options, {\n\t\t\t\tcontext: this.context,\n\t\t\t\tonsilence: this._makeVoiceAvailable.bind(this),\n\t\t\t}));\n\t\t\tvoice.connect(this.output);\n\t\t\tthis._voices.push(voice);\n\t\t\treturn voice;\n\t\t} else {\n\t\t\twarn(\"Max polyphony exceeded. Note dropped.\");\n\t\t}\n\t}\n\n\t/**\n\t * Occasionally check if there are any allocated voices which can be cleaned up.\n\t */\n\tprivate _collectGarbage(): void {\n\t\tthis._averageActiveVoices = Math.max(this._averageActiveVoices * 0.95, this.activeVoices);\n\t\tif (this._availableVoices.length && this._voices.length > Math.ceil(this._averageActiveVoices + 1)) {\n\t\t\t// take off an available note\n\t\t\tconst firstAvail = this._availableVoices.shift() as Voice;\n\t\t\tconst index = this._voices.indexOf(firstAvail);\n\t\t\tthis._voices.splice(index, 1);\n\t\t\tif (!this.context.isOffline) {\n\t\t\t\tfirstAvail.dispose();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Internal method which triggers the attack\n\t */\n\tprivate _triggerAttack(notes: Frequency[], time: Seconds, velocity?: NormalRange): void {\n\t\tnotes.forEach(note => {\n\t\t\tconst midiNote = new MidiClass(this.context, note).toMidi();\n\t\t\tconst voice = this._getNextAvailableVoice();\n\t\t\tif (voice) {\n\t\t\t\tvoice.triggerAttack(note, time, velocity);\n\t\t\t\tthis._activeVoices.push({\n\t\t\t\t\tmidi: midiNote, voice, released: false,\n\t\t\t\t});\n\t\t\t\tthis.log(\"triggerAttack\", note, time);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Internal method which triggers the release\n\t */\n\tprivate _triggerRelease(notes: Frequency[], time: Seconds): void {\n\t\tnotes.forEach(note => {\n\t\t\tconst midiNote = new MidiClass(this.context, note).toMidi();\n\t\t\tconst event = this._activeVoices.find(({ midi, released }) => midi === midiNote && !released);\n\t\t\tif (event) {\n\t\t\t\t// trigger release on that note\n\t\t\t\tevent.voice.triggerRelease(time);\n\t\t\t\t// mark it as released\n\t\t\t\tevent.released = true;\n\t\t\t\tthis.log(\"triggerRelease\", note, time);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Schedule the attack/release events. If the time is in the future, then it should set a timeout\n\t * to wait for just-in-time scheduling\n\t */\n\tprivate _scheduleEvent(type: \"attack\" | \"release\", notes: Frequency[], time: Seconds, velocity?: NormalRange): void {\n\t\tassert(!this.disposed, \"Synth was already disposed\");\n\t\t// if the notes are greater than this amount of time in the future, they should be scheduled with setTimeout\n\t\tif (time <= this.now()) {\n\t\t\t// do it immediately\n\t\t\tif (type === \"attack\") {\n\t\t\t\tthis._triggerAttack(notes, time, velocity);\n\t\t\t} else {\n\t\t\t\tthis._triggerRelease(notes, time);\n\t\t\t}\n\t\t} else {\n\t\t\t// schedule it to start in the future\n\t\t\tthis.context.setTimeout(() => {\n\t\t\t\tif (!this.disposed) {\n\t\t\t\t\tthis._scheduleEvent(type, notes, time, velocity);\n\t\t\t\t}\n\t\t\t}, time - this.now());\n\t\t}\n\t}\n\n\t/**\n\t * Trigger the attack portion of the note\n\t * @param notes The notes to play. Accepts a single Frequency or an array of frequencies.\n\t * @param time The start time of the note.\n\t * @param velocity The velocity of the note.\n\t * @example\n\t * const synth = new Tone.PolySynth(Tone.FMSynth).toDestination();\n\t * // trigger a chord immediately with a velocity of 0.2\n\t * synth.triggerAttack([\"Ab3\", \"C4\", \"F5\"], Tone.now(), 0.2);\n\t */\n\ttriggerAttack(notes: Frequency | Frequency[], time?: Time, velocity?: NormalRange): this {\n\n\t\tif (!Array.isArray(notes)) {\n\t\t\tnotes = [notes];\n\t\t}\n\t\tconst computedTime = this.toSeconds(time);\n\t\tthis._scheduleEvent(\"attack\", notes, computedTime, velocity);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Trigger the release of the note. Unlike monophonic instruments,\n\t * a note (or array of notes) needs to be passed in as the first argument.\n\t * @param notes The notes to play. Accepts a single Frequency or an array of frequencies.\n\t * @param time When the release will be triggered.\n\t * @example\n\t * @example\n\t * const poly = new Tone.PolySynth(Tone.AMSynth).toDestination();\n\t * poly.triggerAttack([\"Ab3\", \"C4\", \"F5\"]);\n\t * // trigger the release of the given notes.\n\t * poly.triggerRelease([\"Ab3\", \"C4\"], \"+1\");\n\t * poly.triggerRelease(\"F5\", \"+3\");\n\t */\n\ttriggerRelease(notes: Frequency | Frequency[], time?: Time): this {\n\t\tif (!Array.isArray(notes)) {\n\t\t\tnotes = [notes];\n\t\t}\n\t\tconst computedTime = this.toSeconds(time);\n\t\tthis._scheduleEvent(\"release\", notes, computedTime);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Trigger the attack and release after the specified duration\n\t * @param notes The notes to play. Accepts a single Frequency or an array of frequencies.\n\t * @param duration the duration of the note\n\t * @param time if no time is given, defaults to now\n\t * @param velocity the velocity of the attack (0-1)\n\t * @example\n\t * const poly = new Tone.PolySynth(Tone.AMSynth).toDestination();\n\t * // can pass in an array of durations as well\n\t * poly.triggerAttackRelease([\"Eb3\", \"G4\", \"Bb4\", \"D5\"], [4, 3, 2, 1]);\n\t */\n\ttriggerAttackRelease(\n\t\tnotes: Frequency | Frequency[],\n\t\tduration: Time | Time[],\n\t\ttime?: Time,\n\t\tvelocity?: NormalRange,\n\t): this {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tthis.triggerAttack(notes, computedTime, velocity);\n\t\tif (isArray(duration)) {\n\t\t\tassert(isArray(notes), \"If the duration is an array, the notes must also be an array\");\n\t\t\tnotes = notes as Frequency[];\n\t\t\tfor (let i = 0; i < notes.length; i++) {\n\t\t\t\tconst d = duration[Math.min(i, duration.length - 1)];\n\t\t\t\tconst durationSeconds = this.toSeconds(d);\n\t\t\t\tassert(durationSeconds > 0, \"The duration must be greater than 0\");\n\t\t\t\tthis.triggerRelease(notes[i], computedTime + durationSeconds);\n\t\t\t}\n\t\t} else {\n\t\t\tconst durationSeconds = this.toSeconds(duration);\n\t\t\tassert(durationSeconds > 0, \"The duration must be greater than 0\");\n\t\t\tthis.triggerRelease(notes, computedTime + durationSeconds);\n\t\t}\n\t\treturn this;\n\t}\n\n\tsync(): this {\n\t\tif (this._syncState()) {\n\t\t\tthis._syncMethod(\"triggerAttack\", 1);\n\t\t\tthis._syncMethod(\"triggerRelease\", 1);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set a member/attribute of the voices\n\t * @example\n\t * const poly = new Tone.PolySynth().toDestination();\n\t * // set all of the voices using an options object for the synth type\n\t * poly.set({\n\t * \tenvelope: {\n\t * \t\tattack: 0.25\n\t * \t}\n\t * });\n\t * poly.triggerAttackRelease(\"Bb3\", 0.2);\n\t */\n\tset(options: RecursivePartial<VoiceOptions<Voice>>): this {\n\t\t// remove options which are controlled by the PolySynth\n\t\tconst sanitizedOptions = omitFromObject(options, [\"onsilence\", \"context\"]);\n\t\t// store all of the options\n\t\tthis.options = deepMerge(this.options, sanitizedOptions);\n\t\tthis._voices.forEach(voice => voice.set(sanitizedOptions));\n\t\tthis._dummyVoice.set(sanitizedOptions);\n\t\treturn this;\n\t}\n\n\tget(): VoiceOptions<Voice> {\n\t\treturn this._dummyVoice.get();\n\t}\n\n\t/**\n\t * Trigger the release portion of all the currently active voices immediately.\n\t * Useful for silencing the synth.\n\t */\n\treleaseAll(time?: Time): this {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tthis._activeVoices.forEach(({ voice }) => {\n\t\t\tvoice.triggerRelease(computedTime);\n\t\t});\n\t\treturn this;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._dummyVoice.dispose();\n\t\tthis._voices.forEach(v => v.dispose());\n\t\tthis._activeVoices = [];\n\t\tthis._availableVoices = [];\n\t\tthis.context.clearInterval(this._gcTimeout);\n\t\treturn this;\n\t}\n}\n","import { ToneAudioBuffer } from \"../core/context/ToneAudioBuffer\";\nimport { ToneAudioBuffers } from \"../core/context/ToneAudioBuffers\";\nimport { ftomf, intervalToFrequencyRatio } from \"../core/type/Conversions\";\nimport { FrequencyClass } from \"../core/type/Frequency\";\nimport { Frequency, Interval, MidiNote, NormalRange, Note, Time } from \"../core/type/Units\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { noOp } from \"../core/util/Interface\";\nimport { isArray, isNote, isNumber } from \"../core/util/TypeCheck\";\nimport { Instrument, InstrumentOptions } from \"../instrument/Instrument\";\nimport { ToneBufferSource, ToneBufferSourceCurve } from \"../source/buffer/ToneBufferSource\";\nimport { timeRange } from \"../core/util/Decorator\";\nimport { assert } from \"../core/util/Debug\";\n\ninterface SamplesMap {\n\t[note: string]: ToneAudioBuffer | AudioBuffer | string;\n\t[midi: number]: ToneAudioBuffer | AudioBuffer | string;\n}\n\nexport interface SamplerOptions extends InstrumentOptions {\n\tattack: Time;\n\trelease: Time;\n\tonload: () => void;\n\tonerror: (error: Error) => void;\n\tbaseUrl: string;\n\tcurve: ToneBufferSourceCurve;\n\turls: SamplesMap;\n}\n\n/**\n * Pass in an object which maps the note's pitch or midi value to the url,\n * then you can trigger the attack and release of that note like other instruments.\n * By automatically repitching the samples, it is possible to play pitches which\n * were not explicitly included which can save loading time.\n *\n * For sample or buffer playback where repitching is not necessary,\n * use [[Player]].\n * @example\n * const sampler = new Tone.Sampler({\n * \turls: {\n * \t\tA1: \"A1.mp3\",\n * \t\tA2: \"A2.mp3\",\n * \t},\n * \tbaseUrl: \"https://tonejs.github.io/audio/casio/\",\n * \tonload: () => {\n * \t\tsampler.triggerAttackRelease([\"C1\", \"E1\", \"G1\", \"B1\"], 0.5);\n * \t}\n * }).toDestination();\n * @category Instrument\n */\nexport class Sampler extends Instrument<SamplerOptions> {\n\n\treadonly name: string = \"Sampler\";\n\n\t/**\n\t * The stored and loaded buffers\n\t */\n\tprivate _buffers: ToneAudioBuffers;\n\n\t/**\n\t * The object of all currently playing BufferSources\n\t */\n\tprivate _activeSources: Map<MidiNote, ToneBufferSource[]> = new Map();\n\n\t/**\n\t * The envelope applied to the beginning of the sample.\n\t * @min 0\n\t * @max 1\n\t */\n\t@timeRange(0)\n\tattack: Time;\n\n\t/**\n\t * The envelope applied to the end of the envelope.\n\t * @min 0\n\t * @max 1\n\t */\n\t@timeRange(0)\n\trelease: Time;\n\n\t/**\n\t * The shape of the attack/release curve.\n\t * Either \"linear\" or \"exponential\"\n\t */\n\tcurve: ToneBufferSourceCurve;\n\n\t/**\n\t * @param samples An object of samples mapping either Midi Note Numbers or\n\t * \t\t\tScientific Pitch Notation to the url of that sample.\n\t * @param onload The callback to invoke when all of the samples are loaded.\n\t * @param baseUrl The root URL of all of the samples, which is prepended to all the URLs.\n\t */\n\tconstructor(samples?: SamplesMap, onload?: () => void, baseUrl?: string);\n\t/**\n\t * @param samples An object of samples mapping either Midi Note Numbers or\n\t * \t\t\tScientific Pitch Notation to the url of that sample.\n\t * @param options The remaining options associated with the sampler\n\t */\n\tconstructor(samples?: SamplesMap, options?: Partial<Omit<SamplerOptions, \"urls\">>);\n\tconstructor(options?: Partial<SamplerOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Sampler.getDefaults(), arguments, [\"urls\", \"onload\", \"baseUrl\"], \"urls\"));\n\t\tconst options = optionsFromArguments(Sampler.getDefaults(), arguments, [\"urls\", \"onload\", \"baseUrl\"], \"urls\");\n\n\t\tconst urlMap = {};\n\t\tObject.keys(options.urls).forEach((note) => {\n\t\t\tconst noteNumber = parseInt(note, 10);\n\t\t\tassert(isNote(note)\n\t\t\t\t|| (isNumber(noteNumber) && isFinite(noteNumber)), `url key is neither a note or midi pitch: ${note}`);\n\t\t\tif (isNote(note)) {\n\t\t\t\t// convert the note name to MIDI\n\t\t\t\tconst mid = new FrequencyClass(this.context, note).toMidi();\n\t\t\t\turlMap[mid] = options.urls[note];\n\t\t\t} else if (isNumber(noteNumber) && isFinite(noteNumber)) {\n\t\t\t\t// otherwise if it's numbers assume it's midi\n\t\t\t\turlMap[noteNumber] = options.urls[noteNumber];\n\t\t\t}\n\t\t});\n\n\t\tthis._buffers = new ToneAudioBuffers({\n\t\t\turls: urlMap,\n\t\t\tonload: options.onload,\n\t\t\tbaseUrl: options.baseUrl,\n\t\t\tonerror: options.onerror,\n\t\t});\n\t\tthis.attack = options.attack;\n\t\tthis.release = options.release;\n\t\tthis.curve = options.curve;\n\n\t\t// invoke the callback if it's already loaded\n\t\tif (this._buffers.loaded) {\n\t\t\t// invoke onload deferred\n\t\t\tPromise.resolve().then(options.onload);\n\t\t}\n\t}\n\n\tstatic getDefaults(): SamplerOptions {\n\t\treturn Object.assign(Instrument.getDefaults(), {\n\t\t\tattack: 0,\n\t\t\tbaseUrl: \"\",\n\t\t\tcurve: \"exponential\" as \"exponential\",\n\t\t\tonload: noOp,\n\t\t\tonerror: noOp,\n\t\t\trelease: 0.1,\n\t\t\turls: {},\n\t\t});\n\t}\n\n\t/**\n\t * Returns the difference in steps between the given midi note at the closets sample.\n\t */\n\tprivate _findClosest(midi: MidiNote): Interval {\n\t\t// searches within 8 octaves of the given midi note\n\t\tconst MAX_INTERVAL = 96;\n\t\tlet interval = 0;\n\t\twhile (interval < MAX_INTERVAL) {\n\t\t\t// check above and below\n\t\t\tif (this._buffers.has(midi + interval)) {\n\t\t\t\treturn -interval;\n\t\t\t} else if (this._buffers.has(midi - interval)) {\n\t\t\t\treturn interval;\n\t\t\t}\n\t\t\tinterval++;\n\t\t}\n\t\tthrow new Error(`No available buffers for note: ${midi}`);\n\t}\n\n\t/**\n\t * @param notes\tThe note to play, or an array of notes.\n\t * @param time When to play the note\n\t * @param velocity The velocity to play the sample back.\n\t */\n\ttriggerAttack(notes: Frequency | Frequency[], time?: Time, velocity: NormalRange = 1): this {\n\t\tthis.log(\"triggerAttack\", notes, time, velocity);\n\t\tif (!Array.isArray(notes)) {\n\t\t\tnotes = [notes];\n\t\t}\n\t\tnotes.forEach(note => {\n\t\t\tconst midiFloat = ftomf(new FrequencyClass(this.context, note).toFrequency());\n\t\t\tconst midi = Math.round(midiFloat) as MidiNote;\n\t\t\tconst remainder = midiFloat - midi;\n\t\t\t// find the closest note pitch\n\t\t\tconst difference = this._findClosest(midi);\n\t\t\tconst closestNote = midi - difference;\n\t\t\tconst buffer = this._buffers.get(closestNote);\n\t\t\tconst playbackRate = intervalToFrequencyRatio(difference + remainder);\n\t\t\t// play that note\n\t\t\tconst source = new ToneBufferSource({\n\t\t\t\turl: buffer,\n\t\t\t\tcontext: this.context,\n\t\t\t\tcurve: this.curve,\n\t\t\t\tfadeIn: this.attack,\n\t\t\t\tfadeOut: this.release,\n\t\t\t\tplaybackRate,\n\t\t\t}).connect(this.output);\n\t\t\tsource.start(time, 0, buffer.duration / playbackRate, velocity);\n\t\t\t// add it to the active sources\n\t\t\tif (!isArray(this._activeSources.get(midi))) {\n\t\t\t\tthis._activeSources.set(midi, []);\n\t\t\t}\n\t\t\t(this._activeSources.get(midi) as ToneBufferSource[]).push(source);\n\n\t\t\t// remove it when it's done\n\t\t\tsource.onended = () => {\n\t\t\t\tif (this._activeSources && this._activeSources.has(midi)) {\n\t\t\t\t\tconst sources = this._activeSources.get(midi) as ToneBufferSource[];\n\t\t\t\t\tconst index = sources.indexOf(source);\n\t\t\t\t\tif (index !== -1) {\n\t\t\t\t\t\tsources.splice(index, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\t\treturn this;\n\t}\n\n\t/**\n\t * @param notes\tThe note to release, or an array of notes.\n\t * @param time \tWhen to release the note.\n\t */\n\ttriggerRelease(notes: Frequency | Frequency[], time?: Time): this {\n\t\tthis.log(\"triggerRelease\", notes, time);\n\t\tif (!Array.isArray(notes)) {\n\t\t\tnotes = [notes];\n\t\t}\n\t\tnotes.forEach(note => {\n\t\t\tconst midi = new FrequencyClass(this.context, note).toMidi();\n\t\t\t// find the note\n\t\t\tif (this._activeSources.has(midi) && (this._activeSources.get(midi) as ToneBufferSource[]).length) {\n\t\t\t\tconst sources = this._activeSources.get(midi) as ToneBufferSource[];\n\t\t\t\ttime = this.toSeconds(time);\n\t\t\t\tsources.forEach(source => {\n\t\t\t\t\tsource.stop(time);\n\t\t\t\t});\n\t\t\t\tthis._activeSources.set(midi, []);\n\t\t\t}\n\t\t});\n\t\treturn this;\n\t}\n\n\t/**\n\t * Release all currently active notes.\n\t * @param time \tWhen to release the notes.\n\t */\n\treleaseAll(time?: Time): this {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tthis._activeSources.forEach(sources => {\n\t\t\twhile (sources.length) {\n\t\t\t\tconst source = sources.shift() as ToneBufferSource;\n\t\t\t\tsource.stop(computedTime);\n\t\t\t}\n\t\t});\n\t\treturn this;\n\t}\n\n\tsync(): this {\n\t\tif (this._syncState()) {\n\t\t\tthis._syncMethod(\"triggerAttack\", 1);\n\t\t\tthis._syncMethod(\"triggerRelease\", 1);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Invoke the attack phase, then after the duration, invoke the release.\n\t * @param notes\tThe note to play and release, or an array of notes.\n\t * @param duration The time the note should be held\n\t * @param time When to start the attack\n\t * @param velocity The velocity of the attack\n\t */\n\ttriggerAttackRelease(\n\t\tnotes: Frequency[] | Frequency,\n\t\tduration: Time | Time[],\n\t\ttime?: Time,\n\t\tvelocity: NormalRange = 1,\n\t): this {\n\t\tconst computedTime = this.toSeconds(time);\n\t\tthis.triggerAttack(notes, computedTime, velocity);\n\t\tif (isArray(duration)) {\n\t\t\tassert(isArray(notes), \"notes must be an array when duration is array\");\n\t\t\t(notes as Frequency[]).forEach((note, index) => {\n\t\t\t\tconst d = duration[Math.min(index, duration.length - 1)];\n\t\t\t\tthis.triggerRelease(note, computedTime + this.toSeconds(d));\n\t\t\t});\n\t\t} else {\n\t\t\tthis.triggerRelease(notes, computedTime + this.toSeconds(duration));\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Add a note to the sampler.\n\t * @param note The buffer's pitch.\n\t * @param url Either the url of the buffer, or a buffer which will be added with the given name.\n\t * @param callback The callback to invoke when the url is loaded.\n\t */\n\tadd(note: Note | MidiNote, url: string | ToneAudioBuffer | AudioBuffer, callback?: () => void): this {\n\t\tassert(isNote(note) || isFinite(note), `note must be a pitch or midi: ${note}`);\n\t\tif (isNote(note)) {\n\t\t\t// convert the note name to MIDI\n\t\t\tconst mid = new FrequencyClass(this.context, note).toMidi();\n\t\t\tthis._buffers.add(mid, url, callback);\n\t\t} else {\n\t\t\t// otherwise if it's numbers assume it's midi\n\t\t\tthis._buffers.add(note, url, callback);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * If the buffers are loaded or not\n\t */\n\tget loaded(): boolean {\n\t\treturn this._buffers.loaded;\n\t}\n\n\t/**\n\t * Clean up\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._buffers.dispose();\n\t\tthis._activeSources.forEach(sources => {\n\t\t\tsources.forEach(source => source.dispose());\n\t\t});\n\t\tthis._activeSources.clear();\n\t\treturn this;\n\t}\n}\n","import \"../core/clock/Transport\";\nimport { ToneWithContext, ToneWithContextOptions } from \"../core/context/ToneWithContext\";\nimport { TicksClass } from \"../core/type/Ticks\";\nimport { TransportTimeClass } from \"../core/type/TransportTime\";\nimport { NormalRange, Positive, Seconds, Ticks, Time, TransportTime } from \"../core/type/Units\";\nimport { defaultArg, optionsFromArguments } from \"../core/util/Defaults\";\nimport { noOp } from \"../core/util/Interface\";\nimport { BasicPlaybackState, StateTimeline } from \"../core/util/StateTimeline\";\nimport { isBoolean, isNumber } from \"../core/util/TypeCheck\";\n\nexport type ToneEventCallback<T> = (time: Seconds, value: T) => void;\n\nexport interface ToneEventOptions<T> extends ToneWithContextOptions {\n\tcallback: ToneEventCallback<T>;\n\tloop: boolean | number;\n\tloopEnd: Time;\n\tloopStart: Time;\n\tplaybackRate: Positive;\n\tvalue?: T;\n\tprobability: NormalRange;\n\tmute: boolean;\n\thumanize: boolean | Time;\n}\n\n/**\n * ToneEvent abstracts away this.context.transport.schedule and provides a schedulable\n * callback for a single or repeatable events along the timeline.\n *\n * @example\n * const synth = new Tone.PolySynth().toDestination();\n * const chordEvent = new Tone.ToneEvent(((time, chord) => {\n * \t// the chord as well as the exact time of the event\n * \t// are passed in as arguments to the callback function\n * \tsynth.triggerAttackRelease(chord, 0.5, time);\n * }), [\"D4\", \"E4\", \"F4\"]);\n * // start the chord at the beginning of the transport timeline\n * chordEvent.start();\n * // loop it every measure for 8 measures\n * chordEvent.loop = 8;\n * chordEvent.loopEnd = \"1m\";\n * @category Event\n */\nexport class ToneEvent<ValueType = any> extends ToneWithContext<ToneEventOptions<ValueType>> {\n\n\treadonly name: string = \"ToneEvent\";\n\n\t/**\n\t * Loop value\n\t */\n\tprotected _loop: boolean | number;\n\n\t/**\n\t * The callback to invoke.\n\t */\n\tcallback: ToneEventCallback<ValueType>;\n\n\t/**\n\t * The value which is passed to the\n\t * callback function.\n\t */\n\tvalue: ValueType;\n\n\t/**\n\t * When the note is scheduled to start.\n\t */\n\tprotected _loopStart: Ticks;\n\n\t/**\n\t * When the note is scheduled to start.\n\t */\n\tprotected _loopEnd: Ticks;\n\n\t/**\n\t * Tracks the scheduled events\n\t */\n\tprotected _state: StateTimeline<{\n\t\tid: number;\n\t}> = new StateTimeline(\"stopped\");\n\n\t/**\n\t * The playback speed of the note. A speed of 1\n\t * is no change.\n\t */\n\tprotected _playbackRate: Positive;\n\n\t/**\n\t * A delay time from when the event is scheduled to start\n\t */\n\tprotected _startOffset: Ticks = 0;\n\n\t/**\n\t * private holder of probability value\n\t */\n\tprotected _probability: NormalRange;\n\n\t/**\n\t * the amount of variation from the given time.\n\t */\n\tprotected _humanize: boolean | Time;\n\n\t/**\n\t * If mute is true, the callback won't be invoked.\n\t */\n\tmute: boolean;\n\n\t/**\n\t * @param callback The callback to invoke at the time.\n\t * @param value The value or values which should be passed to the callback function on invocation.\n\t */\n\tconstructor(callback?: ToneEventCallback<ValueType>, value?: ValueType);\n\tconstructor(options?: Partial<ToneEventOptions<ValueType>>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(ToneEvent.getDefaults(), arguments, [\"callback\", \"value\"]));\n\t\tconst options = optionsFromArguments(ToneEvent.getDefaults(), arguments, [\"callback\", \"value\"]);\n\n\t\tthis._loop = options.loop;\n\t\tthis.callback = options.callback;\n\t\tthis.value = options.value;\n\t\tthis._loopStart = this.toTicks(options.loopStart);\n\t\tthis._loopEnd = this.toTicks(options.loopEnd);\n\t\tthis._playbackRate = options.playbackRate;\n\t\tthis._probability = options.probability;\n\t\tthis._humanize = options.humanize;\n\t\tthis.mute = options.mute;\n\t\tthis._playbackRate = options.playbackRate;\n\t\tthis._state.increasing = true;\n\t\t// schedule the events for the first time\n\t\tthis._rescheduleEvents();\n\t}\n\n\tstatic getDefaults(): ToneEventOptions<any> {\n\t\treturn Object.assign(ToneWithContext.getDefaults(), {\n\t\t\tcallback: noOp,\n\t\t\thumanize: false,\n\t\t\tloop: false,\n\t\t\tloopEnd: \"1m\",\n\t\t\tloopStart: 0,\n\t\t\tmute: false,\n\t\t\tplaybackRate: 1,\n\t\t\tprobability: 1,\n\t\t\tvalue: null,\n\t\t});\n\t}\n\n\t/**\n\t * Reschedule all of the events along the timeline\n\t * with the updated values.\n\t * @param after Only reschedules events after the given time.\n\t */\n\tprivate _rescheduleEvents(after: Ticks = -1): void {\n\t\t// if no argument is given, schedules all of the events\n\t\tthis._state.forEachFrom(after, event => {\n\t\t\tlet duration;\n\t\t\tif (event.state === \"started\") {\n\t\t\t\tif (event.id !== -1) {\n\t\t\t\t\tthis.context.transport.clear(event.id);\n\t\t\t\t}\n\t\t\t\tconst startTick = event.time + Math.round(this.startOffset / this._playbackRate);\n\t\t\t\tif (this._loop === true || isNumber(this._loop) && this._loop > 1) {\n\t\t\t\t\tduration = Infinity;\n\t\t\t\t\tif (isNumber(this._loop)) {\n\t\t\t\t\t\tduration = (this._loop) * this._getLoopDuration();\n\t\t\t\t\t}\n\t\t\t\t\tconst nextEvent = this._state.getAfter(startTick);\n\t\t\t\t\tif (nextEvent !== null) {\n\t\t\t\t\t\tduration = Math.min(duration, nextEvent.time - startTick);\n\t\t\t\t\t}\n\t\t\t\t\tif (duration !== Infinity) {\n\t\t\t\t\t\tduration = new TicksClass(this.context, duration);\n\t\t\t\t\t}\n\t\t\t\t\tconst interval = new TicksClass(this.context, this._getLoopDuration());\n\t\t\t\t\tevent.id = this.context.transport.scheduleRepeat(\n\t\t\t\t\t\tthis._tick.bind(this), interval, new TicksClass(this.context, startTick), duration);\n\t\t\t\t} else {\n\t\t\t\t\tevent.id = this.context.transport.schedule(this._tick.bind(this), new TicksClass(this.context, startTick));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Returns the playback state of the note, either \"started\" or \"stopped\".\n\t */\n\tget state(): BasicPlaybackState {\n\t\treturn this._state.getValueAtTime(this.context.transport.ticks) as BasicPlaybackState;\n\t}\n\n\t/**\n\t * The start from the scheduled start time.\n\t */\n\tget startOffset(): Ticks {\n\t\treturn this._startOffset;\n\t}\n\tset startOffset(offset) {\n\t\tthis._startOffset = offset;\n\t}\n\n\t/**\n\t * The probability of the notes being triggered.\n\t */\n\tget probability(): NormalRange {\n\t\treturn this._probability;\n\t}\n\tset probability(prob) {\n\t\tthis._probability = prob;\n\t}\n\n\t/**\n\t * If set to true, will apply small random variation\n\t * to the callback time. If the value is given as a time, it will randomize\n\t * by that amount.\n\t * @example\n\t * const event = new Tone.ToneEvent();\n\t * event.humanize = true;\n\t */\n\tget humanize(): Time | boolean {\n\t\treturn this._humanize;\n\t}\n\n\tset humanize(variation) {\n\t\tthis._humanize = variation;\n\t}\n\n\t/**\n\t * Start the note at the given time.\n\t * @param time When the event should start.\n\t */\n\tstart(time?: TransportTime | TransportTimeClass): this {\n\t\tconst ticks = this.toTicks(time);\n\t\tif (this._state.getValueAtTime(ticks) === \"stopped\") {\n\t\t\tthis._state.add({\n\t\t\t\tid: -1,\n\t\t\t\tstate: \"started\",\n\t\t\t\ttime: ticks,\n\t\t\t});\n\t\t\tthis._rescheduleEvents(ticks);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Stop the Event at the given time.\n\t * @param time When the event should stop.\n\t */\n\tstop(time?: TransportTime | TransportTimeClass): this {\n\t\tthis.cancel(time);\n\t\tconst ticks = this.toTicks(time);\n\t\tif (this._state.getValueAtTime(ticks) === \"started\") {\n\t\t\tthis._state.setStateAtTime(\"stopped\", ticks, { id: -1 });\n\t\t\tconst previousEvent = this._state.getBefore(ticks);\n\t\t\tlet rescheduleTime = ticks;\n\t\t\tif (previousEvent !== null) {\n\t\t\t\trescheduleTime = previousEvent.time;\n\t\t\t}\n\t\t\tthis._rescheduleEvents(rescheduleTime);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Cancel all scheduled events greater than or equal to the given time\n\t * @param time The time after which events will be cancel.\n\t */\n\tcancel(time?: TransportTime | TransportTimeClass): this {\n\t\ttime = defaultArg(time, -Infinity);\n\t\tconst ticks = this.toTicks(time);\n\t\tthis._state.forEachFrom(ticks, event => {\n\t\t\tthis.context.transport.clear(event.id);\n\t\t});\n\t\tthis._state.cancel(ticks);\n\t\treturn this;\n\t}\n\n\t/**\n\t * The callback function invoker. Also\n\t * checks if the Event is done playing\n\t * @param time The time of the event in seconds\n\t */\n\tprotected _tick(time: Seconds): void {\n\t\tconst ticks = this.context.transport.getTicksAtTime(time);\n\t\tif (!this.mute && this._state.getValueAtTime(ticks) === \"started\") {\n\t\t\tif (this.probability < 1 && Math.random() > this.probability) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.humanize) {\n\t\t\t\tlet variation = 0.02;\n\t\t\t\tif (!isBoolean(this.humanize)) {\n\t\t\t\t\tvariation = this.toSeconds(this.humanize);\n\t\t\t\t}\n\t\t\t\ttime += (Math.random() * 2 - 1) * variation;\n\t\t\t}\n\t\t\tthis.callback(time, this.value);\n\t\t}\n\t}\n\n\t/**\n\t * Get the duration of the loop.\n\t */\n\tprotected _getLoopDuration(): Ticks {\n\t\treturn (this._loopEnd - this._loopStart) / this._playbackRate;\n\t}\n\n\t/**\n\t * If the note should loop or not\n\t * between ToneEvent.loopStart and\n\t * ToneEvent.loopEnd. If set to true,\n\t * the event will loop indefinitely,\n\t * if set to a number greater than 1\n\t * it will play a specific number of\n\t * times, if set to false, 0 or 1, the\n\t * part will only play once.\n\t */\n\tget loop(): boolean | number {\n\t\treturn this._loop;\n\t}\n\tset loop(loop) {\n\t\tthis._loop = loop;\n\t\tthis._rescheduleEvents();\n\t}\n\n\t/**\n\t * The playback rate of the event. Defaults to 1.\n\t * @example\n\t * const note = new Tone.ToneEvent();\n\t * note.loop = true;\n\t * // repeat the note twice as fast\n\t * note.playbackRate = 2;\n\t */\n\tget playbackRate(): Positive {\n\t\treturn this._playbackRate;\n\t}\n\tset playbackRate(rate) {\n\t\tthis._playbackRate = rate;\n\t\tthis._rescheduleEvents();\n\t}\n\n\t/**\n\t * The loopEnd point is the time the event will loop\n\t * if ToneEvent.loop is true.\n\t */\n\tget loopEnd(): Time {\n\t\treturn new TicksClass(this.context, this._loopEnd).toSeconds();\n\t}\n\tset loopEnd(loopEnd) {\n\t\tthis._loopEnd = this.toTicks(loopEnd);\n\t\tif (this._loop) {\n\t\t\tthis._rescheduleEvents();\n\t\t}\n\t}\n\n\t/**\n\t * The time when the loop should start.\n\t */\n\tget loopStart(): Time {\n\t\treturn new TicksClass(this.context, this._loopStart).toSeconds();\n\t}\n\tset loopStart(loopStart) {\n\t\tthis._loopStart = this.toTicks(loopStart);\n\t\tif (this._loop) {\n\t\t\tthis._rescheduleEvents();\n\t\t}\n\t}\n\n\t/**\n\t * The current progress of the loop interval.\n\t * Returns 0 if the event is not started yet or\n\t * it is not set to loop.\n\t */\n\tget progress(): NormalRange {\n\t\tif (this._loop) {\n\t\t\tconst ticks = this.context.transport.ticks;\n\t\t\tconst lastEvent = this._state.get(ticks);\n\t\t\tif (lastEvent !== null && lastEvent.state === \"started\") {\n\t\t\t\tconst loopDuration = this._getLoopDuration();\n\t\t\t\tconst progress = (ticks - lastEvent.time) % loopDuration;\n\t\t\t\treturn progress / loopDuration;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.cancel();\n\t\tthis._state.dispose();\n\t\treturn this;\n\t}\n}\n","import { ToneEvent } from \"./ToneEvent\";\nimport { NormalRange, Positive, Seconds, Time, TransportTime } from \"../core/type/Units\";\nimport { ToneWithContext, ToneWithContextOptions } from \"../core/context/ToneWithContext\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { noOp } from \"../core/util/Interface\";\nimport { BasicPlaybackState } from \"../core/util/StateTimeline\";\n\nexport interface LoopOptions extends ToneWithContextOptions {\n\tcallback: (time: Seconds) => void;\n\tinterval: Time;\n\tplaybackRate: Positive;\n\titerations: number;\n\tprobability: NormalRange;\n\tmute: boolean;\n\thumanize: boolean | Time;\n}\n\n/**\n * Loop creates a looped callback at the \n * specified interval. The callback can be \n * started, stopped and scheduled along\n * the Transport's timeline. \n * @example\n * const loop = new Tone.Loop((time) => {\n * \t// triggered every eighth note. \n * \tconsole.log(time);\n * }, \"8n\").start(0);\n * Tone.Transport.start();\n * @category Event\n */\nexport class Loop<Options extends LoopOptions = LoopOptions> extends ToneWithContext<Options> {\n\n\treadonly name: string = \"Loop\";\n\n\t/**\n\t * The event which produces the callbacks\n\t */\n\tprivate _event: ToneEvent;\n\n\t/**\n\t * The callback to invoke with the next event in the pattern\n\t */\n\tcallback: (time: Seconds) => void\n\n\t/**\n\t * @param callback The callback to invoke at the time.\n\t * @param interval The time between successive callback calls. \n\t */\n\tconstructor(callback?: (time: Seconds) => void, interval?: Time);\n\tconstructor(options?: Partial<LoopOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(Loop.getDefaults(), arguments, [\"callback\", \"interval\"]));\n\t\tconst options = optionsFromArguments(Loop.getDefaults(), arguments, [\"callback\", \"interval\"]);\n\n\t\tthis._event = new ToneEvent({\n\t\t\tcontext: this.context,\n\t\t\tcallback: this._tick.bind(this),\n\t\t\tloop: true,\n\t\t\tloopEnd: options.interval,\n\t\t\tplaybackRate: options.playbackRate,\n\t\t\tprobability: options.probability\n\t\t});\n\n\t\tthis.callback = options.callback;\n\t\t// set the iterations\n\t\tthis.iterations = options.iterations;\n\t}\n\n\tstatic getDefaults(): LoopOptions {\n\t\treturn Object.assign(ToneWithContext.getDefaults(), {\n\t\t\tinterval: \"4n\",\n\t\t\tcallback: noOp,\n\t\t\tplaybackRate: 1,\n\t\t\titerations: Infinity,\n\t\t\tprobability: 1,\n\t\t\tmute: false,\n\t\t\thumanize: false\n\t\t});\n\t}\n\n\t/**\n\t * Start the loop at the specified time along the Transport's timeline.\n\t * @param time When to start the Loop.\n\t */\n\tstart(time?: TransportTime): this {\n\t\tthis._event.start(time);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Stop the loop at the given time.\n\t * @param time When to stop the Loop.\n\t */\n\tstop(time?: TransportTime): this {\n\t\tthis._event.stop(time);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Cancel all scheduled events greater than or equal to the given time\n\t * @param time The time after which events will be cancel.\n\t */\n\tcancel(time?: TransportTime): this {\n\t\tthis._event.cancel(time);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Internal function called when the notes should be called\n\t * @param time The time the event occurs\n\t */\n\tprotected _tick(time: Seconds): void {\n\t\tthis.callback(time);\n\t}\n\n\t/**\n\t * The state of the Loop, either started or stopped.\n\t */\n\tget state(): BasicPlaybackState {\n\t\treturn this._event.state;\n\t}\n\n\t/**\n\t * The progress of the loop as a value between 0-1. 0, when the loop is stopped or done iterating. \n\t */\n\tget progress(): NormalRange {\n\t\treturn this._event.progress;\n\t}\n\n\t/**\n\t * The time between successive callbacks. \n\t * @example\n\t * const loop = new Tone.Loop();\n\t * loop.interval = \"8n\"; // loop every 8n\n\t */\n\tget interval(): Time {\n\t\treturn this._event.loopEnd;\n\t}\n\tset interval(interval) {\n\t\tthis._event.loopEnd = interval;\n\t}\n\n\t/**\n\t * The playback rate of the loop. The normal playback rate is 1 (no change). \n\t * A `playbackRate` of 2 would be twice as fast. \n\t */\n\tget playbackRate(): Positive {\n\t\treturn this._event.playbackRate;\n\t}\n\tset playbackRate(rate) {\n\t\tthis._event.playbackRate = rate;\n\t}\n\n\t/**\n\t * Random variation +/-0.01s to the scheduled time. \n\t * Or give it a time value which it will randomize by.\n\t */\n\tget humanize(): boolean | Time {\n\t\treturn this._event.humanize;\n\t}\n\tset humanize(variation) {\n\t\tthis._event.humanize = variation;\n\t}\n\n\t/**\n\t * The probably of the callback being invoked.\n\t */\n\tget probability(): NormalRange {\n\t\treturn this._event.probability;\n\t}\n\n\tset probability(prob) {\n\t\tthis._event.probability = prob;\n\t}\n\n\t/**\n\t * Muting the Loop means that no callbacks are invoked.\n\t */\n\tget mute(): boolean {\n\t\treturn this._event.mute;\n\t}\n\n\tset mute(mute) {\n\t\tthis._event.mute = mute;\n\t}\n\n\t/**\n\t * The number of iterations of the loop. The default value is `Infinity` (loop forever).\n\t */\n\tget iterations(): number {\n\t\tif (this._event.loop === true) {\n\t\t\treturn Infinity;\n\t\t} else {\n\t\t\treturn this._event.loop as number;\n\t\t}\n\t}\n\tset iterations(iters) {\n\t\tif (iters === Infinity) {\n\t\t\tthis._event.loop = true;\n\t\t} else {\n\t\t\tthis._event.loop = iters;\n\t\t}\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._event.dispose();\n\t\treturn this;\n\t}\n}\n","import { TicksClass } from \"../core/type/Ticks\";\nimport { TransportTimeClass } from \"../core/type/TransportTime\";\nimport { NormalRange, Positive, Seconds, Ticks, Time, TransportTime } from \"../core/type/Units\";\nimport { defaultArg, optionsFromArguments } from \"../core/util/Defaults\";\nimport { StateTimeline } from \"../core/util/StateTimeline\";\nimport { isArray, isDefined, isObject, isUndef } from \"../core/util/TypeCheck\";\nimport { ToneEvent, ToneEventCallback, ToneEventOptions } from \"./ToneEvent\";\n\ntype CallbackType<T> =\n\tT extends {\n\t\ttime: Time;\n\t\t[key: string]: any;\n\t} ? T :\n\t\tT extends ArrayLike<any> ? T[1] :\n\t\t\tT extends Time ? null : never;\n\ninterface PartOptions<T> extends Omit<ToneEventOptions<CallbackType<T>>, \"value\"> {\n\tevents: T[];\n}\n\n/**\n * Part is a collection ToneEvents which can be started/stopped and looped as a single unit.\n *\n * @example\n * const synth = new Tone.Synth().toDestination();\n * const part = new Tone.Part(((time, note) => {\n * \t// the notes given as the second element in the array\n * \t// will be passed in as the second argument\n * \tsynth.triggerAttackRelease(note, \"8n\", time);\n * }), [[0, \"C2\"], [\"0:2\", \"C3\"], [\"0:3:2\", \"G2\"]]);\n * Tone.Transport.start();\n * @example\n * const synth = new Tone.Synth().toDestination();\n * // use an array of objects as long as the object has a \"time\" attribute\n * const part = new Tone.Part(((time, value) => {\n * \t// the value is an object which contains both the note and the velocity\n * \tsynth.triggerAttackRelease(value.note, \"8n\", time, value.velocity);\n * }), [{ time: 0, note: \"C3\", velocity: 0.9 },\n * \t{ time: \"0:2\", note: \"C4\", velocity: 0.5 }\n * ]).start(0);\n * Tone.Transport.start();\n * @category Event\n */\nexport class Part<ValueType = any> extends ToneEvent<ValueType> {\n\n\treadonly name: string = \"Part\";\n\n\t/**\n\t * Tracks the scheduled events\n\t */\n\tprotected _state: StateTimeline<{\n\t\tid: number;\n\t\toffset: number;\n\t}> = new StateTimeline(\"stopped\");\n\n\t/**\n\t * The events that belong to this part\n\t */\n\tprivate _events: Set<ToneEvent> = new Set();\n\n\t/**\n\t * @param callback The callback to invoke on each event\n\t * @param events the array of events\n\t */\n\tconstructor(callback?: ToneEventCallback<CallbackType<ValueType>>, value?: ValueType[]);\n\tconstructor(options?: Partial<PartOptions<ValueType>>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Part.getDefaults(), arguments, [\"callback\", \"events\"]));\n\t\tconst options = optionsFromArguments(Part.getDefaults(), arguments, [\"callback\", \"events\"]);\n\n\t\t// make sure things are assigned in the right order\n\t\tthis._state.increasing = true;\n\n\t\t// add the events\n\t\toptions.events.forEach(event => {\n\t\t\tif (isArray(event)) {\n\t\t\t\tthis.add(event[0], event[1]);\n\t\t\t} else {\n\t\t\t\tthis.add(event);\n\t\t\t}\n\t\t});\n\t}\n\n\tstatic getDefaults(): PartOptions<any> {\n\t\treturn Object.assign(ToneEvent.getDefaults(), {\n\t\t\tevents: [],\n\t\t});\n\t}\n\n\t/**\n\t * Start the part at the given time.\n\t * @param time When to start the part.\n\t * @param offset The offset from the start of the part to begin playing at.\n\t */\n\tstart(time?: TransportTime, offset?: Time): this {\n\t\tconst ticks = this.toTicks(time);\n\t\tif (this._state.getValueAtTime(ticks) !== \"started\") {\n\t\t\toffset = defaultArg(offset, this._loop ? this._loopStart : 0);\n\t\t\tif (this._loop) {\n\t\t\t\toffset = defaultArg(offset, this._loopStart);\n\t\t\t} else {\n\t\t\t\toffset = defaultArg(offset, 0);\n\t\t\t}\n\t\t\tconst computedOffset = this.toTicks(offset);\n\t\t\tthis._state.add({\n\t\t\t\tid: -1,\n\t\t\t\toffset: computedOffset,\n\t\t\t\tstate: \"started\",\n\t\t\t\ttime: ticks,\n\t\t\t});\n\t\t\tthis._forEach(event => {\n\t\t\t\tthis._startNote(event, ticks, computedOffset);\n\t\t\t});\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Start the event in the given event at the correct time given\n\t * the ticks and offset and looping.\n\t * @param event\n\t * @param ticks\n\t * @param offset\n\t */\n\tprivate _startNote(event: ToneEvent, ticks: Ticks, offset: Ticks): void {\n\t\tticks -= offset;\n\t\tif (this._loop) {\n\t\t\tif (event.startOffset >= this._loopStart && event.startOffset < this._loopEnd) {\n\t\t\t\tif (event.startOffset < offset) {\n\t\t\t\t\t// start it on the next loop\n\t\t\t\t\tticks += this._getLoopDuration();\n\t\t\t\t}\n\t\t\t\tevent.start(new TicksClass(this.context, ticks));\n\t\t\t} else if (event.startOffset < this._loopStart && event.startOffset >= offset) {\n\t\t\t\tevent.loop = false;\n\t\t\t\tevent.start(new TicksClass(this.context, ticks));\n\t\t\t}\n\t\t} else if (event.startOffset >= offset) {\n\t\t\tevent.start(new TicksClass(this.context, ticks));\n\t\t}\n\t}\n\n\tget startOffset(): Ticks {\n\t\treturn this._startOffset;\n\t}\n\tset startOffset(offset) {\n\t\tthis._startOffset = offset;\n\t\tthis._forEach(event => {\n\t\t\tevent.startOffset += this._startOffset;\n\t\t});\n\t}\n\n\t/**\n\t * Stop the part at the given time.\n\t * @param time When to stop the part.\n\t */\n\tstop(time?: TransportTime): this {\n\t\tconst ticks = this.toTicks(time);\n\t\tthis._state.cancel(ticks);\n\t\tthis._state.setStateAtTime(\"stopped\", ticks);\n\t\tthis._forEach(event => {\n\t\t\tevent.stop(time);\n\t\t});\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get/Set an Event's value at the given time.\n\t * If a value is passed in and no event exists at\n\t * the given time, one will be created with that value.\n\t * If two events are at the same time, the first one will\n\t * be returned.\n\t * @example\n\t * const part = new Tone.Part();\n\t * part.at(\"1m\"); // returns the part at the first measure\n\t * part.at(\"2m\", \"C2\"); // set the value at \"2m\" to C2.\n\t * // if an event didn't exist at that time, it will be created.\n\t * @param time The time of the event to get or set.\n\t * @param value If a value is passed in, the value of the event at the given time will be set to it.\n\t */\n\tat(time: Time, value?: any): ToneEvent | null {\n\t\tconst timeInTicks = new TransportTimeClass(this.context, time).toTicks();\n\t\tconst tickTime = new TicksClass(this.context, 1).toSeconds();\n\n\t\tconst iterator = this._events.values();\n\t\tlet result = iterator.next();\n\t\twhile (!result.done) {\n\t\t\tconst event = result.value;\n\t\t\tif (Math.abs(timeInTicks - event.startOffset) < tickTime) {\n\t\t\t\tif (isDefined(value)) {\n\t\t\t\t\tevent.value = value;\n\t\t\t\t}\n\t\t\t\treturn event;\n\t\t\t}\n\t\t\tresult = iterator.next();\n\t\t}\n\t\t// if there was no event at that time, create one\n\t\tif (isDefined(value)) {\n\t\t\tthis.add(time, value);\n\t\t\t// return the new event\n\t\t\treturn this.at(time);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Add a an event to the part.\n\t * @param time The time the note should start. If an object is passed in, it should\n\t * \t\thave a 'time' attribute and the rest of the object will be used as the 'value'.\n\t * @param value\n\t * @example\n\t * const part = new Tone.Part();\n\t * part.add(\"1m\", \"C#+11\");\n\t */\n\tadd(obj: {\n\t\ttime: Time;\n\t\t[key: string]: any;\n\t}): this;\n\tadd(time: Time, value?: any): this;\n\tadd(time: Time | object, value?: any): this {\n\t\t// extract the parameters\n\t\tif (time instanceof Object && Reflect.has(time, \"time\")) {\n\t\t\tvalue = time;\n\t\t\ttime = value.time;\n\t\t}\n\t\tconst ticks = this.toTicks(time);\n\t\tlet event: ToneEvent;\n\t\tif (value instanceof ToneEvent) {\n\t\t\tevent = value;\n\t\t\tevent.callback = this._tick.bind(this);\n\t\t} else {\n\t\t\tevent = new ToneEvent({\n\t\t\t\tcallback: this._tick.bind(this),\n\t\t\t\tcontext: this.context,\n\t\t\t\tvalue,\n\t\t\t});\n\t\t}\n\t\t// the start offset\n\t\tevent.startOffset = ticks;\n\n\t\t// initialize the values\n\t\tevent.set({\n\t\t\thumanize: this.humanize,\n\t\t\tloop: this.loop,\n\t\t\tloopEnd: this.loopEnd,\n\t\t\tloopStart: this.loopStart,\n\t\t\tplaybackRate: this.playbackRate,\n\t\t\tprobability: this.probability,\n\t\t});\n\n\t\tthis._events.add(event);\n\n\t\t// start the note if it should be played right now\n\t\tthis._restartEvent(event);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Restart the given event\n\t */\n\tprivate _restartEvent(event: ToneEvent): void {\n\t\tthis._state.forEach((stateEvent) => {\n\t\t\tif (stateEvent.state === \"started\") {\n\t\t\t\tthis._startNote(event, stateEvent.time, stateEvent.offset);\n\t\t\t} else {\n\t\t\t\t// stop the note\n\t\t\t\tevent.stop(new TicksClass(this.context, stateEvent.time));\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Remove an event from the part. If the event at that time is a Part,\n\t * it will remove the entire part.\n\t * @param time The time of the event\n\t * @param value Optionally select only a specific event value\n\t */\n\tremove(obj: {\n\t\ttime: Time;\n\t\t[key: string]: any;\n\t}): this;\n\tremove(time: Time, value?: any): this;\n\tremove(time: Time | object, value?: any): this {\n\t\t// extract the parameters\n\t\tif (isObject(time) && time.hasOwnProperty(\"time\")) {\n\t\t\tvalue = time;\n\t\t\ttime = value.time;\n\t\t}\n\t\ttime = this.toTicks(time);\n\t\tthis._events.forEach(event => {\n\t\t\tif (event.startOffset === time) {\n\t\t\t\tif (isUndef(value) || (isDefined(value) && event.value === value)) {\n\t\t\t\t\tthis._events.delete(event);\n\t\t\t\t\tevent.dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn this;\n\t}\n\n\t/**\n\t * Remove all of the notes from the group.\n\t */\n\tclear(): this {\n\t\tthis._forEach(event => event.dispose());\n\t\tthis._events.clear();\n\t\treturn this;\n\t}\n\n\t/**\n\t * Cancel scheduled state change events: i.e. \"start\" and \"stop\".\n\t * @param after The time after which to cancel the scheduled events.\n\t */\n\tcancel(after?: TransportTime | TransportTimeClass): this {\n\t\tthis._forEach(event => event.cancel(after));\n\t\tthis._state.cancel(this.toTicks(after));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Iterate over all of the events\n\t */\n\tprivate _forEach(callback: (event: ToneEvent) => void): this {\n\t\tif (this._events) {\n\t\t\tthis._events.forEach(event => {\n\t\t\t\tif (event instanceof Part) {\n\t\t\t\t\tevent._forEach(callback);\n\t\t\t\t} else {\n\t\t\t\t\tcallback(event);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the attribute of all of the events\n\t * @param attr the attribute to set\n\t * @param value The value to set it to\n\t */\n\tprivate _setAll(attr: string, value: any): void {\n\t\tthis._forEach(event => {\n\t\t\tevent[attr] = value;\n\t\t});\n\t}\n\n\t/**\n\t * Internal tick method\n\t * @param time The time of the event in seconds\n\t */\n\tprotected _tick(time: Seconds, value?: any): void {\n\t\tif (!this.mute) {\n\t\t\tthis.callback(time, value);\n\t\t}\n\t}\n\n\t/**\n\t * Determine if the event should be currently looping\n\t * given the loop boundries of this Part.\n\t * @param event The event to test\n\t */\n\tprivate _testLoopBoundries(event: ToneEvent): void {\n\t\tif (this._loop && (event.startOffset < this._loopStart || event.startOffset >= this._loopEnd)) {\n\t\t\tevent.cancel(0);\n\t\t} else if (event.state === \"stopped\") {\n\t\t\t// reschedule it if it's stopped\n\t\t\tthis._restartEvent(event);\n\t\t}\n\t}\n\n\tget probability(): NormalRange {\n\t\treturn this._probability;\n\t}\n\tset probability(prob) {\n\t\tthis._probability = prob;\n\t\tthis._setAll(\"probability\", prob);\n\t}\n\n\tget humanize(): boolean | Time {\n\t\treturn this._humanize;\n\t}\n\tset humanize(variation) {\n\t\tthis._humanize = variation;\n\t\tthis._setAll(\"humanize\", variation);\n\t}\n\n\t/**\n\t * If the part should loop or not\n\t * between Part.loopStart and\n\t * Part.loopEnd. If set to true,\n\t * the part will loop indefinitely,\n\t * if set to a number greater than 1\n\t * it will play a specific number of\n\t * times, if set to false, 0 or 1, the\n\t * part will only play once.\n\t * @example\n\t * const part = new Tone.Part();\n\t * // loop the part 8 times\n\t * part.loop = 8;\n\t */\n\tget loop(): boolean | number {\n\t\treturn this._loop;\n\t}\n\tset loop(loop) {\n\t\tthis._loop = loop;\n\t\tthis._forEach(event => {\n\t\t\tevent.loopStart = this.loopStart;\n\t\t\tevent.loopEnd = this.loopEnd;\n\t\t\tevent.loop = loop;\n\t\t\tthis._testLoopBoundries(event);\n\t\t});\n\t}\n\n\t/**\n\t * The loopEnd point determines when it will\n\t * loop if Part.loop is true.\n\t */\n\tget loopEnd(): Time {\n\t\treturn new TicksClass(this.context, this._loopEnd).toSeconds();\n\t}\n\tset loopEnd(loopEnd) {\n\t\tthis._loopEnd = this.toTicks(loopEnd);\n\t\tif (this._loop) {\n\t\t\tthis._forEach(event => {\n\t\t\t\tevent.loopEnd = loopEnd;\n\t\t\t\tthis._testLoopBoundries(event);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * The loopStart point determines when it will\n\t * loop if Part.loop is true.\n\t */\n\tget loopStart(): Time {\n\t\treturn new TicksClass(this.context, this._loopStart).toSeconds();\n\t}\n\tset loopStart(loopStart) {\n\t\tthis._loopStart = this.toTicks(loopStart);\n\t\tif (this._loop) {\n\t\t\tthis._forEach(event => {\n\t\t\t\tevent.loopStart = this.loopStart;\n\t\t\t\tthis._testLoopBoundries(event);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * The playback rate of the part\n\t */\n\tget playbackRate(): Positive {\n\t\treturn this._playbackRate;\n\t}\n\tset playbackRate(rate) {\n\t\tthis._playbackRate = rate;\n\t\tthis._setAll(\"playbackRate\", rate);\n\t}\n\n\t/**\n\t * The number of scheduled notes in the part.\n\t */\n\tget length(): number {\n\t\treturn this._events.size;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.clear();\n\t\treturn this;\n\t}\n}\n","import { assert } from \"../core/util/Debug\";\nimport { clamp } from \"../core/util/Math\";\n\n/**\n * The name of the patterns\n */\nexport type PatternName = \"up\" | \"down\" | \"upDown\" | \"downUp\" | \"alternateUp\" | \"alternateDown\" | \"random\" | \"randomOnce\" | \"randomWalk\";\n\n/**\n * Start at the first value and go up to the last\n */\nfunction* upPatternGen<T>(values: T[]): IterableIterator<T> {\n\tlet index = 0;\n\twhile (index < values.length) {\n\t\tindex = clampToArraySize(index, values);\n\t\tyield values[index];\n\t\tindex++;\n\t}\n}\n\n/**\n * Start at the last value and go down to 0\n */\nfunction* downPatternGen<T>(values: T[]): IterableIterator<T> {\n\tlet index = values.length - 1;\n\twhile (index >= 0) {\n\t\tindex = clampToArraySize(index, values);\n\t\tyield values[index];\n\t\tindex--;\n\t}\n}\n\n/**\n * Infinitely yield the generator\n */\nfunction* infiniteGen<T>(values: T[], gen: typeof upPatternGen): IterableIterator<T> {\n\twhile (true) {\n\t\tyield* gen(values);\n\t}\n}\n\n/**\n * Make sure that the index is in the given range\n */\nfunction clampToArraySize(index: number, values: any[]): number {\n\treturn clamp(index, 0, values.length - 1);\n}\n\n/**\n * Alternate between two generators\n */\nfunction* alternatingGenerator<T>(values: T[], directionUp: boolean): IterableIterator<T> {\n\tlet index = directionUp ? 0 : values.length - 1;\n\twhile (true) {\n\t\tindex = clampToArraySize(index, values);\n\t\tyield values[index];\n\t\tif (directionUp) {\n\t\t\tindex++;\n\t\t\tif (index >= values.length - 1) {\n\t\t\t\tdirectionUp = false;\n\t\t\t}\n\t\t} else {\n\t\t\tindex--;\n\t\t\tif (index <= 0) {\n\t\t\t\tdirectionUp = true;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Starting from the bottom move up 2, down 1\n */\nfunction* jumpUp<T>(values: T[]): IterableIterator<T> {\n\tlet index = 0;\n\tlet stepIndex = 0;\n\twhile (index < values.length) {\n\t\tindex = clampToArraySize(index, values);\n\t\tyield values[index];\n\t\tstepIndex++;\n\t\tindex += (stepIndex % 2 ? 2 : -1);\n\t}\n}\n\n/**\n * Starting from the top move down 2, up 1\n */\nfunction* jumpDown<T>(values: T[]): IterableIterator<T> {\n\tlet index = values.length - 1;\n\tlet stepIndex = 0;\n\twhile (index >= 0) {\n\t\tindex = clampToArraySize(index, values);\n\t\tyield values[index];\n\t\tstepIndex++;\n\t\tindex += (stepIndex % 2 ? -2 : 1);\n\t}\n}\n\n/**\n * Choose a random index each time\n */\nfunction* randomGen<T>(values: T[]): IterableIterator<T> {\n\twhile (true) {\n\t\tconst randomIndex = Math.floor(Math.random() * values.length);\n\t\tyield values[randomIndex];\n\t}\n}\n\n/**\n * Randomly go through all of the values once before choosing a new random order\n */\nfunction* randomOnce<T>(values: T[]): IterableIterator<T> {\n\t// create an array of indices\n\tconst copy: number[] = [];\n\tfor (let i = 0; i < values.length; i++) {\n\t\tcopy.push(i);\n\t}\n\twhile (copy.length > 0) {\n\t\t// random choose an index, and then remove it so it's not chosen again\n\t\tconst randVal = copy.splice(Math.floor(copy.length * Math.random()), 1);\n\t\tconst index = clampToArraySize(randVal[0], values);\n\t\tyield values[index];\n\t}\n}\n\n/**\n * Randomly choose to walk up or down 1 index in the values array\n */\nfunction* randomWalk<T>(values: T[]): IterableIterator<T> {\n\t// randomly choose a starting index in the values array\n\tlet index = Math.floor(Math.random() * values.length);\n\twhile (true) {\n\t\tif (index === 0) {\n\t\t\tindex++; // at bottom of array, so force upward step\n\t\t} else if (index === values.length - 1) {\n\t\t\tindex--; // at top of array, so force downward step\n\t\t} else if (Math.random() < 0.5) { // else choose random downward or upward step\n\t\t\tindex--;\n\t\t} else {\n\t\t\tindex++;\n\t\t}\n\t\tyield values[index];\n\t}\n}\n\n/**\n * PatternGenerator returns a generator which will iterate over the given array\n * of values and yield the items according to the passed in pattern\n * @param values An array of values to iterate over\n * @param pattern The name of the pattern use when iterating over\n * @param index Where to start in the offset of the values array\n */\nexport function* PatternGenerator<T>(values: T[], pattern: PatternName = \"up\", index = 0): Iterator<T> {\n\t// safeguards\n\tassert(values.length > 0, \"The array must have more than one value in it\");\n\tswitch (pattern) {\n\t\tcase \"up\" :\n\t\t\tyield* infiniteGen(values, upPatternGen);\n\t\tcase \"down\" :\n\t\t\tyield* infiniteGen(values, downPatternGen);\n\t\tcase \"upDown\" :\n\t\t\tyield* alternatingGenerator(values, true);\n\t\tcase \"downUp\" :\n\t\t\tyield* alternatingGenerator(values, false);\n\t\tcase \"alternateUp\":\n\t\t\tyield* infiniteGen(values, jumpUp);\n\t\tcase \"alternateDown\":\n\t\t\tyield* infiniteGen(values, jumpDown);\n\t\tcase \"random\":\n\t\t\tyield* randomGen(values);\n\t\tcase \"randomOnce\":\n\t\t\tyield* infiniteGen(values, randomOnce);\n\t\tcase \"randomWalk\":\n\t\t\tyield* randomWalk(values);\n\t}\n}\n","import { Loop, LoopOptions } from \"./Loop\";\nimport { PatternGenerator, PatternName } from \"./PatternGenerator\";\nimport { ToneEventCallback } from \"./ToneEvent\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { Seconds } from \"../core/type/Units\";\nimport { noOp } from \"../core/util/Interface\";\n\nexport interface PatternOptions<ValueType> extends LoopOptions {\n\tpattern: PatternName;\n\tvalues: ValueType[];\n\tcallback: (time: Seconds, value?: ValueType) => void;\n}\n\n/**\n * Pattern arpeggiates between the given notes\n * in a number of patterns. \n * @example\n * const pattern = new Tone.Pattern((time, note) => {\n * \t// the order of the notes passed in depends on the pattern\n * }, [\"C2\", \"D4\", \"E5\", \"A6\"], \"upDown\");\n * @category Event\n */\nexport class Pattern<ValueType> extends Loop<PatternOptions<ValueType>> {\n\n\treadonly name: string = \"Pattern\";\n\n\t/**\n\t * The pattern generator function\n\t */\n\tprivate _pattern: Iterator<ValueType>;\n\n\t/**\n\t * The current value\n\t */\n\tprivate _value?: ValueType;\n\n\t/**\n\t * Hold the pattern type\n\t */\n\tprivate _type: PatternName;\n\n\t/**\n\t * Hold the values\n\t */\n\tprivate _values: ValueType[];\n\n\t/**\n\t * The callback to be invoked at a regular interval\n\t */\n\tcallback: (time: Seconds, value?: ValueType) => void;\n\n\t/**\n\t * @param callback The callback to invoke with the event.\n\t * @param values The values to arpeggiate over.\n\t * @param pattern The name of the pattern\n\t */\n\tconstructor(\n\t\tcallback?: ToneEventCallback<ValueType>,\n\t\tvalues?: ValueType[],\n\t\tpattern?: PatternName,\n\t);\n\tconstructor(options?: Partial<PatternOptions<ValueType>>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Pattern.getDefaults(), arguments, [\"callback\", \"values\", \"pattern\"]));\n\t\tconst options = optionsFromArguments(Pattern.getDefaults(), arguments, [\"callback\", \"values\", \"pattern\"]);\n\n\t\tthis.callback = options.callback;\n\t\tthis._values = options.values;\n\t\tthis._pattern = PatternGenerator(options.values, options.pattern);\n\t\tthis._type = options.pattern;\n\t}\n\n\tstatic getDefaults(): PatternOptions<any> {\n\t\treturn Object.assign(Loop.getDefaults(), {\n\t\t\tpattern: \"up\" as \"up\",\n\t\t\tvalues: [],\n\t\t\tcallback: noOp,\n\t\t});\n\t}\n\n\t/**\n\t * Internal function called when the notes should be called\n\t */\n\tprotected _tick(time: Seconds): void {\n\t\tconst value = this._pattern.next() as IteratorResult<ValueType>;\n\t\tthis._value = value.value;\n\t\tthis.callback(time, this._value);\n\t}\n\n\t/**\n\t * The array of events.\n\t */\n\tget values(): ValueType[] {\n\t\treturn this._values;\n\t}\n\tset values(val) {\n\t\tthis._values = val;\n\t\t// reset the pattern\n\t\tthis.pattern = this._type;\n\t}\n\n\t/**\n\t * The current value of the pattern.\n\t */\n\tget value(): ValueType | undefined {\n\t\treturn this._value;\n\t}\n\n\t/**\n\t * The pattern type. See Tone.CtrlPattern for the full list of patterns.\n\t */\n\tget pattern(): PatternName {\n\t\treturn this._type;\n\t}\n\tset pattern(pattern) {\n\t\tthis._type = pattern;\n\t\tthis._pattern = PatternGenerator(this._values, this._type);\n\t}\n}\n\n","import { TicksClass } from \"../core/type/Ticks\";\nimport { NormalRange, Positive, Seconds, Ticks, Time, TransportTime } from \"../core/type/Units\";\nimport { omitFromObject, optionsFromArguments } from \"../core/util/Defaults\";\nimport { isArray, isString } from \"../core/util/TypeCheck\";\nimport { Part } from \"./Part\";\nimport { ToneEvent, ToneEventCallback, ToneEventOptions } from \"./ToneEvent\";\n\ntype SequenceEventDescription<T> = Array<T | Array<T | Array<T | Array<T | Array<T | T[]>>>>>;\n\ninterface SequenceOptions<T> extends Omit<ToneEventOptions<T>, \"value\"> {\n\tloopStart: number;\n\tloopEnd: number;\n\tsubdivision: Time;\n\tevents: SequenceEventDescription<T>;\n}\n\n/**\n * A sequence is an alternate notation of a part. Instead\n * of passing in an array of [time, event] pairs, pass\n * in an array of events which will be spaced at the\n * given subdivision. Sub-arrays will subdivide that beat\n * by the number of items are in the array.\n * Sequence notation inspiration from [Tidal](http://yaxu.org/tidal/)\n * @example\n * const synth = new Tone.Synth().toDestination();\n * const seq = new Tone.Sequence((time, note) => {\n * \tsynth.triggerAttackRelease(note, 0.1, time);\n * \t// subdivisions are given as subarrays\n * }, [\"C4\", [\"E4\", \"D4\", \"E4\"], \"G4\", [\"A4\", \"G4\"]]).start(0);\n * Tone.Transport.start();\n * @category Event\n */\nexport class Sequence<ValueType = any> extends ToneEvent<ValueType> {\n\n\treadonly name: string = \"Sequence\";\n\n\t/**\n\t * The subdivison of each note\n\t */\n\tprivate _subdivision: Ticks;\n\n\t/**\n\t * The object responsible for scheduling all of the events\n\t */\n\tprivate _part: Part = new Part({\n\t\tcallback: this._seqCallback.bind(this),\n\t\tcontext: this.context,\n\t});\n\n\t/**\n\t * private reference to all of the sequence proxies\n\t */\n\tprivate _events: SequenceEventDescription<ValueType> = [];\n\n\t/**\n\t * The proxied array\n\t */\n\tprivate _eventsArray: SequenceEventDescription<ValueType> = [];\n\n\t/**\n\t * @param callback The callback to invoke with every note\n\t * @param sequence The sequence\n\t * @param subdivision The subdivision between which events are placed.\n\t */\n\tconstructor(\n\t\tcallback?: ToneEventCallback<ValueType>,\n\t\tevents?: SequenceEventDescription<ValueType>,\n\t\tsubdivision?: Time,\n\t);\n\tconstructor(options?: Partial<SequenceOptions<ValueType>>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Sequence.getDefaults(), arguments, [\"callback\", \"events\", \"subdivision\"]));\n\t\tconst options = optionsFromArguments(Sequence.getDefaults(), arguments, [\"callback\", \"events\", \"subdivision\"]);\n\n\t\tthis._subdivision = this.toTicks(options.subdivision);\n\n\t\tthis.events = options.events;\n\n\t\t// set all of the values\n\t\tthis.loop = options.loop;\n\t\tthis.loopStart = options.loopStart;\n\t\tthis.loopEnd = options.loopEnd;\n\t\tthis.playbackRate = options.playbackRate;\n\t\tthis.probability = options.probability;\n\t\tthis.humanize = options.humanize;\n\t\tthis.mute = options.mute;\n\t\tthis.playbackRate = options.playbackRate;\n\t}\n\n\tstatic getDefaults(): SequenceOptions<any> {\n\t\treturn Object.assign(omitFromObject(ToneEvent.getDefaults(), [\"value\"]), {\n\t\t\tevents: [],\n\t\t\tloop: true,\n\t\t\tloopEnd: 0,\n\t\t\tloopStart: 0,\n\t\t\tsubdivision: \"8n\",\n\t\t});\n\t}\n\n\t/**\n\t * The internal callback for when an event is invoked\n\t */\n\tprivate _seqCallback(time: Seconds, value: any): void {\n\t\tif (value !== null && !this.mute) {\n\t\t\tthis.callback(time, value);\n\t\t}\n\t}\n\n\t/**\n\t * The sequence\n\t */\n\tget events(): any[] {\n\t\treturn this._events;\n\t}\n\tset events(s) {\n\t\tthis.clear();\n\t\tthis._eventsArray = s;\n\t\tthis._events = this._createSequence(this._eventsArray);\n\t\tthis._eventsUpdated();\n\t}\n\n\t/**\n\t * Start the part at the given time.\n\t * @param time When to start the part.\n\t * @param offset The offset index to start at\n\t */\n\tstart(time?: TransportTime, offset?: number): this {\n\t\tthis._part.start(time, offset ? this._indexTime(offset) : offset);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Stop the part at the given time.\n\t * @param time When to stop the part.\n\t */\n\tstop(time?: TransportTime): this {\n\t\tthis._part.stop(time);\n\t\treturn this;\n\t}\n\n\t/**\n\t * The subdivision of the sequence. This can only be\n\t * set in the constructor. The subdivision is the\n\t * interval between successive steps.\n\t */\n\tget subdivision(): Seconds {\n\t\treturn new TicksClass(this.context, this._subdivision).toSeconds();\n\t}\n\n\t/**\n\t * Create a sequence proxy which can be monitored to create subsequences\n\t */\n\tprivate _createSequence(array: any[]): any[] {\n\t\treturn new Proxy(array, {\n\t\t\tget: (target: any[], property: PropertyKey): any => {\n\t\t\t\t// property is index in this case\n\t\t\t\treturn target[property];\n\t\t\t},\n\t\t\tset: (target: any[], property: PropertyKey, value: any): boolean => {\n\t\t\t\tif (isString(property) && isFinite(parseInt(property, 10))) {\n\t\t\t\t\tif (isArray(value)) {\n\t\t\t\t\t\ttarget[property] = this._createSequence(value);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget[property] = value;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttarget[property] = value;\n\t\t\t\t}\n\t\t\t\tthis._eventsUpdated();\n\t\t\t\t// return true to accept the changes\n\t\t\t\treturn true;\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * When the sequence has changed, all of the events need to be recreated\n\t */\n\tprivate _eventsUpdated(): void {\n\t\tthis._part.clear();\n\t\tthis._rescheduleSequence(this._eventsArray, this._subdivision, this.startOffset);\n\t\t// update the loopEnd\n\t\tthis.loopEnd = this.loopEnd;\n\t}\n\n\t/**\n\t * reschedule all of the events that need to be rescheduled\n\t */\n\tprivate _rescheduleSequence(sequence: any[], subdivision: Ticks, startOffset: Ticks): void {\n\t\tsequence.forEach((value, index) => {\n\t\t\tconst eventOffset = index * (subdivision) + startOffset;\n\t\t\tif (isArray(value)) {\n\t\t\t\tthis._rescheduleSequence(value, subdivision / value.length, eventOffset);\n\t\t\t} else {\n\t\t\t\tconst startTime = new TicksClass(this.context, eventOffset, \"i\").toSeconds();\n\t\t\t\tthis._part.add(startTime, value);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Get the time of the index given the Sequence's subdivision\n\t * @param index\n\t * @return The time of that index\n\t */\n\tprivate _indexTime(index: number): Seconds {\n\t\treturn new TicksClass(this.context, index * (this._subdivision) + this.startOffset).toSeconds();\n\t}\n\n\t/**\n\t * Clear all of the events\n\t */\n\tclear(): this {\n\t\tthis._part.clear();\n\t\treturn this;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._part.dispose();\n\t\treturn this;\n\t}\n\n\t//-------------------------------------\n\t// PROXY CALLS\n\t//-------------------------------------\n\n\tget loop(): boolean | number {\n\t\treturn this._part.loop;\n\t}\n\tset loop(l) {\n\t\tthis._part.loop = l;\n\t}\n\n\t/**\n\t * The index at which the sequence should start looping\n\t */\n\tget loopStart(): number {\n\t\treturn this._loopStart;\n\t}\n\tset loopStart(index) {\n\t\tthis._loopStart = index;\n\t\tthis._part.loopStart = this._indexTime(index);\n\t}\n\n\t/**\n\t * The index at which the sequence should end looping\n\t */\n\tget loopEnd(): number {\n\t\treturn this._loopEnd;\n\t}\n\tset loopEnd(index) {\n\t\tthis._loopEnd = index;\n\t\tif (index === 0) {\n\t\t\tthis._part.loopEnd = this._indexTime(this._eventsArray.length);\n\t\t} else {\n\t\t\tthis._part.loopEnd = this._indexTime(index);\n\t\t}\n\t}\n\n\tget startOffset(): Ticks {\n\t\treturn this._part.startOffset;\n\t}\n\tset startOffset(start) {\n\t\tthis._part.startOffset = start;\n\t}\n\n\tget playbackRate(): Positive {\n\t\treturn this._part.playbackRate;\n\t}\n\tset playbackRate(rate) {\n\t\tthis._part.playbackRate = rate;\n\t}\n\n\tget probability(): NormalRange {\n\t\treturn this._part.probability;\n\t}\n\tset probability(prob) {\n\t\tthis._part.probability = prob;\n\t}\n\n\tget progress(): NormalRange {\n\t\treturn this._part.progress;\n\t}\n\n\tget humanize(): boolean | Time {\n\t\treturn this._part.humanize;\n\t}\n\tset humanize(variation) {\n\t\tthis._part.humanize = variation;\n\t}\n\n\t/**\n\t * The number of scheduled events\n\t */\n\tget length(): number {\n\t\treturn this._part.length;\n\t}\n}\n","import { Gain } from \"../../core/context/Gain\";\nimport { connect, ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { NormalRange } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { readOnly } from \"../../core/util/Interface\";\nimport { GainToAudio } from \"../../signal/GainToAudio\";\nimport { Signal } from \"../../signal/Signal\";\n\ninterface CrossFadeOptions extends ToneAudioNodeOptions {\n\tfade: NormalRange;\n}\n\n/**\n * Tone.Crossfade provides equal power fading between two inputs.\n * More on crossfading technique [here](https://en.wikipedia.org/wiki/Fade_(audio_engineering)#Crossfading).\n * ```\n * +---------+\n * +> input a +>--+\n * +-----------+ +---------------------+ | | |\n * | 1s signal +>--> stereoPannerNode L +>----> gain | |\n * +-----------+ | | +---------+ |\n * +-> pan R +>-+ | +--------+\n * | +---------------------+ | +---> output +>\n * +------+ | | +---------+ | +--------+\n * | fade +>----+ | +> input b +>--+\n * +------+ | | |\n * +--> gain |\n * +---------+\n * ```\n * @example\n * const crossFade = new Tone.CrossFade().toDestination();\n * // connect two inputs Tone.to a/b\n * const inputA = new Tone.Oscillator(440, \"square\").connect(crossFade.a).start();\n * const inputB = new Tone.Oscillator(440, \"sine\").connect(crossFade.b).start();\n * // use the fade to control the mix between the two\n * crossFade.fade.value = 0.5;\n * @category Component\n */\nexport class CrossFade extends ToneAudioNode<CrossFadeOptions> {\n\n\treadonly name: string = \"CrossFade\";\n\n\t/**\n\t * The crossfading is done by a StereoPannerNode\n\t */\n\tprivate _panner: StereoPannerNode = this.context.createStereoPanner();\n\n\t/**\n\t * Split the output of the panner node into two values used to control the gains.\n\t */\n\tprivate _split: ChannelSplitterNode = this.context.createChannelSplitter(2);\n\n\t/**\n\t * Convert the fade value into an audio range value so it can be connected\n\t * to the panner.pan AudioParam\n\t */\n\tprivate _g2a: GainToAudio = new GainToAudio({ context: this.context });\n\n\t/**\n\t * The input which is at full level when fade = 0\n\t */\n\treadonly a: Gain = new Gain({\n\t\tcontext: this.context,\n\t\tgain: 0,\n\t});\n\n\t/**\n\t * The input which is at full level when fade = 1\n\t */\n\treadonly b: Gain = new Gain({\n\t\tcontext: this.context,\n\t\tgain: 0,\n\t});\n\n\t/**\n\t * The output is a mix between `a` and `b` at the ratio of `fade`\n\t */\n\treadonly output: Gain = new Gain({ context: this.context });\n\n\t/**\n\t * CrossFade has no input, you must choose either `a` or `b`\n\t */\n\treadonly input: undefined;\n\n\t/**\n\t * The mix between the two inputs. A fade value of 0\n\t * will output 100% crossFade.a and\n\t * a value of 1 will output 100% crossFade.b.\n\t */\n\treadonly fade: Signal<\"normalRange\">;\n\n\tprotected _internalChannels = [this.a, this.b];\n\n\t/**\n\t * @param fade The initial fade value [0, 1].\n\t */\n\tconstructor(fade?: NormalRange);\n\tconstructor(options?: Partial<CrossFadeOptions>);\n\tconstructor() {\n\t\tsuper(Object.assign(optionsFromArguments(CrossFade.getDefaults(), arguments, [\"fade\"])));\n\t\tconst options = optionsFromArguments(CrossFade.getDefaults(), arguments, [\"fade\"]);\n\n\t\tthis.fade = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"normalRange\",\n\t\t\tvalue: options.fade,\n\t\t});\n\t\treadOnly(this, \"fade\");\n\n\t\tthis.context.getConstant(1).connect(this._panner);\n\t\tthis._panner.connect(this._split);\n\t\t// this is necessary for standardized-audio-context\n\t\t// doesn't make any difference for the native AudioContext\n\t\t// https://github.com/chrisguttandin/standardized-audio-context/issues/647\n\t\tthis._panner.channelCount = 1;\n\t\tthis._panner.channelCountMode = \"explicit\";\n\t\tconnect(this._split, this.a.gain, 0);\n\t\tconnect(this._split, this.b.gain, 1);\n\n\t\tthis.fade.chain(this._g2a, this._panner.pan);\n\n\t\tthis.a.connect(this.output);\n\t\tthis.b.connect(this.output);\n\t}\n\n\tstatic getDefaults(): CrossFadeOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tfade: 0.5,\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.a.dispose();\n\t\tthis.b.dispose();\n\t\tthis.output.dispose();\n\t\tthis.fade.dispose();\n\t\tthis._g2a.dispose();\n\t\tthis._panner.disconnect();\n\t\tthis._split.disconnect();\n\t\treturn this;\n\t}\n}\n","import { CrossFade } from \"../component/channel/CrossFade\";\nimport { Gain } from \"../core/context/Gain\";\nimport { ToneAudioNode, ToneAudioNodeOptions } from \"../core/context/ToneAudioNode\";\nimport { NormalRange } from \"../core/type/Units\";\nimport { readOnly } from \"../core/util/Interface\";\nimport { Signal } from \"../signal/Signal\";\n\nexport interface EffectOptions extends ToneAudioNodeOptions {\n\twet: NormalRange;\n}\n/**\n * Effect is the base class for effects. Connect the effect between\n * the effectSend and effectReturn GainNodes, then control the amount of\n * effect which goes to the output using the wet control.\n */\nexport abstract class Effect<Options extends EffectOptions>\n\textends ToneAudioNode<Options> {\n\n\treadonly name: string = \"Effect\";\n\n\t/**\n\t * the drywet knob to control the amount of effect\n\t */\n\tprivate _dryWet: CrossFade = new CrossFade({ context: this.context });\n\n\t/**\n\t * The wet control is how much of the effected\n\t * will pass through to the output. 1 = 100% effected\n\t * signal, 0 = 100% dry signal.\n\t */\n\twet: Signal<\"normalRange\"> = this._dryWet.fade;\n\n\t/**\n\t * connect the effectSend to the input of hte effect\n\t */\n\tprotected effectSend: Gain = new Gain({ context: this.context });\n\n\t/**\n\t * connect the output of the effect to the effectReturn\n\t */\n\tprotected effectReturn: Gain = new Gain({ context: this.context });\n\n\t/**\n\t * The effect input node\n\t */\n\tinput: Gain = new Gain({ context: this.context });\n\n\t/**\n\t * The effect output\n\t */\n\toutput = this._dryWet;\n\n\tconstructor(options: EffectOptions) {\n\t\tsuper(options);\n\n\t\t// connections\n\t\tthis.input.fan(this._dryWet.a, this.effectSend);\n\t\tthis.effectReturn.connect(this._dryWet.b);\n\t\tthis.wet.setValueAtTime(options.wet, 0);\n\t\tthis._internalChannels = [this.effectReturn, this.effectSend];\n\t\treadOnly(this, \"wet\");\n\t}\n\n\tstatic getDefaults(): EffectOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\twet: 1,\n\t\t});\n\t}\n\n\t/**\n\t * chains the effect in between the effectSend and effectReturn\n\t */\n\tprotected connectEffect(effect: ToneAudioNode | AudioNode): this {\n\t\t// add it to the internal channels\n\t\tthis._internalChannels.push(effect);\n\t\tthis.effectSend.chain(effect, this.effectReturn);\n\t\treturn this;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._dryWet.dispose();\n\t\tthis.effectSend.dispose();\n\t\tthis.effectReturn.dispose();\n\t\tthis.wet.dispose();\n\t\treturn this;\n\t}\n}\n","import { Effect, EffectOptions } from \"../effect/Effect\";\nimport { Frequency, NormalRange, Time } from \"../core/type/Units\";\nimport { LFO } from \"../source/oscillator/LFO\";\nimport { ToneOscillatorType } from \"../source/oscillator/OscillatorInterface\";\nimport { Signal } from \"../signal/Signal\";\nimport { readOnly } from \"../core/util/Interface\";\nimport { Param } from \"../core/context/Param\";\n\nexport interface LFOEffectOptions extends EffectOptions {\n\tfrequency: Frequency;\n\ttype: ToneOscillatorType;\n\tdepth: NormalRange;\n}\n\n/**\n * Base class for LFO-based effects.\n */\nexport abstract class LFOEffect<Options extends LFOEffectOptions> extends Effect<Options> {\n\n\treadonly name: string = \"LFOEffect\";\n\n\t/**\n\t * the lfo which drives the filter cutoff\n\t */\n\tprotected _lfo: LFO;\n\n\t/**\n\t * The range of the filter modulating between the min and max frequency. \n\t * 0 = no modulation. 1 = full modulation.\n\t */\n\treadonly depth: Param<\"normalRange\">;\n\n\t/**\n\t * How fast the filter modulates between min and max. \n\t */\n\treadonly frequency: Signal<\"frequency\">;\n\n\tconstructor(options: LFOEffectOptions) {\n\n\t\tsuper(options);\n\n\t\tthis._lfo = new LFO({\n\t\t\tcontext: this.context,\n\t\t\tfrequency: options.frequency,\n\t\t\tamplitude: options.depth,\n\t\t});\n\t\tthis.depth = this._lfo.amplitude;\n\t\tthis.frequency = this._lfo.frequency;\n\n\t\tthis.type = options.type;\n\t\treadOnly(this, [\"frequency\", \"depth\"]);\n\t}\n\n\tstatic getDefaults(): LFOEffectOptions {\n\t\treturn Object.assign(Effect.getDefaults(), {\n\t\t\tfrequency: 1,\n\t\t\ttype: \"sine\" as ToneOscillatorType,\n\t\t\tdepth: 1,\n\t\t});\n\t}\n\n\t/**\n\t * Start the effect.\n\t */\n\tstart(time?: Time): this {\n\t\tthis._lfo.start(time);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Stop the lfo\n\t */\n\tstop(time?: Time): this {\n\t\tthis._lfo.stop(time);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sync the filter to the transport. See [[LFO.sync]]\n\t */\n\tsync(): this {\n\t\tthis._lfo.sync();\n\t\treturn this;\n\t}\n\n\t/**\n\t * Unsync the filter from the transport.\n\t */\n\tunsync(): this {\n\t\tthis._lfo.unsync();\n\t\treturn this;\n\t}\n\n\t/**\n\t * The type of the LFO's oscillator: See [[Oscillator.type]]\n\t * @example\n\t * const autoFilter = new Tone.AutoFilter().start().toDestination();\n\t * const noise = new Tone.Noise().start().connect(autoFilter);\n\t * autoFilter.type = \"square\";\n\t */\n\tget type() {\n\t\treturn this._lfo.type;\n\t}\n\tset type(type) {\n\t\tthis._lfo.type = type;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._lfo.dispose();\n\t\tthis.frequency.dispose();\n\t\tthis.depth.dispose();\n\t\treturn this;\n\t}\n}\n","import { Frequency, Positive } from \"../core/type/Units\";\nimport { Filter, FilterOptions } from \"../component/filter/Filter\";\nimport { SourceOptions } from \"../source/Source\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { LFOEffect, LFOEffectOptions } from \"./LFOEffect\";\n\nexport interface AutoFilterOptions extends LFOEffectOptions {\n\tbaseFrequency: Frequency;\n\toctaves: Positive;\n\tfilter: Omit<FilterOptions, keyof SourceOptions | \"frequency\" | \"detune\" | \"gain\">;\n}\n\n/**\n * AutoFilter is a Tone.Filter with a Tone.LFO connected to the filter cutoff frequency.\n * Setting the LFO rate and depth allows for control over the filter modulation rate \n * and depth.\n *\n * @example\n * // create an autofilter and start it's LFO\n * const autoFilter = new Tone.AutoFilter(\"4n\").toDestination().start();\n * // route an oscillator through the filter and start it\n * const oscillator = new Tone.Oscillator().connect(autoFilter).start();\n * @category Effect\n */\nexport class AutoFilter extends LFOEffect<AutoFilterOptions> {\n\n\treadonly name: string = \"AutoFilter\";\n\n\t/**\n\t * The filter node\n\t */\n\treadonly filter: Filter;\n\n\t/**\n\t * The octaves placeholder\n\t */\n\tprivate _octaves!: Positive;\n\n\t/**\n\t * @param frequency The rate of the LFO.\n\t * @param baseFrequency The lower value of the LFOs oscillation\n\t * @param octaves The number of octaves above the baseFrequency\n\t */\n\tconstructor(frequency?: Frequency, baseFrequency?: Frequency, octaves?: Positive);\n\tconstructor(options?: Partial<AutoFilterOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(AutoFilter.getDefaults(), arguments, [\"frequency\", \"baseFrequency\", \"octaves\"]));\n\t\tconst options = optionsFromArguments(AutoFilter.getDefaults(), arguments, [\"frequency\", \"baseFrequency\", \"octaves\"]);\n\n\t\tthis.filter = new Filter(Object.assign(options.filter, {\n\t\t\tcontext: this.context,\n\t\t}));\n\n\t\t// connections\n\t\tthis.connectEffect(this.filter);\n\t\tthis._lfo.connect(this.filter.frequency);\n\t\tthis.octaves = options.octaves;\n\t\tthis.baseFrequency = options.baseFrequency;\n\t}\n\n\tstatic getDefaults(): AutoFilterOptions {\n\t\treturn Object.assign(LFOEffect.getDefaults(), {\n\t\t\tbaseFrequency: 200,\n\t\t\toctaves: 2.6,\n\t\t\tfilter: {\n\t\t\t\ttype: \"lowpass\" as \"lowpass\",\n\t\t\t\trolloff: -12 as -12,\n\t\t\t\tQ: 1,\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * The minimum value of the filter's cutoff frequency.\n\t */\n\tget baseFrequency(): Frequency {\n\t\treturn this._lfo.min;\n\t}\n\tset baseFrequency(freq) {\n\t\tthis._lfo.min = this.toFrequency(freq);\n\t\t// and set the max\n\t\tthis.octaves = this._octaves;\n\t}\n\n\t/**\n\t * The maximum value of the filter's cutoff frequency. \n\t */\n\tget octaves(): Positive {\n\t\treturn this._octaves;\n\t}\n\tset octaves(oct) {\n\t\tthis._octaves = oct;\n\t\tthis._lfo.max = this._lfo.min * Math.pow(2, oct);\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.filter.dispose();\n\t\treturn this;\n\t}\n}\n","import { Param } from \"../../core/context/Param\";\nimport { ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { AudioRange } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { readOnly } from \"../../core/util/Interface\";\n\ninterface TonePannerOptions extends ToneAudioNodeOptions {\n\tpan: AudioRange;\n\tchannelCount: number;\n}\n\n/**\n * Panner is an equal power Left/Right Panner. It is a wrapper around the StereoPannerNode.\n * @example\n * return Tone.Offline(() => {\n * // move the input signal from right to left\n * \tconst panner = new Tone.Panner(1).toDestination();\n * \tpanner.pan.rampTo(-1, 0.5);\n * \tconst osc = new Tone.Oscillator(100).connect(panner).start();\n * }, 0.5, 2);\n * @category Component\n */\nexport class Panner extends ToneAudioNode<TonePannerOptions> {\n\n\treadonly name: string = \"Panner\";\n\n\t/**\n\t * the panner node\n\t */\n\tprivate _panner: StereoPannerNode = this.context.createStereoPanner();\n\treadonly input: StereoPannerNode = this._panner;\n\treadonly output: StereoPannerNode = this._panner;\n\n\t/**\n\t * The pan control. -1 = hard left, 1 = hard right.\n\t * @min -1\n\t * @max 1\n\t * @example\n\t * return Tone.Offline(() => {\n\t * \t// pan hard right\n\t * \tconst panner = new Tone.Panner(1).toDestination();\n\t * \t// pan hard left\n\t * \tpanner.pan.setValueAtTime(-1, 0.25);\n\t * \tconst osc = new Tone.Oscillator(50, \"triangle\").connect(panner).start();\n\t * }, 0.5, 2);\n\t */\n\treadonly pan: Param<\"audioRange\">;\n\n\tconstructor(options?: Partial<TonePannerOptions>);\n\t/**\n\t * @param pan The initial panner value (Defaults to 0 = \"center\").\n\t */\n\tconstructor(pan?: AudioRange);\n\tconstructor() {\n\t\tsuper(Object.assign(optionsFromArguments(Panner.getDefaults(), arguments, [\"pan\"])));\n\t\tconst options = optionsFromArguments(Panner.getDefaults(), arguments, [\"pan\"]);\n\n\t\tthis.pan = new Param({\n\t\t\tcontext: this.context,\n\t\t\tparam: this._panner.pan,\n\t\t\tvalue: options.pan,\n\t\t\tminValue: -1,\n\t\t\tmaxValue: 1,\n\t\t});\n\n\t\t// this is necessary for standardized-audio-context\n\t\t// doesn't make any difference for the native AudioContext\n\t\t// https://github.com/chrisguttandin/standardized-audio-context/issues/647\n\t\tthis._panner.channelCount = options.channelCount;\n\t\tthis._panner.channelCountMode = \"explicit\";\n\n\t\t// initial value\n\t\treadOnly(this, \"pan\");\n\t}\n\n\tstatic getDefaults(): TonePannerOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tpan: 0,\n\t\t\tchannelCount: 1,\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._panner.disconnect();\n\t\tthis.pan.dispose();\n\t\treturn this;\n\t}\n}\n","import { Panner } from \"../component/channel/Panner\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { LFOEffect, LFOEffectOptions } from \"./LFOEffect\";\nimport { Frequency } from \"../core/type/Units\";\n\nexport interface AutoPannerOptions extends LFOEffectOptions {\n\tchannelCount: number;\n}\n\n/**\n * AutoPanner is a [[Panner]] with an [[LFO]] connected to the pan amount. \n * [Related Reading](https://www.ableton.com/en/blog/autopan-chopper-effect-and-more-liveschool/).\n *\n * @example\n * // create an autopanner and start it\n * const autoPanner = new Tone.AutoPanner(\"4n\").toDestination().start();\n * // route an oscillator through the panner and start it\n * const oscillator = new Tone.Oscillator().connect(autoPanner).start();\n * @category Effect\n */\nexport class AutoPanner extends LFOEffect<AutoPannerOptions> {\n\n\treadonly name: string = \"AutoPanner\";\n\n\t/**\n\t * The filter node\n\t */\n\treadonly _panner: Panner;\n\n\t/**\n\t * @param frequency Rate of left-right oscillation. \n\t */\n\tconstructor(frequency?: Frequency);\n\tconstructor(options?: Partial<AutoPannerOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(AutoPanner.getDefaults(), arguments, [\"frequency\"]));\n\t\tconst options = optionsFromArguments(AutoPanner.getDefaults(), arguments, [\"frequency\"]);\n\n\t\tthis._panner = new Panner({\n\t\t\tcontext: this.context,\n\t\t\tchannelCount: options.channelCount\n\t\t});\n\t\t// connections\n\t\tthis.connectEffect(this._panner);\n\t\tthis._lfo.connect(this._panner.pan);\n\t\tthis._lfo.min = -1;\n\t\tthis._lfo.max = 1;\n\t}\n\n\tstatic getDefaults(): AutoPannerOptions {\n\t\treturn Object.assign(LFOEffect.getDefaults(), {\n\t\t\tchannelCount: 1\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._panner.dispose();\n\t\treturn this;\n\t}\n}\n\n","import { Time } from \"../../core/type/Units\";\nimport { InputNode, OutputNode, ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { OnePoleFilter } from \"../filter/OnePoleFilter\";\nimport { Abs } from \"../../signal/Abs\";\n\nexport interface FollowerOptions extends ToneAudioNodeOptions {\n\tsmoothing: Time;\n}\n\n/**\n * Follower is a simple envelope follower. \n * It's implemented by applying a lowpass filter to the absolute value of the incoming signal. \n * ```\n * +-----+ +---------------+\n * Input +--> Abs +----> OnePoleFilter +--> Output\n * +-----+ +---------------+\n * ```\n * @category Component\n */\nexport class Follower extends ToneAudioNode<FollowerOptions> {\n\n\treadonly name: string = \"Follower\";\n\n\treadonly input: InputNode;\n\treadonly output: OutputNode;\n\n\t/**\n\t * Private reference to the smoothing parameter\n\t */\n\tprivate _smoothing: Time;\n\n\t/**\n\t * The lowpass filter\n\t */\n\tprivate _lowpass: OnePoleFilter;\n\n\t/**\n\t * The absolute value\n\t */\n\tprivate _abs: Abs;\n\n\t/**\n\t * @param smoothing The rate of change of the follower.\n\t */\n\tconstructor(smoothing?: Time);\n\tconstructor(options?: Partial<FollowerOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(Follower.getDefaults(), arguments, [\"smoothing\"]));\n\t\tconst options = optionsFromArguments(Follower.getDefaults(), arguments, [\"smoothing\"]);\n\n\t\tthis._abs = this.input = new Abs({ context: this.context });\n\t\tthis._lowpass = this.output = new OnePoleFilter({\n\t\t\tcontext: this.context,\n\t\t\tfrequency: 1 / this.toSeconds(options.smoothing),\n\t\t\ttype: \"lowpass\"\n\t\t});\n\t\tthis._abs.connect(this._lowpass);\n\t\tthis._smoothing = options.smoothing;\n\t}\n\n\tstatic getDefaults(): FollowerOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tsmoothing: 0.05\n\t\t});\n\t}\n\n\t/**\n\t * The amount of time it takes a value change to arrive at the updated value. \n\t */\n\tget smoothing(): Time {\n\t\treturn this._smoothing;\n\t}\n\tset smoothing(smoothing) {\n\t\tthis._smoothing = smoothing;\n\t\tthis._lowpass.frequency = 1 / this.toSeconds(this.smoothing);\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._abs.dispose();\n\t\tthis._lowpass.dispose();\n\t\treturn this;\n\t}\n}\n","import { Effect, EffectOptions } from \"./Effect\";\nimport { Filter } from \"../component/filter/Filter\";\nimport { Follower } from \"../component/analysis/Follower\";\nimport { Decibels, Frequency, GainFactor, Hertz, Positive, Time } from \"../core/type/Units\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { Gain } from \"../core/context/Gain\";\nimport { dbToGain, gainToDb } from \"../core/type/Conversions\";\nimport { ScaleExp } from \"../signal/ScaleExp\";\nimport { Signal } from \"../signal/Signal\";\nimport { readOnly } from \"../core/util/Interface\";\n\nexport interface AutoWahOptions extends EffectOptions {\n\tbaseFrequency: Frequency;\n\toctaves: Positive;\n\tsensitivity: Decibels;\n\tQ: Positive;\n\tgain: GainFactor;\n\tfollower: Time;\n}\n\n/**\n * AutoWah connects a [[Follower]] to a [[Filter]]. \n * The frequency of the filter, follows the input amplitude curve. \n * Inspiration from [Tuna.js](https://github.com/Dinahmoe/tuna).\n * \n * @example\n * const autoWah = new Tone.AutoWah(50, 6, -30).toDestination();\n * // initialize the synth and connect to autowah\n * const synth = new Tone.Synth().connect(autoWah);\n * // Q value influences the effect of the wah - default is 2\n * autoWah.Q.value = 6;\n * // more audible on higher notes\n * synth.triggerAttackRelease(\"C4\", \"8n\");\n * @category Effect\n */\nexport class AutoWah extends Effect<AutoWahOptions> {\n\n\treadonly name: string = \"AutoWah\";\n\n\t/**\n\t * The envelope follower. Set the attack/release\n\t * timing to adjust how the envelope is followed.\n\t */\n\tprivate _follower: Follower;\n\n\t/**\n\t * scales the follower value to the frequency domain\n\t */\n\tprivate _sweepRange: ScaleExp;\n\n\t/**\n\t * Hold the base frequency value\n\t */\n\tprivate _baseFrequency: Hertz;\n\n\t/**\n\t * Private holder for the octave count\n\t */\n\tprivate _octaves: Positive;\n\n\t/**\n\t * the input gain to adjust the sensitivity\n\t */\n\tprivate _inputBoost: Gain;\n\n\t/**\n\t * Private holder for the filter\n\t */\n\tprivate _bandpass: Filter;\n\n\t/**\n\t * The peaking fitler\n\t */\n\tprivate _peaking: Filter;\n\n\t/**\n\t * The gain of the filter.\n\t */\n\treadonly gain: Signal<\"decibels\">;\n\n\t/**\n\t * The quality of the filter.\n\t */\n\treadonly Q: Signal<\"positive\">;\n\n\t/**\n\t * @param baseFrequency The frequency the filter is set to at the low point of the wah\n\t * @param octaves The number of octaves above the baseFrequency the filter will sweep to when fully open. \n\t * @param sensitivity The decibel threshold sensitivity for the incoming signal. Normal range of -40 to 0.\n\t */\n\tconstructor(baseFrequency?: Frequency, octaves?: Positive, sensitivity?: Decibels);\n\tconstructor(options?: Partial<AutoWahOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(AutoWah.getDefaults(), arguments, [\"baseFrequency\", \"octaves\", \"sensitivity\"]));\n\t\tconst options = optionsFromArguments(AutoWah.getDefaults(), arguments, [\"baseFrequency\", \"octaves\", \"sensitivity\"]);\n\n\t\tthis._follower = new Follower({\n\t\t\tcontext: this.context,\n\t\t\tsmoothing: options.follower,\n\t\t});\n\t\tthis._sweepRange = new ScaleExp({\n\t\t\tcontext: this.context,\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t\texponent: 0.5,\n\t\t});\n\t\tthis._baseFrequency = this.toFrequency(options.baseFrequency);\n\t\tthis._octaves = options.octaves;\n\t\tthis._inputBoost = new Gain({ context: this.context });\n\t\tthis._bandpass = new Filter({\n\t\t\tcontext: this.context,\n\t\t\trolloff: -48,\n\t\t\tfrequency: 0,\n\t\t\tQ: options.Q,\n\t\t});\n\t\tthis._peaking = new Filter({\n\t\t\tcontext: this.context,\n\t\t\ttype: \"peaking\"\n\t\t});\n\t\tthis._peaking.gain.value = options.gain;\n\t\tthis.gain = this._peaking.gain;\n\t\tthis.Q = this._bandpass.Q;\n\n\t\t// the control signal path\n\t\tthis.effectSend.chain(this._inputBoost, this._follower, this._sweepRange);\n\t\tthis._sweepRange.connect(this._bandpass.frequency);\n\t\tthis._sweepRange.connect(this._peaking.frequency);\n\t\t// the filtered path\n\t\tthis.effectSend.chain(this._bandpass, this._peaking, this.effectReturn);\n\t\t// set the initial value\n\t\tthis._setSweepRange();\n\t\tthis.sensitivity = options.sensitivity;\n\n\t\treadOnly(this, [\"gain\", \"Q\"]);\n\t}\n\n\tstatic getDefaults(): AutoWahOptions {\n\t\treturn Object.assign(Effect.getDefaults(), {\n\t\t\tbaseFrequency: 100,\n\t\t\toctaves: 6,\n\t\t\tsensitivity: 0,\n\t\t\tQ: 2,\n\t\t\tgain: 2,\n\t\t\tfollower: 0.2,\n\t\t});\n\t}\n\n\t/**\n\t * The number of octaves that the filter will sweep above the baseFrequency.\n\t */\n\tget octaves() {\n\t\treturn this._octaves;\n\t}\n\tset octaves(octaves) {\n\t\tthis._octaves = octaves;\n\t\tthis._setSweepRange();\n\t}\n\n\t/**\n\t * The follower's smoothing time\n\t */\n\tget follower(): Time {\n\t\treturn this._follower.smoothing;\n\t}\n\tset follower(follower) {\n\t\tthis._follower.smoothing = follower;\n\t}\n\n\t/**\n\t * The base frequency from which the sweep will start from.\n\t */\n\tget baseFrequency(): Frequency {\n\t\treturn this._baseFrequency;\n\t}\n\tset baseFrequency(baseFreq) {\n\t\tthis._baseFrequency = this.toFrequency(baseFreq);\n\t\tthis._setSweepRange();\n\t}\n\n\t/**\n\t * The sensitivity to control how responsive to the input signal the filter is.\n\t */\n\tget sensitivity(): Decibels {\n\t\treturn gainToDb(1 / this._inputBoost.gain.value);\n\t}\n\tset sensitivity(sensitivity) {\n\t\tthis._inputBoost.gain.value = 1 / dbToGain(sensitivity);\n\t}\n\n\t/**\n\t * sets the sweep range of the scaler\n\t */\n\tprivate _setSweepRange() {\n\t\tthis._sweepRange.min = this._baseFrequency;\n\t\tthis._sweepRange.max = Math.min(this._baseFrequency * Math.pow(2, this._octaves), this.context.sampleRate / 2);\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._follower.dispose();\n\t\tthis._sweepRange.dispose();\n\t\tthis._bandpass.dispose();\n\t\tthis._peaking.dispose();\n\t\tthis._inputBoost.dispose();\n\t\treturn this;\n\t}\n}\n","import \"../core/worklet/SingleIOProcessor.worklet\";\nimport { registerProcessor } from \"../core/worklet/WorkletGlobalScope\";\n\nexport const workletName = \"bit-crusher\";\n\nexport const bitCrusherWorklet = /* javascript */`\n\tclass BitCrusherWorklet extends SingleIOProcessor {\n\n\t\tstatic get parameterDescriptors() {\n\t\t\treturn [{\n\t\t\t\tname: \"bits\",\n\t\t\t\tdefaultValue: 12,\n\t\t\t\tminValue: 1,\n\t\t\t\tmaxValue: 16,\n\t\t\t\tautomationRate: 'k-rate'\n\t\t\t}];\n\t\t}\n\n\t\tgenerate(input, _channel, parameters) {\n\t\t\tconst step = Math.pow(0.5, parameters.bits - 1);\n\t\t\tconst val = step * Math.floor(input / step + 0.5);\n\t\t\treturn val;\n\t\t}\n\t}\n`;\n\nregisterProcessor(workletName, bitCrusherWorklet);\n","import { ToneAudioWorklet, ToneAudioWorkletOptions } from \"../core/worklet/ToneAudioWorklet\";\nimport { Effect, EffectOptions } from \"./Effect\";\nimport { Positive } from \"../core/type/Units\";\nimport { Gain } from \"../core/context/Gain\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { connectSeries } from \"../core/context/ToneAudioNode\";\nimport { Param } from \"../core/context/Param\";\nimport { workletName } from \"./BitCrusher.worklet\";\n\nexport interface BitCrusherOptions extends EffectOptions {\n\tbits: Positive;\n}\n\n/**\n * BitCrusher down-samples the incoming signal to a different bit depth.\n * Lowering the bit depth of the signal creates distortion. Read more about BitCrushing\n * on [Wikipedia](https://en.wikipedia.org/wiki/Bitcrusher).\n * @example\n * // initialize crusher and route a synth through it\n * const crusher = new Tone.BitCrusher(4).toDestination();\n * const synth = new Tone.Synth().connect(crusher);\n * synth.triggerAttackRelease(\"C2\", 2);\n * \n * @category Effect\n */\nexport class BitCrusher extends Effect<BitCrusherOptions> {\n\n\treadonly name: string = \"BitCrusher\";\n\n\t/**\n\t * The bit depth of the effect\n\t * @min 1\n\t * @max 16\n\t */\n\treadonly bits: Param<\"positive\">;\n\n\t/**\n\t * The node which does the bit crushing effect. Runs in an AudioWorklet when possible.\n\t */\n\tprivate _bitCrusherWorklet: BitCrusherWorklet;\n\n\tconstructor(bits?: Positive);\n\tconstructor(options?: Partial<BitCrusherWorkletOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(BitCrusher.getDefaults(), arguments, [\"bits\"]));\n\t\tconst options = optionsFromArguments(BitCrusher.getDefaults(), arguments, [\"bits\"]);\n\n\t\tthis._bitCrusherWorklet = new BitCrusherWorklet({\n\t\t\tcontext: this.context,\n\t\t\tbits: options.bits,\n\t\t});\n\t\t// connect it up\n\t\tthis.connectEffect(this._bitCrusherWorklet);\n\n\t\tthis.bits = this._bitCrusherWorklet.bits;\n\t}\n\n\tstatic getDefaults(): BitCrusherOptions {\n\t\treturn Object.assign(Effect.getDefaults(), {\n\t\t\tbits: 4,\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._bitCrusherWorklet.dispose();\n\t\treturn this;\n\t}\n}\n\ninterface BitCrusherWorkletOptions extends ToneAudioWorkletOptions {\n\tbits: number;\n}\n\n/**\n * Internal class which creates an AudioWorklet to do the bit crushing\n */\nclass BitCrusherWorklet extends ToneAudioWorklet<BitCrusherWorkletOptions> {\n\n\treadonly name: string = \"BitCrusherWorklet\";\n\n\treadonly input: Gain;\n\treadonly output: Gain;\n\n\treadonly bits: Param<\"positive\">;\n\n\tconstructor(options?: Partial<BitCrusherWorkletOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(BitCrusherWorklet.getDefaults(), arguments));\n\t\tconst options = optionsFromArguments(BitCrusherWorklet.getDefaults(), arguments);\n\n\t\tthis.input = new Gain({ context: this.context });\n\t\tthis.output = new Gain({ context: this.context });\n\n\t\tthis.bits = new Param<\"positive\">({\n\t\t\tcontext: this.context,\n\t\t\tvalue: options.bits,\n\t\t\tunits: \"positive\",\n\t\t\tminValue: 1,\n\t\t\tmaxValue: 16,\n\t\t\tparam: this._dummyParam,\n\t\t\tswappable: true,\n\t\t});\n\t}\n\n\tstatic getDefaults(): BitCrusherWorkletOptions {\n\t\treturn Object.assign(ToneAudioWorklet.getDefaults(), {\n\t\t\tbits: 12,\n\t\t});\n\t}\n\n\tprotected _audioWorkletName(): string {\n\t\treturn workletName;\n\t}\n\n\tonReady(node: AudioWorkletNode) {\n\t\tconnectSeries(this.input, node, this.output);\n\t\tconst bits = node.parameters.get(\"bits\") as AudioParam;\n\t\tthis.bits.setParam(bits);\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.input.dispose();\n\t\tthis.output.dispose();\n\t\tthis.bits.dispose();\n\t\treturn this;\n\t}\n}\n","import { Effect, EffectOptions } from \"./Effect\";\nimport { Positive } from \"../core/type/Units\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { WaveShaper } from \"../signal/WaveShaper\";\nimport { assert } from \"../core/util/Debug\";\n\nexport interface ChebyshevOptions extends EffectOptions {\n\torder: Positive;\n\toversample: OverSampleType;\n}\n\n/**\n * Chebyshev is a waveshaper which is good \n * for making different types of distortion sounds.\n * Note that odd orders sound very different from even ones, \n * and order = 1 is no change. \n * Read more at [music.columbia.edu](http://music.columbia.edu/cmc/musicandcomputers/chapter4/04_06.php).\n * @example\n * // create a new cheby\n * const cheby = new Tone.Chebyshev(50).toDestination();\n * // create a monosynth connected to our cheby\n * const synth = new Tone.MonoSynth().connect(cheby);\n * synth.triggerAttackRelease(\"C2\", 0.4);\n * @category Effect\n */\nexport class Chebyshev extends Effect<ChebyshevOptions> {\n\n\treadonly name: string = \"Chebyshev\";\n\n\t/**\n\t * The private waveshaper node\n\t */\n\tprivate _shaper: WaveShaper;\n\n\t/**\n\t * holds onto the order of the filter\n\t */\n\tprivate _order: number;\n\n\t/**\n\t * @param order The order of the chebyshev polynomial. Normal range between 1-100. \n\t */\n\tconstructor(order?: Positive);\n\tconstructor(options?: Partial<ChebyshevOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Chebyshev.getDefaults(), arguments, [\"order\"]));\n\t\tconst options = optionsFromArguments(Chebyshev.getDefaults(), arguments, [\"order\"]);\n\n\t\tthis._shaper = new WaveShaper({\n\t\t\tcontext: this.context,\n\t\t\tlength: 4096\n\t\t});\n\t\tthis._order = options.order;\n\n\t\tthis.connectEffect(this._shaper);\n\t\tthis.order = options.order;\n\t\tthis.oversample = options.oversample;\n\t}\n\n\tstatic getDefaults(): ChebyshevOptions {\n\t\treturn Object.assign(Effect.getDefaults(), {\n\t\t\torder: 1,\n\t\t\toversample: \"none\" as \"none\"\n\t\t});\n\t}\n\n\t/**\n\t * get the coefficient for that degree\n\t * @param x the x value\n\t * @param degree \n\t * @param memo memoize the computed value. this speeds up computation greatly. \n\t */\n\tprivate _getCoefficient(x: number, degree: number, memo: Map<number, number>): number {\n\t\tif (memo.has(degree)) {\n\t\t\treturn memo.get(degree) as number;\n\t\t} else if (degree === 0) {\n\t\t\tmemo.set(degree, 0);\n\t\t} else if (degree === 1) {\n\t\t\tmemo.set(degree, x);\n\t\t} else {\n\t\t\tmemo.set(degree, 2 * x * this._getCoefficient(x, degree - 1, memo) - this._getCoefficient(x, degree - 2, memo));\n\t\t}\n\t\treturn memo.get(degree) as number;\n\t}\n\n\t/**\n\t * The order of the Chebyshev polynomial which creates the equation which is applied to the incoming \n\t * signal through a Tone.WaveShaper. Must be an integer. The equations are in the form:\n\t * ```\n\t * order 2: 2x^2 + 1\n\t * order 3: 4x^3 + 3x \n\t * ```\n\t * @min 1\n\t * @max 100\n\t */\n\tget order(): Positive {\n\t\treturn this._order;\n\t}\n\tset order(order) {\n\t\tassert(Number.isInteger(order), \"'order' must be an integer\");\n\t\tthis._order = order;\n\t\tthis._shaper.setMap((x => {\n\t\t\treturn this._getCoefficient(x, order, new Map());\n\t\t}));\n\t}\n\n\t/**\n\t * The oversampling of the effect. Can either be \"none\", \"2x\" or \"4x\".\n\t */\n\tget oversample(): OverSampleType {\n\t\treturn this._shaper.oversample;\n\t}\n\tset oversample(oversampling) {\n\t\tthis._shaper.oversample = oversampling;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._shaper.dispose();\n\t\treturn this;\n\t}\n}\n","import { ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\n\ninterface SplitOptions extends ToneAudioNodeOptions {\n\tchannels: number;\n}\n\n/**\n * Split splits an incoming signal into the number of given channels.\n *\n * @example\n * const split = new Tone.Split();\n * // stereoSignal.connect(split);\n * @category Component\n */\nexport class Split extends ToneAudioNode<SplitOptions> {\n\treadonly name: string = \"Split\";\n\n\t/**\n\t * The splitting node\n\t */\n\tprivate _splitter: ChannelSplitterNode;\n\n\treadonly input: ChannelSplitterNode;\n\treadonly output: ChannelSplitterNode;\n\n\t/**\n\t * @param channels The number of channels to merge.\n\t */\n\tconstructor(channels?: number);\n\tconstructor(options?: Partial<SplitOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(Split.getDefaults(), arguments, [\"channels\"]));\n\t\tconst options = optionsFromArguments(Split.getDefaults(), arguments, [\"channels\"]);\n\n\t\tthis._splitter = this.input = this.output = this.context.createChannelSplitter(options.channels);\n\t\tthis._internalChannels = [this._splitter];\n\t}\n\n\tstatic getDefaults(): SplitOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tchannels: 2,\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._splitter.disconnect();\n\t\treturn this;\n\t}\n}\n","import { ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { Positive } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\n\ninterface MergeOptions extends ToneAudioNodeOptions {\n\tchannels: Positive;\n}\n\n/**\n * Merge brings multiple mono input channels into a single multichannel output channel.\n *\n * @example\n * const merge = new Tone.Merge().toDestination();\n * // routing a sine tone in the left channel\n * const osc = new Tone.Oscillator().connect(merge, 0, 0).start();\n * // and noise in the right channel\n * const noise = new Tone.Noise().connect(merge, 0, 1).start();;\n * @category Component\n */\nexport class Merge extends ToneAudioNode<MergeOptions> {\n\n\treadonly name: string = \"Merge\";\n\n\t/**\n\t * The merger node for the channels.\n\t */\n\tprivate _merger: ChannelMergerNode;\n\n\t/**\n\t * The output is the input channels combined into a single (multichannel) output\n\t */\n\treadonly output: ChannelMergerNode;\n\n\t/**\n\t * Multiple input connections combine into a single output.\n\t */\n\treadonly input: ChannelMergerNode;\n\n\t/**\n\t * @param channels The number of channels to merge.\n\t */\n\tconstructor(channels?: Positive);\n\tconstructor(options?: Partial<MergeOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(Merge.getDefaults(), arguments, [\"channels\"]));\n\t\tconst options = optionsFromArguments(Merge.getDefaults(), arguments, [\"channels\"]);\n\n\t\tthis._merger = this.output = this.input = this.context.createChannelMerger(options.channels);\n\t}\n\n\tstatic getDefaults(): MergeOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tchannels: 2,\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._merger.disconnect();\n\t\treturn this;\n\t}\n}\n","import { EffectOptions } from \"./Effect\";\nimport { connect, connectSeries, OutputNode, ToneAudioNode } from \"../core/context/ToneAudioNode\";\nimport { CrossFade } from \"../component/channel/CrossFade\";\nimport { Signal } from \"../signal/Signal\";\nimport { Split } from \"../component/channel/Split\";\nimport { Gain } from \"../core/context/Gain\";\nimport { Merge } from \"../component/channel/Merge\";\nimport { readOnly } from \"../core/util/Interface\";\n\nexport type StereoEffectOptions = EffectOptions;\n\n/**\n * Base class for Stereo effects.\n */\nexport class StereoEffect<Options extends StereoEffectOptions> extends ToneAudioNode<Options> {\n\n\treadonly name: string = \"StereoEffect\";\n\n\treadonly input: Gain;\n\treadonly output: CrossFade;\n\n\t/**\n\t * the drywet knob to control the amount of effect\n\t */\n\tprivate _dryWet: CrossFade;\n\t\n\t/**\n\t * The wet control, i.e. how much of the effected\n\t * will pass through to the output.\n\t */\n\treadonly wet: Signal<\"normalRange\">;\n\t\n\t/**\n\t * Split it\n\t */\n\tprotected _split: Split;\n\t\n\t/**\n\t * the stereo effect merger\n\t */\n\tprotected _merge: Merge;\n\n\tconstructor(options: StereoEffectOptions) {\n\n\t\tsuper(options);\n\n\t\tthis.input = new Gain({ context: this.context });\n\t\t// force mono sources to be stereo\n\t\tthis.input.channelCount = 2;\n\t\tthis.input.channelCountMode = \"explicit\";\n\n\t\tthis._dryWet = this.output = new CrossFade({\n\t\t\tcontext: this.context,\n\t\t\tfade: options.wet\n\t\t});\n\t\tthis.wet = this._dryWet.fade;\n\t\tthis._split = new Split({ context: this.context, channels: 2 });\n\t\tthis._merge = new Merge({ context: this.context, channels: 2 });\n\n\t\t// connections\n\t\tthis.input.connect(this._split);\n\t\t// dry wet connections\n\t\tthis.input.connect(this._dryWet.a);\n\t\tthis._merge.connect(this._dryWet.b);\n\t\treadOnly(this, [\"wet\"]);\n\t}\n\t\n\t/**\n\t * Connect the left part of the effect\n\t */\n\tprotected connectEffectLeft(...nodes: OutputNode[]): void{\n\t\tthis._split.connect(nodes[0], 0, 0);\n\t\tconnectSeries(...nodes);\n\t\tconnect(nodes[nodes.length-1], this._merge, 0, 0);\n\t}\n\t\n\t/**\n\t * Connect the right part of the effect\n\t */\n\tprotected connectEffectRight(...nodes: OutputNode[]): void{\n\t\tthis._split.connect(nodes[0], 1, 0);\n\t\tconnectSeries(...nodes);\n\t\tconnect(nodes[nodes.length-1], this._merge, 0, 1);\n\t}\n\n\tstatic getDefaults(): StereoEffectOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\twet: 1,\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._dryWet.dispose();\n\t\tthis._split.dispose();\n\t\tthis._merge.dispose();\n\t\treturn this;\n\t}\n}\n","import { StereoEffect, StereoEffectOptions } from \"./StereoEffect\";\nimport { NormalRange } from \"../core/type/Units\";\nimport { Signal } from \"../signal/Signal\";\nimport { Gain } from \"../core/context/Gain\";\nimport { readOnly } from \"../core/util/Interface\";\nimport { Split } from \"../component/channel/Split\";\nimport { Merge } from \"../component/channel/Merge\";\n\nexport interface StereoFeedbackEffectOptions extends StereoEffectOptions {\n\tfeedback: NormalRange;\n}\n\n/**\n * Base class for stereo feedback effects where the effectReturn is fed back into the same channel.\n */\nexport class StereoFeedbackEffect<Options extends StereoFeedbackEffectOptions> extends StereoEffect<Options> {\n\t\n\t/**\n\t * The amount of feedback from the output\n\t * back into the input of the effect (routed\n\t * across left and right channels).\n\t */\n\treadonly feedback: Signal<\"normalRange\">;\n\n\t/**\n\t * the left side feedback\n\t */\n\tprotected _feedbackL: Gain;\n\n\t/**\n\t * the right side feedback\n\t */\n\tprotected _feedbackR: Gain;\n\n\t/**\n\t * Split the channels for feedback\n\t */\n\tprotected _feedbackSplit: Split;\n\n\t/**\n\t * Merge the channels for feedback\n\t */\n\tprotected _feedbackMerge: Merge;\n\n\tconstructor(options: StereoFeedbackEffectOptions) {\n\n\t\tsuper(options);\n\n\t\tthis.feedback = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tvalue: options.feedback, \n\t\t\tunits: \"normalRange\"\n\t\t});\n\t\tthis._feedbackL = new Gain({ context: this.context });\n\t\tthis._feedbackR = new Gain({ context: this.context });\n\n\t\tthis._feedbackSplit = new Split({ context: this.context, channels: 2 });\n\t\tthis._feedbackMerge = new Merge({ context: this.context, channels: 2 });\n\n\t\tthis._merge.connect(this._feedbackSplit);\n\t\tthis._feedbackMerge.connect(this._split);\n\t\t\n\t\t// the left output connected to the left input\n\t\tthis._feedbackSplit.connect(this._feedbackL, 0, 0);\n\t\tthis._feedbackL.connect(this._feedbackMerge, 0, 0);\n\n\t\t// the right output connected to the right input\n\t\tthis._feedbackSplit.connect(this._feedbackR, 1, 0);\n\t\tthis._feedbackR.connect(this._feedbackMerge, 0, 1);\n\t\t\n\t\t// the feedback control\n\t\tthis.feedback.fan(this._feedbackL.gain, this._feedbackR.gain);\n\t\treadOnly(this, [\"feedback\"]);\n\t}\n\n\tstatic getDefaults(): StereoFeedbackEffectOptions {\n\t\treturn Object.assign(StereoEffect.getDefaults(), {\n\t\t\tfeedback: 0.5,\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.feedback.dispose();\n\t\tthis._feedbackL.dispose();\n\t\tthis._feedbackR.dispose();\n\t\tthis._feedbackSplit.dispose();\n\t\tthis._feedbackMerge.dispose();\n\t\treturn this;\n\t}\n}\n","import { StereoFeedbackEffect, StereoFeedbackEffectOptions } from \"../effect/StereoFeedbackEffect\";\nimport { Degrees, Frequency, Milliseconds, NormalRange, Seconds, Time } from \"../core/type/Units\";\nimport { ToneOscillatorType } from \"../source/oscillator/OscillatorInterface\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { LFO } from \"../source/oscillator/LFO\";\nimport { Delay } from \"../core/context/Delay\";\nimport { Signal } from \"../signal/Signal\";\nimport { readOnly } from \"../core/util/Interface\";\n\nexport interface ChorusOptions extends StereoFeedbackEffectOptions {\n\tfrequency: Frequency;\n\tdelayTime: Milliseconds;\n\tdepth: NormalRange;\n\ttype: ToneOscillatorType;\n\tspread: Degrees;\n}\n\n/**\n * Chorus is a stereo chorus effect composed of a left and right delay with an [[LFO]] applied to the delayTime of each channel.\n * When [[feedback]] is set to a value larger than 0, you also get Flanger-type effects. \n * Inspiration from [Tuna.js](https://github.com/Dinahmoe/tuna/blob/master/tuna.js).\n * Read more on the chorus effect on [SoundOnSound](http://www.soundonsound.com/sos/jun04/articles/synthsecrets.htm).\n *\n * @example\n * const chorus = new Tone.Chorus(4, 2.5, 0.5).toDestination().start();\n * const synth = new Tone.PolySynth().connect(chorus);\n * synth.triggerAttackRelease([\"C3\", \"E3\", \"G3\"], \"8n\");\n * \n * @category Effect\n */\nexport class Chorus extends StereoFeedbackEffect<ChorusOptions> {\n\n\treadonly name: string = \"Chorus\";\n\n\t/**\n\t * the depth of the chorus\n\t */\n\tprivate _depth: NormalRange;\n\n\t/**\n\t * the delayTime in seconds.\n\t */\n\tprivate _delayTime: Seconds;\n\n\t/**\n\t * the lfo which controls the delayTime\n\t */\n\tprivate _lfoL: LFO\n\n\t/**\n\t * another LFO for the right side with a 180 degree phase diff\n\t */\n\tprivate _lfoR: LFO\n\n\t/**\n\t * delay for left\n\t */\n\tprivate _delayNodeL: Delay;\n\n\t/**\n\t * delay for right\n\t */\n\tprivate _delayNodeR: Delay;\n\n\t/**\n\t * The frequency of the LFO which modulates the delayTime.\n\t */\n\treadonly frequency: Signal<\"frequency\">\n\n\t/**\n\t * @param frequency The frequency of the LFO.\n\t * @param delayTime The delay of the chorus effect in ms.\n\t * @param depth The depth of the chorus.\n\t */\n\tconstructor(frequency?: Frequency, delayTime?: Milliseconds, depth?: NormalRange);\n\tconstructor(options?: Partial<ChorusOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Chorus.getDefaults(), arguments, [\"frequency\", \"delayTime\", \"depth\"]));\n\t\tconst options = optionsFromArguments(Chorus.getDefaults(), arguments, [\"frequency\", \"delayTime\", \"depth\"]);\n\n\t\tthis._depth = options.depth;\n\t\tthis._delayTime = options.delayTime / 1000;\n\t\tthis._lfoL = new LFO({\n\t\t\tcontext: this.context,\n\t\t\tfrequency: options.frequency,\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t});\n\t\tthis._lfoR = new LFO({\n\t\t\tcontext: this.context,\n\t\t\tfrequency: options.frequency,\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t\tphase: 180\n\t\t});\n\t\tthis._delayNodeL = new Delay({ context: this.context });\n\t\tthis._delayNodeR = new Delay({ context: this.context });\n\t\tthis.frequency = this._lfoL.frequency;\n\t\treadOnly(this, [\"frequency\"]);\n\t\t// have one LFO frequency control the other\n\t\tthis._lfoL.frequency.connect(this._lfoR.frequency);\n\n\t\t// connections\n\t\tthis.connectEffectLeft(this._delayNodeL);\n\t\tthis.connectEffectRight(this._delayNodeR);\n\t\t// lfo setup\n\t\tthis._lfoL.connect(this._delayNodeL.delayTime);\n\t\tthis._lfoR.connect(this._delayNodeR.delayTime);\n\t\t// set the initial values\n\t\tthis.depth = this._depth;\n\t\tthis.type = options.type;\n\t\tthis.spread = options.spread;\n\t}\n\n\tstatic getDefaults(): ChorusOptions {\n\t\treturn Object.assign(StereoFeedbackEffect.getDefaults(), {\n\t\t\tfrequency: 1.5,\n\t\t\tdelayTime: 3.5,\n\t\t\tdepth: 0.7,\n\t\t\ttype: \"sine\" as \"sine\",\n\t\t\tspread: 180,\n\t\t\tfeedback: 0,\n\t\t\twet: 0.5,\n\t\t});\n\t}\n\n\t/**\n\t * The depth of the effect. A depth of 1 makes the delayTime\n\t * modulate between 0 and 2*delayTime (centered around the delayTime).\n\t */\n\tget depth(): NormalRange {\n\t\treturn this._depth;\n\t}\n\tset depth(depth) {\n\t\tthis._depth = depth;\n\t\tconst deviation = this._delayTime * depth;\n\t\tthis._lfoL.min = Math.max(this._delayTime - deviation, 0);\n\t\tthis._lfoL.max = this._delayTime + deviation;\n\t\tthis._lfoR.min = Math.max(this._delayTime - deviation, 0);\n\t\tthis._lfoR.max = this._delayTime + deviation;\n\t}\n\n\t/**\n\t * The delayTime in milliseconds of the chorus. A larger delayTime\n\t * will give a more pronounced effect. Nominal range a delayTime\n\t * is between 2 and 20ms.\n\t */\n\tget delayTime(): Milliseconds {\n\t\treturn this._delayTime * 1000;\n\t}\n\tset delayTime(delayTime) {\n\t\tthis._delayTime = delayTime / 1000;\n\t\tthis.depth = this._depth;\n\t}\n\n\t/**\n\t * The oscillator type of the LFO.\n\t */\n\tget type(): ToneOscillatorType {\n\t\treturn this._lfoL.type;\n\t}\n\tset type(type) {\n\t\tthis._lfoL.type = type;\n\t\tthis._lfoR.type = type;\n\t}\n\n\t/**\n\t * Amount of stereo spread. When set to 0, both LFO's will be panned centrally.\n\t * When set to 180, LFO's will be panned hard left and right respectively.\n\t */\n\tget spread(): Degrees {\n\t\treturn this._lfoR.phase - this._lfoL.phase;\n\t}\n\tset spread(spread) {\n\t\tthis._lfoL.phase = 90 - (spread / 2);\n\t\tthis._lfoR.phase = (spread / 2) + 90;\n\t}\n\n\t/**\n\t * Start the effect.\n\t */\n\tstart(time?: Time): this {\n\t\tthis._lfoL.start(time);\n\t\tthis._lfoR.start(time);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Stop the lfo\n\t */\n\tstop(time?: Time): this {\n\t\tthis._lfoL.stop(time);\n\t\tthis._lfoR.stop(time);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sync the filter to the transport. See [[LFO.sync]]\n\t */\n\tsync(): this {\n\t\tthis._lfoL.sync();\n\t\tthis._lfoR.sync();\n\t\treturn this;\n\t}\n\n\t/**\n\t * Unsync the filter from the transport.\n\t */\n\tunsync(): this {\n\t\tthis._lfoL.unsync();\n\t\tthis._lfoR.unsync();\n\t\treturn this;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._lfoL.dispose();\n\t\tthis._lfoR.dispose();\n\t\tthis._delayNodeL.dispose();\n\t\tthis._delayNodeR.dispose();\n\t\tthis.frequency.dispose();\n\t\treturn this;\n\t}\n}\n","import { optionsFromArguments } from \"../core/util/Defaults\";\nimport { WaveShaper } from \"../signal/WaveShaper\";\nimport { Effect, EffectOptions } from \"./Effect\";\n\nexport interface DistortionOptions extends EffectOptions {\n\tdistortion: number;\n\toversample: OverSampleType;\n}\n\n/**\n * A simple distortion effect using Tone.WaveShaper.\n * Algorithm from [this stackoverflow answer](http://stackoverflow.com/a/22313408).\n *\n * @example\n * const dist = new Tone.Distortion(0.8).toDestination();\n * const fm = new Tone.FMSynth().connect(dist);\n * fm.triggerAttackRelease(\"A1\", \"8n\");\n * @category Effect\n */\nexport class Distortion extends Effect<DistortionOptions> {\n\n\treadonly name: string = \"Distortion\";\n\n\t/**\n\t * The waveshaper which does the distortion\n\t */\n\tprivate _shaper: WaveShaper;\n\n\t/**\n\t * Stores the distortion value\n\t */\n\tprivate _distortion: number;\n\n\t/**\n\t * @param distortion The amount of distortion (nominal range of 0-1)\n\t */\n\tconstructor(distortion?: number);\n\tconstructor(options?: Partial<DistortionOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Distortion.getDefaults(), arguments, [\"distortion\"]));\n\t\tconst options = optionsFromArguments(Distortion.getDefaults(), arguments, [\"distortion\"]);\n\n\t\tthis._shaper = new WaveShaper({\n\t\t\tcontext: this.context,\n\t\t\tlength: 4096,\n\t\t});\n\n\t\tthis._distortion = options.distortion;\n\n\t\tthis.connectEffect(this._shaper);\n\t\tthis.distortion = options.distortion;\n\t\tthis.oversample = options.oversample;\n\t}\n\n\tstatic getDefaults(): DistortionOptions {\n\t\treturn Object.assign(Effect.getDefaults(), {\n\t\t\tdistortion: 0.4,\n\t\t\toversample: \"none\" as OverSampleType,\n\t\t});\n\t}\n\n\t/**\n\t * The amount of distortion. Nominal range is between 0 and 1.\n\t */\n\tget distortion(): number {\n\t\treturn this._distortion;\n\t}\n\tset distortion(amount) {\n\t\tthis._distortion = amount;\n\t\tconst k = amount * 100;\n\t\tconst deg = Math.PI / 180;\n\t\tthis._shaper.setMap((x) => {\n\t\t\tif (Math.abs(x) < 0.001) {\n\t\t\t\t// should output 0 when input is 0\n\t\t\t\treturn 0;\n\t\t\t} else {\n\t\t\t\treturn (3 + k) * x * 20 * deg / (Math.PI + k * Math.abs(x));\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * The oversampling of the effect. Can either be \"none\", \"2x\" or \"4x\".\n\t */\n\tget oversample(): OverSampleType {\n\t\treturn this._shaper.oversample;\n\t}\n\tset oversample(oversampling) {\n\t\tthis._shaper.oversample = oversampling;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._shaper.dispose();\n\t\treturn this;\n\t}\n}\n","import { Gain } from \"../core/context/Gain\";\nimport { Param } from \"../core/context/Param\";\nimport { NormalRange } from \"../core/type/Units\";\nimport { readOnly } from \"../core/util/Interface\";\nimport { Effect, EffectOptions } from \"./Effect\";\n\nexport interface FeedbackEffectOptions extends EffectOptions {\n\t/**\n\t * The feedback from the output back to the input\n\t * ```\n\t * +---<--------<---+\n\t * | |\n\t * | +----------+ |\n\t * +--> feedback +>-+\n\t * +----------+\n\t * ```\n\t */\n\tfeedback: NormalRange;\n}\n\n/**\n * FeedbackEffect provides a loop between an audio source and its own output.\n * This is a base-class for feedback effects.\n */\nexport abstract class FeedbackEffect<Options extends FeedbackEffectOptions> extends Effect<Options> {\n\n\treadonly name: string = \"FeedbackEffect\";\n\n\t/**\n\t * the gain which controls the feedback\n\t */\n\tprivate _feedbackGain: Gain<\"normalRange\">;\n\n\t/**\n\t * The amount of signal which is fed back into the effect input.\n\t */\n\tfeedback: Param<\"normalRange\">;\n\n\tconstructor(options: FeedbackEffectOptions) {\n\n\t\tsuper(options);\n\n\t\tthis._feedbackGain = new Gain({\n\t\t\tcontext: this.context,\n\t\t\tgain: options.feedback,\n\t\t\tunits: \"normalRange\",\n\t\t});\n\n\t\tthis.feedback = this._feedbackGain.gain;\n\t\treadOnly(this, \"feedback\");\n\n\t\t// the feedback loop\n\t\tthis.effectReturn.chain(this._feedbackGain, this.effectSend);\n\t}\n\n\tstatic getDefaults(): FeedbackEffectOptions {\n\t\treturn Object.assign(Effect.getDefaults(), {\n\t\t\tfeedback: 0.125,\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._feedbackGain.dispose();\n\t\tthis.feedback.dispose();\n\t\treturn this;\n\t}\n}\n","import { Delay } from \"../core/context/Delay\";\nimport { Param } from \"../core/context/Param\";\nimport { NormalRange, Time } from \"../core/type/Units\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { readOnly } from \"../core/util/Interface\";\nimport { FeedbackEffect, FeedbackEffectOptions } from \"./FeedbackEffect\";\n\ninterface FeedbackDelayOptions extends FeedbackEffectOptions {\n\tdelayTime: Time;\n\tmaxDelay: Time;\n}\n\n/**\n * FeedbackDelay is a DelayNode in which part of output signal is fed back into the delay.\n *\n * @param delayTime The delay applied to the incoming signal.\n * @param feedback The amount of the effected signal which is fed back through the delay.\n * @example\n * const feedbackDelay = new Tone.FeedbackDelay(\"8n\", 0.5).toDestination();\n * const tom = new Tone.MembraneSynth({\n * \toctaves: 4,\n * \tpitchDecay: 0.1\n * }).connect(feedbackDelay);\n * tom.triggerAttackRelease(\"A2\", \"32n\");\n * @category Effect\n */\nexport class FeedbackDelay extends FeedbackEffect<FeedbackDelayOptions> {\n\n\treadonly name: string = \"FeedbackDelay\";\n\n\t/**\n\t * the delay node\n\t */\n\tprivate _delayNode: Delay;\n\n\t/**\n\t * The delayTime of the FeedbackDelay.\n\t */\n\treadonly delayTime: Param<\"time\">;\n\n\tconstructor(delayTime?: Time, feedback?: NormalRange);\n\tconstructor(options?: Partial<FeedbackDelayOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(FeedbackDelay.getDefaults(), arguments, [\"delayTime\", \"feedback\"]));\n\t\tconst options = optionsFromArguments(FeedbackDelay.getDefaults(), arguments, [\"delayTime\", \"feedback\"]);\n\n\t\tthis._delayNode = new Delay({\n\t\t\tcontext: this.context,\n\t\t\tdelayTime: options.delayTime,\n\t\t\tmaxDelay: options.maxDelay,\n\t\t});\n\t\tthis.delayTime = this._delayNode.delayTime;\n\n\t\t// connect it up\n\t\tthis.connectEffect(this._delayNode);\n\t\treadOnly(this, \"delayTime\");\n\t}\n\n\tstatic getDefaults(): FeedbackDelayOptions {\n\t\treturn Object.assign(FeedbackEffect.getDefaults(), {\n\t\t\tdelayTime: 0.25,\n\t\t\tmaxDelay: 1,\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._delayNode.dispose();\n\t\tthis.delayTime.dispose();\n\t\treturn this;\n\t}\n}\n","import { Gain } from \"../../core/context/Gain\";\nimport { connectSeries, ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\n\n/**\n * PhaseShiftAllpass is an very efficient implementation of a Hilbert Transform\n * using two Allpass filter banks whose outputs have a phase difference of 90°.\n * Here the `offset90` phase is offset by +90° in relation to `output`.\n * Coefficients and structure was developed by Olli Niemitalo.\n * For more details see: http://yehar.com/blog/?p=368\n * @category Component\n */\nexport class PhaseShiftAllpass extends ToneAudioNode<ToneAudioNodeOptions> {\n\n\treadonly name: string = \"PhaseShiftAllpass\";\n\n\treadonly input = new Gain({ context: this.context });\n\n\t/**\n\t * The Allpass filter in the first bank\n\t */\n\tprivate _bank0: IIRFilterNode[];\n\n\t/**\n\t * The Allpass filter in the seconds bank\n\t */\n\tprivate _bank1: IIRFilterNode[];\n\n\t/**\n\t * A IIR filter implementing a delay by one sample used by the first bank\n\t */\n\tprivate _oneSampleDelay: IIRFilterNode;\n\n\t/**\n\t * The phase shifted output\n\t */\n\treadonly output = new Gain({ context: this.context });\n\n\t/**\n\t * The PhaseShifted allpass output\n\t */\n\treadonly offset90 = new Gain({ context: this.context });\n\n\tconstructor(options?: Partial<ToneAudioNodeOptions>) {\n\n\t\tsuper(options);\n\n\t\tconst allpassBank1Values = [0.6923878, 0.9360654322959, 0.9882295226860, 0.9987488452737];\n\t\tconst allpassBank2Values = [0.4021921162426, 0.8561710882420, 0.9722909545651, 0.9952884791278];\n\n\t\tthis._bank0 = this._createAllPassFilterBank(allpassBank1Values);\n\t\tthis._bank1 = this._createAllPassFilterBank(allpassBank2Values);\n\t\tthis._oneSampleDelay = this.context.createIIRFilter([0.0, 1.0], [1.0, 0.0]);\n\n\t\t// connect Allpass filter banks\n\t\tconnectSeries(this.input, ...this._bank0, this._oneSampleDelay, this.output);\n\t\tconnectSeries(this.input, ...this._bank1, this.offset90);\n\t}\n\n\t/**\n\t * Create all of the IIR filters from an array of values using the coefficient calculation.\n\t */\n\tprivate _createAllPassFilterBank(bankValues: number[]): IIRFilterNode[] {\n\t\tconst nodes: IIRFilterNode[] = bankValues.map(value => {\n\t\t\tconst coefficients = [[value * value, 0, -1], [1, 0, -(value * value)]];\n\t\t\treturn this.context.createIIRFilter(coefficients[0], coefficients[1]);\n\t\t});\n\n\t\treturn nodes;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.input.dispose();\n\t\tthis.output.dispose();\n\t\tthis.offset90.dispose();\n\t\tthis._bank0.forEach(f => f.disconnect());\n\t\tthis._bank1.forEach(f => f.disconnect());\n\t\tthis._oneSampleDelay.disconnect();\n\t\treturn this;\n\t}\n}\n","import { PhaseShiftAllpass } from \"../component/filter/PhaseShiftAllpass\";\nimport { Frequency } from \"../core/type/Units\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { Effect, EffectOptions } from \"../effect/Effect\";\nimport { Add } from \"../signal/Add\";\nimport { Multiply } from \"../signal/Multiply\";\nimport { Negate } from \"../signal/Negate\";\nimport { Signal } from \"../signal/Signal\";\nimport { Oscillator } from \"../source/oscillator/Oscillator\";\nimport { ToneOscillatorNode } from \"../source/oscillator/ToneOscillatorNode\";\n\ninterface FrequencyShifterOptions extends EffectOptions {\n\tfrequency: Frequency;\n}\n\n/**\n * FrequencyShifter can be used to shift all frequencies of a signal by a fixed amount.\n * The amount can be changed at audio rate and the effect is applied in real time.\n * The frequency shifting is implemented with a technique called single side band modulation using a ring modulator.\n * Note: Contrary to pitch shifting, all frequencies are shifted by the same amount,\n * destroying the harmonic relationship between them. This leads to the classic ring modulator timbre distortion.\n * The algorithm will produces some aliasing towards the high end, especially if your source material\n * contains a lot of high frequencies. Unfortunatelly the webaudio API does not support resampling\n * buffers in real time, so it is not possible to fix it properly. Depending on the use case it might\n * be an option to low pass filter your input before frequency shifting it to get ride of the aliasing.\n * You can find a very detailed description of the algorithm here: https://larzeitlin.github.io/RMFS/\n *\n * @example\n * const input = new Tone.Oscillator(230, \"sawtooth\").start();\n * const shift = new Tone.FrequencyShifter(42).toDestination();\n * input.connect(shift);\n * @category Effect\n */\nexport class FrequencyShifter extends Effect<FrequencyShifterOptions> {\n\n\treadonly name: string = \"FrequencyShifter\";\n\n\t/**\n\t * The ring modulators carrier frequency. This frequency determines\n\t * by how many Hertz the input signal will be shifted up or down. Default is 0.\n\t */\n\treadonly frequency: Signal<\"frequency\">;\n\n\t/**\n\t * The ring modulators sine carrier\n\t */\n\tprivate _sine: ToneOscillatorNode;\n\n\t/**\n\t * The ring modulators cosine carrier\n\t */\n\tprivate _cosine: Oscillator;\n\n\t/**\n\t * The sine multiply operator\n\t */\n\tprivate _sineMultiply: Multiply;\n\n\t/**\n\t * The cosine multiply operator\n\t */\n\tprivate _cosineMultiply: Multiply;\n\n\t/**\n\t * The negate operator\n\t */\n\tprivate _negate: Negate;\n\n\t/**\n\t * The final add operator\n\t */\n\tprivate _add: Add;\n\n\t/**\n\t * The phase shifter to create the initial 90° phase offset\n\t */\n\tprivate _phaseShifter: PhaseShiftAllpass;\n\n\t/**\n\t * @param frequency The incoming signal is shifted by this frequency value.\n\t */\n\tconstructor(frequency?: Frequency);\n\tconstructor(options?: Partial<FrequencyShifterOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(FrequencyShifter.getDefaults(), arguments, [\"frequency\"]));\n\t\tconst options = optionsFromArguments(FrequencyShifter.getDefaults(), arguments, [\"frequency\"]);\n\n\t\tthis.frequency = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"frequency\",\n\t\t\tvalue: options.frequency,\n\t\t\tminValue: -this.context.sampleRate / 2,\n\t\t\tmaxValue: this.context.sampleRate / 2,\n\t\t});\n\n\t\tthis._sine = new ToneOscillatorNode({\n\t\t\tcontext: this.context,\n\t\t\ttype: \"sine\",\n\t\t});\n\n\t\tthis._cosine = new Oscillator({\n\t\t\tcontext: this.context,\n\t\t\tphase: -90,\n\t\t\ttype: \"sine\",\n\t\t});\n\n\t\tthis._sineMultiply = new Multiply({ context: this.context });\n\t\tthis._cosineMultiply = new Multiply({ context: this.context });\n\t\tthis._negate = new Negate({ context: this.context });\n\t\tthis._add = new Add({ context: this.context });\n\n\t\tthis._phaseShifter = new PhaseShiftAllpass({ context: this.context });\n\t\tthis.effectSend.connect(this._phaseShifter);\n\n\t\t// connect the carrier frequency signal to the two oscillators\n\t\tthis.frequency.fan(this._sine.frequency, this._cosine.frequency);\n\n\t\tthis._phaseShifter.offset90.connect(this._cosineMultiply);\n\t\tthis._cosine.connect(this._cosineMultiply.factor);\n\n\t\tthis._phaseShifter.connect(this._sineMultiply);\n\t\tthis._sine.connect(this._sineMultiply.factor);\n\t\tthis._sineMultiply.connect(this._negate);\n\n\t\tthis._cosineMultiply.connect(this._add);\n\t\tthis._negate.connect(this._add.addend);\n\n\t\tthis._add.connect(this.effectReturn);\n\n\t\t// start the oscillators at the same time\n\t\tconst now = this.immediate();\n\t\tthis._sine.start(now);\n\t\tthis._cosine.start(now);\n\t}\n\n\tstatic getDefaults(): FrequencyShifterOptions {\n\t\treturn Object.assign(Effect.getDefaults(), {\n\t\t\tfrequency: 0,\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.frequency.dispose();\n\t\tthis._add.dispose();\n\t\tthis._cosine.dispose();\n\t\tthis._cosineMultiply.dispose();\n\t\tthis._negate.dispose();\n\t\tthis._phaseShifter.dispose();\n\t\tthis._sine.dispose();\n\t\tthis._sineMultiply.dispose();\n\t\treturn this;\n\t}\n}\n","import { StereoEffect, StereoEffectOptions } from \"./StereoEffect\";\nimport { Frequency, NormalRange } from \"../core/type/Units\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { readOnly } from \"../core/util/Interface\";\nimport { Signal } from \"../signal/Signal\";\nimport { LowpassCombFilter } from \"../component/filter/LowpassCombFilter\";\n\nexport interface FreeverbOptions extends StereoEffectOptions {\n\tdampening: Frequency;\n\troomSize: NormalRange;\n}\n\n/**\n * An array of comb filter delay values from Freeverb implementation\n */\nconst combFilterTunings = [1557 / 44100, 1617 / 44100, 1491 / 44100, 1422 / 44100, 1277 / 44100, 1356 / 44100, 1188 / 44100, 1116 / 44100];\n\n/**\n * An array of allpass filter frequency values from Freeverb implementation\n */\nconst allpassFilterFrequencies = [225, 556, 441, 341];\n\n/**\n * Freeverb is a reverb based on [Freeverb](https://ccrma.stanford.edu/~jos/pasp/Freeverb.html).\n * Read more on reverb on [Sound On Sound](https://web.archive.org/web/20160404083902/http://www.soundonsound.com:80/sos/feb01/articles/synthsecrets.asp).\n * Freeverb is now implemented with an AudioWorkletNode which may result on performance degradation on some platforms. Consider using [[Reverb]].\n * @example\n * const freeverb = new Tone.Freeverb().toDestination();\n * freeverb.dampening = 1000;\n * // routing synth through the reverb\n * const synth = new Tone.NoiseSynth().connect(freeverb);\n * synth.triggerAttackRelease(0.05);\n * @category Effect\n */\nexport class Freeverb extends StereoEffect<FreeverbOptions> {\n\n\treadonly name: string = \"Freeverb\";\n\n\t/**\n\t * The roomSize value between 0 and 1. A larger roomSize will result in a longer decay.\n\t */\n\treadonly roomSize: Signal<\"normalRange\">;\n\n\t/**\n\t * the comb filters\n\t */\n\tprivate _combFilters: LowpassCombFilter[] = [];\n\n\t/**\n\t * the allpass filters on the left\n\t */\n\tprivate _allpassFiltersL: BiquadFilterNode[] = [];\n\n\t/**\n\t * the allpass filters on the right\n\t */\n\tprivate _allpassFiltersR: BiquadFilterNode[] = [];\n\n\t/**\n\t * @param roomSize Correlated to the decay time.\n\t * @param dampening The cutoff frequency of a lowpass filter as part of the reverb.\n\t */\n\tconstructor(roomSize?: NormalRange, dampening?: Frequency);\n\tconstructor(options?: Partial<FreeverbOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Freeverb.getDefaults(), arguments, [\"roomSize\", \"dampening\"]));\n\t\tconst options = optionsFromArguments(Freeverb.getDefaults(), arguments, [\"roomSize\", \"dampening\"]);\n\n\t\tthis.roomSize = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tvalue: options.roomSize,\n\t\t\tunits: \"normalRange\",\n\t\t});\n\n\t\t// make the allpass filters on the right\n\t\tthis._allpassFiltersL = allpassFilterFrequencies.map(freq => {\n\t\t\tconst allpassL = this.context.createBiquadFilter();\n\t\t\tallpassL.type = \"allpass\";\n\t\t\tallpassL.frequency.value = freq;\n\t\t\treturn allpassL;\n\t\t});\n\n\t\t// make the allpass filters on the left\n\t\tthis._allpassFiltersR = allpassFilterFrequencies.map(freq => {\n\t\t\tconst allpassR = this.context.createBiquadFilter();\n\t\t\tallpassR.type = \"allpass\";\n\t\t\tallpassR.frequency.value = freq;\n\t\t\treturn allpassR;\n\t\t});\n\n\t\t// make the comb filters\n\t\tthis._combFilters = combFilterTunings.map((delayTime, index) => {\n\t\t\tconst lfpf = new LowpassCombFilter({\n\t\t\t\tcontext: this.context,\n\t\t\t\tdampening: options.dampening,\n\t\t\t\tdelayTime,\n\t\t\t});\n\t\t\tif (index < combFilterTunings.length / 2) {\n\t\t\t\tthis.connectEffectLeft(lfpf, ...this._allpassFiltersL);\n\t\t\t} else {\n\t\t\t\tthis.connectEffectRight(lfpf, ...this._allpassFiltersR);\n\t\t\t}\n\t\t\tthis.roomSize.connect(lfpf.resonance);\n\t\t\treturn lfpf;\n\t\t});\n\n\t\treadOnly(this, [\"roomSize\"]);\n\t}\n\n\tstatic getDefaults(): FreeverbOptions {\n\t\treturn Object.assign(StereoEffect.getDefaults(), {\n\t\t\troomSize: 0.7,\n\t\t\tdampening: 3000\n\t\t});\n\t}\n\n\t/**\n\t * The amount of dampening of the reverberant signal.\n\t */\n\n\tget dampening(): Frequency {\n\t\treturn this._combFilters[0].dampening;\n\t}\n\tset dampening(d) {\n\t\tthis._combFilters.forEach(c => c.dampening = d);\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._allpassFiltersL.forEach(al => al.disconnect());\n\t\tthis._allpassFiltersR.forEach(ar => ar.disconnect());\n\t\tthis._combFilters.forEach(cf => cf.dispose());\n\t\tthis.roomSize.dispose();\n\t\treturn this;\n\t}\n}\n","import { NormalRange } from \"../core/type/Units\";\nimport { StereoEffect, StereoEffectOptions } from \"./StereoEffect\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { Scale } from \"../signal/Scale\";\nimport { Signal } from \"../signal/Signal\";\nimport { FeedbackCombFilter } from \"../component/filter/FeedbackCombFilter\";\nimport { readOnly } from \"../core/util/Interface\";\n\nexport interface JCReverbOptions extends StereoEffectOptions {\n\troomSize: NormalRange;\n}\n\n/**\n * an array of the comb filter delay time values\n */\nconst combFilterDelayTimes = [1687 / 25000, 1601 / 25000, 2053 / 25000, 2251 / 25000];\n\n/**\n * the resonances of each of the comb filters\n */\nconst combFilterResonances = [0.773, 0.802, 0.753, 0.733];\n\n/**\n * the allpass filter frequencies\n */\nconst allpassFilterFreqs = [347, 113, 37];\n\n/**\n * JCReverb is a simple [Schroeder Reverberator](https://ccrma.stanford.edu/~jos/pasp/Schroeder_Reverberators.html)\n * tuned by John Chowning in 1970.\n * It is made up of three allpass filters and four [[FeedbackCombFilter]].\n * JCReverb is now implemented with an AudioWorkletNode which may result on performance degradation on some platforms. Consider using [[Reverb]].\n * @example\n * const reverb = new Tone.JCReverb(0.4).toDestination();\n * const delay = new Tone.FeedbackDelay(0.5);\n * // connecting the synth to reverb through delay\n * const synth = new Tone.DuoSynth().chain(delay, reverb);\n * synth.triggerAttackRelease(\"A4\", \"8n\");\n * \n * @category Effect\n */\nexport class JCReverb extends StereoEffect<JCReverbOptions> {\n\n\treadonly name: string = \"JCReverb\";\n\n\t/**\n\t * Room size control values. \n\t */\n\treadonly roomSize: Signal<\"normalRange\">\n\n\t/**\n\t * Scale the room size\n\t */\n\tprivate _scaleRoomSize: Scale;\n\n\t/**\n\t * a series of allpass filters\n\t */\n\tprivate _allpassFilters: BiquadFilterNode[] = [];\n\n\t/**\n\t * parallel feedback comb filters\n\t */\n\tprivate _feedbackCombFilters: FeedbackCombFilter[] = [];\n\n\t/**\n\t * @param roomSize Correlated to the decay time.\n\t */\n\tconstructor(roomSize?: NormalRange);\n\tconstructor(options?: Partial<JCReverbOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(JCReverb.getDefaults(), arguments, [\"roomSize\"]));\n\t\tconst options = optionsFromArguments(JCReverb.getDefaults(), arguments, [\"roomSize\"]);\n\n\t\tthis.roomSize = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tvalue: options.roomSize,\n\t\t\tunits: \"normalRange\",\n\t\t});\n\t\tthis._scaleRoomSize = new Scale({\n\t\t\tcontext: this.context,\n\t\t\tmin: -0.733,\n\t\t\tmax: 0.197,\n\t\t});\n\n\t\t// make the allpass filters\n\t\tthis._allpassFilters = allpassFilterFreqs.map(freq => {\n\t\t\tconst allpass = this.context.createBiquadFilter();\n\t\t\tallpass.type = \"allpass\";\n\t\t\tallpass.frequency.value = freq;\n\t\t\treturn allpass;\n\t\t});\n\n\t\t// and the comb filters\n\t\tthis._feedbackCombFilters = combFilterDelayTimes.map((delayTime, index) => {\n\t\t\tconst fbcf = new FeedbackCombFilter({\n\t\t\t\tcontext: this.context,\n\t\t\t\tdelayTime,\n\t\t\t});\n\t\t\tthis._scaleRoomSize.connect(fbcf.resonance);\n\t\t\tfbcf.resonance.value = combFilterResonances[index];\n\t\t\tif (index < combFilterDelayTimes.length / 2) {\n\t\t\t\tthis.connectEffectLeft(...this._allpassFilters, fbcf);\n\t\t\t} else {\n\t\t\t\tthis.connectEffectRight(...this._allpassFilters, fbcf);\n\t\t\t}\n\t\t\treturn fbcf;\n\t\t});\n\n\t\t// chain the allpass filters together\n\t\tthis.roomSize.connect(this._scaleRoomSize);\n\t\treadOnly(this, [\"roomSize\"]);\n\t}\n\n\tstatic getDefaults(): JCReverbOptions {\n\t\treturn Object.assign(StereoEffect.getDefaults(), {\n\t\t\troomSize: 0.5,\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._allpassFilters.forEach(apf => apf.disconnect());\n\t\tthis._feedbackCombFilters.forEach(fbcf => fbcf.dispose());\n\t\tthis.roomSize.dispose();\n\t\tthis._scaleRoomSize.dispose();\n\t\treturn this;\n\t}\n}\n","import { StereoFeedbackEffect, StereoFeedbackEffectOptions } from \"./StereoFeedbackEffect\";\nimport { NormalRange } from \"../core/type/Units\";\nimport { readOnly } from \"../core/util/Interface\";\n\nexport interface StereoXFeedbackEffectOptions extends StereoFeedbackEffectOptions {\n\tfeedback: NormalRange;\n}\n\n/**\n * Just like a [[StereoFeedbackEffect]], but the feedback is routed from left to right\n * and right to left instead of on the same channel.\n * ```\n * +--------------------------------+ feedbackL <-----------------------------------+\n * | |\n * +--> +-----> +----> +-----+\n * feedbackMerge +--> split (EFFECT) merge +--> feedbackSplit | |\n * +--> +-----> +----> +---+ |\n * | |\n * +--------------------------------+ feedbackR <-------------------------------------+\n * ```\n */\nexport class StereoXFeedbackEffect<Options extends StereoXFeedbackEffectOptions> extends StereoFeedbackEffect<Options> {\n\t\n\tconstructor(options: StereoXFeedbackEffectOptions) {\n\n\t\tsuper(options);\n\t\t// the left output connected to the right input\n\t\tthis._feedbackL.disconnect();\n\t\tthis._feedbackL.connect(this._feedbackMerge, 0, 1);\n\n\t\t// the left output connected to the right input\n\t\tthis._feedbackR.disconnect();\n\t\tthis._feedbackR.connect(this._feedbackMerge, 0, 0);\n\t\t\n\t\treadOnly(this, [\"feedback\"]);\n\t}\n}\n","import { StereoXFeedbackEffect, StereoXFeedbackEffectOptions } from \"./StereoXFeedbackEffect\";\nimport { NormalRange, Seconds, Time } from \"../core/type/Units\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { Delay } from \"../core/context/Delay\";\nimport { Signal } from \"../signal/Signal\";\nimport { readOnly } from \"../core/util/Interface\";\n\nexport interface PingPongDelayOptions extends StereoXFeedbackEffectOptions {\n\tdelayTime: Time;\n\tmaxDelay: Seconds;\n}\n\n/**\n * PingPongDelay is a feedback delay effect where the echo is heard\n * first in one channel and next in the opposite channel. In a stereo\n * system these are the right and left channels.\n * PingPongDelay in more simplified terms is two Tone.FeedbackDelays\n * with independent delay values. Each delay is routed to one channel\n * (left or right), and the channel triggered second will always\n * trigger at the same interval after the first.\n * @example\n * const pingPong = new Tone.PingPongDelay(\"4n\", 0.2).toDestination();\n * const drum = new Tone.MembraneSynth().connect(pingPong);\n * drum.triggerAttackRelease(\"C4\", \"32n\");\n * @category Effect\n */\nexport class PingPongDelay extends StereoXFeedbackEffect<PingPongDelayOptions> {\n\n\treadonly name: string = \"PingPongDelay\";\n\n\t/**\n\t * the delay node on the left side\n\t */\n\tprivate _leftDelay: Delay;\n\n\t/**\n\t * the delay node on the right side\n\t */\n\tprivate _rightDelay: Delay;\n\n\t/**\n\t * the predelay on the right side\n\t */\n\tprivate _rightPreDelay: Delay;\n\n\t/**\n\t * the delay time signal\n\t */\n\treadonly delayTime: Signal<\"time\">;\n\n\t/**\n\t * @param delayTime The delayTime between consecutive echos.\n\t * @param feedback The amount of the effected signal which is fed back through the delay.\n\t */\n\tconstructor(delayTime?: Time, feedback?: NormalRange);\n\tconstructor(options?: Partial<PingPongDelayOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(PingPongDelay.getDefaults(), arguments, [\"delayTime\", \"feedback\"]));\n\t\tconst options = optionsFromArguments(PingPongDelay.getDefaults(), arguments, [\"delayTime\", \"feedback\"]);\n\n\t\tthis._leftDelay = new Delay({\n\t\t\tcontext: this.context,\n\t\t\tmaxDelay: options.maxDelay,\n\t\t});\n\t\tthis._rightDelay = new Delay({\n\t\t\tcontext: this.context,\n\t\t\tmaxDelay: options.maxDelay\n\t\t});\n\t\tthis._rightPreDelay = new Delay({\n\t\t\tcontext: this.context,\n\t\t\tmaxDelay: options.maxDelay\n\t\t});\n\t\tthis.delayTime = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"time\",\n\t\t\tvalue: options.delayTime,\n\t\t});\n\n\t\t// connect it up\n\t\tthis.connectEffectLeft(this._leftDelay);\n\t\tthis.connectEffectRight(this._rightPreDelay, this._rightDelay);\n\t\tthis.delayTime.fan(this._leftDelay.delayTime, this._rightDelay.delayTime, this._rightPreDelay.delayTime);\n\t\t// rearranged the feedback to be after the rightPreDelay\n\t\tthis._feedbackL.disconnect();\n\t\tthis._feedbackL.connect(this._rightDelay);\n\t\treadOnly(this, [\"delayTime\"]);\n\t}\n\n\tstatic getDefaults(): PingPongDelayOptions {\n\t\treturn Object.assign(StereoXFeedbackEffect.getDefaults(), {\n\t\t\tdelayTime: 0.25,\n\t\t\tmaxDelay: 1\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._leftDelay.dispose();\n\t\tthis._rightDelay.dispose();\n\t\tthis._rightPreDelay.dispose();\n\t\tthis.delayTime.dispose();\n\t\treturn this;\n\t}\n}\n","import { Interval, Seconds, Time } from \"../core/type/Units\";\nimport { FeedbackEffect, FeedbackEffectOptions } from \"./FeedbackEffect\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { LFO } from \"../source/oscillator/LFO\";\nimport { Delay } from \"../core/context/Delay\";\nimport { CrossFade } from \"../component/channel/CrossFade\";\nimport { Signal } from \"../signal/Signal\";\nimport { readOnly } from \"../core/util/Interface\";\nimport { Param } from \"../core/context/Param\";\nimport { intervalToFrequencyRatio } from \"../core/type/Conversions\";\n\nexport interface PitchShiftOptions extends FeedbackEffectOptions {\n\tpitch: Interval;\n\twindowSize: Seconds;\n\tdelayTime: Time;\n}\n\n/**\n * PitchShift does near-realtime pitch shifting to the incoming signal.\n * The effect is achieved by speeding up or slowing down the delayTime\n * of a DelayNode using a sawtooth wave.\n * Algorithm found in [this pdf](http://dsp-book.narod.ru/soundproc.pdf).\n * Additional reference by [Miller Pucket](http://msp.ucsd.edu/techniques/v0.11/book-html/node115.html).\n * @category Effect\n */\nexport class PitchShift extends FeedbackEffect<PitchShiftOptions> {\n\n\treadonly name: string = \"PitchShift\";\n\n\t/**\n\t * The pitch signal\n\t */\n\tprivate _frequency: Signal<\"frequency\">;\n\n\t/**\n\t * Uses two DelayNodes to cover up the jump in the sawtooth wave.\n\t */\n\tprivate _delayA: Delay;\n\n\t/**\n\t * The first LFO.\n\t */\n\tprivate _lfoA: LFO;\n\n\t/**\n\t * The second DelayNode\n\t */\n\tprivate _delayB: Delay;\n\n\t/**\n\t * The second LFO.\n\t */\n\tprivate _lfoB: LFO;\n\n\t/**\n\t * Cross fade quickly between the two delay lines to cover up the jump in the sawtooth wave\n\t */\n\tprivate _crossFade: CrossFade;\n\n\t/**\n\t * LFO which alternates between the two delay lines to cover up the disparity in the\n\t * sawtooth wave.\n\t */\n\tprivate _crossFadeLFO: LFO;\n\n\t/**\n\t * The delay node\n\t */\n\tprivate _feedbackDelay: Delay;\n\n\t/**\n\t * The amount of delay on the input signal\n\t */\n\treadonly delayTime: Param<\"time\">;\n\n\t/**\n\t * Hold the current pitch\n\t */\n\tprivate _pitch: Interval;\n\n\t/**\n\t * Hold the current windowSize\n\t */\n\tprivate _windowSize;\n\n\t/**\n\t * @param pitch The interval to transpose the incoming signal by.\n\t */\n\tconstructor(pitch?: Interval);\n\tconstructor(options?: Partial<PitchShiftOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(PitchShift.getDefaults(), arguments, [\"pitch\"]));\n\t\tconst options = optionsFromArguments(PitchShift.getDefaults(), arguments, [\"pitch\"]);\n\n\t\tthis._frequency = new Signal({ context: this.context });\n\t\tthis._delayA = new Delay({\n\t\t\tmaxDelay: 1,\n\t\t\tcontext: this.context\n\t\t});\n\t\tthis._lfoA = new LFO({\n\t\t\tcontext: this.context,\n\t\t\tmin: 0,\n\t\t\tmax: 0.1,\n\t\t\ttype: \"sawtooth\"\n\t\t}).connect(this._delayA.delayTime);\n\t\tthis._delayB = new Delay({\n\t\t\tmaxDelay: 1,\n\t\t\tcontext: this.context\n\t\t});\n\t\tthis._lfoB = new LFO({\n\t\t\tcontext: this.context,\n\t\t\tmin: 0,\n\t\t\tmax: 0.1,\n\t\t\ttype: \"sawtooth\",\n\t\t\tphase: 180\n\t\t}).connect(this._delayB.delayTime);\n\t\tthis._crossFade = new CrossFade({ context: this.context });\n\t\tthis._crossFadeLFO = new LFO({\n\t\t\tcontext: this.context,\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t\ttype: \"triangle\",\n\t\t\tphase: 90\n\t\t}).connect(this._crossFade.fade);\n\t\tthis._feedbackDelay = new Delay({\n\t\t\tdelayTime: options.delayTime,\n\t\t\tcontext: this.context,\n\t\t});\n\t\tthis.delayTime = this._feedbackDelay.delayTime;\n\t\treadOnly(this, \"delayTime\");\n\t\tthis._pitch = options.pitch;\n\n\t\tthis._windowSize = options.windowSize;\n\n\t\t// connect the two delay lines up\n\t\tthis._delayA.connect(this._crossFade.a);\n\t\tthis._delayB.connect(this._crossFade.b);\n\t\t// connect the frequency\n\t\tthis._frequency.fan(this._lfoA.frequency, this._lfoB.frequency, this._crossFadeLFO.frequency);\n\t\t// route the input\n\t\tthis.effectSend.fan(this._delayA, this._delayB);\n\t\tthis._crossFade.chain(this._feedbackDelay, this.effectReturn);\n\t\t// start the LFOs at the same time\n\t\tconst now = this.now();\n\t\tthis._lfoA.start(now);\n\t\tthis._lfoB.start(now);\n\t\tthis._crossFadeLFO.start(now);\n\t\t// set the initial value\n\t\tthis.windowSize = this._windowSize;\n\t}\n\n\tstatic getDefaults(): PitchShiftOptions {\n\t\treturn Object.assign(FeedbackEffect.getDefaults(), {\n\t\t\tpitch: 0,\n\t\t\twindowSize: 0.1,\n\t\t\tdelayTime: 0,\n\t\t\tfeedback: 0\n\t\t});\n\t}\n\n\t/**\n\t * Repitch the incoming signal by some interval (measured in semi-tones).\n\t * @example\n\t * const pitchShift = new Tone.PitchShift().toDestination();\n\t * const osc = new Tone.Oscillator().connect(pitchShift).start().toDestination();\n\t * pitchShift.pitch = -12; // down one octave\n\t * pitchShift.pitch = 7; // up a fifth\n\t */\n\tget pitch() {\n\t\treturn this._pitch;\n\t}\n\tset pitch(interval) {\n\t\tthis._pitch = interval;\n\t\tlet factor = 0;\n\t\tif (interval < 0) {\n\t\t\tthis._lfoA.min = 0;\n\t\t\tthis._lfoA.max = this._windowSize;\n\t\t\tthis._lfoB.min = 0;\n\t\t\tthis._lfoB.max = this._windowSize;\n\t\t\tfactor = intervalToFrequencyRatio(interval - 1) + 1;\n\t\t} else {\n\t\t\tthis._lfoA.min = this._windowSize;\n\t\t\tthis._lfoA.max = 0;\n\t\t\tthis._lfoB.min = this._windowSize;\n\t\t\tthis._lfoB.max = 0;\n\t\t\tfactor = intervalToFrequencyRatio(interval) - 1;\n\t\t}\n\t\tthis._frequency.value = factor * (1.2 / this._windowSize);\n\t}\n\n\t/**\n\t * The window size corresponds roughly to the sample length in a looping sampler.\n\t * Smaller values are desirable for a less noticeable delay time of the pitch shifted\n\t * signal, but larger values will result in smoother pitch shifting for larger intervals.\n\t * A nominal range of 0.03 to 0.1 is recommended.\n\t */\n\tget windowSize(): Seconds {\n\t\treturn this._windowSize;\n\t}\n\tset windowSize(size) {\n\t\tthis._windowSize = this.toSeconds(size);\n\t\tthis.pitch = this._pitch;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._frequency.dispose();\n\t\tthis._delayA.dispose();\n\t\tthis._delayB.dispose();\n\t\tthis._lfoA.dispose();\n\t\tthis._lfoB.dispose();\n\t\tthis._crossFade.dispose();\n\t\tthis._crossFadeLFO.dispose();\n\t\tthis._feedbackDelay.dispose();\n\t\treturn this;\n\t}\n}\n","import { StereoEffect, StereoEffectOptions } from \"./StereoEffect\";\nimport { Frequency, Hertz, Positive } from \"../core/type/Units\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { LFO } from \"../source/oscillator/LFO\";\nimport { Signal } from \"../signal/Signal\";\nimport { readOnly } from \"../core/util/Interface\";\n\nexport interface PhaserOptions extends StereoEffectOptions {\n\tfrequency: Frequency;\n\toctaves: Positive;\n\tstages: Positive;\n\tQ: Positive;\n\tbaseFrequency: Frequency;\n}\n\n/**\n * Phaser is a phaser effect. Phasers work by changing the phase\n * of different frequency components of an incoming signal. Read more on\n * [Wikipedia](https://en.wikipedia.org/wiki/Phaser_(effect)).\n * Inspiration for this phaser comes from [Tuna.js](https://github.com/Dinahmoe/tuna/).\n * @example\n * const phaser = new Tone.Phaser({\n * \tfrequency: 15,\n * \toctaves: 5,\n * \tbaseFrequency: 1000\n * }).toDestination();\n * const synth = new Tone.FMSynth().connect(phaser);\n * synth.triggerAttackRelease(\"E3\", \"2n\");\n * @category Effect\n */\nexport class Phaser extends StereoEffect<PhaserOptions> {\n\n\treadonly name: string = \"Phaser\";\n\n\t/**\n\t * the lfo which controls the frequency on the left side\n\t */\n\tprivate _lfoL: LFO;\n\n\t/**\n\t * the lfo which controls the frequency on the right side\n\t */\n\tprivate _lfoR: LFO;\n\n\t/**\n\t * the base modulation frequency\n\t */\n\tprivate _baseFrequency: Hertz;\n\n\t/**\n\t * the octaves of the phasing\n\t */\n\tprivate _octaves: Positive;\n\n\t/**\n\t * The quality factor of the filters\n\t */\n\treadonly Q: Signal<\"positive\">;\n\n\t/**\n\t * the array of filters for the left side\n\t */\n\tprivate _filtersL: BiquadFilterNode[];\n\n\t/**\n\t * the array of filters for the left side\n\t */\n\tprivate _filtersR: BiquadFilterNode[];\n\n\t/**\n\t * the frequency of the effect\n\t */\n\treadonly frequency: Signal<\"frequency\">;\n\n\t/**\n\t * @param frequency The speed of the phasing.\n\t * @param octaves The octaves of the effect.\n\t * @param baseFrequency The base frequency of the filters.\n\t */\n\tconstructor(frequency?: Frequency, octaves?: Positive, baseFrequency?: Frequency);\n\tconstructor(options?: Partial<PhaserOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Phaser.getDefaults(), arguments, [\"frequency\", \"octaves\", \"baseFrequency\"]));\n\t\tconst options = optionsFromArguments(Phaser.getDefaults(), arguments, [\"frequency\", \"octaves\", \"baseFrequency\"]);\n\n\t\tthis._lfoL = new LFO({\n\t\t\tcontext: this.context,\n\t\t\tfrequency: options.frequency,\n\t\t\tmin: 0,\n\t\t\tmax: 1\n\t\t});\n\t\tthis._lfoR = new LFO({\n\t\t\tcontext: this.context,\n\t\t\tfrequency: options.frequency,\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t\tphase: 180,\n\t\t});\n\t\tthis._baseFrequency = this.toFrequency(options.baseFrequency);\n\t\tthis._octaves = options.octaves;\n\t\tthis.Q = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tvalue: options.Q,\n\t\t\tunits: \"positive\",\n\t\t});\n\t\tthis._filtersL = this._makeFilters(options.stages, this._lfoL);\n\t\tthis._filtersR = this._makeFilters(options.stages, this._lfoR);\n\n\t\tthis.frequency = this._lfoL.frequency;\n\t\tthis.frequency.value = options.frequency;\n\n\t\t// connect them up\n\t\tthis.connectEffectLeft(...this._filtersL);\n\t\tthis.connectEffectRight(...this._filtersR);\n\t\t// control the frequency with one LFO\n\t\tthis._lfoL.frequency.connect(this._lfoR.frequency);\n\t\t// set the options\n\t\tthis.baseFrequency = options.baseFrequency;\n\t\tthis.octaves = options.octaves;\n\t\t// start the lfo\n\t\tthis._lfoL.start();\n\t\tthis._lfoR.start();\n\t\treadOnly(this, [\"frequency\", \"Q\"]);\n\t}\n\n\tstatic getDefaults(): PhaserOptions {\n\t\treturn Object.assign(StereoEffect.getDefaults(), {\n\t\t\tfrequency: 0.5,\n\t\t\toctaves: 3,\n\t\t\tstages: 10,\n\t\t\tQ: 10,\n\t\t\tbaseFrequency: 350,\n\t\t});\n\t}\n\n\tprivate _makeFilters(stages: number, connectToFreq: LFO): BiquadFilterNode[] {\n\t\tconst filters: BiquadFilterNode[] = [];\n\t\t// make all the filters\n\t\tfor (let i = 0; i < stages; i++) {\n\t\t\tconst filter = this.context.createBiquadFilter();\n\t\t\tfilter.type = \"allpass\";\n\t\t\tthis.Q.connect(filter.Q);\n\t\t\tconnectToFreq.connect(filter.frequency);\n\t\t\tfilters.push(filter);\n\t\t}\n\t\treturn filters;\n\t}\n\n\t/**\n\t * The number of octaves the phase goes above the baseFrequency\n\t */\n\tget octaves() {\n\t\treturn this._octaves;\n\t}\n\tset octaves(octaves) {\n\t\tthis._octaves = octaves;\n\t\tconst max = this._baseFrequency * Math.pow(2, octaves);\n\t\tthis._lfoL.max = max;\n\t\tthis._lfoR.max = max;\n\t}\n\n\t/**\n\t * The the base frequency of the filters.\n\t */\n\tget baseFrequency(): Frequency {\n\t\treturn this._baseFrequency;\n\t}\n\tset baseFrequency(freq) {\n\t\tthis._baseFrequency = this.toFrequency(freq);\n\t\tthis._lfoL.min = this._baseFrequency;\n\t\tthis._lfoR.min = this._baseFrequency;\n\t\tthis.octaves = this._octaves;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.Q.dispose();\n\t\tthis._lfoL.dispose();\n\t\tthis._lfoR.dispose();\n\t\tthis._filtersL.forEach(f => f.disconnect());\n\t\tthis._filtersR.forEach(f => f.disconnect());\n\t\tthis.frequency.dispose();\n\t\treturn this;\n\t}\n}\n\n","import { Merge } from \"../component/channel/Merge\";\nimport { Gain } from \"../core/context/Gain\";\nimport { Seconds, Time } from \"../core/type/Units\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { Noise } from \"../source/Noise\";\nimport { Effect, EffectOptions } from \"./Effect\";\nimport { OfflineContext } from \"../core/context/OfflineContext\";\nimport { noOp } from \"../core/util/Interface\";\nimport { assertRange } from \"../core/util/Debug\";\n\ninterface ReverbOptions extends EffectOptions {\n\tdecay: Seconds;\n\tpreDelay: Seconds;\n}\n\n/**\n * Simple convolution created with decaying noise.\n * Generates an Impulse Response Buffer\n * with Tone.Offline then feeds the IR into ConvolverNode.\n * The impulse response generation is async, so you have\n * to wait until [[ready]] resolves before it will make a sound. \n *\n * Inspiration from [ReverbGen](https://github.com/adelespinasse/reverbGen).\n * Copyright (c) 2014 Alan deLespinasse Apache 2.0 License.\n * \n * @category Effect\n */\nexport class Reverb extends Effect<ReverbOptions> {\n\n\treadonly name: string = \"Reverb\";\n\n\t/**\n\t * Convolver node\n\t */\n\tprivate _convolver: ConvolverNode = this.context.createConvolver();\n\n\t/**\n\t * The duration of the reverb.\n\t */\n\tprivate _decay: Seconds;\n\t\n\t/**\n\t * The amount of time before the reverb is fully ramped in.\n\t */\n\tprivate _preDelay: Seconds;\n\n\t/**\n\t * Resolves when the reverb buffer is generated. Whenever either [[decay]]\n\t * or [[preDelay]] are set, you have to wait until [[ready]] resolves\n\t * before the IR is generated with the latest values. \n\t */\n\tready: Promise<void> = Promise.resolve();\n\n\t/**\n\t * @param decay The amount of time it will reverberate for.\n\t */\n\tconstructor(decay?: Seconds);\n\tconstructor(options?: Partial<ReverbOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Reverb.getDefaults(), arguments, [\"decay\"]));\n\t\tconst options = optionsFromArguments(Reverb.getDefaults(), arguments, [\"decay\"]);\n\n\t\tthis._decay = options.decay;\n\t\tthis._preDelay = options.preDelay;\n\t\tthis.generate();\n\n\t\tthis.connectEffect(this._convolver);\n\t}\n\n\tstatic getDefaults(): ReverbOptions {\n\t\treturn Object.assign(Effect.getDefaults(), {\n\t\t\tdecay: 1.5,\n\t\t\tpreDelay: 0.01,\n\t\t});\n\t}\n\n\t/**\n\t * The duration of the reverb.\n\t */\n\tget decay(): Time {\n\t\treturn this._decay;\n\t}\n\tset decay(time) {\n\t\ttime = this.toSeconds(time);\n\t\tassertRange(time, 0.001);\n\t\tthis._decay = time;\n\t\tthis.generate();\n\t}\n\n\t/**\n\t * The amount of time before the reverb is fully ramped in.\n\t */\n\tget preDelay(): Time {\n\t\treturn this._preDelay;\n\t}\n\tset preDelay(time) {\n\t\ttime = this.toSeconds(time);\n\t\tassertRange(time, 0);\n\t\tthis._preDelay = time;\n\t\tthis.generate();\n\t}\n\n\t/**\n\t * Generate the Impulse Response. Returns a promise while the IR is being generated.\n\t * @return Promise which returns this object.\n\t */\n\tasync generate(): Promise<this> {\n\t\tconst previousReady = this.ready;\n\n\t\t// create a noise burst which decays over the duration in each channel\n\t\tconst context = new OfflineContext(2, this._decay + this._preDelay, this.context.sampleRate);\n\t\tconst noiseL = new Noise({ context });\n\t\tconst noiseR = new Noise({ context });\n\t\tconst merge = new Merge({ context });\n\t\tnoiseL.connect(merge, 0, 0);\n\t\tnoiseR.connect(merge, 0, 1);\n\t\tconst gainNode = new Gain({ context }).toDestination();\n\t\tmerge.connect(gainNode);\n\t\tnoiseL.start(0);\n\t\tnoiseR.start(0);\n\t\t// predelay\n\t\tgainNode.gain.setValueAtTime(0, 0);\n\t\tgainNode.gain.setValueAtTime(1, this._preDelay);\n\t\t// decay\n\t\tgainNode.gain.exponentialApproachValueAtTime(0, this._preDelay, this.decay);\n\t\t\n\t\t// render the buffer\n\t\tconst renderPromise = context.render();\n\t\tthis.ready = renderPromise.then(noOp);\n\t\t\n\t\t// wait for the previous `ready` to resolve\n\t\tawait previousReady;\n\t\t// set the buffer\n\t\tthis._convolver.buffer = (await renderPromise).get() as AudioBuffer;\n\n\t\treturn this;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._convolver.disconnect();\n\t\treturn this;\n\t}\n}\n","import { ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { Split } from \"./Split\";\nimport { Add } from \"../../signal/Add\";\nimport { Multiply } from \"../../signal/Multiply\";\nimport { Subtract } from \"../../signal/Subtract\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\n\nexport type MidSideSplitOptions = ToneAudioNodeOptions;\n\n/**\n * Mid/Side processing separates the the 'mid' signal (which comes out of both the left and the right channel)\n * and the 'side' (which only comes out of the the side channels).\n * ```\n * Mid = (Left+Right)/sqrt(2); // obtain mid-signal from left and right\n * Side = (Left-Right)/sqrt(2); // obtain side-signal from left and right\n * ```\n * @category Component\n */\nexport class MidSideSplit extends ToneAudioNode<MidSideSplitOptions> {\n\t\n\treadonly name: string = \"MidSideSplit\";\n\n\treadonly input: Split;\n\n\t/**\n\t * There is no output node, use either [[mid]] or [[side]] outputs.\n\t */\n\treadonly output: undefined;\n\t/**\n\t * Split the incoming signal into left and right channels\n\t */\n\tprivate _split: Split;\n\n\t/**\n\t * Sums the left and right channels\n\t */\n\tprivate _midAdd: Add;\n\n\t/**\n\t * Subtract left and right channels. \n\t */\n\tprivate _sideSubtract: Subtract;\n\n\t/**\n\t * The \"mid\" output. `(Left+Right)/sqrt(2)`\n\t */\n\treadonly mid: ToneAudioNode;\n\n\t/**\n\t * The \"side\" output. `(Left-Right)/sqrt(2)`\n\t */\n\treadonly side: ToneAudioNode;\n\t\n\tconstructor(options?: Partial<MidSideSplitOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(MidSideSplit.getDefaults(), arguments));\n\n\t\tthis._split = this.input = new Split({\n\t\t\tchannels: 2,\n\t\t\tcontext: this.context\n\t\t});\n\t\tthis._midAdd = new Add({ context: this.context });\n\t\tthis.mid = new Multiply({\n\t\t\tcontext: this.context,\n\t\t\tvalue: Math.SQRT1_2,\n\t\t});\n\t\tthis._sideSubtract = new Subtract({ context: this.context });\n\t\tthis.side = new Multiply({\n\t\t\tcontext: this.context,\n\t\t\tvalue: Math.SQRT1_2,\n\t\t});\n\n\t\tthis._split.connect(this._midAdd, 0);\n\t\tthis._split.connect(this._midAdd.addend, 1);\n\t\tthis._split.connect(this._sideSubtract, 0);\n\t\tthis._split.connect(this._sideSubtract.subtrahend, 1);\n\t\tthis._midAdd.connect(this.mid);\n\t\tthis._sideSubtract.connect(this.side);\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.mid.dispose();\n\t\tthis.side.dispose();\n\t\tthis._midAdd.dispose();\n\t\tthis._sideSubtract.dispose();\n\t\tthis._split.dispose();\n\t\treturn this;\n\t}\n}\n","import { ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { Merge } from \"./Merge\";\nimport { Add } from \"../../signal/Add\";\nimport { Multiply } from \"../../signal/Multiply\";\nimport { Subtract } from \"../../signal/Subtract\";\nimport { Gain } from \"../../core/context/Gain\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\n\nexport type MidSideMergeOptions = ToneAudioNodeOptions;\n\n/**\n * MidSideMerge merges the mid and side signal after they've been separated by [[MidSideSplit]]\n * ```\n * Mid = (Left+Right)/sqrt(2); // obtain mid-signal from left and right\n * Side = (Left-Right)/sqrt(2); // obtain side-signal from left and right\n * ```\n * @category Component\n */\nexport class MidSideMerge extends ToneAudioNode<MidSideMergeOptions> {\n\t\n\treadonly name: string = \"MidSideMerge\";\n\n\t/**\n\t * There is no input, connect sources to either [[mid]] or [[side]] inputs.\n\t */\n\treadonly input: undefined;\n\n\t/**\n\t * The merged signal\n\t */\n\treadonly output: Merge;\n\n\t/**\n\t * Merge the incoming signal into left and right channels\n\t */\n\tprivate _merge: Merge;\n\n\t/**\n\t * The \"mid\" input.\n\t */\n\treadonly mid: ToneAudioNode;\n\n\t/**\n\t * The \"side\" input.\n\t */\n\treadonly side: ToneAudioNode;\n\n\t/**\n\t * Recombine the mid/side into Left\n\t */\n\tprivate _left: Add;\n\n\t/**\n\t * Recombine the mid/side into Right\n\t */\n\tprivate _right: Subtract;\n\n\t/**\n\t * Multiply the right by sqrt(1/2)\n\t */\n\tprivate _leftMult: Multiply;\n\n\t/**\n\t * Multiply the left by sqrt(1/2)\n\t */\n\tprivate _rightMult: Multiply;\n\t\n\tconstructor(options?: Partial<MidSideMergeOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(MidSideMerge.getDefaults(), arguments));\n\t\tthis.mid = new Gain({ context: this.context });\n\t\tthis.side = new Gain({ context: this.context });\n\t\tthis._left = new Add({ context: this.context });\n\t\tthis._leftMult = new Multiply({\n\t\t\tcontext: this.context, \n\t\t\tvalue: Math.SQRT1_2\n\t\t});\n\t\tthis._right = new Subtract({ context: this.context });\n\t\tthis._rightMult = new Multiply({\n\t\t\tcontext: this.context, \n\t\t\tvalue: Math.SQRT1_2\n\t\t});\n\t\tthis._merge = this.output = new Merge({ context: this.context });\n\n\t\tthis.mid.fan(this._left);\n\t\tthis.side.connect(this._left.addend);\n\t\tthis.mid.connect(this._right);\n\t\tthis.side.connect(this._right.subtrahend);\n\t\tthis._left.connect(this._leftMult);\n\t\tthis._right.connect(this._rightMult);\n\t\tthis._leftMult.connect(this._merge, 0, 0);\n\t\tthis._rightMult.connect(this._merge, 0, 1);\n\t}\n\t\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.mid.dispose();\n\t\tthis.side.dispose();\n\t\tthis._leftMult.dispose();\n\t\tthis._rightMult.dispose();\n\t\tthis._left.dispose();\n\t\tthis._right.dispose();\n\t\treturn this;\n\t}\n}\n","import { Effect, EffectOptions } from \"./Effect\";\nimport { MidSideSplit } from \"../component/channel/MidSideSplit\";\nimport { MidSideMerge } from \"../component/channel/MidSideMerge\";\nimport { OutputNode, ToneAudioNode } from \"../core/context/ToneAudioNode\";\n\nexport type MidSideEffectOptions = EffectOptions;\n\n/**\n * Mid/Side processing separates the the 'mid' signal\n * (which comes out of both the left and the right channel)\n * and the 'side' (which only comes out of the the side channels)\n * and effects them separately before being recombined.\n * Applies a Mid/Side seperation and recombination.\n * Algorithm found in [kvraudio forums](http://www.kvraudio.com/forum/viewtopic.php?t=212587).\n * This is a base-class for Mid/Side Effects.\n * @category Effect\n */\nexport abstract class MidSideEffect<Options extends MidSideEffectOptions> extends Effect<Options> {\n\n\treadonly name: string = \"MidSideEffect\";\n\n\t/**\n\t * The mid/side split\n\t */\n\tprivate _midSideSplit: MidSideSplit;\n\t\n\t/**\n\t * The mid/side merge\n\t */\n\tprivate _midSideMerge: MidSideMerge;\n\t\n\t/**\n\t * The mid send. Connect to mid processing\n\t */\n\tprotected _midSend: ToneAudioNode;\n\t\n\t/**\n\t * The side send. Connect to side processing\n\t */\n\tprotected _sideSend: ToneAudioNode;\n\t\n\t/**\n\t * The mid return connection\n\t */\n\tprotected _midReturn: ToneAudioNode;\n\t\n\t/**\n\t * The side return connection\n\t */\n\tprotected _sideReturn: ToneAudioNode;\n\n\tconstructor(options: MidSideEffectOptions) {\n\n\t\tsuper(options);\n\n\t\tthis._midSideMerge = new MidSideMerge({ context: this.context });\n\t\tthis._midSideSplit = new MidSideSplit({ context: this.context });\n\t\tthis._midSend = this._midSideSplit.mid;\n\t\tthis._sideSend = this._midSideSplit.side;\n\t\tthis._midReturn = this._midSideMerge.mid;\n\t\tthis._sideReturn = this._midSideMerge.side;\n\n\t\t// the connections\n\t\tthis.effectSend.connect(this._midSideSplit);\n\t\tthis._midSideMerge.connect(this.effectReturn);\n\t}\n\n\t/**\n\t * Connect the mid chain of the effect\n\t */\n\tprotected connectEffectMid(...nodes: OutputNode[]): void{\n\t\tthis._midSend.chain(...nodes, this._midReturn);\n\t}\n\t\n\t/**\n\t * Connect the side chain of the effect\n\t */\n\tprotected connectEffectSide(...nodes: OutputNode[]): void{\n\t\tthis._sideSend.chain(...nodes, this._sideReturn);\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._midSideSplit.dispose();\n\t\tthis._midSideMerge.dispose();\n\t\tthis._midSend.dispose();\n\t\tthis._sideSend.dispose();\n\t\tthis._midReturn.dispose();\n\t\tthis._sideReturn.dispose();\n\t\treturn this;\n\t}\n}\n\n","import { MidSideEffect, MidSideEffectOptions } from \"../effect/MidSideEffect\";\nimport { Signal } from \"../signal/Signal\";\nimport { Multiply } from \"../signal/Multiply\";\nimport { Subtract } from \"../signal/Subtract\";\nimport { NormalRange } from \"../core/type/Units\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { readOnly } from \"../core/util/Interface\";\nimport { connect } from \"../core/context/ToneAudioNode\";\n\nexport interface StereoWidenerOptions extends MidSideEffectOptions {\n\twidth: NormalRange;\n}\n\n/**\n * Applies a width factor to the mid/side seperation.\n * 0 is all mid and 1 is all side.\n * Algorithm found in [kvraudio forums](http://www.kvraudio.com/forum/viewtopic.php?t=212587).\n * ```\n * Mid *= 2*(1-width)<br>\n * Side *= 2*width\n * ```\n * @category Effect\n */\nexport class StereoWidener extends MidSideEffect<StereoWidenerOptions> {\n\n\treadonly name: string = \"StereoWidener\";\n\n\t/**\n\t * The width control. 0 = 100% mid. 1 = 100% side. 0.5 = no change.\n\t */\n\treadonly width: Signal<\"normalRange\">;\n\t\n\t/**\n\t * Two times the (1-width) for the mid channel\n\t */\n\tprivate _twoTimesWidthMid: Multiply;\n\t\n\t/**\n\t * Two times the width for the side channel\n\t */\n\tprivate _twoTimesWidthSide: Multiply;\n\t\n\t/**\n\t * Mid multiplier\n\t */\n\tprivate _midMult: Multiply;\n\t\n\t/**\n\t * 1 - width\n\t */\n\tprivate _oneMinusWidth: Subtract;\n\t\n\t/**\n\t * Side multiplier\n\t */\n\tprivate _sideMult: Multiply;\n\n\t/**\n\t * @param width The stereo width. A width of 0 is mono and 1 is stereo. 0.5 is no change.\n\t */\n\tconstructor(width?: NormalRange);\n\tconstructor(options?: Partial<StereoWidenerOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(StereoWidener.getDefaults(), arguments, [\"width\"]));\n\t\tconst options = optionsFromArguments(StereoWidener.getDefaults(), arguments, [\"width\"]);\n\t\tthis.width = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tvalue: options.width,\n\t\t\tunits: \"normalRange\",\n\t\t});\n\t\treadOnly(this, [\"width\"]);\n\t\tthis._twoTimesWidthMid = new Multiply({\n\t\t\tcontext: this.context,\n\t\t\tvalue: 2,\n\t\t});\n\t\tthis._twoTimesWidthSide = new Multiply({\n\t\t\tcontext: this.context,\n\t\t\tvalue: 2,\n\t\t});\n\t\tthis._midMult = new Multiply({ context: this.context });\n\t\tthis._twoTimesWidthMid.connect(this._midMult.factor);\n\t\tthis.connectEffectMid(this._midMult);\n\n\t\tthis._oneMinusWidth = new Subtract({ context: this.context });\n\t\tthis._oneMinusWidth.connect(this._twoTimesWidthMid);\n\t\tconnect(this.context.getConstant(1), this._oneMinusWidth);\n\t\tthis.width.connect(this._oneMinusWidth.subtrahend);\n\n\t\tthis._sideMult = new Multiply({ context: this.context });\n\t\tthis.width.connect(this._twoTimesWidthSide);\n\t\tthis._twoTimesWidthSide.connect(this._sideMult.factor);\n\t\tthis.connectEffectSide(this._sideMult);\n\t}\n\n\tstatic getDefaults(): StereoWidenerOptions {\n\t\treturn Object.assign(MidSideEffect.getDefaults(), {\n\t\t\twidth: 0.5,\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.width.dispose();\n\t\tthis._midMult.dispose();\n\t\tthis._sideMult.dispose();\n\t\tthis._twoTimesWidthMid.dispose();\n\t\tthis._twoTimesWidthSide.dispose();\n\t\tthis._oneMinusWidth.dispose();\n\t\treturn this;\n\t}\n}\n","import { StereoEffect, StereoEffectOptions } from \"./StereoEffect\";\nimport { LFO } from \"../source/oscillator/LFO\";\nimport { Gain } from \"../core/context/Gain\";\nimport { Signal } from \"../signal/Signal\";\nimport { Degrees, Frequency, NormalRange, Time } from \"../core/type/Units\";\nimport { ToneOscillatorType } from \"../source/oscillator/OscillatorInterface\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { readOnly } from \"../core/util/Interface\";\n\nexport interface TremoloOptions extends StereoEffectOptions {\n\tfrequency: Frequency;\n\ttype: ToneOscillatorType;\n\tdepth: NormalRange;\n\tspread: Degrees;\n}\n\n/**\n * Tremolo modulates the amplitude of an incoming signal using an [[LFO]].\n * The effect is a stereo effect where the modulation phase is inverted in each channel.\n *\n * @example\n * // create a tremolo and start it's LFO\n * const tremolo = new Tone.Tremolo(9, 0.75).toDestination().start();\n * // route an oscillator through the tremolo and start it\n * const oscillator = new Tone.Oscillator().connect(tremolo).start();\n * \n * @category Effect\n */\nexport class Tremolo extends StereoEffect<TremoloOptions> {\n\n\treadonly name: string = \"Tremolo\";\n\n\t/**\n\t * The tremolo LFO in the left channel\n\t */\n\tprivate _lfoL: LFO;\n\n\t/**\n\t * The tremolo LFO in the left channel\n\t */\n\tprivate _lfoR: LFO;\n\n\t/**\n\t * Where the gain is multiplied\n\t */\n\tprivate _amplitudeL: Gain;\n\n\t/**\n\t * Where the gain is multiplied\n\t */\n\tprivate _amplitudeR: Gain;\n\n\t/**\n\t * The frequency of the tremolo.\n\t */\n\treadonly frequency: Signal<\"frequency\">;\n\n\t/**\n\t * The depth of the effect. A depth of 0, has no effect\n\t * on the amplitude, and a depth of 1 makes the amplitude\n\t * modulate fully between 0 and 1.\n\t */\n\treadonly depth: Signal<\"normalRange\">;\n\n\t/**\n\t * @param frequency The rate of the effect.\n\t * @param depth The depth of the effect.\n\t */\n\tconstructor(frequency?: Frequency, depth?: NormalRange);\n\tconstructor(options?: Partial<TremoloOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Tremolo.getDefaults(), arguments, [\"frequency\", \"depth\"]));\n\t\tconst options = optionsFromArguments(Tremolo.getDefaults(), arguments, [\"frequency\", \"depth\"]);\n\n\t\tthis._lfoL = new LFO({\n\t\t\tcontext: this.context,\n\t\t\ttype: options.type,\n\t\t\tmin: 1,\n\t\t\tmax: 0,\n\t\t});\n\t\tthis._lfoR = new LFO({\n\t\t\tcontext: this.context,\n\t\t\ttype: options.type,\n\t\t\tmin: 1,\n\t\t\tmax: 0,\n\t\t});\n\t\tthis._amplitudeL = new Gain({ context: this.context });\n\t\tthis._amplitudeR = new Gain({ context: this.context });\n\t\tthis.frequency = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tvalue: options.frequency,\n\t\t\tunits: \"frequency\",\n\t\t});\n\t\tthis.depth = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tvalue: options.depth,\n\t\t\tunits: \"normalRange\",\n\t\t});\n\n\t\treadOnly(this, [\"frequency\", \"depth\"]);\n\t\tthis.connectEffectLeft(this._amplitudeL);\n\t\tthis.connectEffectRight(this._amplitudeR);\n\t\tthis._lfoL.connect(this._amplitudeL.gain);\n\t\tthis._lfoR.connect(this._amplitudeR.gain);\n\t\tthis.frequency.fan(this._lfoL.frequency, this._lfoR.frequency);\n\t\tthis.depth.fan(this._lfoR.amplitude, this._lfoL.amplitude);\n\t\tthis.spread = options.spread;\n\t}\n\n\tstatic getDefaults(): TremoloOptions {\n\t\treturn Object.assign(StereoEffect.getDefaults(), {\n\t\t\tfrequency: 10,\n\t\t\ttype: \"sine\" as \"sine\",\n\t\t\tdepth: 0.5,\n\t\t\tspread: 180,\n\t\t});\n\t}\n\n\t/**\n\t * Start the tremolo.\n\t */\n\tstart(time?: Time): this {\n\t\tthis._lfoL.start(time);\n\t\tthis._lfoR.start(time);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Stop the tremolo.\n\t */\n\tstop(time?: Time): this {\n\t\tthis._lfoL.stop(time);\n\t\tthis._lfoR.stop(time);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sync the effect to the transport.\n\t */\n\tsync(): this {\n\t\tthis._lfoL.sync();\n\t\tthis._lfoR.sync();\n\t\tthis.context.transport.syncSignal(this.frequency);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Unsync the filter from the transport\n\t */\n\tunsync(): this {\n\t\tthis._lfoL.unsync();\n\t\tthis._lfoR.unsync();\n\t\tthis.context.transport.unsyncSignal(this.frequency);\n\t\treturn this;\n\t}\n\n\t/**\n\t * The oscillator type.\n\t */\n\tget type(): ToneOscillatorType {\n\t\treturn this._lfoL.type;\n\t}\n\tset type(type) {\n\t\tthis._lfoL.type = type;\n\t\tthis._lfoR.type = type;\n\t}\n\n\t/**\n\t * Amount of stereo spread. When set to 0, both LFO's will be panned centrally.\n\t * When set to 180, LFO's will be panned hard left and right respectively.\n\t */\n\tget spread(): Degrees {\n\t\treturn this._lfoR.phase - this._lfoL.phase; // 180\n\t}\n\tset spread(spread) {\n\t\tthis._lfoL.phase = 90 - (spread / 2);\n\t\tthis._lfoR.phase = (spread / 2) + 90;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._lfoL.dispose();\n\t\tthis._lfoR.dispose();\n\t\tthis._amplitudeL.dispose();\n\t\tthis._amplitudeR.dispose();\n\t\tthis.frequency.dispose();\n\t\tthis.depth.dispose();\n\t\treturn this;\n\t}\n}\n","import { Effect, EffectOptions } from \"./Effect\";\nimport { ToneOscillatorType } from \"../source/oscillator/OscillatorInterface\";\nimport { Frequency, NormalRange, Seconds } from \"../core/type/Units\";\nimport { optionsFromArguments } from \"../core/util/Defaults\";\nimport { LFO } from \"../source/oscillator/LFO\";\nimport { Delay } from \"../core/context/Delay\";\nimport { Signal } from \"../signal/Signal\";\nimport { Param } from \"../core/context/Param\";\nimport { readOnly } from \"../core/util/Interface\";\n\nexport interface VibratoOptions extends EffectOptions {\n\tmaxDelay: Seconds;\n\tfrequency: Frequency;\n\tdepth: NormalRange;\n\ttype: ToneOscillatorType;\n}\n/**\n * A Vibrato effect composed of a Tone.Delay and a Tone.LFO. The LFO\n * modulates the delayTime of the delay, causing the pitch to rise and fall. \n * @category Effect\n */\nexport class Vibrato extends Effect<VibratoOptions> {\n\n\treadonly name: string = \"Vibrato\";\n\t/**\n\t * The delay node used for the vibrato effect\n\t */\n\tprivate _delayNode: Delay;\n\t\n\t/**\n\t * The LFO used to control the vibrato\n\t */\n\tprivate _lfo: LFO;\n\t\n\t/**\n\t * The frequency of the vibrato\n\t */\n\treadonly frequency: Signal<\"frequency\">;\n\t\n\t/**\n\t * The depth of the vibrato. \n\t */\n\treadonly depth: Param<\"normalRange\">;\n\n\t/**\n\t * @param frequency The frequency of the vibrato.\n\t * @param depth The amount the pitch is modulated.\n\t */\n\tconstructor(frequency?: Frequency, depth?: NormalRange);\n\tconstructor(options?: Partial<VibratoOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Vibrato.getDefaults(), arguments, [\"frequency\", \"depth\"]));\n\t\tconst options = optionsFromArguments(Vibrato.getDefaults(), arguments, [\"frequency\", \"depth\"]);\n\n\t\tthis._delayNode = new Delay({\n\t\t\tcontext: this.context,\n\t\t\tdelayTime: 0,\n\t\t\tmaxDelay: options.maxDelay,\n\t\t});\n\t\tthis._lfo = new LFO({\n\t\t\tcontext: this.context,\n\t\t\ttype: options.type,\n\t\t\tmin: 0,\n\t\t\tmax: options.maxDelay, \n\t\t\tfrequency: options.frequency,\n\t\t\tphase: -90 // offse the phase so the resting position is in the center\n\t\t}).start().connect(this._delayNode.delayTime);\n\t\tthis.frequency = this._lfo.frequency;\n\t\tthis.depth = this._lfo.amplitude;\n\n\t\tthis.depth.value = options.depth;\n\t\treadOnly(this, [\"frequency\", \"depth\"]);\n\t\tthis.effectSend.chain(this._delayNode, this.effectReturn);\n\t}\n\n\tstatic getDefaults(): VibratoOptions {\n\t\treturn Object.assign(Effect.getDefaults(), {\n\t\t\tmaxDelay: 0.005,\n\t\t\tfrequency: 5,\n\t\t\tdepth: 0.1,\n\t\t\ttype: \"sine\" as \"sine\"\n\t\t});\n\t}\n\n\t/**\n\t * Type of oscillator attached to the Vibrato.\n\t */\n\tget type(): ToneOscillatorType {\n\t\treturn this._lfo.type;\n\t}\n\tset type(type) {\n\t\tthis._lfo.type = type;\n\t}\n\t\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._delayNode.dispose();\n\t\tthis._lfo.dispose();\n\t\tthis.frequency.dispose();\n\t\tthis.depth.dispose();\n\t\treturn this;\n\t}\n}\n","import { InputNode, OutputNode, ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { NormalRange, PowerOfTwo } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { Split } from \"../channel/Split\";\nimport { Gain } from \"../../core/context/Gain\";\nimport { assert, assertRange } from \"../../core/util/Debug\";\n\nexport type AnalyserType = \"fft\" | \"waveform\";\n\nexport interface AnalyserOptions extends ToneAudioNodeOptions {\n\tsize: PowerOfTwo;\n\ttype: AnalyserType;\n\tsmoothing: NormalRange;\n\tchannels: number;\n}\n\n/**\n * Wrapper around the native Web Audio's [AnalyserNode](http://webaudio.github.io/web-audio-api/#idl-def-AnalyserNode).\n * Extracts FFT or Waveform data from the incoming signal.\n * @category Component\n */\nexport class Analyser extends ToneAudioNode<AnalyserOptions> {\n\n\treadonly name: string = \"Analyser\";\n\n\treadonly input: InputNode;\n\treadonly output: OutputNode;\n\n\t/**\n\t * The analyser node.\n\t */\n\tprivate _analysers: AnalyserNode[] = [];\n\n\t/**\n\t * Input and output are a gain node\n\t */\n\tprivate _gain: Gain;\n\n\t/**\n\t * The channel splitter node\n\t */\n\tprivate _split: Split;\n\n\t/**\n\t * The analysis type\n\t */\n\tprivate _type!: AnalyserType;\n\n\t/**\n\t * The buffer that the FFT data is written to\n\t */\n\tprivate _buffers: Float32Array[] = [];\n\n\t/**\n\t * @param type The return type of the analysis, either \"fft\", or \"waveform\".\n\t * @param size The size of the FFT. This must be a power of two in the range 16 to 16384.\n\t */\n\tconstructor(type?: AnalyserType, size?: number);\n\tconstructor(options?: Partial<AnalyserOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(Analyser.getDefaults(), arguments, [\"type\", \"size\"]));\n\t\tconst options = optionsFromArguments(Analyser.getDefaults(), arguments, [\"type\", \"size\"]);\n\n\t\tthis.input = this.output = this._gain = new Gain({ context: this.context });\n\t\tthis._split = new Split({\n\t\t\tcontext: this.context,\n\t\t\tchannels: options.channels,\n\t\t});\n\t\tthis.input.connect(this._split);\n\t\t\n\t\tassertRange(options.channels, 1);\n\t\t\n\t\t// create the analysers\n\t\tfor (let channel = 0; channel < options.channels; channel++) {\n\t\t\tthis._analysers[channel] = this.context.createAnalyser();\n\t\t\tthis._split.connect(this._analysers[channel], channel, 0);\n\t\t}\n\n\t\t// set the values initially\n\t\tthis.size = options.size;\n\t\tthis.type = options.type;\n\t}\n\n\tstatic getDefaults(): AnalyserOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tsize: 1024,\n\t\t\tsmoothing: 0.8,\n\t\t\ttype: \"fft\" as AnalyserType,\n\t\t\tchannels: 1,\n\t\t});\n\t}\n\n\t/**\n\t * Run the analysis given the current settings. If [[channels]] = 1,\n\t * it will return a Float32Array. If [[channels]] > 1, it will\n\t * return an array of Float32Arrays where each index in the array\n\t * represents the analysis done on a channel.\n\t */\n\tgetValue(): Float32Array | Float32Array[] {\n\t\tthis._analysers.forEach((analyser, index) => {\n\t\t\tconst buffer = this._buffers[index];\n\t\t\tif (this._type === \"fft\") {\n\t\t\t\tanalyser.getFloatFrequencyData(buffer);\n\t\t\t} else if (this._type === \"waveform\") {\n\t\t\t\tanalyser.getFloatTimeDomainData(buffer);\n\t\t\t}\n\t\t});\n\t\tif (this.channels === 1) {\n\t\t\treturn this._buffers[0];\n\t\t} else {\n\t\t\treturn this._buffers;\n\t\t}\n\t}\n\n\t/**\n\t * The size of analysis. This must be a power of two in the range 16 to 16384.\n\t */\n\tget size(): PowerOfTwo {\n\t\treturn this._analysers[0].frequencyBinCount;\n\t}\n\tset size(size: PowerOfTwo) {\n\t\tthis._analysers.forEach((analyser, index) => {\n\t\t\tanalyser.fftSize = size * 2;\n\t\t\tthis._buffers[index] = new Float32Array(size);\n\t\t});\n\t}\n\n\t/**\n\t * The number of channels the analyser does the analysis on. Channel\n\t * separation is done using [[Split]]\n\t */\n\tget channels(): number {\n\t\treturn this._analysers.length;\n\t}\n\n\t/**\n\t * The analysis function returned by analyser.getValue(), either \"fft\" or \"waveform\".\n\t */\n\tget type(): AnalyserType {\n\t\treturn this._type;\n\t}\n\tset type(type: AnalyserType) {\n\t\tassert(type === \"waveform\" || type === \"fft\", `Analyser: invalid type: ${type}`);\n\t\tthis._type = type;\n\t}\n\n\t/**\n\t * 0 represents no time averaging with the last analysis frame.\n\t */\n\tget smoothing(): NormalRange {\n\t\treturn this._analysers[0].smoothingTimeConstant;\n\t}\n\tset smoothing(val: NormalRange) {\n\t\tthis._analysers.forEach(a => a.smoothingTimeConstant = val);\n\t}\n\n\t/**\n\t * Clean up.\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._analysers.forEach(a => a.disconnect());\n\t\tthis._split.dispose();\n\t\tthis._gain.dispose();\n\t\treturn this;\n\t}\n}\n","import { InputNode, OutputNode, ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { Analyser } from \"./Analyser\";\n\nexport type MeterBaseOptions = ToneAudioNodeOptions;\n\n/**\n * The base class for Metering classes.\n */\nexport class MeterBase<Options extends MeterBaseOptions> extends ToneAudioNode<Options> {\n\n\treadonly name: string = \"MeterBase\";\n\n\t/**\n\t * The signal to be analysed\n\t */\n\tinput: InputNode;\n\n\t/**\n\t * The output is just a pass through of the input\n\t */\n\toutput: OutputNode;\n\n\t/**\n\t * The analyser node for the incoming signal\n\t */\n\tprotected _analyser: Analyser;\n\n\tconstructor(options?: Partial<MeterBaseOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(MeterBase.getDefaults(), arguments));\n\n\t\tthis.input = this.output = this._analyser = new Analyser({\n\t\t\tcontext: this.context,\n\t\t\tsize: 256,\n\t\t\ttype: \"waveform\",\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._analyser.dispose();\n\t\treturn this;\n\t}\n}\n","import { gainToDb } from \"../../core/type/Conversions\";\nimport { NormalRange } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { MeterBase, MeterBaseOptions } from \"./MeterBase\";\nimport { warn } from \"../../core/util/Debug\";\nimport { Analyser } from \"./Analyser\";\n\nexport interface MeterOptions extends MeterBaseOptions {\n\tsmoothing: NormalRange;\n\tnormalRange: boolean;\n\tchannels: number;\n}\n\n/**\n * Meter gets the [RMS](https://en.wikipedia.org/wiki/Root_mean_square)\n * of an input signal. It can also get the raw value of the input signal.\n *\n * @example\n * const meter = new Tone.Meter();\n * const mic = new Tone.UserMedia();\n * mic.open();\n * // connect mic to the meter\n * mic.connect(meter);\n * // the current level of the mic\n * setInterval(() => console.log(meter.getValue()), 100);\n * @category Component\n */\nexport class Meter extends MeterBase<MeterOptions> {\n\n\treadonly name: string = \"Meter\";\n\n\t/**\n\t * If the output should be in decibels or normal range between 0-1. If `normalRange` is false,\n\t * the output range will be the measured decibel value, otherwise the decibel value will be converted to\n\t * the range of 0-1\n\t */\n\tnormalRange: boolean;\n\n\t/**\n\t * A value from between 0 and 1 where 0 represents no time averaging with the last analysis frame.\n\t */\n\tsmoothing: number;\n\n\t/**\n\t * The previous frame's value\n\t */\n\tprivate _rms = 0;\n\n\t/**\n\t * @param smoothing The amount of smoothing applied between frames.\n\t */\n\tconstructor(smoothing?: NormalRange);\n\tconstructor(options?: Partial<MeterOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(Meter.getDefaults(), arguments, [\"smoothing\"]));\n\t\tconst options = optionsFromArguments(Meter.getDefaults(), arguments, [\"smoothing\"]);\n\n\t\tthis.input = this.output = this._analyser = new Analyser({\n\t\t\tcontext: this.context,\n\t\t\tsize: 256,\n\t\t\ttype: \"waveform\",\n\t\t\tchannels: options.channels,\n\t\t});\n\n\t\tthis.smoothing = options.smoothing,\n\t\tthis.normalRange = options.normalRange;\n\t}\n\n\tstatic getDefaults(): MeterOptions {\n\t\treturn Object.assign(MeterBase.getDefaults(), {\n\t\t\tsmoothing: 0.8,\n\t\t\tnormalRange: false,\n\t\t\tchannels: 1,\n\t\t});\n\t}\n\n\t/**\n\t * Use [[getValue]] instead. For the previous getValue behavior, use DCMeter.\n\t * @deprecated\n\t */\n\tgetLevel(): number | number[] {\n\t\twarn(\"'getLevel' has been changed to 'getValue'\");\n\t\treturn this.getValue();\n\t}\n\n\t/**\n\t * Get the current value of the incoming signal. \n\t * Output is in decibels when [[normalRange]] is `false`.\n\t * If [[channels]] = 1, then the output is a single number\n\t * representing the value of the input signal. When [[channels]] > 1,\n\t * then each channel is returned as a value in a number array. \n\t */\n\tgetValue(): number | number[] {\n\t\tconst aValues = this._analyser.getValue();\n\t\tconst channelValues = this.channels === 1 ? [aValues as Float32Array] : aValues as Float32Array[];\n\t\tconst vals = channelValues.map(values => {\n\t\t\tconst totalSquared = values.reduce((total, current) => total + current * current, 0);\n\t\t\tconst rms = Math.sqrt(totalSquared / values.length);\n\t\t\t// the rms can only fall at the rate of the smoothing\n\t\t\t// but can jump up instantly\n\t\t\tthis._rms = Math.max(rms, this._rms * this.smoothing);\n\t\t\treturn this.normalRange ? this._rms : gainToDb(this._rms);\n\t\t});\n\t\tif (this.channels === 1) {\n\t\t\treturn vals[0];\n\t\t} else {\n\t\t\treturn vals;\n\t\t}\n\t}\n\n\t/**\n\t * The number of channels of analysis.\n\t */\n\tget channels(): number {\n\t\treturn this._analyser.channels;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._analyser.dispose();\n\t\treturn this;\n\t}\n}\n","import { ToneAudioNode } from \"../../core/context/ToneAudioNode\";\nimport { dbToGain } from \"../../core/type/Conversions\";\nimport { Hertz, NormalRange, PowerOfTwo } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { MeterBase, MeterBaseOptions } from \"./MeterBase\";\nimport { assert } from \"../../core/util/Debug\";\n\nexport interface FFTOptions extends MeterBaseOptions {\n\tsize: PowerOfTwo;\n\tsmoothing: NormalRange;\n\tnormalRange: boolean;\n}\n\n/**\n * Get the current frequency data of the connected audio source using a fast Fourier transform.\n * @category Component\n */\nexport class FFT extends MeterBase<FFTOptions> {\n\n\treadonly name: string = \"FFT\";\n\n\t/**\n\t * If the output should be in decibels or normal range between 0-1. If `normalRange` is false,\n\t * the output range will be the measured decibel value, otherwise the decibel value will be converted to\n\t * the range of 0-1\n\t */\n\tnormalRange: boolean;\n\n\t/**\n\t * @param size The size of the FFT. Value must be a power of two in the range 16 to 16384.\n\t */\n\tconstructor(size?: PowerOfTwo);\n\tconstructor(options?: Partial<FFTOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(FFT.getDefaults(), arguments, [\"size\"]));\n\t\tconst options = optionsFromArguments(FFT.getDefaults(), arguments, [\"size\"]);\n\n\t\tthis.normalRange = options.normalRange;\n\t\tthis._analyser.type = \"fft\";\n\t\tthis.size = options.size;\n\t}\n\n\tstatic getDefaults(): FFTOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tnormalRange: false,\n\t\t\tsize: 1024,\n\t\t\tsmoothing: 0.8,\n\t\t});\n\t}\n\n\t/**\n\t * Gets the current frequency data from the connected audio source.\n\t * Returns the frequency data of length [[size]] as a Float32Array of decibel values.\n\t */\n\tgetValue(): Float32Array {\n\t\tconst values = this._analyser.getValue() as Float32Array;\n\t\treturn values.map(v => this.normalRange ? dbToGain(v) : v);\n\t}\n\n\t/**\n\t * The size of analysis. This must be a power of two in the range 16 to 16384.\n\t * Determines the size of the array returned by [[getValue]] (i.e. the number of\n\t * frequency bins). Large FFT sizes may be costly to compute.\n\t */\n\tget size(): PowerOfTwo {\n\t\treturn this._analyser.size;\n\t}\n\tset size(size) {\n\t\tthis._analyser.size = size;\n\t}\n\n\t/**\n\t * 0 represents no time averaging with the last analysis frame.\n\t */\n\tget smoothing(): NormalRange {\n\t\treturn this._analyser.smoothing;\n\t}\n\tset smoothing(val) {\n\t\tthis._analyser.smoothing = val;\n\t}\n\n\t/**\n\t * Returns the frequency value in hertz of each of the indices of the FFT's [[getValue]] response.\n\t * @example\n\t * const fft = new Tone.FFT(32);\n\t * console.log([0, 1, 2, 3, 4].map(index => fft.getFrequencyOfIndex(index)));\n\t */\n\tgetFrequencyOfIndex(index: number): Hertz {\n\t\tassert(0 <= index && index < this.size, `index must be greater than or equal to 0 and less than ${this.size}`);\n\t\treturn index * this.context.sampleRate / (this.size * 2);\n\t}\n}\n","import { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { MeterBase, MeterBaseOptions } from \"./MeterBase\";\n\nexport type DCMeterOptions = MeterBaseOptions;\n\n/**\n * DCMeter gets the raw value of the input signal at the current time.\n *\n * @example\n * const meter = new Tone.DCMeter();\n * const mic = new Tone.UserMedia();\n * mic.open();\n * // connect mic to the meter\n * mic.connect(meter);\n * // the current level of the mic\n * const level = meter.getValue();\n * @category Component\n */\nexport class DCMeter extends MeterBase<DCMeterOptions> {\n\n\treadonly name: string = \"DCMeter\";\n\n\tconstructor(options?: Partial<DCMeterOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(DCMeter.getDefaults(), arguments));\n\n\t\tthis._analyser.type = \"waveform\";\n\t\tthis._analyser.size = 256;\n\t}\n\n\t/**\n\t * Get the signal value of the incoming signal\n\t */\n\tgetValue(): number {\n\t\tconst value = this._analyser.getValue() as Float32Array;\n\t\treturn value[0];\n\t}\n}\n","import { PowerOfTwo } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { MeterBase, MeterBaseOptions } from \"./MeterBase\";\n\nexport interface WaveformOptions extends MeterBaseOptions {\n\t/**\n\t * The size of the Waveform. Value must be a power of two in the range 16 to 16384.\n\t */\n\tsize: PowerOfTwo;\n}\n\n/**\n * Get the current waveform data of the connected audio source.\n * @category Component\n */\nexport class Waveform extends MeterBase<WaveformOptions> {\n\n\treadonly name: string = \"Waveform\";\n\n\t/**\n\t * @param size The size of the Waveform. Value must be a power of two in the range 16 to 16384.\n\t */\n\tconstructor(size?: PowerOfTwo);\n\tconstructor(options?: Partial<WaveformOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(Waveform.getDefaults(), arguments, [\"size\"]));\n\t\tconst options = optionsFromArguments(Waveform.getDefaults(), arguments, [\"size\"]);\n\n\t\tthis._analyser.type = \"waveform\";\n\t\tthis.size = options.size;\n\t}\n\n\tstatic getDefaults(): WaveformOptions {\n\t\treturn Object.assign(MeterBase.getDefaults(), {\n\t\t\tsize: 1024,\n\t\t});\n\t}\n\n\t/**\n\t * Return the waveform for the current time as a Float32Array where each value in the array\n\t * represents a sample in the waveform.\n\t */\n\tgetValue(): Float32Array {\n\t\treturn this._analyser.getValue() as Float32Array;\n\t}\n\n\t/**\n\t * The size of analysis. This must be a power of two in the range 16 to 16384.\n\t * Determines the size of the array returned by [[getValue]].\n\t */\n\tget size(): PowerOfTwo {\n\t\treturn this._analyser.size;\n\t}\n\tset size(size) {\n\t\tthis._analyser.size = size;\n\t}\n}\n","import { BaseContext } from \"../../core/context/BaseContext\";\nimport { Gain } from \"../../core/context/Gain\";\nimport { ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\n\nexport interface SoloOptions extends ToneAudioNodeOptions {\n\tsolo: boolean;\n}\n\n/**\n * Solo lets you isolate a specific audio stream. When an instance is set to `solo=true`,\n * it will mute all other instances of Solo.\n * @example\n * const soloA = new Tone.Solo().toDestination();\n * const oscA = new Tone.Oscillator(\"C4\", \"sawtooth\").connect(soloA);\n * const soloB = new Tone.Solo().toDestination();\n * const oscB = new Tone.Oscillator(\"E4\", \"square\").connect(soloB);\n * soloA.solo = true;\n * // no audio will pass through soloB\n * @category Component\n */\nexport class Solo extends ToneAudioNode<SoloOptions> {\n\n\treadonly name: string = \"Solo\";\n\n\treadonly input: Gain;\n\treadonly output: Gain;\n\n\t/**\n\t * @param solo If the connection should be initially solo'ed.\n\t */\n\tconstructor(solo?: boolean);\n\tconstructor(options?: Partial<SoloOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Solo.getDefaults(), arguments, [\"solo\"]));\n\t\tconst options = optionsFromArguments(Solo.getDefaults(), arguments, [\"solo\"]);\n\n\t\tthis.input = this.output = new Gain({\n\t\t\tcontext: this.context,\n\t\t});\n\n\t\tif (!Solo._allSolos.has(this.context)) {\n\t\t\tSolo._allSolos.set(this.context, new Set());\n\t\t}\n\t\t(Solo._allSolos.get(this.context) as Set<Solo>).add(this);\n\n\t\t// set initially\n\t\tthis.solo = options.solo;\n\t}\n\n\tstatic getDefaults(): SoloOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tsolo: false,\n\t\t});\n\t}\n\n\t/**\n\t * Hold all of the solo'ed tracks belonging to a specific context\n\t */\n\tprivate static _allSolos: Map<BaseContext, Set<Solo>> = new Map();\n\n\t/**\n\t * Hold the currently solo'ed instance(s)\n\t */\n\tprivate static _soloed: Map<BaseContext, Set<Solo>> = new Map();\n\n\t/**\n\t * Isolates this instance and mutes all other instances of Solo.\n\t * Only one instance can be soloed at a time. A soloed\n\t * instance will report `solo=false` when another instance is soloed.\n\t */\n\tget solo(): boolean {\n\t\treturn this._isSoloed();\n\t}\n\tset solo(solo) {\n\t\tif (solo) {\n\t\t\tthis._addSolo();\n\t\t} else {\n\t\t\tthis._removeSolo();\n\t\t}\n\t\t(Solo._allSolos.get(this.context) as Set<Solo>).forEach(instance => instance._updateSolo());\n\t}\n\n\t/**\n\t * If the current instance is muted, i.e. another instance is soloed\n\t */\n\tget muted(): boolean {\n\t\treturn this.input.gain.value === 0;\n\t}\n\n\t/**\n\t * Add this to the soloed array\n\t */\n\tprivate _addSolo(): void {\n\t\tif (!Solo._soloed.has(this.context)) {\n\t\t\tSolo._soloed.set(this.context, new Set());\n\t\t}\n\t\t(Solo._soloed.get(this.context) as Set<Solo>).add(this);\n\t}\n\n\t/**\n\t * Remove this from the soloed array\n\t */\n\tprivate _removeSolo(): void {\n\t\tif (Solo._soloed.has(this.context)) {\n\t\t\t(Solo._soloed.get(this.context) as Set<Solo>).delete(this);\n\t\t}\n\t}\n\n\t/**\n\t * Is this on the soloed array\n\t */\n\tprivate _isSoloed(): boolean {\n\t\treturn Solo._soloed.has(this.context) && (Solo._soloed.get(this.context) as Set<Solo>).has(this);\n\t}\n\n\t/**\n\t * Returns true if no one is soloed\n\t */\n\tprivate _noSolos(): boolean {\n\t\t// either does not have any soloed added\n\t\treturn !Solo._soloed.has(this.context) ||\n\t\t\t// or has a solo set but doesn't include any items\n\t\t\t(Solo._soloed.has(this.context) && (Solo._soloed.get(this.context) as Set<Solo>).size === 0);\n\t}\n\n\t/**\n\t * Solo the current instance and unsolo all other instances.\n\t */\n\tprivate _updateSolo(): void {\n\t\tif (this._isSoloed()) {\n\t\t\tthis.input.gain.value = 1;\n\t\t} else if (this._noSolos()) {\n\t\t\t// no one is soloed\n\t\t\tthis.input.gain.value = 1;\n\t\t} else {\n\t\t\tthis.input.gain.value = 0;\n\t\t}\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\t(Solo._allSolos.get(this.context) as Set<Solo>).delete(this);\n\t\tthis._removeSolo();\n\t\treturn this;\n\t}\n}\n","import { readOnly } from \"../../core/util/Interface\";\nimport { Param } from \"../../core/context/Param\";\nimport { InputNode, OutputNode, ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { AudioRange, Decibels } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { Panner } from \"./Panner\";\nimport { Volume } from \"./Volume\";\n\nexport interface PanVolOptions extends ToneAudioNodeOptions {\n\tpan: AudioRange;\n\tvolume: Decibels;\n\tmute: boolean;\n\tchannelCount: number;\n}\n\n/**\n * PanVol is a Tone.Panner and Tone.Volume in one.\n * @example\n * // pan the incoming signal left and drop the volume\n * const panVol = new Tone.PanVol(-0.25, -12).toDestination();\n * const osc = new Tone.Oscillator().connect(panVol).start();\n * @category Component\n */\nexport class PanVol extends ToneAudioNode<PanVolOptions> {\n\n\treadonly name: string = \"PanVol\";\n\n\treadonly input: InputNode;\n\treadonly output: OutputNode;\n\n\t/**\n\t * The panning node\n\t */\n\tprivate _panner: Panner;\n\n\t/**\n\t * The L/R panning control. -1 = hard left, 1 = hard right.\n\t * @min -1\n\t * @max 1\n\t */\n\treadonly pan: Param<\"audioRange\">;\n\n\t/**\n\t * The volume node\n\t */\n\tprivate _volume: Volume;\n\n\t/**\n\t * The volume control in decibels.\n\t */\n\treadonly volume: Param<\"decibels\">;\n\n\t/**\n\t * @param pan the initial pan\n\t * @param volume The output volume.\n\t */\n\tconstructor(pan?: AudioRange, volume?: Decibels);\n\tconstructor(options?: Partial<PanVolOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(PanVol.getDefaults(), arguments, [\"pan\", \"volume\"]));\n\t\tconst options = optionsFromArguments(PanVol.getDefaults(), arguments, [\"pan\", \"volume\"]);\n\n\t\tthis._panner = this.input = new Panner({\n\t\t\tcontext: this.context,\n\t\t\tpan: options.pan,\n\t\t\tchannelCount: options.channelCount,\n\t\t});\n\t\tthis.pan = this._panner.pan;\n\t\tthis._volume = this.output = new Volume({\n\t\t\tcontext: this.context,\n\t\t\tvolume: options.volume,\n\t\t});\n\t\tthis.volume = this._volume.volume;\n\n\t\t// connections\n\t\tthis._panner.connect(this._volume);\n\t\tthis.mute = options.mute;\n\n\t\treadOnly(this, [\"pan\", \"volume\"]);\n\t}\n\n\tstatic getDefaults(): PanVolOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tmute: false,\n\t\t\tpan: 0,\n\t\t\tvolume: 0,\n\t\t\tchannelCount: 1,\n\t\t});\n\t}\n\n\t/**\n\t * Mute/unmute the volume\n\t */\n\tget mute(): boolean {\n\t\treturn this._volume.mute;\n\t}\n\tset mute(mute) {\n\t\tthis._volume.mute = mute;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._panner.dispose();\n\t\tthis.pan.dispose();\n\t\tthis._volume.dispose();\n\t\tthis.volume.dispose();\n\t\treturn this;\n\t}\n}\n","import { AudioRange, Decibels } from \"../../core/type/Units\";\nimport { InputNode, OutputNode, ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { Solo } from \"./Solo\";\nimport { PanVol } from \"./PanVol\";\nimport { Param } from \"../../core/context/Param\";\nimport { readOnly } from \"../../core/util/Interface\";\nimport { Gain } from \"../../core/context/Gain\";\n\nexport interface ChannelOptions extends ToneAudioNodeOptions {\n\tpan: AudioRange;\n\tvolume: Decibels;\n\tsolo: boolean;\n\tmute: boolean;\n\tchannelCount: number;\n}\n\n/**\n * Channel provides a channel strip interface with volume, pan, solo and mute controls. \n * See [[PanVol]] and [[Solo]]\n * @example\n * // pan the incoming signal left and drop the volume 12db\n * const channel = new Tone.Channel(-0.25, -12);\n * @category Component\n */\nexport class Channel extends ToneAudioNode<ChannelOptions> {\n\n\treadonly name: string = \"Channel\";\n\n\treadonly input: InputNode;\n\treadonly output: OutputNode;\n\n\t/**\n\t * The soloing interface\n\t */\n\tprivate _solo: Solo;\n\n\t/**\n\t * The panning and volume node\n\t */\n\tprivate _panVol: PanVol;\n\n\t/**\n\t * The L/R panning control. -1 = hard left, 1 = hard right.\n\t * @min -1\n\t * @max 1\n\t */\n\treadonly pan: Param<\"audioRange\">;\n\n\t/**\n\t * The volume control in decibels.\n\t */\n\treadonly volume: Param<\"decibels\">;\n\n\t/**\n\t * @param volume The output volume.\n\t * @param pan the initial pan\n\t */\n\tconstructor(volume?: Decibels, pan?: AudioRange);\n\tconstructor(options?: Partial<ChannelOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(Channel.getDefaults(), arguments, [\"volume\", \"pan\"]));\n\t\tconst options = optionsFromArguments(Channel.getDefaults(), arguments, [\"volume\", \"pan\"]);\n\n\t\tthis._solo = this.input = new Solo({\n\t\t\tsolo: options.solo,\n\t\t\tcontext: this.context,\n\t\t});\n\t\tthis._panVol = this.output = new PanVol({\n\t\t\tcontext: this.context,\n\t\t\tpan: options.pan,\n\t\t\tvolume: options.volume,\n\t\t\tmute: options.mute,\n\t\t\tchannelCount: options.channelCount\n\t\t});\n\t\tthis.pan = this._panVol.pan;\n\t\tthis.volume = this._panVol.volume;\n\n\t\tthis._solo.connect(this._panVol);\n\t\treadOnly(this, [\"pan\", \"volume\"]);\n\t}\n\n\tstatic getDefaults(): ChannelOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tpan: 0,\n\t\t\tvolume: 0,\n\t\t\tmute: false,\n\t\t\tsolo: false,\n\t\t\tchannelCount: 1,\n\t\t});\n\t}\n\n\t/**\n\t * Solo/unsolo the channel. Soloing is only relative to other [[Channels]] and [[Solo]] instances\n\t */\n\tget solo(): boolean {\n\t\treturn this._solo.solo;\n\t}\n\tset solo(solo) {\n\t\tthis._solo.solo = solo;\n\t}\n\n\t/**\n\t * If the current instance is muted, i.e. another instance is soloed,\n\t * or the channel is muted\n\t */\n\tget muted(): boolean {\n\t\treturn this._solo.muted || this.mute;\n\t}\n\n\t/**\n\t * Mute/unmute the volume\n\t */\n\tget mute(): boolean {\n\t\treturn this._panVol.mute;\n\t}\n\tset mute(mute) {\n\t\tthis._panVol.mute = mute;\n\t}\n\n\t/**\n\t * Store the send/receive channels by name. \n\t */\n\tprivate static buses: Map<string, Gain> = new Map();\n\n\t/**\n\t * Get the gain node belonging to the bus name. Create it if\n\t * it doesn't exist\n\t * @param name The bus name\n\t */\n\tprivate _getBus(name: string): Gain {\n\t\tif (!Channel.buses.has(name)) {\n\t\t\tChannel.buses.set(name, new Gain({ context: this.context }));\n\t\t}\n\t\treturn Channel.buses.get(name) as Gain;\n\t}\n\n\t/**\n\t * Send audio to another channel using a string. `send` is a lot like\n\t * [[connect]], except it uses a string instead of an object. This can \n\t * be useful in large applications to decouple sections since [[send]]\n\t * and [[receive]] can be invoked separately in order to connect an object\n\t * @param name The channel name to send the audio\n\t * @param volume The amount of the signal to send. \n\t * \tDefaults to 0db, i.e. send the entire signal\n\t * @returns Returns the gain node of this connection.\n\t */\n\tsend(name: string, volume: Decibels = 0): Gain<\"decibels\"> {\n\t\tconst bus = this._getBus(name);\n\t\tconst sendKnob = new Gain({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"decibels\",\n\t\t\tgain: volume,\n\t\t});\n\t\tthis.connect(sendKnob);\n\t\tsendKnob.connect(bus);\n\t\treturn sendKnob;\n\t}\n\n\t/**\n\t * Receive audio from a channel which was connected with [[send]]. \n\t * @param name The channel name to receive audio from.\n\t */\n\treceive(name: string): this {\n\t\tconst bus = this._getBus(name);\n\t\tbus.connect(this);\n\t\treturn this;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._panVol.dispose();\n\t\tthis.pan.dispose();\n\t\tthis.volume.dispose();\n\t\tthis._solo.dispose();\n\t\treturn this;\n\t}\n}\n","import { Gain } from \"../../core/context/Gain\";\nimport { OutputNode, ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { Merge } from \"./Merge\";\n\nexport type MonoOptions = ToneAudioNodeOptions;\n\n/**\n * Mono coerces the incoming mono or stereo signal into a mono signal\n * where both left and right channels have the same value. This can be useful\n * for [stereo imaging](https://en.wikipedia.org/wiki/Stereo_imaging).\n * @category Component\n */\nexport class Mono extends ToneAudioNode<MonoOptions> {\n\n\treadonly name: string = \"Mono\";\n\n\t/**\n\t * merge the signal\n\t */\n\tprivate _merge: Merge;\n\n\t/**\n\t * The summed output of the multiple inputs\n\t */\n\treadonly output: OutputNode;\n\n\t/**\n\t * The stereo signal to sum to mono\n\t */\n\treadonly input: Gain;\n\n\tconstructor(options?: Partial<MonoOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Mono.getDefaults(), arguments));\n\n\t\tthis.input = new Gain({ context: this.context });\n\n\t\tthis._merge = this.output = new Merge({\n\t\t\tchannels: 2,\n\t\t\tcontext: this.context,\n\t\t});\n\n\t\tthis.input.connect(this._merge, 0, 0);\n\t\tthis.input.connect(this._merge, 0, 1);\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._merge.dispose();\n\t\tthis.input.dispose();\n\t\treturn this;\n\t}\n}\n","import { Gain } from \"../../core/context/Gain\";\nimport { ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { Frequency, Positive } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { readOnly, writable } from \"../../core/util/Interface\";\nimport { Signal } from \"../../signal/Signal\";\nimport { Filter } from \"../filter/Filter\";\n\ninterface MultibandSplitOptions extends ToneAudioNodeOptions {\n\tQ: Positive;\n\tlowFrequency: Frequency;\n\thighFrequency: Frequency;\n}\n\n/**\n * Split the incoming signal into three bands (low, mid, high)\n * with two crossover frequency controls.\n * ```\n * +----------------------+\n * +-> input < lowFrequency +------------------> low\n * | +----------------------+\n * |\n * | +--------------------------------------+\n * input ---+-> lowFrequency < input < highFrequency +--> mid\n * | +--------------------------------------+\n * |\n * | +-----------------------+\n * +-> highFrequency < input +-----------------> high\n * +-----------------------+\n * ```\n * @category Component\n */\nexport class MultibandSplit extends ToneAudioNode<MultibandSplitOptions> {\n\n\treadonly name: string = \"MultibandSplit\";\n\n\t/**\n\t * the input\n\t */\n\treadonly input = new Gain({ context: this.context });\n\n\t/**\n\t * no output node, use either low, mid or high outputs\n\t */\n\treadonly output = undefined;\n\n\t/**\n\t * The low band.\n\t */\n\treadonly low = new Filter({\n\t\tcontext: this.context,\n\t\tfrequency: 0,\n\t\ttype: \"lowpass\",\n\t});\n\n\t/**\n\t * the lower filter of the mid band\n\t */\n\tprivate _lowMidFilter = new Filter({\n\t\tcontext: this.context,\n\t\tfrequency: 0,\n\t\ttype: \"highpass\",\n\t});\n\n\t/**\n\t * The mid band output.\n\t */\n\treadonly mid = new Filter({\n\t\tcontext: this.context,\n\t\tfrequency: 0,\n\t\ttype: \"lowpass\",\n\t});\n\n\t/**\n\t * The high band output.\n\t */\n\treadonly high = new Filter({\n\t\tcontext: this.context,\n\t\tfrequency: 0,\n\t\ttype: \"highpass\",\n\t});\n\n\t/**\n\t * The low/mid crossover frequency.\n\t */\n\treadonly lowFrequency: Signal<\"frequency\">;\n\n\t/**\n\t * The mid/high crossover frequency.\n\t */\n\treadonly highFrequency: Signal<\"frequency\">;\n\n\tprotected _internalChannels = [this.low, this.mid, this.high];\n\n\t/**\n\t * The Q or Quality of the filter\n\t */\n\treadonly Q: Signal<\"positive\">;\n\n\t/**\n\t * @param lowFrequency the low/mid crossover frequency\n\t * @param highFrequency the mid/high crossover frequency\n\t */\n\tconstructor(lowFrequency?: Frequency, highFrequency?: Frequency);\n\tconstructor(options?: Partial<MultibandSplitOptions>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(MultibandSplit.getDefaults(), arguments, [\"lowFrequency\", \"highFrequency\"]));\n\t\tconst options = optionsFromArguments(MultibandSplit.getDefaults(), arguments, [\"lowFrequency\", \"highFrequency\"]);\n\n\t\tthis.lowFrequency = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"frequency\",\n\t\t\tvalue: options.lowFrequency,\n\t\t});\n\n\t\tthis.highFrequency = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"frequency\",\n\t\t\tvalue: options.highFrequency,\n\t\t});\n\n\t\tthis.Q = new Signal({\n\t\t\tcontext: this.context,\n\t\t\tunits: \"positive\",\n\t\t\tvalue: options.Q,\n\t\t});\n\n\t\tthis.input.fan(this.low, this.high);\n\t\tthis.input.chain(this._lowMidFilter, this.mid);\n\t\t// the frequency control signal\n\t\tthis.lowFrequency.fan(this.low.frequency, this._lowMidFilter.frequency);\n\t\tthis.highFrequency.fan(this.mid.frequency, this.high.frequency);\n\t\t// the Q value\n\t\tthis.Q.connect(this.low.Q);\n\t\tthis.Q.connect(this._lowMidFilter.Q);\n\t\tthis.Q.connect(this.mid.Q);\n\t\tthis.Q.connect(this.high.Q);\n\n\t\treadOnly(this, [\"high\", \"mid\", \"low\", \"highFrequency\", \"lowFrequency\"]);\n\t}\n\n\tstatic getDefaults(): MultibandSplitOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tQ: 1,\n\t\t\thighFrequency: 2500,\n\t\t\tlowFrequency: 400,\n\t\t});\n\t}\n\n\t/**\n\t * Clean up.\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\twritable(this, [\"high\", \"mid\", \"low\", \"highFrequency\", \"lowFrequency\"]);\n\t\tthis.low.dispose();\n\t\tthis._lowMidFilter.dispose();\n\t\tthis.mid.dispose();\n\t\tthis.high.dispose();\n\t\tthis.lowFrequency.dispose();\n\t\tthis.highFrequency.dispose();\n\t\tthis.Q.dispose();\n\t\treturn this;\n\t}\n\n}\n","import { ToneAudioNode, ToneAudioNodeOptions } from \"./ToneAudioNode\";\nimport { Param } from \"./Param\";\nimport { onContextClose, onContextInit } from \"./ContextInitialization\";\n\nexport interface ListenerOptions extends ToneAudioNodeOptions{\n\tpositionX: number;\n\tpositionY: number;\n\tpositionZ: number;\n\tforwardX: number;\n\tforwardY: number;\n\tforwardZ: number;\n\tupX: number;\n\tupY: number;\n\tupZ: number;\n}\n\n/**\n * Tone.Listener is a thin wrapper around the AudioListener. Listener combined\n * with [[Panner3D]] makes up the Web Audio API's 3D panning system. Panner3D allows you \n * to place sounds in 3D and Listener allows you to navigate the 3D sound environment from\n * a first-person perspective. There is only one listener per audio context. \n */\nexport class Listener extends ToneAudioNode<ListenerOptions> {\n\n\treadonly name: string = \"Listener\";\n\n\t/**\n\t * The listener has no inputs or outputs. \n\t */\n\toutput: undefined; \n\tinput: undefined; \n\n\treadonly positionX: Param = new Param({\n\t\tcontext: this.context,\n\t\tparam: this.context.rawContext.listener.positionX,\n\t})\n\n\treadonly positionY: Param = new Param({\n\t\tcontext: this.context,\n\t\tparam: this.context.rawContext.listener.positionY,\n\t})\n\n\treadonly positionZ: Param = new Param({\n\t\tcontext: this.context,\n\t\tparam: this.context.rawContext.listener.positionZ,\n\t})\n\n\treadonly forwardX: Param = new Param({\n\t\tcontext: this.context,\n\t\tparam: this.context.rawContext.listener.forwardX,\n\t})\n\n\treadonly forwardY: Param = new Param({\n\t\tcontext: this.context,\n\t\tparam: this.context.rawContext.listener.forwardY,\n\t})\n\n\treadonly forwardZ: Param = new Param({\n\t\tcontext: this.context,\n\t\tparam: this.context.rawContext.listener.forwardZ,\n\t})\n\n\treadonly upX: Param = new Param({\n\t\tcontext: this.context,\n\t\tparam: this.context.rawContext.listener.upX,\n\t})\n\n\treadonly upY: Param = new Param({\n\t\tcontext: this.context,\n\t\tparam: this.context.rawContext.listener.upY,\n\t})\n\n\treadonly upZ: Param = new Param({\n\t\tcontext: this.context,\n\t\tparam: this.context.rawContext.listener.upZ,\n\t})\n\n\tstatic getDefaults(): ListenerOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tpositionX: 0,\n\t\t\tpositionY: 0,\n\t\t\tpositionZ: 0,\n\t\t\tforwardX: 0,\n\t\t\tforwardY: 0,\n\t\t\tforwardZ: -1,\n\t\t\tupX: 0,\n\t\t\tupY: 1,\n\t\t\tupZ: 0,\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.positionX.dispose();\n\t\tthis.positionY.dispose();\n\t\tthis.positionZ.dispose();\n\t\tthis.forwardX.dispose();\n\t\tthis.forwardY.dispose();\n\t\tthis.forwardZ.dispose();\n\t\tthis.upX.dispose();\n\t\tthis.upY.dispose();\n\t\tthis.upZ.dispose();\n\t\treturn this;\n\t}\n}\n\n//-------------------------------------\n// \tINITIALIZATION\n//-------------------------------------\n\nonContextInit(context => {\n\tcontext.listener = new Listener({ context });\n});\n\nonContextClose(context => {\n\tcontext.listener.dispose();\n});\n","import { Param } from \"../../core/context/Param\";\nimport { ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { Degrees, GainFactor } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport \"../../core/context/Listener\";\n\nexport interface Panner3DOptions extends ToneAudioNodeOptions {\n\tconeInnerAngle: Degrees;\n\tconeOuterAngle: Degrees;\n\tconeOuterGain: GainFactor;\n\tdistanceModel: DistanceModelType;\n\tmaxDistance: number;\n\torientationX: number;\n\torientationY: number;\n\torientationZ: number;\n\tpanningModel: PanningModelType;\n\tpositionX: number;\n\tpositionY: number;\n\tpositionZ: number;\n\trefDistance: number;\n\trolloffFactor: number;\n}\n\n/**\n * A spatialized panner node which supports equalpower or HRTF panning.\n * @category Component\n */\nexport class Panner3D extends ToneAudioNode<Panner3DOptions> {\n\n\treadonly name: string = \"Panner3D\";\n\n\t/**\n\t * The panning object\n\t */\n\tprivate _panner: PannerNode;\n\treadonly input: PannerNode;\n\treadonly output: PannerNode;\n\n\treadonly positionX: Param<\"number\">;\n\treadonly positionY: Param<\"number\">;\n\treadonly positionZ: Param<\"number\">;\n\n\treadonly orientationX: Param<\"number\">;\n\treadonly orientationY: Param<\"number\">;\n\treadonly orientationZ: Param<\"number\">;\n\n\t/**\n\t * @param positionX The initial x position.\n\t * @param positionY The initial y position.\n\t * @param positionZ The initial z position.\n\t */\n\tconstructor(positionX: number, positionY: number, positionZ: number);\n\tconstructor(options?: Partial<Panner3DOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Panner3D.getDefaults(), arguments, [\"positionX\", \"positionY\", \"positionZ\"]));\n\t\tconst options = optionsFromArguments(Panner3D.getDefaults(), arguments, [\"positionX\", \"positionY\", \"positionZ\"]);\n\n\t\tthis._panner = this.input = this.output = this.context.createPanner();\n\t\t// set some values\n\t\tthis.panningModel = options.panningModel;\n\t\tthis.maxDistance = options.maxDistance;\n\t\tthis.distanceModel = options.distanceModel;\n\t\tthis.coneOuterGain = options.coneOuterGain;\n\t\tthis.coneOuterAngle = options.coneOuterAngle;\n\t\tthis.coneInnerAngle = options.coneInnerAngle;\n\t\tthis.refDistance = options.refDistance;\n\t\tthis.rolloffFactor = options.rolloffFactor;\n\n\t\tthis.positionX = new Param({\n\t\t\tcontext: this.context,\n\t\t\tparam: this._panner.positionX,\n\t\t\tvalue: options.positionX,\n\t\t});\n\t\tthis.positionY = new Param({\n\t\t\tcontext: this.context,\n\t\t\tparam: this._panner.positionY,\n\t\t\tvalue: options.positionY,\n\t\t});\n\t\tthis.positionZ = new Param({\n\t\t\tcontext: this.context,\n\t\t\tparam: this._panner.positionZ,\n\t\t\tvalue: options.positionZ,\n\t\t});\n\t\tthis.orientationX = new Param({\n\t\t\tcontext: this.context,\n\t\t\tparam: this._panner.orientationX,\n\t\t\tvalue: options.orientationX,\n\t\t});\n\t\tthis.orientationY = new Param({\n\t\t\tcontext: this.context,\n\t\t\tparam: this._panner.orientationY,\n\t\t\tvalue: options.orientationY,\n\t\t});\n\t\tthis.orientationZ = new Param({\n\t\t\tcontext: this.context,\n\t\t\tparam: this._panner.orientationZ,\n\t\t\tvalue: options.orientationZ,\n\t\t});\n\t}\n\n\tstatic getDefaults(): Panner3DOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tconeInnerAngle: 360,\n\t\t\tconeOuterAngle: 360,\n\t\t\tconeOuterGain: 0,\n\t\t\tdistanceModel: \"inverse\" as DistanceModelType,\n\t\t\tmaxDistance: 10000,\n\t\t\torientationX: 0,\n\t\t\torientationY: 0,\n\t\t\torientationZ: 0,\n\t\t\tpanningModel: \"equalpower\" as PanningModelType,\n\t\t\tpositionX: 0,\n\t\t\tpositionY: 0,\n\t\t\tpositionZ: 0,\n\t\t\trefDistance: 1,\n\t\t\trolloffFactor: 1,\n\t\t});\n\t}\n\n\t/**\n\t * Sets the position of the source in 3d space.\n\t */\n\tsetPosition(x: number, y: number, z: number): this {\n\t\tthis.positionX.value = x;\n\t\tthis.positionY.value = y;\n\t\tthis.positionZ.value = z;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the orientation of the source in 3d space.\n\t */\n\tsetOrientation(x: number, y: number, z: number): this {\n\t\tthis.orientationX.value = x;\n\t\tthis.orientationY.value = y;\n\t\tthis.orientationZ.value = z;\n\t\treturn this;\n\t}\n\n\t/**\n\t * The panning model. Either \"equalpower\" or \"HRTF\".\n\t */\n\tget panningModel(): PanningModelType {\n\t\treturn this._panner.panningModel;\n\t}\n\tset panningModel(val) {\n\t\tthis._panner.panningModel = val;\n\t}\n\n\t/**\n\t * A reference distance for reducing volume as source move further from the listener\n\t */\n\tget refDistance(): number {\n\t\treturn this._panner.refDistance;\n\t}\n\tset refDistance(val) {\n\t\tthis._panner.refDistance = val;\n\t}\n\n\t/**\n\t * Describes how quickly the volume is reduced as source moves away from listener.\n\t */\n\tget rolloffFactor(): number {\n\t\treturn this._panner.rolloffFactor;\n\t}\n\tset rolloffFactor(val) {\n\t\tthis._panner.rolloffFactor = val;\n\t}\n\n\t/**\n\t * The distance model used by, \"linear\", \"inverse\", or \"exponential\".\n\t */\n\tget distanceModel(): DistanceModelType {\n\t\treturn this._panner.distanceModel;\n\t}\n\tset distanceModel(val) {\n\t\tthis._panner.distanceModel = val;\n\t}\n\n\t/**\n\t * The angle, in degrees, inside of which there will be no volume reduction\n\t */\n\tget coneInnerAngle(): Degrees {\n\t\treturn this._panner.coneInnerAngle;\n\t}\n\tset coneInnerAngle(val) {\n\t\tthis._panner.coneInnerAngle = val;\n\t}\n\n\t/**\n\t * The angle, in degrees, outside of which the volume will be reduced\n\t * to a constant value of coneOuterGain\n\t */\n\tget coneOuterAngle(): Degrees {\n\t\treturn this._panner.coneOuterAngle;\n\t}\n\tset coneOuterAngle(val) {\n\t\tthis._panner.coneOuterAngle = val;\n\t}\n\n\t/**\n\t * The gain outside of the coneOuterAngle\n\t */\n\tget coneOuterGain(): GainFactor {\n\t\treturn this._panner.coneOuterGain;\n\t}\n\tset coneOuterGain(val) {\n\t\tthis._panner.coneOuterGain = val;\n\t}\n\n\t/**\n\t * The maximum distance between source and listener,\n\t * after which the volume will not be reduced any further.\n\t */\n\tget maxDistance(): number {\n\t\treturn this._panner.maxDistance;\n\t}\n\tset maxDistance(val) {\n\t\tthis._panner.maxDistance = val;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._panner.disconnect();\n\t\tthis.orientationX.dispose();\n\t\tthis.orientationY.dispose();\n\t\tthis.orientationZ.dispose();\n\t\tthis.positionX.dispose();\n\t\tthis.positionY.dispose();\n\t\tthis.positionZ.dispose();\n\t\treturn this;\n\t}\n}\n","import { ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { Gain } from \"../../core/context/Gain\";\nimport { assert } from \"../../core/util/Debug\";\nimport { theWindow } from \"../../core/context/AudioContext\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { PlaybackState } from \"../../core/util/StateTimeline\";\n\nexport interface RecorderOptions extends ToneAudioNodeOptions {\n\tmimeType?: string;\n}\n\n/**\n * A wrapper around the MediaRecorder API. Unlike the rest of Tone.js, this module does not offer\n * any sample-accurate scheduling because it is not a feature of the MediaRecorder API.\n * This is only natively supported in Chrome and Firefox. \n * For a cross-browser shim, install (audio-recorder-polyfill)[https://www.npmjs.com/package/audio-recorder-polyfill]. \n * @example\n * const recorder = new Tone.Recorder();\n * const synth = new Tone.Synth().connect(recorder);\n * // start recording\n * recorder.start();\n * // generate a few notes\n * synth.triggerAttackRelease(\"C3\", 0.5);\n * synth.triggerAttackRelease(\"C4\", 0.5, \"+1\");\n * synth.triggerAttackRelease(\"C5\", 0.5, \"+2\");\n * // wait for the notes to end and stop the recording\n * setTimeout(async () => {\n * \t// the recorded audio is returned as a blob\n * \tconst recording = await recorder.stop();\n * \t// download the recording by creating an anchor element and blob url\n * \tconst url = URL.createObjectURL(recording);\n * \tconst anchor = document.createElement(\"a\");\n * \tanchor.download = \"recording.webm\";\n * \tanchor.href = url;\n * \tanchor.click();\n * }, 4000);\n * @category Component\n */\nexport class Recorder extends ToneAudioNode<RecorderOptions> {\n\n\treadonly name = \"Recorder\";\n\n\t/**\n\t * Recorder uses the Media Recorder API\n\t */\n\tprivate _recorder: MediaRecorder;\n\n\t/**\n\t * MediaRecorder requires \n\t */\n\tprivate _stream: MediaStreamAudioDestinationNode;\n\n\treadonly input: Gain;\n\treadonly output: undefined;\n\n\tconstructor(options?: Partial<RecorderOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Recorder.getDefaults(), arguments));\n\t\tconst options = optionsFromArguments(Recorder.getDefaults(), arguments);\n\n\t\tthis.input = new Gain({\n\t\t\tcontext: this.context\n\t\t});\n\n\t\tassert(Recorder.supported, \"Media Recorder API is not available\");\n\n\t\tthis._stream = this.context.createMediaStreamDestination();\n\t\tthis.input.connect(this._stream);\n\t\tthis._recorder = new MediaRecorder(this._stream.stream, {\n\t\t\tmimeType: options.mimeType\n\t\t});\n\t}\n\n\tstatic getDefaults(): RecorderOptions {\n\t\treturn ToneAudioNode.getDefaults();\n\t}\n\n\t/**\n\t * The mime type is the format that the audio is encoded in. For Chrome \n\t * that is typically webm encoded as \"vorbis\". \n\t */\n\tget mimeType(): string {\n\t\treturn this._recorder.mimeType;\n\t}\n\n\t/**\n\t * Test if your platform supports the Media Recorder API. If it's not available, \n\t * try installing this (polyfill)[https://www.npmjs.com/package/audio-recorder-polyfill].\n\t */\n\tstatic get supported(): boolean {\n\t\treturn theWindow !== null && Reflect.has(theWindow, \"MediaRecorder\");\n\t}\n\n\t/**\n\t * Get the playback state of the Recorder, either \"started\", \"stopped\" or \"paused\"\n\t */\n\tget state(): PlaybackState {\n\t\tif (this._recorder.state === \"inactive\") {\n\t\t\treturn \"stopped\";\n\t\t} else if (this._recorder.state === \"paused\") {\n\t\t\treturn \"paused\";\n\t\t} else {\n\t\t\treturn \"started\";\n\t\t}\n\t}\n\n\t/**\n\t * Start the Recorder. Returns a promise which resolves\n\t * when the recorder has started.\n\t */\n\tasync start() {\n\t\tassert(this.state !== \"started\", \"Recorder is already started\");\n\t\tconst startPromise = new Promise(done => {\n\t\t\tconst handleStart = () => {\n\t\t\t\tthis._recorder.removeEventListener(\"start\", handleStart, false);\n\n\t\t\t\tdone();\n\t\t\t};\n\n\t\t\tthis._recorder.addEventListener(\"start\", handleStart, false);\n\t\t});\n\n\t\tthis._recorder.start();\n\t\treturn await startPromise;\n\t}\n\n\t/**\n\t * Stop the recorder. Returns a promise with the recorded content until this point\n\t * encoded as [[mimeType]]\n\t */\n\tasync stop(): Promise<Blob> {\n\t\tassert(this.state !== \"stopped\", \"Recorder is not started\");\n\t\tconst dataPromise: Promise<Blob> = new Promise(done => {\n\t\t\tconst handleData = (e: BlobEvent) => {\n\t\t\t\tthis._recorder.removeEventListener(\"dataavailable\", handleData, false);\n\n\t\t\t\tdone(e.data);\n\t\t\t};\n\n\t\t\tthis._recorder.addEventListener(\"dataavailable\", handleData, false);\n\t\t});\n\t\tthis._recorder.stop();\n\t\treturn await dataPromise;\n\t}\n\n\t/**\n\t * Pause the recorder\n\t */\n\tpause(): this {\n\t\tassert(this.state === \"started\", \"Recorder must be started\");\n\t\tthis._recorder.pause();\n\t\treturn this;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.input.dispose();\n\t\tthis._stream.disconnect();\n\t\treturn this;\n\t}\n}\n","import { Param } from \"../../core/context/Param\";\nimport { ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { Decibels, Positive, Time } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { readOnly } from \"../../core/util/Interface\";\n\nexport interface CompressorOptions extends ToneAudioNodeOptions {\n\tattack: Time;\n\tknee: Decibels;\n\tratio: Positive;\n\trelease: Time;\n\tthreshold: Decibels;\n}\n\n/**\n * Compressor is a thin wrapper around the Web Audio\n * [DynamicsCompressorNode](http://webaudio.github.io/web-audio-api/#the-dynamicscompressornode-interface).\n * Compression reduces the volume of loud sounds or amplifies quiet sounds\n * by narrowing or \"compressing\" an audio signal's dynamic range.\n * Read more on [Wikipedia](https://en.wikipedia.org/wiki/Dynamic_range_compression).\n * @example\n * const comp = new Tone.Compressor(-30, 3);\n * @category Component\n */\nexport class Compressor extends ToneAudioNode<CompressorOptions> {\n\n\treadonly name: string = \"Compressor\";\n\n\t/**\n\t * the compressor node\n\t */\n\tprivate _compressor: DynamicsCompressorNode = this.context.createDynamicsCompressor();\n\treadonly input = this._compressor;\n\treadonly output = this._compressor;\n\n\t/**\n\t * The decibel value above which the compression will start taking effect.\n\t * @min -100\n\t * @max 0\n\t */\n\treadonly threshold: Param<\"decibels\">;\n\n\t/**\n\t * The amount of time (in seconds) to reduce the gain by 10dB.\n\t * @min 0\n\t * @max 1\n\t */\n\treadonly attack: Param<\"time\">;\n\n\t/**\n\t * The amount of time (in seconds) to increase the gain by 10dB.\n\t * @min 0\n\t * @max 1\n\t */\n\treadonly release: Param<\"time\">;\n\n\t/**\n\t * A decibel value representing the range above the threshold where the\n\t * curve smoothly transitions to the \"ratio\" portion.\n\t * @min 0\n\t * @max 40\n\t */\n\treadonly knee: Param<\"decibels\">;\n\n\t/**\n\t * The amount of dB change in input for a 1 dB change in output.\n\t * @min 1\n\t * @max 20\n\t */\n\treadonly ratio: Param<\"positive\">;\n\n\t/**\n\t * @param threshold The value above which the compression starts to be applied.\n\t * @param ratio The gain reduction ratio.\n\t */\n\tconstructor(threshold?: Decibels, ratio?: Positive);\n\tconstructor(options?: Partial<CompressorOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Compressor.getDefaults(), arguments, [\"threshold\", \"ratio\"]));\n\t\tconst options = optionsFromArguments(Compressor.getDefaults(), arguments, [\"threshold\", \"ratio\"]);\n\n\t\tthis.threshold = new Param({\n\t\t\tminValue: this._compressor.threshold.minValue,\n\t\t\tmaxValue: this._compressor.threshold.maxValue,\n\t\t\tcontext: this.context,\n\t\t\tconvert: false,\n\t\t\tparam: this._compressor.threshold,\n\t\t\tunits: \"decibels\",\n\t\t\tvalue: options.threshold,\n\t\t});\n\n\t\tthis.attack = new Param({\n\t\t\tminValue: this._compressor.attack.minValue,\n\t\t\tmaxValue: this._compressor.attack.maxValue,\n\t\t\tcontext: this.context,\n\t\t\tparam: this._compressor.attack,\n\t\t\tunits: \"time\",\n\t\t\tvalue: options.attack,\n\t\t});\n\n\t\tthis.release = new Param({\n\t\t\tminValue: this._compressor.release.minValue,\n\t\t\tmaxValue: this._compressor.release.maxValue,\n\t\t\tcontext: this.context,\n\t\t\tparam: this._compressor.release,\n\t\t\tunits: \"time\",\n\t\t\tvalue: options.release,\n\t\t});\n\n\t\tthis.knee = new Param({\n\t\t\tminValue: this._compressor.knee.minValue,\n\t\t\tmaxValue: this._compressor.knee.maxValue,\n\t\t\tcontext: this.context,\n\t\t\tconvert: false,\n\t\t\tparam: this._compressor.knee,\n\t\t\tunits: \"decibels\",\n\t\t\tvalue: options.knee,\n\t\t});\n\n\t\tthis.ratio = new Param({\n\t\t\tminValue: this._compressor.ratio.minValue,\n\t\t\tmaxValue: this._compressor.ratio.maxValue,\n\t\t\tcontext: this.context,\n\t\t\tconvert: false,\n\t\t\tparam: this._compressor.ratio,\n\t\t\tunits: \"positive\",\n\t\t\tvalue: options.ratio,\n\t\t});\n\n\t\t// set the defaults\n\t\treadOnly(this, [\"knee\", \"release\", \"attack\", \"ratio\", \"threshold\"]);\n\t}\n\n\tstatic getDefaults(): CompressorOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tattack: 0.003,\n\t\t\tknee: 30,\n\t\t\tratio: 12,\n\t\t\trelease: 0.25,\n\t\t\tthreshold: -24,\n\t\t});\n\t}\n\n\t/**\n\t * A read-only decibel value for metering purposes, representing the current amount of gain\n\t * reduction that the compressor is applying to the signal. If fed no signal the value will be 0 (no gain reduction).\n\t */\n\tget reduction(): Decibels {\n\t\treturn this._compressor.reduction;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._compressor.disconnect();\n\t\tthis.attack.dispose();\n\t\tthis.release.dispose();\n\t\tthis.threshold.dispose();\n\t\tthis.ratio.dispose();\n\t\tthis.knee.dispose();\n\t\treturn this;\n\t}\n}\n","import { ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { Decibels, Time } from \"../../core/type/Units\";\nimport { GreaterThan } from \"../../signal/GreaterThan\";\nimport { Gain } from \"../../core/context/Gain\";\nimport { Follower } from \"../analysis/Follower\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { dbToGain, gainToDb } from \"../../core/type/Conversions\";\n\nexport interface GateOptions extends ToneAudioNodeOptions {\n\tthreshold: Decibels;\n\tsmoothing: Time;\n}\n\n/**\n * Gate only passes a signal through when the incoming\n * signal exceeds a specified threshold. It uses [[Follower]] to follow the ampltiude\n * of the incoming signal and compares it to the [[threshold]] value using [[GreaterThan]].\n *\n * @example\n * const gate = new Tone.Gate(-30, 0.2).toDestination();\n * const mic = new Tone.UserMedia().connect(gate);\n * // the gate will only pass through the incoming\n * // signal when it's louder than -30db\n * @category Component\n */\nexport class Gate extends ToneAudioNode<GateOptions> {\n\n\treadonly name: string = \"Gate\";\n\n\treadonly input: ToneAudioNode;\n\treadonly output: ToneAudioNode;\n\n\t/**\n\t * Follow the incoming signal\n\t */\n\tprivate _follower: Follower;\n\n\t/**\n\t * Test if it's greater than the threshold\n\t */\n\tprivate _gt: GreaterThan;\n\n\t/**\n\t * Gate the incoming signal when it does not exceed the threshold\n\t */\n\tprivate _gate: Gain;\n\n\t/**\n\t * @param threshold The threshold above which the gate will open.\n\t * @param smoothing The follower's smoothing time\n\t */\n\tconstructor(threshold?: Decibels, smoothing?: Time);\n\tconstructor(options?: Partial<GateOptions>);\n\tconstructor() {\n\t\tsuper(Object.assign(optionsFromArguments(Gate.getDefaults(), arguments, [\"threshold\", \"smoothing\"])));\n\t\tconst options = optionsFromArguments(Gate.getDefaults(), arguments, [\"threshold\", \"smoothing\"]);\n\n\t\tthis._follower = new Follower({\n\t\t\tcontext: this.context,\n\t\t\tsmoothing: options.smoothing,\n\t\t});\n\t\tthis._gt = new GreaterThan({\n\t\t\tcontext: this.context,\n\t\t\tvalue: dbToGain(options.threshold),\n\t\t});\n\t\tthis.input = new Gain({ context: this.context });\n\t\tthis._gate = this.output = new Gain({ context: this.context });\n\n\t\t// connections\n\t\tthis.input.connect(this._gate);\n\t\t// the control signal\n\t\tthis.input.chain(this._follower, this._gt, this._gate.gain);\n\t}\n\n\tstatic getDefaults(): GateOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tsmoothing: 0.1,\n\t\t\tthreshold: -40\n\t\t});\n\t}\n\n\t/**\n\t * The threshold of the gate in decibels\n\t */\n\tget threshold(): Decibels {\n\t\treturn gainToDb(this._gt.value);\n\t}\n\tset threshold(thresh) {\n\t\tthis._gt.value = dbToGain(thresh);\n\t}\n\n\t/**\n\t * The attack/decay speed of the gate. See [[Follower.smoothing]]\n\t */\n\tget smoothing(): Time {\n\t\treturn this._follower.smoothing;\n\t}\n\tset smoothing(smoothingTime) {\n\t\tthis._follower.smoothing = smoothingTime;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.input.dispose();\n\t\tthis._follower.dispose();\n\t\tthis._gt.dispose();\n\t\tthis._gate.dispose();\n\t\treturn this;\n\t}\n}\n","import { InputNode, OutputNode, ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { Decibels } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { Compressor } from \"./Compressor\";\nimport { Param } from \"../../core/context/Param\";\nimport { readOnly } from \"../../core/util/Interface\";\n\nexport interface LimiterOptions extends ToneAudioNodeOptions {\n\tthreshold: Decibels;\n};\n\n/**\n * Limiter will limit the loudness of an incoming signal.\n * Under the hood it's composed of a [[Compressor]] with a fast attack\n * and release and max compression ratio. \n *\n * @example\n * const limiter = new Tone.Limiter(-20).toDestination();\n * const oscillator = new Tone.Oscillator().connect(limiter);\n * oscillator.start();\n * @category Component\n */\nexport class Limiter extends ToneAudioNode<LimiterOptions> {\n\n\treadonly name: string = \"Limiter\";\n\n\treadonly input: InputNode;\n\treadonly output: OutputNode;\n\n\t/**\n\t * The compressor which does the limiting\n\t */\n\tprivate _compressor: Compressor;\n\n\treadonly threshold: Param<\"decibels\">\n\n\t/**\n\t * @param threshold The threshold above which the gain reduction is applied.\n\t */\n\tconstructor(threshold?: Decibels);\n\tconstructor(options?: Partial<LimiterOptions>);\n\tconstructor() {\n\t\tsuper(Object.assign(optionsFromArguments(Limiter.getDefaults(), arguments, [\"threshold\"])));\n\t\tconst options = optionsFromArguments(Limiter.getDefaults(), arguments, [\"threshold\"]);\n\n\t\tthis._compressor = this.input = this.output = new Compressor({\n\t\t\tcontext: this.context,\n\t\t\tratio: 20,\n\t\t\tattack: 0.003,\n\t\t\trelease: 0.01,\n\t\t\tthreshold: options.threshold\n\t\t});\n\n\t\tthis.threshold = this._compressor.threshold;\n\t\treadOnly(this, \"threshold\");\n\t}\n\n\tstatic getDefaults(): LimiterOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tthreshold: -12\n\t\t});\n\t}\n\n\t/**\n\t * A read-only decibel value for metering purposes, representing the current amount of gain\n\t * reduction that the compressor is applying to the signal. \n\t */\n\tget reduction(): Decibels {\n\t\treturn this._compressor.reduction;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._compressor.dispose();\n\t\tthis.threshold.dispose();\n\t\treturn this;\n\t}\n}\n","import { InputNode, OutputNode, ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { Compressor, CompressorOptions } from \"./Compressor\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { MidSideSplit } from \"../channel/MidSideSplit\";\nimport { MidSideMerge } from \"../channel/MidSideMerge\";\nimport { readOnly, RecursivePartial } from \"../../core/util/Interface\";\n\nexport interface MidSideCompressorOptions extends ToneAudioNodeOptions {\n\tmid: Omit<CompressorOptions, keyof ToneAudioNodeOptions>;\n\tside: Omit<CompressorOptions, keyof ToneAudioNodeOptions>;\n}\n\n/**\n * MidSideCompressor applies two different compressors to the [[mid]]\n * and [[side]] signal components of the input. See [[MidSideSplit]] and [[MidSideMerge]].\n * @category Component\n */\nexport class MidSideCompressor extends ToneAudioNode<MidSideCompressorOptions> {\n\n\treadonly name: string = \"MidSideCompressor\";\n\n\treadonly input: InputNode;\n\treadonly output: OutputNode;\n\n\t/**\n\t * Split the incoming signal into Mid/Side\n\t */\n\tprivate _midSideSplit: MidSideSplit;\n\n\t/**\n\t * Merge the compressed signal back into a single stream\n\t */\n\tprivate _midSideMerge: MidSideMerge;\n\n\t/**\n\t * The compression applied to the mid signal\n\t */\n\treadonly mid: Compressor;\n\n\t/**\n\t * The compression applied to the side signal\n\t */\n\treadonly side: Compressor;\n\n\tconstructor(options?: RecursivePartial<MidSideCompressorOptions>);\n\tconstructor() {\n\t\tsuper(Object.assign(optionsFromArguments(MidSideCompressor.getDefaults(), arguments)));\n\t\tconst options = optionsFromArguments(MidSideCompressor.getDefaults(), arguments);\n\n\t\tthis._midSideSplit = this.input = new MidSideSplit({ context: this.context });\n\t\tthis._midSideMerge = this.output = new MidSideMerge({ context: this.context });\n\t\tthis.mid = new Compressor(Object.assign(options.mid, { context: this.context }));\n\t\tthis.side = new Compressor(Object.assign(options.side, { context: this.context }));\n\n\t\tthis._midSideSplit.mid.chain(this.mid, this._midSideMerge.mid);\n\t\tthis._midSideSplit.side.chain(this.side, this._midSideMerge.side);\n\t\treadOnly(this, [\"mid\", \"side\"]);\n\t}\n\n\tstatic getDefaults(): MidSideCompressorOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tmid: {\n\t\t\t\tratio: 3,\n\t\t\t\tthreshold: -24,\n\t\t\t\trelease: 0.03,\n\t\t\t\tattack: 0.02,\n\t\t\t\tknee: 16\n\t\t\t},\n\t\t\tside: {\n\t\t\t\tratio: 6,\n\t\t\t\tthreshold: -30,\n\t\t\t\trelease: 0.25,\n\t\t\t\tattack: 0.03,\n\t\t\t\tknee: 10\n\t\t\t}\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis.mid.dispose();\n\t\tthis.side.dispose();\n\t\tthis._midSideSplit.dispose();\n\t\tthis._midSideMerge.dispose();\n\t\treturn this;\n\t}\n}\n","import { InputNode, ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { Compressor, CompressorOptions } from \"./Compressor\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { readOnly, RecursivePartial } from \"../../core/util/Interface\";\nimport { Frequency } from \"../../core/type/Units\";\nimport { MultibandSplit } from \"../channel/MultibandSplit\";\nimport { Signal } from \"../../signal/Signal\";\nimport { Gain } from \"../../core/context/Gain\";\n\nexport interface MultibandCompressorOptions extends ToneAudioNodeOptions {\n\tmid: Omit<CompressorOptions, keyof ToneAudioNodeOptions>;\n\tlow: Omit<CompressorOptions, keyof ToneAudioNodeOptions>;\n\thigh: Omit<CompressorOptions, keyof ToneAudioNodeOptions>;\n\tlowFrequency: Frequency;\n\thighFrequency: Frequency;\n}\n\n/**\n * A compressor with separate controls over low/mid/high dynamics. See [[Compressor]] and [[MultibandSplit]]\n *\n * @example\n * const multiband = new Tone.MultibandCompressor({\n * \tlowFrequency: 200,\n * \thighFrequency: 1300,\n * \tlow: {\n * \t\tthreshold: -12\n * \t}\n * });\n * @category Component\n */\nexport class MultibandCompressor extends ToneAudioNode<MultibandCompressorOptions> {\n\n\treadonly name: string = \"MultibandCompressor\";\n\n\treadonly input: InputNode;\n\treadonly output: ToneAudioNode;\n\n\t/**\n\t * Split the incoming signal into high/mid/low\n\t */\n\tprivate _splitter: MultibandSplit;\n\n\t/**\n\t * low/mid crossover frequency.\n\t */\n\treadonly lowFrequency: Signal<\"frequency\">;\n\n\t/**\n\t * mid/high crossover frequency.\n\t */\n\treadonly highFrequency: Signal<\"frequency\">;\n\n\t/**\n\t * The compressor applied to the low frequencies\n\t */\n\treadonly low: Compressor;\n\n\t/**\n\t * The compressor applied to the mid frequencies\n\t */\n\treadonly mid: Compressor;\n\n\t/**\n\t * The compressor applied to the high frequencies\n\t */\n\treadonly high: Compressor;\n\n\tconstructor(options?: RecursivePartial<MultibandCompressorOptions>);\n\tconstructor() {\n\t\tsuper(Object.assign(optionsFromArguments(MultibandCompressor.getDefaults(), arguments)));\n\t\tconst options = optionsFromArguments(MultibandCompressor.getDefaults(), arguments);\n\n\t\tthis._splitter = this.input = new MultibandSplit({\n\t\t\tcontext: this.context,\n\t\t\tlowFrequency: options.lowFrequency,\n\t\t\thighFrequency: options.highFrequency\n\t\t});\n\t\tthis.lowFrequency = this._splitter.lowFrequency;\n\t\tthis.highFrequency = this._splitter.highFrequency;\n\t\tthis.output = new Gain({ context: this.context });\n\t\tthis.low = new Compressor(Object.assign(options.low, { context: this.context }));\n\t\tthis.mid = new Compressor(Object.assign(options.mid, { context: this.context }));\n\t\tthis.high = new Compressor(Object.assign(options.high, { context: this.context }));\n\n\t\t// connect the compressor\n\t\tthis._splitter.low.chain(this.low, this.output);\n\t\tthis._splitter.mid.chain(this.mid, this.output);\n\t\tthis._splitter.high.chain(this.high, this.output);\n\n\t\treadOnly(this, [\"high\", \"mid\", \"low\", \"highFrequency\", \"lowFrequency\"]);\n\t}\n\n\tstatic getDefaults(): MultibandCompressorOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tlowFrequency: 250,\n\t\t\thighFrequency: 2000,\n\t\t\tlow: {\n\t\t\t\tratio: 6,\n\t\t\t\tthreshold: -30,\n\t\t\t\trelease: 0.25,\n\t\t\t\tattack: 0.03,\n\t\t\t\tknee: 10\n\t\t\t},\n\t\t\tmid: {\n\t\t\t\tratio: 3,\n\t\t\t\tthreshold: -24,\n\t\t\t\trelease: 0.03,\n\t\t\t\tattack: 0.02,\n\t\t\t\tknee: 16\n\t\t\t},\n\t\t\thigh: {\n\t\t\t\tratio: 3,\n\t\t\t\tthreshold: -24,\n\t\t\t\trelease: 0.03,\n\t\t\t\tattack: 0.02,\n\t\t\t\tknee: 16\n\t\t\t},\n\t\t});\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._splitter.dispose();\n\t\tthis.low.dispose();\n\t\tthis.mid.dispose();\n\t\tthis.high.dispose();\n\t\tthis.output.dispose();\n\t\treturn this;\n\t}\n}\n","import { Gain } from \"../../core/context/Gain\";\nimport { Param } from \"../../core/context/Param\";\nimport { ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { Decibels, Frequency } from \"../../core/type/Units\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { readOnly, writable } from \"../../core/util/Interface\";\nimport { Signal } from \"../../signal/Signal\";\nimport { MultibandSplit } from \"../channel/MultibandSplit\";\n\ninterface EQ3Options extends ToneAudioNodeOptions {\n\tlow: Decibels;\n\tmid: Decibels;\n\thigh: Decibels;\n\tlowFrequency: Frequency;\n\thighFrequency: Frequency;\n}\n\n/**\n * EQ3 provides 3 equalizer bins: Low/Mid/High. \n * @category Component\n */\nexport class EQ3 extends ToneAudioNode<EQ3Options> {\n\n\treadonly name: string = \"EQ3\";\n\n\t/**\n\t * the input\n\t */\n\treadonly input: MultibandSplit;\n\n\t/**\n\t * the output\n\t */\n\treadonly output = new Gain({ context: this.context });\n\n\t/**\n\t * Splits the input into three outputs\n\t */\n\tprivate _multibandSplit: MultibandSplit;\n\n\t/**\n\t * The gain for the lower signals\n\t */\n\tprivate _lowGain: Gain<\"decibels\">;\n\n\t/**\n\t * The gain for the mid signals\n\t */\n\tprivate _midGain: Gain<\"decibels\">;\n\n\t/**\n\t * The gain for the high signals\n\t */\n\tprivate _highGain: Gain<\"decibels\">;\n\n\t/**\n\t * The gain in decibels of the low part\n\t */\n\treadonly low: Param<\"decibels\">;\n\n\t/**\n\t * The gain in decibels of the mid part\n\t */\n\treadonly mid: Param<\"decibels\">;\n\n\t/**\n\t * The gain in decibels of the high part\n\t */\n\treadonly high: Param<\"decibels\">;\n\n\t/**\n\t * The Q value for all of the filters.\n\t */\n\treadonly Q: Signal<\"positive\">;\n\n\t/**\n\t * The low/mid crossover frequency.\n\t */\n\treadonly lowFrequency: Signal<\"frequency\">;\n\n\t/**\n\t * The mid/high crossover frequency.\n\t */\n\treadonly highFrequency: Signal<\"frequency\">;\n\n\tprotected _internalChannels: ToneAudioNode[] = [];\n\n\tconstructor(lowLevel?: Decibels, midLevel?: Decibels, highLevel?: Decibels);\n\tconstructor(options: Partial<EQ3Options>);\n\tconstructor() {\n\t\tsuper(optionsFromArguments(EQ3.getDefaults(), arguments, [\"low\", \"mid\", \"high\"]));\n\t\tconst options = optionsFromArguments(EQ3.getDefaults(), arguments, [\"low\", \"mid\", \"high\"]);\n\n\t\tthis.input = this._multibandSplit = new MultibandSplit({\n\t\t\tcontext: this.context,\n\t\t\thighFrequency: options.highFrequency,\n\t\t\tlowFrequency: options.lowFrequency,\n\t\t});\n\n\t\tthis._lowGain = new Gain({\n\t\t\tcontext: this.context,\n\t\t\tgain: options.low,\n\t\t\tunits: \"decibels\",\n\t\t});\n\n\t\tthis._midGain = new Gain({\n\t\t\tcontext: this.context,\n\t\t\tgain: options.mid,\n\t\t\tunits: \"decibels\",\n\t\t});\n\n\t\tthis._highGain = new Gain({\n\t\t\tcontext: this.context,\n\t\t\tgain: options.high,\n\t\t\tunits: \"decibels\",\n\t\t});\n\n\t\tthis.low = this._lowGain.gain;\n\t\tthis.mid = this._midGain.gain;\n\t\tthis.high = this._highGain.gain;\n\t\tthis.Q = this._multibandSplit.Q;\n\t\tthis.lowFrequency = this._multibandSplit.lowFrequency;\n\t\tthis.highFrequency\t= this._multibandSplit.highFrequency;\n\n\t\t// the frequency bands\n\t\tthis._multibandSplit.low.chain(this._lowGain, this.output);\n\t\tthis._multibandSplit.mid.chain(this._midGain, this.output);\n\t\tthis._multibandSplit.high.chain(this._highGain, this.output);\n\n\t\treadOnly(this, [\"low\", \"mid\", \"high\", \"lowFrequency\", \"highFrequency\"]);\n\t\tthis._internalChannels = [this._multibandSplit];\n\t}\n\n\tstatic getDefaults(): EQ3Options {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\thigh: 0,\n\t\t\thighFrequency: 2500,\n\t\t\tlow: 0,\n\t\t\tlowFrequency: 400,\n\t\t\tmid: 0,\n\t\t});\n\t}\n\n\t/**\n\t * Clean up.\n\t */\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\twritable(this, [\"low\", \"mid\", \"high\", \"lowFrequency\", \"highFrequency\"]);\n\t\tthis._multibandSplit.dispose();\n\t\tthis.lowFrequency.dispose();\n\t\tthis.highFrequency.dispose();\n\t\tthis._lowGain.dispose();\n\t\tthis._midGain.dispose();\n\t\tthis._highGain.dispose();\n\t\tthis.low.dispose();\n\t\tthis.mid.dispose();\n\t\tthis.high.dispose();\n\t\tthis.Q.dispose();\n\t\treturn this;\n\t}\n\n}\n","import { ToneAudioNode, ToneAudioNodeOptions } from \"../../core/context/ToneAudioNode\";\nimport { ToneAudioBuffer } from \"../../core/context/ToneAudioBuffer\";\nimport { optionsFromArguments } from \"../../core/util/Defaults\";\nimport { Gain } from \"../../core/context/Gain\";\nimport { noOp } from \"../../core/util/Interface\";\n\nexport interface ConvolverOptions extends ToneAudioNodeOptions {\n\tonload: () => void;\n\tnormalize: boolean;\n\turl?: string | AudioBuffer | ToneAudioBuffer;\n}\n\n/**\n * Convolver is a wrapper around the Native Web Audio\n * [ConvolverNode](http://webaudio.github.io/web-audio-api/#the-convolvernode-interface).\n * Convolution is useful for reverb and filter emulation. Read more about convolution reverb on\n * [Wikipedia](https://en.wikipedia.org/wiki/Convolution_reverb).\n *\n * @example\n * // initializing the convolver with an impulse response\n * const convolver = new Tone.Convolver(\"./path/to/ir.wav\").toDestination();\n * @category Component\n */\nexport class Convolver extends ToneAudioNode<ConvolverOptions> {\n\n\treadonly name: string = \"Convolver\";\n\n\t/**\n\t * The native ConvolverNode\n\t */\n\tprivate _convolver: ConvolverNode = this.context.createConvolver();\n\n\t/**\n\t * The Buffer belonging to the convolver\n\t */\n\tprivate _buffer: ToneAudioBuffer;\n\n\treadonly input: Gain;\n\treadonly output: Gain;\n\n\t/**\n\t * @param url The URL of the impulse response or the ToneAudioBuffer containing the impulse response.\n\t * @param onload The callback to invoke when the url is loaded.\n\t */\n\tconstructor(url?: string | AudioBuffer | ToneAudioBuffer, onload?: () => void);\n\tconstructor(options?: Partial<ConvolverOptions>);\n\tconstructor() {\n\n\t\tsuper(optionsFromArguments(Convolver.getDefaults(), arguments, [\"url\", \"onload\"]));\n\t\tconst options = optionsFromArguments(Convolver.getDefaults(), arguments, [\"url\", \"onload\"]);\n\n\t\tthis._buffer = new ToneAudioBuffer(options.url, buffer => {\n\t\t\tthis.buffer = buffer;\n\t\t\toptions.onload();\n\t\t});\n\n\t\tthis.input = new Gain({ context: this.context });\n\t\tthis.output = new Gain({ context: this.context });\n\n\t\t// set if it's already loaded, set it immediately\n\t\tif (this._buffer.loaded) {\n\t\t\tthis.buffer = this._buffer;\n\t\t}\n\n\t\t// initially set normalization\n\t\tthis.normalize = options.normalize;\n\n\t\t// connect it up\n\t\tthis.input.chain(this._convolver, this.output);\n\t}\n\n\tstatic getDefaults(): ConvolverOptions {\n\t\treturn Object.assign(ToneAudioNode.getDefaults(), {\n\t\t\tnormalize: true,\n\t\t\tonload: noOp,\n\t\t});\n\t}\n\n\t/**\n\t * Load an impulse response url as an audio buffer.\n\t * Decodes the audio asynchronously and invokes\n\t * the callback once the audio buffer loads.\n\t * @param url The url of the buffer to load. filetype support depends on the browser.\n\t */\n\tasync load(url: string): Promise<void> {\n\t\tthis.buffer = await this._buffer.load(url);\n\t}\n\n\t/**\n\t * The convolver's buffer\n\t */\n\tget buffer(): ToneAudioBuffer | null {\n\t\tif (this._buffer.length) {\n\t\t\treturn this._buffer;\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\tset buffer(buffer) {\n\t\tif (buffer) {\n\t\t\tthis._buffer.set(buffer);\n\t\t}\n\t\t// if it's already got a buffer, create a new one\n\t\tif (this._convolver.buffer) {\n\t\t\t// disconnect the old one\n\t\t\tthis.input.disconnect();\n\t\t\tthis._convolver.disconnect();\n\t\t\t// create and connect a new one\n\t\t\tthis._convolver = this.context.createConvolver();\n\t\t\tthis.input.chain(this._convolver, this.output);\n\t\t}\n\t\tconst buff = this._buffer.get();\n\t\tthis._convolver.buffer = buff ? buff : null;\n\t}\n\n\t/**\n\t * The normalize property of the ConvolverNode interface is a boolean that\n\t * controls whether the impulse response from the buffer will be scaled by\n\t * an equal-power normalization when the buffer attribute is set, or not.\n\t */\n\tget normalize(): boolean {\n\t\treturn this._convolver.normalize;\n\t}\n\tset normalize(norm) {\n\t\tthis._convolver.normalize = norm;\n\t}\n\n\tdispose(): this {\n\t\tsuper.dispose();\n\t\tthis._buffer.dispose();\n\t\tthis._convolver.disconnect();\n\t\treturn this;\n\t}\n}\n","export { getContext, setContext } from \"./core/Global\";\nexport * from \"./classes\";\nexport * from \"./version\";\nimport { getContext } from \"./core/Global\";\nimport { ToneAudioBuffer } from \"./core/context/ToneAudioBuffer\";\nexport { start } from \"./core/Global\";\nimport { Seconds } from \"./core/type/Units\";\nexport { supported } from \"./core/context/AudioContext\";\n\n/**\n * The current audio context time of the global [[Context]]. \n * See [[Context.now]]\n * @category Core\n */\nexport function now(): Seconds {\n\treturn getContext().now();\n}\n\n/**\n * The current audio context time of the global [[Context]] without the [[Context.lookAhead]]\n * See [[Context.immediate]]\n * @category Core\n */\nexport function immediate(): Seconds {\n\treturn getContext().immediate();\n}\n\n/**\n * The Transport object belonging to the global Tone.js Context.\n * See [[Transport]]\n * @category Core\n */\nexport const Transport = getContext().transport;\n\n/**\n * The Transport object belonging to the global Tone.js Context.\n * See [[Transport]]\n * @category Core\n */\nexport function getTransport(): import(\"./core/clock/Transport\").Transport {\n\treturn getContext().transport;\n}\n\n/**\n * The Destination (output) belonging to the global Tone.js Context.\n * See [[Destination]]\n * @category Core\n */\nexport const Destination = getContext().destination;\n\n/**\n * @deprecated Use [[Destination]]\n */\nexport const Master = getContext().destination;\n\n/**\n * The Destination (output) belonging to the global Tone.js Context.\n * See [[Destination]]\n * @category Core\n */\nexport function getDestination(): import(\"./core/context/Destination\").Destination {\n\treturn getContext().destination;\n}\n\n/**\n * The [[Listener]] belonging to the global Tone.js Context.\n * @category Core\n */\nexport const Listener = getContext().listener;\n\n/**\n * The [[Listener]] belonging to the global Tone.js Context.\n * @category Core\n */\nexport function getListener(): import(\"./core/context/Listener\").Listener {\n\treturn getContext().listener;\n}\n\n/**\n * Draw is used to synchronize the draw frame with the Transport's callbacks. \n * See [[Draw]]\n * @category Core\n */\nexport const Draw = getContext().draw;\n\n/**\n * Get the singleton attached to the global context. \n * Draw is used to synchronize the draw frame with the Transport's callbacks. \n * See [[Draw]]\n * @category Core\n */\nexport function getDraw(): import(\"./core/util/Draw\").Draw {\n\treturn getContext().draw;\n}\n\n/**\n * A reference to the global context\n * See [[Context]]\n */\nexport const context = getContext();\n\n/**\n * Promise which resolves when all of the loading promises are resolved. \n * Alias for static [[ToneAudioBuffer.loaded]] method.\n * @category Core\n */\nexport function loaded() {\n\treturn ToneAudioBuffer.loaded();\n}\n\n// this fills in name changes from 13.x to 14.x\nimport { ToneAudioBuffers } from \"./core/context/ToneAudioBuffers\";\nimport { ToneBufferSource } from \"./source/buffer/ToneBufferSource\";\nexport const Buffer: typeof ToneAudioBuffer = ToneAudioBuffer;\nexport const Buffers: typeof ToneAudioBuffers = ToneAudioBuffers;\nexport const BufferSource: typeof ToneBufferSource = ToneBufferSource;\n"],"sourceRoot":""}
|