TetaTricks/chap/son.tex
2024-09-17 18:59:10 +02:00

316 lines
9.7 KiB
TeX

\chapter{Son}
\label{chap:son}
Abordons maintenant un sujet complexe :
le son en général, et en particulier avec Linux.
Vous pouvez aussi regarder
la musique (p. \pageref{chap:musique}) et la
synthèse de sons (p. \pageref{chap:modular}).
Complexe, parce que, il faut bien se le dire
entre nous, je me permet d'affirmer avec vigueur que la gestion du son
dans Linux est horriblement compliquée, pour ne pas dire
totalement bordélique.
C'est un empilement de couches logicielles, chacune destinée à
un usage particulier, et qui passent leur temps à se marcher
sur les pieds.
%------------------------------------------------------------------
\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 !}.
Ils partagent beaucoup d'options communes.
\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{aplay} \index{aplay}
C'est le pendant de arecord pour écouter des fichiers sonores.
Avec pas mal d'options communes.
\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}
%------------------------------------------------------------------
%
% bienvenu dans le monde de LP
\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 les années 2014/2019}.
%------------------------------------------------------------------
\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,
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
\subsection{Choisir la sortie}
Pour choisr comment et vers quelle prise physique libao va envoyer
le son, il y a deux choix à faire. La partie logicielle d'une part
(aixs, oss, alsa, jack, sndio\dots)
et la partie matérielle (jack 3.5 standard, casque audio USB\dots).
%------------------------------------------------------------------
\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 ?
Quelles métriques Sox peut-il extraire ? Eg: \textsl{spectrogram}.
%------------------------------------------------------------------
\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}.
%------------------------------------------------------------------