dither4/pack-wav.js
2022-12-11 17:23:41 -08:00

74 lines
1.4 KiB
JavaScript

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) {
let val = (val8 + 7) >> 4;
if (val > 15) {
return 15;
}
return val;
}
function pack(audio) {
let packed = [];
/*
for (let i = 0; i < audio.length; i += 2) {
// little-endian 4-bit samples
let low = to4bit(audio[i]);
let high = to4bit(audio[i + 1]);
let byte = low | (high << 4);
packed.push(byte);
}
*/
// raw push bytes
for (let i = 0; i < audio.length; i += 2) {
let val = to4bit(audio[i]);
let byte = val | 0x10;
packed.push(byte);
}
return packed;
}
function audio2assembly(audio) {
return `
.segment "AUDIO"
.export audio_samples
.export audio_samples_end
audio_samples:
${byte2byte(pack(audio))}
audio_samples_end:
.byte 24
`;
}
function wav2assembly(buffer) {
let wav = new WaveFile(buffer);
let samples = wav.getSamples();
let n = samples.length - (samples.length % 131);
return audio2assembly(samples.slice(0, n));
}
let infile = process.argv[2];
let outfile = process.argv[3];
let buffer = readFileSync(infile);
let asm = wav2assembly(buffer);
writeFileSync(outfile, asm, 'utf-8');