Initial commit
This commit is contained in:
37
website/src/content/am.md
Normal file
37
website/src/content/am.md
Normal file
@@ -0,0 +1,37 @@
|
||||
---
|
||||
title: "Amplitude Modulation"
|
||||
slug: "am"
|
||||
group: "synthesis"
|
||||
order: 109
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
Amplitude modulation multiplies the signal by a modulating oscillator. The formula preserves the original signal at depth 0: <code>signal *= 1.0 + modulator * depth</code>. This creates sidebands at <code>carrier ± modulator</code> frequencies while keeping the carrier present.
|
||||
|
||||
<CommandEntry name="am" type="number" min={0} default={0} unit="Hz">
|
||||
|
||||
AM oscillator frequency in Hz. When set above 0, an LFO modulates the signal amplitude.
|
||||
|
||||
<CodeEditor code={`/freq/300/am/4/amdepth/0.5`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="amdepth" type="number" min={0} max={1} default={0.5}>
|
||||
|
||||
Modulation depth (0-1). At 0, the signal is unchanged. At 1, the signal varies between 0 and 2x its amplitude.
|
||||
|
||||
<CodeEditor code={`/freq/300/am/2/amdepth/1.0`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="amshape" type="string" default="sine">
|
||||
|
||||
AM LFO waveform shape. Options: `sine`, `tri`, `saw`, `square`, `sh` (sample-and-hold).
|
||||
|
||||
<CodeEditor code={`/freq/300/am/4/amdepth/0.8/amshape/square`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
69
website/src/content/bandpass.md
Normal file
69
website/src/content/bandpass.md
Normal file
@@ -0,0 +1,69 @@
|
||||
---
|
||||
title: "Bandpass Filter"
|
||||
slug: "bandpass"
|
||||
group: "effects"
|
||||
order: 112
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
A bandpass filter attenuates frequencies outside a band around the center frequency. Each filter has its own ADSR envelope that modulates the center frequency.
|
||||
|
||||
<CommandEntry name="bpf" type="number" min={20} max={20000} unit="Hz">
|
||||
|
||||
Center frequency in Hz. Frequencies outside the band are attenuated.
|
||||
|
||||
<CodeEditor code={`/sound/saw/bpf/800`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="bpq" type="number" min={0} max={1} default={0.2}>
|
||||
|
||||
Resonance (0-1). Higher values narrow the passband.
|
||||
|
||||
<CodeEditor code={`/sound/saw/bpf/800/bpq/.5`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="bpe" type="number" default={0}>
|
||||
|
||||
Envelope amount. Positive values sweep the center up, negative values sweep down.
|
||||
|
||||
<CodeEditor code={`/sound/saw/bpf/800/bpe/5/bpd/.25`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="bpa" type="number" min={0} default={0} unit="s">
|
||||
|
||||
Envelope attack time in seconds.
|
||||
|
||||
<CodeEditor code={`/sound/saw/bpf/800/bpa/.2`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="bpd" type="number" min={0} default={0} unit="s">
|
||||
|
||||
Envelope decay time in seconds.
|
||||
|
||||
<CodeEditor code={`/sound/saw/bpf/800/bpd/.2`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="bps" type="number" min={0} max={1} default={1}>
|
||||
|
||||
Envelope sustain level (0-1).
|
||||
|
||||
<CodeEditor code={`/sound/saw/bpf/800/bpd/.2/bps/.5`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="bpr" type="number" min={0} default={0} unit="s">
|
||||
|
||||
Envelope release time in seconds.
|
||||
|
||||
<CodeEditor code={`/sound/saw/bpf/800/bpr/.25/duration/.1/release/.25`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
103
website/src/content/basic.md
Normal file
103
website/src/content/basic.md
Normal file
@@ -0,0 +1,103 @@
|
||||
---
|
||||
title: "Basic"
|
||||
slug: "basic"
|
||||
group: "sources"
|
||||
order: 0
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
These sources provide fundamental waveforms that can be combined and manipulated to create complex sounds. They are inspired by classic substractive synthesizers.
|
||||
|
||||
<CommandEntry name="sine" type="source">
|
||||
|
||||
Pure sine wave. The simplest waveform with no harmonics.
|
||||
|
||||
<CodeEditor code={`/sound/sine`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/sine/note/60`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="tri" type="source">
|
||||
|
||||
Triangle wave. The default source. Contains only odd harmonics with gentle rolloff.
|
||||
|
||||
<CodeEditor code={`/sound/tri`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/tri/note/60`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="saw" type="source">
|
||||
|
||||
Band-limited sawtooth wave. Rich in harmonics, bright and buzzy.
|
||||
|
||||
<CodeEditor code={`/sound/saw`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/saw/note/60`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="zaw" type="source">
|
||||
|
||||
Naive sawtooth with no anti-aliasing. Cheaper but more aliasing artifacts than saw.
|
||||
|
||||
<CodeEditor code={`/sound/zaw`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/zaw/note/60`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="pulse" type="source">
|
||||
|
||||
Band-limited pulse wave. Hollow sound with only odd harmonics. Use /pw to control pulse width.
|
||||
|
||||
<CodeEditor code={`/sound/pulse`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/pulse/pw/0.25`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="pulze" type="source">
|
||||
|
||||
Naive pulse with no anti-aliasing. Cheaper but more aliasing artifacts than pulse.
|
||||
|
||||
<CodeEditor code={`/sound/pulze`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/pulze/pw/0.25`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="white" type="source">
|
||||
|
||||
White noise. Equal energy at all frequencies.
|
||||
|
||||
<CodeEditor code={`/sound/white`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/white/lpf/2000`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="pink" type="source">
|
||||
|
||||
Pink noise (1/f). Equal energy per octave, more natural sounding.
|
||||
|
||||
<CodeEditor code={`/sound/pink`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/pink/lpf/4000`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="brown" type="source">
|
||||
|
||||
Brown/red noise (1/f^2). Deep rumbling, heavily weighted toward low frequencies.
|
||||
|
||||
<CodeEditor code={`/sound/brown`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/brown/hpf/100`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
43
website/src/content/chorus.md
Normal file
43
website/src/content/chorus.md
Normal file
@@ -0,0 +1,43 @@
|
||||
---
|
||||
title: "Chorus"
|
||||
slug: "chorus"
|
||||
group: "effects"
|
||||
order: 202
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
A rich chorus effect that adds depth and movement to any sound.
|
||||
|
||||
<CommandEntry name="chorus" type="number" min={0} default={0} unit="Hz">
|
||||
|
||||
Chorus LFO rate in Hz.
|
||||
|
||||
<CodeEditor code={`/sound/saw/freq/100/chorus/0.1`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/saw/freq/100/chorus/0.05/chorusdepth/0.7`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="chorusdepth" type="number" min={0} max={1} default={0.5}>
|
||||
|
||||
Chorus modulation depth (0-1).
|
||||
|
||||
<CodeEditor code={`/sound/saw/freq/200/chorus/0.5/chorusdepth/0.3`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/pulse/freq/100/chorus/0.2/chorusdepth/0.9`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="chorusdelay" type="number" min={0} default={20} unit="ms">
|
||||
|
||||
Chorus base delay time in milliseconds.
|
||||
|
||||
<CodeEditor code={`/sound/saw/freq/200/chorus/0.3/chorusdelay/20`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/saw/freq/200/chorus/0.3/chorusdelay/30`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
47
website/src/content/comb.md
Normal file
47
website/src/content/comb.md
Normal file
@@ -0,0 +1,47 @@
|
||||
---
|
||||
title: "Comb Filter"
|
||||
slug: "comb"
|
||||
group: "effects"
|
||||
order: 113
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
Send effect with feedback comb filter. Creates pitched resonance, metallic timbres, and Karplus-Strong plucked sounds. Tail persists after voice ends.
|
||||
|
||||
<CommandEntry name="comb" type="number" min={0} max={1} default={0}>
|
||||
|
||||
Send amount to comb filter.
|
||||
|
||||
<CodeEditor code={`/sound/white/comb/1/combfreq/110/decay/.5/sustain/0`} rows={2} />
|
||||
|
||||
Noise into a tuned comb creates plucked string sounds (Karplus-Strong).
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="combfreq" type="number" min={20} max={20000} default={220} unit="Hz">
|
||||
|
||||
Resonant frequency. All voices share the same orbit comb.
|
||||
|
||||
<CodeEditor code={`/sound/saw/comb/0.5/combfreq/880/decay/.5/sustain/0`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="combfeedback" type="number" min={0} max={0.99} default={0.9}>
|
||||
|
||||
Feedback amount. Higher values create longer resonance.
|
||||
|
||||
<CodeEditor code={`/sound/white/comb/1/combfeedback/0.99/combfreq/220/decay/.5/sustain/0`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="combdamp" type="number" min={0} max={1} default={0.1}>
|
||||
|
||||
High-frequency damping. Higher values darken the sound over time.
|
||||
|
||||
<CodeEditor code={`/sound/white/comb/1/combfeedback/0.95/combdamp/0.4/combfreq/220/decay/.5/sustain/0`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
58
website/src/content/delay.md
Normal file
58
website/src/content/delay.md
Normal file
@@ -0,0 +1,58 @@
|
||||
---
|
||||
title: "Delay"
|
||||
slug: "delay"
|
||||
group: "effects"
|
||||
order: 203
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
Stereo delay line with feedback (max 1 second at 48kHz, clamped to 0.95 feedback).
|
||||
|
||||
<CommandEntry name="delay" type="number" min={0} max={1} default={0}>
|
||||
|
||||
Send level to the delay bus.
|
||||
|
||||
<CodeEditor code={`/delay/.5/duration/.1`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="delayfeedback" type="number" min={0} max={1} default={0.5}>
|
||||
|
||||
Feedback amount (clamped to 0.95 max). Output is fed back into input.
|
||||
|
||||
<CodeEditor code={`/delay/.5/delayfeedback/.8/duration/.1`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="delaytime" type="number" min={0} default={0.25} unit="s">
|
||||
|
||||
Delay time in seconds (max ~1s at 48kHz).
|
||||
|
||||
<CodeEditor code={`/delay/.5/delaytime/.08/duration/.1`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="delaytype" type="enum" default="standard" values={["standard", "pingpong", "tape", "multitap"]}>
|
||||
|
||||
<ul>
|
||||
<li><strong>standard</strong> — Clean digital. Precise repeats.</li>
|
||||
<li><strong>pingpong</strong> — Mono in, bounces L→R→L→R.</li>
|
||||
<li><strong>tape</strong> — Each repeat darker. Analog warmth.</li>
|
||||
<li><strong>multitap</strong> — 4 taps. Feedback 0=straight, 1=triplet, between=swing.</li>
|
||||
</ul>
|
||||
|
||||
<CodeEditor code={`/sound/saw/delay/.6/dtype/std/delaytime/.15/delayfeedback/.7/d/.05`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/saw/delay/.7/dtype/pp/delaytime/.12/delayfeedback/.8/d/.05`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/saw/delay/.6/dtype/tape/delaytime/.2/delayfeedback/.9/d/.05`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/saw/delay/.7/dtype/multi/delaytime/.3/delayfeedback/0/d/.05`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/saw/delay/.7/dtype/multi/delaytime/.3/delayfeedback/1/d/.05`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
56
website/src/content/envelope.md
Normal file
56
website/src/content/envelope.md
Normal file
@@ -0,0 +1,56 @@
|
||||
---
|
||||
title: "Envelope"
|
||||
slug: "envelope"
|
||||
group: "synthesis"
|
||||
order: 102
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
The envelope parameters control the shape of the gain envelope over time. It uses a typical ADSR envelope with exponential curves:
|
||||
|
||||
- **Attack**: Ramps from 0 to full amplitude. Uses <code>x²</code> (slow start, fast finish).
|
||||
- **Decay**: Falls from full amplitude to the sustain level. Uses <code>1-(1-x)²</code> (fast drop, slow finish).
|
||||
- **Sustain**: Holds at a constant level while the note is held.
|
||||
- **Release**: Falls from the sustain level to 0 when the note ends. Uses <code>1-(1-x)²</code> (fast drop, slow finish).
|
||||
|
||||
<CommandEntry name="attack" type="number" min={0} default={0.001} unit="s">
|
||||
|
||||
The duration (seconds) of the attack phase of the gain envelope.
|
||||
|
||||
<CodeEditor code={`/attack/.1`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/attack/.5`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="decay" type="number" min={0} default={0} unit="s">
|
||||
|
||||
The duration (seconds) of the decay phase of the gain envelope.
|
||||
|
||||
<CodeEditor code={`/decay/.1`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/decay/.5`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="sustain" type="number" min={0} max={1} default={1}>
|
||||
|
||||
The sustain level (0-1) of the gain envelope.
|
||||
|
||||
<CodeEditor code={`/decay/.1/sustain/.2`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/decay/.1/sustain/.6`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="release" type="number" min={0} default={0.005} unit="s">
|
||||
|
||||
The duration (seconds) of the release phase of the gain envelope.
|
||||
|
||||
<CodeEditor code={`/duration/.25/release/.25`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
43
website/src/content/flanger.md
Normal file
43
website/src/content/flanger.md
Normal file
@@ -0,0 +1,43 @@
|
||||
---
|
||||
title: "Flanger"
|
||||
slug: "flanger"
|
||||
group: "effects"
|
||||
order: 201
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
LFO-modulated delay (0.5-10ms) with feedback and linear interpolation. Output is 50% dry, 50% wet.
|
||||
|
||||
<CommandEntry name="flanger" type="number" min={0} default={0} unit="Hz">
|
||||
|
||||
Flanger LFO rate in Hz. Creates sweeping comb filter effect with short delay modulation.
|
||||
|
||||
<CodeEditor code={`/sound/saw/freq/100/flanger/0.5`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/tri/freq/200/flanger/2/flangerdepth/0.8`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="flangerdepth" type="number" min={0} max={1} default={0.5}>
|
||||
|
||||
Flanger modulation depth (0-1). Controls delay time sweep range.
|
||||
|
||||
<CodeEditor code={`/sound/saw/freq/100/flanger/1/flangerdepth/0.3`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/pulse/freq/80/flanger/0.5/flangerdepth/0.9`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="flangerfeedback" type="number" min={0} max={0.95} default={0}>
|
||||
|
||||
Flanger feedback amount (0-0.95).
|
||||
|
||||
<CodeEditor code={`/sound/saw/freq/100/flanger/1/flangerfeedback/0.7`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/tri/freq/150/flanger/0.3/flangerdepth/0.5/flangerfeedback/0.9`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
83
website/src/content/frequency-modulation.md
Normal file
83
website/src/content/frequency-modulation.md
Normal file
@@ -0,0 +1,83 @@
|
||||
---
|
||||
title: "Frequency Modulation"
|
||||
slug: "frequency-modulation"
|
||||
group: "synthesis"
|
||||
order: 108
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
Any source can be frequency modulated. Frequency modulation (FM) is a technique where the frequency of a carrier wave is varied by an audio signal. This creates complex timbres and can produce rich harmonics, from mellow timbres to harsh digital noise.
|
||||
|
||||
<CommandEntry name="fm" type="number" min={0} default={0}>
|
||||
|
||||
The frequency modulation index. FM multiplies the gain of the modulator, thus controls the amount of FM applied.
|
||||
|
||||
<CodeEditor code={`/fm/2/note/60\n\n/fm/4/note/63\n\n/fm/2/note/67`} rows={6} />
|
||||
|
||||
<CodeEditor code={`/voice/0/fm/2/time/0\n\n/voice/0/fm/4/time/1`} rows={4} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="fmh" type="number" default={1}>
|
||||
|
||||
The harmonic ratio of the frequency modulation. fmh*freq defines the modulation frequency. As a rule of thumb, numbers close to simple ratios sound more harmonic.
|
||||
|
||||
<CodeEditor code={`/fm/2/fmh/2/`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/fm/0.5/fmh/1.5/`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/fm/0.25/fmh/3/`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="fmshape" type="string" default="sine">
|
||||
|
||||
FM modulator waveform shape. Options: `sine`, `tri`, `saw`, `square`, `sh` (sample-and-hold). Different shapes create different harmonic spectra.
|
||||
|
||||
<CodeEditor code={`/fm/2/fmshape/saw`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="fmenv" type="number" default={0}>
|
||||
|
||||
Envelope amount of frequency envelope.
|
||||
|
||||
<CodeEditor code={`/fm/4/fmenv/4/fmd/0.25`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="fma" type="number" min={0} default={0} unit="s">
|
||||
|
||||
The duration (seconds) of the fm envelope's attack phase.
|
||||
|
||||
<CodeEditor code={`/fm/4/fma/0.25`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="fmd" type="number" min={0} default={0} unit="s">
|
||||
|
||||
The duration (seconds) of the fm envelope's decay phase.
|
||||
|
||||
<CodeEditor code={`/fm/4/fmd/0.25`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="fms" type="number" min={0} max={1} default={1}>
|
||||
|
||||
The sustain level of the fm envelope.
|
||||
|
||||
<CodeEditor code={`/fm/4/fmd/0.25/fms/.5`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="fmr" type="number" min={0} default={0} unit="s">
|
||||
|
||||
The duration (seconds) of the fm envelope's release phase.
|
||||
|
||||
<CodeEditor code={`/fm/4/fmr/1/release/1/duration/.1`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
21
website/src/content/ftype.md
Normal file
21
website/src/content/ftype.md
Normal file
@@ -0,0 +1,21 @@
|
||||
---
|
||||
title: "Filter Type"
|
||||
slug: "ftype"
|
||||
group: "effects"
|
||||
order: 114
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
Controls the steepness of all filters. Higher dB/octave values create sharper transitions between passed and attenuated frequencies.
|
||||
|
||||
<CommandEntry name="ftype" type="enum" default="12db" values={["12db", "24db", "48db"]}>
|
||||
|
||||
Filter slope steepness. Higher dB/octave values create sharper cutoffs. Applies to all filter types (lowpass, highpass, bandpass).
|
||||
|
||||
<CodeEditor code={`/sound/pulse/freq/50/lpf/500/lpq/0.8/lpe/4/lpd/0.2/ftype/12db/d/.5\n\n/sound/pulse/freq/50/lpf/500/lpq/0.8/lpe/4/lpd/0.2/ftype/24db/time/1/d/.5\n\n/sound/pulse/freq/50/lpf/500/lpq/0.8/lpe/4/lpd/0.2/ftype/48db/time/2/d/.5`} rows={6} />
|
||||
|
||||
</CommandEntry>
|
||||
45
website/src/content/gain.md
Normal file
45
website/src/content/gain.md
Normal file
@@ -0,0 +1,45 @@
|
||||
---
|
||||
title: "Gain"
|
||||
slug: "gain"
|
||||
group: "synthesis"
|
||||
order: 105
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
The signal path is: oscillator → <code>gain * velocity</code> → filters → distortion → modulation → phaser/flanger → <code>envelope * postgain</code> → chorus → <code>pan</code>.
|
||||
|
||||
<CommandEntry name="gain" type="number" min={0} default={1}>
|
||||
|
||||
Pre-filter gain multiplier. Applied before filters and distortion, combined with <code>velocity</code> as <code>gain * velocity</code>.
|
||||
|
||||
<CodeEditor code={`/sound/saw/gain/0.2`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="postgain" type="number" min={0} default={1}>
|
||||
|
||||
Post-effects gain multiplier. Applied after phaser/flanger, combined with the envelope as <code>envelope * postgain</code>.
|
||||
|
||||
<CodeEditor code={`/sound/saw/postgain/0.2\n\n/sound/saw/postgain/1/time/0.25`} rows={4} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="velocity" type="number" min={0} max={1} default={1}>
|
||||
|
||||
Multiplied with <code>gain</code> before filters. Also passed as <code>accent</code> to Plaits engines.
|
||||
|
||||
<CodeEditor code={`/sound/saw/velocity/0.2\n\n/sound/saw/velocity/1/time/0.25`} rows={4} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="pan" type="number" min={0} max={1} default={0.5}>
|
||||
|
||||
Stereo position using constant-power panning: <code>left = cos(pan * π/2)</code>, <code>right = sin(pan * π/2)</code>. 0 = left, 0.5 = center, 1 = right.
|
||||
|
||||
<CodeEditor code={`/pan/0/freq/329\n\n/pan/1/freq/331`} rows={4} />
|
||||
|
||||
</CommandEntry>
|
||||
69
website/src/content/highpass.md
Normal file
69
website/src/content/highpass.md
Normal file
@@ -0,0 +1,69 @@
|
||||
---
|
||||
title: "Highpass Filter"
|
||||
slug: "highpass"
|
||||
group: "effects"
|
||||
order: 111
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
A highpass filter attenuates frequencies below the cutoff. Each filter has its own ADSR envelope that modulates the cutoff frequency.
|
||||
|
||||
<CommandEntry name="hpf" type="number" min={20} max={20000} unit="Hz">
|
||||
|
||||
Cutoff frequency in Hz. Frequencies below this are attenuated.
|
||||
|
||||
<CodeEditor code={`/sound/saw/hpf/500`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="hpq" type="number" min={0} max={1} default={0.2}>
|
||||
|
||||
Resonance (0-1). Boosts frequencies near the cutoff.
|
||||
|
||||
<CodeEditor code={`/sound/saw/hpf/500/hpq/.5`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="hpe" type="number" default={0}>
|
||||
|
||||
Envelope amount. Positive values sweep the cutoff up, negative values sweep down.
|
||||
|
||||
<CodeEditor code={`/sound/saw/hpf/500/hpe/5/hpd/.25`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="hpa" type="number" min={0} default={0} unit="s">
|
||||
|
||||
Envelope attack time in seconds.
|
||||
|
||||
<CodeEditor code={`/sound/saw/hpf/500/hpa/.25`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="hpd" type="number" min={0} default={0} unit="s">
|
||||
|
||||
Envelope decay time in seconds.
|
||||
|
||||
<CodeEditor code={`/sound/saw/hpf/500/hpd/.25`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="hps" type="number" min={0} max={1} default={1}>
|
||||
|
||||
Envelope sustain level (0-1).
|
||||
|
||||
<CodeEditor code={`/sound/saw/hpf/500/hpd/.25/hps/.4`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="hpr" type="number" min={0} default={0} unit="s">
|
||||
|
||||
Envelope release time in seconds.
|
||||
|
||||
<CodeEditor code={`/sound/saw/hpf/500/hpr/.25/duration/.1/release/.25`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
25
website/src/content/io.md
Normal file
25
website/src/content/io.md
Normal file
@@ -0,0 +1,25 @@
|
||||
---
|
||||
title: "Io"
|
||||
slug: "io"
|
||||
group: "sources"
|
||||
order: 2
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
This special source allows you to create a live audio input (microphone) source. Click the 'Enable Mic' button in the nav bar first. Effects chain applies normally, envelopes are applied to the input signal too.
|
||||
|
||||
<CommandEntry name="live" type="source">
|
||||
|
||||
Live audio input (microphone). Click the 'Enable Mic' button in the nav bar first. Effects chain applies normally.
|
||||
|
||||
<CodeEditor code={`/sound/live`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/live/lpf/800`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/live/verb/0.5`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
61
website/src/content/lofi.md
Normal file
61
website/src/content/lofi.md
Normal file
@@ -0,0 +1,61 @@
|
||||
---
|
||||
title: "Lo-Fi"
|
||||
slug: "lofi"
|
||||
group: "effects"
|
||||
order: 205
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
Sample rate reduction, bit crushing, and waveshaping distortion.
|
||||
|
||||
<CommandEntry name="coarse" type="number" min={1} default={1}>
|
||||
|
||||
Sample rate reduction. Holds each sample for <code>n</code> samples, creating stair-stepping and aliasing artifacts.
|
||||
|
||||
<CodeEditor code={`/penv/36/pdec/.5/coarse/8`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="crush" type="number" min={1} max={16} default={16} unit="bits">
|
||||
|
||||
Bit depth reduction. Quantizes amplitude to <code>2^(bits-1)</code> levels, creating stepping distortion.
|
||||
|
||||
<CodeEditor code={`/penv/36/pdec/.5/crush/4`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="fold" type="number" min={1} default={1}>
|
||||
|
||||
Sine-based wavefold (Serge-style). At 1, near-passthrough. At 2, one fold per peak. At 4, two folds.
|
||||
|
||||
<CodeEditor code={`/sound/sine/fold/3`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="wrap" type="number" min={1} default={1}>
|
||||
|
||||
Wrap distortion. Signal wraps around creating harsh digital artifacts.
|
||||
|
||||
<CodeEditor code={`/sound/tri/wrap/2`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="distort" type="number" min={0} default={0}>
|
||||
|
||||
Soft-clipping waveshaper using <code>(1+k)*x / (1+k*|x|)</code> where <code>k = e^amount - 1</code>. Higher values add harmonic saturation.
|
||||
|
||||
<CodeEditor code={`/sound/sine/distort/4`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="distortvol" type="number" min={0} default={1}>
|
||||
|
||||
Output gain applied after distortion to compensate for increased level.
|
||||
|
||||
<CodeEditor code={`/sound/sine/distort/4/distortvol/.5`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
69
website/src/content/lowpass.md
Normal file
69
website/src/content/lowpass.md
Normal file
@@ -0,0 +1,69 @@
|
||||
---
|
||||
title: "Lowpass Filter"
|
||||
slug: "lowpass"
|
||||
group: "effects"
|
||||
order: 110
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
A lowpass filter attenuates frequencies above the cutoff. Each filter has its own ADSR envelope that modulates the cutoff frequency.
|
||||
|
||||
<CommandEntry name="lpf" type="number" min={20} max={20000} unit="Hz">
|
||||
|
||||
Cutoff frequency in Hz. Frequencies above this are attenuated.
|
||||
|
||||
<CodeEditor code={`/sound/saw/lpf/200`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="lpq" type="number" min={0} max={1} default={0.2}>
|
||||
|
||||
Resonance (0-1). Boosts frequencies near the cutoff.
|
||||
|
||||
<CodeEditor code={`/sound/saw/lpf/200/lpq/.5`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="lpe" type="number" default={0}>
|
||||
|
||||
Envelope amount. Positive values sweep the cutoff up, negative values sweep down.
|
||||
|
||||
<CodeEditor code={`/sound/saw/lpf/100/lpe/5/lpd/.25`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="lpa" type="number" min={0} default={0} unit="s">
|
||||
|
||||
Envelope attack time in seconds.
|
||||
|
||||
<CodeEditor code={`/sound/saw/lpf/100/lpa/.25`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="lpd" type="number" min={0} default={0} unit="s">
|
||||
|
||||
Envelope decay time in seconds.
|
||||
|
||||
<CodeEditor code={`/sound/saw/lpf/100/lpd/.25`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="lps" type="number" min={0} max={1} default={1}>
|
||||
|
||||
Envelope sustain level (0-1).
|
||||
|
||||
<CodeEditor code={`/sound/saw/lpf/100/lpd/.25/lps/.4`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="lpr" type="number" min={0} default={0} unit="s">
|
||||
|
||||
Envelope release time in seconds.
|
||||
|
||||
<CodeEditor code={`/sound/saw/lpf/100/lpr/.25/duration/.1/release/.25`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
63
website/src/content/oscillator.md
Normal file
63
website/src/content/oscillator.md
Normal file
@@ -0,0 +1,63 @@
|
||||
---
|
||||
title: "Oscillator"
|
||||
slug: "oscillator"
|
||||
group: "synthesis"
|
||||
order: 104
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
These parameters are dedicated to alter the nominal behavior of each oscillator. Some parameters are specific to certain oscillators, most others can be used with all oscillators.
|
||||
|
||||
<CommandEntry name="pw" type="number" min={0} max={1} default={0.5}>
|
||||
|
||||
The pulse width (between 0 and 1) of the pulse oscillator. The default is 0.5 (square wave). Only has an effect when used with <code>/sound/pulse</code> or <code>/sound/pulze</code>.
|
||||
|
||||
<CodeEditor code={`/sound/pulse/pw/.1`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="spread" type="number" min={0} max={100} default={0}>
|
||||
|
||||
Stereo unison. Adds 6 detuned voices (7 total) with stereo panning. Works with sine, tri, saw, zaw, pulse, pulze.
|
||||
|
||||
<CodeEditor code={`/sound/saw/spread/30`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
Inspired by the M8 Tracker's WavSynth, these parameters transform the oscillator phase to create new timbres from basic waveforms. They work with all basic oscillators (sine, tri, saw, zaw, pulse, pulze).
|
||||
|
||||
<CommandEntry name="size" type="number" min={0} max={256} default={0}>
|
||||
|
||||
Phase quantization steps. Creates stair-step waveforms similar to 8-bit sound chips. Set to 0 to disable, or 2-256 for increasing resolution. Lower values produce more lo-fi, chiptune-like sounds.
|
||||
|
||||
<CodeEditor code={`/sound/sine/size/8`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="mult" type="number" min={0.25} max={16} default={1}>
|
||||
|
||||
Phase multiplier that wraps the waveform multiple times per cycle. Creates hard-sync-like harmonic effects. A value of 2 doubles the frequency content, 4 quadruples it, etc.
|
||||
|
||||
<CodeEditor code={`/sound/saw/mult/4`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="warp" type="number" min={-1} max={1} default={0}>
|
||||
|
||||
Phase asymmetry using a power curve. Positive values compress the early phase and expand the late phase. Negative values do the opposite. Creates timbral variations without changing pitch.
|
||||
|
||||
<CodeEditor code={`/sound/tri/warp/.5`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="mirror" type="number" min={0} max={1} default={0}>
|
||||
|
||||
Reflects the phase at the specified position. At 0.5, creates symmetric waveforms (a saw becomes triangle-like). Values closer to 0 or 1 create increasingly asymmetric reflections.
|
||||
|
||||
<CodeEditor code={`/sound/saw/mirror/.5`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
53
website/src/content/phaser.md
Normal file
53
website/src/content/phaser.md
Normal file
@@ -0,0 +1,53 @@
|
||||
---
|
||||
title: "Phaser"
|
||||
slug: "phaser"
|
||||
group: "effects"
|
||||
order: 200
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
Two cascaded notch filters (offset by 282Hz) with LFO-modulated center frequency.
|
||||
|
||||
<CommandEntry name="phaser" type="number" min={0} default={0} unit="Hz">
|
||||
|
||||
Phaser LFO rate in Hz. Creates sweeping notch filter effect.
|
||||
|
||||
<CodeEditor code={`/sound/saw/freq/50/phaser/0.5`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/saw/freq/50/phaser/2/phaserdepth/0.9`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="phaserdepth" type="number" min={0} max={1} default={0.5}>
|
||||
|
||||
Phaser effect intensity (0-1). Controls resonance and wet/dry mix.
|
||||
|
||||
<CodeEditor code={`/sound/saw/freq/50/phaser/1/phaserdepth/0.5`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/saw/freq/50/phaser/0.25/phaserdepth/1.0`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="phasersweep" type="number" min={0} default={2000} unit="Hz">
|
||||
|
||||
Phaser frequency sweep range in Hz. Default is 2000 (±2000Hz sweep).
|
||||
|
||||
<CodeEditor code={`/sound/saw/freq/50/phaser/1/phasersweep/4000`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/saw/freq/50/phaser/0.5/phasersweep/500`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="phasercenter" type="number" min={20} max={20000} default={1000} unit="Hz">
|
||||
|
||||
Phaser center frequency in Hz. Default is 1000Hz.
|
||||
|
||||
<CodeEditor code={`/sound/saw/freq/50/phaser/1/phasercenter/500`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/saw/freq/50/phaser/2/phasercenter/2000`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
49
website/src/content/pitch-env.md
Normal file
49
website/src/content/pitch-env.md
Normal file
@@ -0,0 +1,49 @@
|
||||
---
|
||||
title: "Pitch Env"
|
||||
slug: "pitch-env"
|
||||
group: "synthesis"
|
||||
order: 106
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
An ADSR envelope applied to pitch. The envelope runs with gate always on (no release phase during note). The frequency is multiplied by <code>2^(env * penv / 12)</code>. When <code>psus = 1</code>, the envelope value is offset by -1 so sustained notes return to base pitch.
|
||||
|
||||
<CommandEntry name="penv" type="number" default={0} unit="semitones">
|
||||
|
||||
Pitch envelope depth in semitones. Positive values sweep up, negative values sweep down.
|
||||
|
||||
<CodeEditor code={`/penv/24/pdec/.2`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="patt" type="number" min={0} default={0.001} unit="s">
|
||||
|
||||
Attack time. Duration to reach peak pitch offset.
|
||||
|
||||
<CodeEditor code={`/patt/.2`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="pdec" type="number" min={0} default={0} unit="s">
|
||||
|
||||
Decay time. Duration to fall from peak to sustain level.
|
||||
|
||||
<CodeEditor code={`/pdec/.2`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="psus" type="number" min={0} max={1} default={1}>
|
||||
|
||||
Sustain level. At 1.0, the envelope returns to base pitch after decay.
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="prel" type="number" min={0} default={0.005} unit="s">
|
||||
|
||||
Release time. Not typically audible since pitch envelope gate stays on.
|
||||
|
||||
</CommandEntry>
|
||||
65
website/src/content/pitch.md
Normal file
65
website/src/content/pitch.md
Normal file
@@ -0,0 +1,65 @@
|
||||
---
|
||||
title: "Pitch"
|
||||
slug: "pitch"
|
||||
group: "synthesis"
|
||||
order: 100
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
Pitch control for all sources, including audio samples.
|
||||
|
||||
<CommandEntry name="freq" type="number" min={20} max={20000} default={330} unit="Hz">
|
||||
|
||||
The frequency of the sound. Has no effect on noise.
|
||||
|
||||
<CodeEditor code={`/freq/400`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/freq/800`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/freq/1200`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="note" type="number" min={0} max={127} unit="midi">
|
||||
|
||||
The note (midi number) that should be played.
|
||||
If both note and freq is set, freq wins.
|
||||
|
||||
<CodeEditor code={`/note/60\n\n/note/67`} rows={4} />
|
||||
|
||||
<CodeEditor code={`/note/48\n\n/note/60\n\n/note/63\n\n/note/67`} rows={8} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="speed" type="number" default={1}>
|
||||
|
||||
Multiplies with the source frequency or buffer playback speed.
|
||||
|
||||
<CodeEditor code={`/sound/saw/freq/220/speed/0.5`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/saw/freq/220/speed/1.5`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="detune" type="number" default={0} unit="cents">
|
||||
|
||||
Shifts the pitch by the given amount in cents. 100 cents = 1 semitone.
|
||||
|
||||
<CodeEditor code={`/freq/440/detune/50`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/freq/440/detune/-50`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="glide" type="number" min={0} default={0} unit="s">
|
||||
|
||||
Creates a pitch slide when changing the frequency of an active voice.
|
||||
Only has an effect when used with <code>voice</code>.
|
||||
|
||||
<CodeEditor code={`/voice/0/freq/220\n\n/voice/0/freq/330/glide/0.5/time/0.25`} rows={4} />
|
||||
|
||||
</CommandEntry>
|
||||
175
website/src/content/plaits.md
Normal file
175
website/src/content/plaits.md
Normal file
@@ -0,0 +1,175 @@
|
||||
---
|
||||
title: "Complex"
|
||||
slug: "plaits"
|
||||
group: "sources"
|
||||
order: 1
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
Complex oscillator engines based on Mutable Instruments Plaits. All engines share three parameters (0 to 1):
|
||||
|
||||
- **harmonics** — harmonic content, structure, detuning, etc.
|
||||
- **timbre** — brightness, tonal color, etc.
|
||||
- **morph** — smooth transitions between variations, etc.
|
||||
|
||||
Each engine interprets these differently.
|
||||
|
||||
<CommandEntry name="modal" type="source">
|
||||
|
||||
Modal resonator (physical modeling). Simulates struck/plucked resonant bodies. harmonics: structure, timbre: brightness, morph: damping/decay.
|
||||
|
||||
<CodeEditor code={`/sound/modal/note/48`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/modal/note/36/harmonics/0.8/morph/0.2`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/modal/note/60/timbre/0.7/morph/0.5/verb/0.3`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="va" type="source">
|
||||
|
||||
Virtual analog. Classic waveforms with sync and crossfading. harmonics: detuning, timbre: variable square, morph: variable saw.
|
||||
|
||||
<CodeEditor code={`/sound/va/note/36`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/va/note/48/harmonics/0.3/morph/0.8`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/va/note/36/timbre/0.2/lpf/1000`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="ws" type="source">
|
||||
|
||||
Waveshaping oscillator. Asymmetric triangle through waveshaper and wavefolder. harmonics: waveshaper shape, timbre: fold amount, morph: waveform asymmetry.
|
||||
|
||||
<CodeEditor code={`/sound/ws/note/36`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/ws/note/48/timbre/0.7/harmonics/0.5`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/ws/note/36/morph/0.8/timbre/0.9`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="fm2" type="source">
|
||||
|
||||
Two-operator FM synthesis. harmonics: frequency ratio, timbre: modulation index, morph: feedback.
|
||||
|
||||
<CodeEditor code={`/sound/fm2/note/48`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/fm2/note/60/timbre/0.5/harmonics/0.3`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/fm2/note/36/morph/0.7/timbre/0.8`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="grain" type="source">
|
||||
|
||||
Granular formant oscillator. Simulates formants through windowed sines. harmonics: formant ratio, timbre: formant frequency, morph: formant width.
|
||||
|
||||
<CodeEditor code={`/sound/grain/note/48`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/grain/note/36/timbre/0.6/harmonics/0.4`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/grain/note/60/morph/0.3/timbre/0.8`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="additive" type="source">
|
||||
|
||||
Harmonic oscillator. Additive mixture of sine harmonics. harmonics: number of bumps, timbre: prominent harmonic index, morph: bump shape.
|
||||
|
||||
<CodeEditor code={`/sound/additive/note/48`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/additive/note/36/timbre/0.5/harmonics/0.3`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/additive/note/60/morph/0.8/timbre/0.7`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="wavetable" type="source">
|
||||
|
||||
Wavetable oscillator. Four banks of 8x8 waveforms. harmonics: bank selection, timbre: row index, morph: column index.
|
||||
|
||||
<CodeEditor code={`/sound/wavetable/note/48`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/wavetable/note/36/timbre/0.5/morph/0.5`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/wavetable/note/60/harmonics/0.3/timbre/0.7/morph/0.2`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="chord" type="source">
|
||||
|
||||
Four-note chord engine. Virtual analog or wavetable chords. harmonics: chord type, timbre: inversion/transposition, morph: waveform.
|
||||
|
||||
<CodeEditor code={`/sound/chord/note/48`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/chord/note/36/harmonics/0.5`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/chord/note/48/harmonics/0.3/morph/0.7/verb/0.2`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="swarm" type="source">
|
||||
|
||||
Granular cloud of 8 enveloped sawtooth oscillators. harmonics: pitch randomization, timbre: grain density, morph: grain duration/overlap.
|
||||
|
||||
<CodeEditor code={`/sound/swarm/note/36`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/swarm/note/48/harmonics/0.5/morph/0.3`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/swarm/note/36/timbre/0.4/harmonics/0.7`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="pnoise" type="source">
|
||||
|
||||
Filtered noise. Clocked noise through multimode filter. harmonics: filter type (LP/BP/HP), timbre: clock frequency, morph: filter resonance.
|
||||
|
||||
<CodeEditor code={`/sound/pnoise/note/48`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/pnoise/note/36/harmonics/0.5/morph/0.7`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/pnoise/note/60/timbre/0.8/morph/0.9`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="kick" type="source">
|
||||
|
||||
Analog bass drum. 808-style kick. harmonics: punch, timbre: tone, morph: decay.
|
||||
|
||||
<CodeEditor code={`/sound/kick/note/36`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/kick/note/36/morph/0.3`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/kick/note/36/timbre/0.5/harmonics/0.7`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="snare" type="source">
|
||||
|
||||
Analog snare drum. harmonics: tone/noise balance, timbre: drum mode balance, morph: decay.
|
||||
|
||||
<CodeEditor code={`/sound/snare/note/48`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/snare/note/48/morph/0.5`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/snare/note/48/harmonics/0.8/timbre/0.3`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="hihat" type="source">
|
||||
|
||||
Analog hihat. 808-style metallic hihat. harmonics: metallic tone, timbre: high-pass filter, morph: decay.
|
||||
|
||||
<CodeEditor code={`/sound/hihat/note/60`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/hihat/note/60/morph/0.2`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/sound/hihat/note/60/harmonics/0.5/timbre/0.6`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
53
website/src/content/reverb.md
Normal file
53
website/src/content/reverb.md
Normal file
@@ -0,0 +1,53 @@
|
||||
---
|
||||
title: "Reverb"
|
||||
slug: "reverb"
|
||||
group: "effects"
|
||||
order: 204
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
Dattorro plate reverb with 4 input diffusers and a cross-fed stereo tank.
|
||||
|
||||
<CommandEntry name="verb" type="number" min={0} max={1} default={0}>
|
||||
|
||||
Send level to the reverb bus.
|
||||
|
||||
<CodeEditor code={`/verb/0.5/duration/.1`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="verbdecay" type="number" min={0} max={1} default={0.5}>
|
||||
|
||||
Tank feedback amount (clamped to 0.99 max). Controls tail length.
|
||||
|
||||
<CodeEditor code={`/verb/0.8/verbdecay/0.9/duration/.1`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="verbdamp" type="number" min={0} max={1} default={0.5}>
|
||||
|
||||
One-pole lowpass in the tank feedback path. Higher values darken the tail.
|
||||
|
||||
<CodeEditor code={`/verb/0.7/verbdamp/0.5/duration/.1`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="verbpredelay" type="number" min={0} max={1} default={0}>
|
||||
|
||||
Delay before the diffusers (0-1 of max ~100ms). Creates space before reverb onset.
|
||||
|
||||
<CodeEditor code={`/verb/0.6/verbpredelay/0.3/duration/.1`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="verbdiff" type="number" min={0} max={1} default={0.7}>
|
||||
|
||||
Allpass coefficients in both input and tank diffusers. Higher values smear transients.
|
||||
|
||||
<CodeEditor code={`/verb/0.7/verbdiff/0.9/duration/.1`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
37
website/src/content/rm.md
Normal file
37
website/src/content/rm.md
Normal file
@@ -0,0 +1,37 @@
|
||||
---
|
||||
title: "Ring Modulation"
|
||||
slug: "rm"
|
||||
group: "synthesis"
|
||||
order: 110
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
Ring modulation is a crossfade between dry signal and full multiplication: <code>signal *= (1.0 - depth) + modulator * depth</code>. Unlike AM, ring modulation at full depth removes the carrier entirely, leaving only sum and difference frequencies at <code>carrier ± modulator</code>.
|
||||
|
||||
<CommandEntry name="rm" type="number" min={0} default={0} unit="Hz">
|
||||
|
||||
Ring modulation oscillator frequency in Hz. When set above 0, an LFO multiplies the signal.
|
||||
|
||||
<CodeEditor code={`/freq/300/rm/440/rmdepth/1.0`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="rmdepth" type="number" min={0} max={1} default={1}>
|
||||
|
||||
Modulation depth (0-1). At 0, the signal is unchanged. At 1, full ring modulation with no dry signal.
|
||||
|
||||
<CodeEditor code={`/freq/300/rm/440/rmdepth/0.5`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="rmshape" type="string" default="sine">
|
||||
|
||||
Ring modulation LFO waveform shape. Options: `sine`, `tri`, `saw`, `square`, `sh` (sample-and-hold).
|
||||
|
||||
<CodeEditor code={`/freq/300/rm/8/rmdepth/1/rmshape/sh`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
51
website/src/content/sample.md
Normal file
51
website/src/content/sample.md
Normal file
@@ -0,0 +1,51 @@
|
||||
---
|
||||
title: "Sample"
|
||||
slug: "sample"
|
||||
group: "synthesis"
|
||||
order: 111
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
Doux can play back audio samples organized in folders. Point to a samples directory using the <code>--samples</code> flag. Each subfolder becomes a sample bank accessible via <code>/s/folder_name</code>. Use <code>/n/</code> to index into a folder.
|
||||
|
||||
<CommandEntry name="n" type="number" min={0} default={0}>
|
||||
|
||||
Sample index within the folder. If the index exceeds the number of samples, it wraps around using modulo. Samples in a folder are indexed starting from 0.
|
||||
|
||||
<CodeEditor code={`/s/crate_rd/n/0`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/s/crate_rd/n/2`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="begin" type="number" min={0} max={1} default={0}>
|
||||
|
||||
Sample start position (0-1). 0 = beginning, 0.5 = middle, 1 = end. Only works with samples.
|
||||
|
||||
<CodeEditor code={`/s/crate_rd/n/2/begin/0.0`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/s/crate_rd/n/2/begin/0.25`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="end" type="number" min={0} max={1} default={1}>
|
||||
|
||||
Sample end position (0-1). 0 = beginning, 0.5 = middle, 1 = end. Only works with samples.
|
||||
|
||||
<CodeEditor code={`/s/crate_rd/n/2/end/0.05`} rows={2} />
|
||||
|
||||
<CodeEditor code={`/s/crate_rd/n/3/end/0.1/speed/0.5`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="cut" type="number" min={0}>
|
||||
|
||||
Choke group. Voices with the same cut value silence each other. Use for hi-hats where open should be cut by closed.
|
||||
|
||||
<CodeEditor code={`/s/crate_hh/n/0/cut/1\n\n/s/crate_hh/n/1/cut/1/time/.25`} rows={4} />
|
||||
|
||||
</CommandEntry>
|
||||
37
website/src/content/timing.md
Normal file
37
website/src/content/timing.md
Normal file
@@ -0,0 +1,37 @@
|
||||
---
|
||||
title: "Timing"
|
||||
slug: "timing"
|
||||
group: "synthesis"
|
||||
order: 101
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
The engine clock starts at 0 and advances with each sample. Events with <code>time</code> are scheduled and fired when the clock reaches that value. The <code>duration</code> sets how long the gate stays open before triggering release. The <code>repeat</code> reschedules the event at regular intervals.
|
||||
|
||||
<CommandEntry name="time" type="number" min={0} default={0} unit="s">
|
||||
|
||||
The time at which the voice should start. Defaults to 0.
|
||||
|
||||
<CodeEditor code={`/freq/330/time/0\n\n/freq/440/time/0.5`} rows={4} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="duration" type="number" min={0} unit="s">
|
||||
|
||||
The duration (seconds) of the gate phase. If not set, the voice will play indefinitely, until released explicitly.
|
||||
|
||||
<CodeEditor code={`/duration/.5`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="repeat" type="number" min={0} unit="s">
|
||||
|
||||
If set, the command is repeated within the given number of seconds.
|
||||
|
||||
<CodeEditor code={`/freq/330/time/0/duration/0.5/repeat/1\n\n/freq/440/time/0.5/duration/0.5/repeat/1`} rows={4} />
|
||||
|
||||
</CommandEntry>
|
||||
37
website/src/content/vibrato.md
Normal file
37
website/src/content/vibrato.md
Normal file
@@ -0,0 +1,37 @@
|
||||
---
|
||||
title: "Vibrato"
|
||||
slug: "vibrato"
|
||||
group: "synthesis"
|
||||
order: 107
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
The pitch of every oscillator can be modulated by a vibrato effect. Vibrato is a technique where the pitch of a note is modulated slightly around a central pitch, creating a shimmering effect.
|
||||
|
||||
<CommandEntry name="vib" type="number" min={0} default={0} unit="Hz">
|
||||
|
||||
Vibrato frequency (in hertz).
|
||||
|
||||
<CodeEditor code={`/vib/8`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="vibmod" type="number" min={0} default={0} unit="semitones">
|
||||
|
||||
Vibrato modulation depth (semitones).
|
||||
|
||||
<CodeEditor code={`/vib/8/vibmod/24`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="vibshape" type="string" default="sine">
|
||||
|
||||
Vibrato LFO waveform shape. Options: `sine`, `tri`, `saw`, `square`, `sh` (sample-and-hold).
|
||||
|
||||
<CodeEditor code={`/vib/4/vibmod/1/vibshape/tri`} rows={2} />
|
||||
|
||||
</CommandEntry>
|
||||
29
website/src/content/voice.md
Normal file
29
website/src/content/voice.md
Normal file
@@ -0,0 +1,29 @@
|
||||
---
|
||||
title: "Voice"
|
||||
slug: "voice"
|
||||
group: "synthesis"
|
||||
order: 103
|
||||
---
|
||||
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/CodeEditor.svelte';
|
||||
import CommandEntry from '$lib/components/CommandEntry.svelte';
|
||||
</script>
|
||||
|
||||
Doux is a polyphonic synthesizer with up to 32 simultaneous voices. By default, each event allocates a new voice automatically. When a voice finishes (envelope reaches zero), it is freed and recycled. The <code>voice</code> parameter lets you take manual control over voice allocation, enabling parameter updates on active voices (e.g., pitch slides with <code>glide</code>) or retriggering with <code>reset</code>.
|
||||
|
||||
<CommandEntry name="voice" type="number" min={0}>
|
||||
|
||||
The voice index to use. If set, voice allocation will be skipped and the selected voice will be used. If the voice is still active, the sent params will update the active voice.
|
||||
|
||||
<CodeEditor code={`/voice/0/freq/220\n\n/voice/0/freq/330/time/.5`} rows={4} />
|
||||
|
||||
</CommandEntry>
|
||||
|
||||
<CommandEntry name="reset" type="boolean" default={false}>
|
||||
|
||||
Only has an effect when used together with voice. If set to 1, the selected voice will be reset, even when it's still active. This will cause envelopes to retrigger for example.
|
||||
|
||||
<CodeEditor code={`/voice/0/freq/220/attack/.1\n\n/voice/0/freq/330/time/.25/reset/1`} rows={4} />
|
||||
|
||||
</CommandEntry>
|
||||
Reference in New Issue
Block a user