Interfacer SuperCollider

Précédent Sommaire Suivant

Une interface est un outil ou un concept qui établit un lien entre matériels et/ou logiciels. Ces passerelles rendent le contrôle de SuperCollider modulable. Le premier contrôleur est fournit par les accessoires de l’ordinateur : la souris et le clavier. Des exemples sur l’utilisation de la souris sont donnés précédemment, l’exemple suivant s’intéresse uniquement au clavier.

(
var fenetre = Window(« Capture clavier »).front;

fenetre.view.keyDownAction = { arg view, char, modifiers, unicode, keycode;

// Toutes les touches sont capturées.
postf(« char = %, unicode = %, keycode = %\n », char, unicode, keycode);
// Filtre certaines touches.
switch (unicode,
27, { « Touche échap ».postln }, // esc
32, { « Touche espace ».postln } // space
);
};
)

Une librairie (elle ne fonctionne pas sous Windows) permet d’accéder aux différents appareils, comme un joystick. Le Midi est entièrement pris en charge pour vos contrôleurs ou vos instruments (l’utilisation des fichiers midi s’effectue avec la librairie wslib disponible dans Quarks). Mais pour les dispositifs plus exotiques, des bibliothèques spécifiques sont nécessaires. La télécommande Wiimote est accessible facilement dans SuperCollider.


Arduino est utilisable nativement dans SuperCollider grâce aux librairies disponibles dans Quarks : Arduino, DMX ou SCPyduino, mais il peut aussi s’interfacer facilement avec le protocole de communication OSC.

Kinect est uniquement accessible par des outils tiers et ceux-ci communiquent avec SuperCollider par OSC. Processing avec ses extensions spécifiques, TUIOKinect ou OSCeleton.

Pour aller plus loin sur les moyens d’interfacer SuperCollider, un récapitulatif et des exemples sont recensés par Marije Baalman sur https://github.com/sensestage/interface2instrument.

Interface graphique

SuperCollider possède des outils pour fabriquer ses interfaces graphiques et contrôler ses algorithmes de façon plus conviviale. La construction se fait par code ce qui peut dérouter les utilisateurs habitués à utiliser des icônes. Cette technique nécessite de la rigueur dans la préparation de son interface. On doit imager le dispositif et la disposition de chaque objet avant de coder. De plus pour la librairie Qt, un objet de mise en page donne plus de flexibilité à la construction d’une interface graphique. Le principe est d’assemblé des objets horizontalement ou verticalement dans cet objet et celui-ci gère l’affichage dynamiquement. Puis de la même manière, on peut assembler ces objets de mise en page dans d’autres objets de mise en page et construire facilement des interfaces riches.

layout

Une introduction : http://doc.sccode.org/Guides/GUI-Introduction.html.

Guide de l’objet pour gérer une mise en page : http://doc.sccode.org/Guides/GUI-Layout-Management.html.

La liste des objets graphiques : http://doc.sccode.org/Overviews/GUI-Classes.html.

La liste des objets graphiques plus évolués : http://doc.sccode.org/Browse.html#GUI%3EEZ-GUI.

autogui

autogui est une librairie de la bibliothèque Quarks. Elle permet de générer une interface graphique selon les paramètres d’entrées de vos synthétiseurs.

Pour l’installer, exécutez cette commande :

Quarks.install(« autogui »)

Maintenant vous pouvez rapidement générer vos interfaces graphiques. L’exemple proposé par Graham Gatheral démontre l’efficacité de cette librairie.

L’auteur précise que son travail est en évolution constante et qu’il est nécessaire de prendre des précautions. Faites attention à vos oreilles durant vos tests de Metal Impact Tuner.

(
w = Window.new(« Metal Impact Tuner », Rect(200, Window.screenBounds.height-700,1055,600)).front ;

SynthDef(\Rate, {|rate=1, out=5|
~playrate = Impulse.ar(rate, 0, 0.3);
Out.ar(out, ~playrate)
}).send(s);

SynthDef(\Bank1, {|out=2, freqA1=2000, freqA2=2000, freqA3=2000, freqA4=2000, freqA5=2000, ringA1=2, ringA2=2, ringA3=2, ringA4=2, ringA5=2|
~signal1 = DynKlank.ar(`[[Lag.kr(freqA1+40,1), Lag.kr(freqA2+40,1), Lag.kr(freqA3+40,1), Lag.kr(freqA4+40,1), Lag.kr(freqA5+40,1)], nil, [ringA1, ringA2, ringA3, ringA4, ringA5]], In.ar(5), 0.2, 0, 1).dup*0.4;
Out.ar(out, ~signal1)
}).send(s);

SynthDef(\Bank2, {|out=3, freqB1=2000, freqB2=2000, freqB3=2000, freqB4=2000, freqB5=2000, ringB1=2, ringB2=2, ringB3=2, ringB4=2, ringB5=2|
~signal2 = DynKlank.ar(`[[Lag.kr(freqB1+40,0.3), Lag.kr(freqB2+40,0.3), Lag.kr(freqB3+40,0.3), Lag.kr(freqB4+40,0.3), Lag.kr(freqB5+40,0.3)], nil, [ringB1, ringB2, ringB3, ringB4, ringB5]], In.ar(5), 0.2, 0, 1).dup*0.4;
Out.ar(out, ~signal2)
}).send(s);

SynthDef(\Filter, {|out=4, cutoff=1000|
var output;
~filtered = HPF.ar(SinOsc.ar(Rand(324,352)) * In.ar(2), Lag.kr(cutoff+20,1), 0.8) +
HPF.ar(SinOsc.ar(Rand(466,546)) * In.ar(3), Lag.kr(cutoff+20,1), 1);

~output = Mix.ar(CombL.ar(~filtered, Rand(0.3, 1.8), Array.fill(10,{(0.005).(0.01).rand2 + 0.07}) * 0.06, 0.08));
Out.ar(out, ~output)
}).send(s);

SynthDef(\Output, {|gain=0.2, revsize=5, revtime=3, revdamp=0.5, revdry=1|
var output;
output = Mix.ar(CombL.ar(In.ar(4), Rand(0.3, 1.8), Array.fill(1, 0.07) * 0.06, 0.08));
2.do({output = AllpassN.ar(output, 0.020, [0.020.rand,0.020.rand], 1, mul:0.9) });
~reverb = GVerb.ar(In.ar(4), Lag.kr(revsize,0.3), Lag.kr(revtime,0.7), revdamp, 0.5, 15, revdry);

output = ~reverb.dup*(gain/5);
output = output.clip2(0.75);
output = Limiter.ar(output, 0.9, 0.01);
Out.ar([0,1], output*0.5);
}).send(s);

Synth(\Bank1).autogui(window:w, step:50, vOff: 0, hOff:0, scopeOn:true) ;
Synth(\Rate, addAction:\addToHead).autogui(window:w, step:50, vOff: 0, hOff:830, scopeOn:false) ;
Synth(\Bank2, addAction:\addToTail).autogui(window:w, step:50, vOff: 200, hOff:0, scopeOn:false) ;
Synth(\Filter, addAction:\addToTail).autogui(window:w, step:50, vOff: 400, hOff:0, scopeOn:false) ;
Synth(\Output, addAction:\addToTail).autogui(window:w, step:50, vOff: 400, hOff:360, scopeOn:false) ;
)

Sébastien Clara – Avril 2013

Précédent Sommaire Suivant