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) }