SuperCollider : leMidi

SuperCollider :: Categories :: PageIndex :: RecentChanges :: RecentlyCommented :: Login/Register

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:

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

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]

Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by Wikka Wakka Wiki 1.1.6.3
Page was generated in 3.4615 seconds