テキストさうんだぁ
★<PRE>タグを使ってます。「表示が狂うぞ!」ってな人がいらっしゃったら教えてください★


サクラサイトの交流掲示板でTimeコマンドについて話題になったので、ちょいと解析をば。
交流板に書いてあった吟林さんのサンプルを拝借。


l16
PrintTime;拍子(4,4)//[表示] (1): Track(0);Time(1:1:0);//=0(PrintTime)
c^^^d^^^e^^^f^^^|
g^^^a^^^b^^^`c^^^|
PrintTime;拍子(3,4)//[表示] (4): Track(0);Time(3:1:0);//=768(PrintTime)
b^^^a^^^g^^^|
f^^^e^^^d^^^|
拍子(4,4);PrintTime;//[表示] (7): Track(0);Time(4:3:0);//=1344(PrintTime)
c^^^d^^^c^^^d^^^|
e^^^f^^^e^^^f^^^|
g^^^f^^^e^^^d^^^|
拍子(2,4);PrintTime;//[表示] (11): Track(0);Time(14:1:0);//=2496(PrintTime)
c^^^d^^^|
拍子(1,4);PrintTime;//[表示] (13): Track(0);Time(29:1:0);//=2688(PrintTime)
c^^^|

※「//[表示]」以降は、ねおの環境で試した結果を貼り付けたもの。
-----------------------------------------------

●<総ステップ数が1344のときの計算手順を、サクラのソースを見て追ってみる>

「←●」以降は、ねおが付けたコメントです。


★PrintTimeコマンドを文字列検索してみる
 ↓↓コマンド実行時は、たぶん、これが動いてるのかと

mml_base.pas
5977行目

function TMmlBase.scriptPrintTime(var sp: TSrcPos): TMVarCustom;
var
    m: TMTime;
    i: TMVarCustom;
    trk: TTrackInfo ;
begin
    i := nil;
    if sp.ptr^ in ARG_CHAR then
    begin
        i := getArg(sp);
    end;
    if i=nil then trk := CurTrack else trk := SongInfo.GetTrack(i.IntValue);

    m := StepToTime(trk.TimePtr); ←●タイムポインタをStepToTime関数に渡して処理させているっぽい
    PrintCon(Format('Track(%d);Time(%d:%d:%d);//=%d(PrintTime)',
    [trk.TrackNo,
    m.mes, m.beat, m.tick,
    trk.TimePtr]),sp);
    Result := nil;
end;

-----------------------------------------------
★StepToTime関数を探してみる
 ↓↓

mml_system.pas
382行目

function TMmlSystem.StepToTime(step: Integer): TMTime;
var
    base: Integer;
    mes_step: Integer;
begin
    with SongInfo do
    begin
        base := Trunc( timebase * (4/TimeSigHa) ); ←●タイムベース(初期値=96)×(4÷拍子の母) の答えを変数baseに代入>>4/4拍子だから、96×(4/4)=96 =>「1拍は96ステップだ!」
        //小節数を求める
        mes_step := base*TimeSigKo; ←●変数base×拍子の子 の答えを変数mes_stepに代入>>96×4=384 =>「1小節は384ステップだ!」

        Result.mes := step div mes_step; //小節数を取得 ←●現在の総ステップを変数mes_stepで割った商を求める>>1344÷384は3余り192 =>「今は曲のスタートから3小節進んだところにいる!」
        step       := step mod mes_step; //小節数の残りを得る ←●現在の総ステップを変数mes_stepで割った余りを求める>>192
        Result.beat := step div base;    //拍数を取得 ←●今求めた余りをbase(1拍分のステップ数)で割った商>>192÷96=2余り0 =>「今は小節のスタートから2拍進んだところにいる!」
        Result.tick := step mod base;    // ←●今求めた余りをbase(1拍分のステップ数)で割った余り>>0 =>「今は2拍ちょうど進んだところにいる!」

        //1から数えるものは、1を足す
        Inc(Result.mes); ←●「3小節進んでいるから今は4小節目だ!」
        Inc(Result.beat); ←●「2拍進んでいるから今は3拍目だ!」

        Result.mes := Result.mes - SongInfo.MeasureShift ; // これにより、システム設定を1小節目以前にもってくることができる
    end;
end;

-----------------------------------------------
-----------------------------------------------
ってなワケで、
[表示] (7): Track(0);Time(4:3:0);//=1344(PrintTime)
なんてな表示がされるみたい。
曲の途中の拍子変更を考慮した計算手順ってあるのか!?
さぁ、みんなで考えよう!