No.002 - 01 MIDI再生の基本 |
筆者音楽系は苦手なのになぜかこんなコーナー。
MIDIシーケンサのソース置いてるサイトってあんまナイですね。
さて最低限MIDI再生に必要な手順はこれだけです。
|
音を鳴らすだけなら上記だけですが実際にやろうと思えば簡単じゃないです。
手順だけでもこんなカンジ。
|
実際MIDIを再生するにはタイマーを使って音を鳴らしていくワケですが
windowsタイマのWM_TIMERではメッセージの優先順位が低く精度が悪くて使い物にはなりません。
そこでタイマには『マルチメディア・タイム・ファンクションtimeSetEvent()』を使います。
timeSetEvent()は高精度のタイマを持っていますが、代わりにこの関数内から呼べるWindowsAPIは8種類しかありません。
PostMessageとデバッグ用のOutputDebugStrと
4種のタイマ関数(timeSetEvent(), timeKillEvent(), timeGetTime(), timeGetSystemTime() )と
2種のMIDI出力関数(midiOutShortMsg(), midiOutLongMsg() )だけです。
つまりこのタイマ関数はMIDI再生のための関数であって、それ以外にはほとんど使えないというこってす。
|
種類 | MIDIメッセージ | データバイト | 値 |
音を消す | Note off (ノートオフ) |
0x8n kk | kk == キー番号(音階)…0〜127 |
音を鳴らす | Note on (ノート オフ) |
0x9n kk vv | kk== キー番号(音階) …0〜127 vv == 打鍵速度(音量) …0〜127 |
アフタータッチ(個々の音) | Polyphonic After Touch (ポリフォニック アフター タッチ) |
0xAn kk tt | kk== キー番号(音階) …0〜127 tt == アフタータッチ …0〜127 |
Control Change (コントロール チェンジ) |
0xBn cc xx | cc == コントローラ …0〜121 xx == 値 …0〜127 |
|
Channel Mode Local Control (チャンネル モード ローカル チェンジ) |
0xBn 7A xx | xx ==0(オフ)、==127(オン) | |
全ての音を消す | All Notes Off (オール ノート オフ) |
0xBn 7B 00 | |
Omni Mode Off | 0xBn 7C 00 | ||
Omni Mode On | 0xBn 7D 00 | ||
Mono Mode On | 0xBn 7E cc | cc == チャネル番号 | |
Poly Mode On | 0xBn 7F 00 | ||
音色の変更 | Program Change | 0xCn pp | pp == プログラム |
アフタータッチ(チャンネルごと) | Channel After Touch | 0xDn tt | tt == アフタータッチ …0〜127 |
Pitch Wheel Change | 0xEn ll hh | ll == 下位7ビット …0〜127 hh == 上位7ビット …0〜127 |
※アフタータッチ…既に押しているキーを更に強く押して音色を変える機能。一部の機器で使える。
メタイベント 第1バイトが0xFF |
メタイベントは第1バイトが0xffの特殊メッセージです。 MIDIデバイスに送るためのメッセージではありません。 何種類もありますがアプリケーション側で処理するためのものです。 |
||
---|---|---|---|
種類 | フォーマット |
説明 | |
第2バイト | データ長さ | ||
シーケンス番号 | 0x00 | 2バイト | シーケンス番号。 |
テキスト | 0x01 | 任意 | 任意のテキスト文字列。 |
著作権表示 | 0x02 | 任意 | 著作権表示用のテキスト文字列。トラックチャンクの先頭イベント(タイム0)とする。 |
シーケンス名 ・トラック名 |
0x03 | 任意 | シーケンス/トラック名を記述するテキスト文字列。 |
楽器名 | 0x04 | 任意 | 各チャンネルに対応する楽器名を記述する。 |
歌詞 | 0x05 | 任意 | 歌詞。カラオケで使われる。 |
マーカ | 0x06 | 任意 | |
キューポイント | 0x07 | 任意 | ビデオとかに指示を出すときの文字データ。 |
MIDIチャンネル プリフィックス |
0x20 | 1バイト | メタイベントやSysExイベントなどチャンネル属性を持たないイベントに、チャンネル属性を 持たせる。MIDIイベントや次にこのメッセージがでてくるまで有効。 |
トラック終端 | 0x2F | 0バイト | トラックの終了を示す。トラックの最終位置に必ず配置する。 |
テンポ | 0x51 | 3バイト | 4分音符の長さをマイクロ秒(μ秒)単位で表す。アプリケーション側で計算する。 このメッセージがない場合 テンポ120(==500000秒)。 |
SMPTEオフセット | 0x54 | 5バイト | SMPTEはシンプティと読む。トラックチャンクがスタートすべきSMPTE時間を示す。トラックの始まりの全ての0でないデルタタイムの MIDIイベントの前に置く。 |
拍子 | 0x58 | 4バイト | [a:b:c:d]拍子==a/2のb乗, メトロノーム1カウントあたりのMIDIクロック数c、4分音符中の32分音符数d。 |
調号 | 0x59 | 2バイト | [a:b] a はシャープ・フラット記号の数(フラットの数マイナス値)、b はメジャーのとき0, マイナのとき1。 |
固有のメタイベント | 0x7F | 任意 | メーカー固有イベント。データはマニファクチャラーズIDを表記する。 |
MIDI参考:
書籍
ファイルフォーマット事典
プログラミングWindows第5版(下)
サイト
B#のMIDIのページ
ディレクト アート スタジオ の詳細MIDI規格のページ