Compare commits
6 Commits
8684520c5a
...
2a7624eb75
Author | SHA1 | Date | |
---|---|---|---|
2a7624eb75 | |||
7722aef9d3 | |||
499944159f | |||
2b73698aef | |||
99eae15038 | |||
c6d8042995 |
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,6 +1,6 @@
|
||||
|
||||
log.*
|
||||
*.png
|
||||
# *.png
|
||||
|
||||
MANIFEST
|
||||
tarball
|
||||
|
@ -75,10 +75,10 @@ des serveurs DNS. Par défaut, il questionne les serveurs
|
||||
listés dans \texttt{/etc/resolv.conf}.
|
||||
|
||||
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 :
|
||||
\$ dig +trace -x <adresse.ip>
|
||||
Pour obtenir le reverse d'une adresse IP :
|
||||
\texttt{\$ dig +trace -x <adresse.ip>}
|
||||
|
||||
% ------------------------------------------------------------
|
||||
% \subsection{delv}
|
||||
|
18
chap/Fortran.tex
Normal file
18
chap/Fortran.tex
Normal 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.
|
10
chap/IRC.tex
10
chap/IRC.tex
@ -7,8 +7,8 @@
|
||||
\section{hybrid}
|
||||
\index{hybrid}
|
||||
|
||||
C'est le serveur utilisé par Smeuh. Une vrai galère à
|
||||
configurer.
|
||||
C'est le serveur anciennement utilisé par Smeuh. Il semble que
|
||||
ce soit une vrai galère à configurer.
|
||||
|
||||
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
|
||||
@ -42,3 +42,9 @@ pinpin0: çhârsèt ?
|
||||
Client graphique bien efficace.
|
||||
|
||||
% ==============================================================
|
||||
|
||||
\section{Les "bots"}
|
||||
|
||||
Hello Dotanick.
|
||||
|
||||
% ==============================================================
|
||||
|
@ -106,7 +106,8 @@ Client 128 : "TiMidity" [User]
|
||||
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
|
||||
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
|
||||
dans un langage plus sérieux :
|
||||
|
||||
@ -137,7 +138,6 @@ for valeur in range(30,90):
|
||||
tx.close()
|
||||
\end{lstlisting}
|
||||
|
||||
|
||||
% ---------------------------------------------------------
|
||||
|
||||
\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
|
||||
\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à.
|
||||
|
||||
% ---------------------------------------------------------
|
||||
|
||||
|
12
chap/OSC.tex
12
chap/OSC.tex
@ -5,7 +5,7 @@ Wikipedia :
|
||||
\textsl{OSC est un format de transmission de données entre ordinateurs,
|
||||
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
|
||||
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
|
||||
à l'ancienne norme MIDI\index{MIDI}\dots}
|
||||
|
||||
@ -13,7 +13,7 @@ Actuellement, j'utilise (pour le C) \texttt{liblo}\index{liblo}
|
||||
qui reste simple
|
||||
à utiliser tout en permettant de descendre à un bas niveau.
|
||||
Cette bibliothèque est livrée avec deux outils que nous
|
||||
allos voir maintenant.
|
||||
allons voir maintenant.
|
||||
|
||||
\section{oscdump \& oscsend}
|
||||
\index{oscdump}\index{oscsend}
|
||||
@ -36,7 +36,13 @@ tth@debian:~$
|
||||
|
||||
\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}
|
||||
|
||||
|
75
chap/Perl.tex
Normal file
75
chap/Perl.tex
Normal 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
30
chap/Python.tex
Normal 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
39
chap/boot.tex
Normal 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
BIN
chap/chronometre.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.6 KiB |
@ -16,7 +16,12 @@ de maitre Brunus},
|
||||
l'abondance d'options des outils ImageMagick est vraiment énorme,
|
||||
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
|
||||
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
|
||||
(tiré du script d'encodage du \textsc{cloître}\index{cloître})
|
||||
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}
|
||||
|
||||
@ -42,15 +47,17 @@ options sont un peu ésotériques et parfois inter-dépendantes\dots
|
||||
\item{kerning}
|
||||
\item{colors}
|
||||
\item{txtopts}
|
||||
\item{-gravity}
|
||||
\item{-annotate}
|
||||
\item{gravity}
|
||||
\item{annotate}
|
||||
\end{itemize}
|
||||
|
||||
Quastion : comment mettre une couleur de fond à ce texte ?
|
||||
|
||||
\subsection{Faire des GIFs animées}\index{GIF}
|
||||
|
||||
Ces images clignotantes sont l'essence même du Web\index{Web}
|
||||
moderne depuis 1992, et \texttt{convert} sait très bien les
|
||||
générer.
|
||||
Ces petites images clignotantes sont l'essence même du
|
||||
Web\index{web} moderne depuis 1992 malgré leurs limitations,
|
||||
et \texttt{convert} sait très bien les générer.
|
||||
|
||||
\begin{verbatim}
|
||||
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
|
||||
\end{verbatim}
|
||||
|
||||
\textsl{Use +repage to completely remove/reset the virtual canvas meta-data
|
||||
from the images.} En gros, on en a besoin quand une opération va
|
||||
\textsl{Use +repage to completely remove/reset the virtual canvas
|
||||
meta-data from the images.}
|
||||
En gros, on en a besoin quand une opération va
|
||||
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}
|
||||
|
||||
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,23 +122,43 @@ for ((y=0; y<250; y++)) {
|
||||
|
||||
\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} ?
|
||||
|
||||
% -------------------------------------------------------------------
|
||||
|
||||
\section{Portable Network Graphic}\index{PNG}
|
||||
|
||||
Voici le problème du soir%
|
||||
\footnote{\textsl{trollday}Fri Nov 13 00:07:19 CET 2020} :
|
||||
\footnote{\textsl{trollday} Fri Nov 13 00:07:19 CET 2020} :
|
||||
j'utilise pour lire ce format de fichier la bibliothèque
|
||||
\texttt{pnglite} qui a de gros soucis avec beaucoup de
|
||||
ceux-ci, par exemple ceux qui sont en \texttt{sRGB} crées
|
||||
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}
|
||||
|
||||
% -------------------------------------------------------------------
|
||||
|
||||
\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}
|
||||
|
||||
|
||||
|
||||
|
@ -1,9 +1,21 @@
|
||||
\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 ?}
|
||||
|
||||
XXX\index{XXX}
|
||||
|
||||
Voir \texttt{roff}\index{roff} en page \pageref{roff}.
|
||||
|
21
chap/print.tex
Normal file
21
chap/print.tex
Normal 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}.
|
||||
|
||||
|
||||
|
||||
|
83
chap/son.tex
83
chap/son.tex
@ -27,7 +27,7 @@ en Curses\index{curses} est époustouflante :
|
||||
|
||||
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 noise !}.
|
||||
James Lewis\footnote{Que ça, c'est de la super noise !}.
|
||||
|
||||
\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,
|
||||
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
|
||||
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}
|
||||
@ -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
|
||||
\textsl{michu compliant}\index{Michu}
|
||||
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}
|
||||
@ -71,7 +104,8 @@ lui laisser le soin d'en parler.
|
||||
|
||||
Jack peut aussi servir de source sonore pour
|
||||
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}
|
||||
|
||||
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
|
||||
considérable de formats de fichiers\footnote{Mais ceci est une autre
|
||||
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.
|
||||
|
||||
Citons, entre autres, \texttt{sndfile-resample} qui est un
|
||||
convertisseur de
|
||||
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}
|
||||
|
||||
|
||||
|
||||
%------------------------------------------------------------------
|
||||
|
||||
\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}
|
||||
|
||||
\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
|
||||
voies mono en un fichier stéréo. \texttt{-M} est l'abréviation
|
||||
de \texttt{--combine merge}.
|
||||
|
||||
Question en attente : comment combiner huit pistes monophoniques
|
||||
en un seul fichier ?
|
||||
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 ?
|
||||
|
||||
%------------------------------------------------------------------
|
||||
|
||||
@ -177,7 +216,8 @@ en un seul fichier ?
|
||||
\section{espeak}
|
||||
\index{espeak}
|
||||
|
||||
Logiciel de synthèse vocale.
|
||||
Logiciel de synthèse vocale. Mais c'est pas comme un
|
||||
spo256al2, hélas.
|
||||
|
||||
\begin{verbatim}
|
||||
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 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.
|
||||
|
@ -19,43 +19,45 @@ d'incompatiblités diverses et variées.
|
||||
\index{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}
|
||||
Icecast, the project, is a collection of programs and libraries for
|
||||
streaming audio over the Internet. This includes:
|
||||
Icecast, the program that streams audio data to listeners,
|
||||
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}
|
||||
|
||||
Icecast est, semble-t-il, \textbf{le} serveur de stream 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.
|
||||
Pour alimenter Icecast en son, il faut utiliser un
|
||||
\textsl{source-client} approprié. Le modèle recommandé
|
||||
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...}
|
||||
|
||||
%-------------------------------------------------------------
|
||||
\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}
|
||||
\index{liquidsoap}
|
||||
|
||||
Mais nous allonc commencer par un outil puissant, bien que
|
||||
délicat à comprendre au premier abord~:
|
||||
\texttt{https://www.liquidsoap.info/}
|
||||
|
||||
\begin{quote}
|
||||
Liquidsoap is an extensible and flexible audio stream generator, mainly
|
||||
used for streaming to a shoutcast/icecast server.
|
||||
It is also possible
|
||||
to output in a file, to speakers or as raw PCM stream.
|
||||
Liquidsoap is an extensible and flexible audio stream generator,
|
||||
mainly used for streaming to a shoutcast/icecast server.
|
||||
It is also possible to output in a file, to speakers or as
|
||||
raw PCM stream.
|
||||
|
||||
liquidsoap can
|
||||
perform any audio processing, mixing streams together,
|
||||
applying filters, generating sound procedurally,
|
||||
@ -95,17 +97,17 @@ Icecast2 en passant les paramètres nécessaires.
|
||||
|
||||
\subsection{10.20.0.23}
|
||||
|
||||
|
||||
Maintenant, voyons un exemple plus complet et plus réaliste,
|
||||
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}
|
||||
set("log.file.path", "/tmp/savon.log")
|
||||
set("log.stdout", false)
|
||||
|
||||
default = single("loveme.ogg")
|
||||
|
||||
openbsd = playlist(mode="random", "files/openbsd.pls")
|
||||
others = playlist(mode="random", "files/others.pls")
|
||||
jingles = playlist( "files/jingles.pls")
|
||||
@ -113,7 +115,6 @@ jingles = playlist( "files/jingles.pls")
|
||||
radio = fallback([ switch([({ 5h-11h }, openbsd),
|
||||
({ 11h-5h }, others)]),
|
||||
default])
|
||||
|
||||
radio = random(weights=[1,12],[ jingles, radio ])
|
||||
|
||||
output.icecast( %vorbis,
|
||||
@ -125,11 +126,9 @@ output.icecast( %vorbis,
|
||||
\end{verbatim}
|
||||
|
||||
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.
|
||||
|
||||
|
||||
|
||||
On se retrouve vite face à un problème classique :
|
||||
les différences de niveau sonore entre les divers morceaux.
|
||||
Et comme on veut avancer sur d'autres choses, on rache un
|
||||
@ -153,6 +152,15 @@ s = rotate([pl2014, pl2013, ..., jingles])
|
||||
output.icecast(..., s)
|
||||
\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}
|
||||
|
||||
@ -170,6 +178,33 @@ la suite les uns des autres ;)
|
||||
\section{Source clients}
|
||||
\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}
|
||||
@ -195,11 +230,55 @@ interface (e.g. sound card), encodes it and sends it to a streaming server.
|
||||
\subsection{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}
|
||||
|
||||
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}
|
||||
|
||||
|
||||
|
||||
%====================================================================
|
||||
|
@ -50,6 +50,11 @@ une redirection vers \texttt{stdin} comme ceci :
|
||||
< $BASENAME.txt recode utf8..latin1 | groff -Tutf8
|
||||
\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}
|
||||
\index{yodl}
|
||||
|
@ -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
|
||||
é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.
|
||||
|
||||
%
|
||||
% ----------------------------------------------------------------
|
||||
|
@ -25,15 +25,11 @@ float freq = 440.0;
|
||||
int i;
|
||||
|
||||
/* -- Initialize -- */
|
||||
|
||||
fprintf(stderr, "libao example program\n");
|
||||
|
||||
ao_initialize();
|
||||
|
||||
/* -- Setup for default driver -- */
|
||||
|
||||
default_driver = ao_default_driver_id();
|
||||
|
||||
memset(&format, 0, sizeof(format));
|
||||
format.bits = 16;
|
||||
format.channels = 2;
|
||||
@ -54,7 +50,6 @@ buffer = calloc(buf_size, sizeof(char));
|
||||
for (i = 0; i < format.rate; i++) {
|
||||
sample = (int)(0.75 * 32768.0 *
|
||||
sin(2 * M_PI * freq * ((float) i/format.rate)));
|
||||
|
||||
/* Put the same stuff in left and right channel */
|
||||
buffer[4*i] = buffer[4*i+2] = sample & 0xff;
|
||||
buffer[4*i+1] = buffer[4*i+3] = (sample >> 8) & 0xff;
|
||||
|
79
code/chronometre.py
Executable file
79
code/chronometre.py
Executable 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
5
code/d-espeak.sh
Executable file
@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
TEXTE=$(ddate)
|
||||
|
||||
echo $TEXTE | espeak-ng
|
5
code/id2h.pl
Executable file
5
code/id2h.pl
Executable 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
8
code/id2h.pm
Executable 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
1
code/listen-osc.c
Normal file
@ -0,0 +1 @@
|
||||
/* LISTEN OSC */
|
16
code/microcast.c
Normal file
16
code/microcast.c
Normal 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
3
code/midifile.pl
Executable file
@ -0,0 +1,3 @@
|
||||
#!/usr/bin/perl -w
|
||||
use MIDI;
|
||||
0;
|
1
code/send-osc.c
Normal file
1
code/send-osc.c
Normal file
@ -0,0 +1 @@
|
||||
/* SEND OSC */
|
19
code/takeover.liq
Normal file
19
code/takeover.liq
Normal 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)
|
12
main.tex
12
main.tex
@ -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 ?
|
||||
%
|
||||
|
||||
% \input{chap/shell}
|
||||
\input{chap/boot}
|
||||
\input{chap/shell}
|
||||
% \input{chap/editeurs}
|
||||
\input{chap/manpages}
|
||||
\input{chap/son}
|
||||
\input{chap/image}
|
||||
\input{chap/reseau}
|
||||
\input{chap/Perl}
|
||||
\input{chap/musique}
|
||||
% \input{chap/puredata}
|
||||
\input{chap/son}
|
||||
\input{chap/streaming}
|
||||
\input{chap/MIDI}
|
||||
\input{chap/OSC}
|
||||
\input{chap/backups}
|
||||
@ -99,11 +104,13 @@ en ligne sur le site du Tetalab. Your mileage may vary\dots
|
||||
\input{chap/video}
|
||||
% \input{chap/graphisme}
|
||||
\input{chap/gnuplot}
|
||||
\input{chap/print}
|
||||
\input{chap/webcam}
|
||||
% \input{chap/SCSI}
|
||||
\input{chap/X11}
|
||||
\input{chap/manpages}
|
||||
|
||||
\input{chap/Fortran}
|
||||
\input{chap/Python}
|
||||
\input{chap/dino}
|
||||
\input{chap/textes}
|
||||
\input{chap/MINITEL}
|
||||
@ -123,7 +130,6 @@ en ligne sur le site du Tetalab. Your mileage may vary\dots
|
||||
\input{chap/DNS}
|
||||
\input{chap/ssh}
|
||||
\input{chap/hardware}
|
||||
\input{chap/streaming}
|
||||
\input{chap/gadgets}
|
||||
% \input{chap/slang}
|
||||
\input{chap/curses}
|
||||
|
Loading…
Reference in New Issue
Block a user