Chargement...
 
[Voir/Cacher menus de gauche]
[Voir/Cacher menus de droite]

3 - Le home-studio, les instruments et le DIY

> Forums de discussion > 3 - Le home-studio, les instruments et le DIY > Commander votre DAW avec des boutons poussoirs externes (Exemple avec Rosegarden)
Dernier post

Commander votre DAW avec des boutons poussoirs externes (Exemple avec Rosegarden)

Tatane utilisateur non connecté France
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 :

Image

Image

Image

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.

Image

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 :

Image

Bien à vous !

bda utilisateur non connecté France
Tout est là: Arduino MIDI Library  Image
Bien qu'en mettant:
Serial.begin(115200);

Je me passe de la bibliothèque cité mais je dois ajouter ttymidi  Image sur le PC ou la Raspberry Pi.
À toi de voir ce qui est le plus pratique.

Tatane utilisateur non connecté France
Bonjour Bda, super merci pour ton code. Cela me fera également gagner du temps, en espérant que cela pourra servir à d'autres personnes :-)

bda utilisateur non connecté France
Oups, j'ai du faire une bêtise et éditer mon précédent message au lieu de répondre. Donc la réponse est un peu plus haut...
Désolé.

olinuxx utilisateur non connecté France
Modéro-forum : sujet déplacé depuis Autres sujets : le nimp'.


D'autre part @Tatane, j'ai édité ton premier message pour y mettre un lien vers la page rosegarden du site ici, c'est mieux pour la maintenabilité du site sur long terme. J'ai également mis le code dans des balises CODE pour que ça soit plus facilement lisible :

Note modération : merci d'utiliser la balise CODE lorsque tu copies/colles du code sur le site. Celles-ci permettent un meilleur affichage.
Image
Voir également cette page.


Houston4444 utilisateur non connecté France
Super de partager ça.
Pour le midi direct par l'USB, de mémoire c'est pas possible avec l'arduino UNO, ça marche avec l'arduino LEONARDO.

bda utilisateur non connecté France
Je crois que c'est valable aussi avec le UNO en installant ttymidi sur le PC. Par contre suivant les microcontrôleurs, il faut modifier le fichier:
/sys/bus/usb-serial/devices/ttyUSB0/latency_timer

et la mettre à 1. Par défaut il est à 16ms.
Avec ttymidi, le port USB n'est qu'un vulgaire port série transformé en MIDI sur le PC.

Tatane utilisateur non connecté France
J'ai bien regardé, en fait il y a trois solutions :

1 - Faire ce que j'ai fait, nécessite un convertisseur physique midi vers usb.

2 - Faire du midi over usb (les informations midi passent pas l'usb de l'Arduino) en utilisation la bibliothèque MIDI.h et un middleware comme l'a suggéré bda (Logociel qui route les données séries vers le serveur audio de l'OS). Exemples : pour Linux ttymidi ou hairless-midiserial pour MacOs et Ms-Windows

3 - Faire du midi over usb toujours en utilisant le port intégré à lArduino , mais cette fois ci, en modifiant le firmware du chip de gestion de l'usb de l'Arduino. Là ce qui devient inintéressant, c'est que cela devient standeloane ! Plus besoin de passer par middleware, l'Arduino est reconnu directement par l'OS comme un véritable device midi !

Je vais personnellement travailler sur cette dernière. Cela nécessite un véritable Arduino à base de chip usb atmega16u2 et surtout pas un CH340, cela ne fonctionnera pas, car il n'est pas flashable. Le retour au firmaware d'origine ne pause d'après ce qui j'ai pu lire aucun souci.

bda utilisateur non connecté France
C'est vrai que du vrai USB-MIDI peut être un avantage.
Il est aussi dommage que les PC n'aient plus de port série. Sur les Raspberry Pi, on transforme les E/S séries en MIDI avec un petit coup de fer et trios composants.

Afficher les articles :
Aller au forum :

Documentation [Afficher / Cacher]

Faire un don
[Afficher / Cacher]

Connexion
[Afficher / Cacher]



Mégaphone [Afficher / Cacher]

calixtus06, 14:33, jeu. 28 mars 2024: Bonjour et bienvenue à b.vl :-)
calixtus06, 09:30, mer. 27 mars 2024: Bonjour et bienvenue à Noar :-)
olinuxx, 18:50, lun. 25 mars 2024: Bonjour et bienvenue à Ted Demore cool
olinuxx, 17:52, dim. 24 mars 2024: Bonjour et bienvenue à Noitavon cool
calixtus06, 11:07, jeu. 21 mars 2024: Bonjour et bienvenue à obds, ceric :-)
obds, 16:12, mar. 19 mars 2024: Cet édito est juste parfait. Trop beau !
olinuxx, 11:48, ven. 15 mars 2024: Bonjour et bienvenue à Jerry cool
calixtus06, 18:03, mer. 13 mars 2024: Bonjour et bienvenue à tanguero :-)
olinuxx, 11:01, dim. 10 mars 2024: Bonjour et bienvenue à lolo cool
bda, 16:59, sam. 09 mars 2024: Chapeau pour l'édito. Vous êtes au top les gars :-)
allany, 07:20, jeu. 07 mars 2024: Ça ne fait jamais de mal, c'est l'éditorial ! [Lien]
olinuxx, 19:52, mer. 06 mars 2024: Bonjour et bienvenue à TrkNrk cool