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; ---)
投稿者:kujira 2006年09月09日 22:16

トラックバック

このエントリーのトラックバックURL:
http://aoi-project.com/presents/mt/mt-tb.cgi/71