TABLE DES MATIRES
1. Introduction.................................................................................... 2
2."Jabalion"
Implmentation sur SuperCollider 3.................................... 8
2.1.
SuperCollider................................................................................ 8
2.2. Synthtiseurs
et moteurs de Synthse......................................... 12
2.2.1. Entres Analogiques....................................................................................... 12
2.2.2. Lecture de fichiers
sons................................................................................... 14
2.2.3. Synthse.......................................................................................................... 15
2.2.3.1. Modulation de
Frquence............................................................................ 15
2.2.3.2. Gendy........................................................................................................... 17
2.2.3.3. k-means........................................................................................................ 19
2.3. Traitements
du Signal.................................................................. 20
2.3.1 Modulations....................................................................................................... 21
2.3.2 Lignes retard................................................................................................... 23
2.3.2.1 Rverbration................................................................................................ 24
2.3.2.2 Retards Longs et
Structures Rythmiques................................................... 26
2.3.2.3 Modulation du temps
de retard.................................................................... 29
2.3.3 Analyse de Fourier............................................................................................ 32
2.3.3.1 Conformal Map.............................................................................................. 35
2.3.3.2 Freezer............................................................................................................ 37
2.3.4. Granulation........................................................................................................ 39
2.4 Matrix et Audio Mappings.............................................................. 44
2.5 GU Interface
Graphique................................................................. 53
2.5.1. Potentiomtres et indicateurs de niveau........................................................ 57
2.5.2 Panoramique...................................................................................................... 61
2.5.3 Lecteur de Fichiers............................................................................................ 64
2.5.4 Lecteur de tables.............................................................................................. 66
2.5.5 Tableau MIDI..................................................................................................... 68
2.5.6 Clavier de
lordinateur....................................................................................... 69
2.6. Contrle..................................................................................... 70
2.6.1 Linterface ordinateur......................................................................................... 72
2.6.2 LInterface MIDI................................................................................................. 74
2.6.3. Arduino, captation
du geste............................................................................ 76
2.6.4. Le son contrleur.............................................................................................. 80
2.6.5. Sauvegarde et enregistrement....................................................................... 84
3.
"Transgressions" Implmentation sur MAXMSP 5............................. 86
3.1.
Prsentation de la version MAXMSP 5............................................................... 87
3.2.
Comparaison avec Jabalion.................................................................................. 93
4. Annexes ....................................................................................... 96
4.1."Border
Border Expres" Olarte / Okach, Electronique et Danse.......................... 96
4.2."Coco
duro" Olarte / Montes de Oca Torres, Guitare et lectronique................. 96
4.3."Workshop
Helsinki Meeting Point"/ Sibelius Academy Finlande...................... 96
5. Conclusions.................................................................................. 97
6. Bibliographie.................................................................................. 98
Dans ce travail je
vais explorer, prsenter et discuter un environnement logiciel construit sur
SuperCollider 3 et MaxMSP 5, pour l'improvisation de la musique lectroacoustique.
Je vais aborder la
problmatique de l'instrument ou l'interface musicale pour piloter le logiciel :
linterface graphique, les contrleurs MIDI, lanalyse du son, la lecture de
courbes et de tables, les automatisations.
Pourquoi un environnement informatique?
En tant que
musicien et exprimentateur jai toujours t la qute des outils lectroacoustiques,
plus pour les performances publiques que pour la production en studio, ainsi
jai t confront aux synthtiseurs, analogiques et numriques. Jai peru le
double enjeu de ces outils : la production sonore et le geste contrleur,
car ces machines sons semblent sparer le problme technique de la synthse
avec des oscillateurs, filtres, amplificateurs de celui de linterprtation
instrumentale prsent sous forme de claviers, potentiomtres, boutons,
tableaux de connectiques (patchs). Jai donc avanc paralllement dans ces deux
directions en apprenant les thories et les techniques des traitements et
synthses sonores puis en exprimentant avec le concept dinterface.
Comme Claude
Risset le rappelle[1],
l'ordinateur n'est pas en lui mme un instrument de musique, il est une grande
machine calculs avec une interface visuelle et un accs gestuel trs limit :
un clavier et une souris. Cependant, comme on peut le constater dans manifestations
comme le live coding et les laptop orchestra, l'ordinateur
cherche faire repenser sa place dans l'organologie contemporaine.
Jai abandonn progressivement
lillusion dune conception dun instrument nouveau principalement cause de
lisolement dans un rpertoire musical et gestuel inexistant. Jai donc dcid
daugmenter mon instrument : la guitare avec des capteurs,
et de l jai voulu avoir aussi des actionnaires pour modifier le comportement
acoustique de la surface vibrante, imposer dautres modes de vibration, exploiter
les ralimentations acoustiques, enfin passer de linterface de contrle
linterface contrle[2].
Ces ides mont
pouss dans lՎtude des automates et de robots et notamment du disklavier, mais
ma place comme musicien se voyait mtamorphose en quelque chose de plus proche
de la sculpture sonore ou des arts plastiques.
Toujours actif
dans ma discipline dinstrumentiste, je suis revenu sur mon instrument et jai
dcid dapprofondir le ct logiciel et environnement informatique. Pour ceci,
je me suis propos dapprendre un outil trs rput comme SuperCollider et dy
btir lenvironnement dont je ressentais le besoin.
Il me fallait une plate-forme
de pilotage pour interconnecter les traitements sonores appliqus des sources
acoustiques, la gestion de fichiers sons, diffrentes techniques de synthse
avec des paradigmes de contrle comme capteurs, interfaces MIDI, microphones,
clavier, souris et camra de lordinateur. Le tout tant dun accs simple pour
tre performant dans des circonstances musicales individuelles et collectives.
Bien que plusieurs
logiciels circulent dans le milieu dinformatique musicale comme Omax,
IXIQuarks, NajoInterface parmi dautres commercialiss dans le monde de DJs
comme Pacemaker, Kontact, Traktor et les produits de Native Instruments pour ne nommer que quelques uns, jai toujours
t convaincu de limportance du processus pdagogique dans la ralisation de
son propre logiciel, donc jai crit mon propre environnement Jabalion.
Cet crit peut
ressembler un manuel du logiciel, jen suis conscient mais je me sens oblig
de rendre compte du processus dՎcriture, de conception, de construction et de
mise en marche du logiciel. Dautant plus que les sources francophones acadmiques
concernant SuperCollider sont encore trs rares.
Quelles sont les caractristiques de cet outil informatique?
Ecrire cet
environnement permettant le couplage entre l'ordinateur, les sources
acoustiques et les interfaces de contrle, exige une planification o les
perspectives et les attentes de fonctionnement sont prvues clairement depuis
le dpart.
Une premire
question concerne l'interactivit. Deux chemins se prsentent comme choix trs
diffrents. Je vais les illustrer avec le travail de deux musiciens, le premier
: George Lewis tromboniste, improvisateur membre du AACM Chicago (Association for the Advancement of Creative
Musicians) qui a consacr une partie trs importante de sa recherche au dveloppement
du logiciel voyageur fond sur le paradigme de machine
listening o l'ordinateur reoit des informations sur le jeu du
musicien et propose des rponses sonores incluant une certaine logique musicale.
Ce qui m'intresse
dans sa dmarche, cest le degr d'autonomie de l'ordinateur, car comme
l'explique Lewis lui mme :
... je
n'aime pas jouer des concerts en trombone solo, je prfre jouer avec quelqu'un
d'autre, je cherche faire un logiciel pour comprendre quelles sont les choses
qu'un improvisateur doit connatre pour russir improviser avec un autre
musicien... [3]
Il cherche donc avoir
un outil qui possde en amont un ensemble de modles de comportement pour
produire une rponse musicale au jeu (la machine connat ou reconnat la
musique!). En d'autres mots, une fois le logiciel dmarr, il doit agir comme
un deuxime musicien qui coute, agit et propose. C'est aussi l'inquitude de
Gerard Assayag et son groupe de
recherche autour du logiciel Omax sur lequel je reviendrai plus
loin, qui combine la puissance d'analyse de Lisp avec le traitement de signal
en Max.
En face de cette autonomie ,
nous avons le cas d'un logiciel o le contrle de ses oprations est totalement
dtermin par les commandes en temps rel du musicien. C'est le cas dans les IXIQuarks
(une srie de modules interconnects par busses de contrle et de signaux) o
la machine rpond pas pas aux informations donnes par linterprte. Cest
dire pas de commande ou de geste modificateur donc pas de rponse sonore.
Bien que dans les
deux cas on cherche faire de la musique avec la machine, qui
attend le dclenchement du musicien, le degr d'intelligence de
la machine ou la capacit prendre des dcisions, ou encore les apprendre,
permet d'claircir et comprendre la diffrence profonde de ces deux
perspectives. Dans la premire, la machine est en quelque sorte matre-esclave
delle mme, dans la deuxime la machine est l'esclave suivant
les ordres du matre musicien interprte.
Jouer avec l'ordinateur
qui agit permet une indpendance dans le jeu, par exemple, je
joue une note : les oprations faites sur cette note suivent des
algorithmes crits l'avance, dont je pourrais prdire le rsultat, mais si je
joue spontanment une combinaison plus complexe de notes, je ne peux pas tre
compltement sr de la proposition rsultante mais je peux la connatre peu
prs, donc un facteur surprise ou inconnu peut jouer un rle dterminant.
Dans l'ordinateur
qui obit , le musicien joue une note puis commande au logiciel
les traitements qui vont suivre chaque vnement. Ceci demande au musicien d'tre
concentr la fois dans la partie instrumentale et dans les oprations logicielles.
Lutilisation de
ces logiciels nest pas aussi dichotomique quelle semble lՐtre, et des solutions intermdiaires sont
possibles, grce des automatisations qui rendent les tches, et la quantit
d'informations plus lgre.
Par exemple : je
joue ma note et je dclenche un ensemble de courbes qui vont contrler les
paramtres dun filtre jusqu' ce que lon dcide de l'arrter. Ceci demande
une longue tche de calibrage mapping
et de sauvegarde de configurations en presets. Dautre part il est vident
que dans le logiciel de Lewis, il serait trs compliqu, voir impossible, d'tablir
de nouvelles lois de comportement au cours du jeu.
Une autre
possibilit est de rendre le contrle de la partie logicielle un autre
musicien, ceci permet de pouvoir se concentrer profondment dans le jeu et le
langage, et d'tre dans une situation plus proche de la musique de chambre.
Je vais donc
exclusivement traiter du cas de lordinateur contrl, do l'absence dans les programmes que je prsente
pour ce mmoire, d'algorithmes d'apprentissage ou du type oracle ou prdictions
statistiques ou encore des prises autonomes de dcisions. Je me suis concentr
faire un mapping ouvert de chaque paramtre de contrle, pour pouvoir
les piloter de diffrentes faons : avec un contrleur MIDI, ou un ensemble des
capteurs, ou des courbes estoques dans des tables ou dessines la main, ou
avec les donnes issues d'une analyse spectrale.
Dautres
caractristiques bien quՎvidentes doivent tre prises en compte, par
exemple : une interface graphique simple et claire, un contrle prcis des
dynamiques, de positions ou trajectoires spatiales, possibilit denregistrer
et automatiser pour jouer avec la forme et la mmoire, possibilits de
dvelopper, varier ou contraster les matriaux musicaux.
Pourquoi pour l'improvisation ?
L'improvisation
musicale est un sujet trs intressant et dlicat traiter, car il s'agit
d'une discipline hautement subjective et dont la dfinition est dpendante de
la pratique de chaque artiste. De plus, le contexte dans lequel il joue - par
exemple limprovisation trs prsente dans la musique de lInde - sՎloigne
dans les mthodes, les principes, lusage et mme dans les buts de
limprovisation dite libre pratique dans plusieurs pays
europens.
Sujet mystique
caractre religieux pour certains, ou activit ludique et pdagogique pour
d'autres, ou comme Georges Lewis aime bien le dire une faon de
vivre [4] ;
en tant que musiciens nous avons tous t concerns en diffrentes
circonstances et des chelles diffrentes par cette discipline.
Une dualit
souvent voque est celle du couple improvisation vs composition .
On parle de composition instantane ou de cration spontane, mais la frontire
commence apparatre quand on considre une improvisation comme une uvre
acheve en elle mme ou comme un processus prcompositionnel qu'il faut
travailler, rpter et modeler par l'criture.
Du ct auditeur,
cette opposition nest toujours pas vidente car certaines improvisations
sonnent comme des compositions largement travailles (synchronisation rythmique,
formes nettes...) et son tour une criture trs ouverte (les scores
graphiques...) donne comme rsultat des interprtations tellement diffrentes
de la mme pice qu'on a le sentiment d'une musique qui sinvente chaque fois
donc improvise.
Le point de
rencontre entre ces deux mondes (criture, improvisation) est la recherche
esthtique du concept duvre ouverte, (dindtermination ou de libert
formelle, interprtative) en
parlant de lopposition dune potique de la multiplicit du sens, contre une thorie des formes finies ou
fermes. Umberto Eco souligne dailleurs ce sujet:
Cette
potique de lunivoque et du ncessaire recouvre un monde ordonn, une
hirarchie des tres et des lois quun mme discours potique peut clairer
plusieurs niveaux mais que chacun doit entendre dans la seule perspective
possible, qui est celle du logos crateur. Lordre de luvre dart se confond
avec celui dune socit impriale et thocratique ; les lois qui prsident
la lecture sont celles-l mme dun gouvernement autoritaire qui guide
lhomme dans chacun de ses actes en lui prescrivant les buts atteindre et en
lui offrant les moyens dy parvenir [5]
Un des traits
distinctifs de l'improvisation sera donc son loignement de l'criture, non pas
radicalement - comme Barb Phillips qui a dclar lors d'une master class
au conservatoire de Paris, avoir dcid de ne plus jouer une partition depuis plus
de 40 ans[6]-
mais dans une progression plusieurs degrs : c'est dire que plus on
perd de contrle sur le papier en effaant des paramtres, plus on est dans le
monde de l'improvisation.
Par exemple, si on
n'crit pas la dynamique, ou si on utilise des botes alatoires avec des
hauteurs mais pas des rythmes ou le contraire, ou si on ne prcise pas les
dures des sections ou l'ordre d'enchanement, si on nՎcrit qu'une suite
d'accords ou voire seulement quelques indications potiques, ou voire des indications
graphiques, l'interprtation devient un exercice de composition[7].
Ce rapport
l'criture peut aussi se prsenter sous un autre aspect : la minimisation du
temps de cration et d'interprtation. Dans le contexte de musiques improvises,
le temps de cration est celui de linterprtation : cest dire quils
sont fusionns, toutes les oprations musicales sont faites en temps rel. Nous
avons d'autres contraintes diffrentes celles imposes pour le travail en
studio o en face du papier. Ce fameux temps rel bas dans la
puissance de calcul des processeurs a donn lieu tout un dveloppement hardware
et software pour rsoudre les paradigmes de la musique mixte : captation,
traitement, diffusion, et pose des dfis lesthtique musicale dans les concepts
fondamentaux comme celui de structure et forme, dans le vocabulaire sonore avec
lexploration et le maniement du matriau sonore et lide politique
de cration collective[8].
L'improvisation
est pour moi un outil de recherche la fois esthtique et organologique mais
aussi une discipline dՎcoute individuelle et collective, intrieure et
musicale, raisons pour lesquelles je lui ai consacr ce travail.
Le plan
Aprs une brve
introduction la syntaxe de SuperCollider, je vais dcrire et explorer
l'architecture de Jabalion, parcourant certaines techniques de synthse, et de
traitement du signal, puis les outils pour organiser et acheminer les signaux
audio et contrle. Je vais aussi tudier l'interface graphique, une composante
cl dans ce type de projets. En suite je vais comparer lexprience de
ralisation dun tel travail sur MaxMSP, les diffrences, les atouts et les
difficults dun langage du type objets graphiques, logique totalement
diffrente dune programmation du type texte. Finalement jaccompagne ce
travail avec une srie dexemples tirs de ma pratique professionnelle.
2."Jabalion" Implmentation sur SuperCollider 3
Dans les chapitres
que suivent, je vais prsenter le logiciel Jabalion crit dans SuperCollider. Pour
ceci, je commence en parlant de lenvironnement logiciel puis je passe une
description du code (le code en entier fait lՎquivalent dune cinquantaine de
pages), dont jen ai extrait et comment les parties les plus importantes, par
exemple les synthtiseurs, le contrle et linterface graphique.
Bien que toute
cette section peut paratre un peu austre et difficile lire pour la syntaxe
du code, jՎtais oblig dy passer, autrement la partie la plus intressante et
laquelle jai ddi le plus dՎnergie, la programmation et lՎcriture
informatique, passerait sous lombre. Donc pour mettre en valeur lobjet de ce
mmoire, le travail de programmation, jai altern la description des concepts
techniques et le code crit pour chaque concept.
Jespre aussi que
cette prsentation de mon approche dans lՎcriture servira ceux intresss
dans ce type de langage. Les sources en langue franaise sont trs rares pour
ce type de logiciel o langlais lemporte comme langue principale tant dans
les forums de discussion dutilisateurs que dans celui de dveloppeurs, ainsi
que pour les tutoriaux, livres et documents rfrentiels. Donc ce mmoire peut
maintenant compter parmi ces sources.
SuperCollider 3
est un puissant et flexible langage de programmation "orient objets"
pour synthse et traitement du son et de l'image. Il a t dvelopp par James
McCartney, sa syntaxe et ses librairies des fonctions sont drives de SmallTalk
et C++, il a t mis en circulation en 1996 sur sa version 2 puis en 2002
publi sous GNU (General Public License). La dernire version 3.3
datant d'avril 2009.
SuperCollider 3
est en fait deux applications tournant en mme temps : sclang et scsynth,
le langage et le moteur de synthse, les deux applications communiquant
travers un rseau via UDP ou TCP et un utilisant un sous-ensemble du protocole Open
Sound Control (OSC) dvelopp par le CNMAT.
Cette architecture
permet d'envoyer des messages au moteur de synthse dans deux styles diffrents
:
Directement : en utilisant la mthode ".sendMsg"
sur une instance de " Server " et en utilisant
la syntaxe OSC.
Indirectement : en utilisant la syntaxe propre au sclang que
permet de suivre et manipuler les objets crs dans le serveur :
"Server". Ainsi sclang traduit cette syntaxe haut niveau dans
des messages OSC de bas niveau et des envois au serveur.
Par exemple, les
deux types de syntaxe suivants sont quivalents :
Crer une instance
de "Server", le dmarrer, crer un synthtiseur (celui dfinie par
dfaut) et l'assigner un identifiant dans l'arborescence de synthse, puis
l'arrter.
style OSC
s
= Server.default;
s.boot;
s.sendMsg(\s_new,\default,1001,1,1);
s.sendMsg(\n_free,1001);
style sclang
s
= Server.default;
s.boot;
x
= Synth("default")
;
x.free;
En tant
quivalents, le choix entre les deux peut obir des raisons de contexte ou de
got personnel.
D'autres logiciels
(MaxMSP PureData) capables d'utiliser le protocole OSC peuvent aussi envoyer des
messages directement au scsynth.
Pour faciliter la
lecture de mes exemples et clarifier la syntaxe, voici quelques conventions
dans la typographie. Le code sera crit dans la police Monaco 10
window
= GUI.window.new("JabaLion",
Rect(6, 6, 260, 230)).front;
Une
"classe" commence toujours par une majuscule (ex : Server)
La classe est une
structure informatique particulire dans le langage objet. Elle dcrit la
structure interne des donnes, et elle dfinit les mthodes qui s'appliqueront
aux objets de mme famille (mme classe) ou type. Elle propose des mthodes de
cration des objets dont la reprsentation sera donc celle donne par la classe
gnratrice. Les objets sont dits alors instances de la classe. C'est pourquoi
les attributs d'un objet sont aussi appels variables d'instance et les
messages opration d'instance ou encore mthodes d'instance. L'interface de la
classe (l'ensemble des oprations visibles) forme les types des objets.
Une
variable locale est dfinie par le caractre ~
~myvariable = 888;
quivalent :
currentEnvironment.put(\myvariable, 888);
Les symboles sont
prcds par le caractre \ , ou entre guillemets simples '
' et dans la syntaxe colore ils deviennent verts.
Un symbole est un nom unique garanti comme unique, ils peuvent tre
utiliss pour reprsenter des valeurs constantes, des entres dans des
dictionnaires, des noms de synthtiseurs...
\granulator 'granulator'
Un vecteur de caractres ou "string" est crit entre guillemets
doubles et est color dans la syntaxe en gris.
"ceci est un vecteur de caractres".postln
Les commentaires l'intrieur du code sont prcds par //
ou en commenant et en finissant par /* ... */
Ils seront colors en rouge.
// sc libeary file Automation,MP3,FileListView,Arduino;
/*
Document.current.bounds_(Rect(2, 141, 940, 640));
s.options.device = "Digidesign HW ( MBox )"
s.boot;
{ SinOsc.ar(440, 0, 0.5) }.play;
*/
Les parenthses () servent dfinir des bloques de
code excutable ou pour passer des
valeurs ou arguments des fonctions
(~values.matrixprocessing.integrateRow_(12))
Les vecteurs sont crits l'intrieur de crochets [] ,
un vecteur est une collection d'objets de nature similaire ou diffrente.
[["On",Color.white,Color.green],["Off",Color.white,Color.red]]
Les fonctions sont crites l'intrieur d'accolades {}
{~values.matrixoutputs.front_(true)}.value;
Les arguments dans
une fonction sont prcds par le mot-cl arg ou crits l'intrieur de barres verticales ||
~values.ucontrol.setAction_(1,12,{arg ez;
~values.complexattack.setreal_(ez.value)});
~values.ucontrol.setAction_(1,12,{|ez|
~values.complexattack.setreal_(ez.value)});
Les variables dans
une fonction sont dclares et prcdes par le mot-cl var
var server = Server.local,window,devices=ServerOptions.devices
Dans une classe
les chevrons <> servent dfinir les mthodes "get " > ou "set"
<
AudioStereo {
var
adcwindow,<>play,levelsadcviews,<>ezvol;
...}
AudioStereo.play;
AudioStereo.play_(value);
Arborescence de
synthse : ordre d'excution
L'ordre
d'excution est un des points critiques en SuperCollider, il ne se rfre pas
l'ordre d'excution d'assertions dans le langage mais l'ordre de nuds de
synthse dans le serveur, c'est dire l'ordre dans lequel leur sortie est
calcule chaque cycle de contrle (blockSize) ainsi chaque synth est
plac dans un lieu unique et spcifique dans la chane d'excution.
Par exemple :
NODE TREE Group 0
1 group
1001 default
1002 fm
2 group
1003 granulator
Ceci veut dire que
toutes les units gnratrices du synth default plac dans le premier groupe avec l'identifiant (id) 1001 seront
calcules avant celles du synth fm ou id 1002 chaque cycle. Ce fait est crucial dans le traitement
du signal car si par exemple le granulator 1003 arrivait avant le groupe 2, on n'aurait pas le traitement car
le synth granulator resterait toujours l'attente du son traiter car la sortie du default et fm ne serait calcule
qu'aprs.
SuperCollider
propose donc plusieurs messages et commandes pour organiser et placer les nuds
et les groupes des nuds dans l'ordre dsir. Dans le groupe de discussion
organis par l'universit de Birmingham, il y a aussi l'ide d'implmenter une
mthode order pour le Serveur qui permettrait de faciliter la
tche en envoyant un vecteur du type "[id synth, new id]". Mthode
qui existe dj dans la librairie JIT (Just In Time Programming) et qui
utilise et tend les possibilits des espaces proxies dans SuperCollider.
Dans mon
implmentation, j'utilise InFeedback.ar qui permet de rcuprer des signaux qui sont plus tard dans l'arbre
de synthse. Toutefois, l'ordre auquel les synths sont crs dans le serveur
est capital pour un fonctionnement correct du programme et il faut rester
vigilant.
La classe Synth dans SuperCollider est la reprsentation dans le langage d'un nud
de synthse dans le serveur. Un Synth reprsente une unit
produisant du son. Les oprations que cette unit ralise sont dfinies avec la
classe SynthDef o les UGens (units gnratrices) sont spcifies et connectes et aussi les
types d'entrs et sorties qu'aura le synth. Un SynthDef est une sorte de modle fixe sur lequel les Synth sont bass.
Dans Jabalion
j'utilise 17 synths diffrents pour accomplir les tches de production et
traitement sonore.
Ces dix-sept
synths sont diviss en deux groupes, les sources et les traitements, dans les
sources il y aura :
- deux entres
analogiques
- cinq lecteurs
d'archives
- trois
algorithmes de synthse : modulation de frquence, synthse dynamique stochastique.
Pour connatre ou
spcifier l'endroit o le programme sauvegarde les synths, excuter :
SynthDef.synthDefDir
Voici le synth #1
qui permet d'avoir deux entres analogiques.
// ADC audio in
SynthDef(\AudioIn,
{|inBus=0,vol=1, out1=20,out2=21,out3=22,out4=23,out5=24,out6=25,out7=26,out8=27,
out9=28,out10=29,out11=30,out12=31,out13=32,out14=33,out15=34,
amp1=0,amp2=0,amp3=0,amp4=0,amp5=0,amp6=0,amp7=0,amp8=0,amp9=0,amp10=0,amp11=0,amp12=0,amp13=0,amp14=0,amp15=0|
var sig,imp,delimp,env,mix,ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,
ch11,ch12,ch13,ch14,ch15;
imp
= Impulse.kr(10);
delimp
= Delay1.kr(imp);
env
= Linen.kr(gate, 2, 1, 2, 2);
sig
= SoundIn.ar(inBus);
sig
= sig * vol * env;
mix
= [sig*amp1,sig*amp2,sig*amp3,sig*amp4,sig*amp5,sig*amp6,sig*amp7,
sig*amp8,sig*amp9,sig*amp10,sig*amp11,sig*amp12,sig*amp13,sig*amp14,sig*amp15];
#ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,ch13,ch14,ch15
=
DistributedOut.ar([out1,out2,out3,out4,out5,out6,out7,out8,out9,out10,
out11,out12,out13,out14,out15],mix);
SendReply.kr(imp,'levels',
[Amplitude.kr(sig),K2A.ar(Peak.ar(sig, delimp).lag(0, 3))]);
}).writeDefFile(SynthDef.synthDefDir)
Regardons quelques
dtails du code. Le nom du synth est dclar comme un symbole (\AudioIn), il suivent les arguments, numro du bus audio d'entre, les
canaux de sorties, le niveau de chaque canal, puis le variable o je dclare
par exemple sig qui n'est autre que le convertisseur audio numrique des entres
analogiques de la carte son.
J'ai t amen
crire une classe DistributedOut pour avoir un accs facile aux sorties de chaque synth et ainsi
avec l'aide d'une matrix diriger les
signaux dans des buses pour tablir un mapping
et contrler l'arborescence de synthse. Ce quoi sert cette classe est de recevoir
un vecteur de canaux et d'amplitudes non conjoints et de les assigner des buses
audio, ces signaux seront achemins vers les entres de synths traitement ou
directement vers les sorties (8) de la carte son.
Un autre point
commun tous mes synths est l'affichage graphique du niveau de sortie. Pour
ceci j'utilise la classe SendReply qu'envoie un message osc
('levels') de l'amplitude instantane avec des pics (Amplitude, Peak) un taux dtermin (ici tous le 100 ms) produit par l'oscillateur
d'impulses, l'interface graphique. La classe K2A convertit des signaux taux contrl vers le taux audio.
Les UGens (Units gnratrices) sont les
bloques basiques pour la construction de synths dans le serveur et sont
utiliss pour gnrer ou traiter les signaux d'audio et de contrle (avec le
message .ar (audio rate) ou .kr (control rate). Ils fonctionnent des taux diffrents :
44100, 48100... chantillons par seconde pour l'audio, 690 pour le taux de
contrle ou un valeur tous le 64 valeurs de l'audio rate). Chaque synth a
aussi une enveloppe simple (env) pour adoucir les entres et les extinctions du synth : env = Linen.kr(gate,
2, 1, 2, 2); les arguments correspondent : Linen.kr(
gate = 1.0, attackTime = 0.01, susLevel = 1.0, releaseTime = 1.0, doneAction =
0 ) l'argument "donneAction"
permet de dterminer une action accomplir lors de la fin de l'enveloppe ainsi
:
0 ne
rien faire
1 pause
le synth mais ne le libre pas
2 libre
le synth
3 libre
le synth et le nud prcdent
4 libre
le synth et le nud suivant
5 libre
le synth, si le nud prcdent est un groupe donc libre-le
6 libre
le synth, si le nud suivant est un groupe donc libre-le
7 libre
le synth et tous les nuds prcdents dans ce groupe
8 libre
le synth et tous les nuds suivants dans ce groupe
9 libre
le synth et pause le nud prcdent
10 libre le
synth et pause le nud suivant
11 libre le
synth et tous les groupes prcdents
12 libre le
synth et tous les groupes suivants
13 libre le
synth et tous les groupes prcdents et suivants
14 libre tous
les groupes et tous les nuds
La mthode .writeDefFile permet d'crire cette dfinition dans le disque dur et ainsi on peut
crer des instances de cette dfinition sans les dclarer chaque fois, car au
dmarrage du serveur elles sont automatiquement charges.
Le synthtiseur
numro 2 est celui qui me permet de lire des archives sonores
// Lecteur de Fichiers Sons
SynthDef(\samples,
{|bufnum=0,rate=1,t_trig=1,start=0,end=1,vol=1,loop=1,t_gate=1,
numchannels=1,dur=1,out1=20,out2=21,out3=22,out4=23,out5=24,out6=25,out7=26,out8=27,out9=28,out10=29,out11=30,out12=31,out13=32,out14=33,
out15=34,amp1=0,amp2=0,amp3=0,amp4=0,amp5=0,amp6=0,amp7=0,amp8=0,amp9=0,amp10=0,amp11=0,amp12=0,amp13=0,amp14=0,amp15=0|
var sig,val,phase,imp,delimp,env,ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,
ch10,ch11,ch12,ch13,ch14,ch15;
val
= BufFrames.kr(bufnum);
imp
= Impulse.kr(10);
delimp
= Delay1.kr(imp);
env
= Env.linen(0.2,dur,0.2,1,'welch');
phase=Phasor.ar(t_trig,BufRateScale.kr(bufnum)*rate,start*val,end*val);
sig
= BufRd.ar(1,bufnum,phase,loop,4);
sig
= sig * (EnvGen.kr(env,t_gate,doneAction:2));
sig
=sig*vol;
SendReply.kr(imp,
'phasor', phase);
SendReply.kr(imp,'levels',
[Amplitude.kr(sig),K2A.ar(Peak.ar(sig, delimp).lag(0, 3))]);
sig=[sig*amp1,sig*amp2,sig*amp3,sig*amp4,sig*amp5,sig*amp6,sig*amp7,
sig*amp8,sig*amp9,sig*amp10,sig*amp11,sig*amp12,sig*amp13,sig*amp14,sig*amp15]
#ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,ch13,ch14,ch15
=
DistributedOut.ar([out1,out2,out3,out4,out5,out6,out7,out8,out9,out10,out11,out12,out13,out14,out15],sig);
}).writeDefFile(SynthDef.synthDefDir);
Ce synth lit un buffer
charg en mmoire avec une indexation produit par un oscillateur Phasor sur lequel on peut contrler la frquence donc la vitesse de lecture
du fichier, le point de dpart et le point de fin en frames (quantit
d'chantillons fois les canaux). La classe BufFrames retourne la quantit des frames dans le buffer et la
classe BufRateScale permet de varier la vitesse de lecture du buffer.
Autre dtail est
l'argument t_trig est t_gate qui dclenchent l'oscillateur ou l'enveloppe chaque fois qu'on les
appelle trigger sans le
prfixe t_ les dclenchements
n'auraient lieu quՈ chaque transition, des valeurs ngatives vers des valeurs
positives.
Les trois synths
suivants produisent des donnes audio en utilisant trois algorithmes diffrents
de synthse.
// FMPlayer
SynthDef(\fm,{|gate=1,rate=20,freq=440,modfreq=200,
index, amp, dur=0.2
out1=20,out2=21,out3=22,out4=23,out5=24,out6=25,out7=26,out8=27,
out9=28,out10=29,out11=30,out12=31,out13=32,out14=33,out15=34,
amp1=0,amp2=0,amp3=0,amp4=0,amp5=0,amp6=0,amp7=0,amp8=0,amp9=0,amp10=0,amp11=0,amp12=0,amp13=0,amp14=0,amp15=0|
var sig,imp,delimp;
var
ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,ch13,ch14,ch15;
sig
= FMGrain.ar(Impulse.ar(rate),dur,freq,modfreq,index, EnvGen.kr(Env([0,
1, 0], [1, 1], \sin, 1),gate,doneAction:
2))*amp;
imp
= Impulse.kr(10);
delimp
= Delay1.kr(imp);
SendReply.kr(imp, 'levels',[Amplitude.kr(sig), K2A.ar(Peak.ar(sig, delimp).lag(0, 3))]);
sig
= [sig*amp1,sig*amp2,sig*amp3,sig*amp4,sig*amp5,sig*amp6,sig*amp7,
sig*amp8,sig*amp9,sig*amp10,sig*amp11,sig*amp12,sig*amp13,sig*amp14,
sig*amp15];
#ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,ch13,ch14,ch15
=
DistributedOut.ar([out1,out2,out3,out4,out5,out6,out7,out8,out9,out10,out11,out12,out13,out14,out15],sig);
}).writeDefFile(SynthDef.synthDefDir) ;
Ce synth bas sur
le paradigme de la modulation de frquence[9]
a pour UGen principale FMGrain crite par Joshua Parmenter
de l'Universit de Washington, et fait partie d'une librairie sur la synthse
granulaire.
Il sagit donc
dune combinaison de deux techniques, la modulation de frquence et la synthse
granulaire. Je lai choisi par le rsultat sonore trs riche et sa simplicit
pour tre intgr dans un environnement multi traitement comme Jabalion. Cette
classe a pour arguments :
*ar(trigger, dur, carfreq, modfreq, index, mul, add) ;
Le trigger
que retourne un nouveau grain chaque impulsion, dur qui reprsente la
taille du grain, puis pour chaque grain carfreq ou Frquence Porteuse, modfreq ou Frquence Modulante, index de modulation ou profondeur et comme dans tous les UGens dans SuperCollider mul et add,
mul est un facteur multiplicateur de
la sortie, c'est dire dans de signaux audio le rsultat sera un incrment de
niveau, le valeur par dfaut est 1, ainsi le signal oscille entre -1 et 1, 0
tant le silence. add est un facteur qui s'ajoute ou se somme la
sortie, ceci est intressant pour le calibrage des signaux contrle pour les
limiter dans une chelle des valeurs.
Celui-ci est un
synthtiseur trs puissant du point de vue expressif car chaque modification
dans les paramtres est trs saisissante pour la perception. Comme je vais lexpliquer
plus loin tous les paramtres de contrle ont t normaliss entre 0 et 1, ceci
oblige manier des valeurs relatives sur le synthtiseur plus que de valeurs
absolues. Par exemple les frquences porteuse et modulante oscillent entre 20Hz
et 20kHz mais une interpolation exponentielle permet de passer des valeurs de
0 et 1 faisant le contrle plus intuitif que mathmatique.
SynthDef(\gendy, {|gate=1,ampdist=1,durdist=1,adparam=1,ddparam=1,
minfreq=30,maxfreq=100,ampscale=0.3,durscale=0.05,initCPs=5,knum=12, vol=1.0, out1=20,out2=21,out3=22,out4=23,out5=24,out6=25,out7=26,out8=27,
out9=28,out10=29,out11=30,out12=31,out13=32,out14=33,out15=34,
amp1=0,amp2=0,amp3=0,amp4=0,amp5=0,amp6=0,amp7=0,amp8=0,amp9=0,amp10=0,amp11=0,amp12=0,amp13=0,amp14=0,amp15=0|
var sig,imp,delimp;
var
ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,ch13,ch14,ch15;
sig
= Gendy1.ar(ampdist, durdist, adparam, ddparam,
minfreq, maxfreq, ampscale, durscale, initCPs,knum,
EnvGen.kr(Env([0, 1, 0], [1, 1], \sin,
1),gate,doneAction: 2),0) * vol;
imp
= Impulse.kr(10);
delimp
= Delay1.kr(imp);
SendReply.kr(imp, 'levels',
[Amplitude.kr(sig),
K2A.ar(Peak.ar(sig,
delimp).lag(0, 3))]);
sig
= [sig*amp1,sig*amp2,sig*amp3,sig*amp4,sig*amp5,sig*amp6,sig*amp7,
sig*amp8,sig*amp9,sig*amp10,sig*amp11,sig*amp12,sig*amp13,sig*amp14,
sig*amp15];
#ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,ch13,ch14,ch15
=
DistributedOut.ar([out1,out2,out3,out4,out5,out6,out7,out8,out9,out10,out11,out12,out13,out14,out15],sig);
}).writeDefFile(SynthDef.synthDefDir))
Ce synthtiseur
est une implmentation de la synthse dynamique stochastique, dcrite par
Iannis Xenakis dans "Formalized Music"[10].
Le programme de base a t crit par Marie-Helene Serra. La mthode consiste
calculer chaque priode de la forme d'onde l'aide des distributions
stochastiques. Les variables sont : la quantit des points sur lesquelles on
pourra contrler les positions bidimensionnelles dans un plan o les ordonnes
reprsentent l'amplitude et les abscisses le temps, les limites maximum et
minimum pour l'ensemble des points et le type de distribution dans les options
suivantes : 0- LINEAR, 1- CAUCHY, 2- LOGIST, 3- HYPERBCOS, 4- ARCSINE, 5- EXPON,
6- SINUS
Ainsi, une fois
calcule la premire priode d'onde, chaque point suit l'opration de
distribution et obtient une nouvelle valeur. Cette priode en millisecondes
sera gale la somme des positions de chaque point sur l'axe des "x"
et peut tre normalis de faon avoir une priodicit mais un contenu spectral
trs complexe.
Le graphique
suivant est une illustration de ce procd. On peut constater comme la forme
donde varie un peu capricieusement ce qui produit des sons trs riches et
vivants quand on les enchane. La longueur et donc la priode de chaque
variation est modifie avec le mme procd stochastique.
Passons maintenant
au dernier procd de synthse utilis dans ce travail. Il sagit de k-means,
encore une technique base dans un procd de calcul de probabilits : Le partitionnement
de donnes (data clustering en anglais) est une mthode statistique d'analyse des donnes qui a pour but de regrouper un ensemble de donnes en diffrents
paquets homognes, en ce sens que les donnes de chaque sous-ensemble partagent
des caractristiques communes, qui correspondent le plus souvent des critres
de proximit que l'on dfinit en introduisant des mesures de distance.
Cest dire
partir dun flux alatoire on rpte itrativement un regroupement des donnes
dans un espace deux dimensions pour obtenir de formes donde, jous par un
oscillateur. Cette technique est donc trs proche dans le rsultat sonore de
ceux obtenus avec la synthse dynamique stochastique de Xenakis.
Les paramtres de
contrle de cet algorithme sont :
freq- frquence
de loscillateur
numdatapoints- Nombre
initial de points.
maxnummeans- Maximum
nombre de means ou mesures de distance
nummeans- Nombre
actuel de means
tnewdata- Si un
trigger est reu rinitialiser le flux de donnes (k-rate)
tnewmeans- Si un
trigger est reu rinitialiser means (k-rate)
soft- Taux
dactualisation de means . 1.0 actualisation immdiate, 0.0 pas
dactualisation.
bufnum- cette
option permet dutiliser les donns stocks dans un buffer comme point de
dpart pour les donns sur lequel lopration de probabilit seront effectus.
Ici le code pour limplmentation de cet
algorithme dans mon programme.
// Kmeans
SynthDef(\kmeans,{|gate=1, freq=220, nummeans=4,
soft=0.01, rate=10, vol=0.1,out1=20,out2=21,out3=22,out4=23,out5=24,out6=25,out7=26,
out8=27,out9=28,out10=29,out11=30,out12=31,out13=32,out14=33,out15=34,
amp1=0,amp2=0,amp3=0,amp4=0,amp5=0,amp6=0,amp7=0,amp8=0,amp9=0,amp10=0,amp11=0,amp12=0,amp13=0,amp14=0,amp15=0|
var sig,imp,delimp,env;
var
ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,ch13,ch14,ch15;
env
= Linen.kr(gate, 2, 1, 4, 2);
sig
= Mix(vol*env*KmeansToBPSet1.ar(freq*[1,3/2,5/4,7/6],20,4,nummeans,
Impulse.kr(0.2),Impulse.kr(rate),soft));
imp
= Impulse.kr(10);
delimp
= Delay1.kr(imp);
SendReply.kr(imp,'levels',
[Amplitude.kr(sig),K2A.ar(Peak.ar(sig,delimp).lag(0, 3))]);
sig
= [sig*amp1,sig*amp2,sig*amp3,sig*amp4,sig*amp5,sig*amp6,sig*amp7,
sig*amp8,sig*amp9,sig*amp10,sig*amp11,sig*amp12,sig*amp13,sig*amp14
sig*amp15];
#ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,ch13,ch14,ch15
=
DistributedOut.ar([out1,out2,out3,out4,out5,out6,out7,out8,out9,
out10,out11,out12,out13,out14,out15],sig);
}).writeDefFile(SynthDef.synthDefDir));
Dans Jabalion il y a huit modules de
traitement du signal et comme je lai mentionn plus haut, ces modules sont des
nuds de synthse dans larborescence de SuperCollider, donc dans le code ils
sont aussi crits comme synthtiseurs.
- Pitch shifter.
- Modulations.
- Retardes moduls.
- Rverbration.
- Multi-delays.
- Vocodeur de phase
- Freezer et time stretching.
- Granulateur.
Dun point de vue technique ces modules
sont des implmentations de diffrentes familles de traitements : de
lignes retard, modulations, transforms de Fourier et synthse granulaire.
Lordre indiqu ci-dessus est celui prsent dans le logiciel et si bien semble
un peu arbitraire, il sest conform daprs une exploration de ces diffrentes
techniques.
Pour des raisons danalyse et de clart
je vais les prsenter ici en suivant le type de technique utilis dans chaque
algorithme : modulations, lignes retard, transformes de Fourier et
synthse granulaire.
Dans ce synthtiseur il sagit dune
implmentation de la modulation damplitude unipolaire. Toutes les
composantes du signal sont dcales par un facteur fixe.
// modulation damplitude et wah
(
SynthDef(\modulations,{|inBus=22, gate=1,
wet=1, modfreq=100, modlevel=0, lforate=1, filtfreq=100, lfovol = 1,
out1=20,out2=21,out3=22,out4=23,out5=24,out6=25,out7=26,out8=27,
out9=28,out10=29,out11=30,out12=31,out13=32,out14=33,out15=34,
amp1=0,amp2=0,amp3=0,amp4=0,amp5=0,amp6=0,amp7=0,amp8=0,amp9=0,amp10=0,amp11=0,amp12=0,amp13=0,amp14=0,amp15=0|
var
sig,mix,ring,wah,mixwet;
var
imp,delimp,env,ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,
ch13,ch14,ch15;
imp
= Impulse.kr(10);
delimp
= Delay1.kr(imp);
env
= Linen.kr(gate, 2, 1, 4, 2);
sig
= InFeedback.ar(inBus);
ring
= FreqShift.ar(sig, modfreq,0) * modlevel;
wah
= RLPF.ar(sig, LinExp.kr(
LFNoise1.kr(lforate), -1, 1, 200, filtfreq), 0.1)
* lfovol;
mix
= Mix.new([ring,wah]);
sig
= (sig * (1 - (wet*env))) + (mix * (wet*env));
SendReply.kr(imp,
'levels',
[Amplitude.kr(sig), K2A.ar(Peak.ar(sig, delimp).lag(0, 3))]);
sig
= [sig*amp1,sig*amp2,sig*amp3,sig*amp4,sig*amp5,sig*amp6,sig*amp7,sig*amp8,sig*amp9,sig*amp10,sig*amp11,sig*amp12,sig*amp13,sig*amp14,sig*amp15];
#ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,ch13,ch14,ch15
=
DistributedOut.ar([out1,out2,out3,out4,out5,out6,out7,out8,out9,out10,out11,out12,out13,out14,out15],sig);
}).writeDefFile(SynthDef.synthDefDir) );
Ce synthtiseur ralise deux types de
traitement, le signal dentre sig est pass par la modulation
damplitude freqShift, La
frquence de modulation est contrle par la variable modfreq et le niveau par la variable modlevel. En parallle le signal est rout travers
un filtre passe bas RLPF dont la
frquence de coupure meut entre une valeur maximum filterfreq et une valeur
alatoire produit au taux lforate par
loscillateur LFNoise1. Ces valeurs
sont interpoles par une ligne convertissant des valeurs linaires dans des
valeurs logarithmiques LinExp. Cet effet
dont on module la frquence de rsonnance dun filtre est connu comme wah
Pour illustrer ces deux traitements et
les exemples suivants, je vais utiliser un chantillon (son 1 plage1 CD) de son
de guitare : un mi3 jou la premire corde vide, enregistr avec un
microphone statique cardiode 15 cm du point dattaque (12cm du
chevalet) la frquence dՎchantillonnage est de 44.1 khz avec une rsolution damplitude 16 bits;
lenregistrement est normalis et pour
des raisons de facilit des calculs la dure a t fixe 1000 ms.
Le sonagramme suivant illustre leffet
de frequency shift . Lanalyse est faite avec une taille de FFT de
4096 et un type de fentre Hanning le range frquentielle de 0 12 khz et la
dure est de 22 secondes.
Figure
2
Frequency Shift, dplacement spectral CD plage 2
Le son 1 est jou en boucl, dans les deux
premires attaques il ny a pas de traitement, cest la rfrence, partir du
troisime une modulation de 10 hz est introduite et mix avec larchive
dorigine, la rsolution frquentielle de lanalyse ne permet pas de mettre en
valeur cette variation mais sur les huit attaques qui suivent, une ligne entre
10 et 2000 hz contrle la frquence de modulation qui est clairement illustre.
la quinzime seconde de lexemple la ligne
recommence avant la seizime attaque. On constate sur le sonagramme que toutes
les composantes du spectre sont dcales et le spectre originel diminue en
amplitude.
Dans lexemple suivant le son 1 est jou
en boucl et trait par le filtrage du type wah
dcrit plus haut. La frquence de coupure du filtre est rgle 5khz. Les
paramtres danalyse sont les mmes que pour lexemple prcdent.
Figure
3
Modulations wah CD plage 3
Il y a cinq moments dans cet exemple :
le premier est le son de rfrence (trois attaques), aprs le taux de variation
pour loscillateur alatoire est rgl 5% (six attaques), puis 100% (six
attaques), puis 25% (trois attaques), 5%(trois attaques) et pour finir 0%
(deux attaques). Cet effet est trs riche dun point de vue sonore car amne
une certaine vie lintrieur du spectre, il a t trs exploit par exemple dans
la musique rock[11]. Ici, le
fait davoir introduit un degr dimprvisibilit avec loscillateur alatoire
permet de jouer sur la complexit du spectre en ajustant le taux de variation,
tout en gardant un contrle conscient du traitement.
Cette technique est trs riche dans ces
rsultats sonores et produit donc une grande varit deffets en suivant les
valeurs du retard, litration de ceux-ci et le taux de rinjection : chos,
rverbration, modulations, filtrages. Quand la valeur du retard dpasse 50 ms
(cette valeur de discrimination peut changer avec les sujets et le type de son tudi)[12]
une rptition, un cho devient clair ; entre 1 ms et 10 ms
approximativement une modification spectrale du type filtrage (filtre un
peigne) est peru, ce sont les delays courts; entre 10 et 50 ms le mixage des deux
signaux son direct son retard, peut conduire des annulations de phase. Cela
se traduit par un claircissement
de la fondamentale et de partiels suprieurs, cest une technique
utilis dans les effets de flanger et
chorus.
Mon premier exemple de ligne retard
est la rverbration, il sagit dun traitement trs saisissable, car
perceptivement il peut sassocier un concept despace. La rverbration est
un effet physique produit par la rflexion des ondes sur des surfaces et donc
arrivant lauditeur avec de petits retards temporels par rapport au son
direct. Le taux darrive de ces rflexions change dans le temps en fonction de
la taille et la forme de lespace o le son se produit.
Les paramtres de contrle peuvent tre
trs nombreux dans les simulations numriques de la rverbration, quelques
fois en faisant allusion des paramtres perceptifs ou des fois trs
techniques : temps de rverbration, facteur de diffusion, amortissement,
taille de la salle, facteur dabsorption, predelays , gate time ,
gate decay time , gate threshold et bien dautres.
La rverbration est tellement use dans
le traitement du signal en studio et en concert que de nos jours les
de-rverbrators ou enleveurs de rverbration en
diffrentes formes algorithmiques ont vu le jour et sont devenus la mode pour
nettoyer les signaux[13].
Dans cette implmentation, jutilise un
algorithme daprs les travaux ralises par Manfred Schroeder[14]
des Laboratoires Bell et crite en C++, de distribution libre appel Freeverb .
Pour simuler les effets de la rverbration, les algorithmes de Schroeder
proposent l'utilisation de dlais, de filtres passe-tout et
de filtres en peigne. Les dlais sont utiliss pour reproduire les rflexions
primaires de la salle et les filtres sont ensuite connects en srie et en
parallle pour crer un nuage trs dense de rverbration. Dans le diagramme
des bloques que suit il y a donc
quatre filtres passe-tout en srie et huit filtres en peigne en
parallle pour chaque canal audio.
Figure 4 Diagramme des bloques rverbration daprs lalgorithme de Schroeder
Le code suivant est limplmentation de
cette rverbration dont les paramtres de contrle sont la taille de la salle room, un facteur damortissement damp un mixage avec le son direct wet et le niveau du traitement level.
// Freeverb
(
SynthDef(\reverb, {|inBus=24,gate=1, wet=1,
room=0.15, damp=0.5, vol=0
out1=20,out2=21,out3=22,out4=23,out5=24,out6=25,out7=26,out8=27,
out9=28,out10=29,out11=30,out12=31,out13=32,out14=33,out15=34,
amp1=0,amp2=0,amp3=0,amp4=0,amp5=0,amp6=0,amp7=0,amp8=0,amp9=0,amp10=0,amp11=0,amp12=0,amp13=0,amp14=0,amp15=0|
var sig;
var imp,delimp,env,ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,
ch13,ch14,ch15;
imp
= Impulse.kr(10);
delimp
= Delay1.kr(imp);
env
= Linen.kr(gate, 2, 1, 4, 2);
sig
= InFeedback.ar(inBus);
sig
= FreeVerb.ar(sig,wet,room,damp,vol);
SendReply.kr(imp,
'levels',
[Amplitude.kr(sig), K2A.ar(Peak.ar(sig, delimp).lag(0, 3))]);
sig
=
[sig*amp1,sig*amp2,sig*amp3,sig*amp4,sig*amp5,sig*amp6,sig*amp7,sig*amp8,sig*amp9,sig*amp10,sig*amp11,sig*amp12,sig*amp13,sig*amp14,
sig*amp15];
#ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,ch13,ch14,ch15
=
DistributedOut.ar([out1,out2,out3,out4,out5,out6,out7,out8,out9,out10,
out11,out12,out13,out14,out15],sig);
}).writeDefFile(SynthDef.synthDefDir));
Sur la page suivante je prsente un sonagramme
quillustre ce traitement et notamment le facteur damortissement
dump sur mon archive source (son 1). Le premire attaque est le
son de rfrence, les trois suivantes ont la variable taille de la
salle (room size) 100% puis respectivement
le facteur damortissement 100%, 50% et 1%.
Bien que jai born lanalyse 12Khz le
spectre prsente encore des composantes aigus au-dessus de cette limite, car
je voulais focaliser lobservation dans lenrichissement du spectre.
Figure
5 Effet de rverbration CD plage 4
On voit comment au fur et mesure que le facteur damortissement
diminue les composantes aiges ont une dure plus longue, on entend les retards
se mlant comme de rebondissements trs diffus de lattaque. LՎnergie de la
fondamentale est rduite et un sentiment de nuage sonore ou de grand espace li
aussi la disparition des transitoires dattaque.
Passons maintenant des retards longs. Jai dit plus haut que les
retards du signal autour de 50 ou 100 ms en prsence du son direct commencent
se diffrencier dans lattaque, dont un effet dՎcho est peru. Ceci est trs
intressant de point de vue musical car on peut construire des structures
rythmiques o on contrle le temps de sparation entre les attaques, le niveau
et la quantit de ces rptitions[15].
On peut imaginer des retards trs longs o la seule limite est la mmoire vive
de lordinateur et donc la taille du buffer qui va stoker le signal.
Le principe consiste donc avoir un buffer qui reoit le signal
dentre en permanence et sur lequel on bien lire diffrents moments ce signal.
Dans limplmentation qui suit, jutilise un buffer de 20 secondes et un
vecteur de lecture de 20 valeurs possibles. Ce qui veut dire que le buffer peut
tre lu 20 moments diffrents et la distance temporelle maximum entre deux
lectures conscutives est limit 1 seconde.
// MultiDelay
(SynthDef(\multidelay, { |inBus
= 25,gate=1,wet=1,vol=1,buf=20,
timedel1,timedel2,timedel3,timedel4,timedel5,timedel6,timedel7,
timedel8,timedel9,timedel10,timedel11,timedel12,timedel13,timedel14,
timedel15,timedel16,timedel17,timedel18,timedel19,timedel20,
ampdel1,ampdel2,ampdel3,ampdel4,ampdel5,ampdel6,ampdel7,ampdel8,
ampdel9,ampdel10,ampdel11,ampdel12,ampdel13,ampdel14,ampdel15,ampdel16,ampdel17,ampdel18,ampdel19,ampdel20,
out1=20,out2=21,out3=22,out4=23,out5=24,out6=25,out7=26,out8=27,
out9=28,out10=29,out11=30,out12=31,out13=32,out14=33,out15=34,
amp1=0,amp2=0,amp3=0,amp4=0,amp5=0,amp6=0,amp7=0,amp8=0,amp9=0,amp10=0,amp11=0,amp12=0,amp13=0,amp14=0,amp15=0|
var
in,phase,tap1,tap2,tap3,tap4,tap5,tap6,tap7,tap8,tap9,tap10,tap11,
tap12,tap13,tap14,tap15,tap16,tap17,tap18,tap19,tap20,env,sig,mix,
imp,delimp;
var
ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,ch13,ch14,ch15;
in = InFeedback.ar(inBus);
phase = DelTapWr.ar(buf,
in);
// literal Array of times, 4 =
interpolation (cubic)
#tap1,tap2,tap3,tap4,tap5,tap6,tap7,tap8,tap9,tap10,tap11,tap12,
tap13,tap14,tap15,tap16,tap17,tap18,tap19,tap20
=
DelTapRd.ar(buf, phase,
[timedel1,timedel2,timedel3,timedel4,timedel5,timedel6,timedel7,
timedel8,timedel9,timedel10,timedel11,timedel12,timedel13,timedel14,
timedel15,timedel16,timedel17,timedel18,timedel19,timedel20],4,
[ampdel1,ampdel2,ampdel3,ampdel4,ampdel5,ampdel6,ampdel7,ampdel8,
ampdel9,ampdel10,ampdel11,ampdel12,ampdel13,ampdel14,ampdel15,ampdel16,ampdel17,ampdel18,ampdel19,ampdel20]);
env = Linen.kr(gate,
2, 1, 4, 2);
mix = Mix([tap2+tap4+tap6+tap8+tap10+tap12+tap14+tap16+tap18+tap20+
tap1+tap3+tap5+tap7+tap9+tap11+tap13+tap15+tap17+tap19]);
mix = mix * vol;
sig = (in * (1 - (wet*env))) + (mix * (wet*env));
imp = Impulse.kr(10);
delimp = Delay1.kr(imp);
SendReply.kr(imp, 'levels',
[Amplitude.kr(sig), K2A.ar(Peak.ar(sig, delimp).lag(0, 3))]);
sig = [sig*amp1,sig*amp2,sig*amp3,sig*amp4,sig*amp5,sig*amp6,sig*amp7,
sig*amp8,sig*amp9,sig*amp10,sig*amp11,sig*amp12,sig*amp13,sig*amp14,sig*amp15];
#ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,ch13,ch14,ch15
=
DistributedOut.ar([out1,out2,out3,out4,out5,out6,out7,out8,out9,out10,out11,out12,out13,out14,out15],sig);
}).writeDefFile(SynthDef.synthDefDir) );
Les classes centrales dans cette implmentation sont DelTapWr et DelTapRd lesquelles permettent respectivement dՎcrire et lire
dans le buffer. Le buffer est passe comme un argument nomm buf. timedel et ampdel sont des arguments pour dterminer la dure et
lamplitude de chaque retard.
Sur
linterface graphique on dcouvre le moyen de contrler ces deux vecteurs :
avec deux multisliders, dont les
valeurs sont normaliss 1. Pour le vecteur de temps de retard il faudra donc
penser calculer le temps absolu avec une opration dintgration. En haut
droite il y a deux menus qui permettent de choisir des configurations du type :
ritardando, accelerando, crescendo, diminuendo, alatoire. Puis les
configurations trouves la main peuvent tre stockes dans des archives
textes et charges postrieurement.
Dans le graphique, on voit sur la forme donde la structure
rythmique des vingt retards (le premier tant la rfrence) avec une
distribution alatoire des amplitudes pour chaque retard. Ce traitement permet
de produire des structures rythmiques assez complexes et intressantes.
Toutefois la limite de 20 retards est une contrainte car il faudrait modifier
le code de linterface graphique. Pour manipuler les vecteurs de temps et
damplitude depuis une ligne de commande :
~values.multidelay.settimes_(Array.fill(20,{|i|i+i}).normalize.reverse)
~values.multidelay.setvols_(Array.fill(20,{|i|i+i}).normalize)
Soit on peut choisir dՎcrire une fonction avec largument i soit bien crire le vecteur la main. Jai
beaucoup travaill dans limplmentation dune interpolation entre deux
configurations sauvegardes en mmoire, mais les rsultats ne sont pas optimaux
car pour changer le temps de retard un par un dans les composantes du vecteur
il faut atteindre ce que le retard soit jou, puis faire une ligne descendante
dans le volume, puis changer la valeur et finalement ramener le volume la
valeur dsire. Malgr des grands efforts de calcul je continue avoir des
clics et des distorsions, donc il faut encore imaginer des solutions pour bien
grer cette interpolation.
Une troisime
application de cette technique de ligne retard consiste varier le temps de
retard dune faon continue, ainsi on obtient comme son rsultant des versions
transposes du signal dorigine. Ou de glissements dans la hauteur quand les
changements de vitesses sont continus. Un oscillateur du type lfo
peut tre sur la tche de modifier le point de lecture sur le buffer[16].
Un problme qui se
prsente est celui de clics ou de sons non dsirs produits par le fait de lire
le buffer des endroits et vitesses diffrentes, donc il peut arriver de
concider sur un point qui est en train dՐtre crit, ou quand la lecture se
boucle dans lenchanement de dbut et fin du fichier[17].
Pour contourner cette problmatique, voici ma stratgie :
dabord, il faut avoir un buffer suffisamment long pour laisser lespace
ncessaire lՎcriture de la ligne retard sans retomber sur ses
pieds , puis le signal est pass par deux lignes de retard parallles
mais retardes entre elles par la priode de loscillateur lecteur (lfo),
aprs, lamplitude de chaque ligne est contrle par deux oscillateurs
triangulaires pour produire un crossfader
au dbut de la lecture du fichier sur chaque rptition. Finalement une
troisime ligne retard sert contrler le taux de rinjection.
// Ligne retard modul
(SynthDef(\delmod,{|inBus=23,gate=1,wet=1,transposition=0.5,delay=0.01,feedback=0,vol=1,buf=22,
out1=20,out2=21,out3=22,out4=23,out5=24,out6=25,out7=26,out8=27,
out9=28,out10=29,out11=30,out12=31,out13=32,out14=33,out15=34,
amp1=0,amp2=0,amp3=0,amp4=0,amp5=0,amp6=0,amp7=0,amp8=0,amp9=0,amp10=0,amp11=0,amp12=0,amp13=0,amp14=0,amp15=0|
var sig,mixwet,local,lfo,del1,del2;
var
imp,delimp,env,ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,
ch13,ch14,ch15;
imp = Impulse.kr(10);
delimp = Delay1.kr(imp);
env = Linen.kr(gate,
2, 1, 4, 2);
sig = InFeedback.ar(inBus);
local = LocalIn.ar(1)
+ sig;
//buf = LocalBuf((44100*2),1);
lfo = LFSaw.kr(transposition,0).range(0,1);
del1 = BufDelayC.ar(buf,local,lfo,1)*
LFTri.kr(transposition.abs,0).range(0,1)*vol;
del2 = DelayC.ar(BufDelayC.ar(buf,local,lfo,1)*
LFTri.kr(transposition.abs,0).range(0,1)*
vol,20,transposition.reciprocal);
local = SwitchDelay.ar
(del1+del2,delayfactor:feedback,wetlevel:0.8,delaytime:delay)
*feedback;
local = LeakDC.ar(local);
local = Limiter.ar(local,1,0.01);
sig = (sig * (1 - (wet*env))) + (local * (wet*env));
LocalOut.ar(local * feedback);
SendReply.kr(imp, 'levels',
[Amplitude.kr(sig), K2A.ar(Peak.ar(sig, delimp).lag(0, 3))]);
sig =
[sig*amp1,sig*amp2,sig*amp3,sig*amp4,sig*amp5,sig*amp6,sig*amp7,
sig*amp8,sig*amp9,sig*amp10,sig*amp11,sig*amp12,sig*amp13,sig*amp14,
sig*amp15];
#ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,ch13,ch14,ch15
=
DistributedOut.ar([out1,out2,out3,out4,out5,out6,out7,out8,out9,out10,out11,out12,out13,out14,out15],sig);
}).writeDefFile(SynthDef.synthDefDir));
Pourtant les clics produits par le changement de valeur dans la
dure du retard, ne sont pas vites. Pour ceci comme il est bien illustr dans
les tutoriaux de MaxMSP sur les objets tapin et tapout
il faudrait faire une limitation dans la vitesse de changement de cette
valeur, puis faire une ligne dans lamplitude de faon raliser le changement
quand le signal est zro. Toutefois ces clics ou artefacts sonores peuvent
tre exploits musicalement.
Les paramtres de contrle de ce synthtiseur seront donc la
frquence du lfo, (ici
largument : transposition), jutilise un oscillateur en dent de
scie et sa frquence oscillant entre -1 et 1, -1 une inversion de phase dans
loscillateur est produite et donc la forme donde de celui-ci correspond une
rampe descendante ; le temps du retard de la troisime ligne qui varie de
1ms 1 seconde et le taux de rinjection exprim en pourcentage du signal
renvoy lentre.
Un dernier commentaire sur larchitecture de ce synthtiseur :
remarquer la prsence dun filtre et un limiteur avant de rinjecter le
signal pour nettoyer les possibles effets de repliement spectral dus aux lignes
de retards[18].
Pour illustrer la puissance gnratrice
du taux de rinjection voici un son de 24 secondes obtenu avec une impulsion de
mon archive source son1 puis un temps de retard de 3ms, la
frquence du lfo variant de -1 1 et le taux de rinjection ou feedback 100%
Les paramtres danalyse ont chang dans
la rsolution frquentielle : taille de lanalyse FFT 1024 et la
reprsentation graphique allant jusquau 22KHz, tous les restes sont conservs
comme dans les analyses prcdents.
Trois remarques dans ce son. Le mouvement des composantes spectrales
en forme de triangle, d la frquence de modulation du temps du retard dabord
dent de scie puis rampe, produit par linversion de phase quand la frquence
traverse des cts ngatifs vers les positifs. Deuxime remarque, la
rapparition de lattaque dclencheur qui se nourrit en composantes avec la
rinjection. Et troisime remarque, le creux spectral quand la frquence de
modulation approche le zro.
Les traitements tudis jusquici ont lieu
dans le domaine temporel, manipulant les chantillons dans son amplitude pour
les modulations ou bien dans le temps comme dans les lignes retards et
filtres. Lanalyse de Fourier, permet de traduire les signaux audio dans le
domaine frquentiel et de raliser les traitements directement sur le spectre.
Mathmatiquement,
la transforme de Fourier est dnie sur des fonctions continues de −
+, dans le cas de signaux numriques on doit utiliser un type de transforme
de Fourier appele discrte sur un intervalle de temps ni correspondant
N chantillons[19].
Avant de continuer
dans les implmentations, je voudrais rviser quelques dfinitions que lon
trouve souvent dans le vocabulaire technique quand il sagit dAnalyse de
Fourier :
Fentrage : le fentrage est utilis ds que l'on s'intresse un
signal de longueur volontairement limit. En effet, un signal rel ne peut
qu'avoir une dure limite dans le temps ; de plus, un calcul ne peut se faire
que sur un nombre de points fini. Pour observer un signal sur une dure finie,
on le multiplie par une fonction fentre d'observation (galement appele
fentre de pondration). Parmi les fonctions les plus courantes, il y a la
fentre rectangulaire, de
Hanning, de Hamming, et de Blackman.
La Transforme de
Fourier (TF) du signal analys est convolue avec la TF de la fentre[20]
; dans l'idal, pour ne pas biaiser le spectre initial, il faudra que l'allure
de la fentre spectrale soit une fonction de Dirac. Or, le signal temporel ayant un spectre en fonction de dirac est
un signal constant infini, ce qui est impossible en pratique. Les allures
spectrales des fentres de pondrations prsentent une succession de lobes :
pour se rapprocher d'une fonction de Dirac, il faut que le lobe principal soit
le plus troit possible, tandis que les lobes secondaires doivent tre les plus
faibles possible. Plus le lobe principal d'une fentre aura tendance tre
troit, plus ses lobes secondaires seront importants. Il y a donc toujours un
compromis faire entre largeur du lobe principal et importance des lobes
secondaires.
Plus la fentre
choisie aura une grande dure temporelle, plus elle sera troite dans le
domaine frquentiel. Le taux de recouvrement des fentres overlap permet de lisser le
signal l'analyse et la rsynthse.
Taille de lanalyse : ce facteur dtermine la prcision frquentielle de l'analyse, et
sexprime en nombre dՎchantillons. La transforme de Fourier discrte faite en
appliquant directement son quation mathmatique ncessite N multiplications pour
calculer un coefficient de Fourier ak, comme il y en a galement N le
temps de calcul de la transforme de Fourier serait de N2
multiplications.
Cest donc une opration
lourde en calcul, heureusement Cooleyet Tukey[21]
ont remarqu que si N est une puissance de 2 on peut faire le calcul beaucoup plus
vite. En effet en utilisant les symtries paires impaires, il est possible de rduire
le nombre doprations N.log2N. Si nous voulons faire une transforme de Fourier
sur 1024 points (210) on passe de 106 104 oprations
soit un gain dun facteur 100.
Si on effectue une
analyse de Fourier sur une fentre de 1024 chantillons extraits du signal, on
obtiendra une analyse en 1024 points ou bins
ou tranches ou paniers de frquences. On comprend donc que plus la fentre est
large, plus on a de points dans lanalyse spectrale et plus elle est prcise au
niveau frquentielle. Par contre, l'information tant estime sur toute la
longueur de l'analyse, les vnements trs rapides, comme les attaques, seront adoucis
par la moyenne effectue sur plusieurs chantillons. Le compromis est invitable.[22]
Par exemple, si on
utilise une fentre de 1024 chantillons, on obtient un spectre de 1024 points.
Ces 1024 points sont rpartis de 0 44100 Hz, donc, en ralit, on na que 512
points de 0 22050 Hz (frquences positives). Les points sont espacs de
44100/1024 = 43 Hz.
Imaginaire et Rel : la transforme de Fourier dun signal rel est un signal complexe, cest--dire un signal deux
dimensions car chaque composante est dfinie par deux paramtres: son amplitude
et sa phase.
L'ensemble des
nombres complexes est l'ensemble des nombres de la forme :
Z = a + bi o a et b sont des rels quelconques
et i un nouveau nombre tel que
i ²= -1.
Le nombre a est
appel partie relle de z et not parfois Re(z).
Le nombre b est
appel partie imaginaire de z et not parfois Im(z).
La forme z = a + bi est appele forme algbrique de z. On peut aussi reprsenter un
nombre complexe suivant ses coordonnes polaires. Les coordonnes sont alors
lamplitude (r) et langle (a) (phase). Sa magnitude ou valeur absolue tant la
distance lorigine dans le plan complexe[23].
Z = reia Avec
: eia = cos a + i sin
a
Dans SuperCollider
plusieurs UGens supportent des traitements bass sur le FFT, les plus basiques
tant FFT et IFFT, ces deux classes permettent de passer du domaine temporel au
domaine frquentiel et vice-versa. Le contenu spectral du signal est plac dans
un buffer local dont la
taille qui est une puissance de deux correspondra la taille de lanalyse.
Dans ce buffer on stocke les donnes dans lordre suivant : DC offset,
nyquist, real 1f, imag 1f, real 2f, imag 2f... real (N-1)f, imag (N-1)f, o f
est la frquence relative la taille de la fentre, et N est la taille de la
fentre sur 2.Le taux de recouvrement des fentres est par defaut de 50%, le
type de fentre est Hanning
Parmi toutes les
oprations possibles sur linformation spectrale, SuperCollider propose dans sa
distribution publique les implmentations suivantes
FFT Fast Fourier Transform
IFFT
Inverse Fast Fourier Transform
PV_Add somme de coefficients complexes
PV_BinScramble brouillage
de bins (tranches, paniers de frquences)
PV_BinShift dplacement
et largissement de positions de bins
PV_BinWipe combinaison de bas et
hauts bins sur deux entres
PV_BrickWall zro bins
PV_ConformalMap attaque dans le plan complexe
PV_Copy copier
un FFT buffer
PV_CopyPhase copier
magnitudes et phases
PV_Diffuser alatoire
dplacements de phase
PV_LocalMax pas bins lesquels ont un
maximum local
PV_MagAbove pas
bins sur un limite
PV_MagBelow pas bins en dessous un limite
PV_MagClip clip bins sur un limite
PV_MagFreeze geler
les magnitudes
PV_MagMul multiplier les
magnitudes
PV_MagDiv division de
magnitudes
PV_MagNoise multiplication de magnitudes avec bruit
PV_MagShift dplacement et
largissement de magnitudes de bins
PV_MagSmear appliquer une moyenne aux magnitudes pour tous
les bins
PV_MagSquared
carr des magnitudes
PV_Max maximum magnitude
PV_Min minimum magnitude
PV_Mul multiplication de complexes
PV_PhaseShift dplacement de phase pour tous les bins
PV_PhaseShift270 dplacer la phase de 270
dgres
PV_PhaseShift90 dplacer la
phase de 90 dgres
PV_RandComb pas
alatoirement de bins
PV_RandWipe crossfade dans un ordre alatoire des bins
PV_RectComb faire distances ou trous dans le spectre
UnpackFFT,
PackFFT, Unpack1FFT "unpacking"
components
Une transformation
conforme, (conformal map), galement
appele une carte mapping conforme,
transformation de
prservation de l'angle, ou carte
biholomorphe, est une transformation qui prserve la magnitude des angles
locaux. Une fonction analytique est conforme en tout point o elle a une driv
non nul. Inversement, toute transformation conforme d'une variable complexe qui
a des drives partielles continues est analytique[24].
Ce synthtiseur applique
la transforme conforme aux bins issus de le FFT chainA avec des
coefficients rels et imaginaires donns comme argument lUgen. Cette
transformation spectrale au signal dentre, donne comme rsultat un signal
fourni de perturbations sonores remplissant le haut du spectre,
perceptivement je dirai que il sagit dun effet de clochettes qui se ajoutent
au son du dpart.
SynthDef(\complexattack,{|inBus=26,gate=1,wet=1,vol=1,real=0.5,img=0.5,
out1=20,out2=21,out3=22,out4=23,out5=24,out6=25,out7=26,out8=27,
out9=28,out10=29,out11=30,out12=31,out13=32,out14=33,out15=34,
amp1=0,amp2=0,amp3=0,amp4=0,amp5=0,amp6=0,amp7=0,amp8=0,amp9=0,amp10=0,amp11=0,amp12=0,amp13=0,amp14=0,amp15=0|
var in,sig,chain,chainA,chainB,imp,delimp,env;
var ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,ch13,ch14,ch15;
in = InFeedback.ar(inBus);
imp = Impulse.kr(10);
delimp = Delay1.kr(imp);
env = Linen.kr(gate,
2, 1, 4, 2);
chainA = FFT(LocalBuf(2048),in);
chainB = PV_Copy(chainA,
LocalBuf(2048));
chainA = PV_ConformalMap(chain,real,img);
chainB= PV_BinScramble(chainB,img,real,A2K.kr(Peak.ar(in,delimp)>0.5));
chain = PV_Add(chainA,
chainB);
sig = IFFT(chain)*vol;
sig = LeakDC.ar(sig);
sig = (in * (1 - (wet*env))) + (sig * (wet*env));
SendReply.kr(imp, 'levels',[Amplitude.kr(sig),
K2A.ar(Peak.ar(sig,
delimp).lag(0, 3))]);
sig =
[sig*amp1,sig*amp2,sig*amp3,sig*amp4,sig*amp5,sig*amp6,sig*amp7,
sig*amp8,sig*amp9,sig*amp10,sig*amp11,sig*amp12,sig*amp13,sig*amp14,
sig*amp15];
#ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,ch13,ch14,ch15
=
DistributedOut.ar([out1,out2,out3,out4,out5,out6,out7,out8,out9,out10,
out11,out12,out13,out14,out15],sig);
}).writeDefFile(SynthDef.synthDefDir)
Comme on peut le voir dans le code
au-dessus, un deuxime traitement est ralis en parallle, il sagit de
bin scramble , pour ceci
il faut copier lanalyse dans un nouveau buffer chainB. Ce traitement rarrange lordre des
bins dune faon alatoire dont on peut contrler le pourcentage de distorsion,
cest dire la distance maximale de lՎloignement du point dorigine de chaque
bin. On a besoin aussi de donner un trigger
ou dclenchement pour recalculer une nouvelle disposition dans lordre des
bins, jutilise lattaque pour ceci, cest dire on dtermine le pourcentage
dalatoire puis avec chaque attaque on rorganise le spectre. Le rsultat
tant des sonorits proches de la modulation damplitude dont on dcouvre des
nouvelles versions du spectre chaque attaque.
Finalement une troisime Class ralise
laddition de signaux dans le domaine frquentiel de la faon suivante :
Rel A + Rel B, Imaginaire A + Imaginaire B.
En suite pour revenir dans le domaine
temporel linverse de FFT (IFFT) est ncessaire.
Figure
9 Application de la transforme
conforme au son1 CD plage 7
Lexemple prcdent montre 12 attaques
dont les quatre premires sont le son source sans traitement. Les quatre
suivantes montrent une rorganisation alatoire des bins frquentielles et les
quatre dernires sont les processus de conformal
map, et on voit comme le spectre est sombr par un bruit de fond trs riche
en frquences et le Bin Scrumble est une redistribution de lՎnergie
dans les composantes spectrales donnant ainsi une inharmonicit similaire
celle produit par la modulation damplitude.
Le traitement mis en place par ce
synthtiseur permet de colorer le spectre en le rendant plus sombre par le
bruit et en altrant lordre et le poids dans les composantes spectrales ;
le contrle de celui-ci est assur par deux arguments real,img dont les
valeurs normalises entre 0 et 1 affectent paralllement les deux procds
dcrits plus haut.
Toujours dans le
domaine de lanalyse FFT, je propose un autre traitement, assez connu
dailleurs dans le monde du traitement du signal : le freezer . Ce traitement gle les magnitudes de lanalyse
un moment donn ainsi nous avons en sortie le spectre instantan du son
dentre qui se conserve de faon continu jusquՈ ce quun nouveau
dclenchement vienne modifier le point de lecture.
Pour implmenter
cette technique, jutilise une architecture en deux niveaux, avant tout il faut
crer les buffers pour lanalyse, le traitement et la lecture, la ligne de code
pour ceci est :
server.sendMsg(\b_alloc,24,1024,1,("buffer
freezer loaded".postln));
server.sendMsg(\b_alloc,25,1024,1,("buffer2
freezer loaded".postln));
server.sendMsg(\b_alloc,26,
(2.calcPVRecSize(1024,0.25)),1,("buffer3
freezer loaded".postln));
La taille des deux
premiers buffers tant fixe 1024 puis pour le troisime une mthode
implmente par Joshua Parmenter (Washington University) calcPVRecSize permet de calculer la taille ncessaire du buffer o seront
enregistres les donns de lanalyse.
Cest aussi lui
que lon doit plusieurs implmentations des procds, calculs et traitement
dans le domaine de lanalyse spectrale et la synthse granulaire.
Un synthtiseur
est programm pour enregistr les donns FFT de la faon suivante :
// PV_recorder
SynthDef(\pvrec, { |inBus = 27, bufnum=24, recBuf=26|
var in, chain;
in
= InFeedback.ar(inBus);
chain
= FFT(bufnum, in, 0.25, 1);
chain
= PV_RecordBuf(chain, recBuf, 0, 1, 1, 0.25,
1);
}).writeDefFile(SynthDef.synthDefDir);
Puis le lecteur et le freezer lissant les donnes crites, ce synthtiseur comporte
notamment deux arguments : rate pour contrler la vitesse de lecture
donc sans modifier les contenus frquentiels, et un trigger qui
permettra de dclencher le moment o on voudra geler le spectre.
Le dclenchement a lieu chaque fois
quune valeur suprieure un seuil dtermin est reue. Par dfaut 0.
// Freezer
SynthDef(\freezer, {|gate=1,rate=1,vol=1,trigger=1,buf=25,recBuf=26,
out1=20,out2=21,out3=22,out4=23,out5=24,out6=25,out7=26,out8=27,
out9=28,out10=29,out11=30,out12=31,out13=32,out14=33,out15=34,
amp1=0,amp2=0,amp3=0,amp4=0,amp5=0,amp6=0,amp7=0,amp8=0,amp9=0,amp10=0,amp11=0,amp12=0,amp13=0,amp14=0,amp15=0|
var sig,chain,imp,delimp,env;
var
ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,ch13,ch14,ch15;
imp = Impulse.kr(10);
delimp = Delay1.kr(imp);
env = Linen.kr(gate,
2, 1, 4, 2);
chain = PV_PlayBuf(buf,
recBuf, rate.linexp(0,1,0.001,10), 0, 1);
chain = PV_Freeze(chain,
trigger );
sig = IFFT(chain);
sig = (Limiter.ar(LeakDC.ar(sig),1,0.01)*vol)*env;
SendReply.kr(imp, 'levels',
[Amplitude.kr(sig), K2A.ar(Peak.ar(sig, delimp).lag(0, 3))]);
sig = [sig*amp1,sig*amp2,sig*amp3,sig*amp4,sig*amp5,sig*amp6,sig*amp7,
sig*amp8,sig*amp9,sig*amp10,sig*amp11,sig*amp12,sig*amp13,sig*amp14,
sig*amp15];
#ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,ch13,ch14,ch15
=
DistributedOut.ar([out1,out2,out3,out4,out5,out6,out7,out8,out9,out10,out11,out12,out13,out14,out15],sig);
}).writeDefFile(SynthDef.synthDefDir);
Figure 10 Effet
de freezer, spectre gel CD plage 8
Cet exemple montre
le son1 lu avec un facteur de ralentissement de 2% puis son spectre gel deux
instants diffrents. On voit clairement comme le spectre est conserv tout au
long du traitement.
Les mthodes de
granulation du signal consistent produire des textures sonores en manipulant
des grains de son, par transposition, dilatation et compression temporelle,
entre autres.
Les grains sont
produits en multipliant chantillons sonores, typiquement dune dure entre 10
et 50 millisecondes par une enveloppe de la mme longueur. Les densits
typiques de grain varient au tour de plusieurs centaines de grains par seconde,
o le grain lui-mme peut tre gnr partir d'une forme d'onde obtenue par
synthse additive ou par synthse FM ou extraite d'un fichier audio, ou bien
dun signal dentre directe. [25]
Le grain constitue
une entit sonore atomique . Dans ce sens, beaucoup des crits sur la
synthse granulaire font rfrence Denis Gabor, qui voque en premier lide
dun quantum acoustique .
Effectivement, Gabor
a fait une critique de la notion drive de Helmholtz selon laquelle lՎcoute
subjective tait mieux reprsente par lanalyse de Fourier.
Quest ce quon coute? Selon les thories de Ohm et de Helmholtz,
loue analyse le son en le dcomposant en forme de spectre, et nos sensations
se produisent partir de la valeur absolue des composantes du spectre
(composantes de Fourier). Mais lanalyse de Fourier est une description qui ne
tient pas compte du facteur temps, et qui considre les composantes spectrales
comme des ondes priodiques sinusodes exactes de dure infinie. Or, notre
exprience la plus lmentaire est que le son est constitu autant par un motif
temporel que par un motif de frquence. La dualit de nos sensations ne
sexprime pas seulement dans la description du son comme un signal en fonction
du temps s(t), ni dans sa reprsentation par composantes de Fourier S(f). Par
consquence, une description mathmatique qui tient compte de cette dualit est
ncessaire .[26]
Cest dans les
crits de Gabor quon trouve pour la premire fois une description la fois
mathmatique et acoustique dune particule sonore. On peut facilement
saisir l'intrt de Gabor de dmontrer sa thorie sur les quanta acoustiques, autant
dans une perspective mathmatique que dans une perspective de la perception
auditive.
Cette nouvelle
thorie de la reprsentation sonore est base sur la thorie quantique de Planck et sur la
thorie de l'incertitude de Heisenberg.
Cette technique a
besoin dun nombre important des variables lesquelles dpendent de chaque
ralisation informatique, parmi les plus courantes :
Type de fentre
– forme donde de lenveloppe de fentrage
Taille de la
fentre – dure du grain (de 1 100 ms habituellement)
Largeur de bande des
grains (nuages cumulus -
basses frquences - et stratus -
hautes frquences)
Distance
temporelle de fentrage
Densit
Enveloppe
dynamique de la masse sonore
Variation frquentielle de la masse sonore
Regardons
aussi par exemple les variables du programme granule dvelopp par Allan Lee (Belfast 1996), inspir des
travaux de Barry Truax et Curtis Roads[27]
et crit en Csound :
xamp - amplitude
ivoice - nombre de voix
iratio - rapport entre la vitesse du pointeur gskip et
le taux d'chantillonnage du signal audio de sortie (ex : 0.5 sera la moiti de
sr).
imode - le pointeur de grain se dplace : +1 : avant
, -1 : arrire, 0 : hasard.
ithd - seuil (threshold)
tel que si le signal chantillonn est plus petit que ithd, il est pass
par le pointeur (cela permet d'viter les silences entre les mots d'une phrase
par exemple).
ifn - numro de la table de fonction pour la source
sonore
ipshift - contrle de la transposition (pitch shift).
igskip - nombre de secondes partir duquel la table
contenant la source est lue (permet de passer un silence au dbut du fichier
par exemple).
igskip_os - variation alatoire du
pointeur gskip (0 = pas d'offset).
ilength - longueur de la table utiliser partir
de igskip en secondes.
kgap - dlai entre les grains en secondes
igap_os - amplitude de la variation alatoire du dlai
entre les grains en % de la dure du dlai (0 = pas de variation).
kgsize - dure des grains en secondes
igsize_os - amplitude de la variation alatoire de la
dure des grains en % (0 = pas de variation).
iatt - attaque de l'enveloppe des grains en % de leur
dure
idec - attnuation de l'enveloppe des grains en % de
leur dure
[iseed] -optionnel, point de dpart pour le gnrateur
de nombres alatoires
[ipitch1], [ipitch2], [ipitch3], [ipitch4] - optionnel,
paramtres de transposition
[ifnenv] - optionnel - numro de la table fonction pour
l'enveloppe des grains
En
SuperCollider, plusieurs classes sur la synthse granulaire ont t crites, les
oprations dՎchantillonnage et les fonctions de fentrage peuvent tre ralises
directement avec des classes basiques comme PlayBuf, BufRd, EnvGen, ou bien avec dautres classes et UGens spcialement conus
pour les oprations de granulation Warp1, Tgrains, GrainBuf. Jai ralis plusieurs exprimentations
avec chacune de ces classes, car une de mes plus grandes inquitudes a t
dՎcrire un synthtiseur qui puisse traiter la fois une entre analogique et
des fichiers.
Bien que
chaque implmentation comporte de trs intressantes qualits comme la
possibilit de fournir son propre enveloppe, contrle du taux de recouvrement des fentres, damplitude globale, de position
spatiale, elles sont spcialises dans le traitement dun fichier ou dans le
traitement dun signal dentre, donc ma solution a t de programmer un tage
suprieur o le signal dentre est rout par un bus et stock de faon continue,
(en boucle) dans un buffer et sur ce buffer on ralise la granulation.
//Granulator Warp1
SynthDef(\granulator,{|inBus=28,gate=1,buf=23,rate=0.2,pitchdepth=0.6,density=0.3,duration=0.4,posrate=1,posdisp=0,wet=1,grainslevel=0.7,
out1=20,out2=21,out3=22,out4=23,out5=24,out6=25,out7=26,out8=27,
out9=28,out10=29,out11=30,out12=31,out13=32,out14=33,out15=34,
amp1=0,amp2=0,amp3=0,amp4=0,amp5=0,amp6=0,amp7=0,amp8=0,amp9=0,amp10=0,amp11=0,amp12=0,amp13=0,amp14=0,amp15=0|
var sig,in,grains,env,imp,delimp, envin = Linen.kr(gate,0.5,1,1,2);
var
ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,ch13,ch14,ch15;
var
pointer,ratepointer,freq,ratefreq,overlaps;
in = InFeedback.ar(inBus)*envin;
RecordBuf.ar(in,buf,0,1,1,loop:1);
env = Linen.kr(gate,
2, 1, 4, 2);
ratepointer = posrate.linlin(0,1,0.01,10);
ratefreq
= rate.linlin(0,1,1,100);
overlaps
= density.linlin(0,1,1,10);
pointer=
LFNoise1.ar(ratepointer).range(0,posdisp);
freq=
LFNoise1.ar(ratefreq).range(0,pitchdepth.linlin(0,1,0,2));
grains = Warp1.ar(1,buf,pointer,freq,duration,-1,overlaps,0,2);
sig = (in * (1 - wet)) + (grains * wet);
sig = Limiter.ar(LeakDC.ar(sig),1,0.01)*env*grainslevel;
imp = Impulse.kr(10);
delimp = Delay1.kr(imp);
SendReply.kr(imp, 'levels',
[Amplitude.kr(sig), K2A.ar(Peak.ar(sig, delimp).lag(0, 3))]);
sig
=[sig*amp1,sig*amp2,sig*amp3,sig*amp4,sig*amp5,sig*amp6,sig*amp7,
sig*amp8,sig*amp9,sig*amp10,sig*amp11,sig*amp12,sig*amp13,sig*amp14,
sig*amp15];
#ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,ch13,ch14,ch15
=
DistributedOut.ar([out1,out2,out3,out4,out5,out6,out7,out8,out9,out10,
out11,out12,out13,out14,out15],sig);
}).writeDefFile(SynthDef.synthDefDir) );
Jai donc
choisi de travailler dans deux synthtiseurs autour des classes Warp1 et PitchShift dans lexemple prcdent deux oscillateurs produisent des
nombres alatoires LFNoise1 contrlent la position de lecture dans le buffer et le
dcalage frquentiel global. son tour lamplitude et la frquence doscillations
de ces deux oscillateurs sont contrls par deux variables posrate et rate pour les
frquences ou quantit des nombres par unit de temps et posdisp et pitchdepth pour
lamplitude. Les autres paramtres de contrle tant la duration de chaque
grain exprim en millisecondes et le taux de recouvrement traduit pour la
densit ou la quantit de grains par seconde.
// PitchShifter
SynthDef(\pitchShifter,{|inBus=21,vol=1,wet=1,gate=1,grainsize=0.5,
pitchrate=1, pitchdisp=0.1,timedisp=0.4,
out1=20,out2=21,out3=22,out4=23,out5=24,out6=25,out7=26,out8=27,
out9=28,out10=29,out11=30,out12=31,out13=32,out14=33,out15=34,
amp1=0,amp2=0,amp3=0,amp4=0,amp5=0,amp6=0,amp7=0,amp8=0,amp9=0,amp10=0,amp11=0,amp12=0,amp13=0,amp14=0,amp15=0|
var in,sig,imp,delimp,env,ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,
ch11,ch12,ch13,ch14,ch15;
imp = Impulse.kr(10);
delimp = Delay1.kr(imp);
in = InFeedback.ar(inBus);
env = Linen.kr(gate,
1, 1, 1, 2);
sig = PitchShift.ar(in,
grainsize, pitchrate,pitchdisp,timedisp)*env; sig = (in * (1 - wet)) + (sig *
wet);
sig = Limiter.ar(LeakDC.ar(sig),1,0.01)*vol;
SendReply.kr(imp, 'levels',
[Amplitude.kr(sig), K2A.ar(Peak.ar(sig, delimp).lag(0, 3))]);
sig = [sig*amp1,sig*amp2,sig*amp3,sig*amp4,sig*amp5,sig*amp6,sig*amp7,
sig*amp8,sig*amp9,sig*amp10,sig*amp11,sig*amp12,sig*amp13,sig*amp14,
sig*amp15];
#ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12,ch13,ch14,ch15
=
DistributedOut.ar([out1,out2,out3,out4,out5,out6,out7,out8,out9,out10,
out11,out12,out13,out14,out15],sig);
}).writeDefFile(SynthDef.synthDefDir) );
Dans ce
deuxime synthtiseur, la classe PitchShift ralise les oprations de granulation avec une fentre
glissante (triangulaire et avec un taux fixe de recouvrement de 4 :1) sur
le signal dentre les paramtres sont contrls par des variables directs
(sans oscillateur) et sont :
windowSize la taille de
chaque grain
pitchRatio un facteur de 0 4 pour la dviation frquentielle globale
pitchDispersion un facteur de range alatoire du pitchRatio
timeDispersion un facteur alatoire pour le retard de grains.
Comme je
lai remarqu plus haut la matire premire sur laquelle on ralise le fentrage
et les oprations de retard, transposition peut tre issue dun procd de
synthse ou dun fichier son. Ainsi certains chercheurs comme Monsieur Olivier
Blanger dans son cours dՎlectroacoustique luniversit de Montral[28],
considrent cette distinction base sur la nature de la matire sonore. Dautres comme Nathan Edwin Wolek
luniversit dIllinois ont travaill largement sur les consquences perceptives
de la granulation, ainsi apparat un vecteur de mtamorphose du signal
dorigine allant du traitement la synthse[29].
Sujet
passionnant, la synthse granulaire a inspir chercheurs, compositeurs,
musiciens et ingnieurs autour du globe et plusieurs branches de la pense ont
t explores, traitant ainsi des rapports avec la philosophie, la physique et
lesthtique, mettant un contraste les thories corpusculaires et les thories
laminaires de la matire[30].
En ce qui
concerne mon travail, je me suis concentr dans lՎcriture dun outil
informatique qui permet de jouer aisment dans un contexte dimprovisation dont
les issues et le champ dinvestigation de ce domaine dpassent les bornes que
je me suis donn au dpart.
Sur le
contrle de la granulation, un chapitre trs dtaill a t crit par Manuel
Rocha Iturbide[31], traitant
dautomatismes, gestes, contrle stochastique, chaotique dterminisme et
indterminisme. Donc un document trs riche que propose plusieurs champs de
recherche possibles sur la question : comment jouer de ces algorithmes ?
En
situation de jeu, o une ractivit trs dveloppe est ncessaire pour se fondre,
sopposer ou proposer des ides musicales un groupe des musiciens y compris
avec dinstruments acoustiques ou mme en solo, la quantit hallucinante de
paramtres et de variables ne peuvent quՐtre groupe pour permettre un
contrle multiparamtrique tout en gardant la possibilit dune complexit ou
dune simplicit dans la faon dՎnoncer et dexprimer la pense musicale. Bien
quil pourrait paratre rducteur de voir dans la granulation un module de plus
dans une chane de traitement et de synthse o une prolifration importante de
variables est dj en jeu, je ne pouvais pas me passer de placer cette couleur
dans la palette de mes espaces composables et jai beaucoup appris des concepts
issus de cette technique pour diriger ou participer dans des groupes
dimprovisation, ainsi la densit ou nombre dՎvnements par unit de temps,
lallure dynamique, les trajectoires frquentielles sont des concepts trs
prgnants et saisissables pour tous les musiciens.
Passons maintenant
un point trs dlicat dans larchitecture de tout programme proposant une connectivit
possible entre sources et traitement audio, lacheminement ou mapping de signaux[32].
Ceci est tellement important quon pourrait prsenter les deux programmes
dcrits dans cette mmoire comme deux matrices de contrle et de signal.
Effectivement, le
paradigme sous-jacent dans mon travail est celui de la cration sonore par
combinaison, cest--dire avoir porte de main des fichiers sons de modules
de synthse, dentres analogiques, de traitements et puis des outils de contrle pour construire et jouer spontanment
darborescences de synthse.
Tel a t aussi
mon parti pris quand jai choisi le chemin oppos la programmation base sur
des modles dapprentissage. Je voulais tre le dernier prendre des dcisions
sur le rsultat sonore, je voulais tre conscient de la chaine de synthse et y
dfinir les stratgies de connexion puis avoir une incidence directe sur les
paramtres de synthse. Bref, une approche plus de musicien interprte que de
scientifique, cest--dire pouvoir interagir avec le son dans une boucle
perceptive et non dune faon o lon pose des hypothses et on observe le
processus et le rsultat.
Cette
matrice elle peut tre abstraite ou graphique. Par exemple dans le logiciel IXIQuarksPro
crit en SuperCollider par le collective IXISoftware[33],
la matrice est abstraite, chaque module (instruments, effets, filtres) comporte
un menu o on peut diriger le signal vers de buses monophoniques ou coupls en
stro et aussi, naturellement, un menu (quand cest le cas) pour les buses
dentre.
Donc la
visualisation des enchanements et de larborescence de synthse nest pas
explicite mais se rfre chaque module. Il faut ce point se souvenir de
lattention quil faut prter en SuperCollider lordre des nuds de synthse
et le moment o ils arrivent, point que jai expliqu plus haut.
Pour
manier ceci, les auteurs ont ajout chaque module un menu avec les options
pour dplacer les nuds de synthse la tte, la queue avant ou aprs un
groupe de synthtiseurs et un target ou
nud cible comme point de rfrence.
Si on
ajoute ces deux facteurs : 52 buses audio et la logique (facile mais
dlicat) dans lordre de larbre de synthse le mapping en cours de jeu demande beaucoup de concentration,
toutefois la sauvegarde de configurations est possible et permet de prparer et
naviguer entre constructions rflchies et tudies lavance. La solution de
connectique par buses dont on na pas un feedback visuel a lavantage de
permettre un nombre lev de connexions possibles qui seraient autrement
difficiles reprsenter dans une interface graphique, et donc aussi avoir un
grand nombre de modules et de versions diffrentes.
Ici, une capture dՎcran de linterface graphique dun
module de rverbration sur IXIQuarks Pro, pour illustrer les options menus
pour les buses dentre et sortie du traitement, puis le menu contextuel pour
dplacer le traitement au long de la chaine de synthse.
Une autre
solution peut tre illustre par le travail de Jean Lochard (IRCAM 2009) qui a
dvelopp une application pour MaxMsp
: Najo Max Interface dont les configurations sont sauvegardes comme projets et
la logique de construction obit celle de la programmation en MaxMsp, cest dire une connectique entre
objets graphiques puis une table de mixage graphique avec 8 canaux dentre et
8 canaux de sortie. Linterface graphique est divise en deux, une partie
rserve lՎdition du patch et une deuxime au contrle.
Le
caractre trs attractif de linterface graphique pour chaque module qui peut
sՎditer et contrler les paramtres avec des courbes dont on peut varier la
forme et la vitesse de lecture, disparat quand le patch devient complexe et la
limite de place apparat, donc on revient sur les encapsulations dans des
sub-patchers propres maxMSP.
Toutefois lanalogie avec une table de mixage est une ide intressante et
facilite laccs ceux qui sont un peu familiariss avec la programmation
graphique.
Inspir de
lobjet matrixctrl de MaxMsp, je lai implment sur
SuperCollider, le principe est celui dans Switch qui permet de diriger les
signaux vers des ports dans un systme de coordonnes cartsiennes. Cet objet
graphique a lintrt de permettre une rapide visualisation du mapping, mais loppos des exemples
prsents plus haut le nombre de modules est limit car on doit fixer la
quantit dentres et de sorties pour la matrice et pour les synthtiseurs, car
comme je lai montr dans chaque synthtiseur dcrit plus haut, le nombre de
sorties est gr par la classe DistributedOut
(ralisation personnelle) qui permet de slectionner des canaux de sortie non
conjoints avec un contrle indpendant de lamplitude.
Avant de
continuer dans la description de cette matrice labor en SuperCollider je
voudrais signaler le travail de Tom Mays qui a developp une application
Tapemovie sur MaxMsp
qui accepte au moment de la cration et de la configuration du projet de
dfinir le nombre des modules audio, traitement, contrle, et un script
construit la matrice avec le nombre correct de sorties et dentres en plus
dun contrle de niveau chaque point de celle-ci.
De cette
faon il a contourn les deux problmes que jai remarqus plus haut, un retour
visuel pour comprendre les enchainements des signaux et une matrice qui sadapte
un nombre variable de modules.
Voici
quoi ressemble linterface graphique de la matrice en Jabalion.
Regardant
maintenant le code de plus prs, expliqu pas pas.
Matrix {
var matrixwindow,backgroundmatrix,xpos=6,ypos=640,but,bat,bot,<>clear;
var <>rows=10,<>columns=10, rowstexts,columntexts,cordonates,function;
var fmatrixint;
*new { |columns,rows,xpos,ypos,function|
^super.new.initMatrixClass(columns,rows,xpos,ypos,function)
}
initMatrixClass {|argcolumns,argrows,argxpos,argypos,argfunction|
columns
= argcolumns;
rows
= argrows;
xpos
= argxpos;
ypos
= argypos;
function
= argfunction;
this.gui; cordonates = []
}
Tout dabord la classe se dfinit comme une
fonction suivie par ces variables, les signes < > dterminent si la
variable est accessible depuis lextrieur (il sagit dun raccourci pour les
mthodes set et get), dans lordre, ces variables sont : la fentre o tout
sera plac, une sub-classe (background) pour placer la grille, la position dans
lՎcran dans les axes x et y, trois vecteurs de buttons pour sa manipulation et
cration, le bouton pour nettoyer ou enlever tous les connexions, le nombre de
rangs ou lignes et le nombre de colonnes, deux variables pour traiter le nom
associs chaque rang et chaque colonne, cordonates est un
vecteur pour traiter la fonction value, function est la
fonction qui sera assigne chaque connexion, finalement une fonction
dinitialisation.
La mthode *new
retourne un nouveau objet daprs cette classe, (*indique un mthode de
classe), ses arguments sont : nombre de colonnes, nombre des rangs,
position x et y dans lՎcran, fonction.
^super.new.initMatrixClass est
la faon de passer des arguments pour la cration dune nouvelle instance ou cas.
initMatrixClass est la
fonction avec lordre des arguments et actions raliser quand
on cre lobjet, ici jinitialise la variable cordonates comme un
vecteur sans taille fixe, et this.gui appelle la mthode gui (dcrite ci-dessous) pour
construire linterface graphique.
gui
{
// La fentre principale, remarquer comment la quantit des
rangs et de //colonnes modifient la taille
matrixwindow = GUI.window.new("matrix",
Rect(xpos,ypos, (25*rows+90),
(25*columns+70)),resizable:false);
matrixwindow.view.background = Color.white;
// Le fond
backgroundmatrix = CompositeView(matrixwindow,
Rect(5,5,(25*rows+80), (25*columns+60))) .background_(Color.grey.alpha_(0.3));
// Dessiner la grille
GUI.userView(backgroundmatrix,Rect(0,0,(25*rows+80),(25*columns+60)))
.drawFunc
= {Pen.strokeColor = Color.black(0.2);
columns.do({|i|
Pen.moveTo(60@(25*i+75));
Pen.lineTo((25*rows+70)@(25*i+75));
Pen.stroke});
rows.do({|i|
Pen.moveTo((25*i+75)@60);
Pen.lineTo((25*i+75)@(25*columns+70));
Pen.stroke});};
// Composer une tablete pour reprer la position de la souris et
ainsi // rendre visibles les boutons (voir au dessous)
GUI.tabletView(backgroundmatrix,Rect(0,0,(25*rows+80),(25*columns+60)))
.mouseDownAction
= {|view,x,y|var bat,z; bat=but.clump(rows);
rows.do({|j|
columns.do({|i|
if((x
> (60+(j*25)))
&&
(x < (80+(j*25)))
&&
(y > (60+(i*25)))
&&
(y < (80+(i*25))),
{bat[i][j].visible_(true);
bat[i][j].valueAction_(1)});});});
//ici cest une routine pour placer les nouveaux synths dans le
bon //ordre pour SuperCollider et si la fentre daffichage de larbre de
//synthse est ouverte lactualiser
r{0.5.wait;
if(~values.ids[this.value[1]-1] != 0)
{Server.local.sendMsg(\n_before,
(1300+(this.value[0]-7)),(1300+(this.value[1]-1)))};
Window.allWindows.do({|i|if (i.name == "localhost Node Tree"){ r{i.close;0.1.wait;Server.local.plotTree}.play(AppClock)}});
}.play(AppClock)};
// Crations des buttons, ils sont invisibles, jusquau quon
click
// dessus, laction excuter est celle passe comme argument
lors de // la cration de linitialisation de la classe
bot = Array.newClear(columns);
but = List.new;
rowstexts = Array.newClear(columns);
columntexts = Array.newClear(rows);
columns.do({|i|
rows.do({|j|
bot[i] = GUI.button.new(backgroundmatrix,
Rect(70+(j*25),70+(i*25), 10,
10)).canFocus_(false);
bot[i].states_([["",nil,Color.grey.alpha_(0.3)],
["",nil,Color.red]]);
bot[i].visible_(false);
bot[i].action_({|but| this.fmatrixint(j,i,but.value);
function.value;
if(but.value
== 0) {bat[i][j].visible_(false)}
{bat[i][j].visible_(true)}});
but.add(bot[i]);});});
// donner un nom chaque colonne et chaque rang
columns.do({|i|
rowstexts[i]
= GUI.staticText.new(backgroundmatrix,
Rect(4,65+(i*25), 80, 20))
.string_("output " ++ (i+1)).font_(Font(\Monaco,10))
.stringColor_(Color.black(0.8,0.4));});
rows.do({|i|
columntexts[i]
= GUI.staticText.new(backgroundmatrix,
Rect(75+(i*25),-40, 9, 100))
.string_("In "++ (i+1)).font_(Font(\Monaco,10))
.stringColor_(Color.black(0.8,0.4));});
// Le bouton pour effacer les connexions
clear = GUI.button.new(matrixwindow,Rect(10,10,35,20)).canFocus_(false)
.states_([["clear",Color.black,Color.blue(0.8,0.4)]])
.font_(Font(\Times,10))
.action_({(but.size).do({|i| but[i].valueAction_(0);
but[i].visible_(false)});cordonates = [];
// Un test pour actualiser la fentre daffichage de larbre de
//synthse si ouverte
Window.allWindows.do({|i|if (i.name == "localhost Node Tree"){
r{i.close;0.5.wait;Server.local.plotTree}.play(AppClock)}});
});
}
partir dici les mthodes
auxquelles lobjet matrix va rpondre
//Retourne le rang, la colonne et la valeur du dernier bouton.
value {
^cordonates;}
// Commande pour tablir de connexions et les afficher sur
linterface
valueAction_ {|j,i,k|
bat=but.clump(rows);
if
(k==1)
{bat[i][j].visible_(true)}{bat[i][j].visible_(false)};
bat[i][j].valueAction_(k)}
// Retourne tous les valeurs de la matrice chaque point
dump {var dump = [];
bat=but.clump(rows);
rows.do({|j|columns.do({|i|dump=dump.add(bat[i][j].value)})});
dump
= dump.clump(columns);
^dump;}
// Retourne les valeurs dun rang
getRow {|n| var dump = [];
rows.do({|j|columns.do({|i|dump=dump.add(bat[i][j].value)})});
dump
= dump.clump(rows);
^dump[n];
}
// Retourne les valeurs dune colonne
getColumn {|n| var dump = [];
rows.do({|j|columns.do({|i|dump=dump.add(bat[i][j].value)})});
dump
= dump.clump(columns);
^dump[n];
}
//Retourne une liste avec tous les coordonnes et sa valeur 1
active 0 //inactive
dumpAll {var dump = [],result=[],out=[];
(columns*rows).do({|i|dump =
dump.add(but[i].value)});
dump=dump.clump(columns);
columns.do({|i|rows.do({|j|result=result.add([i,j])})});
(columns*rows).do({|i|
out=out.add(result[i].add(dump[i]))});
^out;
}
// Retourne la sum dune colonne
integrateColonne_ {|n|
var z =[];
bat=but.clump(rows);
columns.do({|i| z =
z.add(bat[i][n].value)});
^z.sum
}
// Commande pour changer les textes sur chaque rang
setRowText_ {|j,text|
rowstexts[j].string_(text);
matrixwindow.refresh;
}
// Commande pour changer les textes sur chaque colonne
setColumnText_ {|j,text|
columntexts[j].string_(text);
matrixwindow.refresh;
}
// Rendre visible/invisible la fentre principale
front_ {|val|
if (val == true) {matrixwindow.visible_(true)}
{matrixwindow.visible_(false)}
}
// Changer le nom de la matrice
name_ {|newname|
matrixwindow.name_(newname)
}
// Methode pour permettre ou empcher la fermeture de la fentre
canClose_ {|bol|
if
(bol == true) {matrixwindow.userCanClose_(true)}
{matrixwindow.userCanClose_(false)}
}
// Commande pour ajouter une nouvelle action aux boutons
newAction_ {|func|
(columns*rows).do({|i|but[i].mouseDownAction_(func)})
}
Celle-ci est la fonction
passe pour lactivation / dsactivation des sorties sur chaque synthtiseur.
fmatrixpros = {
var id,cor,dump;
cor=~values.matrixprocessing.value;
dump=~values.matrixprocessing.dump;
~values.put('matrixout',dump);
j=cor[0];i=cor[1];k=cor[2];
if ((j == 0) &&
(~values.matrixprocessing.integrateColonne_(0) >= 1) && ((~values.newidadc[0]
== 0)||(~values.newidadc[0] == nil)))
{~values.adc.play[0].valueAction_(1);
server.sendMsg(\n_set,1198,("amp"++
(i+1)).asSymbol,k)};
if ((j == 0) &&
(~values.matrixprocessing.integrateColonne_(0) == 0) &&
(~values.newidadc[0]
== 1198))
{~values.adc.play[0].valueAction_(0)};
if (j == 0) {id = 1198; if
(~values.newidadc[0] != nil)
{if(~values.newidadc[0]
== id)
{server.sendMsg(\n_set,id,("amp"++
(i+1)).asSymbol,k)}}};
Il sagit dun test en trois
tages j tant la valeur de la colonne ~values.matrixprocessing.integrateColonne_(0)
teste si la colonne a ete activ ou dsactive et ~values.newidadc[0]
test si le synthtiseur est en train de jouer dj.
Cette opration sapplique
chaque colonne et respectivement chaque synthtiseur, une suite de test
logique de ce type sappele case ,
donc la fonction pour cette matrice calcule un case 19 possibilits.
Une deuxime matrice est
utilise pour le mapping octophonique
de sorties. Cest une avantage de la programmation pour objets une fois le
modle crit on peut reconstruire autant de versions de lobjet quon veut.
Pour le cheminement des
signaux audio, cette matrice savre un outil efficace, bien que ses limites soient
durement surmontables car le fait dajouter un module de plus de synthse ou de
traitement quivaut remanier le code dans plusieurs endroits ; mais,
quel instrument ne connat pas de limites ?
Dans la section
prcdente jai touch un point cl dans la programmation dun logiciel, celui
de linterface graphique. Effectivement, le retour visuel pour piloter,
modifier, ou interagir avec le logiciel et ses fonctions peut tre un critre
de jugement sur la praticit ou jouabilit de chaque programme. Toutefois les
gots individuels peuvent tre contrasts et personne na le dernier mot ce
sujet.
Par exemple,
personnellement je considre que sagissant des applications audio le focus
devrait tre port sur les oprations sonores et linterface graphique devrait
tre le plus simple possible, mais pas inexistante videmment, car on doit
pouvoir retrouver facilement certaines informations sur lactivit, les envois,
les rponses, les niveaux et les cheminements des signaux.
Si je peux me
permettre un dtour par mon vcu et mes apprciations personnelles, par ma
formation comme instrumentiste, jadore jouer avec les yeux ferms, a me
permet de mieux me concentrer et de rver ou de construire un imaginaire trs
subjectif en jouant, je donne beaucoup dimportance au dveloppement de la
proprioception. Cet amour pour lobscurit ncessaire lՎcoute ma pos
certains problmes en concert. Par exemple jabandonne progressivement
lutilisation des capteurs ou interfaces qui demandent une attention visuelle
trop importante (photosensors, camras),
Mon opinion est celle dun
interprte et pas celle dun analyste, chercheur ou musicologue pour qui le processus
de visualisation prend une toute autre dimension avec des intrts profonds sur
la physiologie et la perception. Tel que la trs bien montr Mme Anne Sedes[34]
avec son groupe de recherche sur la visualisation et mulation artistique et la
reprsentation scientifique du son, la maison des Sciences de l'Homme Paris
Nord.
Mis part le got personnel
pour des interfaces embellies, pleines de couleurs et dinformations ou des
interfaces plus sches et simples, il faut prendre en compte le fait que le cot
des processus visuels en temps rel nest pas ngligeable pour la CPU et le
processeur. Ainsi plusieurs environnements permettent de donner priorit aux
calculs des traitements sonores sacrifiant la mise jour des interfaces
graphiques qui se bloquent parfois cause du taux important de calcul quand il
sagit de synthse granulaire, analyse de Fourier, commandes de contrle, etc.
En guise dillustration du
contraste de choix de programmateurs en rapport de linterface graphique, voici
deux exemples de deux logiciels construits pour limprovisation. Le premier Omax
dvelopp par G. Assayag, G. Bloch, M. Chemillier et M. Shlomo Dubnov lՎquipe de reprsentations musicales
de lircam, 2008.
Figure
15 Intreface graphique
OMAX
La premire impression est
celle dun environnement complexe avec un cran fourni en boutons, commandes,
consoles et objets dune taille un peu rduite.
Et il est complexe, car il
utilise MaxMsp pour calculs et
dcisions rapides en temps rel communiquant avec une version de Open Music qui
tourne sur Lisp pour une analyse
et prdiction approfondie des vnements passs et/ou futurs. Le tout
communiquant par des messages OSC et tablissant un modle de squences
dՎvnements oracle pour produire une proposition qui peut se rapprocher
ou sՎloigner du style et du langage du musicien[35].
Ainsi sexplique le besoin
de deux consoles, une pour MaxMsp, lautre pour Lisp, les deux autres fentres
sont des commandes gnrales et des commandes dimprovisation, il y a aussi quelques
menus et fentres secondaires pour grer les buffers et certaines informations
dutilisation. Son usage nest pas trs intuitif mais linterface graphique
concentre le plus important pour le pilotage et laffichage des vnements
musicaux sur un cran.
En jouant en solo il faut
tre trs attentif aux rglages pour automatiser les processus et il faut
galement une coute dlicate des propositions du logiciel.
En duo le musicien au
pilotage du logiciel a un champ de libert qui permet au deuxime de se concentrer
sur son matriau. Plusieurs musiciens trs reconnus[36]
dans le monde de limprovisation ont t invits explorer le programme, leurs
retours son consultables en ligne [37],
limpression gnrale tant plutt positive.
Mon deuxime exemple est IXILang,
rcemment dvelopp dans SuperCollider par Thor Mangson luniversity of
Sussex (jai dj cit son travail avec le collective IXISoftware). Dans cette
application, aussi destine limprovisation, tout est texte : une
fentre fond noir avec les polices du texte en blanc et une fentre console cest
tout. Il faut dire que cette application ne permet pas de traiter de sons
instrumentaux jous par dautres musiciens, et elle sinscrit dans le mouvement
du live coding ou
programmation en temps rel[38].
XiiLang()
tuning
just // choose a tuning
scale
minor // set the scale
// score mlodique
jimi -> guitar[1 2
6 2 ]//
un motif de 4 notes appel jimi
jimi -> guitar[1 2
6 2 ]+12 //
jimi transpose dune octave
jimi ->
guitar[1 2 6 2
]!16 // silence de 16 notes
jimi ->
guitar[1 2 6 2
]+12!16 //
combinaison de deux
// score percussive
ringo -> |o x o x
| //les letres son mapps synthtiseurs
ringo2 -> | ii s
n |
ringo3 -> | o o d sd |!12 // silence pendant 12 pulsations
// score concrte
pierre
-> water{0 2 8 4 1 0
} // les nombres sont amplitudes
henry
-> water{0 2 8 }!14
schaeffer
-> water{0 2 8 }*4!14
Voici a quoi ressemble
lՎcran du programme (avec quelques commentaires explicatifs), les modles ou
patrons peuvent tre rythmiques, mlodiques ou avec des chantillons, en
suivant le type daccolade utilis [] , {} , || ,
lintrieur les caractres, chiffres ou lettres reprsentent notes MIDI ou
instruments ou amplitudes, les distances entre les caractres reprsentent les
dures, le nom de chaque patron permet de les grouper, les traiter avec
quelques effets, les programmer dans le futur, le faire taire, transposer,
changer le tempo.
Il est vident quici cest
presque sinon compltement impossible de jouer avec les yeux ferms, lapproche
tant compltement diffrente.
Mon approche sera donc une
interface simple. En plus de la matrice jai crit pour chaque synthtiseur une
classe qui permet de surveiller et contrler les arguments avec des
potentiomtres linaires. Tous les paramtres sont normaliss entre 0 et 1 et un
indicateur de niveau accompagne chaque synthtiseur pour tre sr quil
fonctionne correctement en envoyant du signal.
Voici par exemple une
capture dՎcran de la fentre qui regroupe trois traitements.
Cette fentre peut tre
ouverte depuis une fentre de commande qui est toujours au front du logiciel
Ou depuis
le menu bar dans le
menu principal du logiciel ou avec un raccourci clavier
Je vais
prsenter un seul exemple tir de la classe crite pour le pilotage de la
granulation mais en tout il y a 22 classes qui peuvent tre examines dans le
dossier SCClassLibrary de lapplication[39].
/* Cette premire partie comme pour la classe Matrix, est le
lieu o on dclare les variables et les fonctions dinitialisation, une
particularit ici est la possibilit dinscrire toute linterface dans une
fentre existante, autrement une nouvelle fentre est cre. Chaque slider est
un objet dont on peut demander ou saisir les valeurs depuis lextrieur, id est
la variable qui dtermine lidentifiant du synthtiseur, ici 1307, donc dans
larborescence de synthse on peut le retrouver facilement car son nom associ
sera granulator */
Granulator {
var
window,background,<bounds,<>rate,<>density,<>wet,<>grainslevel;
var
<>pitchdepth,<>posrate,<>posdisp,levelview,<>duration;
var
xpos=300,ypos=500,width= 260,heigth= 15;
var
osc1,osc2,osc3,id,granulatorId,server, c;//midicontrollers
*new
{|window,bounds|
^super.new.initGranulatorClass(window,bounds)}
initGranulatorClass
{|iwindow,ibounds|
if (ibounds == nil){bounds = Rect(10,5,290,250)}
{bounds
= ibounds};
if (iwindow == nil) {window =
GUI.window.new("Grains",Rect(xpos,ypos,300,260),resizable:false)
window.view.background_(Color.new(0.2,0.025,0.08,0.4));}
{window
= iwindow};
server
= Server.default;
id
= 1307;
if
(~values == nil) {~values = ()};
if
(~midi == nil) {~midi = ()};
c
= Array.newClear(8);this.gui;}
/* Dans la fonction interface graphique (gui) je ne montrerai
quun seul potentiomtre linaire (slider)
pour illustrer la faon dont les actions ou fonctions y sont associes. Remarquez
aussi la faon de saisir le nom du texte accompagnant le fond, car la fentre
est optionnelle */
gui {background = GUI.compositeView.new(window,bounds)
.background_(Color.grey.alpha_(0.3));
GUI.staticText.new(background,Rect(8,-70,10,220))
.string_("Grains").font_(Font(\Monaco,12));
/* celui-l est le sider associ loscillateur qui contrle
les variations du pitch dans les grains tel que dcrit plus haut */
rate = EZSlider(background,Rect(10, 10, width,
heigth),"PitchRate
",
//normalisation des valeurs
ControlSpec(0, 1, \lin, 0.01,0.2),
//fonction, message OSCpour le synthtiseur
{|ez| var val=ez.value;
server.sendMsg(\n_set,id,\rate,val)},
// valeur par dfaut
0.2,unitWidth:30, numberWidth:50,layout:\horz)
// Police et couleurs
.font_(Font("Times",10))
.setColors(Color.clear,Color.yellow, Color.grey(0.7),
Color.clear, Color.yellow, Color.yellow);
/* Avec cette fonction on peut assigner un contrleur midi quand
le slider est slectionn en appuyant la touche m, ou l pour leffacer, 66 est
le nombre de ce contrleur qui pourra tre accessible grce un dictionnaire
ou chaque paramtre de contrle pourra tre assign un contrleur midi la
main. defer est une mthode pour actualiser les objets graphiques
en utilisant lhorloge du systme, plus rapide et prcis que celui de
lapplication */
rate.sliderView.keyDownAction_(UnicodeResponder.new.normal(
$m
-> {c[0]=CCResponder({|src,chan,num,value|
{rate.sliderView.valueAction_(value/127)}.defer;
~midi.cc13071=[src,chan,num];
if
(~fsetmidimapping != nil)
{{~fsetmidimapping.(66,src,chan,num)}.defer}{}}).learn},
$l
-> {c[0].remove;~midi.cc13071=[];
if (~fsetmidimapping !=
nil)
{{~fsetmidimapping.(66,0,nil,nil)}.defer}{}}));
// Lindicateur de niveau de sortie du synthtiseur
levelview = GUI.levelIndicator.new(background,
Rect(72, 210, 116, 16))
.style_(0).warning_(0.6)
.critical_(0.9)
.canFocus_(false)}
/* Jusquici les objets graphiques ont t crs, maintenant vient
le moment de dclarer les mthodes, par exemple en appelant la mthode run_(1),
cette classe regarde la valeur de chaque slider, puis suit un test pour
vrifier sil y a des sorties dj choisies dans la matrice et elle cre un
nud de synthse, si la valeur est 0, fermer le gate du synthtiseur avec un
temps de relche de 2 secondes */
run_ {|but|
if
(but == 1) {
server.sendMsg(\s_new, \granulator, id, 1,3);
server.sendMsg(\n_set,id,\wet,wet.value,\rate,rate.value,
\density,density.value,\pitchdepth,pitchdepth.value,
\duration,duration.value,\grainslevel,grainslevel.value,
\posrate,posrate.value, \posdisp,posdisp.value);
if
(~values.matrixout != nil) {if
(~values.matrixout[14].sum
>= 1)
{this.setoutputs(~values.matrixout[14])}};
server.queryAllNodes};
if
(but == 0) {
server.sendMsg(\n_set, id,\gate, -2);
~values.granulatorId
= 0;
};}
/* Cette srie de mthodes permet de manipuler les valeurs de
chaque paramtre tout en ayant un retour graphique */
setrate_ {|val|rate.valueAction_(val)}
setpitchdepth_ {|val|pitchdepth.valueAction_(val)}
setdensity_ {|val|density.valueAction_(val)}
setduration_ {|val|duration.valueAction_(val)}
setposrate_ {|val|posrate.valueAction_(val)}
setposdisp_ {|val|posdisp.valueAction_(val)}
setwet_ {|val|wet.valueAction_(val)}
setvol_ {|val|grainslevel.valueAction_(val)}
setoutputs {|matrix|
if
(~values.granulatorId == id) {matrix.do({|item,i|
server.sendMsg(\n_set,id,("amp"++ (i+1)).asSymbol,item)})};
}
/* Voici les fonctions pour dclarer ou enlever la communication
entre le moteur de synthse et cette classe, pour rcuprer les informations de
niveau de sortie du synthtiseur, pour envoyer un message quand il dmarre,
pour stocker son identifiant et pouvoir le contrler dans la matrice, pour
envoyer un message quand le synth sarrte, et pour nettoyer les variables et
laffichage du contrle de niveau*/
fosc {osc1 = OSCresponderNode.new(server.addr,'levels',
{arg time, resp,
msg;
{if(msg[1]
== id,{
levelview.value
= msg[3].ampdb.linlin(-40, 0, 0, 1);
levelview.peakLevel
= msg[4].ampdb.linlin(-40, 0, 0, 1);
})}.defer;}).add;
osc2
= OSCpathResponder(server.addr,['/n_go',id],{|time,resp,msg|
~values.put('granulatorId',granulatorId = msg[1]);
~values.ids.put(7,msg[1])}).add;
osc3
= OSCresponderNode(server.addr,'/n_end',{arg time,resp,msg;
{if(msg[1]
== 1307,{("Granulator
" ++ "stoped").postln;
~values.ids.put(7,0);
levelview.value_(0)})}.defer}).add}
oscadd {this.fosc}
oscremove {osc1.remove;osc2.remove;osc3.remove;
^"osc Granulator removed".postln
}
/* Les quatre dernires mthodes concernent laffichage de la
fentre principale, canClose_(true/false) pour empcher lutilisateur de fermer
la fentre avec le bouton rouge en haut de chaque fentre, autrement en fermant
linterface on serait oblig dappeler nouveau la cration de la classe,
chose possible uniquement avec une ligne commande, la mthode
front_(true/false) rend la fentre visible ou invisible, bounds change la
taille et position de la fentre dans lՎcran */
canClose_ {|bol|if (bol == true) {window.userCanClose_(true)}
{window.userCanClose_(false)}}
front_ {|val|if (val == true) {window.visible_(true)}
{window.visible_(false)}}
bounds_ {|newbounds|
background.bounds_(newbounds);^window.refresh}
boundsWindow_ {|newbounds|
window.bounds_(newbounds);^window.refresh}}
Ci-contre la fentre panus . Elle permet de
spatialiser le son dans un systme octophonique. Le cercle tant juste un
repre pour visualiser la position des haut-parleurs, cest dire quils
peuvent tre disposs dans une autre configuration et en dplaant le point
vert le niveau associ chaque point rouge sera plus important. Certaines
trajectoires sont proposes dans le menu : circulaire vers la gauche,
circulaire vers la droite, croix, petit carr, grand carr, spirale depuis le
centre, spirale vers le centre et dplacements alatoires.
La variable rate permet de varier la vitesse de dplacement.
On peut
aussi enregistrer ses propres dplacements avec lobjet automator que je vais prsenter dans la section 2.6.5
Les
dplacements automatiss ont t crits comme des routines ou un compteur va de
0 360 puis cette valeur est transforme en coordonnes cartsiennes avec la
mthode point et finalement assigne au contrle bidimensionnel
(abscisses et ordonnes) de lobjet GUI.slider2D. Voici
deux exemples du code pour raliser cette opration.
/* Un test de prcaution permet dempcher de jouer plusieurs
routines la fois, puis la mthode case slectionne le type de
routine (Task) jouer en suivant la valeur choisie dans le menu */
if (task.isPlaying == true)
{"Already playing stop first to change".warn}{case
/* Dplacements vers la droite, le compteur i va
de 0 360, jajoute 90 pour commencer au point centre-haut. La division par
360*2pi ramne les valeurs lՎchelle -1 et 1, puis la mthode lilnlin
les convertit dans le rang compris par linterface graphique 0,1. La deuxime
formule inverse simplement le compteur reverseDo de faon
commencer par 360 et ainsi avoir un dplacement vers la droite */
{menu.value == 2}
{task=Task({loop({360.do({|i|var val=1.polar(i+90/360*2pi).asPoint;
{slider2d.setXYActive(val.x.linlin(-1,1,0,1),
val.y.linlin(-1,1,0,1))}.defer;
(rate.value).wait})})})}
{menu.value == 3}
{task=Task({loop({360.reverseDo(
{|i|var val=1.polar(i+90/360*2pi).asPoint;
{slider2d.setXYActive(val.x.linlin(-1,1,0,1),
val.y.linlin(-1,1,0,1))}.defer;
(rate.value).wait})})})}
// Plus complexe, cette routine met en place huit dplacements,
1) on commence sur le point au centre bas, donc la valeur des
ordonnes est 0.5 puis on ajoute la valeur de 0 1 i=0,100 puis on multiplie
par 0.01 dplaant le point jusquՈ haut centre.
{menu.value == 4}
{task=Task({loop({
100.do({|i|{slider2d.setXYActive(0.5,i*0.01)}
.defer;(rate.value).wait});
(rate.value*4).wait;
2) Depuis l on se dplace dun quart darche, de 0 90 vers
la gauche
90.do({|i|var val=1.polar(i+90/360*2pi).asPoint;
{slider2d.setXYActive(val.x.linlin(-1,1,0,1),
val.y.linlin(-1,1,0,1))}.defer;
(rate.value).wait});
(rate.value*4).wait;
3) nous sommes au point le plus gauche centre, et on ralise
un dplacement vers lextrme droite en gardant la position dans les ordonnes
de 0.5
100.do({|i|{slider2d.setXYActive(i*0.01,0.5)}
.defer;(rate.value).wait});
(rate.value*4).wait;
4) encore un quart darche toujours vers la gauche ce qui nous
amne au point 2
90.do({|i|var val=1.polar(i+360/360*2pi).asPoint;
{slider2d.setXYActive(val.x.linlin(-1,1,0,1),
val.y.linlin(-1,1,0,1))}.defer;
(rate.value).wait});
(rate.value*4).wait;
5) chemin numro 1 linverse, donc on revient au point dpart.
100.reverseDo({|i|{slider2d.setXYActive(0.5,i*0.01)}.defer;
(rate.value).wait});
(rate.value*4).wait;
6) mme formule quau chiffre deux mais linverse donc
dplacement depuis centre bas vers gauche centre.
90.reverseDo({|i|var
val=1.polar(i-180/360*2pi).asPoint;
{slider2d.setXYActive(val.x.linlin(-1,1,0,1),
val.y.linlin(-1,1,0,1))}.defer;
(rate.value).wait});
(rate.value*4).wait;
7) traverse en ligne jusquՈ lextrme droite au milieu des
abscisses
100.do({|i|{slider2d.setXYActive(i*0.01,0.5)}.defer;
(rate.value).wait});
(rate.value*4).wait;
8) retour la position de dpart avec un quart darche dans le
sens des aiguilles dune montre. Le tout est boucl donc lopration se rpte
indfiniment jusquՈ larrt explicite avec le bouton marche/arrt
90.reverseDo({|i|var
val=1.polar(i+270/360*2pi).asPoint;
{slider2d.setXYActive(val.x.linlin(-1,1,0,1),
val.y.linlin(-1,1,0,1))}.defer;
(rate.value).wait});
(rate.value*4).wait;})})}
Linterface
graphique pour contrler et afficher les archives sonores ma demand un
investissement considrable, car je voulais avoir certaines facilits comme par
exemple, crer un modle pour pouvoir le reproduire cinq ou six fois, avoir un facile accs une liste
darchives et pouvoir slectionner et jouer des sections diffrentes, accepter
plusieurs formats des fichiers (aiff,wave,map3), avoir un curseur indiquant la
position de lecture dans le fichier, et en plus des fonctions habituelles de play, stop, pause, loop, vitesse avoir une fonction de
lecture crazy qui
lirai larchive en sautant alatoirement diffrentes places du fichier.
Avec ces
contraintes, jai d tudier fond les classes Buffer, PlayBuf, lenvoi et linterprtation de messages OSC du SCSynth
vers SClang, le dcodage des fichiers mp3, les fonctions drag and drop la gestion de
listes, lՎcriture des fonctions lintrieur dune classe et la gestion des
ordres parallles pour linterface graphique et le moteur de synthse.
Je ne dtaillerai
dans cette classe que deux fonctions, car le code entier sans commentaires fait
cinq pages. Toutefois avec les explications que jai donn au fur et mesure
et vu que jai cherch avoir une grammaire claire en appliquant
systmatiquement les mmes ordres, le code donn en annexe devrait tre assez accessible.
/* Les modules sont groups dans un vecteur de 5 players, ainsi cette fonction aura pour
argument un nombre entier qui dsigne un des cinq modules auquel le message sadresse,
par exemple en appelant Polysampler.fplay(0), cest le premier player qui se mettra jouer id
tant lidentifiant du synthtiseur */
fplay {|n|var id;id = 1200 + n;
/* un premier test pour empcher lappel de la fonction si aucun
fichier est slectionn */
if(choosefile[n].value
== 0) {"select
first a sound file".warn;
play[n].value_(0);}{
/* maintenant la routine qui sera joue par lhorloge de
lapplication car des objets graphiques sont en jeu, une autre possibilit
aurait t dencapsuler la routine dans une fonction et dappeler la mthode .defer
pour ainsi utiliser lhorloge du systme */
r{ server.sendMsg(\s_new, \samples,id,0,2);
server.sendMsg(\n_run,id,0);
0.1.wait;
/* Une fois le synthtiseur cr on empche lutilisateur
dappuyer sur les boutons loop ou crazy car cel appellerai une fois de plus la
cration dun synthtiseur */
loop[n].enabled_(false);
crazy[n].enabled_(false);
/* Maintenant on initialise le synth avec les valeurs de
linterface graphique, ceci permet darrter le synth et puis au moment de le
rappeler il ne vient pas aux valeurs par dfaut mais celles qui taient avant
larrt */
server.sendMsg(\n_set,id,\bufnum,n,\vol,~values.playersf.vol[n].value,
\rate,~values.playersf.rate[n].value);
/* Ce test demande la matrice dans quelles sorties doit jouer
le synthtiseur */
if
(~values.matrixout != nil)
{if(~values.matrixout[n+2].sum
>= 1)
{this.setoutputs(~values.matrixout[n+2],n)}};
0.1.wait;
/* Ici, on vrifie sil y a une slection dans une rgion du
fichier ou bien sil doit tre jou en entier, sil y a une rgion les valeurs
ont t stockes dans les variables, start, end, dur */
if ((~values[("newdur" ++ n).asSymbol] == 0) ||
(~values[("newdur" ++ n).asSymbol] == nil))
{server.sendMsg(\n_set,id,\start, 0,\end, 1,
\dur,~values.durations[n],\t_trig,1,\t_gate,1)}
{server.sendMsg(\n_set,id,\start,
(~values[("newstart" ++ n).asSymbol]),
\end, (~values[("newend" ++ n).asSymbol]),
\dur, (~values[("newdur" ++ n).asSymbol]),
\t_trig,1,\t_gate,1)};
server.sendMsg(\n_run, id,1);
}.play(AppClock)}}
Lobjet
graphique suivant est celui de la lecture de tables, une table est une courbe
sur laquelle on peut fixer son rang et sa vitesse de lecture, les valeurs ainsi
lues seront affectes aux paramtres de contrle de chaque synthtiseur. Ce
procd sera dcrit dans le chapitre suivant quand je rentrerai dans le dtail
par rapport aux diffrentes modalits de contrle.
Ces
courbes peuvent tre dessines la main ou appeles dun menu qui a dj
plusieurs fonctions par dfaut.
/* Lobjet popwave fait partie dun vecteur, ainsi plusieurs
instances ou modles peuvent tre crs avec le mme code, avant de dfinir ses
fonctions on dclare son contenu et son apparence */
popwave[i] =
GUI.popUpMenu.new(background[i],Rect(210,35,65,24)).canFocus_(false)
.items_(["wave","-","gaus","spring","ramp","saw","triangle",
"noise","hills","constant","one","zero"])
.font_(Font(\Times,14))
.action_({|menu|var
case,val=menu.value;val.postln;
/* Une fois de plus la fonction est compose dune srie de cas,
en suivant le choix de lutilisateur. Chacune de ces possibilits est un
multislider 100 points o lon peut modifier le rang, cest--dire le minimum
et le maximum de la valeur de sortie et le dbit en secondes auquel ces valeurs
sortiront */
case = case
/* Cette premire courbe remplit le tableau en multipliant un
indice v (entre 0 et 100) par pi et une fois la valeur du sinus calcule on lՎlve
au carr, le rsultat est une courbe du type gaussienne */
{val == 2}{waveview[i].valueAction_(
Array.fill(100,{|v|((v*0.01)*pi).sin*((v*0.01)*pi).sin}))}
/* Cette courbe que jappelle spring ou ressort
est une somme de 200 fonctions sinus dont les amplitudes des 5 premires
composantes sont normalises 1, donc une onde carr trs sommaire, puis on
remplit le vecteur de 100 units en sautant une valeur sur deux de cette onde
carre et en multipliant sa valeur par lindice du vecteur */
{val == 3}{waveview[i].valueAction_(
Array.fill(100,{|v|var z=Signal.sineFill(200,[1,1,1,1,1]).asArray;
z.at(v)}))}
/* Celle-l est une courbe en forme dent de scie, une courbe remplie
avec 100 valeurs ascendantes */
{val == 4}{waveview[i].valueAction_(Array.fill(100,{|v| v*0.01}))}
/* Pareil que la prcdente mais dans le sens descendant */
{val == 5}{waveview[i].valueAction_((Array.fill(100,{|v| v*0.01}))
.reverse)}
/* Courbe triangulaire */
{val == 6}{waveview[i].valueAction_(
(Array.fill(100,{|v|((v*0.01)*pi).sin})).asin.normalize)}
/* Valeurs alatoires pour chaque x */
{val == 7}{waveview[i].valueAction_(Array.fill(100,{|v| 1.0.rand}))}
/* Multiplication de deux vecteurs (sinus, cosinus en valeurs
absolues et avec dcalage de phase) le rsultat est une courbe avec plusieurs
pics sinusodaux */
{val == 8}{waveview[i].valueAction_(
(Array.fill(100,{|v|(v*0.1).cos.abs}).reverse)*
(Array.fill(100,{|v|(v*0.01*2pi+5).sin.abs})))}
/* Valeur constante 0.5,1 et zro */
{val == 9}{waveview[i].valueAction_(Array.fill(100, {|v| 0.5}))}
{val == 10}{waveview[i].valueAction_(Array.fill(100,{|v| 1}))}
{val == 11}{waveview[i].valueAction_(Array.fill(100,{|v| 0}))};});
Cette mme
interface graphique sera utilise pour le contrleur Arduino sauf que les
courbes seront dessines directement par le capteur.
Dans cette
interface graphique il sagit dun tableau o les contrleurs midi sont
assigns aux contrleurs de synthtiseurs.
Voici la partie suprieure de ce tableau, les boutons, defaults, reset, load, save, permettent de modifier toute la liste. Defaults, fait appel la configuration
avec linterface u-control de beringher. Reset, efface toutes les assignements.
Load, charge une configuration
sauvegarde pralablement et save
fait la sauvegarde.
Ensuite
chaque paramtre de contrle dans la liste peut tre modifi la main en
slectionnant dans le menu linterface MIDI disponible et en crivant les
canaux et les nombres des contrleurs. Ou bien avec les boutons verts pour
valider le choix, jaunes pour effacer et rouges pour assigner un contrleur
depuis linterface MIDI, cette action learn
est aussi disponible avec les touches m ou l en
slectionnant lobjet graphique contrler. Linterface se mettra jour
automatiquement en utilisant ce procd.
En
introduisant plusieurs objets graphiques je voulais montrer mes choix de
programmation : simplicit, clart, importance secondaire, priorit sur le
son.
Effectivement,
je me suis entran jouer simplement avec la matrice et les lecteurs de
fichiers lՎcran, tout le reste cach mais accessible via le contrle midi,
et jai prouv une libert particulire ne pas tre plong constament dans
lՎcran de lordinateur.
Cette interface
graphique a pour objet la gestion de paramtres depuis le clavier de
lordinateur.
Pour programmer
cette interface je suis parti de lexemple de James Mc Cartney disponible dans les exemples fournis avec
la distribution publique de SuperCollider. Toutefois cet exemple a pour objet de
dclencher des fonctions audio depuis le clavier. Jai d faire des
modifications profondes dans le code pour avoir entre autre la possibilit de
glisser depuis la liste le paramtre quon dsire manipuler, avoir une srie de
boutons pour sauvegarder la configuration, la recharger, pour mettre une
configuration donne par dfaut, pour connatre tous les paramtres actifs dans
les clavier et une fonction clean pour effacer les actions
stockes dans chaque touche.
Jai d faire face
deux autres problmes. Premirement chaque touche dans les claviers des ordinateurs
a un nombre unixcode
assign par sa position physique mais le caractre associ celle-ci varie en
fonction du langage de chaque clavier, le problme est donc laffichage des
caractres. Pour le rsoudre : au moment de toucher le clavier avec la
fentre active, une fonction vrifie si laffichage est correct, sinon le caractre
est modifi :
window.view.keyDownAction = {|view, char,
modifiers, unicode, keycode|
if
(modifiers!=1835305)
{keycodes.collect({|i,j|
if
keycode==keycodes[j]){keys[j].string_(char.asString)}})}}
}
La deuxime
difficult a t la polyphonie dactions et je ne lai pas rsolue, toutefois
dans lavenir jimagine une fonction qui pourrait suivre plusieurs ordres en
parallle, pour linstant une seule action est possible la fois.
Les paramtres de
contrle du programme sont les variables ou plus prcisment les arguments des
synthtiseurs. Ces arguments sont accessibles et modifiables de faons
diffrentes : soit directement sur linterface graphique, avec une
interface MIDI (potentiomtres, boutons, joysticks, ou capteurs analogiques) ou
par des valeurs issues de lanalyse du son.
La liste de 108
paramtres est stocke dans un dictionnaire. On peut assigner chaque entre une
dfinition puis lappeler pour retrouver la valeur correspondante. Pour cela il
faut chercher dans le dictionnaire lentre dsire comme dans lexemple
ci-aprs.
~midilistaview = Dictionary[
0 -> 'cc1198play', 1 -> 'cc1199play',
Le dictionnaire ~midilistaview a pour valeur 'cc1198play' correspondant
lentre 0, donc en appelant
~midilistaview[0], la rponse
sera 'cc1198play'.
Voici la liste complte des paramtres
modulables dans Jabalion pour chaque synthtiseur
Entres analogiques (2) :
Marche/arrt
Volume
Lecteur de fichiers sons (5) :
play/pause
Loop/pause
Crazy play/stop
Taux de changement / crazy
Rate ou vitesse de lecture
Volume
PitchShifter
Taille des grains
Taux de variation des hauteurs
tendue des variations
dhauteur
Densit
wet
Volume
Modulations
Frquence de modulation
Volume de modulation
Frquence du filtre
Frquence du LFO
Volume du LFO
wet
Ligne retard module
Transposition
Dure du retard
Rinjection
wet
Volume
Rverbration
Taille de la salle
Amortissement
wet
Volume
Multidelay
Courbe dynamique
Valeurs rythmiques
wet
Volume
ComplexAttack
Coefficient rel
Coefficient imaginaire
wet
Volume
Freezer
Dclencheur
Vitesse de lecture
Volume
Granulator
Variations dhauteur
Densit
Taille de grains
Variation position
Variation damplitude
wet
Volume
FM
Rate
Frquence porteuse
Frquence modulante
Index de modulation
Dure
Volume
Gendy
Distorsion damplitude
Distorsion de dure
ad paramtre
dd paramtre
Frquence minimale
Frquence maximale
Graduation damplitude
Graduation de dure
Volume
Kmeans
Frquence
Rate
Soft
Nummeans
Volume
Panoramique (2)
Type de courbe
marche/arrt
vitesse
Master volume
Recorder
Marche / arrt
Dure
Vitesse de lecture
Volume
Master Volume
Les paramtres de
contrle expriment les degrs de libert de lalgorithme, sa courbe de
variation, ses limites maximum et minimum. Ces bornes sont fixes au moment de
la compilation et ne peuvent pas tre modifis au cours du jeu. Pour cela il
faudrait recompiler la librairie de synths et recommencer.
Tous les
paramtres ont t normaliss entre 0 et 1 pour des conomies de calcul au
moment de linterprtation. Ainsi le facteur frquence qui varie de 0 1 est,
en vrit, une interpolation exponentielle des valeurs entre 200/20000 Hz.[40]
Cent huit
paramtres est un nombre important. Il faut donc imaginer des stratgies pour
les grouper et pour tre dans une logique de contrle multiparamtrique. Sinon
le contrle devient incontrlable , une sorte de jungle o on ne sait
jamais qui fait quoi, quand et o.[41]
Je vais examiner trois possibilits de solution : linterface ordinateur,
les interfaces MIDI et la capture du geste, et finalement le son contrleur.
Jouer (contrler
les algorithmes de synthse) directement sur lordinateur sans interface
externe ou microphone peut tre une tche trs difficile mais pas impossible[42].
Aujourdhui nous voyons la technologie dՎcrans tactiles multipoints se
dmocratiser ; il est mme porte de mains dans les machines personnelles,
cette technique a t implmente dans plusieurs interfaces destines la musique[43].
Si lon met de
ct le tracking motion
ou suiveur de mouvements, la dtection des couleurs, ou de positions, qui sont possible
avec des outils comme Jitter et les
webcams intgres dans les ordinateurs portables, il nous reste que le clavier
et le track-pad (ou souris dans les
portables) comme interface. Ceci nest pas grand-chose pour parler de degr de
libert instrumentale car le clavier ne permet quun geste de slection[44],
et le curseur un geste de modification par son dplacement dans lՎcran.
Jai cependant
ralis des expriences pour enrichir ces possibilits. Par exemple la valeur
dun paramtre peut tre modifie par la quantit de touche du clavier joues
par unit de temps : Plus jappuie rapidement sur les touches, plus
la valeur sera grande. Inversement, plus le temps entre chaque impact est long
plus la valeur est petite. Une certaine gestualit instrumentale est retrouve
avec la dpense physique et laugmentation ou la diminution dun paramtre. Au
cours de cette exprience, jai rapidement retrouv les limites de ractivit
lies cette technique et jai crains pour la survie du clavier, qui na pas
t prvu pour de tels exercices.
Une autre
possibilit lie au temps a t tudie : le temps denfoncement des
touches. Plus une touche reste enfonce plus la valeur crot ; moins elle
reste enfonce, moins grandes les valeurs seront. Cette technique prsente deux
particularits : Tout dabord il faut une touche par action. Cest--dire que
monter ou descendre les valeurs ncessite une combinaison de touches
diffrentes. Ensuite il faut permettre lutilisateur de rgler la sensibilit
du clavier. En effet les valeurs fixes peuvent tre perues comme trop rapides
ou trop lentes. Un clavier trop sensible demandera un temps plus court pour
arriver la valeur maximale ou minimale, contrairement une sensibilit plus
rigide qui demandera de plus de temps denfoncement pour arriver aux valeurs
souhaites.
Dans ma version du
logiciel sur MAXMSP ce paramtre sera visible dans linterface graphique. Dans
limplmentation sur SuperCollider, ce paramtre de sensibilit est un facteur
fixe li lincrment des objets graphiques. Son rang est le taux de signaux
de contrle tabli au dpart.
Ce premier
paramtre li la ractivit dynamique donne la possibilit davoir un
contrle permanent et instantan sur lamplitude globale et permet ainsi de
faire des silences subitos ou
des crescendos et des decrescendos mesurs lintuition. Il permet galement
de prvenir des montes de niveau inattendues par une mauvaise manipulation,
par une rinjection boucle, ou par une panne de logiciel. Un contrle du
Master Volume interne au logiciel est attribu aux touches :
cmd+alt+ctrl+9 et cmd+alt+ctrl+0[45]
Pour viter
daller vers chaque fentre, puis vers chaque objet graphique, tous les
paramtres sont assignables en les glissants depuis linterface graphique vers
linterface clavier. Comme je lai signal plus haut, un problme avec la
commande de paramtres depuis le clavier de lordinateur est la quantit
laquelle on a accs, qui est limite un. Ce clavier contrleur est trs vite
puis et remis en question avec ce paradigme. De plus, je nai pas russi
manier le contrle multiparamtrique dont jai dj signal limportance.
Malgr ces
critiques face au contrle depuis le clavier de lordinateur et bien quune
interprtation au seul ordinateur ne soit pas trs riche du point de vue de
lexpressivit histrionique et gestuelle, certaines fonctions se comportent
trs bien et on ne saurait pas sen passer. Louverture, la fermeture de
fentres, les taches lies ou ncessitant la saisie des noms ou des cls, ainsi
que la sauvegarde ou le chargement par nom de fichier, ou encore le design
manuel des courbes de contrle sont des exemples de fonctions indispensables. Cette
liste non exhaustive peut tre complte par les tches lies une slection
binaire type Switch on/off ou dclencheur des touches des fichiers audio (jouer,
arrt, boucle, pause). Dailleurs, dans lobjet graphique des fichiers audio,
un raccourci clavier est disponible par dfaut quand la forme donde ou un des
boutons assigns celle-ci est slectionn : taper espace pour dclencher
ou arrter la lecture des fichiers.
backgroundsf[i].keyDownAction_(UnicodeResponder.new.normal(32 -> {
if
(rspacebar.nextN(1)[0]==1) {this.floop(i)}{this.fstop(i)}}));
Se poser la limite dun jeux
de boutons et dune surface sensible la position a t un exercice trs
intressant et stimulant pour la crativit. Jai en effet t confront une
minimisation des possibilits expressives et un cadre trs restreint dutilisation
de lՎnergie physique. Ca a donc t un exercice enrichissant pour la pense
instrumentale.
Passons maintenant un
autre point qui a donn lieu beaucoup dՎtudes et de rflexions, tant du
point de vu de lingnierie et de la technologie comme du point de vu des
utilisateurs musiciens amateurs ou professionnels : la norme MIDI. Mise au
point vers le dbut des annes 80, le MIDI cherchait une standardisation dans
les protocoles de communication entre les machines numriques. Il doit ses
caractristiques aux possibilits technologiques de lՎpoque. Fortement
critiqu pour son codage fortement li au piano, soit pour calcul de
lamplitude li aux vlocits dattaques[46],
pour son cryptage dhauteur par touche enfonce, pour son rang restreint 128
valeurs (0-127) et lillusion polyphonique de 16 canaux[47],
le MIDI a permis dautres
protocoles de voir le jour. La question du codage et de la numrisation du
geste instrumentaux reste quant elle ouverte pour plus dexplorations.
Avant de traiter le sujet
passionnant de la captation du geste, je vais moccuper des interfaces du type
contrleur MIDI. Elles sont semblables aux tables de mixage, potentiomtres
linaires et angulaires avec boutons slecteurs et dclencheurs. Ce choix est
dtermin par la popularisation de ce type dinterfaces qui font le pont entre
les outils et le matriel lectroacoustique traditionnel et les
interfaces plus exprimentales, qui sՎloignent plus au moins des paradigmes
instrumentaux classiques . Ces interfaces font donc parti du
rpertoire gestuel de la musique lectroacoustique.
Jai utilis pour
mes expriences le contrleur
volution u-control uc-33 . Il sagit dune interface avec un rang
de 9 potentiomtres linaires (faders) et de 24 potentiomtres angulaires
organiss dans trois rangs, puis 16 boutons. Chaque contrleur peut tre
assign un des seize canaux, ou un nombre de contrleur entre 0 et 127, ou
encore une note on/off avec une vitesse dattaque prfixe. La possibilit d enregistrer
les rglages dans 33 mmoires donne une possibilit incroyable de combinaisons.
Quatre de ces mmoires ont un accs rapide avec des boutons ddis. Laspect
physique (bien quun peu petit) de cette interface ressemble huit
tranches dune table de mixage.
Du point de vue de
linterprtation avec une interface de ce type on a gagn, par rapport au seul contrle
de lordinateur, un accs poly-paramtrique soit la possibilit daccder
simultanment plusieurs paramtres. Ainsi le son devient plus mallable. Toutefois
lutopie serait davoir une interface construite et ddie pour le logiciel. Malgr
la versatilit dassignements possible sur linterface MIDI, on doit garder une
interprtation mixte avec lordinateur pour accder des objets cls comme la
matrice, les tables, la slection darchives, ou le chargement de presets. Le
fait davoir 108 paramtres de contrle dans le logiciel et 33 contrleurs
continus dans linterface nous oblige faire des assignements multiples, qui
peuvent tre jous sparment en altrant les canaux stocks dans les mmoires.
Cette solution
amne un nouveau fait manier : en changeant de paramtre sur le mme
potentiomtre on laisse un paramtre dans une valeur, puis on attaque le
suivant cette valeur, on modifie alors sa valeur et quand on revient sur le
premier paramtre il est toujours la mme valeur, mais le potentiomtre, lui,
est dans une valeur diffrente ce qui produit de sauts dans le paramtre. Ces
sauts peuvent tre trs ennuyants, notamment dans le contrle de niveaux o des
pics non voulus damplitude peuvent survenir et altrer le discours musical.
Conscients de ceci,
les constructeurs dinterfaces ont mis au point des potentiomtres automatiss
qui reviennent sur la valeur en changeant de configuration. Mais cette solution
plutt coteuse nest souvent disponible que dans des tables de mixage pour des
studios. Toutefois une solution logicielle est imaginable en programmant une
contrainte pour empcher les sauts dans les valeurs qui modifient un paramtre.
Il faut galement mentionner
le besoin de deux mappings ou dassignement
pralables ncessaires sur linterface MIDI et sur linterface logicielle. Ces
rglages de lordre de la calibration ou daccordage pour le logiciel peuvent
tre stocks dans un archive texte. Dans celui-ci est crit le paramtre
contrler, lidentifiant de linterface MIDI, le canaux et le nombre du
contrleur, ainsi quՎventuellement le port de connexion. Cette possibilit est
implmente dans Jabalion (c.f. la section interface graphique tableau MIDI).
Une dernire
situation remarquer dans lutilisation de cette interface MIDI est la
complexit dans la distribution spatiale des contrleurs, alors que sa logique
est trs simple dans linterface : un potentiomtre linaire pour chaque
trois angulaires. Cette logique ne correspond pas larchitecture des
synthtiseurs programms o les arguments varient entre 3 et 9 paramtres. Par
consquent, il est difficile de trouver une logique cohrente de disposition. Une
solution possible serait que les potentiomtres linaires contrlent toujours et
dans tous les canaux, les niveaux de fichiers son (5), dentrs analogiques
(2), de lenregistreur (1) et un Master. Puis le trois rangs de huit potentiomtres
angulaires assigns pour le canal 1, les traitements de modulation, retards et
rverbration, le canal 2, synthse granulaire et FFTs le canal 3, les synthtiseurs
FM, Gendy et Kmean. Finalement les boutons dclencheraient les automatisations
et les fichiers sons.
Dans une
progression des outils de contrle allant de linterface graphique vers la
matrialisation du concept de potentiomtre, nous arrivons aux frontires de
linstrument de musique, o linformatique musicale pose bien de problmes et
pas seulement technologiques mais aussi dordre thorique comme la bien
signal Hugues Dufourt dans son livre Mathesis et Subjectivit :
Au XXme
sicle, lordinateur, en portant notre audition normale lՎchelle de
laudition microscopique, a rompu la coordination entre la vue, loue et le
toucher quassurait linstrument de musique traditionnel. En dissociant la
construction de lobjet sonore du geste et de la motricit, la technologie a
renvers en musique, les rapports du mouvement et de lespace. Elle soustrait
le mouvement son contexte biologique et le conoit comme la rsultante dune
opration dans lespace. En outre, la technologie a spar la sensibilit de la
motricit, et la sensation du mouvement. Cette sparation en composantes
motrices et sensorielles pose le problme technique et esthtique de leur
coordination ultrieure, de leur reconstruction et de leur runion
artificielles.
En rompant le
caractre unitaire de la perception auditive et du geste instrumental,
linformatique musicale ouvrait la voie des interrogations indites. Quest
ce quune musique sans mouvement ou une musique dont le mouvement serait tout
entier intrioris ? On peut en trouver lexemple dans les uvres de
Chowing et Risset. Que serait, linverse, une musique issue du
mouvement ? Il faudrait alors se tourner vers la synthse par modles
physiques et vers les tudes sur la causalit instrumentale. Jean Claude Risset
a imagin une sensorialit indpendante de la motricit, Claude Cadoz une
motricit indpendante de la sensorialit. Mais comme la sensorialit peut-elle
ragir des propositions de structure qui ignorent dlibrment les lois du
mouvement volontaire ? LՎvolution technique de la musique pose donc,
aujourdhui comme au XVIIme sicle, le problme de la substitution des
processus physiques des actes organiques. [48]
Ce qui semble
inquiter Monsieur Dufourt est le concept du mouvement et de motricit. Effectivement
avec des appareils lectroacoustiques nous ne sommes plus dans la consommation
dՎnergie physique traduite en son. Les paradigmes gestuels sont dun autre
ordre. On peut vrifier cette inquitude dans plusieurs domaines, avec des
comptitions comme Guthman Musical
Instrument Competition du Georgia Tech Center for Music Technology
qui organise chaque anne un prix pour les inventeurs des instruments, ou
NIME International Conference on New Interfaces
for Musical Expression qui a lieu chaque anne
dans diffrents pays. Dans le milieu acadmique plusieurs centres de
technologie musicale ddient un espace la cration de nouveaux instruments par
exemple Sir John Cass
Department Of Art Media and Design de Metropolitan London University
qui offre des programmes en manufacture instrumentale ou Media
Laboratory Masachusets Institute of Technologie avec Tod Machover[49]
et son travail sur les Hyper Instruments pour
ne nommer que quelques uns. Ainsi on voit la liste des interfaces musicales
sՎlargir et le rpertoire organologique suit deux directions principalement,
les modifications sur de paradigmes instrumentaux existants et la cration de nouveaux
paradigmes gestuelles.
La recherche sur
le geste musical mene par Claude Cadoz donne un cadre thorique pour une
typologie du geste, instrumentale ou non,
gestes dexcitation, de modification, de slection dextinction. On en
dduit que les interfaces gestuelles ddies la captation du geste ne peuvent
quassurer une partie des gestes de slection et de modification et des gestes
du type non instrumental, car ils sont de caractre unidirectionnel.
Les
priphriques gestuels sont galement particuliers par le fait quils doivent
prendre en compte la bidirectionnalit (effectrice et rceptrice) du canal
gestuel.
Tous les systmes
gestuels ne rpondent pas cette particularit, cest mme ce qui caractrise
leur dveloppement jusquՈ une priode rcente.
Les dispositifs
habituels, du clavier alphanumrique la souris, ne sont que des capteurs de
geste, ils ne remplissent pas la fonction symtrique.
Les claviers de
synthtiseurs et les divers contrleurs MIDI qui reproduisent de
prs ou de loin lergonomie de certains instruments traditionnels (manches de
guitare, saxophone, etc.) sont galement unidirectionnels, capteurs exclusifs
[50]
La captation du
geste naboutit pas un instrument mais un contrleur. Pour explorer
personnellement ce concept et aprs mes expriences avec une guitare munie des capteurs[51],
je me suis servi du module Arduino Diecimila
et dun jeu des capteurs de pression par la compagnie Interface Z[52]
Paris.
Jessaie douvrir
cette possibilit dans mon application logicielle pour permettre un
utilisateur de connecter ses propres capteurs, de leur assigner le contrle des
paramtres de synthse dune faon facile et de pouvoir calibrer les valeurs
sans besoin dun programme tiers.
Un Module Arduino
est construit autour du microcontrleur Atmel AVR, chaque module possde au
moins un rgulateur linaire 5V et un oscillateur
quartz 16 MHz (ou un rsonateur cramique dans certains
modles). Le microcontrleur est prprogramm avec un bootloader[53] de
faon ce qu'un programmateur ddi ne soit pas ncessaire.
Les modules sont
programms au travers d'une connexion USB. Le module possde 14 entres/sorties
numriques, dont 6 peuvent produire des signaux PWM, et 6 entres
analogiques. Les connexions sont tablies au travers de connecteurs femelle
HE14 situs sur le dessus de la carte. Les modules d'extension viennent
s'empiler sur l'Arduino. Plusieurs sortes d'extensions sont disponibles dans le
commerce.[54]
Un capteur de
force/pression FSR Force Sensitive
Resistor, est une rsistance
qui varie en fonction de la pression exerce sur la zone sensible. Ceux dont je
me sert ont une taille de : pastille 61 mm x 15 mm, zone sensible 61
mm x 12,5 mm.
Pour permettre de
communiquer avec Arduino, jai crie une classe KrArduino dont voici les principaux points du
code.
GUI.button.new(window,Rect(5,4,70,20)).canFocus_(false)
.states_([["Conect",Color.white,Color.yellow(0.9)],
["Disconect",Color.white,Color.red(0.9)]])
.action_({|but| if
(but.value==1)
{r{
pin
= SCPyduino.new(SerialPort.devices[2]);
4.wait;
n.do({|i|pin.analog[i].active_(1)});
0.5.wait;
n.do({|i|krtask2[i].start});
0.5.wait;
n.do({|i|krtask[i].start});
}.play}
{n.do({|i|pin.analog[i].active_(0);
krtask[i].stop;krtask2[i].stop;pin.close;
SerialPort.closeAll})}});
Ici, un bouton est
cr pour initialiser ou fermer une connexion via le port serial. Une routine
est ncessaire car cette initialisation peut prendre quelques secondes et doit
suivre plusieurs tapes : activer les entres analogiques et numriques,
puis actualiser les valeurs sur linterface graphique et les affecter au
paramtre souhait. Du point de vue de linterface graphique cette classe se
prsente comme une lecture de tables dont la courbe est dessine en temps rel
par les variations des valeurs produites par le capteur.
/* Cette Tche actualise les valeurs pour chaque entre
analogique et les normalises */
krtask2[i]= Task{loop{pin.iterate;
zpin.put(i,((pin.analog[i].value/1023).linlin(0.34,0.99,1,0)))}};
/* La valeur obtenue dans lՎtape prcdente peut tre calibre
avec deux boites numriques qui fixent les extrmes dune fonction
dinterpolation. Cette nouvelle valeur est affiche et envoye au paramtre
choisie dans la liste */
krtask[i] = Task({loop({100.do({|k| var spec = ControlSpec(
krnumbermin[i].value,krnumbermax[i].value,\lin,0.01),valor;
valor
= spec.map(zpin[i]);
{krtxtinfo[i].string_(valor);
krwaveview[i].index_(k);
krwaveview[i].currentvalue_
(zpin[i])}.defer;
0.1.wait})})});
Ma stratgie
dinterface physique a t de construire une pdale. En effet les mains sont
dj bien occupes avec le clavier de lordinateur, linterface MIDI, et les
entres analogiques. Cette pdale se compose dune surface circulaire avec un
capteur chaque point cardinaux, une pdale de volume (potentiomtre
angulaire) et une srie de boutons.
La cadence laquelle les valeurs sont actualises joue un rle
prpondrant dans le rsultat sonore. Avec des traitements et des synthses on
obtient un contrle trs plastique du son. Mais par la
disposition des capteurs il est presque impossible dexercer une pression
constante maximale sur les quatre points sans abimer les capteurs, donc il y
aura toujours un ou deux points dont les valeurs seront mises en avant.
Le contrle au pied peut tre exploit encore plus avec des surfaces
sensibles et en tudiant dautres types de capteurs et peut tre une interface
intressante pour personnes avec mobilit rduite des membres suprieurs.
Le son lui mme
peut tre aussi tudi comme un contrleur. Lanalyse du signal sonore cherche
connatre la frquence fondamentale, lamplitude nergtique, et la richesse
spectrale.
Limplmentation
de cette technique la plus courante consiste dtecter la priode fondamentale
de la hauteur dans le domaine temporel. Le signal est considr comme une
amplitude fluctuante autour du zro qui progresse dans le temps. Lalgorithme
cherche la priodicit du signal en regardant les passages par zros
rptitifs, ou bien en comparant lՎcart entre pics de mme amplitude. Voici un
signal de la note DO3 joue la guitare vue loscilloscope :
La premire toile montre les passages par zro, la deuxime toile
correspond une composante de haute frquence ; la flche indique les
pics damplitude spars de 3.8 ms.
La priode tant
lenvers multiplicatif de la frquence donc DO3.
La dtection de
priodicit a t mise au point dans dautres algorithmes qui utilisent par
exemple des fonctions de corrlations. Celles-ci comparent le signal point par
point avec des versions retardes de lui-mme, par des intervalles successifs
en cherchant des modles rptitifs. On peut mentionner aussi limplmentation
par des filtres adaptatifs et des circuits dtecteurs de diffrences qui font
converger la frquence de coupure dun filtre passe bande la frquence du
signal dentre.
Un point faible
des mthodes de dtection de priodicit est le temps danalyse ncessaire pour
calculer et pour faire lestimation de hauteur. Lalgorithme ne peut pas ragir
aux transitoires dattaque car ceux-ci sont trs riches en contenu frquentiel
et ne correspondent pas des modles harmoniques. Une fois le temps du
transitoire dattaque coul, il faut attendre au moins deux priodes du signal
pour que lalgorithme puisse calculer et puisse prendre une dcision. Ce temps
de raction entre la note joue et la rponse informatique est appel
latence . Plus vidente dans les basses frquences, cette latence
peut tre gnante, mais il faudrait se souvenir de la latence acoustique
laquelle shabituent les organistes et qui peut galement aller jusquՈ plusieurs
diximes de seconde sans pour autant empcher une matrise de linstrument.
La dtection de
hauteur dans le domaine frquentiel est effectue grce lanalyse de Fourier[55].
Ainsi nous pouvons connatre le poids des diffrentes composantes frquentielles
contenues dans le signal et donc isoler la frquence dominante, ou en dduire
si elle nest pas prsente par un examen des relations harmoniques.
Un problme dans
les algorithmes crits partir de la transforme de Fourier est la rsolution
frquentielle. En effet, la bande des frquences audio est divise de faon
linaire et la perception humaine de hauteur est plutt logarithmique, ce qui
signifie que les basses ne peuvent tres suivies avec la mme prcision que les
aigus.
Michle Castellengo
explique dans son cours dacoustique[56] musicale que
la perception de la hauteur est un procs complexe qui met en jeu plusieurs stratgies
dՎcoute et diffrents mcanismes physiologiques et cognitifs.
Ainsi les modles
danalyse et de dtection de hauteur sont toujours en cours dՎvolution. Rcemment
un groupe dingnieurs allemands ont mis au point la technologie rseaux
neuronaux pour le suivi de hauteur dans la guitare, disponible dans
linterface AXON de Terratec.
Un rseau
de neurones (ou Artificial Neural Network)
est un modle de calcul dont la conception est trs schmatiquement inspire du
fonctionnement de vrais neurones (humains ou non). Les rseaux de neurones sont
gnralement optimiss par des mthodes dapprentissage de type statistique, si
bien quils sont placs dune part dans la famille des applications
statistiques, quils enrichissent avec un ensemble de paradigmes permettant de
gnrer de vastes espaces fonctionnels souples et partiellement structurs, et
dautre part dans la famille des mthodes de lintelligence artificielle quils
enrichissent en permettant de prendre des dcisions sappuyant davantage sur la
perception que sur le raisonnement logique formel .[57]
La dtection
dhauteur nest pas une tche vidente car lanalyse est contrainte au type de
capteurs, la richesse des modes de jeu, la vitesse de calcul de processeurs
et la flexibilit des algorithmes.
Nicholas Collins dans
sa thse de Doctorat[58] a ralis
une recherche approfondie dans la mise au point dalgorithmes danalyse dans le
domaine rythmique, mlodique, et harmonique. Parmi ses rsultats il a distribu
une srie des classes et des outils pour SuperCollider.
Voici une
comparaison entre deux algorithmes ddis calculer la frquence
fondamentale : Pitch de la
distribution standard et Tartini crit par Nicholas Collins.
Dans ce premier
exemple je joue 5 fois larchive son1 dcrit dans les chapitres prcdents. Il
sagit de la corde mi3 de la guitare joue vide. Les deux courbes ont t
normalises, celle du haut est le rsultat de lanalyse avec la classe Pitch, celle du dessous est Tartini. On peut noter que la
diffrence principale se trouve dans lattaque, ou la prcision temporelle de
la deuxime courbe semble suprieure celle de la premire. Toutefois, vu la
complexit du spectre dans le transitoires dattaques on ne peut pas prtendre
avoir une reconnaissance dhauteur prcise.
Dans le deuxime
exemple il sagit des six premires mesures de Forlorne Hope Fancy de John Dowland, une construction
en fugue avec un thme chromatique.
Jai choisi cet
exemple parce que sa ligne chromatique est facilement identifiable et le moment
polyphonique assez claire pour tester la rponse des algorithmes.
On reconnat que les
algorithmes ont des difficults dans une situation polyphonique. Les valeurs
sautent dune voix lautre, les pics peuvent tre des entres de voix
suprieures. On note aussi lhsitation doctave du la forte prsence du
premier harmonique, le bruit avant la premire note est d aux rglages du
seuil minimal damplitude ncessaire pour considrer lanalyse. Jai utilis
les valeurs par dfaut, peut tre sr quune calibration plus dlicate produira
dautres rsultats.
Pour mon
application jai crit deux synthtiseurs pour extraire les valeurs de
frquence fondamentale et lamplitude globale qui doivent ensuite tre affectes
aux paramtres de contrle travers deux buses agissant directement sur les
synthtiseurs.
/* La variable rate contrle la
frquence laquelle les valeurs sont envoyes au synthtiseur, min et max sont
les bornes pour une interpolation des valeurs de sortie */
SynthDef(\ampFollow,{|inBus=31,outBus=10,rate=100,min=0,max=1|
var in,out,count;
in = InFeedback.ar(inBus);
out = Amplitude.kr(in);
out
= out.linlin(0.01,1,min,max);
count
= Impulse.kr(rate);
SendReply.kr(count, 'amplitude',
out);
Out.kr(outBus,out)
}).writeDefFile(SynthDef.synthDefDir);
SynthDef(\pitchFollow,{|inBus=31,outBus=11,rate=100,min=0.01,max=1|
var in,out,count,scale;
in
= InFeedback.ar(inBus);
//out = Tartini.kr(in);
out
= Pitch.kr(in);
scale
= \freq.asSpec;
out
= scale.unmap(out[0]);
out
= out.explin(0.01,1,min,max);
count
= Impulse.kr(rate);
SendReply.kr(count, 'pitch',
out);
Out.kr(outBus,out)
}).writeDefFile(SynthDef.synthDefDir);
Dans le monde de MAXMSP
les travaux raliss par Tristan Jehan[59],
travaillant au MIT, ont permis denrichir les analyses avec dautres aspects
saisissants du point de vue perceptif : Loudness, Brightness, Noisiness bas dans lobjet ~fiddle de
Muller Puckette ont abouti lalgorithme ~analyzer, lequel sera exploit dans
la version MAX prsente plus loin.
Lutilisation des
paramtres du son comme contrleurs donnent un ct vivant et trs dynamique
dans lՎlectronique. Les synthtiseurs son trs ractifs et la boucle dans la
chaine perceptive est favorise. En effet, les gestes se synchronisent avec les
rsultats sonores.
Le dernier aspect
que je voudrais traiter est celui de lenregistrement audio quand on aura
retrouv des sonorits qui peuvent tre rutilises. Cependant lenregistrement
des contrles, cest dire les automatisations et des configurations dans
lՎtat du logiciel pour les charges diffrentes moments mintresse
particulirement.
Je vais commencer
par lenregistrement audio. Dans larborescence de synthse jai construit cinq
groupes de synthtiseurs : le premier regroupe les sources, ce sont ceux
qui nont pas besoin dune entre en amont. Par exemple les fichiers audio, les
entres analogiques et le synthses. Les deuximes et troisimes groupes sont
destins aux traitements car ils reoivent des sources et sont eux mmes source
(rinjection). Au quatrime groupe appartient lenregistreur qui stocke dans un
buffer dure variable tous les signaux assigns dans la matrice. Le cinquime
groupe est celui des spatialisateurs. Ici on ne peut plus remonter
larborescence. Le synthtiseur enregistreur du quatrime groupe sinitialise
en deux temps : Tout dabord on cre le buffer la dure dsire, puis on
lance lenregistrement. Celui-l peut tre rejou et trait travers la
matrice. Il peut donc tre utilis comme une longue ligne retard.
/* Le bus audio numro 32 est assign depuis la matrice, un
courte ligne fonctionne comme fade in, lenregistrement tourne en boucle et
sactualise sur linterface graphique */
SynthDef(\recorder, {|out = 0, bufnum = 31,loop=1,inBus=32|var in;
in
= InFeedback.ar(inBus)*XLine.ar(0,1,0.2);
RecordBuf.ar(in, bufnum, doneAction: 2, loop:
loop);
}).writeDefFile(SynthDef.synthDefDir)
Lenregistrement
de paramtre et les automatisations demandent un procd un peu plus long mais
facilit par les classes Automation et AutomationClient et AutomationGUI crites par Neels J. Hofmeyr[60]
et
distribues depuis 2009.
Cette classe enregistre les changements
continus o les tats de toutes les composantes de linterface graphique
dclare. Les fonctions sont dclenches par des boutons, dans lordre :
> jouer/arrter lenregistrement, << aller au dbut o enregistrer, [ô] snapshot ou photographie dun tat dans linterface
graphique, ^ sauvegarder la sance, charger une sance enregistre
auparavant, le fader montre une position dans le temps, le temps
denregistrement est dfinie lors de la cration par exemple 90 secondes ou
plus.
Touts les objets graphiques affectant
paramtres dans les synthtiseurs sont accessibles depuis la syntaxe : ~values. synthtiseur .
paramtre , par exemple ~values.playersf.vol[2] modifiera le
volume du deuxime lecteur darchives son. Ainsi chaque objet est dclar pour
lautomatisation et ses valeurs avec un indice temporel sont enregistres dans le
dossier presets qui contient un
fichier par paramtre.
son tour les
fonctions de play et stop peuvent tre assignes au clavier
mais elles ne sont pas enregistres, car les dclarer pourrait faire tomber le logiciel
dans une boucle, bien que le programmateur ait conu une fonction verbose pour automatiser
lautomatisation
Lautomatisation
et lenregistrement des tats du logiciel, ainsi que le contrle par courbes,
permettent dallger linterprtation. Mais ils demandent une tape
prliminaire de prparation, ce qui nest toutefois pas contre les principes philosophiques
de limprovisation o de la cration spontane.
3. "Transgressions" Implmentation sur MAXMSP 5
Dans ce chapitre
je vais parler de la version Jabalion pour MAXMSP. Cette implmentation sappelle
Transgressions pour deux raisons : La premire par souci
dorganisation personnelle : dvelopper deux logiciels sur des langages
diffrents et avec le mme nom se prte facilement des malentendus dans les
fichiers et dans les versions intermdiaires ou de transition qui souvent portent
le nom de lapplication plutt que celui du module ou de la version. La
deuxime raison est de caractre historique car Transgressions
est le nom dun projet artistique qua t imagin par le chorgraphe Kenyan
Opiyo Okach avec lequel jai travaill en tant que musicien, et pour lequel
jai commenc le dveloppement de cette application.
Autre que le nom
et quelques qualits propres MAXMSP et la programmation avec des objets
graphiques, les deux logiciels partagent les mmes objectifs et cherchent servir
la mme qute artistique : la cration dun outil pour limprovisation
lectroacoustique. La logique obit aussi au principe dune matrice o on peut
interconnecter des modules de synthse et des modules de traitements, les
paramtres de contrle peuvent tre modifis depuis linterface graphique, le
clavier de lordinateur, une interface MIDI, un jeu de capteurs, une analyse du
son.
Le dveloppement
de cette application dans lenvironnement de MAXMSP ma permis de faire face
aux problmatiques du traitement du signal et de mapping de contrle dune
perspective totalement diffrente de lՎcriture du code, jai approfondi mes
habilits dans la rsolution de problmes de interactivit et programmation dans
MAXMSP.
Les critiques que
jai soulev pour Jabalion sont aussi valables ici. Par exemple ce logiciel a
aussi un caractre ferme, on ne peut pas facilement y ajouter quelque chose,
que ce soit des modules de synthse ou de traitement ou de contrle. Cela
demanderait de rviser dlicatement le code, le mapping de signaux, et dajuster linterface graphique puis de recompiler
et de tester. Une solution pour ceci pourrait tre dimaginer un systme pour
grer des plugins ou ajouts pour permettre dajouter
dautres patchs, objetsetc.
Jai pu tester
dans des situations de concerts les deux logiciels allant ainsi lՎtage
suprieur de la conception de loutil, celui de lexpression artistique. Une
fois sur scne la pression du publique et la concentration musicale ne laissent
pas place au programmateur. Tout doit fonctionner sans soucis et les
ventuelles blocages doivent tre pralablement tudis et surmonts bien avant
de la reprsentation publique.
Une fentre
principale o tous les contrles sont la porte de main, la matrice avec les
traits distinctifs de MAXMSP, par exemple les tiquettes informatives que
saffichent quand la souris pointe un objet (ici linformation principale est
le nombre du control assigner dans les diffrentes modalits dinteraction),
des textes boutons pour ouvrir et fermer les fentres de chaque module, des
raccourcis claviers pour visualiser ou surveiller lՎtat de la chaine de
synthse.
Enfin tout dans
cette fentre rvle une profondeur plusieurs niveaux dans larchitecture logicielle.
Par exemple en cliquant sur le text-buton FMSynth , une interface
graphique donne accs aux paramtres globaux du synthtiseur (notes, enveloppes,
panic bouton). L on peut rentrer encore dans une de voix du poly pour tudier
ou modifier le comportement du synthtiseur. lintrieur de cette voix
polyphonique plusieurs abstractions simplifient la lecture et divisent le
travail accomplir : gestion des enveloppes, oscillateurs de modulation, et
organisation de liste de paramtres.
Voici la
description de larchitecture, sans trop rentrer dans les dtails. Ceux-ci peuvent
tre explors sparment depuis le dossier transgression dans le cd accompagnant
ce travail, voici la description de larchitecture du logiciel.
Depuis la fentre
principale on a accs 33 outres fentres distribus comme suit.
Sources ou moteurs de synthse |
|||
Nom |
Description |
Objets principaux |
Paramtres de contrle / ID |
ADC |
entres analogiques (2) |
adc~, vst~, filtergraph, biquad~ |
Volume/1,2 Frquence filtre /4,5 Dry-wet /3,221 Gate /6 |
File1File6 |
Lecture de ficiers audio. Transposition et vitesse de lecture indpendantes (FFT) |
supervplayer~ waveform~ |
Loop, /17 Play, /18 Crazy, /19 Crazy-spped, /29 File, /16 Transposition, /21 Speed, /22 Frquence filtre /23 Coefficients timbre /24..28, Volume /20 |
Orgue |
Synthtiseur monophonique. Modulation de phase |
cycle~ multislider |
Note /144 KeyVelocity /145 Duration /147 Attack time Release time Chord 8 intervales. Random chord /191 Mute /190 Volume /143 |
FMSynth |
Synthetiseur polyphonique. Modulation de Frquence |
poly~ cycle~ function kslider |
Note /144 KeyVelocity /145 Duration /147 Attack time Release time Harmonicity /147 Index de modulation Amplitude Courbe AllNotesOff Volume /148 |
Additive |
Synthse additive, 20 composantes, Modulation lentes. |
add_synth~ multislider |
On-off /178 Freq fond. /149 Transposition /150 Shift /151 LFO transp /152 LFO freq /153 LFO profondeur /154 Random chord /155 Frquence de 20 partiels Volume /156 |
Sampler |
Lecture polyphonique dun chantillon. Vitesse de lecture-notes MIDI |
poly~ sfplay~ umenu |
Note /144 KeyVelocity /145 Attack time /222 Release time /223 File AllNotesOff Volume /157 |
Granular2 |
Synthse granulaire sur un fichier charg en mmoire, polyphonique |
play~ wave~ poly~ rslider |
On-Off /174 Scrub /134 Position Duration /136,137 Transposition /138,139 Grains sparation /135 Play,Stop,Resume Load sound Volume /140 |
Recorder |
Enregistr et jou |
groove~ waveform~ |
Play /196 Rec /193 Transposition /197 Duration /199 Filter freq /198 Save Volume /142 |
Traitements |
|||
Pitch Shifter |
Dcalage frquentielle |
pit_shift~ |
Shift /100 Scale max shift Scale min shift Volume /101 |
Ring Modulation |
Modulation en anneau |
cycle~ scale |
Reference freq /102 Factor modulation /103 Volume /104 |
Overdrive |
Distorsion, fonction non linaire |
overdrive~ biquad~ filtergraph |
Facteur distorsion /106 Freq filtre /105 Volume /107 |
Flanger |
Ligne retarde, modulation |
flange1~ |
Filter tunning /108 Portamento /109 Feedback /110 Volume /111 |
Echos |
Ligne retard, multitaping |
tapein~~ tapeout~ multislider coll |
Taille du buffer Clear Duration liste (8) Amplitude liste (8) Feedback /169 Feedback level /112 Acumulateur liste /113 Mute /195 Volume /114 |
Rverbration |
Ligne retard |
tapein~ tapeout~ allpass~ onepole~ comb~ |
Size /115 Decay Time /116 Damping Difussion Volume /117 |
Harmonizer |
Ligne retard, transposition, rinjection. |
harmonizerv2~ |
Transposition /118 Depth /119 Delay /120 Feedback /121 Volume /122 |
CrossSynthesis |
Multiplication damplitudes, phases, de deux entres, dans le
domaine frquentielle |
pfft~ fftin~ fftout poltocar cartopol |
Mult amplitudes /123 Mult archives / 124 Mult phases /125 Volume /126 |
Granulation |
Granulation dune entre |
munger~ |
Grain sparation /127 Grain rate /128 Grain size /129 Size Variation /130 Grain Pitch /131 Pitch Variation /131 Presets /170 Randomisation /171 Metro Random /172 Rate random /173 Mute /179 Volume /133 |
Panus |
Panoramic quadraphonique |
expr cos expr sin qlist pictslider |
Position /176 Automatisation on /175 Tempo automat /158 |
Position (8) |
Huit sorties position dans une quadraphonie |
pictslider |
Position /160167 |
Contrle |
|||
Motion Tracking |
Suivi de mouvement dun point avec une camera, points de
dclanchement spatiale. |
jit.qt.grab jit.rgb2luma cv.jit.track jit.matrix jit.submatrix |
Active-Inactive Selection dun point dans limage suivre Zones de dclanchement |
Analizer |
Dtection dhauteur, des attaques, suivie de Loudness, Brightness,
Noiseness. 40 envoie possibles |
analizer~ scale dot.autoscale |
On-Off Send to controller Speedlim Scale min, max in Scale min, max out Scale courbe Autoscale Recalibrate Umenu Source |
Tables Control |
Cinq tables avec contrle de vitesse |
table sprintf metro |
On-Off /180 Speed /181 |
Keyboard |
Assigner de contrleurs aux touches de clavier 20 sliders, 10
toogles, 10 bangs, Un clavier MIDI dune octave. |
key Iioa atoi zl |
Active-inactive |
MIDI In |
Six canaux notein, key velocity, neuf entres de sensors
analogiques ou contrleurs midi, Program Change, |
sensor-tamer ctlin sprintf |
On-Off Port Scale |
MIDI setting |
Permet dassigner un contrleur MIDI diffrents paramtres, sauvegarder
et charger les configurations, fonction learn midi |
ctlin coll zl |
CC number Clear Open Save load |
Score |
20 qlist et deux espaces texte pour envoyer des ordres au logiciel
et pour crire la fonction init. |
qlist txtedit atoi itoa timer |
Play Stop Open Write Read |
Sept autres
fentres permettent de surveiller diffrentes parts du programme, davoir des
objets cachs dans des fentres conues pour, et dՎconomiser lusage du cpu
qui est trs couteux pour tous les objets graphiques de monitoring.
CPU status
DSP status
IO matrice assignant les canaux dentres et sorties
Meters un indicateur de niveau pour chaque module
MIDI test
Audio test
Readme
La syntaxe pour contrler
un de 200 paramtres est ID control -controlslider, La liste complte
dIDs, est consultable dans larchive Readme , Id est une chiffre entier pour identifier
numriquement chaque paramtre de contrle.
La sauvegarde de
configurations et des tats du logiciel sont pris en charge par sept objets pattrstorage appelles dans mon patch
partitura pour de
raisons dorganisation et pour les identifier sparment :
Partitura1 : matrix
Partitura2 : paramtres de contrle
Partitura3 : Analyzer
Partitura4 : Tables
Partitura5 : MIDI in
Partitura6 et 7 : Keyboard (clavier de lordinateur)
Enfin, une fentre
shortcuts permet de configurer des
raccourcis claviers en assignant une touche du clavier pour ouvrir ou fermer
les fentres dcrites plus haut. Il est aussi accompagn des fonctions de
sauvegarde, de charge de configuration ; La possibilit dactiver ou de
dsactiver cette fonction est assez importante pour viter les conflits avec
lobjet Keyboard
Bien que
lapproche soit similaire dans les deux applications, les rsultats, les dfis,
les facilits et les difficults diffrent. Avoir choisi de construire des
architectures similaires avec deux environnements tout fait diffrents ma
permis de faire une valuation comparative dans tous les tages dՎcriture,
depuis les brouillons, la planification, l Ԏcriture elle mme, les tests
et la prsentation publique.
Il nest pas
facile de se dire que celui-ci dpasse celui-l dun point de vu sonore, car
lapprciation ou le jugement objectif des qualits sonores est une opration
bien complexe et sujette des variables de caractre subjectif qui sont
difficiles matriser, quantifier, voire mme identifier. Sans vouloir
mexcuser derrire ces difficults pour ne pas donner mon opinion dans ce
sujet, je vais exposer mes ressenties.
Pour ce chapitre,
jai essay de soumettre les deux logiciels aux mmes conditions matrielles,
cest dire une carte motu 828, une paire denceintes Bx5 de Maudio, une
frquence dՎchantillonnages 44.1Khz, une taille de vecteur 64, un
ordinateur MacBook 2.4Ghz de 2G de mmoire ram avec le systme oprative OS X
10.5.8, ainsi quau mme espace acoustique dՎcoute. Je mappui galement sur
mes souvenirs et sur les traces laisses par les exprimentations et concerts.
La sensation
globale en jouant sur Jabalion est celle dun spectre qui senrichie
facilement, trs dynamique et il y a une sorte de dfinition prcise dans les
contours. Avec Transgressions le son parat plus opaque ou sombre une sorte de
limite quelque part, une ligne plus diffuse. Ceci est peut tre d larchitecture
de deux plateformes et au post traitement (?) du signal avant sa
conversion numrique-analogique, ou la prcision lՎchantillon prs (sample accuracy).
Cette sensation de
luminosit , de brillance , de dՎclatement
ou de clart , peut tre mis en cause et tudi de plus prs. Par
exemple, les synthses stochastiques fonctionnent trs bien dans Jabalion mais
je suis plus satisfait de la lecture darchives avec supervplayer~, notamment
dans le ralentissement trs pouss. Les textures granulaires sont plus
intressantes dans Jabalion. Cependant cela dpend beaucoup de larchive
dorigine et de la construction du patch. Pourtant Granular2 donne de trs bons
rsultats. Ici, je voudrais insister sur le fait, que dans les deux cas jai
opt pour ne pas utiliser de filtres numriques avant la sortie car je pense
quil est intressante de laisser ces dernires rglages au matriel externe compltant
la chaine lectroacoustique : tables de mixage, amplificateurs,
hautparleurs ou enfin les systmes de diffusion propres chaque salle.
La ractivit ou
mieux la latence, indpendante du systme et de lordinateur me semble lgrement
plus prononc sur Transgressions. Un temps ou une cadence est subtilement plus
lourde. Encore une fois, est-ce d la sparation trs claire entre le langage
et le moteur de synthse de SuperCollider ? Peut tre. Les opinions sur ce
sujet sont trs varies et dans les espaces de discussion (forums internet),
cela ressemble plus une confrontation politique questhtique. Il est trs
difficile dobjectiver les apprciations sans avoir les sons et les conditions
dՎcoute normalises.
Au niveau du contrle,
la gestion des automatisations fait une grande diffrence. Les interpolations
de diffrents tats enregistrs avec la mcanique de pattstorage se diffrencient nettement de lenregistrement
multiparamtrique sur un axe temporel de gestes proposs par Automation. Le rsultat est vraiment
diffrent. Il est plus facile denregistrer un mouvement que dՎcrire de qlist o des enchainements
dinterpolations dans le pattstorage.
Enfin sur la gestion du temps en MAXMSP plusieurs solutions ont vu le jour,
comme, par exemple lobjet timeline (supprim dans la version 5). Cela ne
veut pas dire que la gestion temporelle soit plus effective dans SuperCollider.
La page blanche atemporelle comme point de dpart est plutt une ressemblance
entre ces deux environnements.
Il est vrai que le
point fort de la programmation sur MAXMSP est la facilit dessiner
linterface graphique : formes, tailles, couleurs, positions, ombres,
anglesetc. Dans mon cas personnel, jai vite compris le pige de passer trop
de temps dessiner une interface graphique avec toute sorte darabesques. Temps
prcieux pour la programmation musicale et pour les dfis imposs pour les
traitements du signal. Par contre japprcie beaucoup les outils danalyse
dimage et la facilit mettre en place une dtection trs simple avec la camra
intgre de lordinateur et dans les librairies de Jitter, tche pas si vidente
que a dans SuperCollider.
Linitialisation
du programme a t plus facilement organisable dans Jabalion. Il y existe une
classe startup dans laquelle on peut
crire une routine avec des tapes de validation de lutilisateur pour grer
lordre dinitialisation de la librairie, slection des pilotes audio et MIDI,
initialisation du serveur, chargement des fichiers, prparation de buffers et cration
de synthse.
Dans
Transgressions il est dangereux de laisser cette fonction dinitialisation aux objets
loadbang et loadmess. On est en effet jamais sr de lordre et de la hirarchie
dans lequel ces messages sont valus. Il mest arriv comme dautres utilisateurs
avec de grands projets davoir fait une erreur dans la programmation et de ne
plus tre capable douvrir le patch car un des messages est tomb dans une
boucle.
La seule solution
a t de travailler le patch dans un format texte et dy retrouver et de
modifier les messages posant des problmes dans le texte. Tche lourde de
comprendre ce code quon ne croise presque jamais et qui est cach au profit
des objets graphiques. Dans SuperCollider sil y a une erreur dans lՎcriture
le logiciel ne sarrte pas et indique dans quelle ligne se trouve lerreur.
Un dernier point
que je voudrais rapporter est celui de la distribution. Il est cent fois plus
facile de construire une application autonome et dy travailler avec
SuperCollider quavec MAXMSP. Laccs aux sources est trs prcieux, ajouter
des mthodes personnelles une clase est si simple quՎcrire une fonction prcde
par + le nom de la classe, sauvegarde dans un fichier et puis
place au bon endroit et cest tout. En MAXMSP une fois le script de cration
dapplication autonome, valu on na plus accs au code, donc au moindre
changement il faut recommencer lopration et les externals sont intouchables, sauf si on retrouve la source et on
recompile tout en C++, mais faire circuler les sources nest pas du tout une
habitude parmi les utilisateurs MAXMSP, tandis que pour SuperCollider on peut
beaucoup apprendre grce la lecture de sources distribues publiquement.
Avec la prtention
de srnit et le bouclier de la subjectivit, jai cherch faire une comparaison
entre ces deux langages et sans vouloir le dire jai fini par le dire et
prendre un parti silencieux pour la philosophie, larchitecture logiciel et les
rsultats sonores produits et rencontrs dans les expriences avec
SuperCollider, toutefois je suis conscient du caractre ludique de MAXMSP et le
travail trs important dՎnormment de musiciens et programmateurs qui ouvrent
plusieurs voies pour lexpression lectroacoustique. Jai beaucoup appris dans
cet environnement.
Pour illustrer
lutilisation des ces deux applications jai ajout dans le CD accompagnant
cette mmoire, trois extraits des pices joues au long de ces deux annes.
Ma collaboration
avec le coregraphe Opiyo Okach a commenc dans lanne 2007 avec la pice
take it away
pour le festival dAvignon. Je me suis identifi avec la recherche
dimprovisation dans la danse mene par Opiyo.
Cet extrait montre
un passage de la pice Border Border
Express present au Basse Festival Birmingham en
Juin 2009. Le danseur est en face dune projection de quelques vidos
enregistres la main sur les strotypes et les ides reus sur le Kenya. Les
manifestations, la terre tropicale, les meutes, le discours politiques,
Kenyata, Obama, linfluence de la musique congolaise et Lumumba, le
postcolonialisme, les tribus des
Kambas, Swahilis.
L ide est
inspire de petits taxis charriots pousss par des jeunes la frontire entre
le Kenya et la Tanzanie et lide de frontires et de transgression. Ides que
collent trs bien avec mes projets dans le langage musical.
Jutilise pour ce
passage des fichiers son et de traitements, pour crer une densit
sonore : le bruit du monde
Cet exemple est
tir dun concert au Fylkingen Stockholm, avril 2009, en duo avec le
compositeur et artiste sonore Alejandro Montes de Oca Torres. Il sagit dune
libre improvisation o tous les deux avons des guitares, capteurs, contrleurs.
Entre fvrier et Mars 2010 jai t
invit la Sibelius Academy
de Finlande pour diriger un atelier sur improvisation lectroacoustique, cela a
t donc lopportunit pour tester les deux applications dun point de vue
pdagogique. A la fin du sminaire nous avons raliss une performance publique
incluant trois danseurs, un comdien et six musiciens, la dure totale tait
dune heure.
Arrivant a ce
point je doit mentionner les difficults, les russites, les points faibles et
les leons apprises avec ce travail.
Si je reprend
mes objectifs du dbut, je considre avoir men bon terme lՎcriture de cet
environnement pour limprovisation. Jai eu lopportunit de lutiliser dans de
performances publiques, ils sont arrivs au stade de standalone application qui est
portable dune machine lautre, tout en suivant les limites de caractristiques
du systme requis (jai eu loccasion de travailler que sur de machines
Machintosh).
Concernant les
attentes ergonomiques et de facilits de fonctionnement je considre pouvoir
aller encore un pas plus loin, car les moteurs et techniques de synthse
explores et travailles peuvent senrichir encore plus et peuvent, par
exemple, comporter de chaines de synthse plus complexes. Toutefois, jai
russi crire un systme de presets,
de chargement automatique, de contrles assignables au clavier, une interface
MIDI, une analyse du son et linterface graphique plutt simple.
Concernant
limprovisation musicale, je ne suis pas compltement satisfait car jai
ralise la tournure technique informatique musicale qua pris ce
document au dtriment de laspect langage et esthtique propre au monde de
limprovisation. Malgr tout quelques rflexions issues de la rflexion
technique mouvrent les portes pour assumer une future recherche, par exemple,
un systme danalyse par lignes : ligne dynamique, ligne dՎvolution dans
le matriel, ligne dramatique ; limportance de la ractivit sonore, une
possibilit de construction du logiciel au tour des axes : variation,
contraste, rptition ; ou bien : densit (quantit dՎvnements par
unit de temps), monophonie, polyphonie, organisation rythmique et temporelle.
Enfin une tude mieux balance entre technologique et rflexion musicale.
Jai beaucoup
appris de la programmation par code en SuperCollider et de la programmation
avec des objets graphiques avec MAXMSP, ses particularits, ses diffrences, sa
logique propre.
Cette exprience
dans la programmation vient complter mon parcours qui, depuis ma formation au
Conservatoire National, tait plus centre dans le dveloppement de hardware ou
de interfaces physiques et lexploration de geste musical. Ce nest pas
prmatur donc dimaginer comme consquence logique de cette trajectoire le
cheminement vers une thse de Doctorat o lobjet de la recherche porterait
la fois dans la rflexion esthtique, les outils technologiques, une
mthodologie et une pdagogie de limprovisation lectroacoustique.
Improvisation Musicale
Jacques Aboucaya et Jean-Pierre Peyrebelle Du Be-Bop au Free Jazz Presses
universitaires du Mirail, 2001, Toulouse
Derek Bailey Limprovisation,
sa nature et sa pratique Editions Outre-Mesure, 1999, Paris. Traduit
de langlais par Isabelle Leymarie
Lawrence CASSERLEY A
Digital Signal Processing Instrument for Improvised Music , Journal
of Electroacoustic Music, vol 11, 1998, London
Pierre-Albert Castanet Tout est bruit pour
qui a peur, Pour une histoire sociale du son sale , Editions Michel
de Maule, 2007, Paris
Daniel FISCHLIN, Improvisation and the Unnameable: On
Being Instrumental
Critical Studies in improvisation, 2009, Ontario, Canada
Vinko Globokar Rflexions
sur limprovisation : le point de vue dun praticien Analyse
Musicale n14, 1989, Paris
Wolfgang Knig Vinko Globokar, Komposition und Improvisation
Editions Breitkopf & Hrtel, 1977, Wiesbaden, Allemagne
Denis Levaillant Improvisation musicale : essai sur la
puissance du jeu Editions Actes Sud Beaux Arts, 1996, Paris
L Quan Ninh L'improvisation : une pratique libertaire
Infos & Analyses Libertaires n 43 - novembre 1997, Toulouse
Michel Ratt L'Expressivit de l'oubli, essai sur le sentiment
et la forme dans la musique de la modernit , Editions La Lettre
Vole, 1999, Bruxelles
Michel Ratt Rinterprter
limprovisation musicale, limprovisation comme forme Musicworks
Journal ; N 66, 1996, Toronto, Canada
Alain Savouret La place de linvention immdiate dans les
musiques daujourdhui Musique du 20e sicle, confrences et sminaires
1996-1998 Universit de Paris-Sorbonne
Patrick Scheyder, Dialogue sur LImprovisation
Musicale Editions lHarmattan, 2006, Paris
INTERFACES
Joel Chadabe The
Voltage-Controlled Synthesizer The Development and Practice of
Electronic Music, Englewood Cliffs
Editions, 1975, New Jersey
Genevois Hugues,
Raphal DE VIVO Les nouveaux gestes de la musique Editions
Parenthses, 1999, Marseille
Gerard NICOLLET, Vincent BRUNOT Les chercheurs de sons
Editions Alternatives, 2004, Paris
Hugues VINET, Franois DELALANDE Interfaces homme-machine
et cration musicale Hermes Science Publications, 1999, Paris
Max Vandervorst Lutherie
Sauvage Editions
Alternatives 1997, Paris
Bradley WAIT and Alain RINZLER Guitar Synth and MIDI from
the Guitar Player Magazine. GPI Publications, 1988, Cupertino
California.
Collectif, Syntetizeur, Control Devices , The
New Grove Dictionary of Musical Instruments 1984, Macmillan.
INFORMATIQUE MUSICALE
Denis Gabor Acoustical quanta and
theory of hearing 1947, Nature Vol.159
Sergi Jord Digital
Lutherie: Crafting musical computers for new musics performance and
improvisation 2005, Ph.D.
dissertation, Dept. of Computer Engineering, Universitat Pompeu Fabra,
Barcelona.
Robert ROWE Interactive Music Systems: Machine Listening
and Composing . 1993, The MIT Press, Cambridge
T. Winkler Composing Interactive Music:
Techniques and Ideas Using Max 1998, The MIT Press, Cambridge
Laurent BAYLE La synthse sonore Editions
IRCAM, 1993, Paris
Puckette Miller, Theory and Technique of
Electronic Music , 2007, World Scientic Publishing Co. Pte. Ltd.
California
Curtis ROADS The Computer Music
Tutorial 1996, The MIT press.
Curtis ROADS Granular synthesis of
sound 1985.Cambridge, The MIT Press
SCHROEDER Manfred, Natural sounding artificial
rverbration , 1961 Journal of the Audio Engineering Society N10.
NewYork
ESTHETIQUE
John CAGE Silence Editions Denol, 2004, Paris,
Traduction par Monique Fong
Hugues Dufourt. Mathesis
et Subjectivit Des conditions historiques de possibilit de la
musique occidentale. Editions MF, avril 2007, Paris
Umberto Eco Luvre
ouverte Editions du seuil 1965, Paris, traduit de litalien par
Chantal Roux de Bzieux
George Lewis Too
Many Notes: Computers, Complexity and Culture Leonardo Music
Journal N 10, The MIT Press, 2000, Cambridge
Pierre SCHAEFFER Trait des objets Musicaux
Editions du seuil, 1966 Paris
Wilhelm BRUCK Pro Muisca Nove. Studies for Playing
Contemporary Music For Guitar 1992 Breitkopf & Hrtel, Wiesbaden
Germany.
LINKS
Limproviste, http://sites.radiofrance.fr/francemusique/em/improviste
Etudes critiques en improvisation http://www.criticalimprov.com/index.php/csieci/index
European Free Improvisation, http://www.efi.group.shef.ac.uk/
Hyperinstruments, http://www.media.mit.edu/hyperins/projects.html
Videobass, http://www.anyma.ch/videobass/
Luthrie
lectronique, http://www.omf.paris4.sorbonne.fr/AUX/Lutherie.htm
Guitare MIDI, http://home.epix.net/~joelc/midi_git.html
INDEX DE
FIGURES
Figure 1
Formes dondes obtenues avec le procd stochastique employ en Gendy.................................. 19
Figure 2 Frequency Shift, dplacement spectral CD plage 2........................................................................ 22
Figure 3 Modulations wah CD plage 3.......................................................................................................................... 23
Figure 4 Diagramme des bloques rverbration daprs
lalgorithme de Schroeder............................ 24
Figure 5 Effet de rverbration CD plage
4................................................................................................................... 26
Figure 6 Interface Graphique pour le contrle
des multidelay............................................................................ 29
Figure 7 Forme donde multidelays CD plage 5............................................................................................................... 29
Figure 8 Rinjection ligne retard modul CD plage 6............................................................................................. 32
Figure 9 Application de la transforme
conforme au son1 CD plage 7.............................................................. 36
Figure 10 Effet de freezer, spectre
gel CD
plage 8.................................................................................................. 38
Figure 11 Module de
rverbration IXIQuarks.............................................................................................................. 46
Figure 12 Najo Max Interface.................................................................................................................................................. 46
Figure 13 Matrix Logiciel
Tapemovie................................................................................................................................. 47
Figure 14 Matrix Jabalion......................................................................................................................................................... 48
Figure 15 Intreface
graphique OMAX................................................................................................................................. 54
Figure 16 Jeu de
potentiomtres Jabalion......................................................................................................................... 57
Figure 17 Fentre Principale
et menu Jabalion............................................................................................................. 57
Figure 18 Panoramique............................................................................................................................................................... 62
Figure 19 Forme donde et
Liste darchives Lecture des fichiers.......................................................................... 65
Figure 20 Multislider 100
points, liste de paramtres affecter, vlocit. Tables............................ 67
Figure 21 Tableau du MIDI
mapping...................................................................................................................................... 69
Figure 22 Interface Clavier pour
assigner le contrle de paramtres............................................................ 70
Figure 23 Pdale circulaire Arduino................................................................................................................................... 80
Figure 24 Dtection dhauteur par
zro crossing......................................................................................................... 81
Figure 25 Plot, courbe
comparative dtection dhauteur dune note rpte.............................................. 83
Figure 26 Dbut de la tablature Forlorn
Hope Fancy de John Dowland, thme chromatique................ 83
Figure 27 Comparaissons de rsultats de lanalyse
du morceau de Dowland CD plage 9......................... 84
Figure 28 Interface Graphique de
Automatisation.................................................................................................. 86
Figure 29 Fentre principale Transgressions................................................................................................................. 88
[1]
Claude Riset dans Interfaces
homme machines, Hermes
Science, 1999
[2] Voir les travaux et les exprimentes raliss au Laboratoire dAcoustique Musical par Charles Besnainou sur des plaques de Marimba et tables de rsonance des violons
[3] Curtis.
Roads, Improvisation
with George Lewis ditions. Composers and the
Computers Los Altos, CA: William Kaufmann, 75-87. 1985.
[4]
Gerorges Lewis, Colloque Analyser
limprovisation IRCAM,
Paris Fvrier 2010
[5]
Umberto Eco Luvre
ouverte Editions du seuil 1965, traduit de litalien par Chantal
Roux de Bzieux. Titre original Opera Aperta
[6]
Conservatoire National Suprieur de Musique et Danse de Paris, classe
dimprovisation Gnrative, Masterclass Barb Phillips, 2007
[7] Pour
une tude musicologique sur l'criture contemporaine l'ouvrage de Dominique et
Jean Yves Bosseur "Rvolutions Musicales" chez Minerve 1999. Offre un
large aperu
[8] Je me permets dՎnoncer cette ide trs
personnelle car depuis mon exprience en tant quimprovisateur et dans le
milieu de la cration jai pu constat comme le poids culturel de notre socit
joue dans la dfinition et le sens de proprit dans les crations musicales.
On nՎcrit pas plusieurs et les droits dauteur nous poussent une jalousie
sur les uvres, il faut respecter la signature () Je vois un danger dans
lidoltrie de lindividu crateur tout puisant et infiniment intelligent. Il
ne sagt pas non plus dune opposition radicale entre composition et
improvisation, car il est clair que la libre improvisation connat des
limites : quand le nombre de musiciens arrive la dizaine, lՎcoute est
plus difficile, lanarchie sonore devient courante, les principes
dauto-organisation formels sont brouills et le groupe finit souvent par se
scinder. Cest une des raisons qui a permis de dvelopper des thories comme le
sound painting or LIVE
COMPOSITION par Walter
Thompson. Ou le directeur improvisateur, Agusti
Fernandez lESMUC de Barcelone, ou bien le projet COBRA o John
Zorn dirige une improvisation dun BigBand,
en proposant des combinaisons et des tats. Sur ce point je reconnais
lhabilet des compositeurs pour grer les grands formats et les grandes
formes. Aussi, je ne voudrais pas
non plus aller jusquՈ nier le plaisir de lՎcriture et du projet compositionnel, simplement je remarque que le
monde de limprovisation nous aide lever des mythes et regarder plus
humblement lacte crateur.
[9]
Les implications musicales
de la synthse par modulation de frquence ont t tudies par John Chowning
dans les annes soixante-dix luniversit de standford et une partie de ses
rsultats figure dans Synthesis
of Complex Audio Spectra by Means of
Frequency Modulation
dans le journal of the audio
engineering society 21 (7) 1973.
[10]
Iannis Xenakis dans "Formalized
Music" 1992, Stuyvesant, NY: Pendragon Press chapitre 9 (pp 246-254) et
chapitres 13 et 14 (pp 289-322).
[11]
MOORE Allan, Rock, The Primary Text. Developing a musicology of rock , ditions Open University Press, 1994, Buckingham and
Philadelphia.
[12] ROADS Curtis, The computer Musical Tutorial The MIT press Cambridge 1996, Fixed Delay Effects, pag. 435
[13]
Signal-Based Performance Evaluation of Dereverberation Algorithms
Patrick Naylor, Nikolay Gaubitch, and Emanul Habets. Communications and Signal
Processing Group, Department of Electrical and Electronic Engineering, Imperial
College, London.
[14] SCHROEDER Manfred, Natural sounding artificial rverbration , Journal of the Audio Engineering Society 10, 1961.
[15]
McAdams and BERGMAN, Hearing Musical Streams , computer
musical journal 3, pag, 26-44, 1979.
[16] Puckette
Miller, Theory and Technique of Electronic Music , World Scientic Publishing Co. Pte. Ltd. 2007, pages
209 - 210.
[17] Idem, section 4.3.2 Switch-and-ramp
[18]
Le crnelage (ou crnelage) ou repli de spectre (Aliasing en anglais) est un
phnomne qui peut se produire lors du traitement numrique d'un signal,
lorsque des frquences qui ne sont pas reprsentes dans le signal original
sont introduites par erreur dans le signal
[19]
CROQUETTE Vincent, La transforme de Fourier discrte
Fvrier 2009, Ecole Normale Suprieure de Paris
[20] HARRIS On the use of Windows
for harmonic analysis with the discrte Fourier transform ,1978,
Proceedings of the IEEE N 66.
[21]
COOLEY and TUKEY, An algorithm for the machine computation of complex
Fourier series , Mathematical Computation N19, 1965
[22] ARFIB Daniel et KRONLAND-MARTINET Richard
Transformer le son : modeler, modliser Les Cahiers
de LIRCAM, 1993, Paris
[23] J.-R. Argand La reprsentation dans le plan des nombres complexes , 1806, Bibliothque Nationale de France Paris.
[24]
Trott, M. The
Mathematica GuideBook for Programming , Springer-Verlag, 2004 New York
[25]
Manuel ROCHA ITURBIDE Searching for a global synthesis technique
through a quantum conception of sound , Not published yet. 2001.
http://artesonoro.net
[26] Denis Gabor Acoustical quanta and
theory of hearing 1947, Nature Vol.159,
page 591
[27] Curtis ROADS Granular
synthesis of sound 1985.Cambridge, The MIT Press
[28]
Olivier BELANGER et Dominic THIBAULT, Analyse Synthse et Traitement
des Sono , 2009, Facult de Musique, Universit de Montral
[29]
Nathan Edwin WOLEK A Simplified Interface for Granular Processing
Based on Perceptual Research
North Western University, 2005, ILLINOIS
[30] A ce moment-l, on a considr que la lumire tait constitue par ondes lectromagntiques de caractre continu; cette thorie nՎtait pas rfute par Einstein, car De Broglie a confirm que la lumire pouvait se manifester en forme dondes ou en forme de particules quantiques.
[31]
Rocha Iturbide, Les techniques granulaires
dans la synthse sonore . Thse Doctoral sous la direction dHoracio
Vaggione. University of Paris VIII. 1999 France.
[32] Dans cette
section je vais moccuper du mapping
audio, le contrle tant dveloppe la section 2.1.6.
[33]
Thor Magnusson
The
IXIQUARKS: Merging code and gui in one crative space 2008, Creative Systems Lab Department of Informatics
University of Sussex, Angleterre.
[34]
Anne SEDES De lespace sonore la visualisation du son : un
parcours musicologique, technologique et artistique Dossier
dhabilitation diriger des recherches, Universit Paris VIII
[35] Gerard ASSAYAG Omax the
software improviser Tutorail Ircam 2008
[36] Bernard Lubat, Mike Garson, Philippe Leclerc, Hlne Schwarz, Guerino Mazzola
[39] Jutilise aussi dautres objets
graphiques tirs de librairies, soit celle de la distribution standard comme
pour la fentre du Serveur et dump tree ou bien
celle distribue par luniversit de Weysellan pour les fentres sound
test et midi test .
[40]
Pour connatre les valeurs relles de chaque paramtre il faut se reporter au
code dcrit pour chaque synthtiseur dans la section 2.3.
[41]
Sur la manque de contrle
conscient dans lՎlectronique en temps rel et dans limprovisation, portent
les critiques les plus svres comme celles de Jean Claude Risset, exprimes
lors dune confrence luniversit de Paris VIII (dcembre 2009).
[42] En ayant dans lesprit, lordinateur
comme une reprsentation instrumentale , d au relais nergtique
pour lexcitation ou mise en vibration produite par lՎlectricit.
[43] Lemur Interface Jazzmutant
Manuel de lutilisateur 2008 BORDEUX, France.
[44]
Claude Cadoz Musique
Geste Technologie Les Nouveaux Gestes de La Musique, Editions,
Parenthses, 1999
[45]
Cependant dans la pratique jai toujours fait confiance
une pdale de volume externe pour grer sparment le contrle du niveau
globale.
[46]
Par exemple dans la guitare la
dure dune note est lie au caractristiques acoustiques de celle-ci et pas au
temps denfoncement dune touche, cest dire quavec le codage MIDI classique
associant la guitare un synthtiseur, le premire phnomne est davoir des
sons bas trs longs par rapport aux sons aigus dont la dure est beaucoup moins
importante. Des envelopps ou des dures fixes peuvent aider manier cet effet
mais un algorithme de correction peut tre plus intressant.
[47]
Les
messages MIDI multicanaux sont bien une suite srielle de valeurs.
[48]
Hugues Dufourt Mathesis
et Subjectivit , Des conditions historiques de possibilit de la
musique occidentale. Editions MF, avril 2007
[51]
OLARTE Guitanthetizeur,
une Interface gestuelle pour le pilotage de la synthse prsent
pour lobtention du prix dacoustique musicale au Conservatoire National de
Musique et Danse de Paris, 2008
[53]
Un chargeur d'amorage (ou bootloader) est un logiciel permettant de lancer un
ou plusieurs systmes d'exploitation (multi-boot), c'est--dire qu'il permet
d'utiliser plusieurs systmes, des moments diffrents, sur la mme machine.
[54]
Le design matriel de l'Arduino est distribu sous licence Creative Commons Attribution Share-Alike 2.5 et est disponible sur
le site d'Arduino. Les schmas ainsi que les typons de circuits sont galement
disponibles. Le code source de l'environnement de programmation et les
librairies embarques sont disponibles sous licence LGPL.
[55]
Pour des dtails propos de la transforme discrte et rapide de Fourier voir
le chapitre
Curtis Roads
Spectrum Analysis Computer Music Tutorial, 1996
[56]
Cours dAcoustique Musical, Conservatoire National de Musique et Danse de Paris
(2003)
[57]
Application de rseaux de neurones artificiels la reconnaissance
automatique de caractres manuscrits, Facult Polytechnique de Mons,
Bernard GOSSELIN
[58]
Towards Autonomous Agents for Live
Computer Music: Realtime Machine Listening and Interactive Music Systems Nicholas M. Collins, St.Johns College Centre for
Music and Science Faculty of Music
University
of Cambridge 2008
[59]
Tristan Jehan, Creating Music by Listening Massachusetts
Institute of Technology, 2000
[60]
Neels Hofmeyr, Elego
Software Solutions , 2009, GmbH, Berlin. Germany