音源ドライバコマンド一覧

コマンドの詳細

外部コマンド・コンパイル・演奏開始・演奏停止

MML入力

エラーメッセージ一覧

更新情報

いろいろ


かなりアバウトなマニュアルですが、無いよりはマシということで。(爆)

このドライバの詳細資料

ソースリスト Driver (HIT-88用)

ソースリスト Compiler (HIT-88用)



音源ドライバ コマンド一覧

*アルファベットの大文字・小文字の区別はない
*nは指定可能な数値をあらわす(数値は10進数のみ)

An
Bn
Cn
Dn
En
Fn
Gn
音符
nは1,2,3,4,6,8,12,16,24,32,48,96
In 変数nをワークエリア(&HF60D)に書き込む。(0〜255)
J 演奏データが最終まできたらこの地点まで戻る。
K 転調の有効/無効スイッチ。
Ln 音長設定。nは音長に準ずる。
Mn1,n2,n3,n4 ビブラート。またビブラートのマスクは自動的に解除される。
n1...ウェイト(0〜255)
n2...スピード(1〜255)
n3...振幅回数(0〜127)0のときはビブラートにならない。
n4...増減値(-127〜127)0のときはビブラート強制的にマスクされる。
N ビブラート効果の有効/無効スイッチ
On オクターブ(1〜8)
Pn
(*2)
ノイズモード設定(1〜3)
1...トーン
2...ノイズ
3...トーン+ノイズ
Qn ゲートタイム(0〜255)
Rn 休符。nは音長に準ずる。
Sn1,n2,n3,n4,n5
(*2)
ソフトウェアエンベロープ
n1...音量幅(-15〜15)0のときは解除、以後のパラメータ不要。
n2...カウンタ(1〜255)
n3...増減値(-15〜15)
n4...2nd音量幅(-15〜15)
n5...2ndカウンタ(-127〜127)
S0
(*2)
ソフトウェアエンベロープの解除。
BASICのPLAY文と同じ音が出ます。
Tn1,n2 テンポ。ウェイト値を直接設定する。
n1...96分音符のカウント値。(1〜255)
n2...I/OPort&HF6の値(できるだけ3で固定)(0〜255)
U%n デチューン(-127〜127)
周波数を微調整する。
U+n
U-n
デチューンの相対変化(-127〜127)
前回指定デチューン値を加減させる。
Vn ボリューム(0〜15)
FM音源チャネルのみ(64〜127)(*1)
Wn
W+n
W-n
(*2)
ノイズ周波数(0〜31)
+/-をつけると今の周波数に加減算した値が与えられる。
Yn1,n2 YM-2203のレジスタ(n1)にn2を送る。
Zn1,n2 I/Oportに直接データを送る。OUT n1,n2と同様。
@n
(*1)
FM音色を選択する。(0〜254)
. 音長を1.5倍にする。2つ並べると1.75倍、3つだと1.875倍になる。
必ず音長の後につけること。
> オクターブを上げる。
< オクターブを下げる。
+ 半音上げる。
# 半音上げる。
- 半音下げる。
(n ボリュームをn上げる。n省略で1つ上げる。(1〜15)
)n ボリュームをn下げる。n省略で1つ下げる。(1〜15)
& タイ。次の音とつなげる。
^ 音長の合算
%n 音長直接指定(1〜255)96で全音符。
[ ネスト開始。4重まで重ねられる。
]n ネスト終了。nの値の回数ループする。(2〜255)
: ネスト脱出。最終ループカウント時にネストを抜ける。
; コメント。その行の以降の文はコンパイルされない。
_n 転調(-12〜12)


"A FMチャネル1
"B FMチャネル2
"C FMチャネル3
"D PSGチャネル1
"E PSGチャネル2
"F PSGチャネル3
"X コンパイル制御。"Xで囲まれた行はコンパイルしない。


(*1) FM音源専用コマンド
(*2) PSG音源専用コマンド


コマンドの詳細


・音符
説明するより例をあげて解説したほうが早いので下にいくつか例示します。

「c4」は、ドの4分音符
「f+8」は、ファ#の8分音符
「b-16.」は、シ♭の符点16分音符

音符のあとに使えるコマンドには以下のものがあります。

