convert/mdfpwmWriter.ts
2025-07-12 15:11:46 +03:00

49 lines
1.2 KiB
TypeScript

export interface MDFPWMMetadata {
title?: string;
artist?: string;
album?: string;
}
function toS1(str: string): Buffer {
const utf8 = Buffer.from(str, "utf-8");
const len = utf8.length;
return Buffer.concat([Buffer.from([len]), utf8]);
}
export function writeMDFPWMv3(
left: Buffer,
right: Buffer,
meta: MDFPWMMetadata = {}
): Buffer {
if (left.length !== right.length) {
throw new Error("Left and right DFPWM buffers must be the same length");
}
let length = left.byteLength*2;
const mdfpwm = []
mdfpwm.push(Buffer.from("MDFPWM\x03", "ascii"));
mdfpwm.push(Buffer.alloc(4));
mdfpwm.push(toS1(meta.artist || ""));
mdfpwm.push(toS1(meta.title || ""));
mdfpwm.push(toS1(meta.album || ""));
mdfpwm[1]!.writeUint32LE(length)
for(let i =0; i < length / 12000; i++) {
const lStart = i * 6000;
const rStart = i * 6000;
const lChunk = left.subarray(lStart, lStart + 6000);
mdfpwm.push(lChunk);
if (lChunk.length < 6000) {
mdfpwm.push(Buffer.alloc(6000 - lChunk.length, 0x55));
}
const rChunk = right.subarray(rStart, rStart + 6000);
mdfpwm.push(rChunk);
if (rChunk.length < 6000) {
mdfpwm.push(Buffer.alloc(6000 - rChunk.length, 0x55));
}
}
return Buffer.concat(mdfpwm)
}