とわ君に独り言2(痛)

MSXやエレキギターが好きなおっさんの戯言。妻が白血病で亡くなり、3人の子供達と暮らしてます。昔のブログ→id:TOWA0104

■"PLAY文"のMML等音に関すること■MSX BASIC入門 ゲーム制作〜番外編〜

※2023/6/22追記※すぐにMIDIサウルスに移行したのでPLAY文(MML)は超苦手…

MML■(BASICのPSG用ざっくり)
●T(テンポ,BPM,曲の速さ)32〜255
●V(ヴォリューム、音量)0〜15●L(音長)1〜64
●.(ピリオド、音階や休符の長さを3/2倍にする)
●R(休符、無音長さ指定)●O(オクターブ)1〜8
●CDEFGAB(音階)音階名の次に#や+で半音上げ−で半音下げ
●N(数値での音階直接指定)0〜96
●S(エンヴェロープ形状指定,波形)0〜15
●M(エンヴェロープ周期指定) ●X(文字変数)
●=■;(数値変数による指定)※■は数値変数名

MMLエディタ◆http://cat2151.github.io/MML-editor/

■以下資料殴り書き■

●※PLAY文が終了する時に1カウント分余計な空白が入るバグがある(FS-A1GTのみ修正されているらしい)●→http://takumi-cb.com/column_2/004.html

●BASICの分解能でまともに使えるのは、
テンポ180位で16分音符位が限界っぽい💦
(※が、Sコマンドを使うとVコマンド使えずスラーが難しいが、テンポもう少し上げてもある程度行けた…分解能の壁を少し超えられた可能性あり)

●同じ音を別々のチャンネルで鳴らすと干渉してしまうので行ってはならない。2023/6/23追記(※ポケットバンク2マイコンジュークボックスより引用)

●PSGの初期化をするBIOSアドレスは&h0090で、BASICからは「DEFUSR0=&h90:U=USR0(0)」等で呼び出せる。←※2023/6/22追記分


●Nマクロで変数を使う方法。●
(意外と忘れるのに必要な時資料がみつからないw)
10 ■=♣
20 PLAY"N=■;"
※■は変数名、♣の部分は定数や変数や計算式で0〜96の範囲の指定(10進数<16進数で速い)
※昔創った一画面ジャンプゲーで、左右に往復する雲キャラのX座標と自キャラのY座標を使い、
別々のトラックで短い1音づつを鳴らし、BGM兼効果音に使いましたが、短い音1音づつ位でならギリゲームとして成り立ちました。
SCREEN1のジャンプゲー等で8ドット移動の場合、
Y座標をNマクロに変換して鳴らすと、
ジャンプしたときに徐々に音が高くなり降りて行くと徐々に音が低くなるのでジャンプ感が出ました。(このジャンプゲーはデータがご臨終です😢)


●●PLAY文のループのズレを少しでも改善●●
・変数を使わず、直接データを指定
・変数を使う場合はプログラムの最初の方で「A$=""」などで予め変数の格納場所を確保してほんのわずかスピードアップ。
・FOR〜NEXT文でループさせず極力展開する。
・1小節位の最後の音長や休符を短めに設定し1小節が全音符にならぬよう少し短くする(説明が正しいか疑問…💦)

※「ポケットバンク2マイコンジュークボックス」からの抜粋ですが、タイミングの狂いを目立たせなくするテンポの数値が、
T32,T64,T96,T128,T192,T255
だそうです。(仕組みはわからんちん)

・データの末尾から最初に戻すような時は、
「IF PLAY(0)=0 THEN ■」等を使うより、直接ワークエリアが「0」(鳴っていない)かを「IF PEEK(&HFB40)=0 THEN ■」で確認した方が速い。(※2023/10/18検証済)

●●PLAY文で嘘ドラム音を鳴らす●●
・1トラックでエンヴェロープを使い、疑似的ドラム音を出します。(なんちゃってバスドラ&スネア音です。)

昔、ショボい(🤫し〜っ)MSXFM音源で色々工夫していた中の1つの方法で、複数の音色を重ねて別の音色として使ったり、同じ音色の高低で別の楽器と捉えたり、キック(バスドラ)の足りない低音を別の楽器の低い音を一瞬鳴らし補ったりしました。
(その時考えた方法達は、アナログシンセエミュ等への応用で後々重宝しました☺️)

はい、PLAY文に応用してみます。
短い周期の低めの音をバスドラ代わりに鳴らし、1オクターブ上位の音をスネア代わりに鳴らしてみると、ほらドラムっぽく聞こえるでしょ?
(多分、きっと、恐らく、かもしれない、だったらいいな…)

