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');