157 lines
5.0 KiB
TeX
157 lines
5.0 KiB
TeX
\chapter{Open Sound Control}
|
|
\index{OSC} \label{chap:OSC}
|
|
|
|
Pour moi c'est une façon simple et élégante de faire discuter des
|
|
ordinateurs et je ne dis pas ça parce que j'ai déja pas mal
|
|
joué\footnote{https://git.tetalab.org/tTh/gadgets-OSC} avec,
|
|
mais parce c'est probablement vrai\dots
|
|
|
|
% ================================================================
|
|
\section{C'est quoi ?}
|
|
|
|
D'après 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 IP\index{IP} au travers
|
|
des protocoles UDP\index{UDP} ou TCP\index{TCP} et apporte des
|
|
améliorations en termes de rapidité et de flexibilité par rapport
|
|
à l'ancienne norme MIDI\index{MIDI}\dots}
|
|
|
|
|
|
% ================================================================
|
|
\section{Programmation}
|
|
|
|
Actuellement, j'utilise (pour le C) \texttt{liblo}\index{liblo}
|
|
qui reste simple à utiliser
|
|
tout en permettant de descendre à un bas niveau.
|
|
Elle fonctionne sur un modèle asynchrone
|
|
(ce qui peut poser des soucis selon le contexte d'utilisation)
|
|
et de bonnes possibilités de filtrage selon certains critères.
|
|
|
|
|
|
Cette bibliothèque est livrée avec deux outils de test/debug que nous
|
|
allons voir maintenant, et que je vous encourage à apprivoiser.
|
|
|
|
% ================================================================
|
|
|
|
\section{oscdump \& oscsend}
|
|
\index{oscdump}\index{oscsend}
|
|
|
|
\textbf{Envoyer :}
|
|
|
|
Pour envoyer des données, il faut bien définir une destination. Une fois
|
|
de plus, le triplet IP adresse/port/chemin est utilisé.
|
|
Ce sont les trois premiers paramètres de la commande~:
|
|
\begin{verbatim}
|
|
tth@debian:~$ oscsend localhost 1664 /tmp/kmem 'is' 61 'meg, efface !'
|
|
\end{verbatim}
|
|
|
|
La chaine \texttt{is} que vous voyez dans la ligne de commande
|
|
décrit le type des paramètres qui suivent~:
|
|
\texttt{i} est pour un integer et \texttt{s} pour une
|
|
chaine de caractères
|
|
(notez les simples quotes autour du texte pour passer les
|
|
caractères speciaux du shell, comme l'espace).
|
|
Il existe d'autres types de paramètres que nous verrons plus loin.
|
|
|
|
\vspace{1em} \textbf{Écouter :}
|
|
|
|
C'est beaucoup plus simple, il suffit de donner le numéro
|
|
de port UDP sur lequel nous allons écouter.
|
|
L'option \texttt{-L} est utile si vous voulez exploiter
|
|
la sortie de oscdump,
|
|
par exemple avec "\texttt{oscdump 9000 | cat -n}" pour numéroter
|
|
les évènements reçus.
|
|
|
|
\begin{verbatim}
|
|
tth@debian:~$ oscdump 1664
|
|
/tmp/kmem is 61 "meg, efface !"
|
|
^C
|
|
\end{verbatim}
|
|
|
|
Pour descendre plus bas dans la pile, on pourra efficacement utiliser
|
|
un \textsl{dumper} de messages UDP qui nous montrera le cœur des trames.
|
|
Voici ce que l'on voit de l'envoi décrit page \pageref{sendosc}~:
|
|
|
|
\begin{verbatim}
|
|
udp_dumper: listen on port 9000
|
|
---+ frame 0 32 bytes t= 6.179 sec.
|
|
0 | 2f 64 65 6d 6f 00 00 00 2c 69 73 00 00 00 00 3d | /demo...,is....= |
|
|
16 | 6d 65 67 2c 20 65 66 66 61 63 65 20 21 00 00 00 | meg, efface !... |
|
|
32 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ |
|
|
\end{verbatim}
|
|
|
|
On y retrouve certaines des choses le chemin, la liste des types,
|
|
le contenu des messages, toutes choses qui seront
|
|
décrites en détail dans la page \pageref{trameosc}.
|
|
% ================================================================
|
|
|
|
\section{Exemple de code}
|
|
|
|
\textbf{Ecouter :}
|
|
|
|
Attention, là, nous arrivons sur un domaine plus
|
|
hardu\footnote{Un beau néoligisme, n'est-il pas ?}.
|
|
En effet, la mécanique interne de \texttt{liblo}
|
|
utilise un thread d'écoute qui appelle des
|
|
\textsl{callbacks} préalablement "accrochés",
|
|
\textsl{hooked} en vrai langue.
|
|
|
|
\lstinputlisting[language=c]{code/OSC/listen-osc.c}
|
|
|
|
\textbf{Envoyer :} \label{sendosc}
|
|
|
|
Cette partie là est beaucoup plus simple.
|
|
|
|
\lstinputlisting[language=c]{code/OSC/send-osc.c}
|
|
|
|
J'avoue ne pas encore savoir ce que veut bien dire la
|
|
valeur de retour.
|
|
|
|
% ================================================================
|
|
|
|
\section{La trame OSC} \label{trameosc}
|
|
|
|
\textsf{Après tout, ce ne sont que quelques octets.}
|
|
|
|
% ================================================================
|
|
|
|
|
|
\section{En Perl} \index{Perl}
|
|
|
|
\begin{verbatim}
|
|
use Net::OpenSoundControl::Client;
|
|
|
|
$client = Net::OpenSoundControl::Client->new(
|
|
Host => $target, Port => $port)
|
|
or die "Could not start client: $@\n";
|
|
|
|
$client->send(['/proc/kcore', 'i', 61, 's', "bla"]);
|
|
\end{verbatim}
|
|
|
|
% ================================================================
|
|
% nouveau: Sat Jul 15 07:14:10 UTC 2023
|
|
|
|
% \section{Le routage}
|
|
|
|
% WIP...\index{XXX}
|
|
|
|
|
|
% ================================================================
|
|
|
|
\section{Autres logiciels}
|
|
|
|
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} (page \pageref{chuck-osc}),
|
|
Puredata\index{puredata}.
|
|
Certains prétendent même qu'un vieux néo-rural tente de
|
|
faire un \textsl{binding} pour le
|
|
Fortran\index{fortran} moderne.
|
|
\dots
|
|
|
|
% ================================================================
|
|
|