apero time

This commit is contained in:
tth 2021-10-19 19:07:28 +02:00
parent 7a4ae87c0e
commit 3e2fb4a408
10 changed files with 201 additions and 19 deletions

View File

@ -456,6 +456,19 @@ extern int optind, opterr, optopt;
La page de man de getopt(3) contient des explications détaillées
et un exemple simple d'utilisation.
% ---------------------------------------------------------
\section{Erreurs classiques}
Variables non initialisées.
Sortir d'un tableau.
Dépassement de la taille d'une chaine.
Libérer deux fois la mémoire.
\textsl{file pointer} invalide.
% =========================================================

View File

@ -19,13 +19,11 @@ allons voir maintenant.
\section{oscdump \& oscsend}
\index{oscdump}\index{oscsend}
\textbf{Envoyer :}
Pour envoyer, il faut bien définir une destination. Une fois
de plus, le couple IP adresse/port est utilisé. Ce sont les
deux premiers paramètres.
\begin{verbatim}
tth@debian:~$ oscsend localhost 1664 /tmp/kmem is 61 'meg, efface !'
tth@debian:~$
@ -38,7 +36,6 @@ chaine (notez les simples quotes pour passer les caractères
speciaux du shell).
\textbf{Ecouter :}
\begin{verbatim}
tth@debian:~$ oscdump 1664
/tmp/kmem is 61 "meg, efface !"
@ -89,6 +86,8 @@ $client->send(['/proc/kcore', 'i', 61, 's', "bla"]);
Beaucoup d'autres logiciels peuvent être controlés par OSC, ou
générer des trames OSC : on peut citer
Processing\index{Processing}, Chuck\index{Chuck},\dots
Processing\index{Processing},
Chuck\index{Chuck} (page \pageref{chuck-osc}),
\dots

View File

@ -142,6 +142,7 @@ protocol, improved threading support, and extensibility.
en C, mais le premier exemple du tutorial d'initiation ne fonctionne
pas vraiment comme il devrait. Mais quand même une affaire à suivre.
\lstinputlisting[language=c]{code/xf_yesno.c}
%-------------------------------------------------------------------

View File

