MIDIOut
send midi messages
a MIDIOut is bound to a specific MIDIEndPoint as defined by the operating system
list out ports:
MIDIClient.destinations
*new(port, uid)
port is the index of the MIDIEndPoint in the MIDIClient.destinations array.
on OS X the uid should be the uid of that port
ie. MIDIClient.destinations[port].uid
*newByName(deviceName,portName)
Searches for the device by name. This is safer then depending on the index which will change
if your studio setup changes.
list connected out ports with names:
MIDIClient.destinations
*findPort(deviceName,portName)
searches for a connected MIDIEndPoint by name
list connected out ports with names:
MIDIClient.destinations
*connect(port, uid) (Linux only)
*disconnect(port, uid) (Linux only)
OS X does not need to connect
noteOn ( chan, note, veloc )
noteOff ( chan, note, veloc )
polyTouch ( chan, note, val )
control ( chan, ctlNum, val )
program ( chan, num )
touch ( chan, val )
bend ( chan, val )
allNotesOff ( chan )
smpte ( frames, seconds, minutes, hours, frameRate )
songPtr ( songPtr )
songSelect ( song )
midiClock ( )
startClock ( )
continueClock ( )
stopClock ( )
reset ( )
sysex ( Int8Array )
connect(uid) (Linux only)
disconnect(uid) (Linux only)
private methods:
send ( outport, uid, len, hiStatus, loStatus, a, b, latency )
prSysex ( uid, Int8Array )
*connectByUID(port, uid) (Linux only)
*disconnectByUID(port, uid) (Linux only)
// examples:
MIDIClient.init;
m = MIDIOut(0,MIDIClient.destinations[0].uid);
m.noteOn(16, 60, 60);
m.noteOn(16, 61, 60);
m.noteOff(16, 61, 60);
m.allNotesOff(16);
MIDIIn.connect; // 1 port midi interface
MIDIIn.sysex = { arg uid, packet; [uid,packet].postln };
MIDIIn.sysrt = { arg src, chan, val; [src, chan, val].postln; };
MIDIIn.smpte = { arg src, chan, val; [src, chan, val].postln; };
m.sysex(Int8Array[ 16rf0, 0, 0, 27, 11, 0,16rf7])
m.smpte(24,16)
m.midiClock
m.start
m.continue
m.stop
Using patterns for sending midi events
MIDIClient.init;
m = MIDIOut(0,MIDIClient.destinations[0].uid);
a = Pbind(\degree, Prand([1, 2, 3, [0, 5]], inf), \bend, Pwhite(0, 76, inf));
// chain a midi event into the pattern and play it (see Pchain)
(a <> (type: \midi, midiout: m)).play;
The following keys are supported by midi event:
\noteOn
\noteOff
\polyTouch
\control
\program
\touch
\bend
\allNotesOff
\smpt
\songPtr
\sysex
Linux specific: Connecting and disconnecting ports.
On Linux, a MIDIOut can be created without setting the destination:
m = MIDIOut(0);
in this case each message will be sent to all ports connected to SuperCollider's first MIDI output.
A connection can be made through:
m.connect( 2 );
Note that by connecting in this way, you can connect more than one destination to the MIDI output.
OS X specific: Sending MIDI to other applications
Open the Audio MIDI Setup application. Double-click on IAC Driver and check "device is online".
reinitialize:
MIDIClient.init(numIns,numOuts)
The IAC Bus will now appear in MIDIClient.destinations. It will appear first, which means that any code that you have written that addresses the first physical bus as 0 will now have to be changed.
For this reason it is always safer to find the port by name :
MIDIOut.newByName("RemoteSL IN","Port 1")
The IAC Bus will now also appear to other applications.
MIDIMonitor (freeware) can be very useful for troubleshooting:
http://www.snoize.com/MIDIMonitor/