Merge pull request #506 from andrewcsmith/patch-2
[supercollider.git] / HelpSource / Tutorials / A-Practical-Guide / PG_Cookbook04_Sending_MIDI.schelp
blob38203adc8b32a700b24680568c19142dd565b71f
1 title:: PG_Cookbook04_Sending_MIDI
2 summary:: Sending notes under pattern control to MIDI devices
3 related:: Tutorials/A-Practical-Guide/PG_Cookbook03_External_Control, Tutorials/A-Practical-Guide/PG_Cookbook05_Using_Samples
4 categories:: Streams-Patterns-Events>A-Practical-Guide
6 section::Sending MIDI out with Patterns
8 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.
10 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.
12 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.
14 code::
15 MIDIClient.init;        // if not already done
18         // substitute your own device here
19 var     mOut = MIDIOut.newByName("FastLane USB", "Port A").latency_(Server.default.latency);
21 p = Pbind(
22         \type, \midi,
23                 // this line is optional b/c noteOn is the default
24                 // just making it explicit here
25         \midicmd, \noteOn,
26         \midiout, mOut, // must provide the MIDI target here
27         \chan, 0,
28                 // degree is converted to midinote, not just frequency
29         \degree, Pwhite(-7, 12, inf),
30         \dur, Pwrand([0.25, Pn(0.125, 2)], #[0.8, 0.2], inf),
31         \legato, sin(Ptime(inf) * 0.5).linexp(-1, 1, 1/3, 3),
32         \amp, Pexprand(0.5, 1.0, inf)
33 ).play(quant: 1);
36 p.stop;
39 Previous:       link::Tutorials/A-Practical-Guide/PG_Cookbook03_External_Control::
41 Next:           link::Tutorials/A-Practical-Guide/PG_Cookbook05_Using_Samples::