@ -6,33 +6,125 @@ Disons que c'est un synthé dont chaque composant élémntaire
est indépendant, et interconnectable aux autres par un gros
plat de cables sans parmesan.
% ------------------------------------------------------
Un univers intrigant et infini.
% ======================================================
\section{Chuck} \index{Chuck}
Chuck peut être vu comme un équivalent logiciel à ce système
de cablage. Nous avons sour la main des modules, que nous allons
raccorder et paramétrer grace à l'opérateur \texttt{=>}.
Le module \texttt{dac} correspond à la sortie audio de votre
machine. Consultez
http://chuck.cs.princeton.edu/ et http://chuck.stanford.edu/
pour tout savoir...
machine.
Voici donc un premier exemple, sans la moindre prétention
musicale~:
\lstinputlisting{code/beep.ck}
Félicitation, vous venez de coder un diapason.
Félicitation, vous venez de coder un diapason rudimentaire.
La première ligne connecte un oscillateur sinusoïdal
directement sur la sortie audio, les deux suivantes
règlent le volume et la hauteur du signal généré, et la
dernière demande d'attendre deux secondes avant d'arreter.
% ------------------------------------------------------
Mais je suis bien d'accord avec vous, ce son est un peu
agressif, surtout dans l'attaque. Hop, nous allons brancher
un nouveau module entre le générateur et la sortie~:
un contrôleur d'enveloppe qui atténuera la brutalité de
l'attaque et la violence de la fin du son.
\lstinputlisting{code/bipenv.ck}
C'est déja mieux \textit{:)} Détaillons les quatre dernières
ligne de ce script~: deux nous sont déja connues, celles où
l'on met une \textsl{duration} dans le \texttt{now} afin
d'attendre un certain temps. quand aux deux autres
(qui sont des appels de méthode, reconnaissables à la
paire de parenthèses qui les terminent)
elles déclenchent le debut et la fin du contrôleur
d'enveloppe.
Quand on actionne le \texttt{keyOn}, le processeur d'enveloppe
commence avc un gain à 0 et monte progressivement au gain
maximal dans le temps réglé au préalable dans
\texttt{e.duration}. De la même façon, \texttt{keyOff}
fait redescendre le volume à 0 à la fin du beep sur
la même durée, et pour entendre cette partie finale , il nous
faut attendre un peu, d'où la dernière ligne.
\subsection{Les filtres}
Le son que nous avons utilisé dans les précédents exemples
est une sinusoïde, un son « pur » que l'on peut qualifier
sans crainte de légèrement pauvre. Nous allons régler ça.
Vous pouvez déja essayer de remplacer le sinus par une onde
carrée, un \texttt{SqrOsc}, bien remplie d'harmoniques.
C'est ce que nous allons faire, mais nous allons aussi rajouter
un filtre passe-bande pour moduler la couleur du son.
\lstinputlisting{code/bipfilter.ck}
Puisque la fréquence de notre \textit{beep} est calée à
440 Hz, nous allonc chercher les harmoniques supérieures
vers 1337 Hz, avec une largeur de bande assez grande.
Et nous obtenons un son bien plus brillant, mais encore
un peu inerte. Prochaine étape, brancher un LFO sur
ce filtre\dots
\subsection{Beep à vibrato}
Les choses vont un peu se corser, avec la notion de
\textsl{multi thread}. Un grand mot pour une chose
(relativement) simple. En fait, une partie du script
va s'exécuter indépendament du reste, un peu comme
l'autonomie de votre LFO matériel.
\lstinputlisting{code/bipvibrato.ck}
Spork !!
\subsection{Attack Decay Sustain Release} \index{ADSR}
Un module d'enveloppe bien plus élaboré, fidèle aux canons
de l'époque. Son utilisation est semblable à \texttt{Envelope} que nous
avons vu plus haut, ce qui nous donne ce patch~:
\begin{verbatim}
SqrOsc s => BPF f => ADSR adsr => dac;
\end{verbatim}
Point suivant : configurer notre ADSR. Il y a bien plus de potards
que dans l'exemple précédent :
attack time et rate, decay time et rate, release time et rate et
sustain level pour finir.
\subsection{Jouer des samples}
Oui, on peut.
\subsection{Communication OSC} \index{OSC} \label{chuck-osc}
OSC, Open Sound Control, a son chapitre dédié en page \pageref{chap:OSC}.
Nous allons nouc concentrer sur les aspects Chuck.
\subsection{Aller plus loin}
Et pour la suite, allez onsulter
http://chuck.cs.princeton.edu/ et http://chuck.stanford.edu/
pour tout savoir. La rubrique des exemples est très
instructive.
% ======================================================
\section{Super Collider}
Là, nous rentrons dans le domaine de la jeune Nina, je vais
donc lui,laisser la plume (ou le clavier).
% ------------------------------------------------------
% ======================================================
\section{CSound}
\section{CSound} \index{Csound}
% ------------------------------------------------------
% ======================================================

View File

