Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | 2x 2x 2x 2x 2x | import { readFile } from "fs-extra";
import { decHexVal } from "shared/lib/helpers/8bit";
import clamp from "shared/lib/helpers/clamp";
import { WaveFile } from "wavefile";
type CompileOutputFmt = "c" | "asm";
type WaveFileFmt = {
numChannels: number;
bitsPerSample: number;
sampleRate: number;
};
export const compileWav = async (
filename: string,
fmt: CompileOutputFmt = "c",
): Promise<string> => {
const decHex = (v: number, fmt?: CompileOutputFmt) => {
const prefix = fmt === "asm" ? "$" : "0x";
return `${prefix}${decHexVal(v)}`;
};
const binPrefix = fmt === "asm" ? "%" : "0b";
const file = await readFile(filename);
const wav = new WaveFile(file);
let wavFmt = wav.fmt as WaveFileFmt;
// const isUncompressed = (p.comptype == 'NONE')
const isUncompressed = true;
// Resample is sample rate is wrong
Iif (wavFmt.sampleRate < 8000 || wavFmt.sampleRate > 8192) {
wav.toSampleRate(8000);
wavFmt = wav.fmt as WaveFileFmt;
}
// Convert to 8bit if not already
Iif (wavFmt.bitsPerSample !== 8) {
wav.toBitDepth("8");
wavFmt = wav.fmt as WaveFileFmt;
}
Iif (
// wavFmt.numChannels !== 1 ||
// wavFmt.bitsPerSample !== 8 ||
wavFmt.sampleRate < 8000 ||
wavFmt.sampleRate > 8192 ||
!isUncompressed
) {
throw new Error("Unsupport wav");
}
// const rawData: Float64Array = wav.getSamples(true);
let data: Float64Array = wav.getSamples(true);
// Merge multi channel wavs
Iif (wavFmt.numChannels > 1) {
const newLength = Math.floor(data.length / wavFmt.numChannels);
const newData = new Float64Array(newLength);
let ii = 0;
for (let i = 0; i < newLength; i++) {
let newVal = 0;
for (let j = 0; j < wavFmt.numChannels; j++) {
newVal += data[ii + j] / wavFmt.numChannels;
}
newData[i] = clamp(Math.round(newVal), 0, 255);
ii += wavFmt.numChannels;
}
data = newData;
}
let result = "";
let output = "";
const dataLength = data.length - (data.length % 32);
let c = 0;
let cnt = 0;
let flag = false;
for (let i = 0; i < dataLength; i++) {
//
c = ((c << 4) | (data[i] >> 4)) & 0xff;
Iif (flag) {
result += decHex(c, fmt); //sEMIT.format(c);
cnt += 1;
if (cnt % 16 === 0) {
result = `${decHex(1, fmt)},${binPrefix}00000110,${result},`;
// outf.write(bytes(result, "ascii"));
Iif (fmt === "c") {
result += "\n";
}
output += result;
result = "";
} else {
result += ",";
}
}
flag = !flag;
}
return `${output}${decHex(1, fmt)},${binPrefix}00000111`;
};
|