UNPKG

p8-data-cart

Version:

Simple tools for generating Pico-8 data carts.

74 lines (73 loc) 2.98 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.cartBytesToMusicData = cartBytesToMusicData; exports.musicDataToCartBytes = musicDataToCartBytes; exports.runtimeBytesToMusicData = runtimeBytesToMusicData; exports.musicDataToRuntimeBytes = musicDataToRuntimeBytes; function cartBytesToMusicData(bytes) { const frames = []; for (let i = 0; i < bytes.length; i += 5) { const firstByte = bytes[i + 0] ?? 0; const secondByte = bytes[i + 1] ?? 0; const thirdByte = bytes[i + 2] ?? 0; const fourthByte = bytes[i + 3] ?? 0; const fifthByte = bytes[i + 4] ?? 0; frames.push({ channels: [secondByte & 0x7f, thirdByte & 0x7f, fourthByte & 0x7f, fifthByte & 0x7f], flags: { loopStart: (firstByte & 0x01) != 0, loopEnd: (firstByte & 0x02) != 0, stop: (firstByte & 0x04) != 0, unused: (firstByte & 0x08) != 0 } }); } return frames; } function musicDataToCartBytes(musicData) { const bytes = new Uint8Array(musicData.length * 5); for (let i = 0; i < musicData.length; i++) { const frame = musicData[i]; const baseIndex = i * 5; bytes[baseIndex + 0] = (frame.flags.loopStart ? 0x01 : 0) | (frame.flags.loopEnd ? 0x02 : 0) | (frame.flags.stop ? 0x04 : 0) | (frame.flags.unused ? 0x08 : 0); bytes[baseIndex + 1] = frame.channels[0]; bytes[baseIndex + 2] = frame.channels[1]; bytes[baseIndex + 3] = frame.channels[2]; bytes[baseIndex + 4] = frame.channels[3]; } return bytes; } function runtimeBytesToMusicData(bytes) { const frames = []; for (let i = 0; i < bytes.length; i += 4) { const firstByte = bytes[i + 0] ?? 0; const secondByte = bytes[i + 1] ?? 0; const thirdByte = bytes[i + 2] ?? 0; const fourthByte = bytes[i + 3] ?? 0; frames.push({ channels: [firstByte & 0x7f, secondByte & 0x7f, thirdByte & 0x7f, fourthByte & 0x7f], flags: { loopStart: (firstByte & 0x80) != 0, loopEnd: (secondByte & 0x80) != 0, stop: (thirdByte & 0x80) != 0, unused: (fourthByte & 0x80) != 0 } }); } return frames; } function musicDataToRuntimeBytes(musicData) { const bytes = new Uint8Array(musicData.length * 4); for (let i = 0; i < musicData.length; i++) { const frame = musicData[i]; const baseIndex = i * 4; bytes[baseIndex + 0] = (frame.channels[0] & 0x7f) | (frame.flags.loopStart ? 0x80 : 0); bytes[baseIndex + 1] = (frame.channels[1] & 0x7f) | (frame.flags.loopEnd ? 0x80 : 0); bytes[baseIndex + 2] = (frame.channels[2] & 0x7f) | (frame.flags.stop ? 0x80 : 0); bytes[baseIndex + 3] = (frame.channels[3] & 0x7f) | (frame.flags.unused ? 0x80 : 0); } return bytes; }