55 lines
1.4 KiB
Plaintext
55 lines
1.4 KiB
Plaintext
// Rosetta Code problem: http://rosettacode.org/wiki/Musical_scale
|
|
// by Galileo, 03/2022
|
|
|
|
sample_rate = 44100
|
|
duration = 8
|
|
dataLength = sample_rate * duration
|
|
hdrSize = 44
|
|
fileLen = dataLength + hdrSize - 8
|
|
data 261.6, 293.6, 329.6, 349.2, 392.0, 440.0, 493.9, 523.3
|
|
|
|
sub int_to_bytes(dato, long)
|
|
local dato$, esp, esp$, i
|
|
|
|
esp$ = "00000000"
|
|
dato$ = hex$(dato)
|
|
esp = long * 2
|
|
dato$ = right$(esp$ + dato$, esp)
|
|
for i = esp - 1 to 1 step -2
|
|
poke #fn, dec(mid$(dato$, i, 2))
|
|
next
|
|
end sub
|
|
|
|
fn = open("notesyab.wav", "wb")
|
|
|
|
print #fn, "RIFF";
|
|
int_to_bytes(fileLen, 4)
|
|
print #fn, "WAVEfmt ";
|
|
int_to_bytes(16, 4) // length of format data (= 16)
|
|
int_to_bytes(1, 2) // type of format (= 1 (PCM))
|
|
int_to_bytes(1, 2) // number of channels (= 1)
|
|
int_to_bytes(sample_rate, 4) // sample rate
|
|
int_to_bytes(sample_rate, 4) // sample rate * bps(8) * channels(1) / 8 (= sample rate)
|
|
int_to_bytes(1,2) // bps(8) * channels(1) / 8 (= 1)
|
|
int_to_bytes(8,2) // bits per sample (bps) (= 8)
|
|
print #fn, "data";
|
|
int_to_bytes(dataLength, 4) // size of data section
|
|
|
|
for j = 1 to duration
|
|
read f
|
|
omega = 2 * PI * f
|
|
for i = 0 to dataLength/duration-1
|
|
y = 32 * sin(omega * i / sample_rate)
|
|
byte = and(y, 255)
|
|
poke #fn, byte
|
|
next
|
|
next
|
|
|
|
close(fn)
|
|
|
|
if peek$("os") = "windows" then
|
|
system("notesyab.wav")
|
|
else // Linux
|
|
system("aplay notesyab.wav")
|
|
endif
|