View this PageEdit this PageUploads to this PageHistory of this PageTop of the SwikiRecent ChangesSearch the SwikiHelp Guide

patterns for sending midi output

Home   How To   Code Pool   Public Library   Theory   Events
to use the sc pattern system with eventstreams that send to the midiout this parent event can be used for that:

[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;
)





Link to this Page