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

% ------------------------------------------------------

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

\lstinputlisting{code/midibeep.ck}



% ------------------------------------------------------

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

% ------------------------------------------------------

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


% ======================================================
