\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 % ================================================================