以前別の名義で公開していた記事ですが、今見返してもわりと便利なのでこちらのブログで再公開します。おかしなこと書いてあったらすみません
MIDIシーケンスをプログラムで使いたいとき、普通はそれぞれのプログラミング言語にある再生機能を使えばいいわけですが、 テンポを弄るなど細かい制御をおこないたい場合は、MCIを使うのが一番手っ取り早いです。
ただ、インターネット上に、MCIにおけるMIDIの制御コマンドを詳しく解説しているサイトがなかったので、当記事にまとめようと思います。 MIDI制御に関係ないコマンドやパラメータは省いています。動画やWAVEを扱う場合はほかのサイトを見てください。
2019年10月現在、MIDIに特化したMCIの制御コマンド一覧としては日本で一番情報量が多いと思いますが、もっと知りたい人はMSの公式記事(英語)を読んでください。
MCIコマンド一覧
コマンド名 | 説明 | 使用例 |
break | よくわからない | |
capability | MCIデバイスで使える機能について詳しい情報を取得できます。 | |
close | 指定したエイリアスを閉じます。 | close エイリアス名 |
info | 指定したエイリアスで開かれているファイルの詳しい情報を取得できます。 | |
open | 指定したエイリアスを開きます。 | open エイリアス名 |
pause | 指定したエイリアスを一時停止します。 | pause エイリアス名 |
play | 指定したエイリアスを再生・または再生再開します。再開した場合音色がバグることがあります。 | play エイリアス名 |
seek | 指定したエイリアスの再生位置を変更します。設定後は再生が一時停止します。 | seek エイリアス名 to 再生位置 |
set | 詳しい再生オプションが変更できます。 | |
status | 詳しい再生情報を取得できます。 | |
stop | 指定したエイリアスを停止します。 | stop エイリアス名 |
sysinfo | MCIデバイスの詳しい情報を取得できます。申し訳ないのですが、自分があまり理解できていないため、詳しくはMS公式記事で調べてください。 |
capability
パラメータ名 | 説明 | 使用例 |
can eject | 取り出しが可能かどうか | capability test can eject |
can play | 再生が可能かどうか | capability test can play |
can record | 録音が可能かどうか(MIDI) | capability test can record |
can save | 上書き保存が可能かどうか | capability test can save |
compound device | 現在開いているファイルをサポートしているかどうか | capability エイリアス名 compound device |
device type | エイリアスのタイプ(SequencerやWaveaudio等) | capability エイリアス名 device type |
has audio | 現在開いているファイルに音声が含まれているか | capability エイリアス名 has audio |
has video | 現在開いているファイルに動画が含まれているか | capability エイリアス名 has video |
uses files | 現在開いているファイルを使用中かどうか | capability エイリアス名 uses files |
info
パラメータ名 | 説明 | 使用例 |
copyright | MIDIファイルのメタデータから著作権情報を取得(ひまわりでは正常に動作しませんでした) | info エイリアス名 copyright |
file | 指定されたエイリアスで開かれているファイル名 | info エイリアス名 file |
name | MIDIファイルのメタデータから曲名情報を取得(ひまわりでは正常に動作しませんでした) | info エイリアス名 name |
product | エイリアスのデバイスタイプを取得(例:MIDI シーケンサ) | info エイリアス名 product |
set
(チェック環境がWindows2000だからかもしれませんが)なぜかうまく動かないパラメーターが多いです。MSの記事にはもっとたくさんのパラメーターが紹介されています。
パラメータ名 | 説明 | 使用例 |
offset time | SMPTE形式(hh:mm:ss:ff)で時間を指定します。 | set エイリアス名 offset time hh:mm:ss:ff |
port mapper | MIDIイベントの出力先をMIDIマッパーに指定します。これがデフォルト設定です。 | set エイリアス名 port mapper |
port none | MIDIイベントの出力先をなくします。 | set エイリアス名 port none |
port | MIDIイベントの出力先をMIDIポート番号で指定します。これを使うとUM-1とかのハードウェアに出力できるの・・かな? | set エイリアス名 port 0 |
slave file | ファイルデータを同期ソースとして使用するようにMIDIシーケンサーを設定します。これがデフォルト設定です。(正直よく分からない) | set エイリアス名 slave file |
slave none | 同期データを無視するようにMIDIシーケンサーを設定します。(正直よく分からない) | set エイリアス名 slave none |
tempo | テンポを変更します。 | set エイリアス名 tempo 120 |
time format milliseconds | 『status time』で取得する再生時間の表記をミリ秒に変更します。 | set エイリアス名 time format milliseconds |
time format SMPTE 30 drop | 『status time』で取得する再生時間の表記を30fpsに変更します。例 10833ミリ秒→00:00:10:24 | set エイリアス名 time format SMPTE 30 drop |
time format song pointer | 『status time』で取得する再生時間の表記をソングポインタに変更します。ソングポインタについては後述します。 | set エイリアス名 time format song pointer |
status
パラメータ名 | 説明 | 使用例 |
current track | 開かれているトラックの数を取得します。 | status エイリアス名 current track |
division type | 現在再生中のファイルの分解形式を取得します。 | status エイリアス名 division type |
length | 現在再生中のファイルの長さを取得します。 | status エイリアス名 length |
length track | 指定したトラックの長さを取得します。 | status エイリアス名 length track 1 |
master | 同期セットのタイプに応じて、『midi』、『none』、または『smpte』を返します。 | status エイリアス名 master |
media present | メディアがデバイスに(物理的な意味で)挿入されている場合はTRUE、そうでない場合はFALSEを返します。MIDIの場合はTRUEを返します。 | status エイリアス名 media present |
mode | 指定したエイリアスの再生状態を取得します。再生中なら『playing』、停止していたら『stopped』など。 | status エイリアス名 mode |
number of tracks | 現在再生中のトラック番号を取得します。 | status エイリアス名 number of tracks |
offset | SMPTE形式のMIDIファイルの再生時間を取得します。 | status エイリアス名 offset |
port | エイリアスで使用されているポートを取得します。 | status エイリアス名 port |
position | 現在の再生位置を取得します。 | status エイリアス名 position |
position | 指定されたトラックの再生位置を取得します。自分にはよく分からないです。 | status エイリアス名 position 1 |
ready | エイリアスがコマンドを受け入れる準備ができているかを取得します。 | status エイリアス名 ready |
slave | 同期セットのタイプに応じて、『midi』、『none』、または『smpte』を返します。 | status エイリアス名 slave |
start position | 再生を開始する位置を取得します。 | status エイリアス名 start position |
tempo | 現在のテンポを取得します。 | status エイリアス名 tempo |
time format | 『position』で再生位置を取得する際のフォーマットを取得します。 | status エイリアス名 time format |
ソングポインタとは?
MCIでは時間を取得する際のフォーマットの一つに「Song pointer」という形式があります。 これは、1拍の分解能を4にしたものです。 つまり、8拍で終わる曲なら、4*8=32で、開始は0からなのでそこから1を引き、曲の長さは31になります。 MIDIの音声部の分解能は可変なので、それとはまた別のもので、再生時間とアプリケーションを同期させたい時に役立ちます。 例えば4ソングポインタ毎に音を鳴らせば、簡単にメトロノームが作れますし、音ゲーの音合わせにも有用です。
小節や拍子、調などが知りたい場合
残念ながら、それらはMCIでは取得できません。ただ、MIDIファイルを解析すれば知ることができます。 MIDIファイルはバイナリデータですので、バイナリが扱える必要があります。
どのように表記されているかは、ハトネコエ Web がくしゅうちょうさんの記事が分かりやすいです。(無断リンクすみません)