Compare commits

..

No commits in common. "2a7624eb755975f2f4b92d21fb1ff248464fe361" and "8684520c5a63c1be40ba0d11cb84770bb4e76fa6" have entirely different histories.

28 changed files with 77 additions and 606 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 :
\texttt{\$ dig +trace <nom.de.domaine>} \$ dig +trace <nom.de.domaine>
Pour obtenir le reverse d'une adresse IP : Pour le reverse d'une adresse IP :
\texttt{\$ dig +trace -x <adresse.ip>} \$ dig +trace -x <adresse.ip>
% ------------------------------------------------------------ % ------------------------------------------------------------
% \subsection{delv} % \subsection{delv}

View File

@ -1,18 +0,0 @@
\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 anciennement utilisé par Smeuh. Il semble que C'est le serveur utilisé par Smeuh. Une vrai galère à
ce soit une vrai galère à configurer. 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,9 +42,3 @@ pinpin0: çhârsèt ?
Client graphique bien efficace. Client graphique bien efficace.
% ============================================================== % ==============================================================
\section{Les "bots"}
Hello Dotanick.
% ==============================================================

View File

@ -106,8 +106,7 @@ 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 exemple en Python\footnote{Oui, je sais, c'est un langage de djeunz,
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 :
@ -138,6 +137,7 @@ for valeur in range(30,90):
tx.close() tx.close()
\end{lstlisting} \end{lstlisting}
% --------------------------------------------------------- % ---------------------------------------------------------
\section{Et en Perl ?} \section{Et en Perl ?}
@ -159,12 +159,6 @@ 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{TCP} et apporte des des protocoles UDP\index{UDP} ou TCP\index{OSC} 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
allons voir maintenant. allos voir maintenant.
\section{oscdump \& oscsend} \section{oscdump \& oscsend}
\index{oscdump}\index{oscsend} \index{oscdump}\index{oscsend}
@ -36,13 +36,7 @@ tth@debian:~$
\section{Exemple de code} \section{Exemple de code}
Ecouter : TODO\index{TODO}
\lstinputlisting[language=c]{code/listen-osc.c}
Envoyer :
\lstinputlisting[language=c]{code/send-osc.c}
\section{Autres logiciels} \section{Autres logiciels}

View File

@ -1,75 +0,0 @@
\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}

View File

@ -1,30 +0,0 @@
\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}

View File

@ -1,39 +0,0 @@
\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 ?

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

View File

