Midi via bluetooth sur uno r4 wifi

Bonjour,

C'est dans mes premiers projets, mais je galère avec le uno r4 wifi.

Il n'y a aucune librairie qui semble disponible pour ce modèle en bluetooth.

Mon appareil reconnait que mon arduino est un controlleur midi et se connect à mon Arduino, mais l'envoie du protocol midi ne fonctionne pas.

Dans mon moniteur serie, j'ai les information midi envoyé, mais du côté du iPad ou Android ou ordinateur, je ne recois rien.

C'est dans mes premiers projets, donc si vous avez de l'info à m'envoyer, je suis toute ouie.

#include <ArduinoBLE.h>

BLEService midiService("03B80E5A-EDE8-4B33-A751-6CE34EC4C700");  // Service MIDI UUID
BLECharacteristic midiCharacteristic("7772E5DB-3868-4112-A1A9-F2669D106BF3", BLERead | BLEWrite | BLENotify, 20);  // Caractéristique MIDI UUID

unsigned long previousMillis = 0;
const long interval = 3000;  // Intervalle de 3 secondes

void setup() {
  Serial.begin(9600);
  while (!Serial);

  // Initialise BLE
  if (!BLE.begin()) {
    Serial.println("Erreur lors de l'initialisation du BLE !");
    while (1);
  }

  // Commence le service MIDI
  BLE.setLocalName("MIDI Controller");
  BLE.setAdvertisedService(midiService);
  midiService.addCharacteristic(midiCharacteristic);
  BLE.addService(midiService);

  // Annonce le service
  BLE.advertise();

  Serial.println("En attente de connexion Bluetooth...");
}

void loop() {
  BLEDevice central = BLE.central();
  if (central) {
    Serial.print("Connecté à : ");
    Serial.println(central.address());

    // Envoi initial de la note MIDI au démarrage de la connexion
    sendMIDINote(60, 127, 10);

    while (central.connected()) {
      unsigned long currentMillis = millis();
      if (currentMillis - previousMillis >= interval) {
        // Envoi périodique de la note MIDI
        sendMIDINote(60, 127, 10);
        previousMillis = currentMillis;
      }
    }

    Serial.println("Déconnecté.");
  }
}

void sendMIDINote(byte note, byte velocity, byte channel) {
  // Formater les données MIDI
  byte midiMessage[3] = { 0x90 | (channel - 1), note, velocity };  // Note On: Canal spécifié, Note spécifiée, Vélocité spécifiée

  // Envoyer les données MIDI via Bluetooth
  midiCharacteristic.writeValue(midiMessage, 3);

  // Afficher la note MIDI envoyée
  Serial.print("Note MIDI envoyée : ");
  Serial.print(note);
  Serial.print(" sur le canal ");
  Serial.println(channel);
}

Ma bibliothèque Control Surface inclut du code pour le MIDI via BLE, mais il n'a pas encore été testé sur un Arduino UNO R4. Control Surface: MIDI over BLE

Vous pouvez néanmoins consulter le code de traitement BLE si vous souhaitez créer votre propre version:

Vous verrez qu'il ne suffit pas d'écrire les octets MIDI dans la caractéristique BLE. Il faut aussi respecter le format de paquet décrit sur MIDI over Bluetooth Low Energy (BLE-MIDI) – MIDI.org, qui inclut des horodatages.

Merci beaucoup pour le lien qui décrit bien le format à envoyer.

Voici le code qui a fonctionner avec l'uno r4 en mode BLE , il joue la note Do à répétition. Mais j'ai pu constater que l'envoie se faisait bien.

Il me reste qu'a le modifier pour l'adapter à mon projet, mais l'envoit sur iPad, garageband fonctionne à merveille.

#include <ArduinoBLE.h>

#define SERVICE_UUID "03B80E5A-EDE8-4B33-A751-6CE34EC4C700"
#define CHARACTERISTIC_UUID "7772E5DB-3868-4112-A1A9-F2669D106BF3"

BLEService midiService(SERVICE_UUID);
BLECharacteristic midiCharacteristic(CHARACTERISTIC_UUID, BLERead | BLEWrite | BLENotify, 20);

unsigned long noteOnTime = 0;
const long noteDuration = 500; // Duration to hold the note in milliseconds
bool noteOnSent = false;
unsigned int timestamp = 0;

void setup() {
  Serial.begin(9600);
  while (!Serial);

  if (!BLE.begin()) {
    Serial.println("starting BLE failed!");
    while (1);
  }

  BLE.setLocalName("Arduino MIDI");
  BLE.setAdvertisedService(midiService);
  midiService.addCharacteristic(midiCharacteristic);
  BLE.addService(midiService);

  midiCharacteristic.writeValue((const unsigned char*)0, 0);
  BLE.advertise();

  Serial.println("Bluetooth device active, waiting for connections...");
}

void loop() {
  BLEDevice central = BLE.central();

  if (central) {
    Serial.print("Connected to central: ");
    Serial.println(central.address());

    while (central.connected()) {
      unsigned long currentMillis = millis();

      if (!noteOnSent) {
        sendNoteOnMessage(60, 127); // Note On, Middle C, Velocity 127
        noteOnTime = currentMillis;
        noteOnSent = true;
      }

      if (noteOnSent && (currentMillis - noteOnTime >= noteDuration)) {
        sendNoteOffMessage(60, 0); // Note Off, Middle C, Velocity 0
        noteOnSent = false;
        // Optional: Reset timestamp for simplicity
        timestamp = (timestamp + noteDuration) % 8192;
      }
    }

    Serial.print("Disconnected from central: ");
    Serial.println(central.address());
  }
}

void sendNoteOnMessage(uint8_t note, uint8_t velocity) {
  uint8_t midiPacket[20];
  int packetIndex = 0;

  uint8_t timestampHigh = (timestamp >> 7) & 0x3F;
  uint8_t timestampLow = timestamp & 0x7F;

  uint8_t headerByte = 0b10000000 | timestampHigh;
  uint8_t timestampByte = 0b10000000 | timestampLow;

  midiPacket[packetIndex++] = headerByte;
  midiPacket[packetIndex++] = timestampByte;

  uint8_t midiStatusByte = 0b10010000; // Note On, Channel 1
  midiPacket[packetIndex++] = midiStatusByte;
  midiPacket[packetIndex++] = note;
  midiPacket[packetIndex++] = velocity;

  midiCharacteristic.writeValue(midiPacket, packetIndex);
}

void sendNoteOffMessage(uint8_t note, uint8_t velocity) {
  uint8_t midiPacket[20];
  int packetIndex = 0;

  uint8_t timestampHigh = (timestamp >> 7) & 0x3F;
  uint8_t timestampLow = timestamp & 0x7F;

  uint8_t headerByte = 0b10000000 | timestampHigh;
  uint8_t timestampByte = 0b10000000 | timestampLow;

  midiPacket[packetIndex++] = headerByte;
  midiPacket[packetIndex++] = timestampByte;

  uint8_t midiStatusByte = 0b10000000; // Note Off, Channel 1
  midiPacket[packetIndex++] = midiStatusByte;
  midiPacket[packetIndex++] = note;
  midiPacket[packetIndex++] = velocity;

  midiCharacteristic.writeValue(midiPacket, packetIndex);
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.