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:

Values wrap independently. Notes, durations, gate times and every effect parameter are read with wrap: at the note index, so each can have its own length.
The note index advances only on triggers. A rest does not consume a note, which is why a four-note list over a five-trigger rhythm rotates rather than stalling.
Default note differs by backend 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.

An active DSP is required 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.
Chords send several messages A 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.

Six pulses, not twenty-four MIDI clock is conventionally 24 pulses per quarter note. A Coypu step is a sixteenth, so six pulses per step comes to the same thing.

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:

WhatOSC 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.

The address is resolved, not configured Coypu looks up a hostname of the form 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:

MessageValue
/bassNoteThe MIDI note number as a float
/bassGate1.0, then 0.0 after the note's duration
/bassCutoffAny 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.

Several ports appear in the source The local sending helpers variously use 57120, 57110 and 8000 depending on which convenience method is called. If a listener sees nothing, try the others before assuming the message is malformed — §7.

7. Ports at a glance

PortUsed for
57120SuperDirt — sclang's OSC port. Also several local helpers
8000Kyma's VCS, and some local gate helpers
57110scsynth — used by the toSC… helpers
57142A 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.

8. Where to go next

DocumentWhat it covers
Effects & MixingWhich parameter family each backend reads.
Player & Message APIThe Performer classes in full.
Phausto manualBuilding the instruments Coypu drives.
SetupGetting each backend installed.

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.