@ -101,7 +101,8 @@ https://engineering.giphy.com/how-to-make-gifs-with-ffmpeg/ \index{gif89a}
\subsection{Encoder un cloître}
Là, nous sommes dans du \textsl{serious bizness}, puisque cette vidéo
a été programmée par James Lewis pour la résidence « Sonoptic 2020 ».
a été programmée par James Lewis pour la résidence « Sonoptic 2020 »,
vidéo dont il a composé la bande originale.
C'est donc un exemple réel, avec même des méta-données.
\begin{verbatim}
@ -119,6 +120,7 @@ ffmpeg -nostdin \
Comment convertir lors de l'encodage un fichier \texttt{.WAV}
en un format compressé afin de ne pas saturer la buvette ?
\textsf{il dit qu'il ne comprend pas la question.}
Quand on encode en // images et son, comment arreter quand on atteint
la fin du plus court des deux flux ?
@ -139,10 +141,11 @@ soigneusement éviter, pour nous concentrer sur la ligne
de commande.
Pour balancer toutes les vidéos en boucle random~:
\texttt{vlc -f -Z *.mp4}.
\texttt{vlc -f -Z *.mp4}. Mais comment supprimer l'affichage
du nom de fichier au début de chaque séquence ?
VLC peut éventuellement aussi être utilisé comme un outil
de streaming, voyez ça page \pageref{streamvlc}.
de streaming, voyez ça page \pageref{streamvlc}, bon courage.
% --------------------------------------------------------------------
@ -153,7 +156,6 @@ de codecs, la foultitude de containers, et les nombreuses variantes de
combinaisons codec/container rendent la compréhension de cet univers
assez perturbante.
\subsection{rtmp} \index{rtmp}
\texttt{flvstreamer -r rtmp://lacantine.live-fstreams.cdn02.rambla.be:1935/live-lacantine/live-lacantine-2 | mplayer -}

12
code/bipenv.ck Normal file
View File

@ -0,0 +1,12 @@
// Just a better beep
SinOsc s => Envelope e => dac;
// reglage de notre oscillateur
0.5 => s.gain;
440 => s.freq;
// reglage de notre enveloppe
200::ms => e.duration;
// hop !
e.keyOn();
2::second => now;
e.keyOff();
1::second => now;

16
code/bipfilter.ck Normal file
View File

@ -0,0 +1,16 @@
//--- Just a noisy beep
SqrOsc s => BPF f => Envelope e => dac;
//--- reglage de notre oscillateur
0.8 => s.gain;
440 => s.freq;
//--- reglage de notre enveloppe
100::ms => e.duration;
//--- reglage du filtre passe bande
2 => f.Q;
1337 => f.freq;
//--- hop encore un beep !
e.keyOn();
2::second => now;
e.keyOff();
1::second => now;

14
code/bipvibrato.ck Normal file
View File

@ -0,0 +1,14 @@
SqrOsc s => BPF f => Envelope e => dac;
0.8 => s.gain;
440 => s.freq;
100::ms => e.duration;
//--- reglage du filtre passe bande
2 => f.Q;
1337 => f.freq;
//--- hop encore un beep !
e.keyOn();
2::second => now;
e.keyOff();
1::second => now;

33
code/xf_yesno.c Normal file
View File

@ -0,0 +1,33 @@
#include <forms.h>
int main(int argc, char *argv[]) {
FL_FORM *form;
FL_OBJECT *yes,
*no,
*but;
fl_initialize(&argc, argv, "FormDemo", 0, 0);
form = fl_bgn_form(FL_UP_BOX, 320, 120);
fl_add_box(FL_BORDER_BOX, 160, 40, 0, 0, \
"Do you want to Quit?");
yes = fl_add_button(FL_NORMAL_BUTTON, \
40, 70, 80, 30, "Yes");
no = fl_add_button(FL_NORMAL_BUTTON, \
200, 70, 80, 30, "No");
fl_end_form();
fl_show_form(form, FL_PLACE_MOUSE, FL_TRANSIENT, \
"Question");
while (1) {
if (fl_do_forms() == yes {
printf("Yes is pushed\n");
break;
}
else printf("No is pushed\n");
}
fl_finish();
return 0;
}

View File

@ -18,7 +18,7 @@
%------ reglages des 'listings'
\lstset{frame=single} % dessin d'un cadre autour du listing
\lstset{basicstyle=\ttfamily\small}
\lstset{aboveskip=0.5em,belowskip=0.5em}
\lstset{aboveskip=0.8em,belowskip=0.5em}
\setcounter{tocdepth}{1}
\pagestyle{plain}