シンセ開発②:MIDIで演奏できるようにする
本記事は、私が開発しているデジタルシンセサイザに関する内容の一部です。
自作デジタルシンセのまとめ記事はこちら。
MIDIとは
Musical Instruments Digital Interface
の略。
電子楽器の演奏データを機器間でやりとりするための世界共通規格です。
MIDIキーボードやシンセサイザー、DAW等の音楽制作ソフトなどで使用されています。
自作シンセを MIDI 1.0 に対応させて、MIDIキーボードなどで演奏できるようにします。
上位互換の MIDI 2.0 がありますが、実装コストが高い為 MIDI 1.0 で実装します。
MIDI 1.0の通信内容
MIDIメッセージはステータスバイトと1または2バイトのデータバイトで構成されています。
ステータスバイトはメッセージの種類とチャンネル数を表しています。
データバイトはメッセージに関連する具体的な情報が入っています。
例えば、以下のMIDIメッセージの場合は
0x90, 0x49, 0x64
0x90
: チャンネル1のノート(鍵盤)をONにする
0x49
: ドの音(C4)
0x64
: ベロシティ=100 (音の強さ、鍵盤を押した強さ)
といった意味のメッセージとなります。
メッセージ例と詳しい仕様については以下の記事をご覧ください。
UARTでMIDIを受信する
MIDIはデータ形式と通信方式がUARTと一致するため、Picoで送受信することができます。
MIDI規格によると、受信回路にはデバイス間の電気的な絶縁が推奨されています。
規格書にある通り、オプトアイソレーターを使って絶縁します。
規格書より受信回路の図
MIDI-INの実装
受信回路に使う部品がよく分からなかったため、実装例を探しました。
こちらの商品ページにある回路図と部品構成を参考にさせていただきました。
使用する部品
MIDIケーブルは、一般的に5ピンのDINプラグのケーブルが使われています。
MIDIコネクタには秋月電子にあるこちらのコネクタを使います。
フォトカプラはTOSHIBAのTLP2361を使います。
その他に、抵抗(220Ω)・ダイオード(1N4148)・コンデンサ(0.1μF)も購入しました。
回路を組む
フォトカプラは変換基板などを使ってブレッドボードに刺せるようにします。
小さい部品なので集中してはんだ付けをする
完成した回路はこちらです。
フォトカプラの出力は制御用PicoのUART(RX)に接続します。
全体的にはんだ付けが不十分です。しっかりはんだ付けしましょう。
MIDIを受け取るコードを書く
SerialUARTのread()
でバイトを受け取るコードを制御用Picoに書き込みます。
以下はサンプルコードです。
SerialUART* midi = &Serial1;
if(!midi->available()) return;
uint8_t statusByte = midi->read(); // ステータスバイト
// ch1ノートオン・オフの場合
if (statusByte == 0x90 || statusByte == 0x80) {
if(!availableMIDI()) return;
uint8_t note = midi->read(); // 鍵盤の番号
if(!availableMIDI()) return;
uint8_t velocity = midi->read(); // ベロシティ値
// ベロシティが0の場合はノートオンでもノートオフとする
bool noteOn = (statusByte == 0x90) && velocity != 0x00;
// 処理
}
//処理
の部分でノート番号とベロシティ情報などをシンセ用Picoに送信します。
ノート情報はシンセ側で周波数情報に変換され音を生成します。
ノート番号を平均律の周波数に変換する場合は以下の計算式が使えます。
440.0 * pow(2.0, (ノート番号 - 69) / 12.0);
MIDIキーボードで弾いてみる
MIDIキーボードを弾くとそのキーに対応した音程の音が出るようになりました。
オーディオインターフェースを使ってDAWから演奏することもできます。
次の記事
Discussion