★<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) なんてな表示がされるみたい。 曲の途中の拍子変更を考慮した計算手順ってあるのか!? さぁ、みんなで考えよう!