Bonjour!
Je débute tout juste sur SC, sans aucune notion de langage de programmation, ce qui explique sans doute pourquoi j'ai du mal.
J'ai déjà programmé un synthé monophonique simple commandé par des notes midi qui fonctionne très bien. Pour faire de la polyphonie, je parviens à lancer plusieurs instances simultanées d'un synthé défini précédemment, avec un MIDIIn.noteOn, mais les noteOff ne fonctionnent pas.
J'imagine que la solution consiste a stocker dans un Array les notes jouées pour pouvoir retrouver quelle noteOff correspond à quel synthé, mais ça me semble un peu compliqué. Donc j'aimerais savoir s'il existe une façon plus simple de faire ce genre de choses.
Merci!
Olivier
Hors ligne
Salut Olivier,
J'ai trouvé cette info sur la liste SC, ça pourrait t'aider:
citation :
Polytouch is for handling polyphonic aftertouch messages (eg. from the
very few keyboards that support it). To have polyphony where you can
play more than one note at the same time and handle note offs
correctly you need some kind of note allocation system that creates
new synths when it recieves note ons and frees them when the
corresponding note is subsequently released. Have a look at
dewdrop_lib (in quarks) for a readymade solution.
A première vue si tu passes pas par la librairie dewdrop, c'est plutot lourd de gérer les note on / note off dans SC, dixit le help:
citation :
The technical problem is that every note on needs to save its synth object so that the note off message can end the right server-side node.
s'en suit un exemple code qui peut t'éclairer si tu l'as pas déjà croisé:
s.boot; ( var notes, on, off; MIDIIn.connect; notes = Array.newClear(128); // array has one slot per possible MIDI note on = Routine({ var event, newNode; loop { event = MIDIIn.waitNoteOn; // all note-on events // play the note newNode = Synth(\default, [\freq, event.b.midicps, \amp, event.c * 0.00315]); // 0.00315 approx. == 1 / 127 * 0.4 notes.put(event.b, newNode); // save it to free later } }).play; off = Routine({ var event; loop { event = MIDIIn.waitNoteOff; // look up the node currently playing on this slot, and release it notes[event.b].set(\gate, 0); } }).play; q = { on.stop; off.stop; }; ) // when done: q.value;
Pour la solution dewdroplib, Le hic c'est que j'ai du mal à la trouver sur sourceforge :
http://quarks.svn.sourceforge.net/viewv … .help.html
j'ai l'impression qu'ils sont en train de la mettre à jour..
tu peux tenter ça dans supercollider directement:
Quarks.install("dewdrop_lib")
bonne suite
+++
Dernière modification par oyster_twiter (2010-09-29 14:22:10)
Hors ligne
Salut oyster_twiter, merci pour ta réponse.
J'ai trouvé ici:
http://cooper.wesleyan.edu/pipermail/su … 00268.html
un code qui fonctionne (à part que le SynthDef doit être renommé).
Je ne comprends pas précisément ce qui se passe avec la liste, je vais prendre le temps de le décortiquer, mais ça me fait déjà une bonne base pour jouer avec différents synthés.
A+!
Olivier
Hors ligne
yep,
je pense que la liste z reprend les 128 notes midi et les réadapte en freq...?
+++
Hors ligne
En fait la liste z=Array.newClear(128); permet de stocker les synthés créés à chaque nouvelle noteOn, chaque noteOff y adressant un gate=0 pour le désactiver. J'avais cru jusque là qu'un Array ne permettait que de stocker des valeurs numériques, c'est carrément énorme de pouvoir y entrer des objets sonores et de pouvoir y accéder ensuite!
Hors ligne
Salut!
oui tu peux contenir n'importe quelle type de variables dans un Array, des variables dites primitives (int, float..) comme des variables composées (chaines de caractères ou objets de n'importe quel class et comme dans SuperCollider tout est objet...).
Par contre je me dis que le code que tu as trouvé risque de t'emmener à un bug... Il serait peut être plus interessant pour toi (et pour ta machine ) que tu crée tes 128 synths en amont et que tu n'ai plus qu'a modifiée les gate lors de la noteON/noteOFF... sinon tu risques de saturer ton serveur scsynth en créeant un nouveau synth à chaque note jouée.
voili.
+++
Hors ligne