USB MIDIキーボード → VS1053再生
2025.11.24

ESP32-S3のUSBホスト機能を利用して、USB MIDIコントローラからの打鍵情報に基づき音を鳴らせてみます

前回11月20日の記事で紹介したNANO ESP32 統合環境を活用して、USB MIDIキーボードとVS1053 MIDIモジュールを使って音を鳴らしてみます。
NANO ESP32 統合環境
●KORG nanoKEY2
USB MIDIコントローラには、KORG nanoKEY2 を使いました

| コントローラー |
25鍵ベロシティ対応キーボード PITCH UPボタン、PITCH DOWNボタン、OCTAVE UPボタン、OCTAVE DOWNボタン、MODボタン、SUSTAINボタン |
| オクターブ・レンジ |
-4 ~ +4 |
| ベロシティ・カーブ |
4種類 |
| 対応ソフトウェア |
MIDI入力に対応するホスト・アプリケーション |
| 接続端子 |
USB端子(mini B) |
| 電源 |
USBバス電源方式 |
| 消費電流 |
100mA以下 |
| 外形寸法 |
325(W) x 83(D) x 16(H) mm |
| 質量 |
244g |
●VS1053 Codec + MicroSD Breakout - MP3/WAV/MIDI/OGG Play + Record - v4
nanoKEY2の鍵盤を押した際のMIDIコードをVS1053に送信して音を確認します

VS1053 Codec + MicroSD Breakout
下記はArduino UNOとの配線例です。今回は、Arduino Nano ESP32互換ボードを使用しています。

VS1053のモジュール化

ブレッドボード仕様の基板にヘッダーピンをはんだ付けして、VS1053をジャンパーピンで接続しています。

裏面に配線しています。

KORG nanoKEY2のUSB端子はminiBです。
miniB-TypeA USBケーブルを繋いでいるので、さらにType-A → Type-C変換ケーブルを作りました。

VS1053のオーディオ出力をMP3ラジオのLINE-INに接続し、アンプ付きスピーカーとして利用します、
USB MIDIキーボードとVS1053をNANO ESP32に繋ぎ、
シリアル接続によりMIDIデータをNANO ESP32からVS1053に送信します。
| NANO ESP32 | - | VS1053 | - | SPEAKER |
| 3.3V | - | VCC | | |
| GND | - | GND | | |
| | | GND - GPIO-0 | | |
| Serial2 TX(8) | - | RX | | |
| Serial2 RX(9) | - | RST | | |
| | | 3.3V - GPIO-1 | | |
| | | AGND | - | speaker(G) |
| | | LOUT | - | speaker(L) |
| | | ROUT | - | speaker(R) |
VS1053から受信するデータはないので、RXはVS1053のリセット制御に利用しています
●開発環境
ソースコードのビルドには、開発環境に PlatformIOを使用しています。
Arduino開発環境構築 PlatformIO
ボードの初期設定を行います
$ pio init -b arduino_nano_esp32 v
初期設定に追記します
$ vi platformio.ini
[env:arduino_nano_esp32]
platform = espressif32
board = arduino_nano_esp32
framework = arduino
board_build.partitions = default_16MB.csv
build_flags =
-DBOARD_HAS_PSRAM
-mfix-esp32-psram-cache-issue
-DCORE_DEBUG_LEVEL=4
board_build.arduino.memory_type = qio_opi
board_build.f_flash = 80000000L
board_build.flash_mode = dio
monitor_speed = 115200
upload_port = /dev/ttyACM0
Configuration for esp32s3 N16R8
●プログラミング
下記に示すUSE MIDIおよびVS1053ライブラリを組合せて、ご自身の動作環境に合わせて編集するとよいと思います。
ESP32-S3 USB MIDI

touchgadget/esp32-usb-host-demos
必要となるのは以下の3つのソースファイルです。
・usbhmidi.ino
・show_desc.hpp
・usbhhelp.hpp
usbhmidi.inoのESP_LOGI()を書き換え、Telnet経由でTeraTermに表示するように加工すると便利です。
Adafruit VS1053 Libraryo

