\chapter{Modulaires} \label{chap:modular} Comment définir un synthétiseur modulaire en quelques mots ? Disons que c'est un synthé dont chaque composant élémntaire est indépendant, et interconnectable aux autres par un gros plat de cables sans parmesan. Un univers intrigant et infini. % ====================================================== \section{Chuck} \index{Chuck} Chuck peut être vu comme un équivalent logiciel à ce système de cablage. Nous avons sour la main des modules, que nous allons raccorder et paramétrer grace à l'opérateur \texttt{=>}. Le module \texttt{dac} correspond à la sortie audio de votre machine. Voici donc un premier exemple, sans la moindre prétention musicale~: \lstinputlisting{code/beep.ck} Félicitation, vous venez de coder un diapason rudimentaire. La première ligne connecte un oscillateur sinusoïdal directement sur la sortie audio, les deux suivantes règlent le volume et la hauteur du signal généré, et la dernière demande d'attendre deux secondes avant d'arreter. Mais je suis bien d'accord avec vous, ce son est un peu agressif, surtout dans l'attaque. Hop, nous allons brancher un nouveau module entre le générateur et la sortie~: un contrôleur d'enveloppe qui atténuera la brutalité de l'attaque et la violence de la fin du son. \lstinputlisting{code/bipenv.ck} C'est déja mieux \textit{:)} Détaillons les quatre dernières ligne de ce script~: deux nous sont déja connues, celles où l'on met une \textsl{duration} dans le \texttt{now} afin d'attendre un certain temps. quand aux deux autres (qui sont des appels de méthode, reconnaissables à la paire de parenthèses qui les terminent) elles déclenchent le debut et la fin du contrôleur d'enveloppe. Quand on actionne le \texttt{keyOn}, le processeur d'enveloppe commence avc un gain à 0 et monte progressivement au gain maximal dans le temps réglé au préalable dans \texttt{e.duration}. De la même façon, \texttt{keyOff} fait redescendre le volume à 0 à la fin du beep sur la même durée, et pour entendre cette partie finale , il nous faut attendre un peu, d'où la dernière ligne. Et avant de passer à la suite, voyons un peu le coté plus « informatique » de Chuck. La séquence d'instruction finale de l'exemple précédent peut être vu comme un bloc unique, puisque il n'a qu'une seule finalité~: générer le beep\index{beep}. Et pour ça, nous allons les regrouper dans une \textbf{fonction} que voici que voilà : \begin{verbatim} fun void beep() { e.keyOn(); 2::second => now; e.keyOff(); 1::second => now; } \end{verbatim} Pour l'utilisation de cette fonction, c'est dans la partie suivante. Bienvenue dans le monde merveilleux des lignes de code. % ------------------------------------------------------ \subsection{Les filtres} Le son que nous avons utilisé dans les précédents exemples est une sinusoïde, un son « pur » que l'on peut qualifier sans crainte de légèrement pauvre. Nous allons régler ça. Vous pouvez déja essayer de remplacer le sinus par une onde carrée, un \texttt{SqrOsc}, bien remplie d'harmoniques. C'est ce que nous allons faire, mais nous allons aussi rajouter un filtre passe-bande pour moduler la couleur du son. \lstinputlisting{code/bipfilter.ck} Puisque la fréquence de notre \textit{beep} est calée à 440 Hz, nous allonc chercher les harmoniques supérieures vers 1337 Hz, avec une largeur de bande assez grande. Et nous obtenons un son bien plus brillant, mais encore un peu inerte. Prochaine étape, brancher un LFO sur ce filtre\dots % ------------------------------------------------------ \subsection{Beep à vibrato} Les choses vont un peu se corser, avec la notion de \textsl{multi thread}. Un grand mot pour une chose (relativement) simple. En fait, une partie du script va s'exécuter indépendament du reste, un peu comme l'autonomie de votre LFO matériel. \lstinputlisting{code/bipvibrato.ck} Et nous retrouvons la notion de fonction. % ------------------------------------------------------ \subsection{Attack Decay Sustain Release} \index{ADSR} Un module d'enveloppe bien plus élaboré, fidèle aux canons de l'époque. Son utilisation est semblable à \texttt{Envelope} que nous avons vu plus haut, ce qui nous donne ce patch~: \begin{verbatim} SqrOsc s => BPF f => ADSR adsr => dac; \end{verbatim} Point suivant : configurer notre ADSR. Il y a bien plus de potards que dans l'exemple précédent : attack time et rate, decay time et rate, release time et rate et sustain level pour finir. % ------------------------------------------------------ \subsection{Jouer des samples} Oui, on peut. On peut même faire des choses assez fun. Juste un example un peu brouillon et qui manque de rigueur, essentiellement sur le calcul de la durée d'écoute de l'échantillon en fonction du \textsl{pitch}. Mais, en attendant mieux : \lstinputlisting{code/playsample.ck} Bien entendu, il vous faudra créer le fichier avec l'échantillon sonore. J'ai utilisé un fichier de quatre secondes échantilloné à 22050 Hz. Et j'entend un esprit chagrin râler au fond de la salle : « oué, nous on veut du gros son ». Patience, nous allons d'abord voir les briques avant de construire le mur. % ------------------------------------------------------ \subsection{Dialoguer en MIDI} \index{MIDI} \label{chuck-midi} Oui, on peut. Et nous allons faire des \textsf{beep} à partir d'un clavier ou du séquenceur d'une electribe. Attention, une petite connaissance du protocole MIDI est nécessaire. Vous trouverez quelques explications page \pageref{chap:MIDI}. Le petit bout de code qui suit vous affiche les triplets reçus en charabia numérique. Leur décriptage est laissé en exercice à nos lecteurs. \lstinputlisting{code/midibeep.ck} Cet exemple est volontairement simple, voire même minimaliste, afin de ne pas surcharger cet ouvrage. Mais je vous rappelle que les exemples sur le site sont très instructifs. % ------------------------------------------------------ \subsection{Communication OSC} \index{OSC} \label{chuck-osc} OSC, Open Sound Control, a son chapitre dédié en page \pageref{chap:OSC}. Nous allons nous concentrer sur les aspects Chuck. J'ai bien une idée d'exemple, mais ce soir, c'est soirée "flemme". % ------------------------------------------------------ \subsection{Enregistrer} Il est aussi possible de générer des fichiers .WAV à partir d'un script Chuck. \subsection{Aller plus loin} Et pour la suite, allez onsulter http://chuck.cs.princeton.edu/ et http://chuck.stanford.edu/ pour tout savoir. La rubrique des exemples est très instructive. % ====================================================== \section{Super Collider} Là, nous rentrons dans le domaine de la jeune Nina, je vais donc lui,laisser la plume (ou le clavier). % ====================================================== \section{CSound} \index{Csound} % ======================================================