MSXの音について全く知らなかったのですが、
今回、大仏パラダイス(ROMカートリッジ化してネット販売予定)の時に
調べたアレコレを書きたいと思います^^
小学生の頃はPLAY文を少し弄りました〜。
まぁ、MSXマガジンだったかな、それに載っている
”ジングルベル”を打ち込んだくらいですねー(*´﹃`*)
あと"サクラ"とか。
さーくーらー、さーくーらーってやつですね^^
ゲーム音楽はよく聞いていました。
ハイドライド1のトウルゥ〜トウルゥ〜トゥトゥトゥ・トゥ、トウルゥ〜を
学校帰りに口ずさんでいました(*´艸`*)
世間ではスーパーマリオが口ずさまれている中、
僕はそれに対抗してハイドライドの、のどかな音楽を一生懸命口ずさんでいました
(*´ω`*)
どんどん音楽が豪華になっていきましたよね〜。
そういえば一番聞いたのはアーケードの、アフターバーナーかもしれないです。
ソノシートを持っていて、アホほど聞きましたね〜^^
でも、
MSXで音楽をやるほどではなかったのです、うーん。
今回、勉強でPLAY文、SOUND文を弄って、
ちょっと面白いなぁと感じてしまいました(*´ω`*)
最終的には作曲できないといけないのですが。
(大仏パラダイスでは、スピードの問題もあり、効果音のみです)
今回はSOUND命令です。
(効果音によく使われます。
でも大仏パラダイスで使ったのはPLAY文なんですけどね^^;)
自作MSXゲーム、大仏パラダイスとは?
ROMカートリッジ版の大仏パラダイス(MSX)発売予定!!! - ニャオニャオ21世紀
ゲームレジェンド31で自作MSX用ROMカートリッジの大仏パラダイス販売!! - ニャオニャオ21世紀
音は周波数?
音というのは周波数らしいです。
む?
結局、空気の振動らしいのです。
空気が、速く振動しているか、ゆっくり振動しているかで、
人間には音が高い、低いで聞こえるらしいですね〜。
ある周波数がドで、
ある周波数がレで、
ある周波数がミと決まっているそうです。
PLAY命令ではドレミと(CDE)と打ち込んで音を鳴らします(MML)が、
SOUND命令は、周波数を設定して音をだすという...
なんか凄いかも(*´艸`*)
マシン語で音を出すときは、
ひとつひとつ周波数(数値)を設定してやることで
音楽にするのでしょうか?
(まだ全く知識がなくて...)
MSXのPSG(音源)は?
三重和音です。
3音だせるということ。
( チャンネルA、チャンネルB、チャンネルC)
うーん。
どうなんでしょうかね〜。
頑張ればいい音が出せますよね!
ハイドライド3とか素晴らしいし、ザナドゥとか、ドラスレ4とかも3音だし。
それとノイズも出せます。
ガーっていう、ラジオの雑音みたいなの?かな?
それからMSXのPSGは、
FM音源のように音色は変えることができないんですよね〜。
PSGは矩形波(くけいは)といって、四角の波なんですよ。
カックカクです。
音は周波数なので、波の形で音色も色々です。
しかしMSXのPSGは、1つの四角い波(それを矩形といいます)。
(コナミに矩形波クラブってありましたよね〜、懐かしい^^)
ですので、どのゲームも同じ音色なんです。
(音色を変えることができると、ピアノっぽい音や、
トランペットのような音とかに変えることが出来ます。
でもMSXでは...)
でも僕は、PSGの矩形波の音が好きですよ!!!
SOUND命令 ( 0 ~ 13)まで設定する
SOUNDは、
SOUND 3,128
などと命令してやります。
最初、この時点で、
"わからん、もう嫌だー"となったのは秘密ですw
でも調べていくとわりと簡単なんですよ、これ。
詳しく言えば、PSGの各レジスタに数値を設定してやります。
sound2,135なら、最初の2がPSGのレジスタです。
うーん、
PSGのチップに14個のデータを受け取るところがあって、
そこに数字を入れてやれば、音が色々変わる、
という感じですね〜。
sound 0~13 , 数値(0~255)
14個も!!!
多すぎてわからんと思いましたが、
音色で6つ、
ノイズの設定で1つ、
ミキサーで1つ(普通の音か、ノイズか、または両方か設定)、
ボリュームで3つ、
エンベロープという訳のわからんので、なんやかんやで3つ
の
計14個!
なんとなく分かりそうですよね!
特に音色で(ドレミとか)、6つだし。
しかも音のボリュームで3つ。
大半がコレ!
エンベロープって何?と思われると思いますが、
結局、音のボリュームをだんだん大きくしてやるとか、
音量の大きい小さいを使って波のようにするとか、そんなんみたいですよ(*´﹃`*)
そんな音の大小を流れるように変えてやると、
なんかいい感じの音になりますよというもの?かな。
そのボリュームのパターンがいくつか用意されています。
SOUND 0、SOUND 1
チャンネルAの音階の周波数を入れます。
チャンネルAとは、MSXの出せる3音のうちの1つです。
なぜ2つ使って、1つの音の周波数を設定するかといいますと、
数字が大きすぎて、1つでは設定できないんです^^
(MSXは8bitなので、基本的に扱える数字は255まで。
2つ使って16bitの数字だと、65535まで)
16bitの数字だと、PSGの扱える周波数をオーバーしてしまいます。
65535も使わないので、
実際に必要なのは12bitです。(4096かな?)
そこでSOUND0の値と、SOUND1の値をくっつけて使います。
詳しくは、
周波数 = fc(入力クロック 1.789...MHz) / 16 * TP
で周波数を出すそうで、
このTPの値を、SOUND 0 , X1
SOUND 1 , X2
X2X1で表すそうです。
(X1は8ビット、X2は4ビットの計12ビットです。)
SOUND1の値の方が、上の桁になるみたいですね。
4オクターブの
ド(C)は、1AC
レ(D)は、17D
ミ(E)は、153
などとSOUND0とSOUND1に入れると、音がでるようです。
(AとかCとかは16進数だからです。)
(Aは10、Bは11、Cは12 ~ Fは15ですね)
SOUND1,1
SOUND0,&HAC
ということかな?
(&Hをつけてやると16進数という意味です)
(もちろん16進数にしなくても、普通の数値(10進数)でもOKです。)
(その場合、こちらのサイト様で16進数を10進数に変換などしてみてもいいですね^^
)
(SOUND8,8とかも書かないといけません。下の方で詳しく。)
どんな数値を入れればいいかはこちらへ。
SOUND 2、SOUND 3
チャンネルBの音階の周波数を入れます。
SOUND 4、SOUND 5
チャンネルCの音階の周波数を入れます。
SOUND 6
ノイズ周波数の設定です。
1つしか設定できないんですよね。
これを後述するミキサーで鳴らしたりします。
とりあえずノイズの設定です。
5ビットの数値。(0 ~ 31)
SOUND 7
音のミキシングです。
これは何かといいますと、チャンネルAは普通の音(トーン)、
チャンネルBもトーン、チャンネルCはノイズとか
決めて鳴らしてやることができます。
これは2進数で設定してやると楽です。
&B10000000
最初の2バイトは10ですが、
次の3バイトは、チャンネルC,B,Aのノイズの設定です。
0がON、1がOFF。
(普通と逆なのが^^;)
SOUND7,&B10000111
としてやるとすべての音(3音)が、ノイズになります。
最後の方の3バイトは、チャンネルC,B,Aのトーン(普通の音)です。
こちらも
0がON、1がOFF。
SOUND7,&B10111000
これで普通の音がなります^^
(一度設定してしまうと、ずっとその設定が活きてきます。
その都度、設定してやらないとノイズが混ざったり変な音になるので
お気をつけて^^)
注目すべき点なのが、トーンとノイズの両方を同時に鳴らすことが
できる点です。
SOUND7,&B10011000
としてやると
チャンネルCのノイズとトーンのビットが0になっているので、
両方ONです。
どんな音なんでしょうね?
SOUND 8、SOUND 9、SOUND 10
こちらはボリュームです。
これを設定してやらないと音がなりません^^;
SOUND8が、チャンネルA。SOUND0とSOUND1の、ですね。
SOUND9が、チャンネルB。
SOUND10が、チャンネルC。
設定する値は 0 ~ 15です。
さらに特殊な機能があります。
16と値を入れてやると、エンベロープがONになるのです(・∀・)
例 SOUND8,16
エンベロープは少し説明しましたが、下にも書きます。
SOUND 11、SOUND12
エンベロープの周期の設定。16ビットのデータで設定するので、
SOUND11とSOUND12の値をくっつけて使います。
速いテンポになったりするのかな?
エンベロープとは。
エンベロープって、音のボリュームの大小を色々弄って効果をだしている
みたいな感じです。
例えば、だんだんボリュームが大きくなっていき、そしてだんだん小さくなっていくと
波みたいな感じに聞こえないでしょうか?
その他、その音の大きさを波形の形にして、
設定してあるのがエンベロープだと思います。
SOUND 13
エンベロープパターンの設定です。
0 ~ 15までの値を入れます。
パターンは10個?
どんなパターンがあるかは、こちらでチェックして下さい^^
まとめ
SOUND命令の基本を書きました。
音は実際に色々と鳴らしてみないとわからないですねぇ。
僕もよくわかりません(#^.^#)
SOUND命令を、プログラムでいろいろとイジることも出来ます。
SOUND1の値を変数にして、
FOR文でだんだん増やしてやるとか。
どこかでサンプルを見つけてきて鳴らしてみるのが一番良いと思います。
次回はPLAY文をやってみたいと思います。