珈琲焙煎者の観察

地下部屋の珈琲焙煎者

OLD SCHOOL オールドスクール

f:id:honda-satoru:20190412021927j:plain歴史/速度
Rhythm リズムについて、直近での発見を昨日書いた。

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

そのコラムの中でBPMというキーワードが登場して重要な意味を持っているように書かれているのに、TrackerのところではそのBPMはフェ−チャーしていない。曖昧だ。 それまで、「BPMが110で」とか

BPM110でつくったパターンのMIDIデータをMuseScoreで楽譜にしてみたら前半がBPM110、そして後半がBPMが変わっていた。

Rhythm リズム - 珈琲焙煎者の観察

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

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

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

というところで、その先は続き(きっと長くなる)

TrackerのBPMがなんか変だとか、TrackerのBPMが実際のBPMと違うのだけどということは、世界中で多くのひとの心を悩ませている。

と思う。 これは、調べていると、このTrackerのBPMとはなんなのか?というトピックが必ず見かけられる。この質問に答えられる人は限られている。だからハッキリしないのだ。

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

Trackerとは何か?という原点について

それはAmigaというパーソナル・コンピューターの為に1987年にKarsten Obarski *1 によってリリースされたUltimate Soundtracker*2というプログラムを起源として、その後にAmiga以外のパーソナル・コンピューターにクローンされていった。クローンというのは、別のプログラマが、Ultimate Soundtrackerのようなプログラムを書いて、また別の人がさらに書く…というようにして、機能を追加したり、互換性をもたせたりして継承しつつも別のプログラムとなっているということを指している。ポーティング(移植)とか、フォーク(Fork)するとか表現されることもあると思う。 Milkytrackerは、MS-DOS(つまりAmigaではない)で動くTrackerプログラムFastTracker2(1994年リリース*3−1999年開発終了)のクローンであるらしい。*4

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

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

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

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

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

付け足すとしたら、MilkyTrackerはPocket PC向けに2005年4月25日にリリースされた2nd generation *6のTrackerであるということ、までが予備知識。このあとは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.

引用元:MilkyTracker | About

TrackerのBPMとスピード

Trackerではテンポを表すのに、普通ならば単にBPMとだけ表すべきところを、

tempo:   5 ticks per row 
Default BPM: 125

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

このことは、ここにまさに議題として挙げられている。

FAQ: BPM/SPD/Rows/Ticks etc (Read 19685 times)

FAQ: BPM/SPD/Rows/Ticks etc
« on: March 07, 2010, 10:48:04 »
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:

引用元:FAQ: BPM/SPD/Rows/Ticks etc

<日本語翻訳 >


昔のAmigaだと、トラッカープログラムはVBL割り込みをタイミングのために使用していました(Vertical BLankは、CRTモニターが画像の描画を終了し、ビーム位置を画面の左上にリセットしている時間です)。ヨーロッパでは、VBL割り込みは事実上50Hzタイマーで安定していました。

そのため、プレーヤーの処理はこの50Hzタイマーを使用して、Amigaサウンドチップ(Paulaという名前)の値(周波数、サンプルアドレス、音量)を更新します。 これは、これらのパラメータを変更できる最短の時間で、「Tick」と呼ばれていました。 Amigaでは、50Hzでtickが発生するため、1tickの長さは20msです。

これは明らかに曲を再生するには速すぎる(50Hz = 3000bpm!)ので、細分化する必要がありました。 これはSPD(speed)パラメータが入るところです、これはパターンが次の行に進む前に発生する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の代わりにAmigaのCIAタイマー割り込みを使用するオプションが追加されました。これは異なる周波数に対してTickのデュレーションを変更することができます。 Tickのデュレーションの長さを変更すると、BPMを125BPMに固定するのではなく、ユーザー定義の値に設定できるようになります。したがって、BPM設定が追加されました。Fasttracker IIマニュアル*7はそれをこう説明しています:

BPM設定は、音楽プレーヤーが実行する速度(Ticks/秒)を定義します。 125BPM<-> 50Hz  プレイヤーTicks/秒= BPM * 2/5 」

この値をデュレーションに変換するのは簡単です。 Tick デュレーション(ms) = 2500 / BPM

note:

ヨーロッパでは、Amigaは50Hzで更新されるPAL TV規格向けに設計されています。 アメリカでは、NTSC規格が60Hzで使用されていました。

