RosettaCodeData/Task/Musical-scale/Sparkling/musical-scale.sparkling
2023-07-01 13:44:08 -04:00

50 lines
1.3 KiB
Text

var sampleRate = 44100.0;
var duration = 8.0;
var dataLength = round(sampleRate * duration);
var dataLength_b0 = dataLength >> 0 & 0xff;
var dataLength_b1 = dataLength >> 8 & 0xff;
var dataLength_b2 = dataLength >> 16 & 0xff;
var dataLength_b3 = dataLength >> 24 & 0xff;
const adjustedHdrSize = 36;
var len = dataLength - adjustedHdrSize;
var len_b0 = len >> 0 & 0xff;
var len_b1 = len >> 8 & 0xff;
var len_b2 = len >> 16 & 0xff;
var len_b3 = len >> 24 & 0xff;
// WAV header
var wavhdr = "RIFF";
wavhdr ..= fmtstr("%c%c%c%c", len_b0, len_b1, len_b2, len_b3);
wavhdr ..= "WAVE";
wavhdr ..= "fmt ";
wavhdr ..= "\x10\x00\x00\x00";
wavhdr ..= "\x01\x00";
wavhdr ..= "\x01\x00";
wavhdr ..= "\x44\xac\x00\x00";
wavhdr ..= "\x44\xac\x00\x00";
wavhdr ..= "\x01\x00";
wavhdr ..= "\x08\x00";
wavhdr ..= "data";
wavhdr ..= fmtstr("%c%c%c%c", dataLength_b0, dataLength_b1, dataLength_b2, dataLength_b3);
// write wav header
var f = fopen("notes.wav", "w");
fwrite(f, wavhdr);
// compute and write actual data
var frequs = { 261.6, 293.6, 329.6, 349.2, 392.0, 440.0, 493.9, 523.3 };
for var j = 0; j < duration; j++ {
var frequ = frequs[j];
var omega = 2 * M_PI * frequ;
for var i = 0; i < dataLength / 8; i++ {
var y = 32 * sin(omega * i / sampleRate);
var byte = fmtstr("%c", round(y));
fwrite(f, byte);
}
}
fclose(f);