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.*
|
log.*
|
||||||
*.png
|
# *.png
|
||||||
|
|
||||||
MANIFEST
|
MANIFEST
|
||||||
tarball
|
tarball
|
||||||
|
@ -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
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}
|
\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.
|
||||||
|
|
||||||
|
% ==============================================================
|
||||||
|
@ -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à.
|
||||||
|
|
||||||
% ---------------------------------------------------------
|
% ---------------------------------------------------------
|
||||||
|
|
||||||
|
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,
|
\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
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,
|
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}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
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},
|
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.
|
||||||
|
@ -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}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%====================================================================
|
%====================================================================
|
||||||
|
@ -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}
|
||||||
|
@ -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.
|
||||||
|
|
||||||
%
|
%
|
||||||
% ----------------------------------------------------------------
|
% ----------------------------------------------------------------
|
||||||
|
@ -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
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 ?
|
% 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}
|
||||||
|
Loading…
Reference in New Issue
Block a user