Commander votre DAW avec des boutons poussoirs externes (Exemple avec Rosegarden)
Bonjour,
pour ceux que cela intéressent, j'ai crée un petit montage pour commander Rosegarden à distance (mais cela pourrait très bien commander d'autres séquenceurs)
Cela sert à démarrer le séquenceur, l'arrêter, aller en avant, aller en arrière, enregistrer, etc avec des boutons poussoirs extérieurs.
Cela peut permettre par exemple à un guitariste de commander le séquenceur au pied sans que l'application soit en mode focus.
Pour cela j'ai utilisé un Arduino Uno (je n’avais que cela sous la main) et une interface midi USB/DIN MIDI de marque EDIROL. Je pense qu’il doit être possible d’utiliser directement le port USB de l’Arduino pour faire en sorte qu’il se comporte comme une carte audio/midi. Cette dernière solution permettrait de s’affranchir de la carte USB/DIN MIDI (je verrai cela plus tard)
Le projet est à l'état de prototype, dans mon montage, pour le moment je traite uniquement le démarrage et l’arrêt de Rosegarden.
Tout est sous licence libre.
Les schémas :
Le code (pour d'autre logiciel séquenceur, il faudra peut-être modifier les CC#) :
Pour que cela fonctionne, il faudra bien sûr alimenter l’Arduino (par usb par exemple) et raccorder la sortie DIN/MIDI de l’Arduino vers le convertisseur DIN MIDI/USB. Et finalement raccorder le convertisseur midi sur l’ordinateur.
Il faudra que l’entrée Jack midi contrôleur de Rosegarden (External contrôleur) soit connectée sur la sortie de l’interface midi (dans mon exemple UM-1 Midi 1) comme dans cet exemple :
Bien à vous !
pour ceux que cela intéressent, j'ai crée un petit montage pour commander Rosegarden à distance (mais cela pourrait très bien commander d'autres séquenceurs)
Cela sert à démarrer le séquenceur, l'arrêter, aller en avant, aller en arrière, enregistrer, etc avec des boutons poussoirs extérieurs.
Cela peut permettre par exemple à un guitariste de commander le séquenceur au pied sans que l'application soit en mode focus.
Pour cela j'ai utilisé un Arduino Uno (je n’avais que cela sous la main) et une interface midi USB/DIN MIDI de marque EDIROL. Je pense qu’il doit être possible d’utiliser directement le port USB de l’Arduino pour faire en sorte qu’il se comporte comme une carte audio/midi. Cette dernière solution permettrait de s’affranchir de la carte USB/DIN MIDI (je verrai cela plus tard)
Le projet est à l'état de prototype, dans mon montage, pour le moment je traite uniquement le démarrage et l’arrêt de Rosegarden.
Tout est sous licence libre.
Les schémas :
Le code (pour d'autre logiciel séquenceur, il faudra peut-être modifier les CC#) :
/** Petit programme pour activer le transport dans Rosegarden à l'aide de boutons poussoirs. Le programme permet également d'envoyer des notes midi. Dans cette version, seulement les commandes démarrer et arrêter Rosegarden sont traitées. @auteur Stéphane JOLY / melsiar chez gmail dot com Version 20210113 Le logiciel est sous General Public License V3 */ const byte boutonRecule = 2; /** Pour le bouton reculer **/ const byte boutonAvance = 3; /** Pour le bouton avancer **/ const byte boutonArret = 4; /** Pour le bouton stop **/ const byte boutonLecture = 5; /** Pour le bouton lecture **/ const byte boutonBoucle = 6; /** Pour le bouton boucle **/ const byte boutonEnregistre = 7; /** Pour le bouton enregistre **/ const byte ccRecule = 114; /** CC# 114 recule Rosegarden **/ const byte ccAvance = 115; /** CC# 115 avance Rosegarden **/ const byte ccArret = 116; /** CC# 116 arrêt Rosegarden **/ const byte ccLecture = 117; /** CC# 117 lecture Rosegarden **/ const byte ccBoucle = 118; /** CC# 118 boucle Rosegarden **/ const byte ccEnregistre = 119; /** CC# 118 enregistre Rosegarden **/ const byte canalMidi = 1; /* Canal d'émission midi **/ const int tempsDePause = 1000; /** Temps de pause en miliseceondes entre la lecture de deux boutons **/ const unsigned int vitesseTransfert = 31250; /** Vitesse d'échange du port série en Baud**/ boolean etatBoutonLecture, etatBoutonArret = HIGH; /** Forcer les boutons d'entrées en mode haut (+5 Volts) **/ boolean etatPrecedentBoutonLecture, etatPrecedentBoutonArret = LOW; /* Etat antérieur des boutons, permet de tester les fronts montants et Etat antérieur des boutons, permet de tester les fronts montants et decendants **/ /** Fonction paramétrages de l'application **/ void setup() { pinMode(boutonRecule, INPUT); /** Sur entrée D2 **/ digitalWrite(boutonRecule, HIGH); /** Mise à 1 de l'entrée D2 **/ pinMode(boutonAvance, INPUT); /** Sur entrée D3 **/ digitalWrite(boutonAvance, HIGH); /** Mise à 1 de l'entrée D3 **/ pinMode(boutonArret, INPUT); /** Sur entrée D4 **/ digitalWrite(boutonArret, HIGH); /** Mise à 1 de l'entrée D4 **/ pinMode(boutonLecture, INPUT); /** Sur entrée D5 **/ digitalWrite(boutonLecture, HIGH); /** Mise à 1 de l'entrée D5 **/ pinMode(boutonBoucle, INPUT); /** Sur entrée D6 **/ digitalWrite(boutonBoucle, HIGH); /** Mise à 1 de l'entrée D6 **/ pinMode(boutonEnregistre, INPUT); /** Sur entrée D7 **/ digitalWrite(boutonEnregistre, HIGH); /** Mise à 1 de l'entrée D7 **/ Serial.begin(vitesseTransfert); /** Paramètrage de la vitesse de transmition midi en Baud, pour le midi c'est 31250. **/ } /** Fin de la fonction voir setup() **/ /** Fonction boucle principale **/ void loop() { /** Lecture de l'entrée bouton arrêt **/ etatBoutonArret = digitalRead(boutonArret); /** Test si le bouton "Arret" a été appuyé CC# 116 **/ if (etatBoutonArret == HIGH) { /** Le bouton "Arrêt" n'est pas pressé **/ etatBoutonLecture = digitalRead(boutonLecture); /** Test si le bouton "Lecture" a été appuyé CC# 117 **/ if (etatBoutonLecture == HIGH) { /** Le bouton "Lecture" n'est pas pressé, on ne fait rien **/ ; } /** Uniquement sur front descendant **/ else if (etatBoutonLecture != etatPrecedentBoutonLecture) { /** Le bouton "Lecture" est pressé **/ envoyerControleCCMidi(canalMidi, ccLecture, 127); delay(tempsDePause); envoyerControleCCMidi(canalMidi, ccLecture, 0); } } /** Uniquement sur front descendant **/ else if (etatBoutonArret != etatPrecedentBoutonArret) { /** Le bouton "Arrêt" est pressé **/ envoyerControleCCMidi(canalMidi, ccArret, 127); delay(tempsDePause); envoyerControleCCMidi(canalMidi, ccArret, 0); } /** Mettre l'état précédents des boutons identique à ceux actuels **/ etatPrecedentBoutonLecture = etatBoutonLecture; etatPrecedentBoutonArret = etatBoutonArret; } /** Fin de la fonction void loop() **/ /** Fonction pour envoyer les notes de type midi **/ void envoyerMoteMidi(byte midiCanal, byte midiNote, byte midiIntensite) { Serial.write(0x90 + (midiCanal - 1)); /** Envoyer la commande midi "midiCanal", -1, car c'est de 0 à 15 **/ Serial.write(midiNote); /** Envoyer la hauteur de la note "midiNote" **/ Serial.write(midiIntensite); /** Envoyer l'intensité de la note "midiIntensite" **/ } /** Fin de la fonction void envoyerMessageMidi(byte midiCanal, byte midiNote, byte midiIntensite) **/ /** Fonction pour envoyer les messages de type midi **/ void envoyerControleCCMidi(byte midiCanal, byte midiCcControl, byte midiValeurControl) { Serial.write(0xB2 + (midiCanal - 1)); /** Envoyer la commande midi "midiCanal", -1, car c'est de 0 à 15 **/ Serial.write(midiCcControl); /** Envoyer la valeur de controle CC midi "midiCcControl", exemple 117 pour start et 116 pour stop Rosegarden **/ Serial.write(midiValeurControl); /** Envoyer la valeur pour le CC sélectionné "midiValeurControl" (127 ou 0)**/ } /** Fin de la fonction void envoyerControleCCMidi(byte midiCanal, byte midiCcControl, byte midiValeurControl) **/
Pour que cela fonctionne, il faudra bien sûr alimenter l’Arduino (par usb par exemple) et raccorder la sortie DIN/MIDI de l’Arduino vers le convertisseur DIN MIDI/USB. Et finalement raccorder le convertisseur midi sur l’ordinateur.
Il faudra que l’entrée Jack midi contrôleur de Rosegarden (External contrôleur) soit connectée sur la sortie de l’interface midi (dans mon exemple UM-1 Midi 1) comme dans cet exemple :
Bien à vous !