・音長直接指定「%」
「c%96」は、ドの全音符です。「%」は音長を直接指定するコマンドで
「c%1」は、ドの96分音符を意味します。
5連符や7連符などの通常の音符にない音長を指定したいときに使います。
4分音符を5連符させたいときは、(96÷4)÷5=4あまり4と計算して
「c%5 c%5 c%5 c%5 c%4」というようになります。
あまり正確ではありませんが・・・。(爆)

・タイ「&」
「c8&d8&e8」は、ドからミまでタイでつながっていることを意味します。
タイでつながっている間はビブラートやソフトウェアエンベロープはリセットされません。
・・・これは実際に使ってみて聴いたほうがわかりやすいかと思います。(笑)

・音長合算「^」
「c2^4^8^16」は、「c2...」と同じになります。
また、「c1^-16」でも同じことになります。引き算もできます。
「c1^%-4^-8.^%18^48」でも同じことになりますが、
わかりにくくなるだけなのであまり複雑にしないほうがいいでしょう。


・音長設定
「L4cdefg」は、4分音符でドレミファソを意味します。
「L16cgegL8cafaL4cgeg」とすると・・・、聴いて確かめれば一発でわかります。(笑)
これには音調合算「^」を使うことはできません。符点「.」や直接音調指定「%」は使えます。


転調
転調で指定された数値は前回指定された数値に加減されます。
「[ c _1]12 c」とした場合、「cc+dd+eff+gg+aa+b>c」と演奏されます。
「_0」とすることで、転調の値がリセットされます。
転調によってオクターブが範囲外(o1cより低く、o8bより高い音符)になったときは
すべてo1cとなります。注意してください。


・ビブラート
ビブラートとは、「音を振動させること」なのですが、
ではどういうことなのか?と説明するよりも聴いたほうがわかりやすいので
実際にどういう動きになるのか耳で確認しながらパラメータの内容を理解してください。

"D M0,1,0,0 c1^1

これは初期状態です。ビブラートをオフと同じです。

"D M0,1,6,2 c1^1

ビブラートがかかるとこんな音がでます。
ここからパラメータの意味をひとつずつ説明していきます。

"D M48,1,6,2 c1^1

第1パラメータを0から48に変更しました。
ビブラートのかかるタイミングが遅くなったことが確認できるはずです。
数値が大きくなるほどタイミングがさらに遅くなります。

"D M48,4,6,2 c1^1
第2パラメータを1から4に変更しました。
音の揺れる速さがゆっくりになったことが確認できるはずです。
数値が大きくなるほど揺れの速さが遅くなります。
ここは通常1で固定しておくことをおすすめします。

ではいったん第2パラメータ4から1に戻して

"D M48,1,6,6 c1^1

第4パラメータを2から6に変更しました。
音の揺れ幅が大きくなったが確認できるはずです。
数値が大きくなるほど揺れ幅が大きくなります。

また、いったん第4パラメータを6から2に戻して

"D M48,1,12,2 c1^1

第3パラメータを6から12に変更しました。
音の揺れの速さが遅くなり、また揺れ幅も大きくなったことが確認できるはずです。
ここでは振幅回数のあらわしていて、ここの数値が大きくなるほど
揺れが遅くなり、また揺れ幅も大きくなります。

では第3パラメータを0にするとどうなるでしょうか?

"D M48,1,0,2 c1^1

音が揺れずに、高くなる一方になったことが確認できるはずです。
振幅回数を0にすると音が振動(ビブラート)しなくなります。

では第4パラメータを2から-2にすると

"D M48,1,0,-2 c1^1

音が低くなる一方になったことが確認できるはずです。

では第4パラメータを0にするどうなるかというと

"D M48,1,0,0 c1^1

まったくビブラートがかからなくなります。
第4パラメータを0にするとビブラート効果がなくなります。
ただ、ビブラート効果を有効/無効にするコマンドがあるので
一時的にビブラートをオフしたいときはこちらを使います。

"D M48,1,6,2 c1^1 N d1^1 N e1^1 N f1^1 M0,1,0,-16 g1^1

「N」コマンドを指定するたびに、ビブラート効果の有効/無効が切り替わります。
新たに「M」コマンドでビブラートを指定すると「N」コマンドのスイッチは自動的に有効に切り替わります。

テンポを変更すると揺れの速さも変わります。いや、変わってしまいます。(爆)

"D T3,3 M48,1,6,2 c1^1 T10,3 d1^1

