BEEPの高速ON・OFFによる音楽演奏では、その間隔(周波数)によって音程を 変えられるのは明らかです。しかし、音量や音色はどうやって変えれば いいのでしょうか?
もっとも単純なアプローチは、「ONとOFFの比率を変えてみる」というものです。 以下のプログラムを実行してみましょう。
リスト1・デューティー比を変えられる音出しルーチン DF03hとDF04hで音程を指定(DF03h:DF04h=波形のOFFの長さ:ONの長さ) DF05h〜DF06hで音長を指定 D120 F5 sound: PUSH AF D121 C5 PUSH BC D122 D5 PUSH DE D123 E5 PUSH HL D124 2A 05 DF LD HL,(DF05h) D127 ED 5B 03 DF LD DE,(DF03h) D12B 3E 20 ccc: LD A,20h D12D D3 40 OUT 40h,A D12F 42 LD B,D D130 10 FE aaa: DJNZ aaa D132 3E 00 LD A,00h D134 D3 40 OUT 40h,A D136 43 LD B,E D137 10 FE bbb: DJNZ bbb D139 01 00 00 LD BC,0000h D13C 37 SCF D13D ED 42 SBC HL,BC D13F 20 EA JR NZ,ccc D141 E1 POP HL D142 D1 POP DE D143 C1 POP BC D144 F1 POP AF D145 C9 RET
ONとOFFの比率をいろいろ試してみると、同じ音程でもいろいろな音が出せることが わかると思います。ONの値をOFFより小さくすると、音量が小さくなるのは 当然ですが、音色もいろいろ変わって聞こえます。おすすめの値は、 10進数で(ON,OFF)の順に、
(5,75)(5,90)(5,25)(1,20)(3,7)(2,7)(40,200),(12,18)
などですね。
さて、単純にデューティー比を変えるだけでもこのようにいろいろな音が 出せることがわかりましたが、もっと複雑な波形にしてみたらどうでしょうか? それをプログラムしてみたのが、下のリスト2です。
リスト2・複雑な波形の発生ルーチン BASICから、DEF USR=&hD000:A$=USR("文字列")で実行。 文字列で波形を指定する。 文字列の最後にエンドマーク"0"を入れること。 各文字が波形を表わす。例えば、1234560なら、 ON - --- ----- OFF -- ---- ------ のような波形になる。 D000 13 INC DE D001 1A LD A,(DE) D002 6F LD L,A D003 13 INC DE D004 1A LD A,(DE) D005 67 LD H,A D006 06 FF LD B,FFh D008 C5 ddd: PUSH BC D009 E5 PUSH HL D00A CD 12 D0 CALL main D00D E1 POP HL D00E C1 POP BC D00F 10 F7 DJNZ ddd D011 C9 RET D012 16 20 main: LD D,20h D014 7E ccc: LD A,(HL) D015 FE FF CP FFh D017 D6 30 SUB 30h D019 C8 RET Z D01A 47 LD B,A D01B 7A LD A,D D01C D3 40 OUT 40h,A D01E 10 FE aaa: DJNZ aaa D020 EE 20 XOR 20h D022 57 LD D,A D023 23 INC HL D024 18 EE JR ccc
このプログラムは、OUT 81,0:A$=USR("..."):WIDTH 40のように、 DMAをストップして実行するといいでしょう。私のおすすめの波形は、
AA1188227733665544440 1A2A3A4A5A6A7A8A9AAA0 123456789ABCDEFEDCBA9876543210 123456789876543210 224488CCFFHH0 224488CCFFHHXX0などですね。文字は数字やアルファベット以外も使えるので、バカ0とかアホ0とか ミッキーマウス0とか、いろいろ試してみると面白いでしょう。アルファベットも、 大文字と小文字で変わってきます。