\chapter{Son} \label{chap:son} %------------------------------------------------------------------ \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{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} %------------------------------------------------------------------ \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}. %------------------------------------------------------------------