10 PLAY"T128L■S1M475"
20 PLAY"O3C O4C O3C O4C"
30 GOTO20
(■の数値は4,8,16辺りからお好みで)

はい、ショボいですが
「ドッパッ、ドッパッ」にはならなくとも、
「ポッタッ、ポッタッ」位には響きます(響いたってことで💦)まぁ、無いよりましです。
MSXのゲームで、こんな感じの音出してるの色々あった気がします。
▲エンヴェロープを使うため、音量指定の「V」マクロが使えないデメリットがあります。
※この場合、10行のPLAY文に
「:SOUND6,1:SOUND7,&B10110000」
を追加すると、ノイズが乗りもう少しだけドラムっぽくなった気がするかもしらませんw(追記)

●●音色数少ないのをやりくりする●●
・同じトラックの高低の音を別の楽器として扱う。
・トラック数少なくて成立する曲で勝負する!?
個人的には、反復する呪術的なシンセベースと単調なハンマービートに、金属音やノイズが乗るような初期のエレクトロニック・ボディミュージック(EBM)の方法論が相性良いと思いました。

●●自作ゲーム内で簡易的にBGMを鳴らす●●
・ON INTARVAL命令を使う
特定のタイミングである程度の音数を鳴らす、簡易ドライバ的なあれ的なそれ的なコレ的な?
※サンプルプログラム創りかけたら、
b.p.sさん作のBGMを鳴らす素晴らしいプログラムが公開されてました→http://bps-basic.blogspot.com/2016/04/bgm.html?m=1
(これは超オススメです)←※2023/6/22追記分
・きちんとしたドライバを自作する。(う〜んっ、無理しんどい)
・MuSICAやDM-SYSTEM2等々の既存ドライバを…。(嫌ですwなんでやねん🫲)


◆いつか、簡単な16分割のリズムボックスとかでも創ろうかなと考えてます。

BASICのゲームでPLAY文のBGMを鳴らすのは、正直かなり厳しい部分があるのですが、何とかならないかなぁと考えています。(FS-A1GT以外はPLAY文のバグがあるのせいか、かなりテンポがズレるし…)

◆オマケ資料◆
O4~O5のSOUND文16進音階データ
O4C=1AC
O4C#=194
O4D=17D
O4D#=168
O4E=153
O4F=140
O4F#=12E
O4G=11D
O4G#=10D
O4A=0FE
O4A#=0F0
O4B=0E3
O5C=0D6
O5C#=0CA
O5D=0BE
O5D#=0B4
O5E=0AA
O5F=0A0
O5F#=097
O5G=08F
O5G#=087
O5A=07F
O5A#=078
O5B=071
※O5Cであれば0D6でSOUND1,0:SOUND0,&HD6となります。

◆Nコマンド簡易対応表◆(建設中)
※※※※※※| o1|o2| o3| o4| o5| o6| o7| o8|
□□ B= |11| 23| 35| 47| 59| 71| 83| 95|
■■A♯|10| 22| 34| 46| 58| 70| 82| 94|
□□ A= | 9 | 21| 33| 45| 57| 69| 81| 93|
■■G♯| 8 | 20| 32| 44| 56| 68| 80| 92|
□□ G= | 7 | 19| 31| 43| 55| 67| 79| 91|
■■F♯| 6 | 18| 30| 42| 54| 66| 78| 90|
□□ F= | 5 | 17| 29| 41| 53| 65| 77| 89|
□□ E= | 4 | 16| 28| 40| 52| 64| 76| 88|
■■D#| 3 | 15| 27| 39| 51| 63| 75| 87|
□□ D= | 2 | 14| 26| 38| 50| 62| 74| 86|
■■C♯| 1 | 13| 25| 37| 49| 61| 73| 85|
□□ C= | -- | 12| 24| 36| 48| 60| 72| 84|
※※※※※※| o1|o2| o3| o4| o5| o6| o7| o8|

サウンドツール■
◆PSG for WEB◆▽Shingo Minagi さん
 →https://www.minagi.jp/playpsg/
FM音源VSTi紹介◆RykSeb(硫化西部)さん
 →http://ry.ldblog.jp/archives/6321254.html
◆PSGに関してのブログ◆→https://onl.la/fEQe2yX
MMLエディタ◆→http://cat2151.github.io/MML-editor/
◆MSXPLAY◆(要対応データ)→https://msxplay.com/


■小学校高学年位時に、ファミコンディスクシステムソフトの「オトッキー」でトップガンという映画の曲を耳コピで音符入力してから数十年、
シーケンサーを使うようになった現代に、またPLAY文を復習するなんてとても不思議な感じですが、やはり苦手でした💦■

■他にも思い出したりしたら、追記修正します。■