テンポに合わせて揺れの速さを自分で調節しましょう。(笑)


・ソフトウェアエンベロープ
音量が周期的に変化するもの・・・とPC6001のマニュアルにありますが、
実用的な音を出すために特化させてます。
ビブラート同様、実際にどういう動きになるのか耳で確認しながらパラメータの内容を理解してください。

"D S0 c1^1

初期状態です。なんの音量変化もありません。

"D S-4,2,-1,0,0 v14 c1^1

ちょっとわかりにくいかもしれませんが、
96分音符単位でのボリュームの変化を数値であらわすと以下のようになります。

14→14→13→13→12→12→11→11→10→10→10→10・・・(以降すべて10)

第1パラメータは音量変化の全体幅をあらわします。
-4ですから、はじめのv14からv10に変化することを意味します。

第2パラメータは音量変化する際のカウンタを意味します。
2ですから96分音符2つ経過してカウンタアップすると音量が変化することを意味します。

第3パラメータは音量変化の量をあらわします。
-1ですからカウンタアップ時に音量が-1されます。

"D S4,4,1,0,0 v10 c1^1

こうすると音量が増えていく変化になります。
v10から第1パラメータの値、音量が増加してv14になります。

"D S4,4,1,-2,0 v10 c1^1

第4、5パラメータは第3パラメータまでの音量変化が終わったあとに使用されます。
第4パラメータは音量増減値で、第3パラメータ終了時にはv14になっているので
-2を指定することで音量が2減少して、v12になります。

"D S4,4,1,-2,-24 v10 c1^1

第5パラメータはちょっと特殊です。
符号が音量の増減をあらわし、絶対値(符号を無視した数値)がカウンタを意味します。
-24の場合は、24のカウンタアップ後、音量が1下がることになります。


外部コマンド・コンパイル・演奏開始・演奏停止など

・コンパイル
作成したデータをコンパイルします。
正常終了時にはCompleted!と表示され、
Object以降に変換されたオブジェクトデータのアドレスが表示されます。
エラーが発生した場合はエラーの内容とエラーが発生した行番号が表示されます。
エラーメッセージの詳細な内容については「エラーメッセージ一覧」の項目にあります。

EXEC &HD800

これでコンパイルします。
演奏中にコンパイルを開始した場合は自動的に演奏が停止されます。


・演奏開始
コンパイラで作成したオブジェクトをもとに演奏をはじめます。
コンパイルでエラーが発生した場合は演奏されません。

EXEC &HE800

これで演奏開始します。同時に音源ドライバも常駐します。
暴走に一番近いコマンドなので使用にはそれなりの注意と覚悟(爆)が必要です。


・演奏停止
演奏を停止します。同時に音源ドライバも解放しますので、カーソルが点滅するようになります。

EXEC &HE803

これで演奏停止します。


・フェード
全体ボリュームを変更します。
演奏中に実行するとn値分、ボリュームが下がります。

POKE &HF60F,n:EXEC &HE806

nの値は(0〜15)、0で元の状態に戻ります。
15を与えれば無音状態になりますが(なるはず・・・(爆))、音源ドライバは常駐したままなので
完全に演奏を止めたい場合は「演奏停止」で停止させてください。

・フェードアウト
序々にボリュームを下げて、最後は無音になります。
一度実行すると変更できません。
このコマンドを使用しても音源ドライバは解放されないのでご注意を・・・。

POKE &HF60E,n:EXEC &HE809

nの値は(1〜255)、数字が小さいほどすぐにボリュームが下がります。


・ドライバからの変数受け取り
外部コマンドとは少し違いますが、
MML内のIコマンドで与えられた値をここでチェックします。
演奏と同期をとりたいときなどに使います。

A=PEEK(&HF60D)

変数Aに値が入っています。


・PSG効果音割り込み用マスクの方法
POKE&hF601,n (nの値はPSGch1=1,PSGch2=2,PSGch3=4)
でマスクをかけることができます。
マスクするだけの機能しかありませんので、
効果音を出す手順について簡単ですが順番に説明します。

ex.PSGch3を使って効果音を出す。

1.POKE&HF601,4:SOUND 8,0
(割り込みマスクをかけ、同時にPSGch3の音量を0にする。)

