dither4/pack-wav.js

74 lines
1.4 KiB
JavaScript
Raw Normal View History

2022-11-30 07:59:38 +00:00
import wavefile from 'wavefile';
let WaveFile = wavefile.WaveFile;
import {
readFileSync,
writeFileSync
} from 'fs';
function byte2byte(arr) {
let lines = [];
for (let i=0; i < arr.length; i++) {
lines.push(`.byte ${arr[i]}`);
}
return lines.join('\n');
}
function to4bit(val8) {
2022-11-30 12:01:55 +00:00
let val = (val8 + 7) >> 4;
2022-11-30 07:59:38 +00:00
if (val > 15) {
return 15;
}
return val;
}
function pack(audio) {
let packed = [];
2022-12-08 14:33:05 +00:00
/*
2022-11-30 07:59:38 +00:00
for (let i = 0; i < audio.length; i += 2) {
2022-12-08 00:12:15 +00:00
// little-endian 4-bit samples
2022-11-30 07:59:38 +00:00
let low = to4bit(audio[i]);
let high = to4bit(audio[i + 1]);
let byte = low | (high << 4);
packed.push(byte);
}
2022-12-08 14:33:05 +00:00
*/
2022-12-08 00:12:15 +00:00
// raw push bytes
2022-11-30 12:01:55 +00:00
for (let i = 0; i < audio.length; i += 2) {
let val = to4bit(audio[i]);
let byte = val | 0x10;
packed.push(byte);
}
2022-11-30 07:59:38 +00:00
return packed;
}
function audio2assembly(audio) {
2022-12-11 21:09:14 +00:00
return `
.segment "AUDIO"
2022-11-30 07:59:38 +00:00
.export audio_samples
.export audio_samples_end
audio_samples:
${byte2byte(pack(audio))}
audio_samples_end:
2022-12-08 19:47:04 +00:00
.byte 24
2022-11-30 07:59:38 +00:00
`;
}
function wav2assembly(buffer) {
let wav = new WaveFile(buffer);
let samples = wav.getSamples();
let n = samples.length - (samples.length % 131);
2022-12-08 19:47:04 +00:00
return audio2assembly(samples.slice(0, n));
2022-11-30 07:59:38 +00:00
}
let infile = process.argv[2];
let outfile = process.argv[3];
let buffer = readFileSync(infile);
let asm = wav2assembly(buffer);
writeFileSync(outfile, asm, 'utf-8');