M5STACK(ESP32)로 BLE MIDI 경유로 수신해 보자!

M5STACK(ESP32)로 BLE MIDI 경유를 수신해 보자!



경위



M5STACK에서 MIDI를 수신하려고 하는 사람이 있었지만, 네이티브 BLE MIDI를 구현하지 않고, MQTT로 구현하고 있었으므로, BLE MIDI로 구현해 보았다.

준비(개발 환경)



Arduino IDE 1.8.5
절차는 M5Stack의 공식 HP에 있던 Mac OSX용 절차로 구축한 환경입니다.
ESP32 Arduino Core 설치 절차
mkdir -p ~/Documents/Arduino/hardware/espressif && \
cd ~/Documents/Arduino/hardware/espressif && \
git clone https://github.com/espressif/arduino-esp32.git esp32 && \
cd esp32 && \
git submodule update --init --recursive && \
cd tools && \
python get.py

코드



BLE_MIDI.ino
// M5STACK(ESP32)向け BLE MIDI
// Programed by Kazuyuki Eguchi 2018/04/24

#include <M5Stack.h>
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>

#define MIDI_SERVICE_UUID        "03b80e5a-ede8-4b33-a751-6ce34ec4c700"
#define MIDI_CHARACTERISTIC_UUID "7772e5db-3868-4112-a1a9-f2669d106bf3"
#define DEVIVE_NAME "M5"

BLEServer *pServer;
BLEAdvertising *pAdvertising;
BLECharacteristic *pCharacteristic;
int pos = 0;
char midi[5];

class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      M5.Lcd.fillScreen(BLACK);
      M5.Lcd.setTextSize(1);
      M5.Lcd.setCursor(10,0);
      M5.Lcd.printf("BLE MIDI Connected.");
    };

    void onDisconnect(BLEServer* pServer) {
      M5.Lcd.fillScreen(BLACK);
      M5.Lcd.setTextSize(1);
      M5.Lcd.setCursor(10,0);
      M5.Lcd.printf("BLE MIDI Disconnect.");
    }
};

class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string rxValue = pCharacteristic->getValue();
      pos = 0;

      if (rxValue.length() > 0) {
        for (int i = 0; i < rxValue.length(); i++)
        {
          Serial.printf("%02x",rxValue[i]);
          midi[pos] = rxValue[i];
          pos++;
          if(pos == 5)
          {
            M5.Lcd.fillScreen(BLACK);
            M5.Lcd.setTextSize(3);
            M5.Lcd.setCursor(10,0);
            M5.Lcd.printf("%02x %02x %02x",midi[2],midi[3],midi[4]);
            pos = 0;
          }          
        }
        Serial.println();
      }
    }
};

void setup() {
  M5.begin();
  Serial.begin(115200);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextColor(WHITE);
  M5.Lcd.setTextSize(1);
  M5.Lcd.setCursor(10,0);
  M5.Lcd.printf("BLE MIDI Disconnect.");

  BLEDevice::init(DEVIVE_NAME);
  pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());
  BLEService *pService = pServer->createService(BLEUUID(MIDI_SERVICE_UUID));
  pCharacteristic = pService->createCharacteristic(
    BLEUUID(MIDI_CHARACTERISTIC_UUID),
    BLECharacteristic::PROPERTY_READ   |
    BLECharacteristic::PROPERTY_WRITE  |
    BLECharacteristic::PROPERTY_NOTIFY |
    BLECharacteristic::PROPERTY_WRITE_NR
  );
  pCharacteristic->setCallbacks(new MyCallbacks());
  pService->start();

  BLEAdvertisementData oAdvertisementData = BLEAdvertisementData();
  oAdvertisementData.setFlags(0x04);
  oAdvertisementData.setCompleteServices(BLEUUID(MIDI_SERVICE_UUID));
  oAdvertisementData.setName(DEVIVE_NAME);
  pAdvertising = pServer->getAdvertising();
  pAdvertising->setAdvertisementData(oAdvertisementData);
  pAdvertising->start();
}

void loop() {
  delay(10);
}

MIDI 패치



자신은 microKEY Air와 M5Stack을 Mac에 BLE MIDI 연결하고 Chrome 브라우저에서 아래의 MIDI 패치로 MIDI 신호를 M5로 보내 수신하고 있습니다.



신경이 쓰이는 것



컴파일 후 스케치의 크기가 평범한 사람은

스케치가 1301745바이트를 사용하고 있습니다.

이상, 참고까지

좋은 웹페이지 즐겨찾기