rsc3/doc-schelp/HelpSource/Tutorials/A-Practical-Guide/PG_Cookbook04_Sending_MIDI.schelp

41 lines
1.9 KiB
Text

title:: Pattern Guide Cookbook 04: Sending MIDI
summary:: Sending notes under pattern control to MIDI devices
related:: Tutorials/A-Practical-Guide/PG_Cookbook03_External_Control, Tutorials/A-Practical-Guide/PG_Cookbook05_Using_Samples
categories:: Streams-Patterns-Events>A-Practical-Guide
section::Sending MIDI out with Patterns
Sending MIDI is the job of the link::Classes/MIDIOut:: class and the code::\midi:: event type. A MIDIOut is created to talk to a hardware device; the MIDI channel is provided when an event is played. MIDIOut's code::newByName:: makes it easier to identify a device.
The code::\midi:: event type supports the following commands, chosen in the event by the code::\midicmd:: key: code::\allNotesOff, \bend, \control, \noteOff, \noteOn, \polyTouch, \program, \smpte, \songPtr, \sysex, \touch::. The default is code::\noteOn::. When playing a note (noteOn), by default the corresponding noteOff message will be sent after the note's sustain time.
If you want to synchronize events played by a MIDI device and events played by the SuperCollider server, the MIDIOut object's latency must match the server latency. You can set the latency any time to affect all future events.
code::
MIDIClient.init; // if not already done
(
// substitute your own device here
var mOut = MIDIOut.newByName("FastLane USB", "Port A").latency_(Server.default.latency);
p = Pbind(
\type, \midi,
// this line is optional b/c noteOn is the default
// just making it explicit here
\midicmd, \noteOn,
\midiout, mOut, // must provide the MIDI target here
\chan, 0,
// degree is converted to midinote, not just frequency
\degree, Pwhite(-7, 12, inf),
\dur, Pwrand([0.25, Pn(0.125, 2)], #[0.8, 0.2], inf),
\legato, sin(Ptime(inf) * 0.5).linexp(-1, 1, 1/3, 3),
\amp, Pexprand(0.5, 1.0, inf)
).play(quant: 1);
)
p.stop;
::
Previous: link::Tutorials/A-Practical-Guide/PG_Cookbook03_External_Control::
Next: link::Tutorials/A-Practical-Guide/PG_Cookbook05_Using_Samples::