はじめに
80年代懐かしのOPL音源YM3526や、その派生Y8950やYM3812などには、 NOTESELという機能があります。
レジスタ $08
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
CSM | NOTESEL |
このNOTESELという機能、仕様書ではそこそこの量の解説が書かれています。しかし、仕様書に大幅な記述ミスがあるうえ、機能の意図もユースケースも書かれていないため、読んでもなかなか意味が分かりません。このNOTESELは何のためにあるのでしょうか?どのように使うのでしょうか?
Y8950の仕様書で確認
以下は、Y8950のアプリケーションマニュアルからの引用です。
3-1-7. CSM/KEYBOARD-SPLIT/SAMPLE/DA-AD/64K/ROM: ADDRESS[$08]
This address is used to specify the compsite sinusoidal modeling mode, AD/DA conersion, and type of external memory....
D6 (NOTESEL): This bit is used to specify the separating points for keyboard splits in one octave.
When this bit is set to "0", the separating points are specified by the second bits from F-Number MSB;
when this bit is set to "0", the separating points are specified by the F-Number MSB.
Tables below show the setting conditions. (Also refer to "F-Number/BLOCK".)D6 = "0"
0 1 2 3 4 5 6 7 Octave 0 1 2 3 4 5 6 7 Block data 1 1 1 1 1 1 1 1 F-Num•MSB 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 F-Num•2nd 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Keyboard split No. D6 = "1"
* DON'T CARE
0 1 2 3 4 5 6 7 Octave 0 1 2 3 4 5 6 7 Blockdata 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 F-Num•MSB * * * * * * * * * * * * * * * * F-Num•2nd 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Keyboard split No.
この仕様書は以下の点が間違っています。
- 説明文中で "1" が "0" になってしまっている箇所がある。
- D6="0" と D6="1" の表が逆転している。
- "Key Scale No." と書くべき場所が "Keyboard Split No." になってしまっている。
「KEYBOARD SPLIT」という単語はY8950の外部キーボードI/Fを連想させますが、NOTESELと外部キーボードは一切関係がありません。
NOTESELの機能
OPLには、レートキースケーリングという、発音する音の高さに比例して、エンベロープの速度(レート)を変化させる機能があります。NOTESELは、レートキースケーリングによるエンベロープ速度の変化が、1オクターブ内のどの位置で起こるかを制御します。
具体的には、OPLの入力クロックが定格3.58MHz、A=440Hzを前提とした場合、
- NOTESELが"0"の場合、ノートF#とGの間で、エンベロープの速度が変わります。
- NOTESELが"1"の場合、ノートC#とDの間で、エンベロープの速度が変わります。
なお、オクターブが変わった場合は、NOTESELの値に関わらずエンベロープ速度の変化が起こります。
なぜ、NOTESELが必要なのか?
OPLの内部的には、レートキースケーリングによるエンベロープ速度の変化は0から15の16段階あります。この16段階は8オクターブに均等にマッピング、言い換えると、1/2オクターブ毎にエンベロープの速度が変わるように設定できます。ただし、1/2オクターブの基準点は、F-Numberテーブル(1オクターブ分の音階に対する周波数レジスタの設定テーブル)の内容によって変わります。そこで、補正が必要です。この補正を制御するのがNOTESELです。
具体的には
- C#基準のF-Numberテーブル(後述の表A)を利用した場合はNOTESEL=0に
- G基準のF-Numberテーブル(後述の表B)を利用した場合はNOTESEL=1に
それぞれ設定することが設計者の意図と思われます。NOTESELという用語は、おそらく「音階(ノート)テーブルの選択」といった意味合いではないかと推測されます。
F-Numberとレートキースケーリング
レートキースケーリングによるエンベロープ速度の変化は、F-Numberの値に比例して細かく変わるわけではありません。オクターブと、F-Numberの上位ビット2ビットのみが影響します。
NOTESELが0の場合、OPLの内部では、オクターブと、F-NumberのMSB(最上位1ビット)から、キースケール番号が次の表に従って決まります。キースケール番号はレートキースケーリングの効果を表す値で、0〜15の16段階あります。値が大きいほど、エンベロープの速度が速くなります。
NOTESEL=0の場合のキースケール番号
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | Octave | ||||||||
0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | F-Number MSB |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | キースケール番号 |
F-NumberのMSBにどういう意味があるかは、F-Numberのテーブルを見ると分かります。次はY8950の仕様書の3-1-8から引用した、C#を基準とした1オクターブ分のF-Numberテーブルです。
表A. C#基準のF-Numberテーブル
音階 | 周波数 (4oct) |
F-Number | ||||||||||
D9 | D8 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |||
C# | 277.2 | 363 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
D | 293.7 | 385 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
D# | 311.1 | 408 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
E | 329.6 | 432 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
F | 349.2 | 458 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
F# | 370.0 | 485 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 |
G | 392.0 | 514 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
G# | 415.3 | 544 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
A | 440.0 | 577 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
A# | 466.2 | 611 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
B | 493.9 | 647 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
C | 523.3 | 686 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 |
このF-Numberテーブルでは、C#〜F#はF-NumberのMSB(D9)が0、からG〜CはF-NumberのMSB(D9)が1になっています。したがって、先ほどのキースケール番号の表と合わせると、1オクターブ内のキースケール番号はF#とGの間で変わることになります。キーボード上で表現してみると、各音階とキースケール番号の対応は、次の図のようになります(オクターブ3から5を抜粋したものです。色が変わっている部分でキースケール番号が変化しています)。
各ノートのキースケール番号: C#基準のF-NumberテーブルかつNOTESEL=0の場合
仕様書のNOTESELの説明「This bit is used to specify the separating points for keyboard splits in one octave.(訳:このビットは1オクターブ内のキーボードスプリットの分割点を指定するために使います。)」は、この図のようなキーボードとオクターブ分割をイメージしながら書かれたものではないかと想像します。
もう1つのF-Numberテーブル
ところで、OPLのF-Numberテーブルはもう一つ作り方があります。F-Numberのビット幅を10bit最大まで生かし、周波数指定の精度を上げたテーブルです。以下はY8950の仕様書からの引用で、Gを基準とした1オクターブ分のF-Numberテーブルです。
表B. G基準のF-Numberテーブル
音階 | 周波数 (4oct) |
F-Number | ||||||||||
D9 | D8 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |||
G | 392.0 | 514 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
G# | 415.3 | 544 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
A | 440.0 | 577 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
A# | 466.2 | 611 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
B | 493.9 | 647 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
C | 523.3 | 686 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 |
C# | 554.4 | 727 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 |
D | 587.3 | 770 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
D# | 622.2 | 816 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
E | 659.3 | 864 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
F | 698.5 | 916 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 |
F# | 740.0 | 970 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
このテーブルは、F-Numberの MSB(D9)がすべて1です。NOTESEL=0の状態で、表Bのテーブルを使った場合、各ノートのキースケール番号は次のようになります。
各ノートのキースケール番号: G基準のF-NumberテーブルかつNOTESEL=0の場合
オクターブが変わるとキースケールが2づつ変化してしまっており、1オクターブ内ではキースケール番号が変化しません。
NOTESELの効果
ここで、NOTESELを1に設定すると、キースケール番号の計算は、F-NumberのMSBではなく、上位2ビット目(D8)を基準にしたものに変わります。
NOTESEL=1におけるキースケール番号
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | Octave | ||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | F-Number MSB (D9) | ||||||||
0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | F-Number 2nd (D8) |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | キースケール番号 |
表BのF-Numberでは、ノートD#とDの間でF-Numberの上位2ビット目(D8)が0から1に変わります。したがって、NOTESEL=1の場合にの各ノートのキースケール番号は次の図のとおりとなります。
各ノートのキースケール番号: G基準のF-NumberテーブルかつNOTESEL=1の場合
補足: キースケール番号の変化点が、1/2オクターブびったり(6音)ではなく半音ずれています。かといってF-Numberテーブルを半音ずらしてG#を基準に作ることはできません。F-Numberが10bitsを超えてしまうためです。回路を複雑にしないため、ここで変化点が半音ずれてしまうことは妥協されているのではないかと思います。
仕様書に書かれていないケース
仕様書には、NOTESEL=1 で F-NumberのMSBが0だった場合のキースケーリング番号の計算式が掲載されていません。著者の調査では、MSBが0のときは上位2ビット目が0だった時と同じです。表にすると以下のとおりです。
NOTESEL=1で F-Number MSBが0の場合のキースケーリング
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | Octave | ||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | F-Number MSB (D9) | ||||||||
* | * | * | * | * | * | * | * | * | * | * | * | * | * | * | * | F-Number 2nd (D8) |
0 | 0 | 2 | 2 | 4 | 4 | 6 | 6 | 8 | 8 | 10 | 10 | 12 | 12 | 14 | 14 | キーススケール番号 |
設計者の想定外の使い方とは思いますが、もし表AのF-Numberテーブルを使った状態で、NOTESEL=1に設定すると、各ノートのキースケール番号は次のようになるでしょう。
各ノートのキースケール番号:C#基準のF-NumberテーブルかつNOTESEL=1の場合
付録: 他の仕様書
YM3812 (OPL2) の仕様書
Y8950と比べると、$08 レジスタ全体の説明文と、NOTESELビットの説明文が変わっています。
以下に YM3812 の仕様書の当該箇所を引用します。
3-1-3 CSM Mode/Keyboard Split: Address ($08)
This register sets the mode to the music mode or speech synthesize mode, and determines the keyboard split for keyboard scaling of rate....
D6 (NOTESEL): This bit controls the split point of the keyboard. When "0", the keyboard split is the second bit from the most siginificant bit (MSB) of the F-Number. The MSB of the F-Number is controlled when "1". This is illustrated below.
...
Y8950と比べると翻訳がおかしいのかさらに意味が分からなくなっていますが、「keyboard split for keyboard scaling of rate」という表記があり、どうやらキースケールに関係しそうな機能だということは分かるようになっています。Y8950と比べると外部キーボードI/Fが存在しないので、こちらは外部キーボードと誤解することはなさそうですが、一読してここから機能と意図を理解するのは困難です。
また、Y8950と同様に、以下の点が誤ったままです。
- D6="0" と D6="1" の表が逆転している。
- "Key Scaling No." が "Keyboard split number" になっている。
YMF262 (OPL3) の仕様書
かなり単純な記述になっています。
NTS (NOTE SEL) Keyboard split selection
Select the keyboard split method to determine the key scale number.
キースケール番号の表は、「Keyboard split number」がついに「Key scale No.」に修正されています。表の内容はOPL2と同じように見えますが、著者はOPL3の実物を確認していないため、この仕様書が正しいのか間違いなのかは不明です。
YMF278B (OPL4) の仕様書
「keyboard split」 の意味が説明され、ようやく設計意図が(考えれば)分かる感じになりました。
08H KEYBOARD SPLIT SELECTION
Eight octaves are split into a total of 16 and rate key scaling is performed by splitting one octave in half.
This octave splitting is called "keyboard split".
NTS determines the keyboard split separation point.
When NTS is set to "0", the separation point is determined by the higher two bits of the F number.
When NTS is set to "1", the separation point is determined byt the MSB of the F number.
キースケール番号の表はOPL3と同じに見えますが、実OPL4と比較して正しいのか誤りなのかは確認していません。