62 lines
2.1 KiB
Racket
62 lines
2.1 KiB
Racket
#lang scribble/manual
|
|
@(require (for-label racket))
|
|
|
|
@title{Pattern Guide Cookbook 04: Sending MIDI}
|
|
Sending notes under pattern control to MIDI devices@section{related}
|
|
Tutorials/A-Practical-Guide/PG_Cookbook03_External_Control, Tutorials/A-Practical-Guide/PG_Cookbook05_Using_Samples
|
|
@section{categories}
|
|
Streams-Patterns-Events>A-Practical-Guide
|
|
|
|
@section{section}
|
|
Sending MIDI out with Patterns
|
|
|
|
Sending MIDI is the job of the link::Classes/MIDIOut:: class and the
|
|
@racketblock[\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 ]
|
|
|
|
@racketblock[newByName:: makes it easier to identify a device.
|
|
|
|
The ]
|
|
|
|
@racketblock[\midi:: event type supports the following commands, chosen in the event by the ]
|
|
|
|
@racketblock[\midicmd:: key: ]
|
|
|
|
@racketblock[\allNotesOff, \bend, \control, \noteOff, \noteOn, \polyTouch, \program, \smpte, \songPtr, \sysex, \touch::. The default is ]
|
|
|
|
@racketblock[\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.
|
|
|
|
]
|
|
|
|
@racketblock[
|
|
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::
|
|
]
|
|
|
|
|