2006年09月09日
MIDIプログラミング~n分音符とタイムベース
久々にMIDIプログラミングをやっています。なんだか、昔は当然のように計算していたタイムベースの計算とか、かなり忘れていて、思い出しながらやっています。それで、忘れないようにメモることにしました。そういうわけで今日もメモブログです。
・・・
四分音符は、1小節を4分割した長さのこと。
八分音符は、1小節を8分割した長さのこと。
MIDIのTimebaseは、四分音符の長さを指定する。
つまり、n分音符の正確なTick値を得るためには、まず、1小節の長さを求めておいて、これを分割することで得られる。
---(
n分音符のTick値 = 1小節の長さ / n分音符
---)
ただ、この1小節の長さを求めるためには、拍子が決定されなくてはならず、MIDIファイルを読み込んだら、まず拍子をチェックして、4/4 なのか、6/8なのかを見る。
そして、4/4とか、8/8なら、問題なく、
1小節の長さ=Timebase * 4
で良いのだけど、6/8とかだと、これに、6/8をかけた長さになるので、
1小節の長さ=Timebase * 4 * (拍子の分子/拍子の分母)
とやることで求められる。つまり、以下の式が成り立つ
---(
n分音符のTick値 = (Timebase * 4 * (拍子の分子/拍子の分母)) / n分音符
---)
??あ、でも、タイムベースは、四分音符を基準にしているのだから、四分音符の何倍か調べるだけでいいのか。遠回りしちゃった。
---(
何倍か=n分音符 / 4
n分音符のTick値 = Timebase / 何倍か
1小節のTick値 = n分音符のTick値 * 拍子記号の分子
---)
半端な音符を、より正確に求めたい場合は、1度小節のTick値を求めてから、さらに、n分音符かを割るといいと思う。
----
それから、tick数から、小節:拍:tickを求める計算式も必要だったので計算。
---(
// TimeSigOya ... 拍子の分母, TimeSigKo ... 拍子の分子, TimeBase ... 四分音符のTick数
function TSmfSong.time2str(time: DWORD): string;
var
measure, beat, tick: DWORD;
baseTick, measureTick, tickN: DWORD;
begin
// 拍子記号の分母の基本Tick数を求める
baseTick := TimeBase div (TimeSigOya div 4);
// 1小節の長さを求める
measureTick := baseTick * TimeSigKo;
// 何小節目か?
measure := time div measureTick + 1;
// 端数を得る
tickN := time mod measureTick;
// 何拍目かを求める
beat := tickN div baseTick + 1;
// Tickを求める
tick := tickN mod baseTick;
// 表示
Result := SysUtils.Format(
'%0.3d:%d:%0.3d', [measure, beat, tick]);
end;
---)
トラックバック
このエントリーのトラックバックURL:
http://aoi-project.com/presents/mt/mt-tb.cgi/71