adafruit/Adafruit_VS1053_Library
必要となるのは以下のソースコードです。
・examples/player_miditest/player_miditest.ino
コード変更のポイント
Arduino NANO ESP32 に実装されている ESP32-S3 の Serial1、Serial2 には、任意のGPIOを割り当てることができます。
RXはSerial0に逃がして、QWIICケーブルのRXは、VS1053_RESETとして利用します。
#define VS1053_RESET A0
・・・・・
void setup() {
・・・・・
VS1053_MIDI.begin(31250);
↓
Serial2.begin(31250, SERIAL_8N1, SERIAL0_RX, SERIAL2_TX);
pinMode(SERIAL2_RX, OUTPUT);
digitalWrite(SERIAL2_RX, LOW);
delay(10);
digitalWrite(SERIAL2_RX, HIGH);
delay(10);
usbhmidi.ino と組み合わせます。
static void midi_transfer_cb(usb_transfer_t *transfer)
{
if (Device_Handle == transfer->device_handle) {
int in_xfer = transfer->bEndpointAddress & USB_B_ENDPOINT_ADDRESS_EP_DIR_MASK;
if ((transfer->status == 0) && in_xfer) {
uint8_t *const p = transfer->data_buffer;
for (int i = 0; i < transfer->actual_num_bytes; i += 4) {
if ((p[i] + p[i+1] + p[i+2] + p[i+3]) == 0) break;
switch ( p[i+1] & 0xF0 ) {
case 0x90: midiNoteOn (p[i+1] & 0x0F, p[i+2], p[i+3]); break;
case 0x80: midiNoteOff(p[i+1] & 0x0F, p[i+2], p[i+3]); break;
default: break;
}
}
esp_err_t err = usb_host_transfer_submit(transfer);
}
}
}
p[i+1] & 0xF0:MIDIコマンドの下位4ビットが示すCHANNEL番号を無効にしています
p[i+1] & 0x0F:MIDIコマンドの下位4ビットが示すCHANNEL番号を抽出しています
$ pio run -t upload
$ pio device monitor -p /dev/ttyAMA0 -b 115200
ビルドして、デバイスモニターを起動します。
モバイル・バッテリーから5Vを供給しマイコンを起動します。

起動すると、不明なデバイスとしてKORG nanoKEY2 が認識されているようです。

nanoKEY2の鍵盤を押すと、MIDIコードを解析して、VS1053にMIDIコードを送信、スピーカーで音を確認しています。
また、TeraTermにノート番号が表示させるとともに、Teratermのログ機能で保存しています。
鍵盤の状態のほかに音の間隔(デルタ・タイム)も算出しています。
デルタ・タイムが極端に短い場合は、鍵盤を同時に押したものとみなし、デルタ・タイムをゼロに補正しています。
記録したメロディーのお気に入り箇所を抜き出し、先頭部分のMIDIコードを用いて再現できるので便利です。
|
Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
たいていのことは100日あれば、うまくいく。長田英知著
「時間がなくて、なかなか自分のやりたいことができない」
「一念発起して何かを始めても、いつも三日坊主で終わってしまう」
「色んなことを先延ばしにしたまま、時間だけが過ぎていく」
そこで本書では、そんな著者が独自に開発した、
まったく新しい目標達成メソッド「100日デザイン」について、
その知識と技術を、余すところなくご紹介します。
まんがで納得ナポレオン・ヒル 思考は現実化する
OLとして雑務をこなす日々に飽き足らず、科学者だった父が残した薬品を商品化すべく、起業を決意した内山麻由(27)。彼女はセミナーで知り合った謎の女性からサポートを得ながら、彼女と二人三脚でナポレオン・ヒルの成功哲学を実践し、さまざまな問題を乗り越えていく。
ヒル博士の<ゴールデンルール>に従い、仕事に、恋に全力疾走する彼女の、成功への物語。
今日は人生最悪で最高の日 1秒で世界を変えるたったひとつの方法 ひすいこたろう著
偉人の伝記を読むと、最悪な日は、不幸な日ではなく、新しい自分が始まる日であることがわかります。最悪な出来事は、自分の人生が、想像を超えて面白くなる兆しなのです。偉人伝を読むことで、このときの不幸があったおかげで、未来にこういう幸せがくるのかと、人生を俯瞰する視線が立ち上がるのです。
ご飯は私を裏切らない heisoku著
辛い現実から目を背けて食べるご飯は、いつも美味しく幸せを届けてくれる。
29歳、中卒、恋人いない歴イコール年齢。バイト以外の職歴もなく、短期バイトを転々とする日々。ぐるぐると思索に耽るけど、ご飯を食べると幸せになれる。奇才の新鋭・heisokuが贈るリアル労働グルメ物語!
【最新版Gemini 3に対応!】できるGemini (できるシリーズ)
Geminiを「最強の知的生産パートナー」として使いこなすための、実践的なノウハウを凝縮した一冊です。
基本的な操作方法から、具体的なビジネスシーンでの活用、日々の業務を自動化するGoogle Workspaceとの連携、さらには自分だけのオリジナルAIを作成する方法まで余すところなく解説します。
Rustプログラミング完全ガイド 他言語との比較で違いが分かる!
Rustの各手法や考え方を幅広く解説!
500以上のサンプルを掲載。実行結果も確認。
全24章の包括的なチュートリアル。
ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS…
全WEB媒体で効果バツグン!
カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術
小型で便利な Type-C アダプター USB C オス - USB3.1 オスアダプター
Type-C端子のマイコンボードをこのアダプタを介して直接Raspberry Piに挿すことができます。ケーブルなしで便利なツールです。
Divoom Ditoo Pro ワイヤレススピーカー
15W高音質重低音/青軸キーボード/Bluetooth5.3/ピクセルアート 専用アプリ/USB接続/microSDカード
電源供給USBケーブル スリム 【5本セット】
USB電源ケーブル 5V DC電源供給ケーブル スリム 【5本セット】 電源供給 バッテリー 修理 自作 DIY 電子工作 (100cm)
|