Midi out

  • Carte correspondante : Godot
  • Documentation : Godot
  • Codes disponibles actuellement :

Godot n'a pas de fonction inbuilt lui permettant d'output un signal MIDI...
Il existe cependant un plugin, rugueux sur les bords, créé par un programmeur au doux nom de NullMember

En utilisant ce plugin, il est possible de piloter des actionneurs depuis godot !!
Mais le chemin est plus complexe que pour le MIDI in.

Après avoir trouvé comment faire, j'ai ranimé une conversation bien référencée sur le sujet, dont le dernier message datait d'il y a 5 ans.
Voici le lien de ce post, au cas où de nouvelles réponses apparaissent dans le futur.

J'ai également fait une repo github pour archiver les informations également présentes sur cette page. Un template y est présent, et si update sur la méthode il y a, elle se fera à cet endroit.

Je tiens également à dire que j'utilise Godot4.3, et ainsi qu'il est possible que ce que je dise se retrouve obsolète dans le futur.

Le processus est peu adaptable et variera forcément d'un setup à un autre. Ce qui suit est donc la petite histoire de comment j'ai réussi à allumer une led avec un clique gauche, et comment j'ai réussi à l'éteindre avec un clique droit :D (via MIDI bien sûr)

J'ai commencé par installer le plugin de NullMember (télécharger le zip et l'extraire dans un fichier nommé "addons" dans votre projet godot). Comme dit dans sa documentation, le plugin fonctionne mais n'est pas reconnu par godot, il est donc actif par défaut. J'ai quand même relancé godot, pour être sûr.
J'ai ensuite suivi la documentation (très courte :,( de NullMember.
J'ai donc écrit :

func _ready():
midi_out.open_port(x)

x étant le port par lequel je suis censé envoyer le signal MIDI
Personnellement, je n'avais aucune idée du numéro du port sur lequel était branché ma LED.
Je suis sur linux. J'ai donc installé le package alsa-utils pour avoir accès à l'outil cli "amidi"
Si vous n'êtes pas sur linux j'imagine qu'il y a des équivalents mac et windows

J'ai donc ouvert un terminal, et tapé "amidi -l" à l'intérieur. J'ai donc eu une iste des périphériques pouvant recevoir du signal MIDI.
Dans mon cas amidi -l a sorti les informations intéressantes hw:1,0,0 et hw:1,0,1

Après avoir pris connaissance des ports qui m'intéressaient, j'ai fait des tests en envoyant "manuellement" des signaux à la LED.
J'ai testé les deux ports et seul le hw:1,0,1 fonctionnait pour la LED, j'en ai déduit que j'avais trouvé le bon port.

La carte que j'utilisais pour utiliser l'actionneur (la LED) est une carte MEMORIZ d'interface Z :D
Cette carte demande, pour que l'actionneur prenne en compte les demandes via MIDI, que l'on deux fois la même commande, mais une fois avec une tension basse et l'autre avec une haute.
Cependant, avec d'autres carte je pense qu'un seul signal suffit, et vais donc continuer comme si, effectivement, je ne devais envoyer qu'un seul signal à chaque fois.

Ainsi, pour tester que la LED fonctionne bien, j'ai envoyé la commande 'amidi -p hw:1,0,1 -S "B0 3F 127F"' pour l'allumer, puis 'amidi -p hw:1,0,1 -S "B0 3F 00"' pour l'éteindre.

Disclaimer pour ceux qui utilisent une carte MEMORIZ comme moi durant mes tests, pour l'allumer il faudra donc faire 'amidi -p hw:1,0,1 -S "B0 1F 127F" && amidi -p hw:1,0,1 -S "B0 3F 127F' et changer le deuxième argument de la même manière chaque fois.

Une fois ces informations en tête, je suis retourné sur godot et ai fait x = 2, car c'est la seconde interface midi scannée dans la liste (c'est bizarre mais j'ai essayé plein de numéros et 2 était le seul qui marchait)

J'ai ensuite réutilisé une fonction du plugin de NullMembers (encore), qui est midi_out.send_message([a, b, c])
a = la "note on" selon la doc de NullMembers = 0xB0
b = le numéro de note = 0x3F
c = la vélocité = 0x127F

Les valeurs de a b et c sont égales à celles données dans la commande amidi -p d'avant, dans le même ordre ; amidi -p hw:1,0,1 -S "a b c" mais sans le 0x devant

Ainsi on a notre script !!

extends Node2D

var x = 2
var a = 0xB0
var b = 0x3F
var c = 0x127F

func _ready():
midi_out.open_port(x)
midi_out.send_message([a, b, c])

Ce code allume la LED !!
Et si c = 00
Le code éteindra la LED !!!

Il suffit ensuite d'attacher la fonction midi_out.send_message([]) à une fonction InputEvent et rapidement il est très simple, en modulant c, de moduler la luminosité de la LED avec notre clavier.

Voilà !!

Par rapport au midi in, le midi out est plus galère à obtenir dans godot, et surtout pose des problèmes pour l'adaptabilité. En fonction du hardware présent, il faudra retravailler le code du jeu/programme en conséquent.
Je recommende donc d'open sourcé un tel projet, si il est exporté et distribué :D

J'espère que ce petit tuto en aura aidé !!!