MIDIメモ
MIDIメッセージ(イベントとも)
メッセージ → MIDI信号のこと。コマンド
-> データバイト
と続く。
- コマンド → 命令の種類
- データバイト → 設定する値(パラメータ)
通信速度
シリアル通信で 31250Hz
MIDI コマンド
コマンドの値 → 128
~ 255
- 2進数で
1000000
~11111111
- コマンドのMSBは
1
- MSBを覗いた先頭の
3bit
は命令の種類を表す - 後半の
4bit
はチャンネルを指定する。
- MSBを覗いた先頭の
コマンドバイト例
コマンドの例
引用元: http://itp.nyu.edu/physcomp/Tutorials/MusicalArduino
チャンネル
値 → 1 〜 16
/ 0 ~ 15
特定のMIDI楽器のノート
やメッセージを送信するための識別番号のこと、要は音源の数のこと。
16チャンネル以上を扱うフォーマットは標準規格はない
チャンネル10
はドラム専用という慣習があるらしい。
MIDIデータバイト
0
~ 127
-
00000000
~01111111
- データバイトのMSBは常に
0
- データバイトのMSBは常に
128段階の分解能が足りない場合
ピッチベンドはデータバイト数を増やして 0
〜 16383
(14bit
) 段階で表す
2つのバイトを以下のように設定すると 0
と認識される。
- MSB =
64
=100,0000
- LSB =
0
=000,0000
- 2つ並べると
0010,0000,0000,0000
=8192
- なお
LSB
→MSB
の順に送信する
- なお
msb = 8192 >> 7;
lsb = 8192&127;
serial.send(lsb);
serial.send(msg);
参考元
イベントの種類
ノートオン / ノートオフ
- ON →
0x8n
+0xkk
+0xvv
- OFF →
0x9n
+0xkk
+0xvv
ONとOFFの組み合わせで一つの「音」
ONとOFFの間が音が鳴っている時間
n
→ チャンネル番号
kk
→ ノート番号
vv
→ ベロシティ
-
ベロシティ
- 音の強さ(鍵盤を押す強さや弦をはじく時の強さとか)を表す
-
ビッチベント →
0xEn
+0xmm
+0xll
-8192~8191
- 音の上げ下げ(ピッチベンドホイールの操作に相当)
n
→ チャンネル番号
ll
+mm
→ ピッチベンドの値(2byteで表現)
- コントロールチェンジ →
0xBn
+0xcc
+0xvv
- シンセや音源に設定されたパラメータをいじるイベント
- シンセサイザーのつまみをいじる操作に相当
- シンセや音源に設定されたパラメータをいじるイベント
n
→ チャンネル番号
cc
→ コントローラ番号
vv
→ 送信する値
-
ボリューム
-
モジュレーション(ビブラート)
-
パンポット(音の左右振り)
-64~0(真ん中)~63
-
エクスプレッション → 音の表情つけ
-
プログラムチェンジ →
0xCn
+0xpp
- パッチチェンジとも。チャンネル先の音源を変える。
n
→ チャンネル番号
pp
→ 変更するプログラム番号(pp
番に変える)
システムエクスクルーシブ(SysEx)
メーカーごとに自由に設定できるイベント値。
各種機器のマニュアルを参照すること
音源リセットを行うシステムリセット
メッセージは、ほぼ共通のSysEx
SysEx の2つの形式
-
0xF0
から始まるSysEx-
F0
(開始データ)+n
(データ長)+0xXX...
(実データ)+F7
(番兵)- データ長 → 実データ+番兵=
n+1
- 例:
F7
+0x05
+0xaa bb cc dd
+F7
- データ長 → 実データ+番兵=
-
-
0xF7
から始まるSysEx-
F7
(開始データ)+n
(データ長)+0xXX...
(実データ)- データ長 → 実データと同じバイト数
- 例:
7
+0x04
+0xaa bb cc dd
-
F7
スタートのSysExはリアルタイムバイト、ソングポインター、MIDIタイムコード、システムリセットなど通常の方法では送れないデータを直接送るための裏技- 互換性が無い
-
データ長 → 可変長形式(MSB
が1
か0
かで続くどうか)
普通はF0スタートのSysExだけを使えばよいらしい
Send SX
- sysex などのMIDIメッセージの送信受信をダンプできるWindows向けユーティリティ
- 商用環境での利用は有償
ソフトウェア
シンプルなMIDIメッセージパーサー
RtMIDIなどと組み合わせて使うMIDIメッセージライブラリ
ターミナルMIDIモニター
RTP-MIDI(AppleMIDI)
RTP MIDI (AppleMIDI) daemon for Linux
Windows向けRTP MIDI ドライバ(チュートリアル記事へのリンクもある)
Linux MIDI How to
SMPTE
同期録音の歴史
http://www2.odn.ne.jp/~cbu69490/MIDI/MIDIlect2/synchronize.html からの引用
MIDI機器間での同期録音
- MTR(
Multi Track Recorder
)とシーケンサーを同期させる場合、通常はレコーダー側がマスター- レコーダーからタイミング・クロックをシーケンサーに送信して同期する。
- クロック信号をレコーダー側のどこかのトラックに録音しておく
- レコーダーからタイミング・クロックをシーケンサーに送信して同期する。
クロック信号(MIDIタイミング・クロック)はデジタル信号なのでそのままテープに録音出来ない
-
FSK
/SMPTE
と呼ばれる信号に変換して録音し、それをMIDIタイミング・クロックに変換してシーケンサーに送信する
FSKとSMPTE
-
FSK
はタイミング・クロックと同じ → テンポによってクロックの間隔が変化する - タイム・ベース
24
が一般的-
FSK
信号をタイミング・クロックに変換する作業は比較的簡単なので当初は広く使われた
-
- SMPTE信号
- 絶対時間で管理するためシンクロナイザーと言ったシンクロ専用のアイテムが必要でプロ用途だった
シンク録音における途中からの同期
- FSK信号を使う同期録音
- 常に曲の頭からスタートさせなければ同期を取れない。
- ある楽器のタイミングがピッタリかどうか確認するためには、曲の最初から聞かなければならない
- タイミングを少しずらしたいとき、また最初から聞いて意図通りか確認する必要があって不便
- ある楽器のタイミングがピッタリかどうか確認するためには、曲の最初から聞かなければならない
- 常に曲の頭からスタートさせなければ同期を取れない。
- MIDIのタイミング・クロックは、FSK信号と基本的に同じ
-
ソング・ポジション・ポインターの出現によって、曲の途中からの同期が可能
- 曲の頭から聞くという無駄がなくなり、シンク録音の効率が大幅にアップ
- レコーダー側は依然としてFSK信号を使用するので、シーケンサーがソング・ポジション・ポインターに対応していても、それを使うことは出来なかった。
- そのため絶対時間で管理しているSMPTE信号からタイミング・クロックやソング・ポジションを作り出すことにした
- レコーダー側は依然としてFSK信号を使用するので、シーケンサーがソング・ポジション・ポインターに対応していても、それを使うことは出来なかった。
- 曲の頭から聞くという無駄がなくなり、シンク録音の効率が大幅にアップ
-
ソング・ポジション・ポインターの出現によって、曲の途中からの同期が可能
SMPTEとは
- SMPTEとは、
Society of Motion Picture and Television Engineer
の略- MIDIとは全然関係ない映像業界から生まれたもの
- VTRの同期信号として広く使われ、映像と音楽の同期にも利用されるようになった
- あくまでも規格の中のひとつだが、SMPTEが最もポピュラー
- レコーダー同期などに使うSMPTEは、タイムコードの意味で使用されることが多い
- VTRの同期信号として広く使われ、映像と音楽の同期にも利用されるようになった
- MIDIとは全然関係ない映像業界から生まれたもの
- SMPTE信号は単なるタイミング情報が記録されるのではなく 絶対時間情報(時/分/秒/フレーム) が記録される
- 任意のポイントでSMPTE信号を読み出せば、曲の頭から何秒後かがわかる。
- SMPTEにはフレームと言う単位が用意
- 1秒間を何フレームにするかの定義
- 日本やアメリカのカラー・テレビの場合、 30フレームのドロップ(29.97フレーム) が使われている
- 従来、モノクロ画像を
30枚/秒
という規格があった- カラーになってその分増えた信号を前と同じ速度で処理しようとしたため、半端な数字が出てしまったらしい
- 従来、モノクロ画像を
- ヨーロッパでは、
24
や25
フレームを使用
- 日本やアメリカのカラー・テレビの場合、 30フレームのドロップ(29.97フレーム) が使われている
- 映像はカラーが主役なので、
ドロップ・フレーム
が一般的- レコーディングでは映像とリンクしない限り 30フレームのノンドロップ が使われる。
- 1秒間を何フレームにするかの定義
- SMPTE信号を使った同期を行えば、時/分/秒/フレームで指定される曲中の任意のポイントから同期できる。
- 曲の途中から同期が可能。
上記記事によれば「ドロップフレーム」を気にするのは映像機材側。
音楽(MIDIシーケンサ・レコーダー)側は30fps
を使うという理解でよい。
MIDIタイミングクロック
http://www2.odn.ne.jp/~cbu69490/MIDI/MIDIlect2/MIDIlect4.html より引用
F8
)
リアルタイムメッセージ(- MIDIクロックとも呼ばれるMIDIの同期信号
- タイミング・クロックのタイム・ベースは
24
(4分音符あたり)-
F8
が送られる間隔はテンポによって異なる。- つまり、4分音符の長さの時間を
24
等分してその間隔でF8
が送られる
- つまり、4分音符の長さの時間を
-
- テンポ60の曲のとき
-
1/24
=約0.04
秒間隔
-
- テンポ120のとき
- テンポ
60
の約半分0.02
秒間間隔でF8
が送られる
- テンポ
- 曲中にテンポの変化を付ければ、タイミング・クロックの間隔が変化しスレーブ側のシーケンスと同期が取れる
- タイミング・クロックのタイム・ベースは
- タイミング・クロックのタイム・ベース
24
は精度が悪すぎる- MIDI規格が出来た当時から指摘されていた
- この問題を解消するため、
F8
を直接使わず定倍することで精度の高いクロックを作り出し、精度を確保することもある
- この問題を解消するため、
- MIDI規格が出来た当時から指摘されていた
MTC(MIDI Time Code)
https://www.g200kg.com/jp/docs/dic/miditimecode.html より引用
-
複数のシーケンサーなどの同期運転を行う方法の1つ
-
MIDI 信号を使って絶対時間を表すタイムコードを送る
- MTCよってマスター側の機器の操作にスレーブ側の機器が追従するような動作をさせる事ができる
-
使用される MIDI メッセージは、システムコモンメッセージに属する「 MTC クォーターフレームメッセージ (
F1H
)」- このメッセージにより、
1/4
フレーム毎に時間情報の1/8
を分割して送出- 1つの絶対時間は2フレームで完成する
- 本来の SMPTE では1フレーム毎に80ビットの時間情報を送出するため、完全な絶対時間の精度は SMPTE の
1/2
、ビット単位の精度は1/20
- このメッセージにより、