2.SOUND 5,0:SOUND 7,56:SOUND 8,12:FOR I=0 TO 255:SOUND 4,I:NEXT:SOUND 8,0
(落下音のような効果音を出し、終わったら音量を0にする。)

3.POKE&HF601,0
(割り込みマスクを解除する。)

サウンドレジスタ6,7は0F604HにReg6、0F605HにReg7がマスクされている間にも空送りされています。
これを復帰させるには割り込みマスク解除直前に必要に応じて下のよう実行させてください。
SOUND 6,PEEK(&HF604):SOUND 7,PEEK(&HF605)


MML入力

簡単なデータを例に解説していきます。
以下のように入力してください

8 EXEC &HD800:EXEC &HE800
9 END
10 "A T7,3
20 "A o5 c4d4e4f4g4

正しく入力されていれば[F5]キーでRUN(実行)すると「ドレミファソ」と演奏されるはずです。

では各々の行についてどういう動きをしているのか解説していきます。
8行目
EXEC &HD800 で入力したMMLデータのコンパイル、
EXEC &hE800 でコンパイルしたデータの演奏します。

9行目
END でBASICプログラムを終了します。

8行、9行はMML入力の際の定型句として、先頭においておくと便利かと思います。

10行目
ここからMMLデータが続きます。BASICの文法とは書式が異なります。
行番号のすぐ後に「"」(ダブルクォーテーション)と使用チャネル(A,B,C,D,E,F)を置くことで
MML文として認識できるようになります。
"A はFMチャネル1を指します。6重和音が可能です。
T7,3 でテンポを設定をしています。詳しいパラメータの内容はコマンド表をご欄ください。

20行目
"A は10行目と同様、FMチャネル1を指しています。
o5 でオクターブを5に設定しています。
c4d4e4f4g4 で4分音符でドレミファソを演奏させるよう設定しています。

データ入力に誤りがあるとエラーメッセージが表示されます。
エラーメッセージに出た情報をもとに入力訂正をおこなってください。

これがおおよその入力の基本的な流れです。

他にもデータ作成用のコマンドがあります。

・Xチャネル
10 "D cdefg
20 "X
30 "D defga
40 "X
50 "D efgab

Xチャネルで囲まれた行のデータはコンパイルをスキップします。
つまり、20行から40行のデータは無視されます。


エラーメッセージ一覧

・Syntax Error
文字を書き間違えています。
いきなり数字を書いたり、仕様にない文字を使うと出ます。

・Function Call Error
許されている範囲外の数字を使っています。
コマンド表にあるnの数字の範囲外の値を指定すると出ます。
符点が指定音符以外を示す場合でもこのエラーがでます。(例「c32.」)

・Illegal Channel Error
FM音源専用命令をPSGチャネルで使用、もしくは
PSG音源専用命令をFMチャネルで使用するとこのエラーが出ます。

・Out of Nest Error
”[”が無いのに"]"を先に指定しています。

・Close Nest Error
ネストの数が合わないままそのチャネルのコンパイルを終了しています。
”[”があるのに”]”がありません。

・Duplicate Exit Error
”:”コマンドを同じネストに2つ指定しています。
”:”コマンドは1つのネストにつき1ヶ所だけ指定できます。

・Return with Nest Error
ネストの中にJコマンドがあります。
Jコマンドはネストの中に置けません。

・Overflow Error
ヘンなことをすると出ます。(笑)


更新情報

2005/11/16 ver0.34
Sコマンドの初期化のバグを修正。

2005/06/19 ver0.33
音色切替時のプチノイズを軽減。
Sコマンドの第1パラメータが0の時も、第2パラメータ以降を入力しなければならないバグを修正。
「S0」とすることでソフトウェアエンベロープが解除されるようにした。

2005/06/19 ver0.32
ワークエリアの配置換えに伴いネストを3重から4重へ。
転調有効無効スイッチ「K」コマンドの追加。

2005/06/12 ver0.31
フェードアウト周りのバグを修正。

2005/06/11 ver0.3
フェード・フェードアウト機能の追加。
PSG効果音割り込み用マスクのバグを修正。
FM音源ボリュームテーブルの修正。

2005/06/03 ver0.2
FM音源専用Vコマンド追加。
Zコマンド(I/Oport直接指定)を追加。

2005/06/01 ver0.11
ネストのバグを修正。

2005/05/30 ver0.1
暫定公開。