Bot IRC -> MIDI

aka pouetBot

(Page créée le 15 mai 2020, en cours de rédaction)

Comment transformer les profondes discussions d'IRC en « chœur de l'aube » ?
→ avec un bot logiciel qui transforme les messages écrits en notes MIDI.

Le bot en php écoute les discussions d'un canal IRC et transforme ce que chaque participant·e écrit en notes MIDI qui sont envoyées à un synthé logiciel (qysnth) qui génère les sons, le résultat est streamé vers un serveur icecast, le résultat est streamé en utilisant un serveur WebRTC, généreusement public, dont la latence est plus adapté à une transcription en temps réel.
Tout ça forme une usine à gaz moderne et performante, mais qui pourrait sûrement trouver une forme différente plus optimale.

Tous les caractères alphanumériques définissent une note.
Tous les caractères accentués et de ponctuation définissent un hit d'instrument de percussion.
Commencer une ligne par un chiffre (entre 1 et 9) définit le nombre de répétitions de la ligne.

Les commandes suivantes sont utilisables :

  • !change : changement d'instrument au hasard
  • !instrument [NUMERO] : changement d'instrument, NUMERO est compris entre 1 et 128, selon le standard General MIDI 1
  • !panique : coupe toutes les notes (envoie ALL NOTES OFF et ALL SOUNDS OFF sur les 16 canaux MIDI)

D'autres commandes sont utilisables pour le débuguage

