Shaping how a part sounds rather than when it plays — levels, panning, filters and effects. Which messages are available depends on your backend, and this page is mostly about telling the two families apart.
1. Two families of parameter
A Sequencer carries two separate bags of settings, and a message writes into one or the other. Knowing which is which explains why a message that works on one backend does nothing on another.
| Bag | Written by | Read by |
|---|---|---|
dirtMessage | gain:, pan:, room:, speed: … | PerformerSuperDirt only |
extraParams | cutoff:, decay:, modIndex:, level: … | Kyma, Phausto, local OSC and MIDI |
room: 0.4 on a Kyma performance does not error — it writes into a
dictionary nothing will read. If an effect message appears to do nothing, check it belongs
to the family your Performer uses.
Two messages bridge the gap by asking the Performer where the value belongs:
index: and level:. PerformerSuperDirt and
PerformerMIDI each route them differently — the MIDI performer, for instance,
sends level: as CC 7 and index: as CC 20.
2. SuperDirt parameters
2.1 Level, pan and pitch
| Message | SuperDirt key | Effect |
|---|---|---|
| gain: | gain | Level. 1.0 is unity; SuperDirt is happy above it |
| pan: | pan | 0 left, 0.5 centre, 1 right |
| speed: | speed | Playback rate — changes pitch and length together |
| pitch: | speed | Same thing, but you give it semitones and Coypu converts |
| sound: | s, n | Sample folder and index, as 'bd:3 cp' |
| dirtNotes: | n | Note or sample index per trigger |
| voice: | voice | Voice variation on SuperDirt's synths |
| rel: / hold: | rel | Release of the amplitude envelope |
(16 downbeats gain: 1.1; pan: 0.3) to: #bd.
"pitch: takes semitones — a fifth up"
(16 quavers pitch: #( 0 7 )) to: #arpy.
pitch: versus speed:
Both end up as SuperDirt's speed. speed: 2 means “twice as fast”;
pitch: 12 means “an octave up” and Coypu does the conversion. Reach for
pitch: whenever you are thinking musically.
2.2 Reverb, delay and filters
| Message | SuperDirt key | Effect |
|---|---|---|
| room: | room | Reverb amount |
| size: | size | Reverb size |
| delay: | delay | Delay wet/dry |
| delayTime: | delaytime | Delay time |
| delayFb: | delayfb | Delay feedback |
| lock: | lock | 1 locks delay time to the tempo grid |
| bpf: | bandf | Band-pass centre frequency |
| bpq: | bpq | Band-pass resonance |
| djf: | djf | Alex McLean's DJ filter — low pass below 0.5, high pass above |
| squiz: | room ⚠ | Intended as squiz distortion — see §5 |
(16 claveSon room: 0.4; size: 0.8) to: #cp.
"tempo-locked delay"
(16 quavers delay: 0.5; delayTime: 0.25; delayFb: 0.6; lock: 1) to: #arpy.
"one knob sweep across the whole filter range"
(16 semiquavers djf: #( 0.2 0.4 0.6 0.8 )) to: #hh.
2.3 Reaching anything else
SuperDirt accepts far more parameters than Coypu wraps. dirt: takes an array
of alternating keys and values and writes them straight into the message:
(16 downbeats dirt: #( 'crush' 4 'coarse' 2 'shape' 0.4 )) to: #bd.
The lower-level add: takes a single association, and
dirt:to: combines the two steps to avoid the parentheses. Anything SuperDirt
understands is reachable this way, whether or not Coypu has a named message for it.
3. Synth parameters
The extraParams family targets a synthesiser rather than a sampler — Kyma VCS
controls, Phausto DSP parameters, or MIDI CCs. Each message stores its values under a
capitalised name that the Performer appends to the instrument key.
| Group | Messages |
|---|---|
| Filter | cutoff: cutoffFreq: resonance: bw: envMod: |
| Envelope | decay: damping: pitchEnv: |
| Modulation | lfoFreq: lfoAmount: modIndex: modRatio: modPitch: |
| Shape | duty: mode: waveform via mode: |
| Drive | drive: distortion: ratio: amount: |
| Time | time: rate: fb: |
| Other | accent: effect: x: level: index: |
"an acid line on a Phausto or Kyma synth"
(16 tresillo notes: #( 36 36 38 41 ))
cutoff: '0.2 0.5 0.8 0.4';
resonance: 0.8;
envMod: 0.6;
to: #acid.
#acid with a #Cutoff entry addresses
acidCutoff — on Kyma that is a VCS label, on Phausto a DSP parameter name. Your
synth has to expose a parameter by that name for anything to happen, which is why these
messages are quiet when nothing matches.
x: and bw: exist for physical-model controls such as a modal bar's
strike position and bandwidth. The symbol shorthands #name x:,
#name bw: and #name number: set them on a part already playing.
4. Parameters are patterns too
Every one of these messages accepts a single value or a collection. Given a collection, the values are consumed one per trigger and wrap — exactly like notes:
"one value: constant"
(16 quavers pan: 0.5) to: #hh.
"a collection: a pattern in its own right"
(16 quavers pan: #( 0.1 0.9 0.3 0.7 )) to: #hh.
"a string works where the message takes one"
(16 quavers cutoff: '0.2 0.4 0.8') to: #hh.
This is where Coypu's terseness pays off: a four-value pan array against a five-trigger rhythm gives a slowly rotating stereo image with no modulation source and no extra code. Deliberately mismatched lengths are the technique, not a mistake.
#acid level: 0.4, #bd index: '1 3 2'.
5. Two source bugs to know about
squiz: sets the reverb, not the squiz
Sequencer>>squiz: writes its value to the 'room' key — a
copy-paste from room:. Sending it therefore changes reverb amount and silently
overwrites any room: you set. Until it is fixed, reach squiz through
dirt: #( 'squiz' 2 ) instead.
disortion: is a misspelt twin of distortion:
Both exist and both write #Distortion, so either works. The misspelling is
harmless, but distortion: is the one to type.
7. Troubleshooting
An effect message does nothing
It probably belongs to the other family. room: and friends are SuperDirt-only;
cutoff: and friends need a synth exposing that parameter name — §1.
Setting squiz: changed the reverb
That is the bug in §5. Use dirt: #( 'squiz' 2 ).
My parameter pattern is out of step with the notes
Values are consumed per trigger and wrap independently, so a 4-value list against a 5-trigger rhythm rotates. If you want them locked, give both the same length — §4.
pitch: raises an error on a single number
It maps over its argument, so it wants a collection. Use pitch: #( 7 ), or
speed: for a scalar — §2.1.
Nothing happens on Kyma however I set the parameters
The VCS label must match instrument key + parameter name exactly — a Sequencer at
#bass with #Cutoff needs a bassCutoff control — §3.
I need a SuperDirt parameter Coypu has no message for
Use dirt: with raw key/value pairs — §2.3.