2020-09-27 17:15:15 +02:00
|
|
|
\chapter{Son}
|
2020-11-13 01:35:31 +01:00
|
|
|
\label{chap:son}
|
2020-09-27 17:15:15 +02:00
|
|
|
|
2021-10-15 23:22:38 +02:00
|
|
|
Abordons maintenant un sujet complexe :
|
|
|
|
le son en général,
|
|
|
|
la musique (p. \pageref{chap:musique}) et la
|
|
|
|
synthèse(p. \pageref{chap:modular}).
|
2020-09-27 17:15:15 +02:00
|
|
|
|
|
|
|
%------------------------------------------------------------------
|
|
|
|
|
|
|
|
\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
|
2021-08-03 10:21:30 +02:00
|
|
|
\textsc{midi}\footnote{Voir page \pageref{chap:MIDI}
|
2020-09-27 17:15:15 +02:00
|
|
|
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
|
2020-11-27 14:44:53 +01:00
|
|
|
James Lewis\footnote{Que ça, c'est de la super noise !}.
|
2020-09-27 17:15:15 +02:00
|
|
|
|
|
|
|
\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,
|
2020-11-13 01:35:31 +01:00
|
|
|
mais l'option \texttt{-L} qu'il faut utiliser.
|
2020-09-27 17:15:15 +02:00
|
|
|
|
2020-12-12 04:13:54 +01:00
|
|
|
\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}
|
|
|
|
|
2020-12-22 22:53:57 +01:00
|
|
|
\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
|
|
|
|
|
2020-09-27 17:15:15 +02:00
|
|
|
\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
|
2020-12-12 04:13:54 +01:00
|
|
|
surcouches plus simple d'emploi :
|
|
|
|
\texttt{libao}\index{libao} pour les sorties
|
2020-09-27 17:15:15 +02:00
|
|
|
sonores, XXX\index{XXX} pour le reste.
|
|
|
|
|
2020-12-12 04:13:54 +01:00
|
|
|
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}.
|
|
|
|
|
2020-09-27 17:15:15 +02:00
|
|
|
%------------------------------------------------------------------
|
|
|
|
\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
|
2020-12-12 04:13:54 +01:00
|
|
|
du chemin des honnètes gens%
|
|
|
|
\footnote{Du moins vers l'année 2014}.
|
2020-09-27 17:15:15 +02:00
|
|
|
|
|
|
|
%------------------------------------------------------------------
|
|
|
|
\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
|
2020-12-12 04:13:54 +01:00
|
|
|
serveur de stream comme Icecast\index{icecast}
|
|
|
|
(cf page \pageref{chap:streaming}).
|
2020-09-27 17:15:15 +02:00
|
|
|
|
|
|
|
|
|
|
|
%------------------------------------------------------------------
|
|
|
|
|
|
|
|
\section{libsndfile}
|
|
|
|
\label{libsndfile}
|
|
|
|
\index{libsndfile}
|
|
|
|
|
|
|
|
Libsndfile est essentiellement une très complète bibliothèque
|
2020-12-12 04:13:54 +01:00
|
|
|
de lecture et écriture de fichiers sons.
|
2020-09-27 17:15:15 +02:00
|
|
|
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}.
|
|
|
|
|
2020-12-12 04:13:54 +01:00
|
|
|
Elle arrive avec une floppée d'outils en ligne de
|
2020-09-27 17:15:15 +02:00
|
|
|
commande, dont certains sont assez performants.
|
|
|
|
Citons, entre autres, \texttt{sndfile-resample} qui est un
|
2021-05-04 10:33:30 +02:00
|
|
|
convertisseur de fréquence d'échantillonage très
|
|
|
|
performant\footnote{Et probablement basé sur \textsl{Secret Rabbit Code}}.
|
2020-09-27 17:15:15 +02:00
|
|
|
|
|
|
|
%------------------------------------------------------------------
|
|
|
|
|
|
|
|
\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.
|
|
|
|
|
2020-11-22 21:07:05 +01:00
|
|
|
\lstinputlisting[language=C]{code/ao_example.c}
|
2020-09-27 17:15:15 +02:00
|
|
|
|
|
|
|
%------------------------------------------------------------------
|
|
|
|
|
|
|
|
\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
|
2020-11-13 01:35:31 +01:00
|
|
|
la liste de tous les plugins accessibles. Comment y acceder est
|
|
|
|
une question dont la réponse est laissée à votre bonne volonté.
|
2020-09-27 17:15:15 +02:00
|
|
|
|
|
|
|
%------------------------------------------------------------------
|
|
|
|
|
|
|
|
\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
|
2020-11-13 01:35:31 +01:00
|
|
|
faire comme d'hab' : présenter des exemples approximatifs.
|
2020-09-27 17:15:15 +02:00
|
|
|
|
|
|
|
|
|
|
|
\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}
|
|
|
|
|
2020-11-13 01:35:31 +01:00
|
|
|
\begin{verbatim}
|
2020-09-27 17:15:15 +02:00
|
|
|
play -n synth sine 480 sine 620 remix 1-2 fade 0 0.5 delay 0.5 repeat 5
|
2021-06-29 09:58:26 +02:00
|
|
|
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
|
2020-11-13 01:35:31 +01:00
|
|
|
\end{verbatim}
|
2020-09-27 17:15:15 +02:00
|
|
|
|
|
|
|
\subsection{Traitements}
|
|
|
|
|
2020-12-12 04:13:54 +01:00
|
|
|
\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}.
|
2020-09-27 17:15:15 +02:00
|
|
|
|
|
|
|
\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}.
|
|
|
|
|
2020-12-22 22:53:57 +01:00
|
|
|
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 ?
|
2020-10-26 23:06:17 +01:00
|
|
|
|
2020-09-27 17:15:15 +02:00
|
|
|
%------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
\section{espeak}
|
|
|
|
\index{espeak}
|
|
|
|
|
2020-12-22 22:53:57 +01:00
|
|
|
Logiciel de synthèse vocale. Mais c'est pas comme un
|
|
|
|
spo256al2, hélas.
|
2020-09-27 17:15:15 +02:00
|
|
|
|
|
|
|
\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
|
2020-12-22 22:53:57 +01:00
|
|
|
tth@plop:~/RADIO$ cat hello.txt | espeak
|
2020-09-27 17:15:15 +02:00
|
|
|
\end{verbatim}
|
2020-12-22 22:53:57 +01:00
|
|
|
|
|
|
|
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}".
|
|
|
|
|
|
|
|
|
2020-09-27 17:15:15 +02:00
|
|
|
|
|
|
|
%------------------------------------------------------------------
|
2020-12-22 22:53:57 +01:00
|
|
|
\section{ecasound} \index{ecasound}
|
|
|
|
|
2020-09-27 17:15:15 +02:00
|
|
|
|
2020-12-22 22:53:57 +01:00
|
|
|
%------------------------------------------------------------------
|
2020-09-27 17:15:15 +02:00
|
|
|
|
|
|
|
\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}.
|
|
|
|
|
|
|
|
|
|
|
|
%------------------------------------------------------------------
|
|
|
|
|