Une fois les différents logiciels démarrés ainsi que la communication entre eux, démarrer une videoconférence webRTC sur une généreuse instance jitsi (par exemple, parmi cette liste d'instance Jitsi compilée par Framasoft), en coupant la caméra et en choisissant comme source sonore le “monitor of audio interne stéréo analogique”. Ce choix de source sonore vaut pour un ordinateur sous linux debian, il faudra l'adapter dans d'autres cas. Ce flux sonore correspond au “son qui sort de l'ordinateur”, toutes applications confondues.

Le script mibot_irc est en écoute sur le canal IRC choisi, chaque nouvelle contribution est analysée pour y chercher des commandes ou interpréter ce qui est écrit.
Selon les cas, des scripts sont appelés pour envoyer les messages adaptés à pure data qui les transformera en commande MIDI.
Au démarrage, ces scripts ouvrent un socket UDP et envoient les messages nécessaires, dans le cas d'un message à multiples caractères (la plupart des messages sont de ce type), il est envoyé, caractère après caractère au tempo voulu. Une fois l'action terminé le socket est fermé et le script s'arrête et “se détruit”.

qsynth &      # démarrer qsynth
sleep 5       # nécessaire en script pour laisser du temps à qsynth pour s'initialiser
puredata -open ./transmetteur_midi.pd -alsamidi -midiindev 1 -midioutdev 1 &
aconnect -i   # liste d'adresse des émetteurs MIDI
aconnect -o   # liste d'adresse des récepteurs MIDI
aconnect 128:1 129:0  # connecter la sortie MIDI de pure data à l'entrée MIDI de qsynth, à adapter selon le résultat des commandes précédentes
# aseqdump -p 128:1   # si on veut afficher les messages MIDI qui sortent de pure data
php ./mibot_irc_001.php

Les différents scripts sont téléchargeables dans ce dépôt : https://github.com/emoc/pouetBot

Script de base pour envoyer des messages aléatoires en UDP à pure data

mibot_test.php (cliquer pour afficher le code)

mibot_test.php
#!/usr/bin/php -q 
<?php
/*
  Messages envoyés
    note {channel} {note} {vel} {dur}    : jouer la {note} sur ce {channel} MIDI avec une vélocité {vel} et une durée {dur}
    inst {channel} {inst}                : changer l'instrument du {channel} par {inst}
    perc {channel} {inst} {vel} {dur}    : jouer une percussion sur le {channel} ...
 
    channel : entre 1 et 16  (canal MIDI)
    note    : entre 0 et 127 (note à jouer)
    vel     : entre 0 et 127 (vélocité)
    dur     : entier (durée)
 
    note : le canal MIDI de percussion étant toujours le 10 (sauf exception...), il est fixé, c'est la seule différence entre perc et note...
*/
 
// Créer un socket sur le port UDP 5113 de la machine locale
$fp = stream_socket_client("udp://127.0.0.1:5113", $errno, $errstr);
 
$compteur = 1;
 
if (!$fp) {
    echo "ERREUR : $errno - $errstr<br />\n";
} else {
 
  while (1) {  
    $rnd = rand(0,99); 
    $message = "";
    // Créer un message parmi les 3 types afin de tester que tout fonctionne
    if ($rnd < 33) {
      $message = "note " . rand(1,16) . " " . rand(0,127) . " " . rand(0, 127) . " " . (rand(20, 100) * 10) . ";\n";
    } else if ($rnd >= 33 && $rnd < 66) {
      $message = "inst " . rand(1,16) . " " . rand(0,127) . ";\n";
    } else {
      $message = "perc 10 " . rand(0,127) . " " . rand(0, 127) . " " . (rand(20, 100) * 10) . ";\n";
    }
    echo "envoi # $compteur : $message";  
 
    fwrite($fp, $message);   // Envoyer le message sur le socket
    sleep(1);                // Petite pause d'1 seconde
    $compteur ++;
  }
  //fclose($fp);
}
?>

Démarrer Butt (dans cette configuration, Butt est utilisé pour enregistrer l'audio produit localement, en parallèle de la diffusion en stream.)
Démarrer Chromium

Réglages pulseaudio

Dans l'onglet enregistrement, choisir “Monitor of Audio interne stéréo analogique” pour que le son utilisé ne soit pas celui du micro, mais le mix des sons produits.

Réglages jitsi

Pour l'émetteur, démarrer jitsi sans caméra et choisir que les participant·e·s démarrent aussi sans caméra ni micro.
Régler dans les paramètres de son “Audio interne stéréo analogique”

Ça fonctionne avec très peu de latence MAIS beaucoup de compression… Il faudrait trouver une alternative

Buffer overflow! Le buffer du socket est dépassé par la taille de certains messages, les morceaux de messages restant seront interprêtés aussi, de manière imprévisible!
En particulier pour la gestion des 16 slots correspondant à chaque canal MIDI
Certains messages d'erreur du serveur IRC, déclenchés par ces dépassements sont invisibles sur le canal, mais sont interprêtés.
Beaucoup de notes restent en suspend… La fonction !panique est très utile!

Corriger les bugs!

Une commande pour changer le tempo ? du swing ?

Trouver une alternative utilisat·eur·rice-conviviale avec une meilleure qualité sonore, quelques pistes :

Un MOOC du CCRMA sur le sujet (en anglais) : https://online.stanford.edu/courses/sohs-music0001-online-jamming-and-concert-technology

(Utile aussi pour celleux qui veulent connaître le truc dans les tours de magie )

Percussions

carac.MIDIinstrumentcarac.MIDIinstrumentcarac.MIDIinstrument
,35Bass Drum 2.49 Crash Cymbal 1î63Open High Conga
;36Bass Drum 1#50High Tom 1ï64Low Conga
-37Side Stick%51Ride Cymbal 1|65High Timbale
!38Snare Drum 1é52Chinese Cymbalù67High Agogo
*39Hand Clapè53Ride Bellê68Low Agogo
?40Snare Drum 2ç54Tambourineü69Cabasa
:41Low Tom 2à55 Splash Cymbalô70Maracas
/42Closed Hi-hat$56Cowbellö71Short Whistle
&43Low Tom 1@57Crash Cymbal 2Ô72Long Whistle
(44Pedal Hi-hat]58Vibra SlapÛ73Short Guiro
_45Mid Tom 2ä59Ride Cymbal 2Î74Long Guiro
)46Open Hi-hatâ60High BongoÖ75Claves
+47Mid Tom 1}61Low Bongoï76High Wood Block
=48 High Tom 2{62Mute High CongaÜ77Low Wood Block

Notes

carac.MIDIoctavenotecarac.MIDIoctavenotecarac.MIDIoctavenotecarac.MIDIoctavenote
A211LaQ484Dog766Miw1038Sol
B231SiR504h776Fax1058La
C242DoS524Mii796Soly1078Si
D262T534Faj816Laz1088Do
E282MiU554Solk836Si01109
F292FaV574Lal847Do11129Mi
G312SolW594Sim86721139Fa
H332LaX605Don887Mi31159Sol
I352SiY625o897Fa41179La
J363DoZ645Mip917Sol51199Si
K383a655Faq937La612010Do
L403Mib675Solr957Si712210
M413Fac695Las968Do812410Mi
N433Sold715Sit988912510Fa
O453Lae726Dou1008Mi
P473Sif746v1018Fa

Cerise sur le gateau

Du midi (d) à la fréquence (f)

  • openatelier/projet/bot_irc_midi.txt
  • Dernière modification: 2020/05/29 12:21
  • par emoc