[download file updated on 5/2005!: midiout pattern.rtf]
Note: this file is part of the common distribution now.
// to use the sc pattern system with eventstreams that send to the midiout // this parent event can be used for that: ( f = ( noteOn: #{ arg chan=0, midinote=1, amp=0.1; [chan, midinote, asInteger((amp * 127).clip(0, 127)) ] }, noteOff: #{ arg chan=0, midinote=1, amp=0.1; [ chan, midinote, asInteger((amp * 127).clip(0, 127)) ] }, polyTouch: #{ arg chan=0, midinote=1, polyTouch=125; [ chan, midinote, polyTouch ] }, control: #{ arg chan=0, ctlNum, control=125; [chan, ctlNum, control ] }, program: #{ arg chan=0, progNum=1; [ chan, progNum ] }, touch: #{ arg chan=0, val=125; [ chan, val ] }, bend: #{ arg chan=0, val=125; [ chan, val ] }, allNotesOff: #{ arg chan=0; [chan] }, smpte: #{ arg frames=0, seconds=0, minutes=0, hours=0, frameRate=25; [frames, seconds, minutes, hours, frameRate] }, songPtr: #{ arg songPtr; [songPtr] }, sysex: #{ arg uid, array; [uid, array] // Int8Array } ); /* also possible (without arguments): midiClock ( ) startClock ( ) continueClock ( ) stopClock ( ) reset ( ) */ e = #{ var freqs, lag, dur, sustain, strum; var tempo, bndl, midiout, hasHate, midicmd; freqs = ~freq = ~freq.value + ~detune; tempo = ~tempo; if (tempo.notNil) { thisThread.clock.tempo = tempo; }; if (freqs.isKindOf(Symbol).not) { ~finish.value; ~amp = ~amp.value; strum = ~strum; lag = ~lag; sustain = ~sustain = ~sustain.value; midiout = ~midiout; hasHate = ~hasGate ? true; midicmd = ~midicmd ? \noteOn; bndl = f[midicmd].valueEnvir.asCollection; bndl = bndl.flop; bndl.do {|msgArgs, i| var latency; latency = i * strum + lag; if(latency == 0.0) { midiout.performList(midicmd, msgArgs) } { thisThread.clock.sched(latency, { midiout.performList(midicmd, msgArgs); }) }; if(hasHate and: { midicmd === \noteOn }) { thisThread.clock.sched(sustain, { midiout.noteOff(*msgArgs) }); }; }; } }; Event.partialEvents.playerEvent.eventTypes[\midi] = e; ); // test for midiless people ( m = (forward: { arg ... args; args[1..].postln }) ) // for midi-havers : initialize midiout ( MIDIClient.init; m = MIDIOut(0, MIDIClient.destinations.at(0).uid); ) m.allNotesOff; ( Pbind( \type, \midi, \midiout, m, \midinote, Pseq([70, [74, 64, 67], 76], inf), \dur, Prand([0.25, 0.25],inf), \amp, Prand([0.3, 0.6], inf), \strum, Prand([0, 0.05], inf) ).play; ) ( Pbind( \type, \midi, \midiout, m, \midicmd, \bend, \val, Pfunc({ [0, { 156.rand }].choose.value }), \dur, 1.5 ).play; )