Quelques nouvelles du ModHa dont la reconstruction vient de franchir une étape, même s’il reste rudimentaire.
Le principe est le suivant : on lance le serveur, puis on évalue main.scd
. Nous sommes dans le paradigme de la programmation orientée objet, et l’évaluation de main vient de créer trois classes (ce sont des protos, pas des classes au sens strict, bref on s’en fout) :
- un chef d’orchestre
- un orchestre
Ces deux classes sont sensées être uniques, et ‘auto-instanciées’, ce sont des objets en tant que tels, et il ne fait pas sens de les dupliquer.
Qui permet de créer des synthés à partir de modèle préconfigurés. Pour l’instant, un seul disponible (parce que c’est en développement), une sinusoïde simple enrobée dans une enveloppe percussive.
Une syntaxe particulière permet d’accéder aux classes/objets :
~mh[\conductor].setBPM(60);
~mh[\orchestra].createInstr("PercSine");
~mh[\orchestra].instr("PercSine").setFreqAt(0, 440);
Je trouve la syntaxe ‘jolie’, mais ça prend des plombes à taper. J’ai donc utilisé le preprocesseur mentionné précédemment pour créer un raccourci syntaxique :
c<setBPM(60);
o<createInstr("PercSine");
i<("PercSine").setFreqAt(0, 440);
Ce qui me donne envie de faire du livecoding ! J’ai laissé de côté l’interface graphique pour l’instant car je souhaite pouvoir contrôler le soft par du code, puis rajouter l’interface graphique comme simple appel des instructions de contrôle (les versions précédentes ne permettaient pas un contrôle aisé hors de l’interface graphique).
Bref, l’étape franchie est la possibilité de faire du son. Voici le code de ‘démo’ (le serveur tourne déjà, et main.scd a été évalué) :
(
// Un thème de bourrée trois temps, par Claire Herrbach
~midiTheme = [
67, 0, 66, 0, 67, 0,
74, 0, 72, 0, 70, 0,
69, 0, 70, 69, 67, 66,
67, 0, 63, 0, 62, 0,
67, 0, 66, 0, 67, 0,
74, 0, 72, 0, 70, 0,
69, 0, 0, 0, 70, 0,
69, 0, 0, 0, 69, 0
];
)
// Création d'un instrument
~instr = o<createInstr("PercSine");
// Mise-à-jour de la taille de sa partition
~instr.setScoreSize(~midiTheme.size);
// Assignation des notes
~instr.setMidiFreqs(~midiTheme);
// On met le volume à 0.5 sur chaque temps
~instr.setAmpAt(-1, 0.5);
// On demande à chaque temps de jouer 100% des fois
~instr.checkTriggers;
// On assigne la bonne signature rythmique au chef d'orchestre
c<setSignature(8, 6);
// Et le BPM
c<setBPM(60);
// Puis on lance la battue
c<startClock;
// Quand on en a marre :
c<stopClock;
Il reste du boulot, mais j’apprécie la clarté des instructions :
c<setSignature(8, 6);
c<setBPM(60);
c<startClock;