MIDI制御向けMCIコマンド一覧

広告だよ!!!たくさんクリックしてね

以前別の名義で公開していた記事ですが、今見返してもわりと便利なのでこちらのブログで再公開します。おかしなこと書いてあったらすみません


MIDIシーケンスをプログラムで使いたいとき、普通はそれぞれのプログラミング言語にある再生機能を使えばいいわけですが、 テンポを弄るなど細かい制御をおこないたい場合は、MCIを使うのが一番手っ取り早いです。
 ただ、インターネット上に、MCIにおけるMIDIの制御コマンドを詳しく解説しているサイトがなかったので、当記事にまとめようと思います。 MIDI制御に関係ないコマンドやパラメータは省いています。動画やWAVEを扱う場合はほかのサイトを見てください。

 2019年10月現在、MIDIに特化したMCIの制御コマンド一覧としては日本で一番情報量が多いと思いますが、もっと知りたい人はMSの公式記事(英語)を読んでください。

MCIコマンド一覧

コマンド名説明使用例
breakよくわからない
capabilityMCIデバイスで使える機能について詳しい情報を取得できます。
close指定したエイリアスを閉じます。close エイリアス名
info指定したエイリアスで開かれているファイルの詳しい情報を取得できます。
open指定したエイリアスを開きます。open エイリアス名
pause指定したエイリアスを一時停止します。pause エイリアス名
play指定したエイリアスを再生・または再生再開します。再開した場合音色がバグることがあります。play エイリアス名
seek指定したエイリアスの再生位置を変更します。設定後は再生が一時停止します。seek エイリアス名 to 再生位置
set詳しい再生オプションが変更できます。
status詳しい再生情報を取得できます。
stop指定したエイリアスを停止します。stop エイリアス名
sysinfoMCIデバイスの詳しい情報を取得できます。申し訳ないのですが、自分があまり理解できていないため、詳しくは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

パラメータ名説明使用例
copyrightMIDIファイルのメタデータから著作権情報を取得(ひまわりでは正常に動作しませんでした)info エイリアス名 copyright
file指定されたエイリアスで開かれているファイル名info エイリアス名 file
nameMIDIファイルのメタデータから曲名情報を取得(ひまわりでは正常に動作しませんでした)info エイリアス名 name
productエイリアスのデバイスタイプを取得(例:MIDI シーケンサ)info エイリアス名 product

set

(チェック環境がWindows2000だからかもしれませんが)なぜかうまく動かないパラメーターが多いです。MSの記事にはもっとたくさんのパラメーターが紹介されています。

パラメータ名説明使用例
offset timeSMPTE形式(hh:mm:ss:ff)で時間を指定します。set エイリアス名 offset time hh:mm:ss:ff
port mapperMIDIイベントの出力先をMIDIマッパーに指定します。これがデフォルト設定です。set エイリアス名 port mapper
port noneMIDIイベントの出力先をなくします。set エイリアス名 port none
portMIDIイベントの出力先を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:24set エイリアス名 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
offsetSMPTE形式の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 がくしゅうちょうさんの記事が分かりやすいです。(無断リンクすみません)

タイトルとURLをコピーしました