M5Stack으로 BLE MIDI 컨트롤러를 만들어 보자 (1)
개요
M5Stack의 BLE 기능을 사용하여 iOS 앱 "KORG Gadget2"의 TB-303 클론 "Chicago"의 "CUTOFF"와 "PEAK"를 제어하는 데모입니다.
데모
M5Stack x KORG Gadget2 Chicago
(YouTube)
회로도
볼륨은 B 곡선의 10k ohm "RK09K1130AAU 10KB"을 사용했습니다.
개발 환경
Arduino 1.8.9
M5Stack과 BLE를 이용하려면 여러 라이브러리 도입이 필요하지만 이번에는 할애합니다.
자세한 내용은 「M5Stack」으로 시작하는 전자 공작 을 참고해 보세요.
(M5Stack 라이브러리 도입 : p20 ~ p30, BLE 라이브러리 도입 : p179)
출처
소스 다운로드
cc_ble_midi_sample.ino#define LOAD_FONT4
#include <M5Stack.h>
#include <BLEDevice.h>
#include <BLEServer.h>
//BLE関連
//デバイス名
const char *DEVICE_NAME = "m5-stack-ble-midi";
//BLE MIDIのサービスとキャラクタラスティック
const char *SERVICE_UUID = "03B80E5A-EDE8-4B33-A751-6CE34EC4C700";
const char *CHAR_UUID = "7772E5DB-3868-4112-A1A9-F2669D106BF3";
//BLEデータ
BLEServer *pServer;
BLECharacteristic *pCharacteristic;
bool isConnected = false;
//MIDIデータ関連
//ccデータバッファ
int cc[128];
//volumeの値のバッファ
int value[2];
//BLE MIDIデータ
unsigned char buff[] = {0x80, 0x80, 0xB0, 0x01, 0x64};
//BLE関連関数
// サーバーのコールバック関数
class cbServer: public BLEServerCallbacks {
void onConnect(BLEServer *pServer) {
isConnected = true;
M5.Lcd.clear();
M5.Lcd.drawCentreString(" BLE Connected ", 160, 120, 4);
};
void onDisconnect(BLEServer *pServer) {
isConnected = false;
M5.Lcd.clear();
M5.Lcd.drawCentreString(DEVICE_NAME, 160, 120, 4);
}
};
//マッピングと制限を行う関数
int mapAndLimit(int value, int fromLow, int fromHigh, int toLow, int toHigh) {
int tmp, maxValue, minValue;
if(toLow < toHigh)
{
minValue = toLow;
maxValue = toHigh;
}
else
{
minValue = toHigh;
maxValue = toLow;
}
tmp = map(value, fromLow , fromHigh, toLow, toHigh);
tmp = tmp > maxValue ? maxValue : tmp;
tmp = tmp < minValue ? minValue : tmp;
return tmp;
}
//MIDI関連関数
//BLE MIDIのCCデータを送信
void notifyCC(int ccNum, int value, int sensitivity)
{
if(abs(cc[ccNum] - value) > sensitivity)
{
//元情報にデータを入れておく
cc[ccNum] = value;
//valueをCC(ccNum)のデータにする
buff[2] = 0xb0;
buff[3] = ccNum;
buff[4] = value;
//MIDIデータをNotify
pCharacteristic->setValue(buff, 5);
pCharacteristic->notify();
}
}
void setup(){
int i;
// M5Stackの初期化
M5.begin();
// スピーカーをオフにする
dacWrite(25, 0);
// 入力に設定
pinMode(35, INPUT);
pinMode(36, INPUT);
//Btnバッファの初期化
for(i = 0; i < 128; i++)
{
cc[i] = 64;
}
// BLE初期化
BLEDevice::init(DEVICE_NAME);
// サーバーの作成
BLEServer *pServer = BLEDevice::createServer();
// コールバック関数の設定
pServer->setCallbacks(new cbServer());
// サービスの作成
BLEService *pService = pServer->createService(SERVICE_UUID);
// キャラクタリスティックの作成
pCharacteristic = pService->createCharacteristic(
CHAR_UUID,
BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY
);
// サービスの開始
pService->start();
//アドバタイジングの開始
pServer->getAdvertising()->addServiceUUID(SERVICE_UUID);
pServer->getAdvertising()->start();
//ディスプレイにデバイスネームを表示
M5.Lcd.drawCentreString("m5-stack-ble-midi", 160, 120, 4);
}
void loop() {
if (isConnected)
{
//ボリュームを読み込み
value[0]= analogRead(35);
value[0] = mapAndLimit(value[0], 0, 4095, 0, 127);
value[1]= analogRead(36);
value[1] = mapAndLimit(value[1], 0, 4095, 0, 127);
//ボリュームのデータをCC1, CC71に送信
notifyCC(1, value[0], 1);
notifyCC(71, value[1], 1);
// 少し休ませる
delay(10);
}
}
세세한 설명은, 또 언제?
참고 자료
M5Stack x KORG Gadget2 Chicago
(YouTube)
회로도
볼륨은 B 곡선의 10k ohm "RK09K1130AAU 10KB"을 사용했습니다.
개발 환경
Arduino 1.8.9
M5Stack과 BLE를 이용하려면 여러 라이브러리 도입이 필요하지만 이번에는 할애합니다.
자세한 내용은 「M5Stack」으로 시작하는 전자 공작 을 참고해 보세요.
(M5Stack 라이브러리 도입 : p20 ~ p30, BLE 라이브러리 도입 : p179)
출처
소스 다운로드
cc_ble_midi_sample.ino#define LOAD_FONT4
#include <M5Stack.h>
#include <BLEDevice.h>
#include <BLEServer.h>
//BLE関連
//デバイス名
const char *DEVICE_NAME = "m5-stack-ble-midi";
//BLE MIDIのサービスとキャラクタラスティック
const char *SERVICE_UUID = "03B80E5A-EDE8-4B33-A751-6CE34EC4C700";
const char *CHAR_UUID = "7772E5DB-3868-4112-A1A9-F2669D106BF3";
//BLEデータ
BLEServer *pServer;
BLECharacteristic *pCharacteristic;
bool isConnected = false;
//MIDIデータ関連
//ccデータバッファ
int cc[128];
//volumeの値のバッファ
int value[2];
//BLE MIDIデータ
unsigned char buff[] = {0x80, 0x80, 0xB0, 0x01, 0x64};
//BLE関連関数
// サーバーのコールバック関数
class cbServer: public BLEServerCallbacks {
void onConnect(BLEServer *pServer) {
isConnected = true;
M5.Lcd.clear();
M5.Lcd.drawCentreString(" BLE Connected ", 160, 120, 4);
};
void onDisconnect(BLEServer *pServer) {
isConnected = false;
M5.Lcd.clear();
M5.Lcd.drawCentreString(DEVICE_NAME, 160, 120, 4);
}
};
//マッピングと制限を行う関数
int mapAndLimit(int value, int fromLow, int fromHigh, int toLow, int toHigh) {
int tmp, maxValue, minValue;
if(toLow < toHigh)
{
minValue = toLow;
maxValue = toHigh;
}
else
{
minValue = toHigh;
maxValue = toLow;
}
tmp = map(value, fromLow , fromHigh, toLow, toHigh);
tmp = tmp > maxValue ? maxValue : tmp;
tmp = tmp < minValue ? minValue : tmp;
return tmp;
}
//MIDI関連関数
//BLE MIDIのCCデータを送信
void notifyCC(int ccNum, int value, int sensitivity)
{
if(abs(cc[ccNum] - value) > sensitivity)
{
//元情報にデータを入れておく
cc[ccNum] = value;
//valueをCC(ccNum)のデータにする
buff[2] = 0xb0;
buff[3] = ccNum;
buff[4] = value;
//MIDIデータをNotify
pCharacteristic->setValue(buff, 5);
pCharacteristic->notify();
}
}
void setup(){
int i;
// M5Stackの初期化
M5.begin();
// スピーカーをオフにする
dacWrite(25, 0);
// 入力に設定
pinMode(35, INPUT);
pinMode(36, INPUT);
//Btnバッファの初期化
for(i = 0; i < 128; i++)
{
cc[i] = 64;
}
// BLE初期化
BLEDevice::init(DEVICE_NAME);
// サーバーの作成
BLEServer *pServer = BLEDevice::createServer();
// コールバック関数の設定
pServer->setCallbacks(new cbServer());
// サービスの作成
BLEService *pService = pServer->createService(SERVICE_UUID);
// キャラクタリスティックの作成
pCharacteristic = pService->createCharacteristic(
CHAR_UUID,
BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY
);
// サービスの開始
pService->start();
//アドバタイジングの開始
pServer->getAdvertising()->addServiceUUID(SERVICE_UUID);
pServer->getAdvertising()->start();
//ディスプレイにデバイスネームを表示
M5.Lcd.drawCentreString("m5-stack-ble-midi", 160, 120, 4);
}
void loop() {
if (isConnected)
{
//ボリュームを読み込み
value[0]= analogRead(35);
value[0] = mapAndLimit(value[0], 0, 4095, 0, 127);
value[1]= analogRead(36);
value[1] = mapAndLimit(value[1], 0, 4095, 0, 127);
//ボリュームのデータをCC1, CC71に送信
notifyCC(1, value[0], 1);
notifyCC(71, value[1], 1);
// 少し休ませる
delay(10);
}
}
세세한 설명은, 또 언제?
참고 자료
Arduino 1.8.9
M5Stack과 BLE를 이용하려면 여러 라이브러리 도입이 필요하지만 이번에는 할애합니다.
자세한 내용은 「M5Stack」으로 시작하는 전자 공작 을 참고해 보세요.
(M5Stack 라이브러리 도입 : p20 ~ p30, BLE 라이브러리 도입 : p179)
출처
소스 다운로드
cc_ble_midi_sample.ino#define LOAD_FONT4
#include <M5Stack.h>
#include <BLEDevice.h>
#include <BLEServer.h>
//BLE関連
//デバイス名
const char *DEVICE_NAME = "m5-stack-ble-midi";
//BLE MIDIのサービスとキャラクタラスティック
const char *SERVICE_UUID = "03B80E5A-EDE8-4B33-A751-6CE34EC4C700";
const char *CHAR_UUID = "7772E5DB-3868-4112-A1A9-F2669D106BF3";
//BLEデータ
BLEServer *pServer;
BLECharacteristic *pCharacteristic;
bool isConnected = false;
//MIDIデータ関連
//ccデータバッファ
int cc[128];
//volumeの値のバッファ
int value[2];
//BLE MIDIデータ
unsigned char buff[] = {0x80, 0x80, 0xB0, 0x01, 0x64};
//BLE関連関数
// サーバーのコールバック関数
class cbServer: public BLEServerCallbacks {
void onConnect(BLEServer *pServer) {
isConnected = true;
M5.Lcd.clear();
M5.Lcd.drawCentreString(" BLE Connected ", 160, 120, 4);
};
void onDisconnect(BLEServer *pServer) {
isConnected = false;
M5.Lcd.clear();
M5.Lcd.drawCentreString(DEVICE_NAME, 160, 120, 4);
}
};
//マッピングと制限を行う関数
int mapAndLimit(int value, int fromLow, int fromHigh, int toLow, int toHigh) {
int tmp, maxValue, minValue;
if(toLow < toHigh)
{
minValue = toLow;
maxValue = toHigh;
}
else
{
minValue = toHigh;
maxValue = toLow;
}
tmp = map(value, fromLow , fromHigh, toLow, toHigh);
tmp = tmp > maxValue ? maxValue : tmp;
tmp = tmp < minValue ? minValue : tmp;
return tmp;
}
//MIDI関連関数
//BLE MIDIのCCデータを送信
void notifyCC(int ccNum, int value, int sensitivity)
{
if(abs(cc[ccNum] - value) > sensitivity)
{
//元情報にデータを入れておく
cc[ccNum] = value;
//valueをCC(ccNum)のデータにする
buff[2] = 0xb0;
buff[3] = ccNum;
buff[4] = value;
//MIDIデータをNotify
pCharacteristic->setValue(buff, 5);
pCharacteristic->notify();
}
}
void setup(){
int i;
// M5Stackの初期化
M5.begin();
// スピーカーをオフにする
dacWrite(25, 0);
// 入力に設定
pinMode(35, INPUT);
pinMode(36, INPUT);
//Btnバッファの初期化
for(i = 0; i < 128; i++)
{
cc[i] = 64;
}
// BLE初期化
BLEDevice::init(DEVICE_NAME);
// サーバーの作成
BLEServer *pServer = BLEDevice::createServer();
// コールバック関数の設定
pServer->setCallbacks(new cbServer());
// サービスの作成
BLEService *pService = pServer->createService(SERVICE_UUID);
// キャラクタリスティックの作成
pCharacteristic = pService->createCharacteristic(
CHAR_UUID,
BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY
);
// サービスの開始
pService->start();
//アドバタイジングの開始
pServer->getAdvertising()->addServiceUUID(SERVICE_UUID);
pServer->getAdvertising()->start();
//ディスプレイにデバイスネームを表示
M5.Lcd.drawCentreString("m5-stack-ble-midi", 160, 120, 4);
}
void loop() {
if (isConnected)
{
//ボリュームを読み込み
value[0]= analogRead(35);
value[0] = mapAndLimit(value[0], 0, 4095, 0, 127);
value[1]= analogRead(36);
value[1] = mapAndLimit(value[1], 0, 4095, 0, 127);
//ボリュームのデータをCC1, CC71に送信
notifyCC(1, value[0], 1);
notifyCC(71, value[1], 1);
// 少し休ませる
delay(10);
}
}
세세한 설명은, 또 언제?
참고 자료
#define LOAD_FONT4
#include <M5Stack.h>
#include <BLEDevice.h>
#include <BLEServer.h>
//BLE関連
//デバイス名
const char *DEVICE_NAME = "m5-stack-ble-midi";
//BLE MIDIのサービスとキャラクタラスティック
const char *SERVICE_UUID = "03B80E5A-EDE8-4B33-A751-6CE34EC4C700";
const char *CHAR_UUID = "7772E5DB-3868-4112-A1A9-F2669D106BF3";
//BLEデータ
BLEServer *pServer;
BLECharacteristic *pCharacteristic;
bool isConnected = false;
//MIDIデータ関連
//ccデータバッファ
int cc[128];
//volumeの値のバッファ
int value[2];
//BLE MIDIデータ
unsigned char buff[] = {0x80, 0x80, 0xB0, 0x01, 0x64};
//BLE関連関数
// サーバーのコールバック関数
class cbServer: public BLEServerCallbacks {
void onConnect(BLEServer *pServer) {
isConnected = true;
M5.Lcd.clear();
M5.Lcd.drawCentreString(" BLE Connected ", 160, 120, 4);
};
void onDisconnect(BLEServer *pServer) {
isConnected = false;
M5.Lcd.clear();
M5.Lcd.drawCentreString(DEVICE_NAME, 160, 120, 4);
}
};
//マッピングと制限を行う関数
int mapAndLimit(int value, int fromLow, int fromHigh, int toLow, int toHigh) {
int tmp, maxValue, minValue;
if(toLow < toHigh)
{
minValue = toLow;
maxValue = toHigh;
}
else
{
minValue = toHigh;
maxValue = toLow;
}
tmp = map(value, fromLow , fromHigh, toLow, toHigh);
tmp = tmp > maxValue ? maxValue : tmp;
tmp = tmp < minValue ? minValue : tmp;
return tmp;
}
//MIDI関連関数
//BLE MIDIのCCデータを送信
void notifyCC(int ccNum, int value, int sensitivity)
{
if(abs(cc[ccNum] - value) > sensitivity)
{
//元情報にデータを入れておく
cc[ccNum] = value;
//valueをCC(ccNum)のデータにする
buff[2] = 0xb0;
buff[3] = ccNum;
buff[4] = value;
//MIDIデータをNotify
pCharacteristic->setValue(buff, 5);
pCharacteristic->notify();
}
}
void setup(){
int i;
// M5Stackの初期化
M5.begin();
// スピーカーをオフにする
dacWrite(25, 0);
// 入力に設定
pinMode(35, INPUT);
pinMode(36, INPUT);
//Btnバッファの初期化
for(i = 0; i < 128; i++)
{
cc[i] = 64;
}
// BLE初期化
BLEDevice::init(DEVICE_NAME);
// サーバーの作成
BLEServer *pServer = BLEDevice::createServer();
// コールバック関数の設定
pServer->setCallbacks(new cbServer());
// サービスの作成
BLEService *pService = pServer->createService(SERVICE_UUID);
// キャラクタリスティックの作成
pCharacteristic = pService->createCharacteristic(
CHAR_UUID,
BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY
);
// サービスの開始
pService->start();
//アドバタイジングの開始
pServer->getAdvertising()->addServiceUUID(SERVICE_UUID);
pServer->getAdvertising()->start();
//ディスプレイにデバイスネームを表示
M5.Lcd.drawCentreString("m5-stack-ble-midi", 160, 120, 4);
}
void loop() {
if (isConnected)
{
//ボリュームを読み込み
value[0]= analogRead(35);
value[0] = mapAndLimit(value[0], 0, 4095, 0, 127);
value[1]= analogRead(36);
value[1] = mapAndLimit(value[1], 0, 4095, 0, 127);
//ボリュームのデータをCC1, CC71に送信
notifyCC(1, value[0], 1);
notifyCC(71, value[1], 1);
// 少し休ませる
delay(10);
}
}
Bluetooth LE MIDI Specification (열람하려면 MIDI 회원 등록 필요)
Reference
이 문제에 관하여(M5Stack으로 BLE MIDI 컨트롤러를 만들어 보자 (1)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/wdice02136/items/e929b033c4db7cc5d686텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)