You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
260 lines
8.0 KiB
260 lines
8.0 KiB
\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}. |
|
|
|
|
|
%------------------------------------------------------------------ |
|
|
|
|