Compare commits

..

6 Commits

Author SHA1 Message Date
tTh
2a7624eb75 another big push 2020-12-22 22:53:57 +01:00
tTh
7722aef9d3 oh, this is a commit ! 2020-12-12 04:13:54 +01:00
tTh
499944159f beurk beurk 2020-12-11 15:07:40 +01:00
tTh
2b73698aef work on streaming 2020-12-11 15:06:59 +01:00
tth
99eae15038 blabla again 2020-11-27 14:44:53 +01:00
tth
c6d8042995 my Perl is rusted... 2020-11-27 14:43:55 +01:00
28 changed files with 606 additions and 77 deletions

2
.gitignore vendored
View File

@ -1,6 +1,6 @@
log.* log.*
*.png # *.png
MANIFEST MANIFEST
tarball tarball

View File

@ -75,10 +75,10 @@ des serveurs DNS. Par défaut, il questionne les serveurs
listés dans \texttt{/etc/resolv.conf}. listés dans \texttt{/etc/resolv.conf}.
Pour résoudre récursivement un nom de domaine à partir de la racine : Pour résoudre récursivement un nom de domaine à partir de la racine :
\$ dig +trace <nom.de.domaine> \texttt{\$ dig +trace <nom.de.domaine>}
Pour le reverse d'une adresse IP : Pour obtenir le reverse d'une adresse IP :
\$ dig +trace -x <adresse.ip> \texttt{\$ dig +trace -x <adresse.ip>}
% ------------------------------------------------------------ % ------------------------------------------------------------
% \subsection{delv} % \subsection{delv}

18
chap/Fortran.tex Normal file
View File

@ -0,0 +1,18 @@
\chapter{Fortran} \label{chap:Fortran} \index{Fortran}
Fortran (\textsc{FORmula TRANslator}) est, avec le Cobol\index{Cobol},
un des premiers langages évolués. Il a été conçu après la seconde
guerre mondiale, en 1954, par
John Warner Backus, ingénieur en radiophonie chez IBM\index{IBM},
\section{F77}
Dernière version à exiger le format '80 colonnes' des cartes perforées,
cette version est aussi (aux yeux de vieux dinos) la plus pure,
à cause d'instructions comme le \textsl{computed goto} ou le
mythique \textsl{comefrom}. Nom officiel : \texttt{ANSI X3.9-1978}.
\section{Et après} \index{gfortran}
Puis ce langage du passé a subi une évolution lente vers quelque
chose de bien plus moderne. Les dinos vont devoir s'adapter.

View File

@ -7,8 +7,8 @@
\section{hybrid} \section{hybrid}
\index{hybrid} \index{hybrid}
C'est le serveur utilisé par Smeuh. Une vrai galère à C'est le serveur anciennement utilisé par Smeuh. Il semble que
configurer. ce soit une vrai galère à configurer.
On se retrouve vite dans des situations critiques, du genre On se retrouve vite dans des situations critiques, du genre
un \#canal où il n'y a plus de @op, et donc, on ne peut un \#canal où il n'y a plus de @op, et donc, on ne peut
@ -42,3 +42,9 @@ pinpin0: çhârsèt ?
Client graphique bien efficace. Client graphique bien efficace.
% ============================================================== % ==============================================================
\section{Les "bots"}
Hello Dotanick.
% ==============================================================

View File

@ -106,7 +106,8 @@ Client 128 : "TiMidity" [User]
Plutôt que de passer par la couche ALSA, il est aussi possible Plutôt que de passer par la couche ALSA, il est aussi possible
d'attaquer directement le \textit{device}, et de blaster soi-même d'attaquer directement le \textit{device}, et de blaster soi-même
tous les petits octets directement sur le fil. Voici un petit tous les petits octets directement sur le fil. Voici un petit
exemple en Python\footnote{Oui, je sais, c'est un langage de djeunz, exemple en
Python\index{Python}\footnote{Oui, je sais, c'est un langage de djeunz,
mais bon, ça fait plaisir à mon gamin}, facilement transposable mais bon, ça fait plaisir à mon gamin}, facilement transposable
dans un langage plus sérieux : dans un langage plus sérieux :
@ -137,7 +138,6 @@ for valeur in range(30,90):
tx.close() tx.close()
\end{lstlisting} \end{lstlisting}
% --------------------------------------------------------- % ---------------------------------------------------------
\section{Et en Perl ?} \section{Et en Perl ?}
@ -159,6 +159,12 @@ MIDI::Simple (3pm) - procedural/OOP interface for MIDI composition
MIDI::Track (3pm) - functions and methods for MIDI tracks MIDI::Track (3pm) - functions and methods for MIDI tracks
\end{verbatim} \end{verbatim}
Un petit essai, par exemple extraire la valeur du \textsc{bpm}
d'un fichier \texttt{.mid} ?
\lstinputlisting[language=perl]{code/midifile.pl}
Voilà.
% --------------------------------------------------------- % ---------------------------------------------------------

View File

