久しぶりにM5 StackとMIDIの話題です。
ネタがちょっとなかった、というのもあるのですが、この便利ツールが必要になったこともあります。
環境)M5stack Gray + MIDI I/F
MIDIメッセージのトランスポーズ(転調)をするものですが、こういうのをPCでやると機能の割に大袈裟なことになってしまうため、このような小型デバイスが重宝します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
#include <M5Stack.h> #include <driver/dac.h> //Arduino-ESP32 driver #include <MIDI.h> MIDI_CREATE_INSTANCE(HardwareSerial, Serial2, MIDI); #define AMAX 100 int tm[AMAX]; byte nt[AMAX]; int pt = 0; int trans = 0; void handleNoteOn(byte channel, byte pitch, byte velocity) { MIDI.sendNoteOn(pitch + trans, velocity, 1); char disp[100]; sprintf(disp, "Ch:%02x %02x %02x", channel, pitch, velocity); M5.Lcd.setCursor(10, 50); M5.Lcd.printf(disp); } void handleNoteOff(byte channel, byte pitch, byte velocity) { MIDI.sendNoteOff(pitch + trans, 0, 1); } void setup() { M5.begin(); dacWrite(25, 0); // Speaker OFF dac_output_disable( DAC_CHANNEL_1 ); MIDI.setHandleNoteOn(handleNoteOn); MIDI.setHandleNoteOff(handleNoteOff); MIDI.begin(MIDI_CHANNEL_OMNI); MIDI.turnThruOff(); M5.Lcd.setTextSize(2); M5.Lcd.setCursor(0, 0); M5.Lcd.print("MIDI IN -> Trans -> OUT"); memset(tm, 0, sizeof(tm)); memset(nt, 0, sizeof(nt)); } void loop() { M5.update(); if(M5.BtnA.wasPressed()){ trans --; } if(M5.BtnC.wasPressed()){ trans ++; } char disp[100]; sprintf(disp, "T:%02d", trans); M5.Lcd.setCursor(10, 80); M5.Lcd.printf(disp); MIDI.read(); printf("%d\n", pt); } |
まだビルドやデバイスが動作する環境が確認できたことも有意義でした。
参考)https://qiita.com/yudai220/items/3bde9461f282d56d1ac2