ReScript bindings for the Web Audio API
npm install rescript-audioReScript bindings for the Web Audio API.
``bash`
npm install rescript-audio
Add to your rescript.json:
`json`
{
"dependencies": ["rescript-audio"]
}
`rescript
// Create an audio context
let ctx = Audio.Context.make()
// Create an oscillator with options
let osc = Audio.Oscillator.make(ctx, ~options={
waveform: Sine,
frequency: 440.0,
})
// Create a gain node
let gain = Audio.Gain.make(ctx, ~options={gain: 0.5})
// Connect oscillator -> gain -> destination
Audio.Utils.chain([
osc->Audio.Oscillator.asNode,
gain->Audio.Gain.asNode,
Audio.ContextExt.destination(ctx)->Audio.Destination.asNode,
])
// Start the oscillator
Audio.Oscillator.start(osc)
// Schedule parameter changes
Audio.Gain.gainParam(gain)
->Audio.Param.setValueAtTime(~value=0.5, ~startTime=Audio.Context.currentTime(ctx))
->Audio.Param.linearRampToValueAtTime(~value=0.0, ~endTime=Audio.Context.currentTime(ctx) +. 1.0)
->ignore
`
`rescript`
Audio.Context.make() // Create new AudioContext
Audio.Context.makeWithOptions(options) // Create with options
Audio.Context.sampleRate(ctx) // Get sample rate
Audio.Context.currentTime(ctx) // Get current time
Audio.Context.state(ctx) // Get state: Suspended | Running | Closed
Audio.Context.resume(ctx) // Resume (returns promise)
Audio.Context.suspend(ctx) // Suspend (returns promise)
Audio.Context.close(ctx) // Close (returns promise)
`rescript`
// Waveform types: Sine | Square | Sawtooth | Triangle | Custom
Audio.Oscillator.make(ctx, ~options=?)
Audio.Oscillator.frequencyParam(osc) // Get frequency AudioParam
Audio.Oscillator.detuneParam(osc) // Get detune AudioParam
Audio.Oscillator.waveform(osc) // Get current waveform
Audio.Oscillator.setWaveform(osc, w) // Set waveform
Audio.Oscillator.start(osc) // Start immediately
Audio.Oscillator.startAt(osc, time) // Start at time
Audio.Oscillator.stop(osc) // Stop immediately
Audio.Oscillator.stopAt(osc, time) // Stop at time
`rescript`
Audio.Gain.make(ctx, ~options=?)
Audio.Gain.gainParam(gain) // Get gain AudioParam
`rescript`
// Filter types: Lowpass | Highpass | Bandpass | Lowshelf | Highshelf | Peaking | Notch | Allpass
Audio.BiquadFilter.make(ctx, ~options=?)
Audio.BiquadFilter.frequencyParam(f)
Audio.BiquadFilter.detuneParam(f)
Audio.BiquadFilter.qParam(f)
Audio.BiquadFilter.gainParam(f)
Audio.BiquadFilter.filterType(f)
Audio.BiquadFilter.setFilterType(f, ft)
`rescript`
Audio.Delay.make(ctx, ~options=?)
Audio.Delay.delayTimeParam(d)
`rescript`
Audio.Compressor.make(ctx, ~options=?)
Audio.Compressor.thresholdParam(c)
Audio.Compressor.kneeParam(c)
Audio.Compressor.ratioParam(c)
Audio.Compressor.attackParam(c)
Audio.Compressor.releaseParam(c)
Audio.Compressor.reductionDb(c) // Current gain reduction in dB
`rescript`
Audio.StereoPanner.make(ctx, ~options=?)
Audio.StereoPanner.panParam(p) // -1.0 (left) to 1.0 (right)
`rescript`
Audio.Analyser.make(ctx, ~options=?)
Audio.Analyser.fftSize(a)
Audio.Analyser.setFftSize(a, size)
Audio.Analyser.frequencyBinCount(a)
Audio.Analyser.getFloatFrequencyData(a, array)
Audio.Analyser.getByteFrequencyData(a, array)
Audio.Analyser.getFloatTimeDomainData(a, array)
Audio.Analyser.getByteTimeDomainData(a, array)
`rescript`
Audio.Param.value(p) // Get current value
Audio.Param.setValue(p, v) // Set value immediately
Audio.Param.setValueAtTime(p, ~value, ~startTime)
Audio.Param.linearRampToValueAtTime(p, ~value, ~endTime)
Audio.Param.exponentialRampToValueAtTime(p, ~value, ~endTime)
Audio.Param.setTargetAtTime(p, ~target, ~startTime, ~timeConstant)
Audio.Param.setValueCurveAtTime(p, ~values, ~startTime, ~duration)
Audio.Param.cancelScheduledValues(p, ~cancelTime)
Audio.Param.cancelAndHoldAtTime(p, ~cancelTime)
`rescript`
Audio.Node.connect(source, destination)
Audio.Node.connectToParam(source, param)
Audio.Node.disconnect(node)
Audio.Node.disconnectFrom(node, target)
Audio.Node.numberOfInputs(node)
Audio.Node.numberOfOutputs(node)
`rescript`
Audio.Utils.chain(nodes) // Connect array of nodes in series
Audio.Utils.toDestination(ctx, node) // Connect node to destination
`bash`
npm install
npm run build
npm test
npm run watch # Development mode
This project uses Conventional Commits for automatic versioning and changelog generation.
`
[optional body]
[optional footer(s)]
`
| Type | Description | Version Bump |
|------|-------------|--------------|
| feat | New feature | Minor |fix
| | Bug fix | Patch |perf
| | Performance improvement | Patch |refactor
| | Code refactoring | Patch |docs
| | Documentation changes | Patch (README only) |chore
| | Maintenance tasks | No release |test
| | Test changes | No release |
Add BREAKING CHANGE: in the commit footer or ! after the type for major version bumps:
`
feat!: remove deprecated API
BREAKING CHANGE: The old API has been removed.
`
`bash``
git commit -m "feat(oscillator): add custom waveform support"
git commit -m "fix(gain): correct parameter range validation"
git commit -m "docs(README): add filter examples"
MIT