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


1. Introduction

 

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.

2.1. SuperCollider

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.

 

2.2. Synthtiseurs et moteurs de Synthse

 

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.

2.2.1. 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

 

2.2.2. Lecture de fichiers sons

// 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.

2.2.3. Synthse

Les trois synths suivants produisent des donnes audio en utilisant trois algorithmes diffrents de synthse.

 

2.2.3.1. Modulation de Frquence

// 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.

2.2.3.2.  Gendy

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.

formesd-onde.tif

Text Box: Figure 1  Formes dondes obtenues avec le procd stochastique employ en Gendy

class=Section10>

2.2.3.3.  k-means

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));

 

2.3. Traitements du Signal

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.


2.3.1 Modulations

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.

 

freqshift-ramp-10_2000hz-mi3.tiff

 

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.

 

wah_spectrum.tiff

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.

2.3.2 Lignes retard

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.


2.3.2.1 Rverbration

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.

 

diagrama_reverb_schroeder.tif

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.


reverberation-dump.tiff

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.

2.3.2.2 Retards Longs et Structures Rythmiques

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.

 

multidelays-gui.tiff

 

 

 

 

 

 

 

 

 

 

 

 

 

Text Box: Figure 6 Interface Graphique pour le contrle des multidelaySur 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.

Text Box: Figure 7 Forme donde multidelays CD plage 5delays-random.tiff

 

 

 

 

 


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.

2.3.2.3 Modulation du temps de retard

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].

 

Text Box: Figure 8 Rinjection ligne  retard modul CD plage 6Pour 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%

delay-modulated-3ms100feedback.tiffLes 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. 


2.3.3 Analyse de Fourier

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


2.3.3.1 Conformal Map

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.

 

complex4_3.tiff

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.


2.3.3.2 Freezer

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);

 

freezer2moments.tiff

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.


2.3.4. Granulation

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. 

2.4 Matrix et Audio Mappings.

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.

 

ixi-freeverb.tiff

                                                                                   

 

 

 

 

 

 

Text Box: Figure 11 Module de rverbration IXIQuarksIci, 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.

nmi-routing.tiff

 

 

 

 

 

 

 

 

 

 

Text Box: Figure 12 Najo Max Interface


class=Section33>

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.

 

Text Box: Figure 13 Matrix Logiciel Tapemovietapemovie-matrix.tiff

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

        


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.

Text Box: Figure 14 Matrix Jabalionjabalion-matrix.tiffRegardant 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 ?


2.5 GU Interface Graphique

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.

 

omax-windows.tiff

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.

jabalion-process-window.tiff

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Text Box: Figure 16 Jeu de potentiomtres Jabalion

                                              

Cette fentre peut tre ouverte depuis une fentre de commande qui est toujours au front du logiciel

Text Box: Figure 17 Fentre Principale et menu Jabalion

 

 

 

 

 

 

 

 

 

 

 

 

Ou depuis le  menu bar  dans le menu principal du logiciel ou avec un raccourci clavier


2.5.1. Potentiomtres et indicateurs de niveau

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}}


2.5.2 Panoramique

jabalion-panus-window.tiffCi-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.

Text Box: Figure 18 PanoramiqueLa 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;})})}


2.5.3 Lecteur de Fichiers

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.

 

 

Text Box: Figure 19 Forme donde et Liste darchives Lecture des fichiersAvec 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)}}

 


2.5.4 Lecteur de tables

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.

Text Box: Figure 20 Multislider  100 points, liste de paramtres  affecter, vlocit. Tablesjabalion-kr-window.tiff

/* 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.


2.5.5 Tableau MIDI

Dans cette interface graphique il sagit dun tableau o les contrleurs midi sont assigns aux contrleurs de synthtiseurs.

Text Box: Figure 21 Tableau du MIDI mappingjabalion-midimapping-window.tiffVoici 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.


2.5.6 Clavier de lordinateur

jabalion-keyboard-gui.tiff

 

 

 

 

 

 

 

 

 

 

 

 

Text Box: Figure 22 Interface Clavier pour assigner le contrle des paramtres

 

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.


2.6. Contrle

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.


2.6.1 Linterface ordinateur

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.


2.6.2 LInterface MIDI

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.


2.6.3. Arduino, captation du geste

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.

pedale2.tiffLa 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.

Text Box: Figure 23 Pdale circulaire Arduino

 

 

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.


2.6.4. Le son contrleur

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.

Text Box: Figure 24 Dtection dhauteur par zro crossing

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.

 

pitch-tartini-mi3.tiff

 

 

 

 

 

 

 

 

 

 

 

Text Box: Figure 25 Plot, courbe comparative dtection dhauteur dune note rpte

 

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.

dowland-score.tiff

 

 

 

 

 

 

 

 

 

Text Box: Figure 26 Dbut de la tablature Forlorn Hope Fancy de John Dowland, thme chromatique


class=Section63>

Jai choisi cet exemple parce que sa ligne chromatique est facilement identifiable et le moment polyphonique assez claire pour tester la rponse des algorithmes.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Text Box: Figure 27 Comparaissons de rsultats de lanalyse du morceau de Dowland CD plage 9

 

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.

2.6.5. Sauvegarde et enregistrement

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.

jabalion_automation.tiff

 

 

 

Text Box: Figure 28 Interface Graphique de Automatisation

 

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.

 


transgressions_main.tiff3.1. Prsentation de la version MAXMSP 5

Text Box: Figure 29 Fentre principale Transgressions

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 


3.2. Comparaison avec Jabalion

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.

 


4. ANNEXES

 

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.

4.1."Border Border Expres" Olarte / Okach, Electronique et Danse

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 

4.2."Coco duro" Olarte / Montes de Oca Torres, Guitare et lectronique

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.

 

4.3."Workshop Helsinki Meeting Point"/ Sibelius Academy Finlande.

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.

 


5. Conclusions

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.

 


6. Bibliographie.

 

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

[37] http://www.ircam.fr/equipes/repmus/OMax

[38] http://www.vimeo.com/ixi

 

[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

[49]   Tod MACHOVER, Hyperinstruments: a progress report , 1987-1991, Massachusetts Institute of Technology. Media Laboratory

[50] Claude Cadoz dans Les Nouveaux Gestes de La Musique  Editions, Parenthses 1999

[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

[52] http://www.interface-z.com/index.htm

 

[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