From 3e2fb4a40877b51fcb922873545e8797c68a4190 Mon Sep 17 00:00:00 2001 From: tth Date: Tue, 19 Oct 2021 19:07:28 +0200 Subject: [PATCH] apero time --- chap/C.tex | 13 ++++++ chap/OSC.tex | 7 ++- chap/X11.tex | 1 + chap/modular.tex | 112 +++++++++++++++++++++++++++++++++++++++++---- chap/video.tex | 10 ++-- code/bipenv.ck | 12 +++++ code/bipfilter.ck | 16 +++++++ code/bipvibrato.ck | 14 ++++++ code/xf_yesno.c | 33 +++++++++++++ main.tex | 2 +- 10 files changed, 201 insertions(+), 19 deletions(-) create mode 100644 code/bipenv.ck create mode 100644 code/bipfilter.ck create mode 100644 code/bipvibrato.ck create mode 100644 code/xf_yesno.c diff --git a/chap/C.tex b/chap/C.tex index b7a1678..ad466e7 100644 --- a/chap/C.tex +++ b/chap/C.tex @@ -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. % ========================================================= diff --git a/chap/OSC.tex b/chap/OSC.tex index d83409a..d2a1881 100644 --- a/chap/OSC.tex +++ b/chap/OSC.tex @@ -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 diff --git a/chap/X11.tex b/chap/X11.tex index 60b432e..e08e3f2 100644 --- a/chap/X11.tex +++ b/chap/X11.tex @@ -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} %------------------------------------------------------------------- diff --git a/chap/modular.tex b/chap/modular.tex index b0e3ea0..c5b3bfe 100644 --- a/chap/modular.tex +++ b/chap/modular.tex @@ -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} -% ------------------------------------------------------ +% ====================================================== diff --git a/chap/video.tex b/chap/video.tex index a252161..0d9d151 100644 --- a/chap/video.tex +++ b/chap/video.tex @@ -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 -} diff --git a/code/bipenv.ck b/code/bipenv.ck new file mode 100644 index 0000000..ce09bcd --- /dev/null +++ b/code/bipenv.ck @@ -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; diff --git a/code/bipfilter.ck b/code/bipfilter.ck new file mode 100644 index 0000000..cd5c32a --- /dev/null +++ b/code/bipfilter.ck @@ -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; diff --git a/code/bipvibrato.ck b/code/bipvibrato.ck new file mode 100644 index 0000000..e765055 --- /dev/null +++ b/code/bipvibrato.ck @@ -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; diff --git a/code/xf_yesno.c b/code/xf_yesno.c new file mode 100644 index 0000000..a560ffc --- /dev/null +++ b/code/xf_yesno.c @@ -0,0 +1,33 @@ +#include + +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; +} diff --git a/main.tex b/main.tex index a2670a7..dec2b00 100644 --- a/main.tex +++ b/main.tex @@ -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}