\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

%	================================================================

