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.

BagWritten byRead by
dirtMessagegain:, pan:, room:, speed:PerformerSuperDirt only
extraParamscutoff:, decay:, modIndex:, level:Kyma, Phausto, local OSC and MIDI
Backend messages are silently ignored elsewhere Sending 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

MessageSuperDirt keyEffect
gain:gainLevel. 1.0 is unity; SuperDirt is happy above it
pan:pan0 left, 0.5 centre, 1 right
speed:speedPlayback rate — changes pitch and length together
pitch:speedSame thing, but you give it semitones and Coypu converts
sound:s, nSample folder and index, as 'bd:3 cp'
dirtNotes:nNote or sample index per trigger
voice:voiceVoice variation on SuperDirt's synths
rel: / hold:relRelease 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

MessageSuperDirt keyEffect
room:roomReverb amount
size:sizeReverb size
delay:delayDelay wet/dry
delayTime:delaytimeDelay time
delayFb:delayfbDelay feedback
lock:lock1 locks delay time to the tempo grid
bpf:bandfBand-pass centre frequency
bpq:bpqBand-pass resonance
djf:djfAlex McLean's DJ filter — low pass below 0.5, high pass above
squiz:roomIntended 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.

GroupMessages
Filtercutoff: cutoffFreq: resonance: bw: envMod:
Envelopedecay: damping: pitchEnv:
ModulationlfoFreq: lfoAmount: modIndex: modRatio: modPitch:
Shapeduty: mode: waveform via mode:
Drivedrive: distortion: ratio: amount:
Timetime: rate: fb:
Otheraccent: 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.
Where the name goes A Sequencer at #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.

Change a parameter live The symbol shorthands act on whatever is currently playing, so you can adjust a part without re-sending it: #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.

6. Where to go next

DocumentWhat it covers
Phausto & MIDIWhat each backend does with these parameters.
Player & Message APIThe full Sequencer protocol.
PerformingChanging parameters mid-set.
GalleryPatterns that use these in context.

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.