MIDI アウト(MIDI信号の出力)
MIDI イン(MIDI信号の入力)
MIDI スルー(MIDI信号の出力が、そのままスルーされる)
MIDI信号は大きく2つに分かれ、楽譜の音符データ(楽器の種類、音の高さ、音の強さなど)と、楽器内のシステムデータ(楽器ごとに異なるデータ)に分かれます。
このうち、音符データをデバイスの信号として使うことで、音を扱うようにセンサー情報を扱うことができます。
自分の経験上、周りにDTM(デスクトップミュージック)を趣味とする人が多かったのですが、センサーやデバイスのことは未経験でも、MIDIはすぐに理解してもらえました。
MIDIの音符データは、「ノート信号」と呼ばれます。
ノート信号は、3つのデータから構成されているので、順番に覚えておきましょう。
・チャンネル
・ノート
・ベロシティ
今回はこれを、以下のように置き換えて使います。
・センサーの種類
・信号
・ナシ(使わない)
音を鳴らすチャンネルのこと。0〜15までが標準で、音色の違う楽器を割り当てるためにある。
自作MIDIデバイスにする場合は、何に使っても良いのだけど、複数のセンサーを使う場合は、その種類を割り当てると使いやすそうです。
音階を0〜127までにしたもの。
解像度が128しかないのだけど、耳に聞こえる音階はそれで十分なので、こうなっている。
DTMのわかる人なら、センサーの信号はノートに割り当てると使いやすいと思います。
音の強さを0〜127までにしたもの。
初期のMIDI楽器には、ベロシティがなく、一律に同じ強さの音が鳴っていました。
ここにセンサー信号を割り当ててもよいですが、今の時点では使わないこととします。
あとで書きますが、
ノートもベロシティも128段階の解像度しかありませんが、Arduinoは1024段階のアナログ入力ができます。1つの工夫として、ノート・ベロシティの2データを使って、1024段階とすることができます。
MIDIデバイスの設定
Media > MIDI Settings...
Input Devicesで、
USB MIDI装置
を選ぶ
OKを押して設定完了です。
[ notein ]
で、チャンネル・ノート・ベロシティが受け取れます。
[ notein 1 ] などで、チャンネルを指定して受け取ることもできます。
チャンネルをセンサーの種類にしておけば、
振り分けが楽になります。
MIDIライブラリもありますが、使わずにやってみます。ルールはシンプルです。
シリアル通信の速度
・31250 bps
一回に3つのデータを送信する
・チャンネル:16進数で、0x90〜0x9F
・ノート:0〜127
・ベロシティ:ダミー
ノート信号には、ノートオン(音を出す)、ノートオフ(音を止める)という信号があります。
ベロシティを使えば、ノートオンは音量をあげ、ノートオフは音量がゼロになるようにできます。
まだベロシティが実装されていない時期の名残りで、チャンネルでノートオンオフすることもあります。
チャンネルは、16進数で0x90〜0x9F(ノートオン)、0x80〜0x8F(ノートオフ)になります。
10進数では、144〜159(ノートオン)、128〜143(ノートオフ)です。
デバイスに使うなら、ノートオン、ノートオフのどちらを使っても良いので、このWSではノートオンを使っています。
・220オーム抵抗 × 2コ
・DIN 5 メスコネクタ
http://akizukidenshi.com/catalog/g/gK-10261/
・ブレッドボード
・ブレッドボード用ケーブル × 3本
・10ピン(シリアル受信)・・・・今回は使わない
・11ピン(シリアル送信)・・・・MIDIアウトにつかう
MIDIを使った手軽なデバイスは、0〜127の値しか扱うことができません。
MIDI信号は3バイトあるので、2バイトを使ってArduinoのアナログ値「0〜1023」を送受信するプログラムを作ります。ArduinoとPdの両方を変更します。
考え方としては、
2つのデータのうち、1つを128で割った商、1つをその余り0〜127、とします。
100の場合は、商が0、余りが100です。
...
127の場合は、商が0、余りが127です。
128の場合は、商が1、余りが0です。
...
1023の場合は、商が7、余りが127です。
MIDIでは以下のように送ることになります。
・チャンネル
・商
・余り
(count >> 7 )で、128で割り算したことになります。右向きの7ビットシフト。
(count / 128)よりも少し高速に処理できます。
※マイコンのプログラムでは割り算の遅さが顕著なことがあるので覚えておくとよいです。
(count & 0x7F)では、ビット演算で下7桁の0〜127を取り出すことができます。
2進数で考えると(count & 0b01111111)となります。
補足のページをつくりました。
[ notein ] から、取り出した2つの値を、元に戻します。
商は、左向きの7ビットシフトをつかって、128倍にします。
さらにその計算結果に、余りを足し算します。