UNPKG

@doc.e.dub/csound-browser

Version:

[![npm (scoped with tag)](https://shields.shivering-isles.com/npm/v/@csound/browser/latest)](https://www.npmjs.com/package/@csound/browser) [![GitHub Workflow Status](https://shields.shivering-isles.com/github/workflow/status/csound/csound/csound_wasm)](h

463 lines (453 loc) 17.8 kB
import { IFs } from "memfs"; import { EventEmitter } from "eventemitter3"; /** * @property "play" - called anytime performance goes from pause/stop to a running state. * @property "pause" - called after any successful csound.pause() calls. * @property "stop" - called after end of performance or after a successful csound.stop(). * @property "realtimePerformanceStarted" - called at the start of realtime performance but not on resume or render. * @property "realtimePerformancePaused" - only called if csound.pause() was successfully called during performance. * @property "realtimePerformanceResumed" - only called if csound.resume() was successfully called after a pause. * @property "realtimePerformanceEnded" - called after end of performance or after a successful csound.stop(). * @property "renderStarted" - called at the start of offline/non-realtime render to disk. * @property "renderEnded" - called at the end of offline/non-realtime render to disk. * @property "onAudioNodeCreated" - called when an audioNode is created from the AudioContext before realtime performance. * the event callback will include the audioNode itself, which is needed if autoConnect is set to false. * @property "message" - the main entrypoint to csound's messaging (-m) system, * a default event listener will print the message to the browser console, this default * listener can be removed by the user. */ declare type PublicEvents = | "play" | "pause" | "stop" | "realtimePerformanceStarted" | "realtimePerformancePaused" | "realtimePerformanceResumed" | "realtimePerformanceEnded" | "renderStarted" | "renderEnded" | "onAudioNodeCreated" | "message"; /** * CsoundObj API. */ declare interface CsoundObj { /** Returns the AudioContext used to create AudioNodes. May be one passed as initialization parameters to * Csound() or one created by Csound itself if none are provided. */ getAudioContext: () => Promise<AudioContext | undefined>; /** Returns the AudioNode used with Csound processing. May return undefined if node has not yet been created. * Single-thread (the default) backends will have nodes available right after initializing Csound, while worker-backed * versions of Csound may construct the node later when Csound starts. */ getNode: () => Promise<AudioNode | undefined>; /** * Returns an array listing the events for which the emitter has registered listeners. * The values in the array are strings. */ eventNames: () => string[]; /** * Returns the number of listeners listening to the event named eventName. */ listenerCount: () => number; /** * Returns a copy of the array of listeners for the event named eventName. */ listeners: (eventName: PublicEvents) => Array<EventEmitter.EventListener<PublicEvents, any>>; /** * Alias for removeListener() */ off: (eventName: PublicEvents, listener: EventEmitter.EventListener<PublicEvents, any>) => EventEmitter; /** * Adds the listener to the end of the listeners array for the event named eventName. * No checks are made to see if the listener has already been added. * Multiple calls passing the same combination of eventName and listener * will result in the listener being added, and called, multiple times. */ on: (eventName: PublicEvents, listener: EventEmitter.EventListener<PublicEvents, any>) => EventEmitter; /** * Alias for "on" */ addListener: (eventName: PublicEvents, listener: EventEmitter.EventListener<PublicEvents, any>) => EventEmitter; /** * Adds a one-time listener for the event named eventName. * The next time eventName is triggered, this listener is removed and then invoked. */ once: (eventName: PublicEvents, listener: EventEmitter.EventListener<PublicEvents, any>) => EventEmitter; /** * Removes all listeners, or those of the specified eventName. * It is bad practice to remove listeners added elsewhere in the code, * particularly when the EventEmitter instance was created by some other * component or module. * Returns a reference to the EventEmitter, so that calls can be chained. */ removeAllListeners: (eventName: PublicEvents) => EventEmitter; /** * Removes the specified listener from the listener array for the event named eventName. */ removeListener: (eventName: PublicEvents, listener: EventEmitter.EventListener<PublicEvents, any>) => EventEmitter; /** * The in-browser filesystem based on nodejs's * built-in module "fs" */ fs: IFs; /** * Returns the sample rate from Csound instance */ getSr: () => Promise<number>; /** * Returns the control rate from Csound instance */ getKr: () => Promise<number>; /** * Returns the ksmps value (kr/sr) from Csound instance */ getKsmps: () => Promise<number>; /** * Returns the number of output channels from Csound instance */ getNchnls: () => Promise<number>; /** * Returns the number of input channels from Csound instance */ getNchnlsInput: () => Promise<number>; /** * Returns the value of csoundGet0dBFS */ get0dBFS: () => Promise<number>; /** * Returns the A4 frequency reference */ getA4: () => Promise<number>; /** * Return the current performance time in samples */ getCurrentTimeSamples: () => Promise<number>; /** * Return the size of MYFLT in number of bytes */ getSizeOfMYFLT: () => Promise<number>; /** * Set a single csound option (flag), * no spaces are allowed in the string. */ setOption: (option: string) =>Promise<number>; /** * Configure Csound with a given set of * parameters defined in the CSOUND_PARAMS structure. * These parameters are the part of the OPARMS struct * that are configurable through command line flags. * The CSOUND_PARAMS structure can be obtained using * csoundGetParams(). * These options should only be changed before * performance has started. * @param csoundParams - csoundParams object */ setParams: (csoundParams: CSOUND_PARAMS) => Promise<undefined>; /** * Get the current set of parameters * from a Csound instance * in a CSOUND_PARAMS structure. * @returns - CSOUND_PARAMS object */ getParams: () => Promise<CSOUND_PARAMS>; /** * Returns whether Csound is set to print debug messages * sent through the DebugMsg() internal API function. * Anything different to 0 means true. */ getDebug: () => Promise<number>; /** * Return the size of MYFLT in number of bytes */ setDebug: (debug: number) => Promise<undefined>; /** * Inputs an immediate score event * without any pre-process parsing */ inputMessage: (scoreEvent: string) => Promise<number>; /** * Inputs an immediate score event * without any pre-process parsing */ inputMessageAsync: (scoreEvent: string) => Promise<number>; /** * Retrieves the value of control channel identified by channelName. * If the err argument is not NULL, the error (or success) code finding * or accessing the channel is stored in it. */ getControlChannel: (channelName: string) => Promise<undefined>; /** * Sets the value of control channel identified by channelName */ setControlChannel: (channelName: string, value: number) => Promise<undefined>; /** * Retrieves the string channel identified by channelName */ getStringChannel: (channelName: string) => Promise<undefined>; /** * Sets the string channel value identified by channelName */ setStringChannel: (channelName: string, value: string) => Promise<undefined>; /** * Returns the audio output name (-o) */ getOutputName: () => Promise<string>; /** * Returns the audio input name (-i) */ getInputName: () => Promise<string>; /** * Destroys an instance of Csound and frees memory */ destroy: () => Promise<undefined>; /** * Returns the API version as int */ getAPIVersion: () => Promise<number>; /** * Returns the Csound version as int */ getVersion: () => Promise<number>; /** * Initialise Csound with specific flags. * This is called internally by csoundCreate(), * so there is generally no need to use it explicitly * unless you need to avoid default initilization that * sets signal handlers and atexit() callbacks. * @returns - Return value is zero on success, * positive if initialisation was done already, and negative on error. */ initialize: () => Promise<number>; /** * Parses a csound orchestra string */ parseOrc: (orc: string) => Promise<object>; /** * Compiles AST tree */ compileTree: (tree: any) => Promise<number>; /** * Compiles a csound orchestra string */ compileOrc: (orc: string) => Promise<number>; /** * Compiles a csound orchestra string */ evalCode: (orc: string) => Promise<number>; /** * Prepares Csound for performance */ start: () => Promise<number>; /** * Compiles a Csound input file but does not perform it. */ compileCsd: (path: string) => Promise<number>; /** * Compiles a CSD string but does not perform it. */ compileCsdText: (orc: string) => Promise<number>; /** * Pauses a performance if it's running */ pause: () => Promise<undefined>; /** * Resumes a performance if it's paused */ resume: () => Promise<undefined>; /** * Performs(plays) audio until end is reached */ perform: () => Promise<number>; /** * Performs(plays) 1 ksmps worth of sample(s) */ performKsmps: () => Promise<number>; /** * Performs(plays) 1 buffer worth of audio */ performBuffer: () => Promise<number>; /** * Stops a csoundPerform */ stop: () => Promise<undefined>; /** * Prints information about the end of a performance, * and closes audio and MIDI devices. */ cleanup: () => Promise<number>; /** * Prints information about the end of a performance, * and closes audio and MIDI devices. */ reset: () => Promise<number>; /** * Returns the number of samples in Csound's input buffer. */ getInputBufferSize: () => Promise<number>; /** * Returns the number of samples in Csound's output buffer. */ getOutputBufferSize: () => Promise<number>; /** * Returns the address of the Csound audio input buffer. */ getInputBuffer: () => Promise<number>; /** * Returns the address of the Csound audio output buffer. */ getOutputBuffer: () => Promise<number>; /** * Returns the address of the Csound audio input working buffer (spin). * Enables external software to write audio into Csound before calling csoundPerformKsmps. */ getSpin: () => Promise<number>; /** * Returns the address of the Csound audio output working buffer (spout). * Enables external software to read audio from Csound after calling csoundPerformKsmps. */ getSpout: () => Promise<number>; /** * Sees whether Csound score events are performed or not, * independently of real-time MIDI events */ isScorePending: () => Promise<number>; /** * Sets whether Csound score events are performed or not * (real-time events will continue to be performed). * Can be used by external software, such as a VST host, * to turn off performance of score events (while continuing to perform real-time events), * for example to mute a Csound score while working on other tracks of a piece, * or to play the Csound instruments live. */ setScorePending: (pending: number) => Promise<undefined>; /** * Read, preprocess, and load a score from an ASCII string It can be called repeatedly, * with the new score events being added to the currently scheduled ones. */ readScore: (score: string) => Promise<undefined>; /** * Returns the current score time in seconds since the beginning of performance. */ getScoreTime: () => Promise<number>; /** * Returns the score time beginning at which score events will actually immediately be performed */ getScoreOffsetSeconds: () => Promise<number>; /** * Csound score events prior to the specified time are not performed, * and performance begins immediately at the specified time * (real-time events will continue to be performed as they are received). * Can be used by external software, such as a VST host, to begin * score performance midway through a Csound score, * for example to repeat a loop in a sequencer, * or to synchronize other events with the Csound score. */ setScoreOffsetSeconds: (time: number) => Promise<number>; /** * Rewinds a compiled Csound score to the time specified with csoundObj.setScoreOffsetSeconds(). */ rewindScore: () => Promise<number>; /** * Returns the length of a table * (not including the guard point), * or -1 if the table does not exist. */ tableLength: (tableNum: string) => Promise<number>; /** * Returns the value of a slot in a table. * The table number and index are assumed to be valid. */ tableGet: (tableNum: string, tableIndex: string) => Promise<number>; /** * Sets the value of a slot in a table. * The table number and index are assumed to be valid. */ tableSet: (tableNum: string, tableIndex: string, value: string) => Promise<undefined>; /** * Copy the contents of an Array or TypedArray from javascript into a given csound table. * The table number is assumed to be valid, and the table needs to have sufficient space * to receive all the array contents. */ tableCopyIn: (tableNum: string, array: number[] | ArrayLike<number>) => Promise<undefined>; /** * Copies the contents of a table from csound into Float64Array. * The returns a Float64Array if the table exists, otherwise * it returns undefined. */ tableCopyOut: (tableNum: string) => Promise<Float64Array | undefined>; getTable: (tableNum: string) => Promise<Float64Array | undefined>; /** * Copies the contents of a table from csound into Float64Array. * The returns a Float64Array if the table exists, otherwise * it returns undefined. */ getTableArgs: (tableNum: string) => Promise<Float64Array | undefined>; /** * Checks if a given GEN number num is a named GEN if so, * it returns the string length (excluding terminating NULL char). * Otherwise it returns 0. */ isNamedGEN: (tableNum: string) => Promise<number>; /** * Gets the GEN name from a number num, if this is a named GEN. * If the table number doesn't represent a named GEN, it will * return undefined. */ getNamedGEN: (tableNum: string) => Promise<string | undefined>; /** * Emit a midi message */ midiMessage: (status: number, data1: number, data2: number) => Promise<undefined>; /** * Terminates an instances and all its workers, making disabling any futher uses of a given instance. */ terminateInstance: () => Promise<void>; } /** * The default entry for @csound/wasm/browser module. * If loaded successfully, it returns CsoundObj, * otherwise undefined. * @param [params] - Initialization parameters * @param [params.audioContext] - Optional AudioContext to use; if none given, an AudioContext will be created. * @param [params.inputChannelCount] - Optional input channel count for AudioNode used with WebAudio graph. * Defaults to the value of nchnls_i in useWorker but 2 otherwise. * @param [params.outputChannelCount] - Optional output channel count AudioNode used with WebAudio graph. * Defaults to the value of nchnls in useWorker but 2 otherwise. * @param [params.autoConnect = true] - Set to configure Csound to automatically connect to the audioContext.destination output. * @param [params.withPlugins] - Array of WebAssembly Csound plugin libraries to use with Csound. * @param [params.useWorker = false] - Configure to use backend using Web Workers to run Csound in a thread separate from audio callback. * @param [params.useSAB = true] - Configure to use SharedArrayBuffers for WebWorker communications if platform supports it. * @param [params.useSPN = false] - Configure to use explicitly request ScriptProcessorNode rather than AudioWorklet. Recommended only for debug testing purposes. */ declare function Csound(params?: { audioContext?: AudioContext; inputChannelCount?: number; outputChannelCount?: number; autoConnect?: boolean; withPlugins?: object[]; useWorker?: boolean; useSAB?: boolean; useSPN?: boolean; }): Promise<CsoundObj | undefined>; declare type Csound = typeof Csound; declare type CSOUND_PARAMS = { debug_mode: number; buffer_frames: number; hardware_buffer_frames: number; displays: number; ascii_graphs: number; postscript_graphs: number; message_level: number; tempo: number; ring_bell: number; use_cscore: number; terminate_on_midi: number; heartbeat: number; defer_gen01_load: number; midi_key: number; midi_key_cps: number; midi_key_oct: number; midi_key_pch: number; midi_velocity: number; };