OnlineMIDI
OnlineMIDI provides an example of a simple interactive music system which can analyse MIDI note events live. An analysis window of three seconds (corresponding to a notion of the perceptual present) is used, with step size of 1 second.
Note that this class can't be used in combination with other MIDI code, since it overwrites MIDIIn.noteOn and MIDIIn.noteOff; you would need to adapt the class code if this is an issue.
//do this first:
MIDIIn.connect; // init for one port midi interface
//now:
m= OnlineMIDI();
m.analyse(3,1.0); //3 seconds window, step size of 1.0 seconds
m.data //poll current data
m.status = true; //prints analysis data as it goes
m.status= false;
//use analysis data to formulate responses
(
SynthDef(\beep2,{arg freq=440,amp=0.1, pan=0.0, dur=0.1;
var source;
source= SinOsc.ar(freq*[1,1.007],0,amp*0.5);
Out.ar(0,Pan2.ar(Mix(source)*Line.kr(1,0,dur, doneAction:2),pan))}).send(s);
)
//to echo each note you play on a MIDI keyboard with a sound; your SynthDef must have freq and amp arguments, and deal with duration and freeing the Synth itself.
(
m.playinput= true;
m.inputsynthdef= \beep2;
)
//set a function that gets called after each window is analysed, to schedule events
//this sets things up for the next second
(
m.response = {|analysis|
var number;
number= analysis.density;
//number= max(0,(10-(analysis.density))); //inverting number of notes playing
if(analysis.iois.notEmpty, {
{
number.do{
Synth(\beep2, [\freq, analysis.pitches.choose.midicps, \amp, 0.2*(rrand(analysis.volumemin, analysis.volumemax))]);
analysis.iois.choose.wait; //could last longer than the next second, but still fun!
};
}.fork;
});
};
)
m.response= nil; //stop