\chapter{Son}
\label{chap:son}

Abordons maintenant un sujet complexe :
le son en général,
la musique (p. \pageref{chap:musique}) et la
synthèse de sons (p. \pageref{chap:modular}).

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

\section{ALSA}
\index{ALSA}

ALSA, \textit{Advanced Linux Sound Architecture}, gère 
à peu près correctement les entrées/sorties sonores 
d'une machine Linux, aussi bien en audio qu'en
\textsc{midi}\footnote{Voir page \pageref{chap:MIDI}
pour en savoir plus.}.

Nous allons faire le tour de quelques outils associés.
En premier, le « centre de contrôle », 
\texttt{alsamixer}, dont la qualitée de l'interface
en Curses\index{curses} est époustouflante :

\begin{figure}[h]
  \begin{center}
  \includegraphics[scale=0.50]{chap/alsamixer}
  \caption{Alsamixer}
  \end{center}
\end{figure}

Ensuite, nous avons \texttt{aplay} et \texttt{arecord},
qui permettent d'écouter et d'enregistrer les sets de 
James Lewis\footnote{Que ça, c'est de la super noise !}.

\subsection{arecord}

Si vous avez plusieurs cartes son, la sélection du
\textsl{device} est assez piégeuse~: ce n'est pas
l'option \texttt{-l} qui vous donnera la bonne piste,
mais l'option \texttt{-L} qu'il faut utiliser.

\begin{verbatim}
arecord -D plughw:CARD=Snowball,DEV=0 -v -r 22050 foo.wav
\end{verbatim}

\begin{verbatim}
arecord -D plughw:CARD=H4,DEV=0 -v -c 2 -f S16_LE -r 44100 foo.wav
\end{verbatim}

\subsection{Du code...}

\begin{verbatim}
        int
       main()
      {float f
    ;char c;int
  d,o;while(scanf(
 "%d%c%d ",&d,&c,&o)
>0){c&=31;for(f=!(c>>4)*55,c=(c*8/5+8)%12+o*
                     12-24;c--;f*=1.0595);
                        for(d=16e3/d;d--;
                           putchar(d*f
                            *.032))
                              ;}}
\end{verbatim}

https://zserge.com/posts/etude-in-c/

https://www.alsa-project.org/alsa-doc/alsa-lib/pcm.html

\subsection{Le reste}

Et quand on regarde par la lorgnette du programmeur, on découvre
rapidement que l'utilisation d'ALSA n'est pas si simple que
ça, essentiellement à cause d'une documentation spartiate.
Heurensement, pour certains domaines, il existe des
surcouches plus simple d'emploi :
\texttt{libao}\index{libao} pour les sorties
sonores, XXX\index{XXX} pour le reste.

ALSA apporte aussi les primitives et des utilitaires
de gestion des interfaces MIDI\index{MIDI}. Là aussi,
la doc est sommaire. Quelques explications
sur la page \pageref{chap:MIDI}.

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

\section{Configurer Alsa}

TODO\index{XXX}

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


\section{pulseaudio}
\index{pulseaudio}
\label{pulseaudio}

On avait pourtant dit « \textbf{pas de trolls} », mais il va quand
même falloir y passer : ce machin prétenduement
\textsl{michu compliant}\index{Michu}
 a parfois, voire même souvent, tendance à se mettre en travers
du chemin des honnètes gens%
\footnote{Du moins vers l'année 2014}.

%------------------------------------------------------------------
\section{Jack}
\index{Jack}

Jack Audio Connection Kit : ce sous-système\footnote{Dans le monde
Linux, on aime bien les sous-systèmes pour le son.} est
destiné avant tout aux professionnels de la musique. 
Je vais attendre le retour de mon spécialiste préféré pour
lui laisser le soin d'en parler.

Jack peut aussi servir de source sonore pour
darkice\index{darkice}, lequel pourra feeder un
serveur de stream comme Icecast\index{icecast}
(cf page \pageref{chap:streaming}).


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

\section{libsndfile}
\label{libsndfile}
\index{libsndfile}

Libsndfile est essentiellement une très complète bibliothèque
de lecture et écriture de fichiers sons.
Elle permet de gérer facilement un nombre
considérable de formats de fichiers\footnote{Mais ceci est une autre
histoire, que nous verrons peut-être un de ces jours\dots}.

Elle arrive avec une floppée d'outils en ligne de
commande, dont certains sont assez performants.
Citons, entre autres, \texttt{sndfile-resample} qui est un
convertisseur de fréquence d'échantillonage très
performant\footnote{Et probablement basé sur \textsl{Secret Rabbit Code}}.

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

\section{libao}
\label{libao}
\index{libao}

C'est une bibliothèque de fonctions pour gérer les sorties sonores
d'une application
(\textsl{Libao is a cross-platform audio library that allows programs
 to output audio using a simple API on a wide variety of platforms.}).
Elle supporte une grande variété de formats.

\lstinputlisting[language=C]{code/ao_example.c}

La configuration se fait par deux fichiers :
\texttt{/etc/libao.conf} surchargeable par
\texttt{\$HOME/.libao.conf}, et schématiquement, nous pouvons
voir qu'elle est à deux niveaux.

https://www.xiph.org/ao/doc/drivers.html

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

\section{Portaudio} \label{Portaudio} \index{Portaudio}

Une suggestion de Wargreen pour avancer un peu dans la construction
de ma DAW\footnote{Digital Audio Workstation, aka machine à sons}
\textsl{custom-made} à mon idée\dots

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

\section{Ladspa}
\index{ladspa}

Ladspa, mais c'est quoi ? C'est l'acronyme de 
« Linux Audio Developers Simple Plugin API », ou, en français :
« machin avancé ».

La commande \texttt{listplugins}, comme son nom l'indique, fournit
la liste de tous les plugins accessibles. Comment y acceder est
une question dont la réponse est laissée à votre bonne volonté.

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

\section{Sox}
\index{Sox} \label{Sox}

Sox est le « couteau suisse » des manipulateurs de données
sonores. Sa documentation étant assez ésotérique, je vais
faire comme d'hab' : présenter des exemples approximatifs.


\subsection{Conversions}

Nous avons un process quelconque qui nous délivre des données
en format texte, tel que celles-ci, deux valeurs par ligne, 
normalisées dans l'intervalle $]-1,1[$, et nous voulons obtenir
un .Wav vanille.

\begin{verbatim}
0.286498189155 0.33310689881
0.0500751550941 -0.326965910932
-0.01317994812 -0.392365740013
-0.353560435178 -0.018978716441
\end{verbatim}

Voici comment faire dans un contexte de \textit{Makefile} :

\begin{verbatim}
random.wav:	random.dat Makefile
        @echo " conversion " $< $@
        sox --rate 44100 $< $@
\end{verbatim}

\subsection{Génération}

\begin{verbatim}
play -n synth sine 480 sine 620 remix 1-2 fade 0 0.5 delay 0.5 repeat 5
play -r $[28*1024] -b 16 -c 2 -e signed-integer -t raw /dev/sda -S
play -r $[8*1024] -b 8 -c 1 -e unsigned-integer -t raw /dev/sda -S
\end{verbatim}

\subsection{Traitements}

\texttt{sox --norm[=dB-level] source.wav normal.wav} pour
normaliser un son.
\textsl{Automatically invoke the gain effect to guard  against
clipping and to normalise the audio}.

\texttt{sox left.wav right.wav -M stereo.wav} pour combiner deux 
voies mono en un fichier stéréo. \texttt{-M} est l'abréviation
de \texttt{--combine merge}.

Dupliquer
la piste d'un fichier mono pour obtenir un fichier stéréo :
"\texttt{sox - -t wav -b 16 - remix 1 1}" avec le premier tiret
qui dit de prendre l'entrée standard

Questions en attente : comment combiner huit pistes monophoniques
en un seul fichier contenant ces 8 pistes ? 

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


\section{espeak}
\index{espeak}

Logiciel de synthèse vocale. Mais c'est pas comme un
spo256al2, hélas.

\begin{verbatim}
tth@plop:~/RADIO$ espeak --voices=fr
Pty Language Age/Gender VoiceName       File        Other Langs
 5  fr             M  french            fr          
 7  fr             M  french-mbrola-1   mb/mb-fr1   
 7  fr             F  french-mbrola-4   mb/mb-fr4   
 5  fr-be          M  french (Belgium)  fr-be 
tth@plop:~/RADIO$ cat hello.txt | espeak
 \end{verbatim}

Comme à l'accoutumée, nous allons chercher un contexte d'utilisation
futile et réjouissant. Le texte qui sera « parlé » sera la sortie
de la commande \texttt{ddate}\index{ddate}%
\footnote{outil indispensable de la vie numérique
\texttt{http://www.subgenius.com/}}, avec une voix
d'outre-monde, sur un seul canal, ce que nous pouvons entendre avec
"\texttt{echo \$(ddate) | espeak-ng}".



%------------------------------------------------------------------
\section{ecasound} \index{ecasound}


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

\section{Pour finir...}

En conclusion, le son avec Linux, c'est un peu la grande foire.
On arrive parfois même à y voir du
XML\index{XML} dedans et c'est en page \pageref{icecast2}
pour les courageux. On peut aussi carrément utiliser un langage
spécialisé comme \textit{liquidsoap}\index{liquidsoap}.


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

