49 lines
1.2 KiB
TypeScript
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)
|
|
}
|