Documentation

Compatibility

Python wheels cover CPython 3.10+ on manylinux x86-64, Windows AMD64, macOS Intel, and macOS Apple Silicon; musllinux is not provided. Node.js >=18 is required. Chromium is acceptance-tested. Other evergreen browsers are designed for but unverified. AudioWorklet support requires HTTPS or localhost; direct file: loading is unsupported. The npm package is ESM-only; use .mjs or a consumer package with "type": "module". CommonJS require() is unsupported.

Graph v1 is supported on the JavaScript and Python bindings only; see Graph v1 supported surfaces.

The core does not decode, encode, resample, call ffmpeg, host VST/AU, or expose public integrated-LUFS/true-peak measurement.

Analyzers and telemetry

LevelMeter, NoteSpectrogram, Oscilloscope, SpectrumAnalyzer, Spectrogram, and StereoMeter expose decoded semantic observations in Python, JavaScript offline and streaming processing, and AudioWorklet. Telemetry is opt-in: the first callback or subscriber enables it and the last unsubscribe disables it. Long renders drain after every processing block. Public frames identify the semantic effect and contain owned arrays; binary frame types, versions, tap IDs, payload bytes, and Worklet transport stay private. Unknown or malformed frames are discarded.

Common metadata:

JavaScript / Python Meaning
kind / kind level, noteSpectrogram, oscilloscope, spectrum, spectrogram, or stereo
effectType / effect_type Semantic effect type
effectId / effect_id Declared effect ID, or null / None
effectIndex / effect_index Zero-based position in the declared DSP chain
sequence / sequence Per-tap telemetry sequence number
dropped / dropped Frames lost since the previous decoded delivery

Analyzer fields:

Kind JavaScript / Python Unit and shape / order
Level channels / channels Processing-channel order; each item has linear-amplitude peak, linear-amplitude rms, and boolean clipped (a sample exceeded full scale)
Oscilloscope sampleRate / sample_rate Hz
Oscilloscope captureSampleCount / capture_sample_count Samples in the full capture
Oscilloscope triggerOffset / trigger_offset Trigger position in samples from capture start
Oscilloscope triggered / triggered True for a real trigger; false for an automatic sweep
Oscilloscope encoding / encoding samples for raw points or minMax for ordered envelope points
Oscilloscope sampleIndices / sample_indices [point] capture indices, paired by position with values
Oscilloscope values / values [point] linear-amplitude values
Spectrum sampleRate / sample_rate Hz
Spectrum points / points FFT size exponent; FFT size is 2 ** points
Spectrum binsTruncated / bins_truncated True when the highest bins were omitted to fit transport capacity
Spectrum currentDb / current_db dBFS [bin], ascending frequency from DC
Spectrum peakDb / peak_db Peak-held dBFS [bin], same order and length as current
Note Spectrogram sampleRate / sample_rate Hz
Note Spectrogram timeSeconds / time_seconds Observation time in seconds on the processing timeline
Note Spectrogram firstMidi / first_midi 21, the first piano-key MIDI note before fine-pitch offsets are applied
Note Spectrogram hopSeconds / hop_seconds Nominal time step between analysis observations, in seconds
Note Spectrogram frameIndex / frame_index Unsigned observation counter within the current analysis generation
Note Spectrogram divisionsPerSemitone / divisions_per_semitone 5; each semitone has bins at -40, -20, 0, +20, and +40 cents around its center
Note Spectrogram generation / generation Non-zero analysis generation; a change indicates that analyzer state restarted
Note Spectrogram levels / levels Pitch confidence in [0, 1] as JavaScript Float32Array[440] or Python tuple[440]; index i maps to MIDI firstMidi + (i - 2) / divisionsPerSemitone
Note Spectrogram volumeDb / volume_db Volume in dB as JavaScript Float32Array[440] or Python tuple[440], with the same pitch indexing as levels; values include a 3 dB/octave correction above 100 Hz, and -240 dB means no level was measured
Spectrogram sampleRate / sample_rate Hz
Spectrogram timeSeconds / time_seconds Observation time in seconds on the processing timeline
Spectrogram points / points FFT size exponent; FFT size is 2 ** points
Spectrogram intensities / intensities uint8[256] display intensity, high-to-low log-frequency cells from index 0 through 255
Stereo sampleRate / sample_rate Hz
Stereo discontinuity / discontinuity True when the sample delta is incomplete after truncation or a window change
Stereo samples / samples JavaScript Float32Array[side0, mid0, ...]; Python tuple[(side, mid), ...]; linear amplitude where side is R-L and mid is L+R
Stereo envelope / envelope Linear-amplitude [360] polar-angle bins in index order
Stereo correlation / correlation Unitless stereo correlation in [-1, 1]
Stereo balance / balance Right-versus-left energy balance in dB
Stereo peakLeft / peak_left Left linear-amplitude peak
Stereo peakRight / peak_right Right linear-amplitude peak

frame.dropped reports loss since the previous decoded delivery. By contrast, dropped_telemetry_frames on a Python stream and droppedTelemetryFrames on a JavaScript stream or node are cumulative for that object’s lifetime.

Telemetry stays local: the library only passes decoded frames to in-process Python callbacks or callbacks in the browser page. It does not automatically collect, persist, or send telemetry over the network, and it does not collect device or user identifiers.

Other catalog telemetry remains metadata-only in v0.1. Integrated LUFS, BS.1770/EBU R128, true peak, and dynamics gain-reduction observations are not part of this API.