@ -5,7 +5,7 @@ Wikipedia :
\textsl{OSC est un format de transmission de données entre ordinateurs, \textsl{OSC est un format de transmission de données entre ordinateurs,
synthétiseurs, robots ou tout autre matériel ou logiciel compatible, synthétiseurs, robots ou tout autre matériel ou logiciel compatible,
conçu pour le contrôle en temps réel. Il utilise le réseau au travers conçu pour le contrôle en temps réel. Il utilise le réseau au travers
des protocoles UDP\index{UDP} ou TCP\index{OSC} et apporte des des protocoles UDP\index{UDP} ou TCP\index{TCP} et apporte des
améliorations entermes de rapidité et flexibilité par rapport améliorations entermes de rapidité et flexibilité par rapport
à l'ancienne norme MIDI\index{MIDI}\dots} à l'ancienne norme MIDI\index{MIDI}\dots}
@ -13,7 +13,7 @@ Actuellement, j'utilise (pour le C) \texttt{liblo}\index{liblo}
qui reste simple qui reste simple
à utiliser tout en permettant de descendre à un bas niveau. à utiliser tout en permettant de descendre à un bas niveau.
Cette bibliothèque est livrée avec deux outils que nous Cette bibliothèque est livrée avec deux outils que nous
allos voir maintenant. allons voir maintenant.
\section{oscdump \& oscsend} \section{oscdump \& oscsend}
\index{oscdump}\index{oscsend} \index{oscdump}\index{oscsend}
@ -36,7 +36,13 @@ tth@debian:~$
\section{Exemple de code} \section{Exemple de code}
TODO\index{TODO} Ecouter :
\lstinputlisting[language=c]{code/listen-osc.c}
Envoyer :
\lstinputlisting[language=c]{code/send-osc.c}
\section{Autres logiciels} \section{Autres logiciels}

75
chap/Perl.tex Normal file
View File

@ -0,0 +1,75 @@
\chapter{Perl} \label{chap:Perl} \index{Perl}
Également connu sous le nom de
\textsl{Pathologically Eclectic Rubbish Lister}%
\footnote{collectionneur pathologique de déchets variés},
Perl est un langage qui a été crée en 1987 par Larry Wall comme un
substitut moderne au classique combo shell/sed/awk.
\index{shell} \index{sed} \index{awk}
Il est de ce fait très orienté vers la manipulation de
données textuelles et contient d'énormes facilités d'utilisation
des expressions régulières.
Il fut un temps, dans le siècle précédent, où il était le maitre
incontesté du Web\index{web} interactif, de par son intégration
dans le serveur Apache\index{Apache},
et de modules d'écriture de clients http\index{http}.
Le débutant peut facilement n'utiliser qu'un sous-ensemble du langage,
mais ce serait se priver de quelques \textit{patterns} assez
efficients.
% ------------------------------------------------------
\section{Le texte}
Un cas concret~: générer du code en langage \texttt{C} à partir
d'un fichier traité ligne par ligne. Chacune de ces lignes est
de la forme \texttt{ID un texte quelconque.} avec ID qui est
une courte chaine alphabétique. Le résultat de la conversion
sera \texttt{char *p\_ID "un texte quelconque.";} et pourra
être utilisé par un \texttt{\#include "fichier.h"} bien
classique.
\subsection{Le traitement}
Ce traitement peut être décomposé en deux actions emboitées~:
d'une part traiter une ligne,
et d'autre part, traiter un fichier plein de lignes.
La première va être encapsulée dans un module Perl.
\lstinputlisting[language=perl]{code/id2h.pm}
\subsection{L'interface}
Quand à l'interface utilisateur, quelques arguments sur
la ligne de commande feront l'affaire.
\lstinputlisting[language=perl]{code/id2h.pl}
% ------------------------------------------------------
\section{Gestion des modules} \index{CPAN}
% ------------------------------------------------------
\section{Le \texttt{http}}
\section{RFC 8589}
RFC 8589 is an “informational” RFC that serves as a guide for
developers of applications, such as email clients, Web browsers
and more, to implement the “leaptofrogans” URI scheme
(see also the official URI schemes registered with the IANA).
Nobody is under any obligation, but RFC 8589 establishes a clear
path for enabling direct links to Frogans sites in online content.
\section{oneliners}

30
chap/Python.tex Normal file
View File

@ -0,0 +1,30 @@
\chapter{Python} \label{chap:Python} \index{Python}
\section{Pourquoi je n'aime pas Python}
Depuis des lustres, autour de moi, je vois de plus en plus de
gens faire du code en Python,
certains même font de choses très avancées.
Et beaucoup de ces gens essayent de me convaincre que c'est
un langage vraiment trop bien, trop moderne, trop dans la
\textit{vibe} du devops, battery included, toussa.
Quelques uns d'entre eux vont même jusqu'à me parler d'un
certain \textbf{canard} qui faciliterait bien la vie
des preogrammeurs.
Je ne suis pas convaincu.
\section{Mais quand même...}
\begin{figure}[h]
\begin{center}
\includegraphics[scale=0.75]{chap/chronometre}
\caption{Chronometre}
\end{center}
\end{figure}

39
chap/boot.tex Normal file
View File

@ -0,0 +1,39 @@
\chapter{boot}
Le boot (aka bootstrap) est le processus de démarrage d'un ordinateur
depuis la mise sous tension, jusque à l'arrivée du shell.
Il varie grandement selon l'architecture matérielle de la machine~:
\texttt{amd64} pour les pécés de tous les jours, ou bien
\texttt{ARM}\footnote{Acorn Risc Machine}\index{ARM} comme sur
le \textsl{Raspeberry Pi}.
\begin{quote}
\textbf{boot :}\footnote{http://www.catb.org/jargon/html/B/boot.html}
\textit{[techspeak; from by one's bootstraps]}
To load and initialize the
operating system on a machine. This usage is no longer jargon
(having passed into techspeak) but has given rise to some derivatives
that are still jargon.
\end{quote}
\section{amd64}\index{amd64}
Voir Grub, le bootloader.
\section{ARM}
XXX\index{XXX}.
\section{rc.local}
L'exécution de ce script est la toute dernière étape du démarrage d'un
système de la famille Unix\index{Unix} avant le passage au
mode multi-utilisateur.
\textsl{Spécial dedikass to Fred Fermion}
Et dans ce contexte (la fin du boot), que peut-on faire à partir du
rc.local ?

BIN
chap/chronometre.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

View File

@ -16,7 +16,12 @@ de maitre Brunus},
l'abondance d'options des outils ImageMagick est vraiment énorme, l'abondance d'options des outils ImageMagick est vraiment énorme,
et leurs interactions parfois troublantes\dots et leurs interactions parfois troublantes\dots
\subsection{\texttt{geometry}} Il y a plusieurs binaires dans le paquet : \texttt{convert} pour
la plupart des traitements,
\texttt{display} et \texttt{animate} pour visualiser des images,
\texttt{identify} pour en lire les méta-données.
\subsection{L'option \texttt{-geometry}}
C'est une notion importante, car elle est utilisée comme paramètre C'est une notion importante, car elle est utilisée comme paramètre
par beaucoup d'options. C'est avec ça que l'on peut définir des par beaucoup d'options. C'est avec ça que l'on peut définir des
@ -29,7 +34,7 @@ on va travailler.
Voici un exemple concret Voici un exemple concret
(tiré du script d'encodage du \textsc{cloître}\index{cloître}) (tiré du script d'encodage du \textsc{cloître}\index{cloître})
qui montre l'essentiel pour bien débuter. C'est une fonction qui montre l'essentiel pour bien débuter. C'est une fonction
écrite en bash\index{bash} qui rajoute un texte sur une image. : écrite en bash\index{bash} qui rajoute un texte sur une image~:
\lstinputlisting[language=sh]{code/tagpic.sh} \lstinputlisting[language=sh]{code/tagpic.sh}
@ -42,15 +47,17 @@ options sont un peu ésotériques et parfois inter-dépendantes\dots
\item{kerning} \item{kerning}
\item{colors} \item{colors}
\item{txtopts} \item{txtopts}
\item{-gravity} \item{gravity}
\item{-annotate} \item{annotate}
\end{itemize} \end{itemize}
Quastion : comment mettre une couleur de fond à ce texte ?
\subsection{Faire des GIFs animées}\index{GIF} \subsection{Faire des GIFs animées}\index{GIF}
Ces images clignotantes sont l'essence même du Web\index{Web} Ces petites images clignotantes sont l'essence même du
moderne depuis 1992, et \texttt{convert} sait très bien les Web\index{web} moderne depuis 1992 malgré leurs limitations,
générer. et \texttt{convert} sait très bien les générer.
\begin{verbatim} \begin{verbatim}
convert -delay 20 -loop 0 a.png b.png c.png foo.gif convert -delay 20 -loop 0 a.png b.png c.png foo.gif
@ -70,19 +77,29 @@ POSITION="+R12+0"
convert -crop ${DIMENSION}${POSITION} +repage $img $dst convert -crop ${DIMENSION}${POSITION} +repage $img $dst
\end{verbatim} \end{verbatim}
\textsl{Use +repage to completely remove/reset the virtual canvas meta-data \textsl{Use +repage to completely remove/reset the virtual canvas
from the images.} En gros, on en a besoin quand une opération va meta-data from the images.}
En gros, on en a besoin quand une opération va
changer la dimension de l'image. changer la dimension de l'image.
\subsection{Ressources}
Le futur livre de Brunus. Réclamez les prmiers drafts dans
l'IRC\index{IRC} \texttt{freenode\#paulla} \textit{:)}
\texttt{http://www.fmwconcepts.com/imagemagick/index.php}
% ------------------------------------------------------------------- % -------------------------------------------------------------------
\section{Gmic}\index{Gmic} \section{Gmic}\index{Gmic}
XXX\index{XXX} \textsl{Perform generic image processing operations, through the G'MIC
language interpreter. gmic: GREYC's Magic for Image Computing.}
Existe aussi en plugin pour Gimp\index{Gimp}. \index{XXX}
Existe aussi en plugin pour Gimp\index{Gimp} avec une interface
pleine de curseurs et de boutons.
% ------------------------------------------------------------------- % -------------------------------------------------------------------
@ -105,7 +122,9 @@ for ((y=0; y<250; y++)) {
\subsection{Questions} \subsection{Questions}
Comment faire un resize ? Comment faire un \textsl{resize} avec NetPBM ?
Est-il nécessaire d'apprendre la bibliothèque de fonctions
\texttt{libnetpbm} ?
% ------------------------------------------------------------------- % -------------------------------------------------------------------
@ -117,11 +136,29 @@ j'utilise pour lire ce format de fichier la bibliothèque
\texttt{pnglite} qui a de gros soucis avec beaucoup de \texttt{pnglite} qui a de gros soucis avec beaucoup de
ceux-ci, par exemple ceux qui sont en \texttt{sRGB} crées ceux-ci, par exemple ceux qui sont en \texttt{sRGB} crées
par des outils essentiels comme POVray\index{POVray}. par des outils essentiels comme POVray\index{POVray}.
Il serait bon de voir la \texttt{libpng} officielle.
pngcrush ? pngcrush ? optipng ?
\texttt{pngtopnm \$png | pnmtopng > \$goodpng} \texttt{pngtopnm \$png | pnmtopng > \$goodpng}
% -------------------------------------------------------------------
\section{Tag Image File Format} \index{TIFF} \label{TIFF}
\begin{quote}
Yes, but tiffcp is by far the most significant case. And perhaps one of the
most used of the tools. I may not be impartial on this, though :-) because I
use it heavily.
\end{quote}
\begin{verbatim}
tiffcp combines one or more files created according to the Tag Image
File Format, Revision 6.0 into a single TIFF file. Because the output
file may be compressed using a different algorithm than the input
files, tiffcp is most often used to convert between different compres
sion schemes.
\end{verbatim}

View File

@ -1,9 +1,21 @@
\chapter{manpages} \chapter{manpages}
\index{man}
\label{chap:manpages}
Voir \texttt{roff}\index{roff} en page \pageref{roff}.
man is the system's manual pager. Each page argument given to man is
normally the name of a program, utility or function. The manual page
associated with each of these arguments is then found and displayed. A
section, if provided, will direct man to look only in that section of
the manual. The default action is to search in all of the available
sections following a pre-defined order ("1 n l 8 3 2 3posix 3pm 3perl
3am 5 4 9 6 7" by default, unless overridden by the SECTION directive
in /etc/manpath.config), and to show only the first page found, even if
page exists in several sections.
\section{Un exemple ?} \section{Un exemple ?}
XXX\index{XXX} XXX\index{XXX}
Voir \texttt{roff}\index{roff} en page \pageref{roff}.

21
chap/print.tex Normal file
View File

@ -0,0 +1,21 @@
\chapter{\texttt{lp0 on fire!}}
L'impression sour Linux semble avoir plusieurs personnalités.
La chaine logicielle mise en œuvre est parfois étonnament
complexe, et ls système par defaut, \texttt{CUPS}, se contrôle
par une interface Web.
\section{CUPS} \index{CUPS}
\section{Coté matériel}
\section{Pretty printers}.

View File

@ -27,7 +27,7 @@ en Curses\index{curses} est époustouflante :
Ensuite, nous avons \texttt{aplay} et \texttt{arecord}, Ensuite, nous avons \texttt{aplay} et \texttt{arecord},
qui permettent d'écouter et d'enregistrer les sets de qui permettent d'écouter et d'enregistrer les sets de
James Lewis\footnote{Que ça, c'est de la noise !}. James Lewis\footnote{Que ça, c'est de la super noise !}.
\subsection{arecord} \subsection{arecord}
@ -36,17 +36,49 @@ Si vous avez plusieurs cartes son, la sélection du
l'option \texttt{-l} qui vous donnera la bonne piste, l'option \texttt{-l} qui vous donnera la bonne piste,
mais l'option \texttt{-L} qu'il faut utiliser. 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} \subsection{Le reste}
Et quand on regarde par la lorgnette du programmeur, on découvre Et quand on regarde par la lorgnette du programmeur, on découvre
rapidement que l'utilisation d'ALSA n'est pas si simple que rapidement que l'utilisation d'ALSA n'est pas si simple que
ça, essentiellement à cause d'une documentation spartiate. ça, essentiellement à cause d'une documentation spartiate.
Heurensement, pour certains domaines, il existe des Heurensement, pour certains domaines, il existe des
surcouches plus simple d'emploi : \texttt{libao}\index{libao} surcouches plus simple d'emploi :
pour les sorties \texttt{libao}\index{libao} pour les sorties
sonores, XXX\index{XXX} pour le reste. 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} \section{pulseaudio}
@ -57,7 +89,8 @@ On avait pourtant dit « \textbf{pas de trolls} », mais il va quand
même falloir y passer : ce machin prétenduement même falloir y passer : ce machin prétenduement
\textsl{michu compliant}\index{Michu} \textsl{michu compliant}\index{Michu}
a parfois, voire même souvent, tendance à se mettre en travers a parfois, voire même souvent, tendance à se mettre en travers
du chemin des honnètes gens. du chemin des honnètes gens%
\footnote{Du moins vers l'année 2014}.
%------------------------------------------------------------------ %------------------------------------------------------------------
\section{Jack} \section{Jack}
@ -71,7 +104,8 @@ lui laisser le soin d'en parler.
Jack peut aussi servir de source sonore pour Jack peut aussi servir de source sonore pour
darkice\index{darkice}, lequel pourra feeder un darkice\index{darkice}, lequel pourra feeder un
Icecast\index{icecast} serveur de stream comme Icecast\index{icecast}
(cf page \pageref{chap:streaming}).
%------------------------------------------------------------------ %------------------------------------------------------------------
@ -81,14 +115,13 @@ Icecast\index{icecast}
\index{libsndfile} \index{libsndfile}
Libsndfile est essentiellement une très complète bibliothèque Libsndfile est essentiellement une très complète bibliothèque
de lecture/écriture de fichiers sons. de lecture et écriture de fichiers sons.
Elle permet de gérer facilement un nombre Elle permet de gérer facilement un nombre
considérable de formats de fichiers\footnote{Mais ceci est une autre considérable de formats de fichiers\footnote{Mais ceci est une autre
histoire, que nous verrons peut-être un de ces jours\dots}. histoire, que nous verrons peut-être un de ces jours\dots}.
Par contre, elle arrive avec une floppée d'outils en ligne de Elle arrive avec une floppée d'outils en ligne de
commande, dont certains sont assez performants. commande, dont certains sont assez performants.
Citons, entre autres, \texttt{sndfile-resample} qui est un Citons, entre autres, \texttt{sndfile-resample} qui est un
convertisseur de convertisseur de
fréquence d'échantillonage très performant. fréquence d'échantillonage très performant.
@ -107,8 +140,6 @@ Elle supporte une grande variété de formats.
\lstinputlisting[language=C]{code/ao_example.c} \lstinputlisting[language=C]{code/ao_example.c}
%------------------------------------------------------------------ %------------------------------------------------------------------
\section{Ladspa} \section{Ladspa}
@ -162,14 +193,22 @@ play -n synth sine 480 sine 620 remix 1-2 fade 0 0.5 delay 0.5 repeat 5
\subsection{Traitements} \subsection{Traitements}
\texttt{sox --norm source.wav normal.wav} pour normaliser un son. \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 \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 voies mono en un fichier stéréo. \texttt{-M} est l'abréviation
de \texttt{--combine merge}. de \texttt{--combine merge}.
Question en attente : comment combiner huit pistes monophoniques Dupliquer
en un seul fichier ? 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 ?
%------------------------------------------------------------------ %------------------------------------------------------------------
@ -177,7 +216,8 @@ en un seul fichier ?
\section{espeak} \section{espeak}
\index{espeak} \index{espeak}
Logiciel de synthèse vocale. Logiciel de synthèse vocale. Mais c'est pas comme un
spo256al2, hélas.
\begin{verbatim} \begin{verbatim}
tth@plop:~/RADIO$ espeak --voices=fr tth@plop:~/RADIO$ espeak --voices=fr
@ -186,12 +226,25 @@ Pty Language Age/Gender VoiceName File Other Langs
7 fr M french-mbrola-1 mb/mb-fr1 7 fr M french-mbrola-1 mb/mb-fr1
7 fr F french-mbrola-4 mb/mb-fr4 7 fr F french-mbrola-4 mb/mb-fr4
5 fr-be M french (Belgium) fr-be 5 fr-be M french (Belgium) fr-be
tth@plop:~/RADIO$ cat hello.txt | espeak
\end{verbatim} \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...} \section{Pour finir...}
En conclusion, le son avec Linux, c'est un peu la grande foire. En conclusion, le son avec Linux, c'est un peu la grande foire.

View File

@ -19,43 +19,45 @@ d'incompatiblités diverses et variées.
\index{icecast2} \index{icecast2}
\label{icecast2} \label{icecast2}
Icecast est, semble-t-il, \textbf{le} serveur de streaming de référence.
Il se configure facilement avec des fichiers en XML\index{XML}.
Première approche d'une ergonomie différente, vous êtes avertis.
\begin{quote} \begin{quote}
Icecast, the project, is a collection of programs and libraries for Icecast, the project, is a collection of programs and libraries for
streaming audio over the Internet. This includes: streaming audio over the Internet. This includes:
Icecast, the program that streams audio data to listeners, Icecast, the program that streams audio data to listeners,
libshout, a library for communicating with Icecast servers and libshout, a library for communicating with Icecast servers and
IceS\index{ices}, a program that sends audio data to Icecast servers Ices2\index{ices}, a program that sends audio data to Icecast servers
\end{quote} \end{quote}
Icecast est, semble-t-il, \textbf{le} serveur de stream de référence. Pour alimenter Icecast en son, il faut utiliser un
Il se configure facilement avec des fichiers en XML\index{XML}. \textsl{source-client} approprié. Le modèle recommandé
Première approche d'une ergonomie différente, vous êtes avertis. est \textbf{ices2} qui est détaillé un peu plus loin,
à la page \pageref{ices2}.
Il peut envoyer depuis une entrée audio (alsa, jack, pulseaudio...)
ou une playlistde fichiers \texttt{.ogg}\index{ogg}.
\textsl{more to come...} \textsl{more to come...}
%-------------------------------------------------------------
\section{idjc}
\index{idjc}
\begin{quote}
Internet DJ Console is an Internet radio application for making a
live radio show or podcast. Features include two main media players
with a crossfader, a jingle player, microphone signal processing
(compressor and noise gate)
\end{quote}
%------------------------------------------------------------- %-------------------------------------------------------------
\section{liquidsoap} \section{liquidsoap}
\index{liquidsoap} \index{liquidsoap}
Mais nous allonc commencer par un outil puissant, bien que
délicat à comprendre au premier abord~:
\texttt{https://www.liquidsoap.info/} \texttt{https://www.liquidsoap.info/}
\begin{quote} \begin{quote}
Liquidsoap is an extensible and flexible audio stream generator, mainly Liquidsoap is an extensible and flexible audio stream generator,
used for streaming to a shoutcast/icecast server. mainly used for streaming to a shoutcast/icecast server.
It is also possible It is also possible to output in a file, to speakers or as
to output in a file, to speakers or as raw PCM stream. raw PCM stream.
liquidsoap can liquidsoap can
perform any audio processing, mixing streams together, perform any audio processing, mixing streams together,
applying filters, generating sound procedurally, applying filters, generating sound procedurally,
@ -95,17 +97,17 @@ Icecast2 en passant les paramètres nécessaires.
\subsection{10.20.0.23} \subsection{10.20.0.23}
Maintenant, voyons un exemple plus complet et plus réaliste, Maintenant, voyons un exemple plus complet et plus réaliste,
largement inspiré d'un tutoriel de la documentation officielle, largement inspiré d'un tutoriel de la documentation officielle,
et qui deviendra un de ces jours la base de Radio-Myrys : et qui deviendra un de ces jours la base de la nouvelle%
\footnote{L'ancienne ayant été fermée pour des raisons
incompréhensibles.} radio de Myrys~:
\begin{verbatim} \begin{verbatim}
set("log.file.path", "/tmp/savon.log") set("log.file.path", "/tmp/savon.log")
set("log.stdout", false) set("log.stdout", false)
default = single("loveme.ogg") default = single("loveme.ogg")
openbsd = playlist(mode="random", "files/openbsd.pls") openbsd = playlist(mode="random", "files/openbsd.pls")
others = playlist(mode="random", "files/others.pls") others = playlist(mode="random", "files/others.pls")
jingles = playlist( "files/jingles.pls") jingles = playlist( "files/jingles.pls")
@ -113,7 +115,6 @@ jingles = playlist( "files/jingles.pls")
radio = fallback([ switch([({ 5h-11h }, openbsd), radio = fallback([ switch([({ 5h-11h }, openbsd),
({ 11h-5h }, others)]), ({ 11h-5h }, others)]),
default]) default])
radio = random(weights=[1,12],[ jingles, radio ]) radio = random(weights=[1,12],[ jingles, radio ])
output.icecast( %vorbis, output.icecast( %vorbis,
@ -125,11 +126,9 @@ output.icecast( %vorbis,
\end{verbatim} \end{verbatim}
Ah bah oui, ça commence à être robuste, mais en fait c'est Ah bah oui, ça commence à être robuste, mais en fait c'est
assez simple à comprendre, et un peu plus compliqué à mettre presque simple à comprendre, et un peu plus compliqué à mettre
en œuvre. en œuvre.
On se retrouve vite face à un problème classique : On se retrouve vite face à un problème classique :
les différences de niveau sonore entre les divers morceaux. les différences de niveau sonore entre les divers morceaux.
Et comme on veut avancer sur d'autres choses, on rache un Et comme on veut avancer sur d'autres choses, on rache un
@ -153,6 +152,15 @@ s = rotate([pl2014, pl2013, ..., jingles])
output.icecast(..., s) output.icecast(..., s)
\end{verbatim} \end{verbatim}
\subsection{Take over the playlist}
XXX\index{XXX}
Il est également possible, avec liquidsoap, d'interrompre la
diffusion d'une playlist à partir d'une autre source
(fichier ou entrée audio), eventuellement externe.
\lstinputlisting{code/takeover.liq}
\subsection{trucs divers} \subsection{trucs divers}
@ -170,6 +178,33 @@ la suite les uns des autres ;)
\section{Source clients} \section{Source clients}
\label{sourceclients} \label{sourceclients}
Il existe une foultitude de clients source pour abreuver icecast2.
%-------------------------------------------------------------
\subsection{ices2} \index{ices2} \label{ices2}
Premier mystère : comment faire le rapprochement entre
la déclaration du périphérique d'entrée
(\texttt{<param name="device">hw:1,0</param>}) et
l'équivalent dans le monde Alsa ?
La commande \texttt{arecord -L} va nous donner quelques
informations sur les « points d'entrée » utilisables.
Liste dont nous extrayons (par la pure pensée logique)
ce fameux nom de device~: \texttt{ plughw:CARD=Snowball,DEV=0}
XXX\index{XXX} que nous pouvons mettre dans le XML.
\textbf{Attention} si votre source est monophonique, comme
le microphone USB \textsc{Snowball} utilisé dans cet exemple,
il NE faut PAS mettre \textsl{downmix} à 1\dots
Et si vous souhaitez dupliquer une entrée à un seul canal
(genre un micro usb) por obtenir une sortie stéréo, ça ne
semble pas possible fin 2020\index{2020}. Il serait temps
de songer à écrire un patch\index{patch}.
%------------------------------------------------------------- %-------------------------------------------------------------
\subsection{Ezstream} \subsection{Ezstream}
@ -195,11 +230,55 @@ interface (e.g. sound card), encodes it and sends it to a streaming server.
\subsection{VLC} \subsection{VLC}
\index{vlc} \index{vlc}
VLC est le « cône de chantier » du multimédia.
%-------------------------------------------------------------
\subsection{butt}
\index{butt}
Du clickaconvi qui plante en X remote ;( mais sinon une
interface graphique simple et facile d'emploi.
%-------------------------------------------------------------
\subsection{idjc}
\index{idjc}
\begin{quote}
Internet DJ Console is an Internet radio application for making a
live radio show or podcast. Features include two main media players
with a crossfader, a jingle player, microphone signal processing
(compressor and noise gate)
\end{quote}
%-------------------------------------------------------------
\subsection{Android} \index{Android}
Cool Mic \texttt{https://coolmic.net/} ?
Mais il faut avoir quelques connaissances en \textsc{modernophone}
pour arriver à tenter de comprendre pouquoi ça ne fonctionne pas,
alors que tout semble correct.
%==================================================================== %====================================================================
\section{libshout}\index{libshout}\label{libshout} \section{libshout}\index{libshout}\label{libshout}
Mais c'est quoi ?\index{XXX} Libshout c'est quoi ? Ah, chers amis de la radio en ligne,
c'est une porte
ouverte facilitant l'accès en direction du monde sonore extérieur,
comme le précise clairement sa documentation~:
\begin{quote}
Libshout is a library for communicating with and sending data to an
icecast server. It handles the socket connection, the timing of the
data, and prevents bad data from getting to the icecast server.
\end{quote}
\lstinputlisting[language=c]{code/microcast.c}
%==================================================================== %====================================================================

View File

@ -50,6 +50,11 @@ une redirection vers \texttt{stdin} comme ceci :
< $BASENAME.txt recode utf8..latin1 | groff -Tutf8 < $BASENAME.txt recode utf8..latin1 | groff -Tutf8
\end{verbatim} \end{verbatim}
D'un autre coté, c'est \texttt{roff} qui est utilisé pour formater
les pages du manuel Unix. La documentation, c'est important.
C'est pour ça que j'en cause page \pageref{chap:manpages}.
%------------------------------------------------------------- %-------------------------------------------------------------
\section{yodl} \section{yodl}
\index{yodl} \index{yodl}

View File

@ -50,6 +50,10 @@ Et réciproquement, si le \texttt{main} pose son aléa dans
le compteur, \textbf{puis} l'affiche, cet aléa peut avoir le compteur, \textbf{puis} l'affiche, cet aléa peut avoir
été incrémenté par l'autre partie du processus. été incrémenté par l'autre partie du processus.
Un esprit pervers vient quand même modérer ces affirmations
en prétendant que dans ces deux cas, les \textsl{race conditions}
pourraient dépendre des optimisations du compilateur,
et de l'utilisation du \texttt{volatil} pour notre compteur.
% %
% ---------------------------------------------------------------- % ----------------------------------------------------------------

View File

@ -25,15 +25,11 @@ float freq = 440.0;
int i; int i;
/* -- Initialize -- */ /* -- Initialize -- */
fprintf(stderr, "libao example program\n"); fprintf(stderr, "libao example program\n");
ao_initialize(); ao_initialize();
/* -- Setup for default driver -- */ /* -- Setup for default driver -- */
default_driver = ao_default_driver_id(); default_driver = ao_default_driver_id();
memset(&format, 0, sizeof(format)); memset(&format, 0, sizeof(format));
format.bits = 16; format.bits = 16;
format.channels = 2; format.channels = 2;
@ -54,7 +50,6 @@ buffer = calloc(buf_size, sizeof(char));
for (i = 0; i < format.rate; i++) { for (i = 0; i < format.rate; i++) {
sample = (int)(0.75 * 32768.0 * sample = (int)(0.75 * 32768.0 *
sin(2 * M_PI * freq * ((float) i/format.rate))); sin(2 * M_PI * freq * ((float) i/format.rate)));
/* Put the same stuff in left and right channel */ /* Put the same stuff in left and right channel */
buffer[4*i] = buffer[4*i+2] = sample & 0xff; buffer[4*i] = buffer[4*i+2] = sample & 0xff;
buffer[4*i+1] = buffer[4*i+3] = (sample >> 8) & 0xff; buffer[4*i+1] = buffer[4*i+3] = (sample >> 8) & 0xff;

79
code/chronometre.py Executable file
View File

@ -0,0 +1,79 @@
#!/usr/bin/python
from Tkinter import *
import time, math
class StopWatch(Frame):
""" Implement a stopwatch frame widget """
msec = 420
def __init__(self, parent=None, **kw):
Frame.__init__(self, parent, kw)
self._start = 0.0
self._elapsed = 0.0
self._running = False
self.timestr = StringVar()
self.makeWidgets()
def makeWidgets(self):
l = Label(self, textvariable=self.timestr,
font = "Helvetica 36 bold",
bg = "Grey20", fg = "Yellow",
padx = 30, pady = 30)
self._setTime(self._elapsed)
l.pack(fill=X, expand=YES, pady=0, padx=0)
def _update(self):
self._elapsed = time.time() - self._start
self._setTime(self._elapsed)
self._timer = self.after(self.msec, self._update)
def _setTime(self, elap):
minutes = int(elap/60)
seconds = int(elap - (minutes*60.0))
fl = math.floor(elap)
hseconds = int((elap - fl)*100)
self.timestr.set('%03dm%02d.%02d' % \
(minutes, seconds, hseconds))
def Start(self):
if not self._running:
self._start = time.time() - self._elapsed
self._update()
self._running = True
def Stop(self):
if self._running:
self.after_cancel(self._timer)
self._elapsed = time.time() - self._start
self._setTime(self._elapsed)
self._running = False
def Reset(self):
""" reset the stopwath to 000m00.00 """
self._start = time.time()
self._elapsed = 0.0
self._setTime(self._elapsed)
def Dump(self):
""" Display internals variables """
print "start = ", self._start
print "elapsed = ", self._elapsed
print "refresh = ", self.msec
print "running = ", self._running
# print "timestr = ", self.timestr
def About(self):
print "A kludge by tTh"
# --------------------------------------------------------------------
if __name__ == '__main__':
def main():
root = Tk()
root.title("Chronometre")
sw = StopWatch(root)
sw.pack(side=TOP)
Button(root, text='Start', command=sw.Start).pack(side=LEFT)
Button(root, text='Stop', command=sw.Stop).pack(side=LEFT)
Button(root, text='Reset', command=sw.Reset).pack(side=LEFT)
Button(root, text='Dump', command=sw.Dump).pack(side=LEFT)
Button(root, text='Quit', command=root.quit).pack(side=LEFT)
root.mainloop()
main()

5
code/d-espeak.sh Executable file
View File

@ -0,0 +1,5 @@
#!/bin/bash
TEXTE=$(ddate)
echo $TEXTE | espeak-ng

5
code/id2h.pl Executable file
View File

@ -0,0 +1,5 @@
#!/usr/bin/perl -w
use strict;
use code::id2h;
TraiterLigne("ID un texte quelconque.");

8
code/id2h.pm Executable file
View File

@ -0,0 +1,8 @@
#!/usr/bin/perl -w
use strict;
sub TraiterLigne($)
{
my $in = shift;
print "input: $in\n";
}
1;

1
code/listen-osc.c Normal file
View File

@ -0,0 +1 @@
/* LISTEN OSC */

16
code/microcast.c Normal file
View File

@ -0,0 +1,16 @@
/*
* microcast.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <shout/shout.h>
int main(int argc, char *argv[])
{
return 1;
}

3
code/midifile.pl Executable file
View File

@ -0,0 +1,3 @@
#!/usr/bin/perl -w
use MIDI;
0;

1
code/send-osc.c Normal file
View File

@ -0,0 +1 @@
/* SEND OSC */

19
code/takeover.liq Normal file
View File

@ -0,0 +1,19 @@
#
# TAKEOVER.LIQ
#
default = single("files/changer-monde.ogg")
liste = playlist(mode="random", "playlist.txt")
#
# point d'entree pour le live
#
set("harbor.bind_addr", "localhost")
live = input.harbor("input", port=8088,
password="thegreatquux")
radio = fallback( track_sensitive=false,
[live, liste, default] )
output.icecast( %vorbis,
host = "porno.mixart-myrys.org",
port = 8000,
password = "XXXXXXXXXXX",
mount = "/changer-monde",
radio)

View File

@ -85,13 +85,18 @@ en ligne sur le site du Tetalab. Your mileage may vary\dots
% peut-être trouver un ordre des chapitres plus logique ? % peut-être trouver un ordre des chapitres plus logique ?
% %
% \input{chap/shell} \input{chap/boot}
\input{chap/shell}
% \input{chap/editeurs} % \input{chap/editeurs}
\input{chap/manpages}
\input{chap/son} \input{chap/son}
\input{chap/image} \input{chap/image}
\input{chap/reseau} \input{chap/reseau}
\input{chap/Perl}
\input{chap/musique} \input{chap/musique}
% \input{chap/puredata} % \input{chap/puredata}
\input{chap/son}
\input{chap/streaming}
\input{chap/MIDI} \input{chap/MIDI}
\input{chap/OSC} \input{chap/OSC}
\input{chap/backups} \input{chap/backups}
@ -99,11 +104,13 @@ en ligne sur le site du Tetalab. Your mileage may vary\dots
\input{chap/video} \input{chap/video}
% \input{chap/graphisme} % \input{chap/graphisme}
\input{chap/gnuplot} \input{chap/gnuplot}
\input{chap/print}
\input{chap/webcam} \input{chap/webcam}
% \input{chap/SCSI} % \input{chap/SCSI}
\input{chap/X11} \input{chap/X11}
\input{chap/manpages} \input{chap/manpages}
\input{chap/Fortran}
\input{chap/Python}
\input{chap/dino} \input{chap/dino}
\input{chap/textes} \input{chap/textes}
\input{chap/MINITEL} \input{chap/MINITEL}
@ -123,7 +130,6 @@ en ligne sur le site du Tetalab. Your mileage may vary\dots
\input{chap/DNS} \input{chap/DNS}
\input{chap/ssh} \input{chap/ssh}
\input{chap/hardware} \input{chap/hardware}
\input{chap/streaming}
\input{chap/gadgets} \input{chap/gadgets}
% \input{chap/slang} % \input{chap/slang}
\input{chap/curses} \input{chap/curses}