PWMで音楽を

MUSIC.BAS

10 'MUSIC
20 LET[0],2273,2025,3822,3405,3034,2863,2551,1911
30 LET[8],2145,2145,3608,3214,3214,2703,2408
40 L=10:N=2:P=50:O=20
50 M="C-D-E-F-G-A-B-H-":GSB@P
60 M="CcDdEFfGgAaBH":GSB@P
70 END
80 @P:C=PEEK(M):M=M+1:F=0
90 IFC=34OUT5,0:RTN
100 IFC=60O=O/2:GOTO@P
110 IFC=62O=O*2:GOTO@P
120 IFC=45GOTO@L
130 IFC=95OUT5,0:GOTO@@L
140 IF(C>64)*(C<73)F=[C-65]
150 IF(C>96)*(C<104)F=[C-89]
160 IFF=0GOTO@P
170 F=F/O:PWM5,F*P/100,F
180 @L:WAITL-N
190 IFPEEK(M)<>45OUT5,0
200 WAITN:GOTO@P

文法

M="CcDdEFfGgAaBC---":GSB@P

音符 CDEFGABH ドレミファソラシ高ド
半音 cdfga ♯ eb ♭
休符 _
音長 -

変数Mに文字列の先頭アドレスが入る
GSB@Pでサブルーチン呼び出し

L=20:N=2:P=50:O=20

L 音符の長さ 1/60秒単位
N 音符間の無音時間 1/60秒単位
P 矩形波 Hの割合 0〜50%
O オクターブ初期値

平均律 A=440Hz 周波数Hz・波長ms 計算

A=440Hz 周波数:半音毎に×(2の12乗根) 波長:1000ms/周波数
20HzHL
0A440
3C523.253822065A2273
4d554.373608166B2025
5D587.333405267C3822
6d622.253214368D3405
7E659.263034469E3034
8F698.462863570F2863
9f739.992703671G2551
10G783.992551772H1911
11g830.612408897a2145
12A88022739100d3608
13a932.33214510100d3214
14B987.77202511102f2703
15H1046.5191112103g2408

プログラムの説明

保存のときに表示されるREM文
10 'MUSIC

ドレミファソラシドの音データ
ABCDEFGHの順
20 LET[0],2273,2025,3822,3405,3034,2863,2551,1911

♯♭の音データ
abcdefgの順
30 LET[8],2145,2145,3608,3214,3214,2703,2408

L 音の長さ
N 間隔
P 矩形波の比
O オクターブ
40 L=10:N=2:P=50:O=20

50 M="C-D-E-F-G-A-B-H-":GSB@P
60 M="CcDdEFfGgAaBH":GSB@P
70 END

1文字読み出し
80 @P:C=PEEK(M):M=M+1:F=0

"ならデータ終端
90 IFC=34OUT5,0:RTN

< オクターブダウン
100 IFC=60O=O/2:GOTO@P

> オクターブアップ
110 IFC=62O=O*2:GOTO@P

− 音を伸ばす @Lへ
120 IFC=45GOTO@L

_ 休符 音を止める
130 IFC=95OUT5,0:GOTO@@L

ABCDEFGHのデータを配列から
140 IF(C>64)*(C<73)F=[C-65]

abcdefgabのデータを配列から
150 IF(C>96)*(C<104)F=[C-89]

音データでなければ@Pへ
160 IFF=0GOTO@P

PWM5から音出す
170 F=F/O:PWM5,F*P/100,F

L-N 音を出して待つ
180 @L:WAITL-N

次が−でなければ音を止める
190 IFPEEK(M)<>45OUT5,0

次の音まで待つ
200 WAITN:GOTO@P

スタイルシート

+--------+---------+---------+--

HTML
<p class="jam">
+--------+---------+---------+--<br>
</p>

CSS
.jam {
	width:640px;
	font-size: 30px;
	line-height: 30px;
	letter-spacing:3px;
	white-space:pre-wrap;
	word-break:break-all;
	border: 30px solid #000000;
	font-family: Consolas, 'Courier New', Courier, Monaco, monospace;
	color: #ffffff;
	background-color:#000000;
}

タブを閉じる