MilkytrackerはAmigaプレーヤーのように固定タイマー割り込みを使用せず、代わりにxサンプルごとにTick値を更新します(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 Amiga's CIA timer 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に固定されていたわけだが、後にBPM125以外にセットできるようになった。でもこれが必ずしも、その意図したBPMにはセットされない。
ランダムに不正確というわけではなくって、Ticks/rowによって、ダイヤルのように離散的にセットされるわけだ。 詳細は、Protrackerの仕様に語られている。それは後で登場する。

Fasttrackerでは、

BPM設定は、音楽プレーヤーが実行する速度(Ticks/秒) 125BPM<-> 50Hz
プレイヤーTicks/秒= BPM * 2/5

Tick デュレーション(ms) = 2500 / BPM

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

  • Amigaがヨーロッパ圏で売られていて、その中でユーザができたこと。

  • その中からトラッカーというプログラムが生まれたこと。

  • プログラマーがトラッカーの音の処理を映像信号と関連するレートにしたこと。

このことがBPMに関係している。   

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

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

ここにメールのコピーを引用 AmigaのProTrackerについて*10

Subject: "MOD-info" Text File (MOD File format info)
From: jamal@bronze.lcs.mit.edu (Jamal Hannah)
Date: Tue, 7 Sep 1993 19:11:24 -0400 (EDT)

引用元: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 Timer125 = 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
This 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*11 のこと。タイムスタイプは1993年。 このセクションを書いているのは、ZAP Lars Hamre*12。 抜粋したのは、”AmigaのCIAタイマー割り込み”についての箇所。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 *13 のモジュールファイル形式があるけど、それぞれ曲の速さや長さはどうやって計算されているのか、同じなのか?というプログラマーの質問があがっていて、トピックの最後にこのプログラマーによって投稿された式がある。

Tempo and Ticks/Row: And what's the real speed?
« on: April 01, 2009, 21:28:29 »
Tempo and Ticks/Row: And what's the real speed?

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):

// 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
Nov 9, 2015

引用元:Playing Fasttracker 2 .XM files in Javascript – a1k0n.net


.MOD派生形式では、パターンデータの各行は、speed値とBPM値によって制御される一定の速度で再生されます。これらの速度は、慣れ親しんだ用語とある種の接線関係にあります。 speed値はTicksで行の速度を制御し、BPM値はTickの長さを制御します。 1Tickとは2500 / BPMミリ秒として定義されます。

典型的な値はBPM = 125とspeed= 6で、これは1Tickあたり2500/125 = 20ミリ秒、または50Ticks/秒に相当します;そして1秒あたり50/6 = 8.333行という速度。 ダウンビートが4行ごとに発生すると仮定すると、1分あたり125ビートになります。 しかし、speed値が5の場合、1分あたり150ビートになりますので、実際にはこの値をそのまま使用することはできません。


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

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

では、Ticks/rowが5の場合 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になるということ。

BPMどうする?

これらは、つくる前に考えるとクリアにしておきたいという点ではあるが、逆につくっているひとには後から問題にしてもいいことなのかもしれない。

Tracker以外のシーケンサーとの連動を考えたときに、BPMが他のシーケンサーと定義が違うとどうしたらいいのか。

つまりは、先に確かなコモンセンスのBPMを決めて、Trackerでつくり始めようとすると考えてからやることになるが、まずつくってから、できたもののBPMをわりだすのは、そう難しくはないということ。

さっき使った計算式を参考にして、行数が異なるパターンも同じソングの中にある場合もあることを考慮すると、 すべてのパターンの中の行数をtotal_Rとして

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

ということになるから、短いパターンをつくった時点で、音声ファイルにレンダリングして、他のビートスライサーで開いてみて、ソングの尺を変えずにビートをカウントしたらBPMが確かめられる。 もしくは、もっと簡単にビートデティクターでビートを計測してわりださせるのもいいかもしれない。

これはやってみるしかない。

さて、オールドスクールのトラッカーでのBPM値は一般的にいわれる「一分間に何回4分音符がでてくるかというBPM」ではなくただ単にパターンの一行の速度をコントロールするプロパティの値ということがわかったので、実際のソングのBPMを110としてMilkytracker で設定する場合は、一行の速度をBPM値もしくは、tick/row で調整する必要がある。つまり目標のBPMにするためにパラメーターとしてBPM値を決める。

BPM値をTとしてもとめる。

パターンの速度 x
110 BPM = 60 / x
0.545 = x
パターンの速度は545ms

timepertick = 2500/T;
timeperrow = 2500/T*M;

一小節16ステップの場合 4分音符は16/4

545ms = timeperrow *16/4   
136.25 = timeperrow  
136.25 = 2500/T*M  

M が5として  
T = 91.7431193  


一小節13ステップの場合4分音符は13/4  
545ms = timeperrow *13/4  
167.692308 = timeperrow  
167.692308 = 2500/T*M  

T = 74.5412843  

16ステップの方を
91.7431193というBPM値にして、
13ステップの方のBPM値を74.5412843にする必要がある。

こらが設定できるならば、16ステップと13ステップのパターンをつなげても、それぞれBPM 110で再生されるので分割数が変わるだけとなる。

*1:BitFellas: Content / Interviews / Obarski, Karsten (00.00.1992) musician

*2:https://www.exotica.org.uk/wiki/Soundtracker_History

*3: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

*4:https://milkytracker.titandemo.org/about/

*5:FamiTracker and tempo http://www.famitracker.com/wiki/index.php?title=Fxx#FamiTracker_and_tempo

*6:https://en.wikipedia.org/wiki/Music_tracker#2000s:_Multiple_platforms

*7:FastTracker v2.08 4.1.1 BPM (Beats per minute):https://milkytracker.titandemo.org/docs/FT2.pdf

*8:FastTracker v2.08 4.1.1 BPM (Beats per minute):https://milkytracker.titandemo.org/docs/FT2.pdf

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

*10:ProTracker - Wikipedia

*11:https://www.exotica.org.uk/wiki/Soundtracker_History

*12:https://www.exotica.org.uk/wiki/Amiga_Freelancers

*13:.MOD = Protracker Module
.S3M = ScreamTracker 3 Module
.XM = Fasttracker Module
.IT = Impulse Tracker Module