OLD School

![coffeesexy77__3n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/32e2223e-fafa-ffbc-6b6f-f5a336d77948.jpeg)

Rhythm リズムについて、直近での発見を[昨日書いた](http://manuke.hateblo.jp/entry/2019/04/10/220337)。

このなかで最後にTrackerが登場する。MilkeyTrackerというサンプリングシーケンサーだ。

そのコラムの中でBPMというキーワードが登場して重要な意味を持っているように書かれているのに、TrackerのところではそのBPMはフェ−チャーしていない。曖昧だ。 それまで、「BPMが110で」とか
>BPM110でつくったパターンのMIDIデータをMuseScoreで楽譜にしてみたら前半がBPM110、そして後半がBPMが変わっていた。

とかいったように、BPMが不変であることが前提かのようにしていて、Trackerのところへくると、BPMのことは言及せずに不自然にもしれっと全部新たにパターンを作り直している。

このことは実は理由があるわけだ。
結論から書くと、まだそのへんがハッキリしない。わからないからふれていない。
Rhythm リズムを書く前日あたりまで、Trackerの中でのBPMの概念について調べていたけれども、ある程度までわかったが、その実証はまだできていない。

その「ある程度まで」について、現時点でまとめておこうと思いましょう。

（きっと長くなる）


<b><span style="color: #5ed361">TrackerのBPMがなんか変だ</span></b>とか、<b><span style="color: #5ed361">TrackerのBPMが実際のBPMと違うのだけど</span></b>ということは、世界中でのひとの心を悩ませている。

と思う。
これは、調べていると、この<b><span style="color: #5ed361">TrackerのBPMとはなんなのか？</span></b>というトピックが必ず見かけられるからだ。この質問に答えられる人は限られている。だからハッキリしないのだ。


TrackerのBPMについて説明する前に、大きく影響している事実を知っておいた方が理解しやすくなる。少し遠回りだけれど、それは先に知っておかなければつじつまが解らないはずだから。

#### Trackerとは何か？という原点について
それはAmigaというパーソナル・コンピューターの為に1987年に[Karsten Obarski]
(http://www.bitfellas.org/e107_plugins/content/content.php?content.211)
によってリリースされた[Ultimate Soundtracker](https://www.exotica.org.uk/wiki/Soundtracker_History "Soundtracker_History")というプログラムを起源として、その後にAmiga以外のパーソナル・コンピューターにクローンされていった。クローンというのは、別のプログラマが、Ultimate Soundtrackerのようなプログラムを書いて、また別の人がさらに書く…というようにして、機能を追加したり、互換性をもたせたりして継承しつつも別のプログラムとなっているということを指している。ポーティング（移植）とか、フォーク（Fork）するとか表現されることもあると思う。
Milkytrackerは、MS-DOS(つまりAmigaではない)で動くTrackerプログラム[FastTracker2](https://en.wikipedia.org/wiki/FastTracker_2 "wiki:FastTracker_2") (1994年リリース[The XM module format description for XM files version $0104.By Mr.H of Triton in 1994.]
(ftp://ftp.modland.com/pub/documents/format%5fdocumentation/FastTracker%202%20v2.04%20%28.xm%29.html "html-file")−1999年開発終了)の[クローンであるらしい](https://milkytracker.titandemo.org/about/ "Milkytracker")。

このことがどうBPMとつながるのか？
それがつながってしまうことが、このわからないさの一因にもなっているのだと思う。

Amigaユーザーに向けてつくられたプログラムであり、その後から派生したTrackerの源流であるUltimate Soundtrackerや、同時期のクローンプログラムで定義された基本的な約束事は、そのプラットフォームで作られるファイルのフォーマットになり、互換性をもたせた後続のプログラムでも継承される。そうすることで、同じファイルフォーマットのファイルが、後発のTrackerプログラムで読み出すことができるわけだ。この基本的な約束事に、BPMの定義も含まれていると思う。

Amigaのプログラムは、Amigaのハードウェアのスペックの事情に則っていて、その後発でAmigaではないハードウェア上で走るTrackerプログラムには、直接は関係しないが、ファイルのフォーマットが決まった時点での約束事（Tracker上でのBPMの定義）はそのまま近い形で流用されることになった。

またこれも現在想像しづらい事実だが、1987年-1995年ぐらいではパーソナル・コンピューターで音を扱うのはゴージャスなことだった。ゴージャスとはなにかというと、今のようにコンピューターの処理速度が高くない、周辺機器の設計も含めその総合環境であるパーソナル・コンピューターで自由に音の信号処理をすることは、魔法のようなことだった。Trackerが受け容れられていった理由の一つには、ハードウェアの割に合わずにゴージャスに音が使えたこと、それに見合わずに低コストであることがあった。もちろん、Trackerにしかできないことがあったから、ということも理由の大きな部分を占めている。現在は、この「Trackerにしかできないこと」をもってして、ユーザーが現在もいるわけだし、こういった経緯については想像できないひとでも興味を持って使い始めたりするわけだ。
例えばChip Tuneに最近関心をもった人なども。※[FamiTracker and tempo](http://www.famitracker.com/wiki/index.php?title=Fxx "FamiTracker_and_tempo")

ずいぶん長くなりそうだね。

付け足すとしたら、MilkyTrackerはPocket PC向けに2005年4月25日にリリースされた[<b>2nd generationのTracker</b>](http://[https://en.wikipedia.org/wiki/Music_tracker#2000s:_Multiple_platforms)であるということ、までが予備知識。
このあとはTrackerでのBPMの計算についての考察。そしてそれは終わっていない。

>A couple of facts:
MilkyTracker is not based on any common module replay. Its core MilkyPlay has been in development since the mid-90s, originally as a Digitrakker .MDL player.
MilkyTracker development started a decade later for the Pocket PC and it still fully operates on rather humble PDAs.
MilkyTracker is and will stay a 2nd generation tracker. There are already several good 3rd generation trackers out there.

引用元：https://milkytracker.titandemo.org/about/


### TrackerのBPMとスピード
Trackerではテンポを表すのに-普通ならば単にBPMとだけ表すべきところだが- 

```
tempo:	5 ticks per row	
Default BPM:　125
```

というように設定されている。
このtempo:　5 ticks per rowの数値を変えても、連動してBPMの数値が上下するわけでもなく、それぞれ単独に数値を設定するようになっている。
ソングの速度は、このBPMが指しているのものなのか、tempoなのか、もしくはこの２つの値が互いに影響し合う三角関係であったりして、設定したBPMではない別のBPMがソングのBPMになっているのか？ということが謎のわけだ。
そこをあえて無視した上で曲をつくっているひとや、それが気になるからTrackerが使えない、もしくはBPMが正常な2nd generation以降のTrackerが無難であるというように感じているひとがいる。それは私だ。
明らかにtempoの数字を変更すると、このBPMとは関係ない速さになることは、誰でもわかることなのだ。BPM なのかtempoなのか、２つあるってオカシイ。それじゃあ、BPMじゃないじゃないのか？

このことは、ここにまさに議題として挙げられている。
「これら件は、よく尋ねられるのでここで説明したい」と

> FAQ: BPM/SPD/Rows/Ticks etc  (Read 19685 times)
>
> FAQ: BPM/SPD/Rows/Ticks etc
> <span style="font-size: 80%"><span style="color: #ff5252">« on: March 07, 2010, 10:48:04 »</span></span>
> Deltafire
> Milkytracker Moderator
> Pie Rehab
>
> People are often asking how these 4 are related, so I thought I'd type up a quick forum post to explain:

引用元：[modarchive.org FAQ: BPM/SPD/Rows/Ticks etc]( https://modarchive.org/forums/index.php?topic=2709.0&fbclid=IwAR1CATz1mgAONei3C_qYKCriX4OalH9xXAxU06e8pyOccWhDANOa5Q1DC8w "modarchive.org FAQ: BPM/SPD/Rows/Ticks etc")


>
昔のAmigaだと、トラッカープログラムはVBL割り込みをタイミングのために使用していました（Vertical BLankは、CRTモニターが画像の描画を終了し、ビーム位置を画面の左上にリセットしている時間です）。ヨーロッパでは、VBL割り込みは事実上50Hzタイマーで安定していました。
>
そのため、プレーヤーの処理はこの50Hzタイマーを使用して、Amigaのサウンドチップ（Paulaという名前）の値（周波数、サンプルアドレス、音量）を更新します。 これは、これらのパラメータを変更できる最短の時間で、「Tick」と呼ばれていました。 Amigaでは、50Hzでtickが発生するため、デュレーションは20msです。
>
これは明らかに曲を再生するには速すぎる（50Hz = 3000bpm！）ので、細分化する必要がありました。 これはSPD（スピード）パラメータが入るところです、これはパターンが次の行に進む前に発生するTick数を制御します。 通常、これは6に設定されています。つまり、パターンのすべての行に対して6 Tickが発生します。 ビート（四分音符の音価）あたりパターン4行を使用すると、これはビート（四分音符）あたり4 X 6 = 24 Tickに相当します。 標準のTick持続時間は20ms（50Hzタイマーの場合）なので、1ビートあたり24 X 20 = 480msで、これを1分あたりのビート数に変換します。
>
60 / 0.480 = 125BPM
>
これは同時に、MilkytrackerのデフォルトのBPM設定です。
>
Amigaトラッカーの最近のバージョンでは、VBLの代わりに<span style="color: #2196f3">AmigaのCIAタイマー割り込み</span>を使用するオプションが追加されました。これは異なる周波数に対してTickのデュレーションを変更することができます。 Tickのデュレーションの長さを変更すると、BPMを125BPMに固定するのではなく、ユーザー定義の値に設定できるようになります。したがって、BPM設定が追加されました。Fasttracker IIマニュアルはそれをこう説明しています：
>
「BPM設定は、音楽プレーヤーが実行する速度（Ticks/秒）を定義します。 125BPM<-> 50Hz　 プレイヤーTicks/秒= BPM * 2/5 」
>
この値をデュレーションに変換するのは簡単です。
Tick デュレーション(ms) = 2500 / BPM。
>
note:
>
ヨーロッパでは、Amigaは50Hzで更新されるPAL TV規格向けに設計されています。 アメリカでは、NTSC規格が60Hzで使用されていました。
>
MilkytrackerはAmigaプレーヤーのように固定タイマー割り込みを使用せず、代わりにxサンプルごとにティック値を更新します（xは同等のタイマー周波数に対応する計算値です）。 タイマー割り込みとサンプル速度の両方の精度により、BPM値は100％正確になることはほとんどありません。通常1BPM未満のエラーがあります。 これはBPMの値を持っている他の音楽ソフトウェアをトラッカーと同時に使うとき問題を引き起こす場合があります。
***
>In ye olde days back on the Amiga, trackers used the VBL interrupt for timing (the Vertical BLank is the time in which a CRT has finished drawing the image and is resetting the beam position back to the top-left of the screen).  In Europe, the VBL interrupt was effectively a nice stable 50Hz timer.  
>  
>
> So, a player routine would use this 50Hz timer to update the values in the Amiga's sound chip (named Paula): frequency, sample address & volume.  This was the shortest amount of time in which these parameters could be modified and was known as a 'tick'.  On the Amiga, a tick occurs at 50Hz and therefore has a duration of 20ms.  
>  
>
> Obviously this is much too fast to playback a song (50Hz = 3000bpm!) so it had to be subdivided.  This is where the SPD (speed) parameter comes in, this controls the number of ticks that occur before the pattern advances to the next row.  Typically this is set to 6, meaning that 6 ticks will occur for every row of a pattern.  Using 4 rows per beat, this equates to 4 X 6 = 24 ticks per beat.  We know that the standard tick duration is 20ms (for a 50Hz timer), so 24 X 20 = 480ms per beat, translating this to Beats Per Minute:  
>  
>60 / 0.480 = 125BPM  
>  
>Which coincidently, is the default BPM setting of Milkytracker :)  
>  
>Later versions of Amiga trackers added an option to use the <span style="color: #2196f3">Amiga's CIA timer</span> interrupt instead of the VBL, this could be programmed to different frequencies enabling the tick duration to be altered.  Altering the tick duration allows the BPM to be set to user defined values instead of being fixed at 125BPM, therefore the BPM setting was added.  The Fasttracker II manual explains it thus:  
>  
>The BPM setting defines how fast (ticks/second) the music player will run. 125 BPM<-> 50 Hz. Number of player ticks/second = BPM*2/5  
>  
>Converting this value to a duration is easy:  Tick duration (ms) = 2500/BPM.  
>  
>Notes:  
>In Europe, Amiga's were designed for the PAL TV standard which updates at 50Hz.  In America, the NTSC standard was used at 60Hz.
>  
>Milkytracker does not use a fixed timer interrupt like the Amiga players do, instead it updates the tick value every x samples (where x is a calculated value that corresponds to the equivalent timer frequency).  Due to the granularity of both timer interrupts and sample speeds, the BPM value is almost never 100% accurate; there is usually an error of <1BPM.  This can cause problems when using trackers with other music software which may have a true BPM setting.  


要するにトラッカーでは、何故かCRTモニターのリフレッシュレート（左上の端から右下の端まで画面描画するタイミング）に合わせて、音を合成するルーチンをハードウェアに送るということが決められたということ。
その理由はいろいろ想像はできるが、だんだん誰も想像がつかなくなっていくだろう。文化と歴史なので。  

BPMをリフレッシュレートで考えると、CRTモニターリのフレッシュレートである50hzを、以下の関係で代入すると  

Hertz = BPM / 60  
BPM = Hertz * 60  

3000ということになるわけ。  
BPM:3000  

速い。Prestissimo 。そこに拍があったとしても、感じとれるひとはごく稀だろう。

でも、音声処理としては手ごろだったのだろう。十分速いので、音の合成には良いタイミングなのかもしれない。

そこで音楽として、BPMを0から300くらいの手ごろさにしようとすると、もうちょっと分割して、BPM125を基準にするのに__Ticks/rowという数値を6に設置した__。これは、__パターンの一行を6Ticksで処理する__ということ。

そうすると、モニターのリフレッシュレートが50hzの仕様の国では、1Tick=20msで4/4として、4分音符をパターン4行として扱かった場合には、

4 X 6 = 24 Ticks

20 ms X  24 Ticks = 480 ms

60 / 0.480 = 125 BPM

で、BPM125となる。わかりますか？
ちょっとフにおちない？
確かにフにおちない。4分音符をパターン4行分にしないしない場合は、また違うな。

後にBPM125以外にセットできるようになったが、これが必ずしも、その意図したBPMにはセットされない。
ランダムに不正確というわけではなくって、Ticks/rowによって、ダイヤルのように離散的にセットされるわけだ。

Fasttrackerでは、
> BPM設定は、音楽プレーヤーが実行する速度（Ticks/秒） 125BPM<-> 50Hz
プレイヤーTicks/秒= BPM * 2/5
>
> Tick デュレーション(ms) = 2500 / BPM

ということにしたというわけ。
50Hzという基準は現在では形骸化したアイコンのような気がする。
いろんなプラットフォームにクローンされたから、もともとモニターリフレッシュレートの50Hzとの紐付けだったが、50Hzという数値が残っているだけではないかと思う。
これは調べていないので、わからないことだが。  
そもそもAmigaのプログラムの時点でも50Hzの場合と60Hzの場合がPALかNTSCの違いであったので（現在もAmigaを使っている場合もある）両者速度が違うわけだが、クローンされたものについては50Hzに統一されたのかどうかまだわからない。

・Amigaがヨーロッパ圏で売られていて、その中でユーザができたこと。
・その中からトラッカーというプログラムが生まれたこと。
・プログラマーがトラッカーの音の処理を映像信号と関連するレートにしたこと。

このことがBPMに関係している。
日本ではPAL信号のシンクジェネレーターを用意している場所というのは非常に限られていて、PALを意識することが殆ど無い、と同時にNTSCのことも意識しない。そのくらい身近でありふれているNTSC 60HZだが、ところ変われば全く異質同じように見えてるものもNTSCジェネレーターが無いところだとまるで機能しない。

というPAL 50Hzが定数になっているのか。

その後にいろんなFasttrackerを踏襲したトラッカーがこのBPMとTicks/rowのルールを継承したり、継承しなかったりしたので、BPMという基盤となる時間概念が、すごく説明しづらいという独特の現状を生んでいる。  

けっこう重要だと思うBPMが、自分の感じているBPMとどうも違うのだから。  

ここにメールのコピーを引用　Amigaの[ProTracker](https://en.wikipedia.org/wiki/ProTracker#Features)について

>Subject: "MOD-info" Text File (MOD File format info)
From: jamal@~~bronze.lcs.mit.edu~~(Jamal Hannah)
<span style="color: #ff5252"><span style="font-size: 80%">Date: Tue, 7 Sep 1993 19:11:24 -0400 (EDT)</span></span>

引用元：[http://umich.edu/~archive/mac/misc/documentation/amigaprotrackermoduleinfo.txt?](http://umich.edu/~archive/mac/misc/documentation/amigaprotrackermoduleinfo.txt?fbclid=IwAR3yIwIk_AurAO6Q-__ijnSp7jruVyGlOwZIva1GJuSde1D3V-MhqSf_vSs)


```
Protracker CIA (Complex Interface Adapter) Timer Tempo Calculations:
***************************************************
Fcolor = 4.43361825 MHz (PAL color carrier frequency)
CPU Clock = Fcolor * 1.6 = 7.0937892 MHz
CIA Clock = Cpu Clock / 10 = 709.37892 kHz
50 Hz Timer = CIA Clock / 50 = 14187.5784
Tempo num. = 50 Hz Timer*125 = 1773447
For NTSC: CPU Clock = 7.1590905 MHz --> Tempo num. = 1789773
To calculate tempo we use the formula: TimerValue = 1773447 / Tempo
The timer is only a word, so the available tempo range is 28-255 (++).
Tempo 125 will give a normal 50 Hz timer (VBlank).
A normal Protracker VBlank song tempo can be calculated as follows:
We want to know the tempo in BPM (Beats Per Minute), or rather quarter-notes per minute. 
Four notes makes up a quarternote.
First find interrupts per minute: 60 seconds * 50 per second = 3000
Divide by interrupts per quarter note = 4 notes * speed
his gives: Tempo = 3000/(4*speed)
simplified: Tempo = 750/speed
For a normal song in speed 6 this formula gives: 750/6 = 125 BPM

Lars "ZAP" Hamre/Amiga Freelancers 1990
``` 


このメールで交わされている話題はAmigaのトラッカープログラムProtrackerのこと。タイムスタイプは1993年。抜粋したのは、”<span style="color: #2196f3">AmigaのCIAタイマー割り込み</span>”についての箇所。VBlankの場合、PALの50HzだとBPM 125はこうやって計算されていると説明している。   
NTSC 60HzだとやっぱりBPM 150になるね。  

60 seconds * 60 per second = 3600
Tempo = 3600/(4*speed)
Tempo = 900/speed
900/6 = 150 BPM

#### Tempo and Ticks/Row: And what's the real speed?  
ここにトラッカープログラムのソングファイルである.MOD / .S3M / .XM / .IT
(.MOD = Protracker Module |.S3M = ScreamTracker 3 Module |.XM = Fasttracker Module |.IT = Impulse Tracker Module)
の形式があるけど、それぞれ曲の速さや長さはどうやって計算されているのか、同じなのか？とプログラマーの質問があがっていて、トピックの最後に投稿された式がある。


>Tempo and Ticks/Row: And what's the real speed?
<span style="font-size: 80%"><span style="color: #ff5252">« on: April 01, 2009, 21:28:29 »</span></span>

引用元：[https://modarchive.org/forums/](https://modarchive.org/forums/index.php?topic=2095.0&fbclid=IwAR34Ssv2kXUGF84oqLwrNVx_h5s9d-ZcRnAsT4HbpEhHzuMovwRJgNgKXgw)

>Well, I coudn't find the formula in the source, but I've tested the program a little bit, viewed what takes how much time, and I think the formula is about like this (time  is in ms, 1000ms=1sec):

```fomula
// Tempo is T
// Ticks/row is M
// Rows/pattern is R
// Total Patterns is P
timepertick = 2500/T;
timeperrow = 2500/T*M;
timeperpattern = 2500/T*M*R;
timeofsong = 2500/T*M*R;
```
>Of course the formulas can only be true is the speed doesn't change during playing. Maybe you should try the formulas out and tell me whether they are actually correct.
« Last Edit: April 23, 2009, 14:02:35 by asmodeus »

やってみたら、それぞれ（どんなファイル形式でも？）Tempo is Tというのを決めて、計算すると曲の長さがでるはずだよ？こうなっているみたいよ？ということらしい。


また、javascriptでFasttracker 2の.xmファイルをTrackerとして読み込むプログラムの開発者は、BPMについてこう解説している。

>Playing Fasttracker 2 .XM files in Javascript
<span style="font-size: 80%"><span style="color: #ff5252">Nov 9, 2015</span></span>

引用元：[Andy Sloane](https://www.a1k0n.net/2015/11/09/javascript-ft2-player.html)

>In .MOD-derived formats, each row of pattern data is played at a certain rate controlled by the speed and BPM which have a sort of tangential relationship to the terms you may be familiar with. speed controls the row speed in ticks, and BPM controls how long ticks are. A tick is defined as 2500/BPM milliseconds.
>
>Typical values are BPM=125 and speed=6, corresponding to 2500/125 = 20ms per tick, or 50 ticks/second; and 50/6 = 8.333 rows per second. If we assume the downbeat happens every four rows then it works out to 125 beats per minute. But if speed is 5 then it’s 150 beats per minute, so we can’t really take the terms at face value.

これは、Tracker上でのBPM値が同じ125あっても、 speed=6･･･つまりTicks/rowが6の場合とTicks/rowが5の場合では、実際のBPMは変わってくるということ。

さっきの式で

```
// Tempo is T
// Ticks/row is M
```

TempoとしているのをTracker上でのBPM値を指していることとして、またspeedとかTicksとか呼称の語彙に揺らぎがあるのをここでMとする。

まず、ではT=125で、M=6の場合を見てみる

timeperrow = 2500/T*M;
2500÷125×6 =120

timeperrow は120msで、4/4のタイムシグネチャーの場合で、4分音符が4行とする場合は

120✕4 = 480 ms
1000msが1秒なので、480 msは、0.48 sec

60 / 0.48 = 125 BPM

これが標準となっている。これは前と同じです。ただ式に当てはめて確かめてみただけ。

では、T=125で、M=5の場合

timeperrow = 2500/125*5;

timeperrow は100msで、4/4のタイムシグネチャーの場合で、4分音符が4行とする場合は

100 × 4 = 400 ms
60 / 0.40 = 150 BPM

とこうなりますよ、ということを説明している。 

では、Mが5のとき実際のBPMを150ではなく、125にしたいとすれば、指定するTはいくつになるか、
timeperrow = 2500/T*M;
で、 timeperrowが120のときBPM125になるので

2500÷T×5 =120
になれば、いいわけだから、
T = 104.166666667

指定するBPM値を104.166666667に、tempoを5にすると、実際の速度はBPM 125になるということ。

####どうしようか
これらは、つくる前に考えるとクリアにしておきたいという点ではあるが、逆につくっているひとには後から問題にしてもいいことなのかもしれない。
Tracker以外のシーケンサーとの連動を考えたときに、BPMが他のシーケンサーと定義が違うとややこしいとか。
つまりは、先に確かなコモンセンスのBPMを決めて、Trackerでつくり始めようとすると考えてからやることになるが、まずつくってからできたもののBPMをわりだすのは、そう難しくはないということ。

引用したfomulaを参考にして、行数が異なるパターンもあることを考慮すると、
すべてのパターンの中の行数をtotal_Rとして

ソングのトータルの長さ = 2500/T*M*total_R

ということになるから、短いパターンをつくった時点で、音声ファイルにレンダリングして、他のビートスライサーで開いてみて、ソングの尺を変えずにビートをカウントしたらBPMが確かめられる。
もしくは、もっと簡単にビートデティクターでビートを計測して割り出すのもいいかもしれない。
同期とは別だけれども、聞こえるビートとしては、すでに音声信号になっている方が人間にとってはコモンセンスがある。

#####実験してみる
簡易テストを思いついたので、実験してみた。
そして、結果を合ってんじゃないか？という予想の式に当てはめて
https://youtu.be/2uDxra6O3VM
Milkytracker 
Time signature 4/4 BPM `value` = 125  

Comparison Spd 6 / Spd 5

check tool :Sonic Visualiser / Vamp plugin Tempo and Beat Tracker 
https://vamp-plugins.org/plugin-doc/q...

Spd 6 ... BPM 126,05
Spd 5 ... BPM 152,00

formula;

Song BPM 152 = 60 / x
x = 0.3947368421052632
The speed of the pattern is 395 ms

T = tempo ... BPM `value` on Milkytracker
M = ticks / row
timepertick = 2500 / T;
timeperrow = 2500 / T * M;

timepertick = 2500 / 125
timepertick = 20 ms

timeperrow = 2500 / 125 * 5;
timeperrow = 100 ms

395ms = timeperrow * 16/4


http://manuke.hateblo.jp/