変数で取得できるTickの値について (Last-Update 2003-07-23)

1.MIDIデータと、ツクール上のTickの関係

RTPのいくつかのMIDIファイルについて、以下のデータを取得した。
ただし、小節の表現はCherryのものである。

[ファイル名]
TimeBase      : [分解能](*[拍数]= [1小節分のTickの大きさ])
CC111         : [CC111の小節数:小節内Tick]
FirstNote     : [最初のノートオンイベントの小節数:小節内Tick]
T2kStartTick  : [そのMIDIデータのTickの(ツクールで取得できる)初期値]

"そのMIDIデータのTickの(ツクールで取得できる)最小値"というのは、
ツクールのイベントで取得できるTickの内、
一定の値が取得されるようなイベントで取った値である。
イベントの内容は以下の通りである。

開始条件: 定期的に並列処理
実行内容:
◆変数の操作: [Tick格納用変数]代入, MIDIの演奏位置(Tick)
◆イベントの一時消去
◆

これで、読み込みと同時にイベントが実行される。
自動開始イベントでは、読み込んで表示した後に開始されるので、
一定の値を得ることはできない。


Jアイテム.mid
TimeBase      : 96(*4= 384)
CC111         : 2:0203
FirstNote     : 1:0000
T2kStartTick  : 336

Jギャグ1.mid
TimeBase      : 96(*4= 384)
CC111         : 3:0047
FirstNote     : 1:0000
T2kStartTick  : 336

Jギャグ2.mid
TimeBase      : 96(*4= 384)
CC111         : 2:0239
FirstNote     : 1:0000
T2kStartTick  : 336

フィールド1.mid
TimeBase      : 96(*4= 384)
CC111         : 0:383
FirstNote     : 1:0001
T2kStartTick  : 335

フィールド2.mid
TimeBase      : 96(*4= 384)
CC111         : 1:0071
FirstNote     : 1:0000
T2kStartTick  : 336

フィールド3.mid
TimeBase      : 96(*4= 384)
CC111         : 1:0071
FirstNote     : 1:0000
T2kStartTick  : 336

フィールド4.mid
TimeBase      : 384(*4= 1536)
CC111         : 1:0000
FirstNote     : 1:0000
T2kStartTick  : 1344

戦闘3.mid
TimeBase      : 384(*4= 1536)
CC111         : 2:0000
FirstNote     : 1:0384
T2kStartTick  : 1728


これらのデータから以下の様な法則が予測される。

取得できるTickの初期値
= (1:0000, 最初のノートオン, CC111の内いずれか早いもの) - MIDIの分解能/2

また、"分解能/2"という値は、次項の結果より、
MIDIデータの初期化処理の時間が取られたものと思われる。


2.ルーブ再生時のTick

ループした瞬間のTickを取得したところ、
CC111のある位置(あるいはデータの先頭 = 0)にTickが変化していた。
"分解能/2"等といった値が引かれることも無かった。
この事から、ツクールは正確にTickの値を取得しているものと思われる。
しかし、

・MIDI音源(特にソフトウェア音源)は発音までに多少の時間がかかる
・Tickの値の変化は早い
・他のプログラムの影響でたまに処理落ちが起こる

等の理由により、意図していたものと違うタイミングで数値を取得してしまうことがある様だ。


3.特殊なBGM

・BGMに波形ファイル(*.wav, *.mp3)を使用した場合
得られるTickの値は常に0である。

・BGMなしの場合
得られるTickの値は常に0である。

・ループを防ぐため曲の最後にCC111を記述した場合
Tickは増え続け、CC111の位置で止まることも無い。(BGMはちゃんと止まる)

・CC111を記述しなかった場合
曲の終わりまで到達したら先頭(Tick = 0)に戻る。


4.テンポ

Tickの値はMIDIデータ上のTick値に依存する。
よって、曲のテンポを変更しても、Tickは変化しない。

例. 戦闘3.mid

・50%
T2kStartTick  : 1728
RoopTick      : 3072
LastTick      : 64511

・100%
T2kStartTick  : 1728
RoopTick      : 3072
LastTick      : 64511

・150%
T2kStartTick  : 1728
RoopTick      : 3072
LastTick      : 64511