What actually leaves Coypu when a step triggers. Five Performers, five wire formats — and the details that decide whether your instrument names line up with the other end.
1. The Performer contract
A Performer is an adapter. The transport walks the steps and, on each trigger, hands the
Sequencer and an index to the Performer's playEventAt:in:. Everything
backend-specific lives behind that one method.
p performer: PerformerSuperDirt new.
Two details of the contract are worth knowing because they shape what you can express:
wrap: at the note index, so each can have its own length.PerformerSuperDirt defaults to note 0 — a sample index —
while the others default to 60, a pitch. That is why a bare rhythm plays
the first sample in a folder on SuperDirt but middle C everywhere else.
2. Phausto
The only backend with no network hop: Coypu writes directly into a DSP compiled inside the same image. Set up the rack, then point the Performance at it:
TurboPhausto start.
tp := TurboPhausto new.
p := Performance uniqueInstance.
p performer: PerformerPhausto new.
p activeDSP: tp.
On each trigger Coypu converts the note to a frequency with midiNoteToFreq,
writes it to the DSP, then fires the gate for
duration × step-length × gateTime seconds.
2.1 Gate and note destinations
A Phausto Sequencer carries two lists of parameter names —
phaustoGateDestinations and phaustoNoteDestinations — saying
which DSP parameters to drive. The string notations fill these in automatically, appending
Trigger and Freq to each sound name:
'bd sd bd sd' asDirtSounds to: #drums.
"drives bdTrigger/bdFreq and sdTrigger/sdFreq in the DSP"
Effect parameters follow the same convention: a #Cutoff entry is written to
the note destination with Freq replaced by Cutoff, so
bdFreq becomes bdCutoff. Your Phausto instrument has to expose
parameters under those names — check with tp traceAllParams.
PerformerPhausto raises “There must be an active DSP for this
performance” if activeDSP: was never set. Setting the Performer alone is
not enough.
3. SuperDirt
Coypu builds one OSC message per trigger, addressed /dirt/play, and sends it to
127.0.0.1 on port 57120:
/dirt/play delta <seconds> s <sound> n <index> gain <…> …
delta is computed as the step length times the note's duration, so a Sequencer
with longer durations tells SuperDirt to space events further apart. Everything else comes
from the Sequencer's dirtMessage — every key you set with gain:,
room:, dirt: and the rest, each read at the current note index.
Instrument keys are SuperDirt sample folders. sound: overrides the key when you
want a different folder or an explicit index:
(16 downbeats sound: 'bd:3') to: #kick.
SequencerPoly — anything built with chords: — sends one OSC
message per chord tone inside a single bundle, each with its own n.
4. MIDI hardware
Requires Pharo-Sound. The
MIDI sender lives on the class side of PerformerMIDI:
p performer: PerformerMIDI new.
PerformerMIDI midiOut: aMidiSender.
Each trigger sends a note on the Sequencer's own MIDI channel, held for
duration × step-length × 0.9. Route parts to channels when you build them:
16 downbeats midiCh: 10 to: #drums.
(16 tumbao notes: #( 36 43 )) midiCh: 1; to: #bass.
Effect parameters become control changes. PerformerMIDI maps
level: to CC 7 and index: to CC 20, and
ccn:ccv: sets any controller directly:
(16 quavers ccn: 74 ccv: #( 40 80 120 )) to: #lead.
4.1 Clock and transport
PerformerMIDI runs a second thread emitting MIDI clock at six pulses per step
and sends a Start message when the transport begins. Hardware sequencers, arpeggiators and
delays set to external sync will follow Coypu's tempo, including changes made mid-set.
5. Kyma
The backend Coypu was written for. It resolves a Paca(rana) by Bonjour name and sends OSC to port 8000, addressing the Virtual Control Surface:
| What | OSC address |
|---|---|
Note for #bass | /vcs/bassNote/1 |
Gate for #bass | /vcs/bassGate/1 |
A #Cutoff parameter | /vcs/bassCutoff/1 |
| Tempo | /vcs/BPM/1 |
The gate goes to 1, waits the note's duration, and returns to 0 — a note-off is sent first to
handle voice stealing. Your Kyma Sound needs VCS controls named to match; the name is
the instrument key with Note, Gate or the parameter name appended.
beslime-NN.local. If your Paca(rana) has a
different serial number you will need to set PacaAddress accordingly, or use
'x' asPacaAddress to prime it.
6. Generic OSC
PerformerLocal targets any OSC listener on localhost — Pure Data, Max/MSP,
ChucK, a browser. Each trigger sends a note and then a gate pair:
| Message | Value |
|---|---|
/bassNote | The MIDI note number as a float |
/bassGate | 1.0, then 0.0 after the note's duration |
/bassCutoff | Any extra parameter, by name |
This is the simplest protocol Coypu speaks and the easiest to receive: in Pure Data an
[oscparse] into a [route bassNote bassGate] is the whole receiving
end.
7. Ports at a glance
| Port | Used for |
|---|---|
| 57120 | SuperDirt — sclang's OSC port. Also several local helpers |
| 8000 | Kyma's VCS, and some local gate helpers |
| 57110 | scsynth — used by the toSC… helpers |
| 57142 | A generic local OSC client |
All sending is to 127.0.0.1 except Kyma, which resolves the Paca(rana) over the
network. There is no configuration layer: the ports are written into the sending methods.
9. Troubleshooting
“There must be an active DSP for this performance”
p activeDSP: tp as well as setting the Performer — §2.1.
SuperDirt plays the wrong sample
Its default note is 0, so a bare rhythm plays the first sample in the folder. Use
sound: 'bd:3' or dirtNotes: to choose — §1, §3.
MIDI notes never stop
The note-off is scheduled after the note's duration; if the transport was stopped in between it may not arrive. Send an all-notes-off from your sender, or restart the transport briefly.
My hardware does not follow the tempo
It needs to be set to external sync, and only PerformerMIDI emits clock — §4.1.
Kyma receives nothing
Check the Paca(rana) is reachable at its beslime-NN.local name, and that the
VCS labels match instrument key plus Note/Gate — §5.
My Pure Data patch sees no messages
Check the port. Coypu's local helpers use 57120, 8000 and 57110 in different places — §7.
Phausto parameters are ignored
The DSP must expose parameters named sound + parameter, such as
bdCutoff. List what exists with tp traceAllParams — §2.1.