読者です 読者をやめる 読者になる 読者になる

ガレスタさんのDIY日記

電子回路、Web、組み込み、自作エフェクターを語るblog

MIDIについて簡単に

MIDI



ここ最近色々な方とお話しする機会があるのだがMIDIって意外に難しいと聞くことが多い。

その点においては否定はない。
全体を把握するとなるともちろん難しいものだからだ


まずMIDIっていうのはMusical Instrument Digital Interfaceの略で音楽における規格のことである。
ウィキペディアによると

電子楽器の演奏データを機器間でデジタル転送するための世界共通規格。物理的な送受信回路・インタフェース、通信プロトコル、ファイルフォーマットなど複数の規定からなる。

とある。

細かく見れば結構複雑だが大きくとらえれば単なるシリアル通信である。

シリアル通信とは?

シリアル通信(シリアルつうしん、英: Serial communication)は、電気通信において伝送路上を一度に1ビットずつ、逐次的にデータを送ることをいう。 また、コンピュータにおいては、バス上を一度に1ビットずつ、逐次的にデータを送ることをいう。

なのでパルス波形の塊でデータ通信を行うものと解釈していればいいと思う。
f:id:gsmcustomeffects:20160309071050g:plain
※図はコンテック社から拝借

んでもってMIDIにはUARTというシリアル通信方式が用いられる

UARTは非同期式シリアル通信のことでそのデバイス通してそう呼ばれる。
www.weblio.jp


ちなみに同期式シリアルというものもありUSARTと呼ばれる。

MIDIって?

んで先ほどの知識を踏まえMIDIというものを説明してみる。

  • ボーレート(簡単に言えば通信速度):31.25Kbps (±1%)
  • 3byte構成の通信

のただのUARTと解釈できます。

なので8ビットのデータの塊で機器が会話をしているという感じになりますね

MIDIメッセージ

おおもとをつかんだところで実際に使うMIDIチャンネルボイスメッセージについて解説していく

ギタリストでラック系の機材を使っていればこの辺をよく聞くだろう。

  • プログラムチェンジ(Cx)
  • コントロールチェンジ(Bx)


これはMIDIチャンネルボイスメッセージといわれるもので音を鳴らす、止めるなどの動作をつかさどる。

  • ノートオン(9x)
  • ノートオフ(8x)

などもそれの一種である。
その他にもあるので興味のある方は調べてみて欲しい。

それで上記でCx,Bxなどの謎の表記が気になる方もいるだろう。
これはMIDIの規格上決められた命令みたいなもので16進数表記で

  • Cx:ProgramChange
  • Bx:ControlChange

などと決められている。
xはチャンネルナンバーです。
上位4ビットが命令で下位4ビットがチャンネルを指定しています。

実際の送信

実際の送信では上記の通りに3byte通信が行われている。

  • 1byte:MIDIメッセージバイト、チャンネルナンバー(Cx、Bxなどが来る)
  • 2byte:データバイト
  • 3byte:データバイト


こんな感じになっている。
例を使ったほうがわかりやすいと思うのでプログラムチェンジで説明しよう。

ProgramChangeをやってみる

Ch1に対して1番のプリセットを呼び出すプログラムチェンジを行うと以下のようになる。

  • 1byte:C0(プログラムチェンジ、チャンネルは0)
  • 2byte:1(プリセットナンバー)
  • 3byte:プログラムチェンジでは使用しない

二進数表記では

  • 11000000
  • 00000001

となるわけでただの8ビット数列を順番に送っているだけというのが理解できたであろう。

マイコンでの実装方法

マイコンの実装ではUARTの送信関数をいじってMIDIように関数を作るのがいいと思う。

  • ボーレート→31250bps

にして

1バイト送信関数がUARTSend()とかいう言う感じだったら

  • UARTSend (0xC0);
  • UARTSend (0x01);

という感じにすればいいと思う。

ボーレートが遅いので高速GPIOを持つマイコンならソフトウエアエミュレートでもMIDI通信が出来そうである。

ちなみにArduinoではライブラリがあるのでこれを使うとさらに楽である。
Arduino Playground - MIDILibrary

勉強したかったらこのライブラリの中身呼んでどうやって構成されているのか知るのもいいと思う。

まとめ

  • MIDIがシリアル通信だと理解した
  • 各バイトの役割を理解した
  • 実際の使い方を簡単だが示せた。