@ -16,12 +16,7 @@ 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
Il y a plusieurs binaires dans le paquet : \texttt{convert} pour \subsection{\texttt{geometry}}
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
@ -34,7 +29,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}
@ -47,17 +42,15 @@ 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 petites images clignotantes sont l'essence même du Ces images clignotantes sont l'essence même du Web\index{Web}
Web\index{web} moderne depuis 1992 malgré leurs limitations, moderne depuis 1992, et \texttt{convert} sait très bien les
et \texttt{convert} sait très bien les générer. 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
@ -77,29 +70,19 @@ 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 \textsl{Use +repage to completely remove/reset the virtual canvas meta-data
meta-data from the images.} from the images.} En gros, on en a besoin quand une opération va
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}
\textsl{Perform generic image processing operations, through the G'MIC XXX\index{XXX}
language interpreter. gmic: GREYC's Magic for Image Computing.}
\index{XXX} Existe aussi en plugin pour Gimp\index{Gimp}.
Existe aussi en plugin pour Gimp\index{Gimp} avec une interface
pleine de curseurs et de boutons.
% ------------------------------------------------------------------- % -------------------------------------------------------------------
@ -122,9 +105,7 @@ for ((y=0; y<250; y++)) {
\subsection{Questions} \subsection{Questions}
Comment faire un \textsl{resize} avec NetPBM ? Comment faire un resize ?
Est-il nécessaire d'apprendre la bibliothèque de fonctions
\texttt{libnetpbm} ?
% ------------------------------------------------------------------- % -------------------------------------------------------------------
@ -136,29 +117,11 @@ 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 ? optipng ? pngcrush ?
\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,21 +1,9 @@
\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}.

View File

@ -1,21 +0,0 @@
\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 super noise !}. James Lewis\footnote{Que ça, c'est de la noise !}.
\subsection{arecord} \subsection{arecord}
@ -36,49 +36,17 @@ 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 : surcouches plus simple d'emploi : \texttt{libao}\index{libao}
\texttt{libao}\index{libao} pour les sorties 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}
@ -89,8 +57,7 @@ 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}
@ -104,8 +71,7 @@ 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
serveur de stream comme Icecast\index{icecast} Icecast\index{icecast}
(cf page \pageref{chap:streaming}).
%------------------------------------------------------------------ %------------------------------------------------------------------
@ -115,13 +81,14 @@ serveur de stream comme 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 et écriture de fichiers sons. de lecture/é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}.
Elle arrive avec une floppée d'outils en ligne de Par contre, 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.
@ -140,6 +107,8 @@ 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}
@ -193,22 +162,14 @@ 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[=dB-level] source.wav normal.wav} pour \texttt{sox --norm source.wav normal.wav} pour normaliser un son.
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}.
Dupliquer Question en attente : comment combiner huit pistes monophoniques
la piste d'un fichier mono pour obtenir un fichier stéréo : en un seul fichier ?
"\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 ?
%------------------------------------------------------------------ %------------------------------------------------------------------
@ -216,8 +177,7 @@ en un seul fichier contenant ces 8 pistes ?
\section{espeak} \section{espeak}
\index{espeak} \index{espeak}
Logiciel de synthèse vocale. Mais c'est pas comme un Logiciel de synthèse vocale.
spo256al2, hélas.
\begin{verbatim} \begin{verbatim}
tth@plop:~/RADIO$ espeak --voices=fr tth@plop:~/RADIO$ espeak --voices=fr
@ -226,25 +186,12 @@ 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,45 +19,43 @@ 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
Ices2\index{ices}, a program that sends audio data to Icecast servers IceS\index{ices}, a program that sends audio data to Icecast servers
\end{quote} \end{quote}
Pour alimenter Icecast en son, il faut utiliser un Icecast est, semble-t-il, \textbf{le} serveur de stream de référence.
\textsl{source-client} approprié. Le modèle recommandé Il se configure facilement avec des fichiers en XML\index{XML}.
est \textbf{ices2} qui est détaillé un peu plus loin, Première approche d'une ergonomie différente, vous êtes avertis.
à 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, Liquidsoap is an extensible and flexible audio stream generator, mainly
mainly used for streaming to a shoutcast/icecast server. used for streaming to a shoutcast/icecast server.
It is also possible to output in a file, to speakers or as It is also possible
raw PCM stream. to output in a file, to speakers or as 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,
@ -97,17 +95,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 la nouvelle% et qui deviendra un de ces jours la base de Radio-Myrys :
\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")
@ -115,6 +113,7 @@ 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,
@ -126,9 +125,11 @@ 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
presque simple à comprendre, et un peu plus compliqué à mettre assez 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
@ -152,15 +153,6 @@ 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}
@ -178,33 +170,6 @@ 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}
@ -230,55 +195,11 @@ 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}
Libshout c'est quoi ? Ah, chers amis de la radio en ligne, Mais c'est quoi ?\index{XXX}
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,11 +50,6 @@ 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,10 +50,6 @@ 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,11 +25,15 @@ 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;
@ -50,6 +54,7 @@ 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;

View File

@ -1,79 +0,0 @@
#!/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()

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,19 +0,0 @@
#
# 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,18 +85,13 @@ 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/boot} % \input{chap/shell}
\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}
@ -104,13 +99,11 @@ 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}
@ -130,6 +123,7 @@ 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}