(´∀`(⊃*⊂)< 鮭ハラスのあぶり焼き!
北方民族の挨拶
嘘です。適当な事を言いました。ごめんなさい。
今回はMSXでDTMをする人向けの情報になります。
ちょっとだけマニアック。
■強制リズムモードとは
強制リズムモードとは、
OPLLチップだけをリズムモードに切り替えて、
メロディ用MMLでリズム音源を鳴らしてしまう手法です。
BASICだとハイハット/タムだけ鳴らす事が出来なさそうなので、MuSICAなどの音源ドライバをお勧めします。(BASICだとYコマンドの音量指定が無効化される)
■メロディモードとリズムモード
OPLLにはメロディモード(9音)とリズムモード(6音+リズム5音)があります。
リズム音色はリズムモードでのみ鳴らせます。
メロディモード/リズムモードは、
・BASICの場合はCALL MUSICの第一引数が0か1かどうか
・MuSICAの場合はFMR=の後にMMLブロックを書くかどうか
で決まります。
※ OPLLレジスタ側では、
レジスタ14のビット5番(10進数の32)がONならリズムモードです。
MML/ドライバ(CPU)側ではメロディモードのまま、
OPLLだけを強制的にリズムモードに切り替えるのが、
強制リズムモードです。
(命名は適当)
概要としては、
メロディモードで(OPLLレジスタに直接書き込む)Yコマンドを使って
OPLL側だけをリズムモードに切り替えます。
この状態になるとメロディ用MMLでドラムが鳴らせるようになります。
利点
・シンセドラムのような音程制御が容易になる
・リズムモードでは指定ができないSコマンドが使える余韻が伸びる
・リズムモードでは指定ができないQコマンドが使える
メロディ用のMMLが使えるので、
例えばQ1S1C16などとして
バスドラムを鳴らすと余韻が伸びてよく響くバスドラムになります。
(T150以下ならQ1、T151以上ならQ2)
欠点
・わかりにくい、癖がある
・初回発音で問題がある
・タムタムとハイハットの音量指定が面倒(この2つはメロディモードでの音色指定が音量指定代わりになる)
・BASICでは「スネア/ハイハット」や「シンバル/タム」のそれぞれの組み合わせのうち片方だけを完全無音にするのが難しい。無理かも。(MuSICAはできる)
欠点はあるものの、強制メロディモードでしか出せない(出しづらい)音がある為、
強制メロディモードには魅力があります。
(高性能なサウンドドライバならリズムモードでも同様の事は出来るかもしれません。むしろできて。)
■まずはMuSICAのサンプルをご覧ください
FM1 =
FM2 =
FM3 =
FM4 =
FM5 =
FM6 =
FMR =
FM7 =t,fm7,a0,a1,a1,r2,a0,a1,a2,a0,
FM8 =t,fm8,b0,b1,r2,r2,r2,b2,r2,r2,
FM9 =t,fm9,c0,c1,r2,c1,c0,c1,r2,r2,
PSG1=
PSG2=
PSG3=
SCC1=
SCC2=
SCC3=
SCC4=
SCC5=
t=y14,32 ;-- rhythm:ON
t255 r64 ;-- need to initialize bug
t150 m1 l8
; * OPLL inst register's value: ( reg value=@* )
; 0=@user / 1=@2 / 2=@10 / 3=@0 / 4=@3 / 5=@4 / 6=@5 / 7=@6
; 8=@9 / 9=@48 / 10=@24 / 11=@14 / 12=@16 / 13=@23 / 14=@33 / 15=@12
; * OPLL volume register's value: 15=min / 0=max
; * MML volume register's value: 0=min / 15=max
; * PSG volume register's value: 0=min / 15=max
fm7=v15@12 y54,240 q1s1 ;y54,@*16+v : v=bass
fm8=v13@12 y55,242 q1s1 ;y55,@*16+v : v=snare : @=hihut
fm9=v0@64 y56,15 q8s1 ;y56,@*16+v : v=cinbal : @=tom
r2=r2
;-- ch.7: bass drum
a0=;o3>ec<gc
o3>(e64<<p24)e16..p>>(c64<<p24)c16..p>><p(g64<p12)g16..p>(c64<p12)c16..p>
a2=o3l64>(edc<bagf)e>(c<bagfed)c><(gfedc<ba)g>(c<bagfed)c>l8
a1=o3>(e64<<p24)e32.p>>(e64<<p24)e32.p>>(c64<<p24)c16..p>><p(g64<p12)g16..p>(c64<p12)c16..p>
a2=o2>(e64<<p24)e16..p>>(c64<<p24)c16..p>><p(g64<p12)g16..p>(c64<p12)c16..p>
;-- ch.8: snare / hi-hut
b2=;o3y55,15b16b16y55,242co8y55,15co3y55,242<c>
o4y55,15(b64p24<<)b32.p>>(b64p24<<)b32.p>>y55,15(c64<<p24)c16..p>>o3y55,242(g64<p24)g16..p>y55,242(c64<p24)c16..p>
b0=o3>(e64<<p24)e16..p>>(c64<<p24)c16..p>><p(g64<p12)g16..p>(c64<p12)c16..p>
b1=o2>(e64<<p24)e16..p>>(c64<<p24)c16..p>><p(g64<p12)g16..p>(c64<p12)c16..p>
;-- ch.9: cinbal / tom-tom
c0=;o1>ec<gc
o1>(e64<p24)e16..p>(c64<p12)c16..p(g64p6)c16..p(c64p6)c-16..p>
c1=o1>(e64<p24)e32.p>(e64<p24)e32.p>(c64<p12)c16..p(g64p6)c16..p(c64p6)c-16..p>
c2=o3y56,240(c64<<p24)c16..p> y56,15 rrr
■解説
MML側はメロディモードのままですが、
”y14,32”のところでOPLL側だけをリズムモードに切り替えます。
t=y14,32 ;-- OPLL側をリズムモードにする
t255 r64 ;-- y14,32の直後に発音すると音がおかしくなるので休符を入れる
t150 m1 l8
YコマンドはOPLLレジスタに直接値を書き込むコマンドです。
OPLLレジスタのビット5を1にするとリズムモードになります。
(ビット5は10進数でいうと2の5乗=32です)
■ OPLLアプリケーションマニュアルより レジスタ1416進数で$0Eの説明抜粋
3-1-5 $0E RHYTHM
リズムのモード選択と各リズム楽器のON/OFFをコントロールします。
D7 D6 D5 D4 D3 D2 D1 D0 - - RHYTHM BD SD TOM TOP-CY HH
リズムモードの正式な利用方法はメロディモードと異なります。
・チャンネル7~9の音程レジスタをノートオンで固定
・OPLLレジスタ14のビット0~4で各リズム音の発音をON/OFF制御
・OPLLレジスタ14のビット5は1で固定
強制リズムモードではMML/ドライバ(CPU)側はメロディモードなので、
・レジスタ14のビット0~4は0OFFで固定
・チャンネル7~9の音程レジスタのノートオン/オフを制御
という操作になります。
つまり、メロディモードのままOPLLチップ側だけを強制リズムモードにした場合、
本来の仕様とは違う操作で音が鳴ることになります。
そのため強制リズムモードでは、初回発音時には変な音が出てしまいます。
これは仕様外の動作をさせている以上、仕方のない事なので、
最初に休符強制ノートオフや音量0での発声を挟むことで異音を抑制します。
(例:”y14,32”のあとの”t255 r64”など)
■強制リズムモードでの音量制御
OPLL側がリズムモードになっている場合、
ハイハットとタムタムはメロディモード時の音色指定部分が音量指定になります。
強制リズム音モードの場合の音量指定はそれぞれ
■チャンネル7
Vコマンド=バスドラムの音量
OPLLレジスタ54:下位4ビット=バスドラムの音量
■チャンネル8
Vコマンド=スネアドラムの音量
@コマンド=ハイハットの音量
OPLLレジスタ55:下位4ビット=スネアドラムの音量
OPLLレジスタ55:上位4ビット=ハイハットの音量
■チャンネル9
Vコマンド=シンバルの音量
@コマンド=タムタムの音量
OPLLレジスタ56:下位4ビット=シンバルの音量
OPLLレジスタ56:上位4ビット=タムタムの音量
となります。
ちなみにBASICではなかなか面倒な問題があります。
BASICでの強制リズムモード:音量制御の問題
・Vコマンドで無音にできない(結構聞こえる)
・YコマンドでVコマンドの代用が出来ない(Vコマンドの値が常に書きこまれる)
・ただし@コマンドで音量指定するハイハット、タムタムはYコマンドが使える
↓
・スネアを鳴らさずにハイハットだけ鳴らすことができない
・シンバルを鳴らさずにタムタムだけ鳴らすことができない
↓
・ハイハットを鳴らさずにスネアだけ鳴らすことは出来る
・タムタムを鳴らさずにシンバルだけ鳴らすことは出来る
という感じで癖が強い
MuSICAでは上記の制限(問題)はありません。
少なくともBASICよりはマシかと思います。
■@コマンドでの音量指定について
@コマンドが音量制御になるハイハットとタムタムですが、
OPLLレジスタ直接書き込み時と同様で、
MMLのVコマンドとは逆に0が最大、15が最小となります。
さらに、
MMLの@コマンドの値とOPLLレジスタに書き込まれる値は一致しません。
変換が必要になります。
■ OPLLレジスタの値MMLの@の値 対応表
OPLLレジスタの値:MMLの@の値
0:@n ユーザー定義音色 → 音量最大
1:@2 バイオリン
2:@10 ギター
3:@0 ピアノ
4:@3 フルート
5:@4 クラリネット
6:@5 オーボエ
7:@6 トランペット
8:@9 オルガン
9:@48 ホルン
10:@24 シンセ
11:@16 ハープシコード
12:@16 ビブラフォン
13:@23 シンセベース
14:@33 ウッドベース
15:@12 エレキギター → 音量最小
@コマンドの場合、
@12のエレキギターがV0相当、
@2でV14相当、
@ユーザー定義音色でV15相当です。
ただ、ユーザー定義音色を指定すると他のチャンネルのユーザー定義音色に影響が出るので、演奏にユーザー定義音色を使いたいならお勧めできません。
■ Yコマンドでのリズム音量制御
他に、Yコマンドで音量制御する方法もあります。
Yコマンドの場合、OPLLレジスタへの直接書き込みなので、
MMLのVコマンドとは逆に0が最大、15が最小となります。
注意点として、
Yコマンドで音量を操作した後で、
Vコマンドと@コマンドのどちらかを使うと、Vコマンドと@コマンドの両方の値がレジスタに書き込まれます。(Yコマンドの指定をまるごと上書きします)
ですので、
Yコマンドで音量制御する場合はずっとYコマンドでのみ音量制御をする必要があります。
ハイハット、タムタムを音量最大で鳴らしたい場合は
@コマンドではユーザー定義音色を指定しないといけないので
代用としてYコマンドを使う感じでしょうか。
また、先に書きましたが、
BASICではYコマンドでの音量制御は無効のようです。
Vコマンドを使わなくても常に上書きしてる気配。
残念です。
Yコマンドでの音量指定例:
■レジスタ54:バスドラム音量
y54,**
**は、バスドラム音量0~15
例) y54,0 → バスドラムV15相当 → v15相当
■レジスタ55:スネアドラムハイハット音量
y55,**
**は、(スネアドラム音量0~15)+(ハイハット0~15×16)
例)y55,240 → スネアV15、ハイハットV0相当 → V15@12相当
■レジスタ56:シンバルタムタム音量
y56,**
**は、(シンバル音量0~15)+(タムタム音量0~15×16)
例)y56,15 → シンバルV0、タムタムV15相当 → V0@64相当
※(ここでの音量は0で最大、15で最小・無音)です
こんな感じで非常に癖が強いですが、サンプルを聴いて魅力を感じた方はお試しください。
大体の利用目的は、
バスドラムの伸びを良くしたり、シンセドラムっぽい音を出すためなので、
他の方法で実現できるのであればそちらの方が良いかもしれません。
参考資料
■OPLLアプリケーションマニュアルより音量/音色レジスタの説明抜粋
3-1-8 $30$38 INSTRUMENT/VOLUME
音色(ROM15音色、オリジナル音色)、音量を決めるデータを設定します。
D7 D6 D5 D4 D3 D2 D1 D0 INST VOL
D7-D4 (INST)
この4ビットで以下の音色が決定されます。
INST 音色 INST 音色 0 オリジナル音色 8 オルガン 1 バイオリン 9 ホルン 2 ギター A シンセ 3 ピアノ B ハープシコード 4 フルート C ビブラフォン 5 クラリネット D シンセベース 6 オーボエ E ウッドベース 7 トランペット F エレキギター
D3-D0 (VOL)
各音色の音量を決めます。最小分解能は3dBで、最大45dBまで音量を絞り込めます。
D3 D2 D1 D0 -24dB -12dB -6dB -3dB
リズムモード(Addr=$0E、D5=「1」)時は、$36~$38は次のように各リズムのボリュームを設定できます。
D7 D6 D5 D4 D3 D2 D1 D0 $36 - BD $37 HH SD $38 TOM CY
YM2413アプリケーションマニュアル
http://d4.princess.ne.jp/msx/datas/OPLL/YM2413AP.html
※ ある程度直してあるようですが、一部間違いがあるので注意