le MIDI
les objets concernant le protocole MIDI restent assez succincts,
disons qu'ils assurent le minimum (jmc considère ce protocole peu sûr, imprécis, à vrai dire dépassé)
Tout les devices recconus par CoreMIDI (mac osX) sont accessibles depuis SuperCollider
les classes disponibles:
- MIDIClient: représente la communication entre SC et CoreMIDI
- MIDIIn: recoit les messages MIDI, et exécute des fonctions en réponse à ces messages
- MIDIOut: envoie des messages MIDI vers un port et un canal défini
- MIDIEndPoint: représentation dans sclang d'un device, constitué de trois valeurs: nom, device, uid (identifiant unique assigné par le système) - chaque connection physique est représentée par une instance de MIDIEndPoint
Initialisation
MIDIClient est une classe statique démarrant le service MIDI
Il s'initialise avec un nombre de port entrant et sortants:
ex:
(
var inPorts = 2;
var outPorts = 2;
MIDIClient.init(inPorts,outPorts); // explicitly intialize the client
inPorts.do({ arg i;
MIDIIn.connect(i, MIDIClient.sources.at(i));
});
)
L'utilisation explicite de MIDIClient n'est nécessaire qu'en cas de présence de plusieurs devices en entrée.
L'information à propos des devices est stockée dans les variables MIDIClient.sources et MIDIClient.destinations en temps que MIDIEndpoints
Reception
MIDIIn
- Un seul objet MIDIIn peut être actif
- Stocke les infos reçues suivantes dans des variables de classe: noteOff, noteOn, polytouch, control, program, touch, bend, sysex, sysrt, smpte
- On associe ensuite à ces variables des fonctions dont l'évaluation répond à ces données entrantes .
MIDIIn.connect; //initialise d'abord MIDIClient si cela n'a pas été fait
MIDIIn.noteOn = { |port, chan, note, vel| [port, chan, note, vel].postln };
MIDIIn.noteOn = nil; // stop
- les arguments à donner aux fonctions sont spécifiques à chaque type de donnée .
- depuis MIDIIn.help:
(
MIDIIn.connect; // init for one port midi interface
// register functions:
MIDIIn.noteOff = { arg src, chan, num, vel; [chan,num,vel / 127].postln; };
MIDIIn.noteOn = { arg src, chan, num, vel; [chan,num,vel / 127].postln; };
MIDIIn.polytouch = { arg src, chan, num, vel; [chan,num,vel / 127].postln; };
MIDIIn.control = { arg src, chan, num, val; [chan,num,val].postln; };
MIDIIn.program = { arg src, chan, prog; [chan,prog].postln; };
MIDIIn.touch = { arg src, chan, pressure; [chan,pressure].postln; };
MIDIIn.bend = { arg src, chan, bend; [chan,bend - 8192].postln; };
MIDIIn.sysex = { arg src, sysex; sysex.postln; };
MIDIIn.sysrt = { arg src, chan, val; [chan,val].postln; };
MIDIIn.smpte = { arg src, chan, val; [chan,val].postln; };
)
Comme ce sont des méthodes de classes, elles ne peuvent être dupliquées pour chaque canal par ex.
il faut filtrer les données entrantes en fonction du canal.
~noteOn = ()!16; //un dictionnaire par canal
// on met dans chaque dictionaire des fonctions, par ex:
~noteOn.do {|dct, i| dct.put(("postNoteOnAt"++i).asSymbol, { |port, chan, note, vel| [port, chan, note, vel].postln }) };
MIDIIn.noteOn = { |port, chan, note, vel| ~noteOn[chan].do(_.value(port, chan, note, vel)) };
~noteOn.do { |dct, i| dct.removeAt(("postNoteOnAt"++i).asSymbol)}; // stop
Wait for...
MIDIIn possède 6 méthodes d'"attente", utilisables par exemple dans le contexte d'une routine:
waitNoteOn(port, canal, note, velocité)
waitNoteOff(port, canal, note, velocité)
waitControl(port, canal, num, valeur)
waitBend(port, canal, valeur)
waitTouch(port, canal, valeur)
waitPoly(port, canal, note, velocité)
les arguments de ces méthodes permettent une discrimiation des données entrantes:
(
/* un event ne sera créé ici que si les données MIDI sont diffusées sur le canal 2 ou 3 ([1, 2]),
pour les notes de hauteurs comprises entre 36 et 72, et si leur vélocité est supérieure à 50
*/
r = Routine ({
var event;
loop {
event = MIDIIn.waitNoteOn(nil, [1, 2], (36..72), { |vel| vel > 50 });
event.note.postln;
}
}).play;
)
r.stop;
// pour les controleurs continus
(
r = Routine ({
var event;
loop {
event = MIDIIn.waitControl;
event.ctlnum.post; event.ctlval.postln;
}
}).play;
)
MIDIout
- contrairement à MIDIIn, on peut avoir plusieurs instances de MIDIout, permettant de s'adresser à différents devices.
- les performances de MIDIout restent limitées au niveau du 'timing'
synchronisation
MIDIIn recoit les messages de synchronisation au travers de la méthode .sysrt
C'est à l'utilisateur de convertir les valeurs entrantes (24 pulsations par temps) en valeurs pertinentes dans le contexte de son travail.
Voir aussi l'objet
MIDISyncClock, dans la librairie dewdrop_lib
Librairies externes
La librairie de Crucial ( fournie avec la distribution normale) intègre d'autres objets traitant les données MIDI :
NoteOnResponder, NoteOffResponder, CCResponder
La librairie dewdrop_lib,
http://www.dewdrop-world.net∞, déjà citée ci-dessus, possède les classes BasicMIDISocket et BasicMIDIControl
There are no comments on this page. [Add comment]