carta1 1.0.19 → 1.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"carta1-worker.min.js","mappings":"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","sources":["webpack://carta1/./codec/core/constants.js","webpack://carta1/./codec/io/bitstream.js","webpack://carta1/./codec/io/serialization.js","webpack://carta1/./codec/core/options.js","webpack://carta1/./codec/utils.js","webpack://carta1/./codec/transforms/qmf.js","webpack://carta1/./codec/transforms/fft.js","webpack://carta1/./codec/transforms/mdct.js","webpack://carta1/./codec/coding/quantization.js","webpack://carta1/./codec/coding/bitallocation.js","webpack://carta1/./codec/core/buffers.js","webpack://carta1/./codec/analysis/transient.js","webpack://carta1/./codec/analysis/psychoacoustics.js","webpack://carta1/./codec/pipeline/encoder.js","webpack://carta1/./codec/pipeline/decoder.js","webpack://carta1/./codec/io/processor.js","webpack://carta1/./codec/browser/worker.js"],"sourcesContent":["/**\n * Carta1 Audio Codec - Core Constants\n */\n\n// Audio format\nexport const SAMPLE_RATE = 44100\nexport const SAMPLES_PER_FRAME = 512\nexport const FRAME_RATE = SAMPLE_RATE / SAMPLES_PER_FRAME\nexport const CODEC_DELAY = 266\n\n// AEA file format\nexport const AEA_MAGIC = new Uint8Array([0x00, 0x08, 0x00, 0x00])\nexport const AEA_HEADER_SIZE = 2048\nexport const AEA_TITLE_OFFSET = 4\nexport const AEA_TITLE_SIZE = 256\nexport const AEA_FRAME_COUNT_OFFSET = 260\nexport const AEA_CHANNEL_COUNT_OFFSET = 264\n\n// Frame structure\nexport const SOUND_UNIT_SIZE = 212\nexport const FRAME_BITS = SOUND_UNIT_SIZE * 8\nexport const FRAME_OVERHEAD_BITS = 40\nexport const BITRATE_PER_CHANNEL = SOUND_UNIT_SIZE * FRAME_RATE * 8\n\n// BFU (Block Floating Unit) configuration\nexport const NUM_BFUS = 52\nexport const MAX_BFU_SIZE = 20\nexport const BITS_PER_BFU_METADATA = 10\n\nexport const SPECS_PER_BFU = new Int32Array([\n 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7,\n 7, 7, 9, 9, 9, 9, 10, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 20, 20, 20,\n 20, 20, 20, 20, 20,\n])\n\nexport const BFU_AMOUNTS_COUNT = 8\nexport const BFU_AMOUNTS = new Int32Array([20, 28, 32, 36, 40, 44, 48, 52])\nexport const BFU_BAND_BOUNDARIES = new Int32Array([20, 36, 52])\n\n// BFU center frequencies (Hz)\nexport const BFU_FREQUENCIES = new Float32Array([\n 172.3, 516.8, 861.3, 1205.9, 1464.3, 1636.5, 1808.8, 1981.1, 2239.5, 2584.0,\n 2928.5, 3273.0, 3574.5, 3832.9, 4091.3, 4349.7, 4608.1, 4866.5, 5124.9,\n 5383.3, 5641.7, 5900.1, 6158.5, 6416.9, 6696.8, 6998.3, 7299.8, 7601.2,\n 7945.8, 8333.3, 8720.9, 9108.5, 9517.7, 9948.3, 10379.0, 10809.7, 11283.4,\n 11800.2, 12317.0, 12833.8, 13350.6, 13867.4, 14384.2, 14901.0, 15590.0,\n 16451.4, 17312.7, 18174.0, 19035.4, 19896.7, 20758.0, 21619.3,\n])\n\n// BFU start positions\nexport const BFU_START_LONG = new Int32Array([\n 0, 8, 16, 24, 32, 36, 40, 44, 48, 56, 64, 72, 80, 86, 92, 98, 104, 110, 116,\n 122, 128, 134, 140, 146, 152, 159, 166, 173, 180, 189, 198, 207, 216, 226,\n 236, 246, 256, 268, 280, 292, 304, 316, 328, 340, 352, 372, 392, 412, 432,\n 452, 472, 492,\n])\n\nexport const BFU_START_SHORT = new Int32Array([\n 0, 32, 64, 96, 8, 40, 72, 104, 12, 44, 76, 108, 20, 52, 84, 116, 26, 58, 90,\n 122, 128, 160, 192, 224, 134, 166, 198, 230, 141, 173, 205, 237, 150, 182,\n 214, 246, 256, 288, 320, 352, 384, 416, 448, 480, 268, 300, 332, 364, 396,\n 428, 460, 492,\n])\n\n// Transform sizes\nexport const MDCT_SIZE_SHORT = 64\nexport const MDCT_SIZE_MID = 256\nexport const MDCT_SIZE_LONG = 512\n\n// Window functions\nexport const WINDOW_SHORT = (() => {\n const table = new Float32Array(32)\n for (let i = 0; i < 32; i++) {\n table[i] = Math.sin(((i + 0.5) * Math.PI) / 64)\n }\n return table\n})()\n\n// QMF configuration\nexport const QMF_TAPS = 48\nexport const QMF_DELAY = 46\nexport const QMF_HIGH_BAND_DELAY = 39\n\n// QMF prototype filter coefficients\nexport const QMF_COEFFS = new Float32Array([\n -0.00001461907, -0.00009205479, -0.000056157569, 0.00030117269, 0.0002422519,\n -0.00085293897, -0.0005205574, 0.0020340169, 0.00078333891, -0.0042153862,\n -0.00075614988, 0.0078402944, -0.000061169922, -0.01344162, 0.0024626821,\n 0.021736089, -0.007801671, -0.034090221, 0.01880949, 0.054326009,\n -0.043596379, -0.099384367, 0.13207909, 0.46424159,\n])\n\n// QMF window function\nexport const QMF_WINDOW = (() => {\n const window = new Float32Array(QMF_TAPS)\n for (let i = 0; i < 24; i++) {\n window[i] = QMF_COEFFS[i] * 2.0\n window[47 - i] = QMF_COEFFS[i] * 2.0\n }\n return window\n})()\n\n// QMF even/odd taps for optimization\nexport const QMF_EVEN = (() => {\n const even = new Float32Array(24)\n for (let i = 0; i < 24; i++) {\n even[i] = QMF_WINDOW[i * 2]\n }\n return even\n})()\n\nexport const QMF_ODD = (() => {\n const odd = new Float32Array(24)\n for (let i = 0; i < 24; i++) {\n odd[i] = QMF_WINDOW[i * 2 + 1]\n }\n return odd\n})()\n\n// Bit allocation\nexport const INTERPOLATION_COMPENSATION_FACTOR = 0.25\n\n// Quantization\nexport const MAX_WORD_LENGTH_INDEX = 15\nexport const WORD_LENGTH_BITS = new Int32Array([\n 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,\n])\nexport const QUANT_DISTORTION_TABLE = (() => {\n const table = new Float32Array(MAX_WORD_LENGTH_INDEX + 1)\n table[0] = 1.0\n for (let wl = 1; wl <= MAX_WORD_LENGTH_INDEX; wl++) {\n const bitsPerSample = WORD_LENGTH_BITS[wl]\n const quantRange = (1 << (bitsPerSample - 1)) - 1\n table[wl] = 1.0 / (12.0 * quantRange * quantRange)\n }\n return table\n})()\nexport const DISTORTION_DELTA_DB = (() => {\n const table = new Float32Array(MAX_WORD_LENGTH_INDEX)\n for (let i = 0; i < MAX_WORD_LENGTH_INDEX; i++) {\n table[i] =\n 10 *\n Math.log10(\n QUANT_DISTORTION_TABLE[i + 1] / (QUANT_DISTORTION_TABLE[i] || 1.0)\n )\n }\n return table\n})()\nexport const SCALE_FACTORS = (() => {\n const table = new Float32Array(64)\n for (let i = 0; i < 64; i++) {\n table[i] = Math.pow(2.0, i / 3.0 - 21)\n }\n return table\n})()\n\n// Psychoacoustic model\nexport const BARK_SCALE = (() => {\n const table = new Float32Array(NUM_BFUS)\n for (let i = 0; i < NUM_BFUS; i++) {\n const freq = BFU_FREQUENCIES[i]\n table[i] =\n 13.0 * Math.atan(0.00076 * freq) + 3.5 * Math.atan((freq / 7500) ** 2)\n }\n return table\n})()\n\nexport const SPREADING_MATRIX = (() => {\n const matrix = new Float32Array(NUM_BFUS * NUM_BFUS)\n for (let masker = 0; masker < NUM_BFUS; masker++) {\n for (let masked = 0; masked < NUM_BFUS; masked++) {\n const distance = BARK_SCALE[masker] - BARK_SCALE[masked]\n let spreading = -100.0\n\n if (distance >= -3.0 && distance < -1.0) {\n spreading = 17.0 * (distance + 3.0) - 70.0\n } else if (distance >= -1.0 && distance < 0) {\n spreading = 36.0 * distance\n } else if (distance >= 0 && distance < 1.0) {\n spreading = -27.0 * distance\n } else if (distance >= 1.0 && distance < 8.0) {\n spreading = -(distance - 1.0) * 4.0 - 27.0\n }\n\n matrix[masker * NUM_BFUS + masked] = spreading\n }\n }\n return matrix\n})()\n\n// ISO/IEC 11172-3:1993 Psychoacoustic Model Constants\nexport const PSYMODEL_MIN_POWER_DB = -200\nexport const PSYMODEL_FFT_SIZE = 2048\n\n// Pre-computes lookup tables for resampling the MDCT power spectrum into a PSD.\n// For each PSD bin, these tables provide the two source MDCT indices and the\n// linear interpolation weight needed to calculate the final power value.\nexport const [\n PSYMODEL_PSD_SOURCE_IDX0,\n PSYMODEL_PSD_SOURCE_IDX1,\n PSYMODEL_PSD_INTERP_WEIGHT,\n] = (() => {\n const half = PSYMODEL_FFT_SIZE >>> 1\n const sizeMinus1 = PSYMODEL_FFT_SIZE - 1\n const halfDiv2 = half / 2\n const scale = sizeMinus1 / half\n\n const idx0 = new Uint16Array(half + 1)\n const idx1 = new Uint16Array(half + 1)\n const w1 = new Float32Array(half + 1)\n\n for (let i = 0; i <= half; i++) {\n const src = i * scale\n const base = src | 0\n\n const j0 = base\n idx0[i] =\n j0 < half\n ? j0 < halfDiv2\n ? j0\n : half - 1 - (j0 - halfDiv2)\n : sizeMinus1 - (j0 - half)\n\n const j1 = base + 1\n if (j1 >= PSYMODEL_FFT_SIZE) {\n idx1[i] = idx0[i]\n } else {\n idx1[i] =\n j1 < half\n ? j1 < halfDiv2\n ? j1\n : half - 1 - (j1 - halfDiv2)\n : sizeMinus1 - (j1 - half)\n }\n\n w1[i] = src - base\n }\n\n return [idx0, idx1, w1]\n})()\n\n// FFT sizes for transient detection\nexport const FFT_SIZE_LOW = 128\nexport const FFT_SIZE_MID = 128\nexport const FFT_SIZE_HIGH = 256\n\n// MDCT/IMDCT transform configuration\nexport const MDCT_BAND_CONFIGS = [\n { size: 128, windowStart: 48 }, // Low band (0-5.5kHz)\n { size: 128, windowStart: 48 }, // Mid band (5.5-11kHz)\n { size: 256, windowStart: 112 }, // High band (11-22kHz)\n]\n\nexport const MDCT_SHORT_BLOCK_SIZE = 32\nexport const MDCT_OVERLAP_SIZE = 32\nexport const MDCT_TAIL_WINDOW_SIZE = 16\n\n// Quantization\nexport const QUANTIZATION_SIGN_BIT_SHIFT = 1\n\n// WAV format\nexport const WAV_HEADER_SIZE = 44\nexport const WAV_BYTES_PER_SAMPLE = 2\nexport const WAV_BITS_PER_SAMPLE = 16\nexport const WAV_PCM_MAX_POSITIVE = 0x7fff\nexport const WAV_PCM_MAX_NEGATIVE = 0x8000\nexport const WAV_DATA_OFFSET = 36\n\n// Frame serialization\nexport const FRAME_HEADER_BITS = 16\nexport const FRAME_WORD_LENGTH_BITS = 4\nexport const FRAME_SCALE_FACTOR_BITS = 6\n\n// Tonal analysis flags\nexport const PSYMODEL_NOT_EXAMINED = 0\nexport const PSYMODEL_TONAL = 1\nexport const PSYMODEL_NON_TONAL = 2\nexport const PSYMODEL_IRRELEVANT = 3\n\n// Pre-computed conversion factors\nexport const PSYMODEL_LOG10_FACTOR = 10 / Math.LN10\nexport const PSYMODEL_POW10_FACTOR = Math.LN10 / 10\n\n// Critical band boundaries (0-24)\nexport const PSYMODEL_CRITICAL_BANDS = new Uint8Array([\n 0, 1, 2, 4, 5, 7, 8, 10, 12, 14, 16, 19, 22, 26, 31, 36, 44, 49, 54, 60, 67,\n 74, 80, 92, 105,\n])\n\n// Threshold table: [frequency_index, bark_value, threshold_value]\n// prettier-ignore\nexport const PSYMODEL_THRESHOLD_TABLE = [\n [1.0, 0.85, 13.87], [2.0, 1.694, 2.85], [3.0, 2.525, -1.28], [4.0, 3.337, -3.5],\n [5.0, 4.124, -4.9], [6.0, 4.882, -5.89], [7.0, 5.608, -6.63], [8.0, 6.301, -7.21],\n [9.0, 6.959, -7.68], [10.0, 7.581, -8.08], [11.0, 8.169, -8.43], [12.0, 8.723, -8.75],\n [13.0, 9.244, -9.05], [14.0, 9.734, -9.33], [15.0, 10.195, -9.61], [16.0, 10.629, -9.89],\n [17.0, 11.037, -10.17], [18.0, 11.421, -10.47], [19.0, 11.783, -10.77], [20.0, 12.125, -11.1],\n [21.0, 12.448, -11.44], [22.0, 12.753, -11.79], [23.0, 13.042, -12.17], [24.0, 13.317, -12.56],\n [25.0, 13.577, -12.96], [26.0, 13.825, -13.38], [27.0, 14.062, -13.79], [28.0, 14.288, -14.21],\n [29.0, 14.504, -14.63], [30.0, 14.711, -15.03], [31.0, 14.909, -15.41], [32.0, 15.1, -15.77],\n [33.0, 15.283, -16.09], [34.0, 15.46, -16.37], [35.0, 15.631, -16.6], [36.0, 15.795, -16.78],\n [37.0, 15.955, -16.91], [38.0, 16.11, -16.97], [39.0, 16.26, -16.98], [40.0, 16.405, -16.92],\n [41.0, 16.547, -16.81], [42.0, 16.685, -16.65], [43.0, 16.82, -16.43], [44.0, 16.951, -16.17],\n [45.0, 17.079, -15.87], [46.0, 17.204, -15.54], [47.0, 17.327, -15.19], [48.0, 17.447, -14.82],\n [50.0, 17.68, -14.06], [52.0, 17.904, -13.32], [54.0, 18.121, -12.64], [56.0, 18.331, -12.04],\n [58.0, 18.534, -11.53], [60.0, 18.73, -11.11], [62.0, 18.922, -10.77], [64.0, 19.108, -10.49],\n [66.0, 19.288, -10.26], [68.0, 19.464, -10.07], [70.0, 19.635, -9.89], [72.0, 19.801, -9.72],\n [74.0, 19.963, -9.54], [76.0, 20.12, -9.37], [78.0, 20.273, -9.18], [80.0, 20.421, -8.97],\n [82.0, 20.565, -8.75], [84.0, 20.705, -8.51], [86.0, 20.84, -8.26], [88.0, 20.971, -7.98],\n [90.0, 21.099, -7.68], [92.0, 21.222, -7.36], [94.0, 21.341, -7.02], [96.0, 21.457, -6.65],\n [100.0, 21.676, -5.85], [104.0, 21.882, -4.93], [108.0, 22.074, -3.9], [112.0, 22.253, -2.75],\n [116.0, 22.42, -1.46], [120.0, 22.575, -0.03], [124.0, 22.721, 1.56], [128.0, 22.857, 3.31],\n [132.0, 22.984, 5.23], [136.0, 23.102, 7.34], [140.0, 23.213, 9.64], [144.0, 23.317, 12.15],\n [148.0, 23.414, 14.88], [152.0, 23.506, 17.84], [156.0, 23.592, 21.05], [160.0, 23.673, 24.52],\n [164.0, 23.749, 28.25], [168.0, 23.821, 32.27], [172.0, 23.888, 36.59], [176.0, 23.952, 41.22],\n [180.0, 24.013, 46.18], [184.0, 24.07, 51.49], [188.0, 24.124, 56.0], [192.0, 24.176, 56.0],\n [196.0, 24.225, 56.0], [200.0, 24.271, 56.0], [204.0, 24.316, 56.0], [208.0, 24.358, 56.0],\n [212.0, 24.398, 56.0], [216.0, 24.436, 56.0], [220.0, 24.473, 56.0], [224.0, 24.508, 56.0],\n [228.0, 24.541, 56.0], [232.0, 24.573, 56.0]\n]\nexport const PSYMODEL_CB_FREQ_INDICES = PSYMODEL_CRITICAL_BANDS.map(\n (cbIdx) => PSYMODEL_THRESHOLD_TABLE[cbIdx][0] - 1\n)\n\n// Frequency to critical band mapping\nexport const PSYMODEL_FREQ_TO_CB_MAP = new Uint8Array([\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,\n 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,\n 41, 42, 43, 44, 45, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53,\n 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62,\n 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 71,\n 71, 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, 76, 76,\n 76, 76, 77, 77, 77, 77, 78, 78, 78, 78, 79, 79, 79, 79, 80, 80, 80, 80, 81,\n 81, 81, 81, 82, 82, 82, 82, 83, 83, 83, 83, 84, 84, 84, 84, 85, 85, 85, 85,\n 86, 86, 86, 86, 87, 87, 87, 87, 88, 88, 88, 88, 89, 89, 89, 89, 90, 90, 90,\n 90, 91, 91, 91, 91, 92, 92, 92, 92, 93, 93, 93, 93, 94, 94, 94, 94, 95, 95,\n 95, 95, 96, 96, 96, 96, 97, 97, 97, 97, 98, 98, 98, 98, 99, 99, 99, 99, 100,\n 100, 100, 100, 101, 101, 101, 101, 102, 102, 102, 102, 103, 103, 103, 103,\n 104, 104, 104, 104, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,\n 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,\n 105,\n])\n","/**\n * Carta1 Audio Codec - Bitstream Operations\n *\n * This module provides low-level bitstream packing and unpacking operations\n * for reading and writing ATRAC1 frame data with bit-level precision.\n */\n\n/**\n * Pack bits into a buffer at a specific bit position\n * @param {Uint8Array} buffer - Destination buffer\n * @param {number} bitPosition - Bit position to start writing at\n * @param {number} value - Value to pack\n * @param {number} bitCount - Number of bits to pack\n */\nexport function packBits(buffer, bitPosition, value, bitCount) {\n if (bitCount === 0) return\n\n let byteIndex = Math.floor(bitPosition / 8)\n let bitOffset = bitPosition % 8\n\n value &= (1 << bitCount) - 1\n\n let bitsWritten = 0\n while (bitsWritten < bitCount && byteIndex < buffer.length) {\n const bitsAvailable = 8 - bitOffset\n const bitsToWrite = Math.min(bitCount - bitsWritten, bitsAvailable)\n\n const shift = bitCount - bitsWritten - bitsToWrite\n const valueBits = (value >> shift) & ((1 << bitsToWrite) - 1)\n\n const mask = ((1 << bitsToWrite) - 1) << (bitsAvailable - bitsToWrite)\n buffer[byteIndex] =\n (buffer[byteIndex] & ~mask) | (valueBits << (bitsAvailable - bitsToWrite))\n\n bitsWritten += bitsToWrite\n byteIndex++\n bitOffset = 0\n }\n}\n\n/**\n * Unpack bits from a buffer at a specific bit position\n * @param {Uint8Array} buffer - Source buffer\n * @param {number} bitPosition - Bit position to start reading from\n * @param {number} bitCount - Number of bits to unpack\n * @returns {number} Unpacked unsigned value\n */\nexport function unpackBits(buffer, bitPosition, bitCount) {\n if (bitCount === 0) return 0\n\n let byteIndex = Math.floor(bitPosition / 8)\n let bitOffset = bitPosition % 8\n let value = 0\n\n for (let bitsRead = 0; bitsRead < bitCount && byteIndex < buffer.length; ) {\n const bitsAvailable = 8 - bitOffset\n const bitsToRead = Math.min(bitCount - bitsRead, bitsAvailable)\n\n const mask = (1 << bitsToRead) - 1\n const bits = (buffer[byteIndex] >> (bitsAvailable - bitsToRead)) & mask\n\n value = (value << bitsToRead) | bits\n bitsRead += bitsToRead\n byteIndex++\n bitOffset = 0\n }\n\n return value\n}\n\n/**\n * Unpack signed bits from a buffer at a specific bit position\n * @param {Uint8Array} buffer - Source buffer\n * @param {number} bitPosition - Bit position to start reading from\n * @param {number} bitCount - Number of bits to unpack\n * @returns {number} Unpacked signed value (two's complement)\n */\nexport function unpackSignedBits(buffer, bitPosition, bitCount) {\n const value = unpackBits(buffer, bitPosition, bitCount)\n const signBit = 1 << (bitCount - 1)\n return value >= signBit ? value - (1 << bitCount) : value\n}\n","/**\n * Carta1 Audio Codec - Serialization Module\n *\n * Handles serialization and deserialization of ATRAC1 audio frames and AEA file format.\n * Provides functions for packing encoded frame data into binary format and unpacking\n * it back into structured data for processing.\n *\n * The module manages:\n * - Frame data serialization/deserialization with proper bit packing\n * - AEA file header creation and parsing\n * - Binary format compliance for ATRAC1 specification\n */\n\nimport {\n SOUND_UNIT_SIZE,\n BFU_AMOUNTS,\n SPECS_PER_BFU,\n AEA_HEADER_SIZE,\n AEA_MAGIC,\n AEA_TITLE_OFFSET,\n AEA_TITLE_SIZE,\n AEA_FRAME_COUNT_OFFSET,\n AEA_CHANNEL_COUNT_OFFSET,\n WORD_LENGTH_BITS,\n FRAME_HEADER_BITS,\n FRAME_WORD_LENGTH_BITS,\n FRAME_SCALE_FACTOR_BITS,\n} from '../core/constants.js'\nimport { packBits, unpackBits, unpackSignedBits } from './bitstream.js'\n\n/**\n * Serializes encoded frame data into binary format\n * @param {Object} frameData - The encoded frame data to serialize\n * @param {number} frameData.nBfu - Number of block floating units\n * @param {number[]} frameData.blockSizeMode - Block size mode for each band [0-2]\n * @param {Int32Array} frameData.scaleFactorIndices - Scale factor indices for each BFU\n * @param {Int32Array} frameData.wordLengthIndices - Word length indices for each BFU\n * @param {Int32Array[]} frameData.quantizedCoefficients - Quantized spectral coefficients\n * @returns {Uint8Array} Serialized frame data buffer\n */\nexport function serializeFrame(frameData) {\n const buffer = new Uint8Array(SOUND_UNIT_SIZE)\n const view = new DataView(buffer.buffer)\n\n // Pack header (16 bits)\n const bfuIndex = BFU_AMOUNTS.indexOf(frameData.nBfu)\n const header =\n ((2 - frameData.blockSizeMode[0]) << 14) |\n ((2 - frameData.blockSizeMode[1]) << 12) |\n ((3 - frameData.blockSizeMode[2]) << 10) |\n (bfuIndex << 5)\n\n view.setUint16(0, header, false)\n let bitPosition = FRAME_HEADER_BITS\n\n // Pack word lengths (4 bits each)\n for (let i = 0; i < frameData.nBfu; i++) {\n packBits(\n buffer,\n bitPosition,\n frameData.wordLengthIndices[i],\n FRAME_WORD_LENGTH_BITS\n )\n bitPosition += FRAME_WORD_LENGTH_BITS\n }\n\n // Pack scale factors (6 bits each)\n for (let i = 0; i < frameData.nBfu; i++) {\n packBits(\n buffer,\n bitPosition,\n frameData.scaleFactorIndices[i],\n FRAME_SCALE_FACTOR_BITS\n )\n bitPosition += FRAME_SCALE_FACTOR_BITS\n }\n\n // Pack quantized coefficients\n for (let i = 0; i < frameData.nBfu; i++) {\n const bitsPerSample = WORD_LENGTH_BITS[frameData.wordLengthIndices[i]]\n if (bitsPerSample > 0) {\n const coefficients = frameData.quantizedCoefficients[i]\n for (const coefficient of coefficients) {\n const value =\n coefficient < 0 ? coefficient + (1 << bitsPerSample) : coefficient\n packBits(buffer, bitPosition, value, bitsPerSample)\n bitPosition += bitsPerSample\n }\n }\n }\n\n // Zero padding at end\n buffer[SOUND_UNIT_SIZE - 3] = 0\n buffer[SOUND_UNIT_SIZE - 2] = 0\n buffer[SOUND_UNIT_SIZE - 1] = 0\n\n return buffer\n}\n\n/**\n * Deserializes binary frame data back into structured format\n * @param {Uint8Array} buffer - Binary frame data buffer\n * @returns {Object} Deserialized frame data\n * @returns {number} returns.nBfu - Number of block floating units\n * @returns {number[]} returns.blockSizeMode - Block size mode for each band\n * @returns {Int32Array} returns.scaleFactorIndices - Scale factor indices for each BFU\n * @returns {Int32Array} returns.wordLengthIndices - Word length indices for each BFU\n * @returns {Int32Array[]} returns.quantizedCoefficients - Quantized spectral coefficients\n * @throws {Error} If buffer size is invalid\n */\nexport function deserializeFrame(buffer) {\n if (buffer.length !== SOUND_UNIT_SIZE) {\n throw new Error(`Frame must be ${SOUND_UNIT_SIZE} bytes`)\n }\n\n const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength)\n\n // Unpack header\n const header = view.getUint16(0, false)\n const blockSizeMode = [\n 2 - ((header >> 14) & 3),\n 2 - ((header >> 12) & 3),\n 3 - ((header >> 10) & 3),\n ]\n const bfuIndex = (header >> 5) & 7\n const nBfu = BFU_AMOUNTS[bfuIndex]\n\n let bitPosition = FRAME_HEADER_BITS\n\n // Unpack word lengths\n const wordLengthIndices = new Int32Array(nBfu)\n for (let i = 0; i < nBfu; i++) {\n wordLengthIndices[i] = unpackBits(\n buffer,\n bitPosition,\n FRAME_WORD_LENGTH_BITS\n )\n bitPosition += FRAME_WORD_LENGTH_BITS\n }\n\n // Unpack scale factors\n const scaleFactorIndices = new Int32Array(nBfu)\n for (let i = 0; i < nBfu; i++) {\n scaleFactorIndices[i] = unpackBits(\n buffer,\n bitPosition,\n FRAME_SCALE_FACTOR_BITS\n )\n bitPosition += FRAME_SCALE_FACTOR_BITS\n }\n\n // Unpack coefficients\n const quantizedCoefficients = []\n for (let i = 0; i < nBfu; i++) {\n const bitsPerSample = WORD_LENGTH_BITS[wordLengthIndices[i]]\n const bfuSize = SPECS_PER_BFU[i]\n const coefficients = new Int32Array(bfuSize)\n\n if (bitsPerSample > 0) {\n for (let j = 0; j < bfuSize; j++) {\n coefficients[j] = unpackSignedBits(buffer, bitPosition, bitsPerSample)\n bitPosition += bitsPerSample\n }\n }\n\n quantizedCoefficients.push(coefficients)\n }\n\n return {\n nBfu,\n scaleFactorIndices,\n wordLengthIndices,\n quantizedCoefficients,\n blockSizeMode,\n }\n}\n\n/**\n * AEA file format handler for ATRAC1 audio files\n * Manages creation and parsing of AEA file headers\n */\nexport class AeaFile {\n /**\n * Creates an AEA file header with the specified metadata\n * @param {string} [title=''] - Audio file title (max 255 characters)\n * @param {number} [frameCount=0] - Number of audio frames in the file\n * @param {number} [channelCount=1] - Number of audio channels (1 or 2)\n * @returns {Uint8Array} AEA file header buffer\n */\n static createHeader(title = '', frameCount = 0, channelCount = 1) {\n const header = new Uint8Array(AEA_HEADER_SIZE)\n const view = new DataView(header.buffer)\n\n // Magic number\n header.set(AEA_MAGIC, 0)\n\n // Title (null-terminated string)\n const titleBytes = new TextEncoder().encode(title)\n header.set(\n titleBytes.subarray(0, Math.min(titleBytes.length, AEA_TITLE_SIZE - 1)),\n AEA_TITLE_OFFSET\n )\n\n // Frame count\n view.setUint32(AEA_FRAME_COUNT_OFFSET, frameCount, true)\n\n // Channel count\n header[AEA_CHANNEL_COUNT_OFFSET] = channelCount\n\n return header\n }\n\n /**\n * Parses an AEA file header to extract metadata\n * @param {Uint8Array} header - AEA file header buffer\n * @returns {Object} Parsed header information\n * @returns {string} returns.title - Audio file title\n * @returns {number} returns.frameCount - Number of audio frames\n * @returns {number} returns.channelCount - Number of audio channels\n * @throws {Error} If header size is invalid or magic number doesn't match\n */\n static parseHeader(header) {\n if (header.length !== AEA_HEADER_SIZE) {\n throw new Error(`Header must be ${AEA_HEADER_SIZE} bytes`)\n }\n\n // Check magic number\n for (let i = 0; i < AEA_MAGIC.length; i++) {\n if (header[i] !== AEA_MAGIC[i]) {\n throw new Error('Invalid AEA file')\n }\n }\n\n const view = new DataView(\n header.buffer,\n header.byteOffset,\n header.byteLength\n )\n\n // Extract title\n const titleEnd = header.indexOf(0, AEA_TITLE_OFFSET)\n const titleLength =\n titleEnd === -1 ? AEA_TITLE_SIZE : titleEnd - AEA_TITLE_OFFSET\n const title = new TextDecoder().decode(\n header.subarray(AEA_TITLE_OFFSET, AEA_TITLE_OFFSET + titleLength)\n )\n\n // Extract metadata\n const frameCount = view.getUint32(AEA_FRAME_COUNT_OFFSET, true)\n const channelCount = header[AEA_CHANNEL_COUNT_OFFSET]\n\n return { title, frameCount, channelCount }\n }\n}\n","/**\n * Carta1 Audio Codec - Encoder Options\n *\n * This module provides configuration management for the ATRAC1 encoder,\n * including parameter validation and metadata for UI controls.\n */\n\n/**\n * Configuration options for the ATRAC1 encoder\n */\nclass EncoderOptions {\n /**\n * Create a new EncoderOptions instance\n * @param {Object} options - Initial option values\n */\n constructor(options = {}) {\n this.values = {\n transientThresholdLow: 1.0,\n transientThresholdMid: 1.5,\n transientThresholdHigh: 2.0,\n normalizationDb: 68,\n }\n\n this.metadata = {\n transientThresholdLow: {\n default: this.values.transientThresholdLow,\n name: 'Low Band Transient Threshold',\n description:\n 'Controls the transient detection threshold for the low frequency band (0-5.5kHz). Lower values make detection more sensitive, triggering short blocks more easily. Higher values require stronger transients.',\n range: [0.01, 2],\n step: 0.01,\n },\n transientThresholdMid: {\n default: this.values.transientThresholdMid,\n name: 'Mid Band Transient Threshold',\n description:\n 'Controls the transient detection threshold for the mid frequency band (5.5-11kHz). Lower values make detection more sensitive, triggering short blocks more easily. Higher values require stronger transients.',\n range: [0.01, 3],\n step: 0.01,\n },\n transientThresholdHigh: {\n default: this.values.transientThresholdHigh,\n name: 'High Band Transient Threshold',\n description:\n 'Controls the transient detection threshold for the high frequency band (11-22kHz). Lower values make detection more sensitive, triggering short blocks more easily. Higher values require stronger transients.',\n range: [0.01, 4],\n step: 0.01,\n },\n normalizationDb: {\n default: this.values.normalizationDb,\n name: 'Normalization Target (dB)',\n description:\n 'Sets the target maximum level in decibels for psychoacoustic model normalization. This affects the dynamic range allocation and quantization precision. Higher values may increase bitrate but preserve more detail.',\n range: [60, 80],\n step: 1,\n },\n }\n\n // Apply user-provided options\n if (options) {\n this.setOptions(options)\n }\n }\n\n /**\n * Set multiple options at once\n * @param {Object} options - Object containing option key-value pairs\n */\n setOptions(options) {\n for (const [key, value] of Object.entries(options)) {\n if (key in this.values) {\n this.setValue(key, value)\n }\n }\n }\n\n /**\n * Set a single option value with validation\n * @param {string} key - Option key\n * @param {*} value - Option value\n * @throws {Error} If key is unknown or value is out of range\n */\n setValue(key, value) {\n if (!(key in this.metadata)) {\n throw new Error(`Unknown option: ${key}`)\n }\n\n const meta = this.metadata[key]\n const [min, max] = meta.range\n\n if (value < min || value > max) {\n throw new Error(\n `Value for ${key} must be between ${min} and ${max}, got ${value}`\n )\n }\n\n this.values[key] = value\n }\n\n /**\n * Get the value of an option\n * @param {string} key - Option key\n * @returns {*} Option value\n * @throws {Error} If key is unknown\n */\n getValue(key) {\n if (!(key in this.values)) {\n throw new Error(`Unknown option: ${key}`)\n }\n return this.values[key]\n }\n\n get transientThresholdLow() {\n return this.values.transientThresholdLow\n }\n\n get transientThresholdMid() {\n return this.values.transientThresholdMid\n }\n\n get transientThresholdHigh() {\n return this.values.transientThresholdHigh\n }\n\n get normalizationDb() {\n return this.values.normalizationDb\n }\n\n getMetadata(key) {\n return this.metadata[key]\n }\n\n getAllMetadata() {\n return { ...this.metadata }\n }\n\n reset() {\n for (const [key, meta] of Object.entries(this.metadata)) {\n this.values[key] = meta.default\n }\n }\n\n toObject() {\n return {\n values: { ...this.values },\n metadata: { ...this.metadata },\n }\n }\n}\n\nexport { EncoderOptions }\n","/**\n * Carta1 Audio Codec - Utilities\n *\n * This module provides common utility functions for the ATRAC1 codec including\n * pipeline composition, error handling, and audio stream processing utilities\n * for delay compensation and frame padding.\n */\n\nimport { CODEC_DELAY, SAMPLES_PER_FRAME } from './core/constants.js'\n\n/**\n * Throws an error with the given message\n * @param {string} msg - Error message\n * @throws {Error} Always throws an error with the provided message\n */\nexport function throwError(msg) {\n throw new Error(msg)\n}\n\n/**\n * Creates a pipeline by composing multiple processing stages\n * @param {Object} context - Shared context passed to all stages\n * @param {...Function} stages - Stage functions to compose\n * @returns {Function} Composed pipeline function\n */\nexport function pipe(context, ...stages) {\n const functions = stages.map((stage) => stage(context))\n\n return (input) => {\n return functions.reduce((value, fn) => fn(value), input)\n }\n}\n\n/**\n * Pads audio frames and adds flush samples for proper codec delay handling\n * @param {AsyncIterable<Float32Array>} iter - Input frame stream\n * @param {number} [samplesToFlush=CODEC_DELAY] - Number of samples to flush\n * @yields {Float32Array} Padded frames with flush samples\n */\nexport async function* withFlushSamples(iter, samplesToFlush = CODEC_DELAY) {\n let lastFrameLength = SAMPLES_PER_FRAME\n for await (const frame of iter) {\n lastFrameLength = frame.length\n if (lastFrameLength === SAMPLES_PER_FRAME) {\n yield frame\n } else {\n // We need to pad\n const paddedFrame = new Float32Array(SAMPLES_PER_FRAME)\n paddedFrame.set(frame)\n yield paddedFrame\n }\n }\n if (SAMPLES_PER_FRAME - lastFrameLength < samplesToFlush) {\n yield new Float32Array(SAMPLES_PER_FRAME)\n }\n}\n\n/**\n * Applies delay compensation to PCM frame stream by dropping initial samples\n * @param {AsyncIterable<Float32Array>} pcmFrameStream - Input PCM frame stream\n * @param {number} [samplesToDrop=CODEC_DELAY] - Number of samples to drop for delay compensation\n * @yields {Float32Array} Delay-compensated PCM frames\n */\nexport async function* withDelayCompensation(\n pcmFrameStream,\n samplesToDrop = CODEC_DELAY\n) {\n let buffer = new Float32Array(0)\n let droppedInitialSamples = false\n\n for await (const frame of pcmFrameStream) {\n // Drop samples from the very first frame only\n if (!droppedInitialSamples) {\n droppedInitialSamples = true\n if (samplesToDrop >= frame.length) {\n // Entire first frame is dropped\n samplesToDrop -= frame.length\n continue\n }\n // Keep only the portion after dropped samples\n buffer = frame.slice(samplesToDrop)\n samplesToDrop = 0\n continue\n }\n\n // Concatenate buffer with new frame\n const combined = new Float32Array(buffer.length + frame.length)\n combined.set(buffer)\n combined.set(frame, buffer.length)\n\n // Emit all complete frames\n let offset = 0\n while (offset + SAMPLES_PER_FRAME <= combined.length) {\n yield combined.slice(offset, offset + SAMPLES_PER_FRAME)\n offset += SAMPLES_PER_FRAME\n }\n\n // Buffer the remainder for next iteration\n buffer = combined.slice(offset)\n }\n\n // Emit final partial frame\n if (buffer.length > 0) {\n yield buffer\n }\n}\n\n/**\n * Adapts a mono transform function to work with stereo audio streams\n * @param {Function} monoTransform - Transform function for mono audio\n * @param {...*} args - Additional arguments to pass to the transform\n * @returns {Function} Stereo-adapted transform function\n */\nexport function withStereo(monoTransform, ...args) {\n return async function* (stereoIter) {\n // Buffer to store frames temporarily\n const leftFrames = []\n const rightFrames = []\n\n // Collect all frames first (necessary for proper synchronization)\n for await (const [left, right] of stereoIter) {\n leftFrames.push(left)\n rightFrames.push(right)\n }\n\n // Create mono iterators\n const leftIter = (async function* () {\n for (const frame of leftFrames) yield frame\n })()\n\n const rightIter = (async function* () {\n for (const frame of rightFrames) yield frame\n })()\n\n // Apply transform to each channel\n const leftTransformed = monoTransform(leftIter, ...args)\n const rightTransformed = monoTransform(rightIter, ...args)\n\n // Zip back together\n for await (const left of leftTransformed) {\n const { value: right } = await rightTransformed.next()\n if (right !== undefined) {\n yield [left, right]\n }\n }\n }\n}\n\n/**\n * Reverses the spectral order of coefficients for mid/high band processing\n *\n * Used in both MDCT and IMDCT stages to handle spectral reversal required\n * by the ATRAC1 format for mid and high frequency bands.\n *\n * @param {Float32Array} spectrum - Input spectrum coefficients\n * @param {Object} reversalBuffers - Pre-allocated buffers for different spectrum sizes\n * @returns {Float32Array} Spectrum with reversed coefficient order\n */\nexport function reverseSpectrum(spectrum, reversalBuffers) {\n const reversed = reversalBuffers[spectrum.length]\n for (let i = 0; i < spectrum.length; i++) {\n reversed[i] = spectrum[spectrum.length - 1 - i]\n }\n return reversed\n}\n\n/**\n * Calculates the starting offset for a frequency band in the coefficient array\n *\n * @param {number} bandIndex - Band index (0=low, 1=mid, 2=high)\n * @returns {number} Starting offset in the 512-sample coefficient array\n */\nexport function calculateBandOffset(bandIndex) {\n return bandIndex === 0 ? 0 : bandIndex === 1 ? 128 : 256\n}\n\n/**\n * Extracts coefficients for a specific frequency band from the full coefficient array\n *\n * @param {Float32Array} coefficients - Full 512-sample coefficient array\n * @param {number} bandIndex - Band index (0=low, 1=mid, 2=high)\n * @returns {Float32Array} Subarray containing coefficients for the specified band\n */\nexport function extractBandCoefficients(coefficients, bandIndex) {\n const offsets = [0, 128, 256, 512]\n return coefficients.subarray(offsets[bandIndex], offsets[bandIndex + 1])\n}\n\n// Stereo-adapted utility functions\nexport const withStereoFlushSamples = withStereo(withFlushSamples)\nexport const withStereoDelayCompensation = withStereo(withDelayCompensation)\n","/**\n * Carta1 Audio Codec - Quadrature Mirror Filter\n *\n * This module implements QMF analysis and synthesis for subband decomposition\n * in the ATRAC1 codec. The QMF splits the audio signal into multiple frequency\n * bands for independent processing and coding.\n */\n\nimport { QMF_DELAY, QMF_EVEN, QMF_ODD } from '../core/constants.js'\nimport { throwError } from '../utils.js'\n\n/**\n * Perform QMF analysis filtering to split input into low and high frequency bands\n * @param {Float32Array} input - Input audio samples\n * @param {Float32Array} delayLine - QMF delay line state\n * @param {Object} qmfWorkBuffers - Optional work buffers for processing\n * @returns {Object} Object containing lowBand, highBand, and newDelay\n */\nexport function qmfAnalysis(input, delayLine, qmfWorkBuffers = null) {\n const inputLength = input.length\n const outputLength = inputLength >> 1\n\n const workBuffer =\n qmfWorkBuffers?.delay?.[inputLength] ??\n throwError('qmfAnalysis: workBuffer is required')\n workBuffer.set(delayLine)\n workBuffer.set(input, delayLine.length)\n\n const lowBand = new Float32Array(outputLength)\n const highBand = new Float32Array(outputLength)\n\n for (let i = 0; i < outputLength; i++) {\n let evenSum = 0\n let oddSum = 0\n const offset = i * 2\n\n // Unrolled convolution\n for (let j = 0; j < 24; j++) {\n evenSum += workBuffer[offset + 47 - j * 2] * QMF_EVEN[j]\n oddSum += workBuffer[offset + 46 - j * 2] * QMF_ODD[j]\n }\n\n lowBand[i] = evenSum + oddSum\n highBand[i] = evenSum - oddSum\n }\n\n // Update delay line\n const newDelay = workBuffer.slice(-QMF_DELAY)\n return { lowBand, highBand, newDelay }\n}\n\n/**\n * Perform QMF synthesis filtering to reconstruct audio from low and high frequency bands\n * @param {Float32Array} lowBand - Low frequency band samples\n * @param {Float32Array} highBand - High frequency band samples\n * @param {Float32Array} delayLine - QMF delay line state\n * @param {Object} qmfWorkBuffers - Optional work buffers for processing\n * @returns {Object} Object containing output and newDelay\n */\nexport function qmfSynthesis(\n lowBand,\n highBand,\n delayLine,\n qmfWorkBuffers = null\n) {\n const subbandLength = lowBand.length\n const outputLength = subbandLength * 2\n\n const workBuffer =\n qmfWorkBuffers?.delay?.[outputLength] ??\n throwError('qmfSynthesis: workBuffer is required')\n workBuffer.set(delayLine)\n\n // Upsample and merge\n for (let i = 0; i < subbandLength; i++) {\n const low = lowBand[i]\n const high = highBand[i]\n const offset = QMF_DELAY + i * 2\n workBuffer[offset] = 0.5 * (low + high)\n workBuffer[offset + 1] = 0.5 * (low - high)\n }\n\n const output = new Float32Array(outputLength)\n\n // Convolution\n for (let i = 0; i < subbandLength; i++) {\n const offset = i * 2\n let sample0 = 0\n let sample1 = 0\n\n for (let j = 0; j < 24; j++) {\n const idx = offset + j * 2\n sample0 += workBuffer[idx] * QMF_EVEN[j]\n sample1 += workBuffer[idx + 1] * QMF_ODD[j]\n }\n\n output[i * 2] = sample1\n output[i * 2 + 1] = sample0\n }\n\n const newDelay = workBuffer.slice(-QMF_DELAY)\n return { output, newDelay }\n}\n","/**\n * Carta1 Audio Codec - Fast Fourier Transform\n * Optimized radix-2 Cooley-Tukey FFT implementation\n */\nexport class FFT {\n static _cache = new Map()\n\n /**\n * Perform an in-place forward FFT on complex data.\n * @param {Float32Array} real - Real part of the input/output data\n * @param {Float32Array} imag - Imaginary part of the input/output data\n */\n static fft(real, imag) {\n const n = real.length\n if (n !== imag.length) {\n throw new Error('Real and imaginary arrays must have the same length.')\n }\n if ((n & (n - 1)) !== 0) {\n throw new Error('Input size must be a power of 2.')\n }\n if (n <= 1) return\n\n let cache = FFT._cache.get(n)\n if (!cache) {\n cache = FFT._buildCache(n)\n FFT._cache.set(n, cache)\n }\n\n const { bitRev, cos: cosTbl, sin: sinTbl } = cache\n\n // Bit-reversal permutation with improved memory access pattern\n for (let i = 0; i < n; i++) {\n const j = bitRev[i]\n if (j > i) {\n // Use temporary variables to reduce array access\n const tempR = real[i]\n const tempI = imag[i]\n real[i] = real[j]\n imag[i] = imag[j]\n real[j] = tempR\n imag[j] = tempI\n }\n }\n\n // Optimized butterfly computations for small strides\n // Stride 2 - no twiddle factors needed\n for (let i = 0; i < n; i += 2) {\n const evenR = real[i]\n const evenI = imag[i]\n const oddR = real[i + 1]\n const oddI = imag[i + 1]\n\n real[i] = evenR + oddR\n imag[i] = evenI + oddI\n real[i + 1] = evenR - oddR\n imag[i + 1] = evenI - oddI\n }\n\n // Stride 4 - simple twiddle factors\n if (n >= 4) {\n for (let i = 0; i < n; i += 4) {\n // First pair (W^0 = 1)\n let evenR = real[i]\n let evenI = imag[i]\n let oddR = real[i + 2]\n let oddI = imag[i + 2]\n\n real[i] = evenR + oddR\n imag[i] = evenI + oddI\n real[i + 2] = evenR - oddR\n imag[i + 2] = evenI - oddI\n\n // Second pair (W^1 = -i)\n evenR = real[i + 1]\n evenI = imag[i + 1]\n oddR = real[i + 3]\n oddI = imag[i + 3]\n\n const tR = oddI // Multiplication by -i\n const tI = -oddR\n\n real[i + 1] = evenR + tR\n imag[i + 1] = evenI + tI\n real[i + 3] = evenR - tR\n imag[i + 3] = evenI - tI\n }\n }\n\n // Stride 8 - unrolled for better performance\n if (n >= 8) {\n for (let i = 0; i < n; i += 8) {\n // W^0 = 1\n let idx0 = i\n let idx4 = i + 4\n let r0 = real[idx0],\n i0 = imag[idx0]\n let r4 = real[idx4],\n i4 = imag[idx4]\n real[idx0] = r0 + r4\n imag[idx0] = i0 + i4\n real[idx4] = r0 - r4\n imag[idx4] = i0 - i4\n\n // W^1 = cos(-π/4) - i*sin(-π/4)\n let idx1 = i + 1\n let idx5 = i + 5\n r0 = real[idx1]\n i0 = imag[idx1]\n r4 = real[idx5]\n i4 = imag[idx5]\n const sqrt2_2 = 0.7071067811865476\n let tR = sqrt2_2 * (r4 + i4)\n let tI = sqrt2_2 * (i4 - r4)\n real[idx1] = r0 + tR\n imag[idx1] = i0 + tI\n real[idx5] = r0 - tR\n imag[idx5] = i0 - tI\n\n // W^2 = -i\n let idx2 = i + 2\n let idx6 = i + 6\n r0 = real[idx2]\n i0 = imag[idx2]\n r4 = real[idx6]\n i4 = imag[idx6]\n tR = i4\n tI = -r4\n real[idx2] = r0 + tR\n imag[idx2] = i0 + tI\n real[idx6] = r0 - tR\n imag[idx6] = i0 - tI\n\n // W^3 = cos(-3π/4) - i*sin(-3π/4)\n let idx3 = i + 3\n let idx7 = i + 7\n r0 = real[idx3]\n i0 = imag[idx3]\n r4 = real[idx7]\n i4 = imag[idx7]\n tR = sqrt2_2 * (-r4 + i4)\n tI = sqrt2_2 * (-r4 - i4)\n real[idx3] = r0 + tR\n imag[idx3] = i0 + tI\n real[idx7] = r0 - tR\n imag[idx7] = i0 - tI\n }\n }\n\n // General Cooley-Tukey butterflies with optimized inner loop\n for (let stride = 16; stride <= n; stride <<= 1) {\n const halfStride = stride >>> 1\n const step = n / stride\n\n // Process each group\n for (let grp = 0; grp < n; grp += stride) {\n // First butterfly (W^0 = 1) - no multiplication needed\n let evenIdx = grp\n let oddIdx = grp + halfStride\n const r0 = real[evenIdx]\n const i0 = imag[evenIdx]\n const r1 = real[oddIdx]\n const i1 = imag[oddIdx]\n real[evenIdx] = r0 + r1\n imag[evenIdx] = i0 + i1\n real[oddIdx] = r0 - r1\n imag[oddIdx] = i0 - i1\n\n // Remaining butterflies with twiddle factors\n let twiddleIdx = step\n for (let k = 1; k < halfStride; k++) {\n evenIdx = grp + k\n oddIdx = evenIdx + halfStride\n\n const cosW = cosTbl[twiddleIdx]\n const sinW = sinTbl[twiddleIdx]\n\n const oddR = real[oddIdx]\n const oddI = imag[oddIdx]\n const tR = oddR * cosW - oddI * sinW\n const tI = oddR * sinW + oddI * cosW\n\n const evenR = real[evenIdx]\n const evenI = imag[evenIdx]\n\n real[evenIdx] = evenR + tR\n imag[evenIdx] = evenI + tI\n real[oddIdx] = evenR - tR\n imag[oddIdx] = evenI - tI\n\n twiddleIdx += step\n }\n }\n }\n }\n\n /**\n * Build cache tables for FFT of size n\n * @private\n */\n static _buildCache(n) {\n const log2n = Math.log2(n) | 0\n\n // Optimized bit-reversal using iterative approach\n const bitRev = new Uint32Array(n)\n for (let i = 1; i < n; i++) {\n bitRev[i] = (bitRev[i >>> 1] >>> 1) | ((i & 1) << (log2n - 1))\n }\n\n // Pre-compute twiddle factors with better precision\n const halfN = n >>> 1\n const cosTbl = new Float32Array(halfN)\n const sinTbl = new Float32Array(halfN)\n\n // Use higher precision calculation then cast to Float32\n const angleStep = (-2 * Math.PI) / n\n for (let i = 0; i < halfN; i++) {\n const angle = angleStep * i\n cosTbl[i] = Math.fround(Math.cos(angle))\n sinTbl[i] = Math.fround(Math.sin(angle))\n }\n\n return { bitRev, cos: cosTbl, sin: sinTbl }\n }\n}\n","/**\n * Carta1 Audio Codec - Modified Discrete Cosine Transform\n *\n * This module implements forward and inverse MDCT transforms for the ATRAC1 codec.\n * The MDCT provides time-frequency analysis with perfect reconstruction and\n * 50% overlap between adjacent blocks to avoid blocking artifacts.\n */\n\nimport { FFT } from './fft.js'\nimport {\n MDCT_SIZE_SHORT,\n MDCT_SIZE_MID,\n MDCT_SIZE_LONG,\n} from '../core/constants.js'\nimport { throwError } from '../utils.js'\n\n/**\n * Base class for MDCT and IMDCT transforms\n */\nclass MDCTBase {\n constructor(size, scale) {\n this.size = size\n this.halfSize = size >> 1\n this.quarterSize = size >> 2\n this.fftSize = this.halfSize >> 1\n\n const alpha = (2.0 * Math.PI) / (8.0 * size)\n const omega = (2.0 * Math.PI) / size\n const scaleRoot = Math.sqrt(scale / size)\n\n this.sinCosTable = new Float32Array(this.halfSize)\n for (let i = 0; i < this.quarterSize; i++) {\n const angle = omega * i + alpha\n this.sinCosTable[i * 2] = scaleRoot * Math.cos(angle)\n this.sinCosTable[i * 2 + 1] = scaleRoot * Math.sin(angle)\n }\n }\n}\n\n/**\n * Forward MDCT transform\n */\nexport class MDCT extends MDCTBase {\n constructor(size, scale) {\n super(size, scale)\n }\n\n /**\n * Perform forward MDCT transform\n * @param {Float32Array} input - Time-domain input samples\n * @param {Object} mdctBuffers - Optional work buffers for FFT\n * @returns {Float32Array} Frequency-domain MDCT coefficients\n */\n transform(input, mdctBuffers = null) {\n const buffers = mdctBuffers?.[this.fftSize]\n const real = buffers?.real ?? throwError('mdct: real is required')\n const imag = buffers?.imag ?? throwError('mdct: imag is required')\n\n const n4 = this.quarterSize\n const n34 = 3 * n4\n\n real.fill(0)\n imag.fill(0)\n\n // Pre-FFT butterfly\n for (let i = 0; i < n4; i += 2) {\n const i1 = n34 - 1 - i\n const i2 = n34 + i\n const i3 = n4 + i\n const i4 = n4 - 1 - i\n\n const r = input[i1] + input[i2]\n const im = input[i3] - input[i4]\n const c = this.sinCosTable[i]\n const s = this.sinCosTable[i + 1]\n\n real[i >> 1] = r * c + im * s\n imag[i >> 1] = im * c - r * s\n }\n\n for (let i = n4; i < this.halfSize; i += 2) {\n const idx = i >> 1\n const i1 = n34 - 1 - i\n const i2 = i - n4\n const i3 = n4 + i\n const i4 = 5 * n4 - 1 - i\n\n const r = input[i1] - input[i2]\n const im = input[i3] + input[i4]\n const c = this.sinCosTable[i]\n const s = this.sinCosTable[i + 1]\n\n real[idx] = r * c + im * s\n imag[idx] = im * c - r * s\n }\n\n FFT.fft(real, imag)\n\n // Post-FFT processing\n const output = new Float32Array(this.halfSize)\n for (let i = 0; i < this.fftSize; i++) {\n const c = this.sinCosTable[i * 2]\n const s = this.sinCosTable[i * 2 + 1]\n const re = real[i]\n const im = imag[i]\n\n output[i * 2] = -re * c - im * s\n output[this.halfSize - 1 - i * 2] = -re * s + im * c\n }\n\n return output\n }\n}\n\n/**\n * Inverse MDCT transform\n */\nexport class IMDCT extends MDCTBase {\n constructor(size, scale = null) {\n super(size, scale || size)\n }\n\n /**\n * Perform inverse MDCT transform\n * @param {Float32Array} input - Frequency-domain MDCT coefficients\n * @param {Object} mdctBuffers - Optional work buffers for FFT\n * @returns {Float32Array} Time-domain output samples\n */\n transform(input, mdctBuffers = null) {\n const buffers = mdctBuffers?.[this.fftSize]\n const real = buffers?.real ?? throwError('imdct: real is required')\n const imag = buffers?.imag ?? throwError('imdct: imag is required')\n\n const n4 = this.quarterSize\n const n34 = 3 * n4\n\n real.fill(0)\n imag.fill(0)\n\n // Pre-FFT processing\n for (let i = 0; i < this.fftSize; i++) {\n const i2 = i * 2\n const r = input[i2]\n const im = input[this.halfSize - 1 - i2]\n const c = this.sinCosTable[i2]\n const s = this.sinCosTable[i2 + 1]\n\n real[i] = -2.0 * (im * s + r * c)\n imag[i] = -2.0 * (im * c - r * s)\n }\n\n FFT.fft(real, imag)\n\n // Post-FFT butterfly\n const output = new Float32Array(this.size)\n\n for (let i = 0; i < this.fftSize / 2; i++) {\n const i2 = i * 2\n const c = this.sinCosTable[i2]\n const s = this.sinCosTable[i2 + 1]\n const re = real[i]\n const im = imag[i]\n\n const r1 = re * c + im * s\n const i1 = re * s - im * c\n\n output[n34 - 1 - i2] = r1\n output[n34 + i2] = r1\n output[n4 + i2] = i1\n output[n4 - 1 - i2] = -i1\n }\n\n for (let i = this.fftSize / 2; i < this.fftSize; i++) {\n const idx = (i - this.fftSize / 2) * 2 + n4\n const i2 = i * 2\n const c = this.sinCosTable[i2]\n const s = this.sinCosTable[i2 + 1]\n const re = real[i]\n const im = imag[i]\n\n const r1 = re * c + im * s\n const i1 = re * s - im * c\n\n output[n34 - 1 - idx] = r1\n output[idx - n4] = -r1\n output[n4 + idx] = i1\n output[5 * n4 - 1 - idx] = i1\n }\n\n return output\n }\n}\n\n// Pre-instantiated transforms\nexport const mdct64 = new MDCT(MDCT_SIZE_SHORT, 0.5)\nexport const mdct256 = new MDCT(MDCT_SIZE_MID, 0.5)\nexport const mdct512 = new MDCT(MDCT_SIZE_LONG, 1.0)\n\nexport const imdct64 = new IMDCT(MDCT_SIZE_SHORT, MDCT_SIZE_SHORT * 4)\nexport const imdct256 = new IMDCT(MDCT_SIZE_MID, MDCT_SIZE_MID * 4)\nexport const imdct512 = new IMDCT(MDCT_SIZE_LONG, MDCT_SIZE_LONG * 2)\n\n/**\n * Perform overlap-add operation for MDCT reconstruction\n * @param {Float32Array} prev - Previous block samples\n * @param {Float32Array} curr - Current block samples\n * @param {Float32Array} window - Window function coefficients\n * @returns {Float32Array} Overlap-added output samples\n */\nexport function overlapAdd(prev, curr, window) {\n const size = prev.length\n const output = new Float32Array(size * 2)\n\n for (let i = 0; i < size; i++) {\n const w1 = window[i]\n const w2 = window[2 * size - 1 - i]\n const p = prev[i]\n const c = curr[size - 1 - i]\n\n output[i] = p * w2 - c * w1\n output[2 * size - 1 - i] = p * w1 + c * w2\n }\n\n return output\n}\n","/**\n * Carta1 Audio Codec - Quantization\n *\n * This module implements quantization and dequantization of MDCT coefficients\n * for the ATRAC1 audio codec, organizing coefficients into Block Floating Units (BFUs)\n * and applying appropriate scale factors for optimal bit allocation.\n */\n\nimport {\n SPECS_PER_BFU,\n BFU_START_LONG,\n BFU_START_SHORT,\n BFU_BAND_BOUNDARIES,\n SCALE_FACTORS,\n QUANTIZATION_SIGN_BIT_SHIFT,\n} from '../core/constants.js'\n\n/**\n * Find the optimal scale factor index for a set of coefficients\n * @param {Float32Array} coefficients - MDCT coefficients to analyze\n * @returns {number} Scale factor index (0-63)\n */\nexport function findScaleFactor(coefficients) {\n let maxAmplitude = 0\n\n for (let i = 0; i < coefficients.length; i++) {\n maxAmplitude = Math.max(maxAmplitude, Math.abs(coefficients[i]))\n }\n\n if (maxAmplitude === 0) return 0\n\n // Binary search for optimal scale factor\n let low = 0\n let high = SCALE_FACTORS.length - 1\n\n while (low < high) {\n const mid = (low + high) >> 1\n if (maxAmplitude <= SCALE_FACTORS[mid]) {\n high = mid\n } else {\n low = mid + 1\n }\n }\n\n return low\n}\n\n/**\n * Quantize floating-point coefficients to integer values\n * @param {Float32Array} coefficients - Input coefficients to quantize\n * @param {number} scaleFactorIndex - Index into SCALE_FACTORS table\n * @param {number} bitsPerSample - Number of bits per quantized sample\n * @returns {Int32Array} Quantized integer coefficients\n */\nexport function quantize(coefficients, scaleFactorIndex, bitsPerSample) {\n if (bitsPerSample === 0 || scaleFactorIndex === 0) {\n return new Int32Array(coefficients.length)\n }\n\n const scaleFactor = SCALE_FACTORS[scaleFactorIndex]\n const quantRange = (1 << (bitsPerSample - QUANTIZATION_SIGN_BIT_SHIFT)) - 1\n const normFactor = quantRange / scaleFactor\n\n const quantized = new Int32Array(coefficients.length)\n\n for (let i = 0; i < coefficients.length; i++) {\n const normalized = coefficients[i] * normFactor\n quantized[i] = Math.max(\n -quantRange - 1,\n Math.min(quantRange, Math.round(normalized))\n )\n }\n\n return quantized\n}\n\n/**\n * Dequantize integer coefficients back to floating-point values\n * @param {Int32Array} quantized - Quantized integer coefficients\n * @param {number} scaleFactorIndex - Index into SCALE_FACTORS table\n * @param {number} bitsPerSample - Number of bits per quantized sample\n * @returns {Float32Array} Dequantized floating-point coefficients\n */\nexport function dequantize(quantized, scaleFactorIndex, bitsPerSample) {\n if (bitsPerSample === 0 || scaleFactorIndex === 0) {\n return new Float32Array(quantized.length)\n }\n\n const scaleFactor = SCALE_FACTORS[scaleFactorIndex]\n const quantRange = (1 << (bitsPerSample - QUANTIZATION_SIGN_BIT_SHIFT)) - 1\n const denormFactor = scaleFactor / quantRange\n\n const dequantized = new Float32Array(quantized.length)\n\n for (let i = 0; i < quantized.length; i++) {\n dequantized[i] = quantized[i] * denormFactor\n }\n\n return dequantized\n}\n\n/**\n * Group MDCT coefficients into Block Floating Units (BFUs)\n * @param {Float32Array} coefficients - Input MDCT coefficients\n * @param {number[]} blockModes - Block mode for each band (0=long, 1=short)\n * @param {Array<Float32Array>} bfuBuffers - Optional pre-allocated BFU buffers\n * @returns {Object} Object containing bfuData, bfuSizes, and bfuCount\n */\nexport function groupIntoBFUs(coefficients, blockModes, bfuBuffers = null) {\n const bfuData = bfuBuffers ?? []\n const bfuSizes = []\n\n let coeffIndex = 0\n let bfuIndex = 0\n\n for (let band = 0; band < 3; band++) {\n const bandStart = coeffIndex\n const bandSize = band === 2 ? 256 : 128\n const bandEnd = band < 2 ? BFU_BAND_BOUNDARIES[band] : SPECS_PER_BFU.length\n const isLongBlock = blockModes[band] === 0\n const startPositions = isLongBlock ? BFU_START_LONG : BFU_START_SHORT\n\n while (bfuIndex < bandEnd) {\n const size = SPECS_PER_BFU[bfuIndex]\n const startPos = startPositions[bfuIndex] - bandStart\n\n const bfu = bfuBuffers ? bfuBuffers[bfuIndex] : new Float32Array(size)\n bfu.fill(0) // Clear the buffer\n\n if (startPos >= 0 && startPos < bandSize) {\n const endPos = Math.min(startPos + size, bandSize)\n const actualSize = endPos - startPos\n\n for (let i = 0; i < actualSize; i++) {\n bfu[i] = coefficients[bandStart + startPos + i]\n }\n }\n\n if (!bfuBuffers) {\n bfuData.push(bfu)\n }\n bfuSizes.push(size)\n bfuIndex++\n }\n\n coeffIndex += bandSize\n }\n\n return { bfuData, bfuSizes, bfuCount: bfuIndex }\n}\n","/**\n * Carta1 Audio Codec - Bit Allocation Module\n *\n * This module implements the bit allocation algorithm for ATRAC1 compression,\n * distributing available bits among Block Floating Units (BFUs) based on\n * psychoacoustic masking and signal-to-mask ratios.\n */\n\nimport {\n FRAME_BITS,\n FRAME_OVERHEAD_BITS,\n BITS_PER_BFU_METADATA,\n BFU_AMOUNTS,\n MAX_WORD_LENGTH_INDEX,\n WORD_LENGTH_BITS,\n DISTORTION_DELTA_DB,\n NUM_BFUS,\n SAMPLE_RATE,\n BFU_FREQUENCIES,\n BFU_AMOUNTS_COUNT,\n PSYMODEL_MIN_POWER_DB,\n PSYMODEL_CB_FREQ_INDICES,\n INTERPOLATION_COMPENSATION_FACTOR,\n PSYMODEL_FFT_SIZE,\n} from '../core/constants.js'\n\n/**\n * Allocate bits to BFUs based on psychoacoustic analysis\n * @param {Object} psychoResults - Psychoacoustic analysis results\n * @param {Array} bfuData - BFU coefficient data\n * @param {Array} bfuSizes - Size of each BFU\n * @param {number} maxBfuCount - Maximum number of BFUs to use\n * @returns {Object} Allocation results with BFU count and bit distribution\n */\nexport function allocateBits(psychoResults, bfuData, bfuSizes, maxBfuCount) {\n // Calculate signal energy for each BFU\n const signalEnergyDb = calculateBfuEnergy(bfuData, bfuSizes, maxBfuCount)\n\n // Interpolate critical band thresholds to BFUs\n const maskThresholdDb = interpolateCriticalBandsToBfus(\n psychoResults.criticalBandThresholds\n )\n\n // Calculate Signal-to-Mask Ratios\n const smrValues = calculateSMR(signalEnergyDb, maskThresholdDb, maxBfuCount)\n\n // Determine optimal number of BFUs to use\n const actualBfuCount = selectOptimalBfuCount(\n smrValues,\n signalEnergyDb,\n maxBfuCount\n )\n\n // Calculate available bits for allocation\n const availableBits =\n FRAME_BITS - FRAME_OVERHEAD_BITS - actualBfuCount * BITS_PER_BFU_METADATA\n\n // Perform actual bit allocation\n const allocation = performBitAllocation(\n actualBfuCount,\n smrValues,\n bfuSizes,\n availableBits\n )\n\n return {\n bfuCount: actualBfuCount,\n allocation,\n }\n}\n\n/**\n * Calculate energy in dB for each BFU\n * @param {Array} bfuData - BFU coefficient data\n * @param {Array} bfuSizes - Size of each BFU\n * @param {number} bfuCount - Number of BFUs to process\n * @returns {Float32Array} Energy values in dB\n */\nfunction calculateBfuEnergy(bfuData, bfuSizes, bfuCount) {\n const energyPerBfu = new Float32Array(bfuCount)\n\n for (let i = 0; i < bfuCount; i++) {\n const data = bfuData[i]\n const size = bfuSizes[i]\n\n if (size === 0) {\n energyPerBfu[i] = PSYMODEL_MIN_POWER_DB\n continue\n }\n\n // Calculate mean square energy\n let energy = 0\n for (let j = 0; j < size; j++) {\n energy += data[j] * data[j]\n }\n\n // Convert to dB correctly using log10\n energyPerBfu[i] =\n energy > 0 ? 10 * Math.log10(energy / size) : PSYMODEL_MIN_POWER_DB\n }\n\n return energyPerBfu\n}\n\n/**\n * Interpolate critical band thresholds directly to BFU frequencies\n * @param {Float32Array} criticalBandThresholds - Critical band thresholds\n * @returns {Float32Array} Masking threshold per BFU\n */\nfunction interpolateCriticalBandsToBfus(criticalBandThresholds) {\n const maskThresholdPerBfu = new Float32Array(NUM_BFUS)\n const freqPerBin = SAMPLE_RATE / PSYMODEL_FFT_SIZE\n\n for (let i = 0; i < NUM_BFUS; i++) {\n const bfuFreq = BFU_FREQUENCIES[i]\n const fftBinIndex = Math.round(bfuFreq / freqPerBin)\n\n // Find which critical bands surround this FFT bin\n let bandIndex = 0\n while (\n bandIndex < PSYMODEL_CB_FREQ_INDICES.length - 1 &&\n PSYMODEL_CB_FREQ_INDICES[bandIndex + 1] < fftBinIndex\n ) {\n bandIndex++\n }\n\n if (fftBinIndex <= PSYMODEL_CB_FREQ_INDICES[0]) {\n maskThresholdPerBfu[i] = criticalBandThresholds[0]\n } else if (\n fftBinIndex >=\n PSYMODEL_CB_FREQ_INDICES[PSYMODEL_CB_FREQ_INDICES.length - 1]\n ) {\n maskThresholdPerBfu[i] =\n criticalBandThresholds[criticalBandThresholds.length - 1]\n } else {\n const x0 = PSYMODEL_CB_FREQ_INDICES[bandIndex]\n const x1 = PSYMODEL_CB_FREQ_INDICES[bandIndex + 1]\n const y0 = criticalBandThresholds[bandIndex]\n const y1 = criticalBandThresholds[bandIndex + 1]\n const bandWidth = x1 - x0\n\n if (bandWidth > 0) {\n const t = (fftBinIndex - x0) / bandWidth\n const interpolated = y0 + (y1 - y0) * t\n const compensation =\n Math.abs(y1 - y0) * INTERPOLATION_COMPENSATION_FACTOR\n maskThresholdPerBfu[i] = interpolated + compensation\n } else {\n maskThresholdPerBfu[i] = y0\n }\n }\n }\n\n return maskThresholdPerBfu\n}\n\n/**\n * Calculate Signal-to-Mask Ratio for each BFU\n * @param {Float32Array} signalEnergyDb - Signal energy per BFU\n * @param {Float32Array} maskThresholdDb - Masking threshold per BFU\n * @param {number} maxBfuCount - Maximum number of BFUs\n * @returns {Float32Array} SMR values in dB\n */\nfunction calculateSMR(signalEnergyDb, maskThresholdDb, maxBfuCount) {\n const smrValues = new Float32Array(maxBfuCount)\n\n for (let bfu = 0; bfu < maxBfuCount; bfu++) {\n smrValues[bfu] =\n signalEnergyDb[bfu] <= PSYMODEL_MIN_POWER_DB\n ? -Infinity\n : signalEnergyDb[bfu] - maskThresholdDb[bfu]\n }\n\n return smrValues\n}\n\n/**\n * Select optimal number of BFUs to use based on SMR distribution\n * @param {Float32Array} smrValues - Signal-to-Mask ratios\n * @param {Float32Array} signalEnergyDb - Signal energy per BFU\n * @param {number} maxBfuCount - Maximum available BFUs\n * @returns {number} Optimal BFU count\n */\nfunction selectOptimalBfuCount(smrValues, signalEnergyDb, maxBfuCount) {\n // Check if we have any audible content (positive SMR)\n const hasAudibleContent = smrValues.some((smr) => smr > 0)\n\n if (hasAudibleContent) {\n // Create sorted list of BFUs by their contribution (positive SMR only)\n const contributions = []\n for (let i = 0; i < maxBfuCount; i++) {\n if (smrValues[i] > 0) {\n contributions.push({ index: i, smr: smrValues[i] })\n }\n }\n contributions.sort((a, b) => b.smr - a.smr)\n\n if (contributions.length === 0) {\n return BFU_AMOUNTS[BFU_AMOUNTS.length - 1]\n }\n\n // Find the natural cutoff using gradient of cumulative SMR\n const cumulativeSMR = []\n let sum = 0\n for (let i = 0; i < contributions.length; i++) {\n sum += contributions[i].smr\n cumulativeSMR.push(sum)\n }\n\n // Find where the gradient becomes shallow (diminishing returns)\n for (const candidateCount of BFU_AMOUNTS) {\n if (candidateCount > maxBfuCount) continue\n\n // Check if all significant contributions fit within this count\n const requiredBfus = contributions\n .slice(0, Math.min(contributions.length, candidateCount))\n .map((c) => c.index)\n\n const maxRequiredIndex = Math.max(...requiredBfus, 0)\n\n if (maxRequiredIndex < candidateCount) {\n // Check if we've captured the bulk of the contribution\n const capturedIndex = Math.min(\n candidateCount - 1,\n contributions.length - 1\n )\n if (capturedIndex >= contributions.length - 1) {\n return candidateCount\n }\n\n // Use gradient to detect diminishing returns\n const remainingIndices = contributions.length - capturedIndex - 1\n if (remainingIndices > 0) {\n const avgRemaining =\n (cumulativeSMR[cumulativeSMR.length - 1] -\n cumulativeSMR[capturedIndex]) /\n remainingIndices\n const avgCaptured = cumulativeSMR[capturedIndex] / (capturedIndex + 1)\n\n // If remaining BFUs contribute much less on average, we've found our cutoff\n if (avgRemaining < avgCaptured * 0.1) {\n return candidateCount\n }\n }\n }\n }\n } else {\n // Find the highest BFU index that contains actual signal\n let highestSignalBfu = -1\n for (let i = maxBfuCount - 1; i >= 0; i--) {\n if (\n signalEnergyDb[i] > PSYMODEL_MIN_POWER_DB &&\n smrValues[i] > -Infinity\n ) {\n highestSignalBfu = i\n break\n }\n }\n\n // Find smallest BFU count that includes all signal\n for (const candidateCount of BFU_AMOUNTS) {\n if (candidateCount > highestSignalBfu) {\n return candidateCount\n }\n }\n }\n\n return BFU_AMOUNTS[BFU_AMOUNTS_COUNT - 1]\n}\n\n/**\n * Allocate available bits among BFUs using a greedy algorithm\n * @param {number} actualBfuCount - Number of BFUs to allocate\n * @param {Float32Array} smrValues - Signal-to-Mask ratios\n * @param {Array} bfuSizes - Size of each BFU\n * @param {number} availableBits - Total bits available for allocation\n * @returns {Int32Array} Word length index allocation per BFU\n */\nfunction performBitAllocation(\n actualBfuCount,\n smrValues,\n bfuSizes,\n availableBits\n) {\n const allocation = new Int32Array(actualBfuCount)\n const heap = []\n\n // Initialize heap with BFUs that have signal\n for (let i = 0; i < actualBfuCount; i++) {\n if (smrValues[i] > -Infinity) {\n heap.push({ bfu: i, priority: smrValues[i] })\n }\n }\n\n // Build max heap\n for (let i = Math.floor(heap.length / 2) - 1; i >= 0; i--) {\n heapifyDown(heap, i)\n }\n\n // Greedy allocation\n while (heap.length > 0 && availableBits > 0) {\n const bestBfu = heap[0]\n const currentWl = allocation[bestBfu.bfu]\n\n if (currentWl >= MAX_WORD_LENGTH_INDEX) {\n heap[0] = heap[heap.length - 1]\n heap.pop()\n if (heap.length > 0) heapifyDown(heap, 0)\n continue\n }\n\n const upgradeCost = calculateUpgradeCost(bestBfu.bfu, currentWl, bfuSizes)\n\n if (upgradeCost <= availableBits) {\n availableBits -= upgradeCost\n allocation[bestBfu.bfu]++\n bestBfu.priority += DISTORTION_DELTA_DB[currentWl]\n heapifyDown(heap, 0)\n } else {\n heap[0] = heap[heap.length - 1]\n heap.pop()\n if (heap.length > 0) heapifyDown(heap, 0)\n }\n }\n\n return allocation\n}\n\n/**\n * Calculate bit cost to upgrade a BFU's word length\n * @param {number} bfuIndex - Index of the BFU to upgrade\n * @param {number} currentWl - Current word length of the BFU\n * @param {number[]} bfuSizes - Array of BFU sizes (number of coefficients per BFU)\n * @returns {number} Additional bits required to upgrade word length by 1\n */\nfunction calculateUpgradeCost(bfuIndex, currentWl, bfuSizes) {\n const currentBits = WORD_LENGTH_BITS[currentWl] * bfuSizes[bfuIndex]\n const nextBits = WORD_LENGTH_BITS[currentWl + 1] * bfuSizes[bfuIndex]\n return nextBits - currentBits\n}\n\n/**\n * Maintain max heap property by moving element down\n * @param {Array} heap - Heap array\n * @param {number} startIdx - Starting index\n */\nfunction heapifyDown(heap, startIdx) {\n const length = heap.length\n const element = heap[startIdx]\n\n while (true) {\n const leftChild = 2 * startIdx + 1\n const rightChild = 2 * startIdx + 2\n let largest = startIdx\n let largestPriority = element.priority\n\n if (leftChild < length && heap[leftChild].priority > largestPriority) {\n largest = leftChild\n largestPriority = heap[leftChild].priority\n }\n\n if (rightChild < length && heap[rightChild].priority > largestPriority) {\n largest = rightChild\n }\n\n if (largest === startIdx) break\n\n heap[startIdx] = heap[largest]\n startIdx = largest\n }\n\n heap[startIdx] = element\n}\n","/**\n * Carta1 Audio Codec - Buffer Management\n */\n\nimport {\n NUM_BFUS,\n MAX_BFU_SIZE,\n QMF_DELAY,\n QMF_HIGH_BAND_DELAY,\n} from './constants.js'\n\nexport class BufferPool {\n constructor() {\n // Transform buffers\n this.transformBuffers = {\n 64: new Float32Array(64),\n 128: new Float32Array(128),\n 256: new Float32Array(256),\n 512: new Float32Array(512),\n }\n\n // QMF work buffers\n this.qmfWorkBuffers = {\n delay: {\n 128: new Float32Array(QMF_DELAY + 128),\n 256: new Float32Array(QMF_DELAY + 256),\n 512: new Float32Array(QMF_DELAY + 512),\n },\n highBandDelay: {\n 128: new Float32Array(QMF_HIGH_BAND_DELAY + 128),\n 256: new Float32Array(QMF_HIGH_BAND_DELAY + 256),\n },\n }\n\n // QMF delay lines\n this.qmfDelays = {\n lowBand: new Float32Array(QMF_DELAY),\n midBand: new Float32Array(QMF_DELAY),\n highBand: new Float32Array(QMF_HIGH_BAND_DELAY),\n }\n\n // Transient detector\n this.transientDetection = [\n new Float32Array(64),\n new Float32Array(64),\n new Float32Array(128),\n ]\n\n // MDCT/IMDCT work buffers\n this.mdctBuffers = {\n 16: {\n real: new Float32Array(16),\n imag: new Float32Array(16),\n },\n 64: {\n real: new Float32Array(64),\n imag: new Float32Array(64),\n },\n 128: {\n real: new Float32Array(128),\n imag: new Float32Array(128),\n },\n }\n\n // MDCT overlap buffers (encoder)\n this.mdctOverlap = [\n new Float32Array(32),\n new Float32Array(32),\n new Float32Array(32),\n ]\n\n // IMDCT overlap buffers (decoder)\n this.imdctOverlap = [\n new Float32Array(256),\n new Float32Array(256),\n new Float32Array(512),\n ]\n\n // Spectrum reversal buffers\n this.reversalBuffers = {\n 32: new Float32Array(32),\n 128: new Float32Array(128),\n 256: new Float32Array(256),\n }\n\n // Bit allocation buffers\n this.bfuData = new Array(NUM_BFUS)\n for (let i = 0; i < NUM_BFUS; i++) {\n this.bfuData[i] = new Float32Array(MAX_BFU_SIZE)\n }\n }\n}\n","/**\n * Carta1 Audio Codec - Transient Detection Module\n *\n * Detects transients using spectral flux analysis to prevent pre-echo artifacts.\n * Combines multiple spectral features to identify sudden changes in signal\n * characteristics that require special handling during encoding.\n */\n\nimport { FFT } from '../transforms/fft.js'\n\n/**\n * Perform FFT on time-domain samples and return magnitude spectrum\n * @param {Float32Array} samples - Time-domain samples\n * @param {number} fftSize - FFT size (must be power of 2)\n * @returns {Float32Array} Magnitude spectrum (positive frequencies only)\n */\nexport function performFFT(samples, fftSize) {\n const real = new Float32Array(fftSize)\n const imag = new Float32Array(fftSize)\n\n // Copy samples with zero-padding if necessary\n const copyLen = Math.min(samples.length, fftSize)\n real.set(samples.subarray(0, copyLen))\n\n // Perform FFT\n FFT.fft(real, imag)\n\n // Calculate magnitude spectrum for positive frequencies\n const magnitude = new Float32Array(fftSize / 2)\n for (let i = 0; i < fftSize / 2; i++) {\n magnitude[i] = Math.sqrt(real[i] * real[i] + imag[i] * imag[i])\n }\n\n return magnitude\n}\n\n/**\n * Detect transients by analyzing spectral changes between frames\n * @param {Float32Array} currentCoeffs - Current frame coefficients\n * @param {Float32Array} prevCoeffs - Previous frame coefficients\n * @param {number} threshold - Detection threshold\n * @returns {boolean} True if transient detected\n */\nexport function detectTransient(currentCoeffs, prevCoeffs, threshold) {\n // Can't detect transients without previous frame\n if (!prevCoeffs) return false\n\n // Calculate all spectral features\n const features = calculateSpectralFeatures(currentCoeffs, prevCoeffs)\n\n // Combine features using perceptually-motivated weighting\n const transientScore = calculateTransientScore(features)\n\n return transientScore > threshold\n}\n\n/**\n * Calculate all spectral features for transient detection\n * @param {Float32Array} currentCoeffs - Current frame coefficients\n * @param {Float32Array} prevCoeffs - Previous frame coefficients\n * @returns {Object} Computed spectral features\n */\nfunction calculateSpectralFeatures(currentCoeffs, prevCoeffs) {\n // Calculate spectral flux (positive differences only)\n const spectralFlux = calculateSpectralFlux(currentCoeffs, prevCoeffs)\n\n // Calculate spectral flatness for both frames\n const currentFlatness = calculateSpectralFlatness(currentCoeffs)\n const prevFlatness = calculateSpectralFlatness(prevCoeffs)\n const flatnessChange = Math.abs(currentFlatness - prevFlatness)\n\n // Calculate high-frequency content ratio\n const currentHfRatio = calculateHighFrequencyRatio(currentCoeffs)\n const prevHfRatio = calculateHighFrequencyRatio(prevCoeffs)\n const hfChange = Math.abs(currentHfRatio - prevHfRatio)\n\n // Calculate energy change in dB\n const energyChange = calculateEnergyChange(currentCoeffs, prevCoeffs)\n\n return {\n spectralFlux,\n flatnessChange,\n hfChange,\n energyChange,\n }\n}\n\n/**\n * Calculate normalized spectral flux (positive spectral differences)\n * High values indicate sudden onset of new spectral components\n */\nfunction calculateSpectralFlux(currentCoeffs, prevCoeffs) {\n let flux = 0\n let currentEnergy = 0\n\n for (let i = 0; i < currentCoeffs.length; i++) {\n const currentMag = Math.abs(currentCoeffs[i])\n const prevMag = Math.abs(prevCoeffs[i])\n\n // Only count positive differences (new energy)\n const diff = currentMag - prevMag\n if (diff > 0) {\n flux += diff\n }\n\n currentEnergy += currentMag * currentMag\n }\n\n // Normalize by current frame energy to make threshold independent of level\n const normalization = Math.sqrt(currentEnergy) || 1e-6\n return flux / normalization\n}\n\n/**\n * Calculate spectral flatness (geometric mean / arithmetic mean)\n * Measures how noise-like vs tonal the spectrum is\n * @param {Float32Array} coeffs - Spectral coefficients\n * @returns {number} Flatness measure (0 = tonal, 1 = noise-like)\n */\nfunction calculateSpectralFlatness(coeffs) {\n const EPSILON = 1e-10\n let sumLog = 0\n let sumLinear = 0\n let validBins = 0\n\n for (let i = 0; i < coeffs.length; i++) {\n const magnitude = Math.abs(coeffs[i])\n if (magnitude > EPSILON) {\n sumLog += Math.log(magnitude)\n sumLinear += magnitude\n validBins++\n }\n }\n\n if (validBins === 0) return 0\n\n const geometricMean = Math.exp(sumLog / validBins)\n const arithmeticMean = sumLinear / validBins\n\n return arithmeticMean > EPSILON ? geometricMean / arithmeticMean : 0\n}\n\n/**\n * Calculate ratio of high-frequency to total energy\n * High values indicate bright/harsh sounds that are perceptually important\n * @param {Float32Array} coeffs - Spectral coefficients\n * @returns {number} High-frequency energy ratio (0-1)\n */\nfunction calculateHighFrequencyRatio(coeffs) {\n const midPoint = Math.floor(coeffs.length / 2)\n let lowEnergy = 0\n let highEnergy = 0\n\n for (let i = 0; i < midPoint; i++) {\n lowEnergy += coeffs[i] * coeffs[i]\n }\n\n for (let i = midPoint; i < coeffs.length; i++) {\n highEnergy += coeffs[i] * coeffs[i]\n }\n\n const totalEnergy = lowEnergy + highEnergy\n return totalEnergy > 0 ? highEnergy / totalEnergy : 0\n}\n\n/**\n * Calculate energy change between frames in dB\n * @param {Float32Array} currentCoeffs - Current frame coefficients\n * @param {Float32Array} prevCoeffs - Previous frame coefficients\n * @returns {number} Energy change in dB (positive values only)\n */\nfunction calculateEnergyChange(currentCoeffs, prevCoeffs) {\n let currentEnergy = 0\n let prevEnergy = 0\n\n for (let i = 0; i < currentCoeffs.length; i++) {\n currentEnergy += currentCoeffs[i] * currentCoeffs[i]\n prevEnergy += prevCoeffs[i] * prevCoeffs[i]\n }\n\n // Avoid log of zero and ensure minimum energy\n currentEnergy = Math.max(currentEnergy, 1e-10)\n prevEnergy = Math.max(prevEnergy, 1e-10)\n\n const changeDb = 10 * Math.log10(currentEnergy / prevEnergy)\n\n // Only interested in energy increases (potential transients)\n return Math.max(0, changeDb)\n}\n\n/**\n * Calculate unified transient score from spectral features\n * Uses perceptually-motivated combination instead of magic numbers\n * @param {Object} features - Spectral features\n * @returns {number} Transient score\n */\nfunction calculateTransientScore(features) {\n const { spectralFlux, flatnessChange, hfChange, energyChange } = features\n\n // Spectral flux is the primary indicator - it directly measures\n // sudden onset of new frequency components\n const fluxContribution = spectralFlux\n\n // Flatness change indicates transition between tonal and noise-like\n // signals (e.g., pitched to unpitched percussion)\n // Scale by sqrt to reduce dominance\n const flatnessContribution = Math.sqrt(flatnessChange)\n\n // High-frequency changes are perceptually important but shouldn't\n // dominate the decision. Use log scaling for perceptual relevance\n const hfContribution = Math.log1p(hfChange * 10) / Math.log1p(10)\n\n // Energy changes in dB are already perceptually scaled\n // Normalize to 0-1 range assuming 30dB is a strong transient\n const energyContribution = Math.min(energyChange / 30, 1)\n\n // Combine features with equal perceptual importance\n // Each contribution is normalized to roughly 0-1 range\n return (\n (fluxContribution +\n flatnessContribution +\n hfContribution +\n energyContribution) /\n 4\n )\n}\n","/**\n * Carta1 Audio Codec - MDCT-based Psychoacoustic Analysis\n *\n * This module implements the psychoacoustic model for ATRAC1 compression,\n * analyzing audio signals to determine masking thresholds for perceptual coding.\n */\n\nimport {\n PSYMODEL_MIN_POWER_DB,\n PSYMODEL_NOT_EXAMINED,\n PSYMODEL_TONAL,\n PSYMODEL_FFT_SIZE,\n PSYMODEL_NON_TONAL,\n PSYMODEL_IRRELEVANT,\n PSYMODEL_LOG10_FACTOR,\n PSYMODEL_POW10_FACTOR,\n PSYMODEL_CRITICAL_BANDS,\n PSYMODEL_THRESHOLD_TABLE,\n PSYMODEL_FREQ_TO_CB_MAP,\n PSYMODEL_PSD_SOURCE_IDX0,\n PSYMODEL_PSD_INTERP_WEIGHT,\n PSYMODEL_PSD_SOURCE_IDX1,\n} from '../core/constants.js'\n\n/**\n * Convert linear power value to decibels\n * @param {number} value - Linear power value\n * @returns {number} Power in decibels\n */\nexport function toDb(value) {\n return value > 0\n ? PSYMODEL_LOG10_FACTOR * Math.log(value)\n : PSYMODEL_MIN_POWER_DB\n}\n\n/**\n * Convert decibels to linear power value\n * @param {number} db - Power in decibels\n * @returns {number} Linear power value\n */\nexport function fromDb(db) {\n return Math.exp(db * PSYMODEL_POW10_FACTOR)\n}\n\n/**\n * Perform complete psychoacoustic analysis on MDCT coefficients\n * @param {Float32Array} mdctCoeffs - MDCT coefficients (512 samples)\n * @param {number} normalizationDb - Target maximum power level in dB\n * @returns {Object} Analysis results including PSD, maskers, and thresholds\n */\nexport function psychoAnalysis(mdctCoeffs, normalizationDb) {\n const fftScale = PSYMODEL_FFT_SIZE / 512\n\n // Calculate power spectral density\n const psd = calculatePSDFromMDCT(mdctCoeffs, normalizationDb)\n\n // Find tonal and non-tonal maskers\n const { flags, tonalMaskers, nonTonalMaskers } = findAllMaskers(psd, fftScale)\n\n // Calculate critical band masking thresholds\n const criticalBandThresholds = calculateCriticalBandThresholds(\n psd,\n tonalMaskers,\n nonTonalMaskers\n )\n\n return {\n psd,\n tonalMaskers,\n tonalMaskersCount: tonalMaskers.length,\n nonTonalMaskers,\n nonTonalMaskersCount: nonTonalMaskers.length,\n criticalBandThresholds,\n flags,\n }\n}\n\n/**\n * Calculate Power Spectral Density from MDCT coefficients\n * @param {Float32Array} mdctCoeffs - MDCT coefficients\n * @returns {Float32Array} Power spectral density in dB\n */\nfunction calculatePSDFromMDCT(mdctCoeffs, normalizationDb) {\n const half = PSYMODEL_FFT_SIZE >>> 1\n const psd = new Float32Array(half + 1)\n const linearPower = new Float32Array(half + 1)\n\n let maxLinearPower = 0\n for (let i = 0; i <= half; i++) {\n const a = mdctCoeffs[PSYMODEL_PSD_SOURCE_IDX0[i]]\n const b = mdctCoeffs[PSYMODEL_PSD_SOURCE_IDX1[i]]\n\n const power =\n a * a * (1 - PSYMODEL_PSD_INTERP_WEIGHT[i]) +\n b * b * PSYMODEL_PSD_INTERP_WEIGHT[i]\n linearPower[i] = power\n\n if (power > maxLinearPower) {\n maxLinearPower = power\n }\n }\n\n const offset =\n normalizationDb - PSYMODEL_LOG10_FACTOR * Math.log(maxLinearPower || 1)\n\n for (let i = 0; i <= half; i++) {\n const power = linearPower[i]\n if (power > 0) {\n psd[i] = PSYMODEL_LOG10_FACTOR * Math.log(power) + offset\n } else {\n psd[i] = PSYMODEL_MIN_POWER_DB\n }\n }\n\n return psd\n}\n\n/**\n * Find all maskers (tonal and non-tonal) in the spectrum\n * @param {Float32Array} psd - Power spectral density\n * @param {number} fftScale - FFT scaling factor\n * @returns {Object} Flags array and lists of maskers\n */\nfunction findAllMaskers(psd, fftScale) {\n // Initialize flags\n const flags = new Uint8Array(PSYMODEL_FFT_SIZE / 2)\n flags.fill(PSYMODEL_NOT_EXAMINED)\n\n // Find tonal maskers first\n const tonalList = findTonalMaskers(psd, flags, fftScale)\n\n // Find non-tonal maskers\n const nonTonalList = findNonTonalMaskers(flags, psd)\n\n // Apply decimation to remove weak maskers\n const decimated = decimateMaskers(flags, tonalList, nonTonalList)\n\n return {\n flags,\n tonalMaskers: decimated.tonalList,\n nonTonalMaskers: decimated.nonTonalList,\n }\n}\n\n/**\n * Detect tonal maskers (peaks in spectrum)\n * @param {Float32Array} psd - Power spectral density\n * @param {Uint8Array} flags - Component classification flags\n * @param {number} fftScale - FFT scaling factor\n * @returns {Object} Updated flags and tonal masker list\n */\nfunction findTonalMaskers(psd, flags, fftScale) {\n const tonalList = []\n const maxTonalBin = Math.floor(249 * fftScale)\n\n // Frequency range boundaries\n const RANGE_LOW = Math.floor(63 * fftScale)\n const RANGE_MID = Math.floor(127 * fftScale)\n const RANGE_HIGH = Math.floor(150 * fftScale)\n\n for (let k = 1; k < psd.length - 1 && k <= maxTonalBin; k++) {\n // Check for local maximum\n if (psd[k] <= psd[k - 1] || psd[k] < psd[k + 1]) continue\n\n // Determine search range based on frequency\n let searchOffsets\n if (k > 2 && k < RANGE_LOW) {\n searchOffsets = [-2, 2]\n } else if (k >= RANGE_LOW && k < RANGE_MID) {\n searchOffsets = [-3, -2, 2, 3]\n } else if (k >= RANGE_MID && k < RANGE_HIGH) {\n searchOffsets = [-6, -5, -4, -3, -2, 2, 3, 4, 5, 6]\n } else {\n continue\n }\n\n // Check tonality criteria\n if (isTonal(psd, k, searchOffsets)) {\n // Calculate combined SPL\n const spl = toDb(fromDb(psd[k - 1]) + fromDb(psd[k]) + fromDb(psd[k + 1]))\n tonalList.push({ index: k, spl })\n markTonalComponent(flags, k, searchOffsets)\n }\n }\n\n return tonalList\n}\n\n/**\n * Check if a peak is tonal based on surrounding bins\n * @param {Float32Array} psd - Power spectral density array\n * @param {number} k - Index of the peak to test\n * @param {number[]} offsets - Array of offset indices to check around the peak\n * @returns {boolean} True if the peak qualifies as tonal\n */\nfunction isTonal(psd, k, offsets) {\n const TONAL_THRESHOLD = 7.0\n for (const offset of offsets) {\n const idx = k + offset\n if (idx >= 0 && idx < psd.length && psd[k] - psd[idx] < TONAL_THRESHOLD) {\n return false\n }\n }\n return true\n}\n\n/**\n * Mark component and neighbors as tonal/irrelevant\n * @param {Uint8Array} flags - Component classification flags array\n * @param {number} k - Index of the tonal component\n * @param {number[]} searchOffsets - Array of offset indices used for tonal detection\n */\nfunction markTonalComponent(flags, k, searchOffsets) {\n flags[k] = PSYMODEL_TONAL\n for (const offset of [...searchOffsets, -1, 1]) {\n const idx = k + offset\n if (idx >= 0 && idx < flags.length && idx !== k) {\n flags[idx] = PSYMODEL_IRRELEVANT\n }\n }\n}\n\n/**\n * Detect non-tonal maskers (noise-like components)\n * @param {Uint8Array} flags - Component classification flags\n * @param {Float32Array} psd - Power spectral density\n * @returns {Object} Updated flags and non-tonal masker list\n */\nfunction findNonTonalMaskers(flags, psd) {\n const nonTonalList = []\n\n for (let i = 0; i < PSYMODEL_CRITICAL_BANDS.length - 1; i++) {\n const cbStart = PSYMODEL_THRESHOLD_TABLE[PSYMODEL_CRITICAL_BANDS[i]][0] - 1\n const cbEnd =\n PSYMODEL_THRESHOLD_TABLE[PSYMODEL_CRITICAL_BANDS[i + 1]][0] - 1\n\n const bandAnalysis = analyzeCriticalBand(\n psd,\n flags,\n cbStart,\n cbEnd,\n PSYMODEL_CRITICAL_BANDS[i]\n )\n\n if (bandAnalysis.powerDb > PSYMODEL_MIN_POWER_DB) {\n // Place masker at energy centroid\n let index = Math.round(cbStart + bandAnalysis.centroidOffset)\n index = Math.max(0, Math.min(index, flags.length - 1))\n\n // Avoid conflict with tonal maskers\n if (flags[index] === PSYMODEL_TONAL) {\n index = Math.min(index + 1, flags.length - 1)\n }\n\n nonTonalList.push({ index, spl: bandAnalysis.powerDb })\n flags[index] = PSYMODEL_NON_TONAL\n }\n }\n\n return nonTonalList\n}\n\n/**\n * Analyze a critical band for non-tonal masking\n * @param {Float32Array} psd - Power spectral density array\n * @param {Uint8Array} flags - Component classification flags array\n * @param {number} startBin - Starting frequency bin of the critical band\n * @param {number} endBin - Ending frequency bin of the critical band\n * @param {number} bandIndex - Critical band index for threshold table lookup\n * @returns {Object} Analysis results with power and centroid offset\n */\nfunction analyzeCriticalBand(psd, flags, startBin, endBin, bandIndex) {\n let totalPower = 0\n let weightedPower = 0\n const baseBark = PSYMODEL_THRESHOLD_TABLE[bandIndex][1]\n\n for (let k = startBin; k < endBin && k < flags.length; k++) {\n if (flags[k] === PSYMODEL_NOT_EXAMINED) {\n const power = fromDb(psd[k])\n totalPower += power\n\n if (k < PSYMODEL_FREQ_TO_CB_MAP.length) {\n const barkDiff =\n PSYMODEL_THRESHOLD_TABLE[PSYMODEL_FREQ_TO_CB_MAP[k]][1] - baseBark\n weightedPower += power * barkDiff\n }\n\n flags[k] = PSYMODEL_IRRELEVANT\n }\n }\n\n return {\n powerDb: toDb(totalPower),\n centroidOffset:\n totalPower > 0 ? (weightedPower / totalPower) * (endBin - startBin) : 0,\n }\n}\n\n/**\n * Remove weak maskers below absolute threshold\n * @param {Uint8Array} flags - Component classification flags\n * @param {Array} tonalList - List of tonal maskers\n * @param {Array} nonTonalList - List of non-tonal maskers\n * @returns {Object} Filtered masker lists\n */\nfunction decimateMaskers(flags, tonalList, nonTonalList) {\n const isAudible = (masker) => {\n const k = masker.index\n return (\n k < PSYMODEL_FREQ_TO_CB_MAP.length &&\n masker.spl >= PSYMODEL_THRESHOLD_TABLE[PSYMODEL_FREQ_TO_CB_MAP[k]][2]\n )\n }\n\n const markInaudible = (masker) => {\n if (masker.index < flags.length) {\n flags[masker.index] = PSYMODEL_IRRELEVANT\n }\n }\n\n // Filter tonal maskers\n const audibleTonal = []\n for (const tonal of tonalList) {\n if (isAudible(tonal)) {\n audibleTonal.push(tonal)\n } else {\n markInaudible(tonal)\n }\n }\n\n // Filter non-tonal maskers\n const audibleNonTonal = []\n for (const nonTonal of nonTonalList) {\n if (isAudible(nonTonal)) {\n audibleNonTonal.push(nonTonal)\n } else {\n markInaudible(nonTonal)\n }\n }\n\n return {\n tonalList: audibleTonal,\n nonTonalList: audibleNonTonal,\n }\n}\n\n/**\n * Calculate critical band masking thresholds\n * @param {Float32Array} psd - Power spectral density\n * @param {Array} tonalMaskers - List of tonal maskers\n * @param {Array} nonTonalMaskers - List of non-tonal maskers\n * @returns {Float32Array} Critical band thresholds\n */\nfunction calculateCriticalBandThresholds(psd, tonalMaskers, nonTonalMaskers) {\n const criticalBandThresholds = new Float32Array(\n PSYMODEL_CRITICAL_BANDS.length\n )\n\n // Pre-collect all maskers with their properties\n const maskers = []\n\n for (const masker of tonalMaskers) {\n const j = masker.index\n if (j < PSYMODEL_FREQ_TO_CB_MAP.length) {\n maskers.push({\n spl: masker.spl,\n psd: psd[j],\n bark: PSYMODEL_THRESHOLD_TABLE[PSYMODEL_FREQ_TO_CB_MAP[j]][1],\n isTonal: true,\n })\n }\n }\n\n for (const masker of nonTonalMaskers) {\n const j = masker.index\n if (j < PSYMODEL_FREQ_TO_CB_MAP.length) {\n maskers.push({\n spl: masker.spl,\n psd: psd[j],\n bark: PSYMODEL_THRESHOLD_TABLE[PSYMODEL_FREQ_TO_CB_MAP[j]][1],\n isTonal: false,\n })\n }\n }\n\n // Calculate threshold for each critical band\n for (let i = 0; i < PSYMODEL_CRITICAL_BANDS.length; i++) {\n const bandData = PSYMODEL_THRESHOLD_TABLE[PSYMODEL_CRITICAL_BANDS[i]]\n const maskedBark = bandData[1]\n const quietThreshold = bandData[2]\n\n // Start with threshold in quiet\n let summedEnergy = fromDb(quietThreshold)\n\n // Add contributions from all maskers\n for (const masker of maskers) {\n const barkDistance = maskedBark - masker.bark\n\n // Check if within masking range\n if (barkDistance >= -3 && barkDistance < 8) {\n const maskedDb = calculateMaskingLevel(\n masker.spl,\n masker.psd,\n masker.bark,\n barkDistance,\n masker.isTonal\n )\n summedEnergy += fromDb(maskedDb)\n }\n }\n\n criticalBandThresholds[i] = toDb(summedEnergy)\n }\n\n return criticalBandThresholds\n}\n\n/**\n * Calculate energy contributions from a set of maskers\n * @param {number} maskerSpl - Sound pressure level of the masker in dB\n * @param {number} maskerPsd - Power spectral density of the masker in dB\n * @param {number} maskerBark - Bark frequency of the masker\n * @param {number} barkDistance - Distance in Bark scale from masker to maskee\n * @param {boolean} isTonal - Whether the masker is tonal or non-tonal\n * @returns {number} Masking threshold contribution in dB\n */\nfunction calculateMaskingLevel(\n maskerSpl,\n maskerPsd,\n maskerBark,\n barkDistance,\n isTonal\n) {\n const tonalOffset = isTonal\n ? -1.525 - 0.275 * maskerBark - 4.5\n : -1.525 - 0.175 * maskerBark - 0.5\n\n const psdFactor1 = 0.4 * maskerPsd + 6.0\n const psdFactor2 = 0.15 * maskerPsd\n\n let maskingFunction\n if (barkDistance < -1.0) {\n maskingFunction = 17.0 * (barkDistance + 1.0) - psdFactor1\n } else if (barkDistance < 0.0) {\n maskingFunction = psdFactor1 * barkDistance\n } else if (barkDistance < 1.0) {\n maskingFunction = -17.0 * barkDistance\n } else {\n maskingFunction = -(barkDistance - 1.0) * (17.0 - psdFactor2) - 17.0\n }\n\n return maskerSpl + tonalOffset + maskingFunction\n}\n","/**\n * Carta1 Audio Codec - Encoding Pipeline\n *\n * The encoding pipeline transforms PCM audio samples into ATRAC1 compressed format\n * through a series of processing stages:\n *\n * 1. QMF Analysis: Splits audio into frequency bands using quadrature mirror filters\n * 2. Block Selection: Detects transients to choose appropriate transform block sizes\n * 3. MDCT Transform: Applies Modified Discrete Cosine Transform to frequency bands\n * 4. Quantization: Performs psychoacoustic analysis, bit allocation, and quantization\n *\n * Each stage is implemented as a functional pipeline component that can be composed\n * using the pipe utility. The pipeline maintains state through a shared context\n * containing buffer pools and encoding options.\n */\n\nimport {\n pipe,\n throwError,\n reverseSpectrum,\n calculateBandOffset,\n} from '../utils.js'\nimport { qmfAnalysis } from '../transforms/qmf.js'\nimport { mdct64, mdct256, mdct512 } from '../transforms/mdct.js'\nimport {\n groupIntoBFUs,\n findScaleFactor,\n quantize,\n} from '../coding/quantization.js'\nimport { allocateBits } from '../coding/bitallocation.js'\nimport { BufferPool } from '../core/buffers.js'\nimport { EncoderOptions } from '../core/options.js'\nimport {\n WORD_LENGTH_BITS,\n WINDOW_SHORT,\n FFT_SIZE_LOW,\n FFT_SIZE_MID,\n FFT_SIZE_HIGH,\n MDCT_SIZE_SHORT,\n MDCT_SIZE_MID,\n MDCT_SIZE_LONG,\n MDCT_BAND_CONFIGS,\n MDCT_SHORT_BLOCK_SIZE,\n MDCT_OVERLAP_SIZE,\n} from '../core/constants.js'\nimport { performFFT, detectTransient } from '../analysis/transient.js'\nimport { psychoAnalysis } from '../analysis/psychoacoustics.js'\n\n/**\n * QMF Analysis Stage - Splits audio into frequency bands\n *\n * Performs two-stage QMF analysis to decompose the input signal into three bands:\n * - Low band (0-5.5kHz): processed at full resolution\n * - Mid band (5.5-11kHz): processed at half resolution\n * - High band (11-22kHz): processed at quarter resolution with delay compensation\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes PCM samples\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function qmfAnalysisStage(context) {\n const bufferPool =\n context?.bufferPool ??\n throwError('qmfAnalysisStage: bufferPool is required')\n const delays = bufferPool.qmfDelays\n\n /**\n * Process PCM samples through QMF analysis\n * @param {Float32Array} pcmSamples - Input PCM samples\n * @returns {Object} Analysis result containing frequency bands\n * @returns {Array<Float32Array>} returns.bands - Three frequency bands [low, mid, high]\n */\n return (pcmSamples) => {\n const stage1 = qmfAnalysis(\n pcmSamples,\n delays.lowBand,\n bufferPool.qmfWorkBuffers\n )\n delays.lowBand = stage1.newDelay\n\n const stage2 = qmfAnalysis(\n stage1.lowBand,\n delays.midBand,\n bufferPool.qmfWorkBuffers\n )\n delays.midBand = stage2.newDelay\n\n const delayedHigh =\n bufferPool.qmfWorkBuffers.highBandDelay[stage1.highBand.length]\n delayedHigh.set(delays.highBand)\n delayedHigh.set(stage1.highBand, delays.highBand.length)\n\n const highBand = delayedHigh.slice(0, stage1.highBand.length)\n delays.highBand = delayedHigh.slice(stage1.highBand.length)\n\n return {\n bands: [stage2.lowBand, stage2.highBand, highBand],\n }\n }\n}\n\n/**\n * Block Selection Stage - Detects transients to choose transform block sizes\n *\n * Analyzes frequency bands using FFT and transient detection to determine\n * appropriate MDCT block sizes. Short blocks are used for transient signals\n * to prevent pre-echo artifacts, while long blocks provide better frequency\n * resolution for steady-state signals.\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes QMF analysis results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function blockSelectorStage(context) {\n const bufferPool =\n context?.bufferPool ??\n throwError('blockSelectorStage: bufferPool is required')\n const options =\n context?.options ?? throwError('blockSelectorStage: options is required')\n\n /**\n * Analyze frequency bands and determine block modes\n * @param {Object} input - QMF analysis results\n * @param {Array<Float32Array>} input.bands - Three frequency bands [low, mid, high]\n * @returns {Object} Block selection results\n * @returns {Array<Float32Array>} returns.bands - Original frequency bands\n * @returns {Array<number>} returns.blockModes - Block mode indices for each band\n */\n return (input) => {\n const { bands } = input\n const fftSizes = [FFT_SIZE_LOW, FFT_SIZE_MID, FFT_SIZE_HIGH]\n const blockModes = bands.map((bandSamples, bandIndex) => {\n const coeffs = performFFT(bandSamples, fftSizes[bandIndex])\n const transient = detectTransient(\n coeffs,\n bufferPool.transientDetection[bandIndex],\n options.transientThresholdLow\n )\n bufferPool.transientDetection[bandIndex] = coeffs\n return transient * Math.max(bandIndex + 1, 2)\n })\n\n return {\n bands,\n blockModes,\n }\n }\n}\n\n/**\n * MDCT Transform Stage - Applies Modified Discrete Cosine Transform\n *\n * Transforms time-domain samples to frequency-domain coefficients using MDCT.\n * The transform size depends on the block mode determined by transient detection:\n * - Long blocks: 512/256 samples for better frequency resolution\n * - Short blocks: 64 samples for better time resolution\n *\n * Applies windowing and overlap-add processing to prevent blocking artifacts.\n * Mid and high bands are spectrally reversed to match ATRAC1 format.\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes block selection results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function mdctStage(context) {\n const bufferPool =\n context?.bufferPool ?? throwError('mdctStage: bufferPool is required')\n const overlapBuffers = bufferPool.mdctOverlap\n\n // Transform function mapping for each band\n const TRANSFORM_FUNCS = [mdct256, mdct256, mdct512]\n\n /**\n * Transform a single frequency band using MDCT\n */\n function transformBand(\n samples,\n bandIndex,\n blockMode,\n overlapBuffer,\n bufferPool\n ) {\n const config = MDCT_BAND_CONFIGS[bandIndex]\n const transformFunc = TRANSFORM_FUNCS[bandIndex]\n const isLongBlock = blockMode === 0\n\n if (isLongBlock) {\n return transformLongBlock(\n samples,\n bandIndex,\n config,\n transformFunc,\n overlapBuffer,\n bufferPool\n )\n } else {\n return transformShortBlocks(\n samples,\n bandIndex,\n config,\n overlapBuffer,\n bufferPool\n )\n }\n }\n\n /**\n * Transform using long block (better frequency resolution)\n */\n function transformLongBlock(\n samples,\n bandIndex,\n config,\n transformFunc,\n overlapBuffer,\n bufferPool\n ) {\n const mdctSize = bandIndex === 2 ? MDCT_SIZE_LONG : MDCT_SIZE_MID\n const mdctInput = bufferPool.transformBuffers[mdctSize]\n mdctInput.fill(0)\n\n // Apply overlap from previous frame\n mdctInput.set(overlapBuffer, config.windowStart)\n\n // Window and save tail for next frame\n applyTailWindowing(samples, overlapBuffer, config.size)\n\n // Add current frame samples\n mdctInput.set(samples, config.windowStart + MDCT_OVERLAP_SIZE)\n\n // Transform\n let spectrum = transformFunc.transform(mdctInput, bufferPool.mdctBuffers)\n\n // Apply spectral reversal for mid/high bands\n if (bandIndex > 0) {\n spectrum = reverseSpectrum(spectrum, bufferPool.reversalBuffers)\n }\n\n return spectrum\n }\n\n /**\n * Transform using short blocks (better time resolution for transients)\n */\n function transformShortBlocks(\n samples,\n bandIndex,\n config,\n overlapBuffer,\n bufferPool\n ) {\n const numBlocks = 1 << (config.size === 256 ? 3 : 2) // 8 for band 2, 4 for bands 0-1\n const output = new Float32Array(config.size)\n\n for (let block = 0; block < numBlocks; block++) {\n const blockStart = block * MDCT_SHORT_BLOCK_SIZE\n const blockSamples = samples.subarray(\n blockStart,\n blockStart + MDCT_SHORT_BLOCK_SIZE\n )\n\n // Prepare MDCT input\n const mdctInput = bufferPool.transformBuffers[MDCT_SIZE_SHORT]\n mdctInput.fill(0)\n mdctInput.set(overlapBuffer, 0)\n\n // Window and save tail\n applyTailWindowing(blockSamples, overlapBuffer, MDCT_SHORT_BLOCK_SIZE)\n mdctInput.set(blockSamples, MDCT_OVERLAP_SIZE)\n\n // Transform\n let spectrum = mdct64.transform(mdctInput, bufferPool.mdctBuffers)\n\n // Apply spectral reversal for mid/high bands\n if (bandIndex > 0) {\n spectrum = reverseSpectrum(spectrum, bufferPool.reversalBuffers)\n }\n\n output.set(spectrum, blockStart)\n }\n\n return output\n }\n\n function applyTailWindowing(samples, overlapBuffer, blockSize) {\n const tailStart = blockSize - MDCT_OVERLAP_SIZE\n for (let i = 0; i < MDCT_OVERLAP_SIZE; i++) {\n const tailValue = samples[tailStart + i]\n overlapBuffer[i] = WINDOW_SHORT[i] * tailValue\n samples[tailStart + i] = tailValue * WINDOW_SHORT[31 - i]\n }\n }\n\n /**\n * Transform frequency bands using MDCT\n * @param {Object} input - Block selection results\n * @param {Array<Float32Array>} input.bands - Three frequency bands\n * @param {Array<number>} input.blockModes - Block mode indices for each band\n * @param {any} input.originalFrame - Original frame data (passed through)\n * @returns {Object} MDCT transform results\n * @returns {Array<Float32Array>} returns.bands - Original frequency bands\n * @returns {Float32Array} returns.coefficients - MDCT coefficients (512 samples)\n * @returns {Array<number>} returns.blockModes - Block mode indices\n * @returns {any} returns.originalFrame - Original frame data\n */\n return (input) => {\n const { bands, blockModes, originalFrame } = input\n const coefficients = new Float32Array(512)\n\n bands.forEach((bandSamples, bandIndex) => {\n const transformed = transformBand(\n bandSamples,\n bandIndex,\n blockModes[bandIndex],\n overlapBuffers[bandIndex],\n bufferPool\n )\n\n const offset = calculateBandOffset(bandIndex)\n coefficients.set(transformed, offset)\n })\n\n return { bands, coefficients, blockModes, originalFrame }\n }\n}\n\n/**\n * Quantization Stage - Performs psychoacoustic analysis and quantization\n *\n * The final encoding stage that:\n * 1. Groups coefficients into Block Floating Units (BFUs)\n * 2. Performs psychoacoustic analysis to determine masking thresholds\n * 3. Allocates bits based on perceptual importance\n * 4. Quantizes coefficients using scale factors and word lengths\n *\n * Uses a perceptual model to ensure quantization noise remains below\n * the masking threshold, maximizing quality within the bit budget.\n *\n * @param {Object} context - Pipeline context containing bufferPool and options\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @param {EncoderOptions} context.options - Encoding configuration options\n * @returns {Function} Stage function that processes MDCT results\n * @throws {Error} If bufferPool or options are not provided in context\n */\nexport function quantizationStage(context) {\n const bufferPool =\n context?.bufferPool ??\n throwError('quantizationStage: bufferPool is required')\n const options =\n context?.options ?? throwError('quantizationStage: options is required')\n\n /**\n * Perform psychoacoustic analysis and quantization\n * @param {Object} input - MDCT transform results\n * @param {Float32Array} input.coefficients - MDCT coefficients\n * @param {Array<number>} input.blockModes - Block mode indices\n * @returns {Object} Quantization results ready for bitstream encoding\n * @returns {number} returns.nBfu - Number of active BFUs\n * @returns {Int32Array} returns.scaleFactorIndices - Scale factor indices for each BFU\n * @returns {Int32Array} returns.wordLengthIndices - Word length indices for each BFU\n * @returns {Array<Int32Array>} returns.quantizedCoefficients - Quantized coefficient data\n * @returns {Array<number>} returns.blockSizeMode - Block size mode for each band\n */\n return (input) => {\n const { coefficients, blockModes } = input\n\n const { bfuData, bfuSizes, bfuCount } = groupIntoBFUs(\n coefficients,\n blockModes,\n bufferPool.bfuData\n )\n\n const psychoResults = psychoAnalysis(coefficients, options.normalizationDb)\n const { bfuCount: selectedBfuCount, allocation } = allocateBits(\n psychoResults,\n bfuData,\n bfuSizes,\n bfuCount\n )\n\n const scaleFactorIndices = new Int32Array(selectedBfuCount)\n const quantizedCoefficients = []\n\n for (let bfu = 0; bfu < selectedBfuCount; bfu++) {\n const data = bfuData[bfu].subarray(0, bfuSizes[bfu])\n const wordLength = allocation[bfu]\n const bitsPerSample = WORD_LENGTH_BITS[wordLength]\n\n scaleFactorIndices[bfu] = findScaleFactor(data)\n const quantized = quantize(data, scaleFactorIndices[bfu], bitsPerSample)\n quantizedCoefficients.push(quantized)\n }\n\n return {\n nBfu: selectedBfuCount,\n scaleFactorIndices,\n wordLengthIndices: allocation.slice(0, selectedBfuCount),\n quantizedCoefficients,\n blockSizeMode: blockModes,\n }\n }\n}\n\n/**\n * Create ATRAC1 encoding pipeline\n *\n * Constructs a complete encoding pipeline that transforms PCM audio samples\n * into ATRAC1 compressed format. The pipeline processes audio through QMF\n * analysis, transient detection, MDCT transform, and psychoacoustic quantization.\n *\n * The returned function can be called repeatedly to encode audio frames,\n * maintaining state through the shared buffer pool for efficient processing.\n *\n * @param {EncoderOptions} [options=new EncoderOptions()] - Encoding configuration\n * @param {BufferPool} [bufferPool=new BufferPool()] - Shared buffer pool for state\n * @returns {Function} Encoding pipeline function that processes PCM samples\n *\n * @example\n * const encoder = encode(new EncoderOptions(), new BufferPool())\n * const result = encoder(pcmSamples) // Returns quantized ATRAC1 frame data\n */\nexport function encode(\n options = new EncoderOptions(),\n bufferPool = new BufferPool()\n) {\n const context = { options, bufferPool }\n return pipe(\n context,\n qmfAnalysisStage,\n blockSelectorStage,\n mdctStage,\n quantizationStage\n )\n}\n","/**\n * Carta1 Audio Codec - Decoding Pipeline\n *\n * The decoding pipeline transforms ATRAC1 compressed format back into PCM audio samples\n * through a series of processing stages:\n *\n * 1. Dequantization: Reconstructs MDCT coefficients from quantized data using scale factors\n * 2. Inverse MDCT: Applies Inverse Modified Discrete Cosine Transform to frequency bands\n * 3. QMF Synthesis: Reconstructs full-spectrum audio using quadrature mirror filters\n *\n * Each stage is implemented as a functional pipeline component that can be composed\n * using the pipe utility. The pipeline maintains state through a shared context\n * containing buffer pools and decoding options.\n */\n\nimport {\n pipe,\n throwError,\n reverseSpectrum,\n extractBandCoefficients,\n} from '../utils.js'\nimport { qmfSynthesis } from '../transforms/qmf.js'\nimport { imdct64, imdct256, imdct512, overlapAdd } from '../transforms/mdct.js'\nimport { dequantize } from '../coding/quantization.js'\nimport { BufferPool } from '../core/buffers.js'\nimport {\n BFU_BAND_BOUNDARIES,\n BFU_START_LONG,\n BFU_START_SHORT,\n WORD_LENGTH_BITS,\n WINDOW_SHORT,\n MDCT_SIZE_LONG,\n MDCT_BAND_CONFIGS,\n MDCT_SHORT_BLOCK_SIZE,\n MDCT_TAIL_WINDOW_SIZE,\n} from '../core/constants.js'\n\n/**\n * Dequantization Stage - Reconstructs MDCT coefficients from quantized data\n *\n * Reverses the quantization process by:\n * - Reconstructing coefficient values using scale factors and word lengths\n * - Organizing coefficients back into Block Floating Units (BFUs)\n * - Preparing coefficient array for inverse MDCT transform\n *\n * Uses the same BFU organization as the encoder but reconstructs the original\n * coefficient values from the quantized representation.\n *\n * @returns {Function} Stage function that processes quantized frame data\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function dequantizationStage() {\n /**\n * Reconstruct MDCT coefficients from quantized data\n * @param {Object} frameData - Quantized frame data\n * @param {number} frameData.nBfu - Number of active BFUs\n * @param {Int32Array} frameData.scaleFactorIndices - Scale factor indices for each BFU\n * @param {Int32Array} frameData.wordLengthIndices - Word length indices for each BFU\n * @param {Array<Int32Array>} frameData.quantizedCoefficients - Quantized coefficient data\n * @param {Array<number>} frameData.blockSizeMode - Block size mode for each band\n * @returns {Array} Dequantization results [coefficients, blockModes]\n * @returns {Float32Array} returns[0] - Reconstructed MDCT coefficients (512 samples)\n * @returns {Array<number>} returns[1] - Block mode indices for each band\n */\n return (frameData) => {\n const coefficients = new Float32Array(512)\n const {\n nBfu,\n scaleFactorIndices,\n wordLengthIndices,\n quantizedCoefficients,\n blockSizeMode,\n } = frameData\n\n for (let bfu = 0; bfu < nBfu; bfu++) {\n const bitsPerSample = WORD_LENGTH_BITS[wordLengthIndices[bfu]]\n\n let band = 0\n if (bfu >= BFU_BAND_BOUNDARIES[0]) band = 1\n if (bfu >= BFU_BAND_BOUNDARIES[1]) band = 2\n\n const isLongBlock = blockSizeMode[band] === 0\n const position = isLongBlock ? BFU_START_LONG[bfu] : BFU_START_SHORT[bfu]\n\n if (bitsPerSample > 0) {\n const quantized = quantizedCoefficients[bfu]\n const dequantized = dequantize(\n quantized,\n scaleFactorIndices[bfu],\n bitsPerSample\n )\n coefficients.set(dequantized, position)\n }\n }\n\n return [coefficients, blockSizeMode]\n }\n}\n\n/**\n * Inverse MDCT Stage - Transforms frequency coefficients back to time domain\n *\n * Applies Inverse Modified Discrete Cosine Transform to reconstruct time-domain\n * samples from frequency coefficients. The transform size depends on block modes:\n * - Long blocks: 512/256 samples for steady-state signals\n * - Short blocks: 64 samples for transient signals\n *\n * Applies windowing and overlap-add processing to prevent blocking artifacts.\n * Mid and high bands are spectrally unreversed from ATRAC1 format.\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes dequantization results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function imdctStage(context) {\n const bufferPool =\n context?.bufferPool ?? throwError('imdctStage: bufferPool is required')\n const overlapBuffers = bufferPool.imdctOverlap\n\n // Transform function mapping for each band\n const TRANSFORM_FUNCS = [imdct256, imdct256, imdct512]\n\n /**\n * Inverse transform a single frequency band\n */\n function transformBand(\n coeffs,\n bandIndex,\n blockMode,\n overlapBuffer,\n bufferPool,\n config\n ) {\n const isLongBlock = blockMode === 0\n const transformFunc = TRANSFORM_FUNCS[bandIndex]\n\n if (isLongBlock) {\n return inverseLongBlock(\n coeffs,\n bandIndex,\n overlapBuffer,\n bufferPool,\n config,\n transformFunc\n )\n } else {\n return inverseShortBlocks(\n coeffs,\n bandIndex,\n overlapBuffer,\n bufferPool,\n config\n )\n }\n }\n\n /**\n * Inverse transform using long block\n */\n function inverseLongBlock(\n coeffs,\n bandIndex,\n overlapBuffer,\n bufferPool,\n config,\n transformFunc\n ) {\n // Unreverse spectral reversal for mid/high bands\n let blockSpecs = coeffs\n if (bandIndex > 0) {\n blockSpecs = reverseSpectrum(coeffs, bufferPool.reversalBuffers)\n }\n\n // Apply inverse transform\n const inv = transformFunc.transform(blockSpecs, bufferPool.mdctBuffers)\n const invStart = inv.length / 4\n\n // Prepare output buffer\n const invBuf = bufferPool.transformBuffers[MDCT_SIZE_LONG]\n invBuf.fill(0)\n\n // Copy transformed samples\n for (let i = 0; i < config.size; i++) {\n invBuf[i] = inv[invStart + i]\n }\n\n // Handle overlap-add with previous frame\n const prevBuf = overlapBuffer.slice(\n config.size * 2 - MDCT_TAIL_WINDOW_SIZE,\n config.size * 2\n )\n const dstPart = overlapAdd(\n prevBuf.slice(0, MDCT_TAIL_WINDOW_SIZE),\n invBuf.slice(0, MDCT_TAIL_WINDOW_SIZE),\n WINDOW_SHORT\n )\n\n overlapBuffer.set(dstPart, 0)\n\n // Save tail for next frame\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n prevBuf[i] = invBuf[MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n // Copy main samples\n const copyLen = bandIndex === 2 ? 240 : 112\n for (let i = 0; i < copyLen; i++) {\n overlapBuffer[32 + i] = invBuf[MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n // Copy final samples\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n overlapBuffer[config.size * 2 - MDCT_TAIL_WINDOW_SIZE + i] =\n invBuf[config.size - MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n return overlapBuffer.slice(0, config.size)\n }\n\n /**\n * Inverse transform using short blocks\n */\n function inverseShortBlocks(\n coeffs,\n bandIndex,\n overlapBuffer,\n bufferPool,\n config\n ) {\n const numBlocks = 1 << (config.size === 256 ? 3 : 2)\n const invBuf = bufferPool.transformBuffers[MDCT_SIZE_LONG]\n invBuf.fill(0)\n\n const prevBuf = overlapBuffer.slice(\n config.size * 2 - MDCT_TAIL_WINDOW_SIZE,\n config.size * 2\n )\n\n let start = 0\n let pos = 0\n\n for (let block = 0; block < numBlocks; block++) {\n // Extract block coefficients\n let blockSpecs = coeffs.slice(pos, pos + MDCT_SHORT_BLOCK_SIZE)\n\n // Unreverse spectral reversal for mid/high bands\n if (bandIndex > 0) {\n blockSpecs = reverseSpectrum(blockSpecs, bufferPool.reversalBuffers)\n }\n\n // Apply inverse transform\n const inv = imdct64.transform(blockSpecs, bufferPool.mdctBuffers)\n const invStart = inv.length / 4\n\n // Copy to intermediate buffer\n for (let i = 0; i < MDCT_SHORT_BLOCK_SIZE; i++) {\n invBuf[start + i] = inv[invStart + i]\n }\n\n // Overlap-add with previous block\n const dstPart = overlapAdd(\n prevBuf.slice(0, MDCT_TAIL_WINDOW_SIZE),\n invBuf.slice(start, start + MDCT_TAIL_WINDOW_SIZE),\n WINDOW_SHORT\n )\n\n overlapBuffer.set(dstPart, start)\n\n // Save tail for next block\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n prevBuf[i] = invBuf[start + MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n start += MDCT_SHORT_BLOCK_SIZE\n pos += MDCT_SHORT_BLOCK_SIZE\n }\n\n // Copy final tail samples\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n overlapBuffer[config.size * 2 - MDCT_TAIL_WINDOW_SIZE + i] =\n invBuf[config.size - MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n return overlapBuffer.slice(0, config.size)\n }\n\n /**\n * Transform coefficients back to time domain using inverse MDCT\n * @param {Array} input - Dequantization results\n * @param {Float32Array} input[0] - MDCT coefficients (512 samples)\n * @param {Array<number>} input[1] - Block mode indices for each band\n * @returns {Array<Float32Array>} Three reconstructed frequency bands [low, mid, high]\n */\n return (input) => {\n const [coefficients, blockModes] = input\n\n return MDCT_BAND_CONFIGS.map((config, bandIndex) => {\n const bandCoeffs = extractBandCoefficients(coefficients, bandIndex)\n return transformBand(\n bandCoeffs,\n bandIndex,\n blockModes[bandIndex],\n overlapBuffers[bandIndex],\n bufferPool,\n config\n )\n })\n }\n}\n\n/**\n * QMF Synthesis Stage - Reconstructs full-spectrum audio from frequency bands\n *\n * Performs two-stage QMF synthesis to reconstruct the full-spectrum signal\n * from three frequency bands:\n * - Low band (0-5.5kHz): processed at full resolution\n * - Mid band (5.5-11kHz): processed at half resolution\n * - High band (11-22kHz): processed at quarter resolution with delay compensation\n *\n * This is the inverse operation of the QMF analysis performed during encoding,\n * combining the separate frequency bands back into a single wideband signal.\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes inverse MDCT results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function qmfSynthesisStage(context) {\n const bufferPool =\n context?.bufferPool ??\n throwError('qmfSynthesisStage: bufferPool is required')\n const delays = bufferPool.qmfDelays\n\n /**\n * Reconstruct full-spectrum PCM samples from frequency bands\n * @param {Array<Float32Array>} bands - Three frequency bands [low, mid, high]\n * @returns {Float32Array} Reconstructed PCM samples\n */\n return (bands) => {\n // Apply high band delay compensation\n const delayedHigh = bufferPool.qmfWorkBuffers.highBandDelay[bands[2].length]\n delayedHigh.set(delays.highBand)\n delayedHigh.set(bands[2])\n\n const highBand = delayedHigh.slice(0, bands[0].length * 2)\n delays.highBand = delayedHigh.slice(bands[0].length * 2)\n\n // Second stage synthesis: combine low and mid bands\n const stage2 = qmfSynthesis(\n bands[0],\n bands[1],\n delays.midBand,\n bufferPool.qmfWorkBuffers\n )\n delays.midBand = stage2.newDelay\n\n // First stage synthesis: combine result with high band\n const stage1 = qmfSynthesis(\n stage2.output,\n highBand,\n delays.lowBand,\n bufferPool.qmfWorkBuffers\n )\n delays.lowBand = stage1.newDelay\n\n return stage1.output\n }\n}\n\n/**\n * Create ATRAC1 decoding pipeline\n *\n * Constructs a complete decoding pipeline that transforms ATRAC1 compressed format\n * back into PCM audio samples. The pipeline processes quantized data through\n * dequantization, inverse MDCT transform, and QMF synthesis.\n *\n * The returned function can be called repeatedly to decode audio frames,\n * maintaining state through the shared buffer pool for efficient processing.\n *\n * @param {BufferPool} [bufferPool=new BufferPool()] - Shared buffer pool for state\n * @returns {Function} Decoding pipeline function that processes quantized frame data\n *\n * @example\n * const decoder = decode(new BufferPool())\n * const result = decoder(quantizedFrame) // Returns reconstructed PCM samples\n */\nexport function decode(bufferPool = new BufferPool()) {\n const context = { bufferPool }\n return pipe(context, dequantizationStage, imdctStage, qmfSynthesisStage)\n}\n","/**\n * Carta1 Audio Codec - Audio Processing Module\n *\n * High-level audio processing interface that provides stream-based encoding and decoding\n * for ATRAC1 audio format. Handles both mono and stereo audio processing with proper\n * delay compensation and frame management.\n *\n * Key features:\n * - Stream-based processing for large audio files\n * - Automatic delay compensation for codec processing\n * - Support for mono and stereo audio\n * - Progress tracking callbacks\n * - AEA file format creation and parsing\n * - WAV file generation from decoded audio\n */\n\nimport { encode } from '../pipeline/encoder.js'\nimport { decode } from '../pipeline/decoder.js'\nimport { EncoderOptions } from '../core/options.js'\nimport {\n SAMPLES_PER_FRAME,\n SAMPLE_RATE,\n AEA_HEADER_SIZE,\n SOUND_UNIT_SIZE,\n WAV_HEADER_SIZE,\n WAV_BYTES_PER_SAMPLE,\n WAV_BITS_PER_SAMPLE,\n WAV_PCM_MAX_POSITIVE,\n WAV_PCM_MAX_NEGATIVE,\n WAV_DATA_OFFSET,\n} from '../core/constants.js'\nimport { serializeFrame, deserializeFrame, AeaFile } from './serialization.js'\nimport {\n withFlushSamples,\n withDelayCompensation,\n withStereoFlushSamples,\n withStereoDelayCompensation,\n} from '../utils.js'\n\n/**\n * Audio processing utility class providing high-level encoding and decoding operations\n */\nexport class AudioProcessor {\n /**\n * Encodes a stream of audio frames to ATRAC1 format\n * @param {AsyncIterable<Float32Array>|AsyncIterable<[Float32Array, Float32Array]>} audioFrames - Audio frame stream\n * @param {Object} [options={}] - Encoding options\n * @param {number} [options.channelCount=1] - Number of audio channels (1 or 2)\n * @param {Function} [options.onProgress] - Progress callback function\n * @param {EncoderOptions} [options.encoderOptions] - Encoder configuration options\n * @returns {AsyncGenerator<Object>} Stream of encoded frame data\n * @throws {Error} If unsupported channel count is provided\n */\n static async *encodeStream(audioFrames, options = {}) {\n const { channelCount = 1, onProgress, encoderOptions } = options\n\n if (channelCount === 1) {\n yield* AudioProcessor._encodeMonoStream(\n audioFrames,\n onProgress,\n encoderOptions\n )\n } else if (channelCount === 2) {\n yield* AudioProcessor._encodeStereoStream(\n audioFrames,\n onProgress,\n encoderOptions\n )\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n\n /**\n * Internal method for encoding mono audio streams\n * @param {AsyncIterable<Float32Array>} audioFrames - Mono audio frame stream\n * @param {Function} onProgress - Progress callback function\n * @param {EncoderOptions} encoderOptions - Encoder configuration\n * @returns {AsyncGenerator<Object>} Stream of encoded frame data\n * @private\n */\n static async *_encodeMonoStream(audioFrames, onProgress, encoderOptions) {\n const options = encoderOptions || new EncoderOptions()\n const encoder = encode(options)\n let frameIndex = 0\n for await (const frame of withFlushSamples(audioFrames)) {\n const result = encoder(frame)\n yield result\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n }\n\n /**\n * Internal method for encoding stereo audio streams\n * @param {AsyncIterable<[Float32Array, Float32Array]>} audioFrames - Stereo audio frame stream\n * @param {Function} onProgress - Progress callback function\n * @param {EncoderOptions} encoderOptions - Encoder configuration\n * @returns {AsyncGenerator<Object>} Stream of encoded frame data (left then right)\n * @private\n */\n static async *_encodeStereoStream(audioFrames, onProgress, encoderOptions) {\n const options = encoderOptions || new EncoderOptions()\n const leftEncoder = encode(options)\n const rightEncoder = encode(options)\n let frameIndex = 0\n\n for await (const [leftFrame, rightFrame] of withStereoFlushSamples(\n audioFrames\n )) {\n const leftResult = leftEncoder(leftFrame)\n const rightResult = rightEncoder(rightFrame)\n\n yield leftResult\n yield rightResult\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n }\n\n /**\n * Decodes a stream of ATRAC1 encoded frames back to PCM audio\n * @param {AsyncIterable<Object>} encodedFrames - Stream of encoded frame data\n * @param {Object} [options={}] - Decoding options\n * @param {number} [options.channelCount=1] - Number of audio channels (1 or 2)\n * @param {Function} [options.onProgress] - Progress callback function\n * @returns {AsyncGenerator<Float32Array>|AsyncGenerator<[Float32Array, Float32Array]>} Stream of decoded PCM frames\n * @throws {Error} If unsupported channel count is provided\n */\n static async *decodeStream(encodedFrames, options = {}) {\n const { channelCount = 1, onProgress } = options\n\n if (channelCount === 1) {\n yield* AudioProcessor._decodeMonoStream(encodedFrames, onProgress)\n } else if (channelCount === 2) {\n yield* AudioProcessor._decodeStereoStream(encodedFrames, onProgress)\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n\n /**\n * Internal method for decoding mono audio streams\n * @param {AsyncIterable<Object>} encodedFrames - Mono encoded frame stream\n * @param {Function} onProgress - Progress callback function\n * @returns {AsyncGenerator<Float32Array>} Stream of decoded mono PCM frames\n * @private\n */\n static async *_decodeMonoStream(encodedFrames, onProgress) {\n const decoder = decode()\n let frameIndex = 0\n\n // Create raw PCM frame stream\n const rawPcmFrames = async function* () {\n for await (const frame of encodedFrames) {\n const result = decoder(frame)\n yield result\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n }\n\n // Always apply delay compensation\n yield* withDelayCompensation(rawPcmFrames())\n }\n\n /**\n * Internal method for decoding stereo audio streams\n * @param {AsyncIterable<Object>} encodedFrames - Stereo encoded frame stream (interleaved left/right)\n * @param {Function} onProgress - Progress callback function\n * @returns {AsyncGenerator<[Float32Array, Float32Array]>} Stream of decoded stereo PCM frame pairs\n * @private\n */\n static async *_decodeStereoStream(encodedFrames, onProgress) {\n const leftDecoder = decode()\n const rightDecoder = decode()\n let frameIndex = 0\n\n const rawPcmFrames = async function* () {\n let leftFrame = null\n let isLeftChannel = true\n\n for await (const frame of encodedFrames) {\n if (isLeftChannel) {\n leftFrame = frame\n } else {\n const rightFrame = frame\n\n // Decode and yield the pair\n const leftResult = leftDecoder(leftFrame)\n const rightResult = rightDecoder(rightFrame)\n\n yield [leftResult, rightResult]\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n\n isLeftChannel = !isLeftChannel\n }\n\n if (!isLeftChannel && leftFrame) {\n const rightFrame = AudioProcessor._createDummyFrame()\n const leftResult = leftDecoder(leftFrame)\n const rightResult = rightDecoder(rightFrame)\n\n yield [leftResult, rightResult]\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n }\n\n // Always apply stereo delay compensation\n yield* withStereoDelayCompensation(rawPcmFrames())\n }\n\n /**\n * Converts channel buffer arrays to frame-based stream format\n * @param {Float32Array[]} buffers - Array of channel buffers (1 for mono, 2 for stereo)\n * @param {number} [frameSize=SAMPLES_PER_FRAME] - Frame size in samples\n * @returns {Generator<Float32Array>|Generator<[Float32Array, Float32Array]>} Stream of audio frames\n * @throws {Error} If unsupported channel count is provided\n */\n static *frameBufferToFrames(buffers, frameSize = SAMPLES_PER_FRAME) {\n const channelCount = buffers.length\n\n if (channelCount === 1) {\n const [left] = buffers\n for (let i = 0; i < left.length; i += frameSize) {\n const frame = new Float32Array(frameSize)\n const end = Math.min(i + frameSize, left.length)\n for (let j = 0; j < end - i; j++) {\n frame[j] = left[i + j]\n }\n yield frame\n }\n } else if (channelCount === 2) {\n const [left, right] = buffers\n const maxLength = Math.max(left.length, right.length)\n\n for (let i = 0; i < maxLength; i += frameSize) {\n const leftFrame = new Float32Array(frameSize)\n const rightFrame = new Float32Array(frameSize)\n\n const end = Math.min(i + frameSize, maxLength)\n\n for (let j = 0; j < end - i; j++) {\n leftFrame[j] = i + j < left.length ? left[i + j] : 0\n rightFrame[j] = i + j < right.length ? right[i + j] : 0\n }\n\n yield [leftFrame, rightFrame]\n }\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n\n /**\n * Collects all frames from a stream into an array\n * @param {AsyncIterable} frameStream - Stream of frames to collect\n * @returns {Promise<Array>} Array of all frames from the stream\n */\n static async collectFrames(frameStream) {\n const frames = []\n for await (const frame of frameStream) {\n frames.push(frame)\n }\n return frames\n }\n\n /**\n * Creates a dummy frame for padding purposes\n * @returns {Object} Empty frame structure\n * @private\n */\n static _createDummyFrame() {\n return {\n nBfu: 0,\n blockSizeMode: [0, 0, 0],\n scaleFactorIndices: new Int32Array(0),\n wordLengthIndices: new Int32Array(0),\n quantizedCoefficients: [],\n }\n }\n\n /**\n * Creates an AEA file blob from encoded frames\n * @param {AsyncIterable<Object>} encodedFrames - Stream of encoded frame data\n * @param {Object} [options={}] - AEA file options\n * @param {string} [options.title='encoded by atrac1.js'] - File title\n * @param {number} [options.channelCount=1] - Number of audio channels\n * @returns {Promise<Blob>} AEA file blob\n */\n static async createAeaBlob(encodedFrames, options = {}) {\n const { title = 'encoded by atrac1.js', channelCount = 1 } = options\n\n const frames = []\n for await (const frame of encodedFrames) {\n frames.push(serializeFrame(frame))\n }\n\n const header = AeaFile.createHeader(title, frames.length, channelCount)\n const totalSize =\n header.length + frames.reduce((sum, frame) => sum + frame.length, 0)\n\n const buffer = new Uint8Array(totalSize)\n buffer.set(header, 0)\n\n let offset = header.length\n for (const frame of frames) {\n buffer.set(frame, offset)\n offset += frame.length\n }\n\n return new Blob([buffer], { type: 'application/octet-stream' })\n }\n\n /**\n * Creates a WAV file blob from PCM audio frames\n * @param {Float32Array[]|Float32Array|[Float32Array, Float32Array][]} pcmFrames - PCM audio frames\n * @param {number} [channelCount=1] - Number of audio channels\n * @param {number} [sampleRate=SAMPLE_RATE] - Audio sample rate\n * @returns {Blob} WAV file blob\n * @throws {Error} If unsupported channel count is provided\n */\n static createWavBlob(pcmFrames, channelCount = 1, sampleRate = SAMPLE_RATE) {\n const frames = Array.isArray(pcmFrames) ? pcmFrames : [pcmFrames]\n\n if (channelCount === 1) {\n return AudioProcessor._createMonoWavBlob(frames, sampleRate)\n } else if (channelCount === 2) {\n return AudioProcessor._createStereoWavBlob(frames, sampleRate)\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n\n /**\n * Creates a mono WAV file blob from PCM frames\n * @param {Float32Array[]} frames - Array of mono PCM frames\n * @param {number} sampleRate - Audio sample rate\n * @returns {Blob} Mono WAV file blob\n * @private\n */\n static _createMonoWavBlob(frames, sampleRate) {\n const totalSamples = frames.reduce((sum, frame) => sum + frame.length, 0)\n const buffer = new ArrayBuffer(\n WAV_HEADER_SIZE + totalSamples * WAV_BYTES_PER_SAMPLE\n )\n const view = new DataView(buffer)\n\n // WAV header\n AudioProcessor._writeWavHeader(view, totalSamples, 1, sampleRate)\n\n // PCM data using DataView for consistency\n let offset = WAV_HEADER_SIZE\n for (const frame of frames) {\n for (let i = 0; i < frame.length; i++) {\n const sample = Math.max(-1, Math.min(1, frame[i]))\n view.setInt16(\n offset,\n sample < 0\n ? sample * WAV_PCM_MAX_NEGATIVE\n : sample * WAV_PCM_MAX_POSITIVE,\n true\n )\n offset += WAV_BYTES_PER_SAMPLE\n }\n }\n\n return new Blob([buffer], { type: 'audio/wav' })\n }\n\n /**\n * Creates a stereo WAV file blob from PCM frame pairs\n * @param {[Float32Array, Float32Array][]} framePairs - Array of stereo PCM frame pairs\n * @param {number} sampleRate - Audio sample rate\n * @returns {Blob} Stereo WAV file blob\n * @private\n */\n static _createStereoWavBlob(framePairs, sampleRate) {\n const totalSamples = framePairs.reduce(\n (sum, [left, right]) => sum + Math.max(left.length, right.length),\n 0\n )\n\n const buffer = new ArrayBuffer(\n WAV_HEADER_SIZE + totalSamples * WAV_BYTES_PER_SAMPLE * 2\n )\n const view = new DataView(buffer)\n\n // WAV header\n AudioProcessor._writeWavHeader(view, totalSamples, 2, sampleRate)\n\n // Interleaved PCM data using DataView for consistency\n let offset = WAV_HEADER_SIZE\n for (const [leftFrame, rightFrame] of framePairs) {\n const frameLength = Math.max(leftFrame.length, rightFrame.length)\n for (let i = 0; i < frameLength; i++) {\n const leftSample = i < leftFrame.length ? leftFrame[i] : 0\n const rightSample = i < rightFrame.length ? rightFrame[i] : 0\n const leftClipped = Math.max(-1, Math.min(1, leftSample))\n const rightClipped = Math.max(-1, Math.min(1, rightSample))\n view.setInt16(\n offset,\n leftClipped < 0\n ? leftClipped * WAV_PCM_MAX_NEGATIVE\n : leftClipped * WAV_PCM_MAX_POSITIVE,\n true\n )\n offset += WAV_BYTES_PER_SAMPLE\n view.setInt16(\n offset,\n rightClipped < 0\n ? rightClipped * WAV_PCM_MAX_NEGATIVE\n : rightClipped * WAV_PCM_MAX_POSITIVE,\n true\n )\n offset += WAV_BYTES_PER_SAMPLE\n }\n }\n\n return new Blob([buffer], { type: 'audio/wav' })\n }\n\n /**\n * Writes WAV file header to DataView\n * @param {DataView} view - DataView to write to\n * @param {number} totalSamples - Total number of samples\n * @param {number} channelCount - Number of audio channels\n * @param {number} sampleRate - Audio sample rate\n * @private\n */\n static _writeWavHeader(view, totalSamples, channelCount, sampleRate) {\n const byteRate = sampleRate * channelCount * WAV_BYTES_PER_SAMPLE\n const blockAlign = channelCount * WAV_BYTES_PER_SAMPLE\n const dataSize = totalSamples * blockAlign\n const fileSize = WAV_DATA_OFFSET + dataSize\n\n let pos = 0\n\n // Helper function to write ASCII strings\n const writeString = (offset, string) => {\n for (let i = 0; i < string.length; i++) {\n view.setUint8(offset + i, string.charCodeAt(i))\n }\n }\n\n // RIFF header\n writeString(pos, 'RIFF')\n pos += 4\n view.setUint32(pos, fileSize, true)\n pos += 4\n writeString(pos, 'WAVE')\n pos += 4\n\n // fmt chunk\n writeString(pos, 'fmt ')\n pos += 4\n view.setUint32(pos, 16, true) // chunk size\n pos += 4\n view.setUint16(pos, 1, true) // PCM format\n pos += 2\n view.setUint16(pos, channelCount, true)\n pos += 2\n view.setUint32(pos, sampleRate, true)\n pos += 4\n view.setUint32(pos, byteRate, true)\n pos += 4\n view.setUint16(pos, blockAlign, true)\n pos += 2\n view.setUint16(pos, WAV_BITS_PER_SAMPLE, true) // bits per sample\n pos += 2\n\n // data chunk\n writeString(pos, 'data')\n pos += 4\n view.setUint32(pos, dataSize, true)\n }\n\n /**\n * Parses an AEA file blob to extract header info and frame data\n * @param {Blob} blob - AEA file blob to parse\n * @returns {Promise<Object>} Parsed AEA file data\n * @returns {Object} returns.info - AEA file header information\n * @returns {Uint8Array[]} returns.frameData - Array of frame data buffers\n */\n static async parseAeaBlob(blob) {\n const buffer = await blob.arrayBuffer()\n const header = new Uint8Array(buffer.slice(0, AEA_HEADER_SIZE))\n const info = AeaFile.parseHeader(header)\n\n const frameData = []\n for (let i = AEA_HEADER_SIZE; i < buffer.byteLength; i += SOUND_UNIT_SIZE) {\n const frame = new Uint8Array(buffer.slice(i, i + SOUND_UNIT_SIZE))\n if (frame.length === SOUND_UNIT_SIZE) {\n frameData.push(frame)\n }\n }\n\n return { info, frameData }\n }\n\n /**\n * Creates a stream of deserialized frames from binary frame data\n * @param {Uint8Array[]} frameData - Array of binary frame data\n * @returns {Generator<Object>} Stream of deserialized frame objects\n */\n static *deserializedFrameStream(frameData) {\n for (const frame of frameData) {\n yield deserializeFrame(frame)\n }\n }\n\n /**\n * Assembles PCM frames into a continuous buffer\n * @param {Float32Array[]|[Float32Array, Float32Array][]} pcmFrames - Array of PCM frames\n * @param {number} channelCount - Number of audio channels\n * @returns {Float32Array} Continuous PCM buffer (interleaved for stereo)\n * @throws {Error} If unsupported channel count is provided\n */\n static assemblePcmFrames(pcmFrames, channelCount) {\n if (channelCount === 1) {\n const totalSamples = pcmFrames.reduce(\n (sum, frame) => sum + frame.length,\n 0\n )\n const pcm = new Float32Array(totalSamples)\n let offset = 0\n for (const frame of pcmFrames) {\n pcm.set(frame, offset)\n offset += frame.length\n }\n return pcm\n } else if (channelCount === 2) {\n const totalSamples = pcmFrames.reduce(\n (sum, [left, right]) => sum + Math.max(left.length, right.length),\n 0\n )\n const pcm = new Float32Array(totalSamples * 2)\n\n let pcmOffset = 0\n for (const [leftFrame, rightFrame] of pcmFrames) {\n const frameLength = Math.max(leftFrame.length, rightFrame.length)\n for (let j = 0; j < frameLength; j++) {\n pcm[pcmOffset * 2] = j < leftFrame.length ? leftFrame[j] : 0\n pcm[pcmOffset * 2 + 1] = j < rightFrame.length ? rightFrame[j] : 0\n pcmOffset++\n }\n }\n return pcm\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n}\n","/**\n * Carta1 Web Worker - Self-contained audio codec worker\n *\n * Provides asynchronous encoding and decoding of ATRAC1 audio format\n * in a separate thread to prevent blocking the main UI thread.\n *\n * Usage:\n * Include this file as a web worker:\n * new Worker('carta1-worker.min.js')\n */\n\nimport { AeaFile } from '../io/serialization.js'\nimport { EncoderOptions } from '../core/options.js'\nimport { AudioProcessor } from '../io/processor.js'\nimport { SAMPLE_RATE } from '../core/constants.js'\n\n/**\n * Handle messages from the main thread\n *\n * Supported message types:\n * - 'encode': Encode PCM to ATRAC1\n * - 'decode': Decode ATRAC1 to PCM\n * - 'parseAea': Parse AEA blob metadata\n * - 'getEncoderOptions': Get default encoder options\n */\nself.onmessage = async (e) => {\n const { jobId, type, pcmData, aea, options, title, blob } = e.data\n\n try {\n let result\n\n switch (type) {\n case 'encode':\n result = await encodeAtrac(pcmData, options, title)\n break\n case 'decode':\n result = await decodeAtrac(aea)\n break\n case 'parseAea':\n result = await AudioProcessor.parseAeaBlob(blob)\n break\n case 'getEncoderOptions':\n result = getEncoderOptionsMetadata()\n break\n default:\n throw new Error(`Unknown worker message type: ${type}`)\n }\n\n self.postMessage({ jobId, result })\n } catch (error) {\n console.error('Worker error:', error)\n self.postMessage({ jobId, error: error.message })\n }\n}\n\n/**\n * Encode PCM audio data to ATRAC1 format\n *\n * @param {Array<Float32Array>} pcmData - PCM audio data [mono] or [left, right]\n * @param {Object} options - Encoder options\n * @returns {Promise<Object>} Encoded AEA blob\n */\nasync function encodeAtrac(pcmData, options, title) {\n title = title ?? 'encoded by carta1'\n try {\n const audioFrames = AudioProcessor.frameBufferToFrames(pcmData)\n const channelCount = pcmData.length\n\n // Create encoder options from provided settings\n const encoderOptions = new EncoderOptions(options)\n\n const encodedFrames = AudioProcessor.encodeStream(audioFrames, {\n channelCount,\n encoderOptions,\n })\n\n const frameArray = await AudioProcessor.collectFrames(encodedFrames)\n\n const aeaBlob = await AudioProcessor.createAeaBlob(frameArray, {\n title,\n channelCount,\n })\n\n // Return the blob\n return { aeaBlob }\n } catch (error) {\n console.error('Worker encode error:', error)\n throw error\n }\n}\n\n/**\n * Get default encoder options metadata\n *\n * @returns {Object} Default encoder options as plain object\n */\nfunction getEncoderOptionsMetadata() {\n const defaultOptions = new EncoderOptions()\n return defaultOptions.toObject()\n}\n\n/**\n * Decode ATRAC1 data to PCM WAV format\n *\n * @param {Object} aea - AEA data object\n * @param {Uint8Array} aea.header - AEA file header\n * @param {Array} aea.aeaData - Serialized frame data\n * @param {Object} [aea.info] - Optional metadata\n * @returns {Promise<Object>} WAV blob and decoding info\n */\nasync function decodeAtrac(aea) {\n const { header, aeaData, info } = aea\n\n // Use provided info, or fall back to header parsing, or defaults\n let decodingInfo\n if (info) {\n decodingInfo = { sampleRate: SAMPLE_RATE, ...info }\n } else if (header) {\n const headerInfo = AeaFile.parseHeader(header)\n decodingInfo = { sampleRate: SAMPLE_RATE, ...headerInfo }\n } else {\n decodingInfo = { channelCount: 2, sampleRate: SAMPLE_RATE }\n }\n\n const encodedFrameStream = AudioProcessor.deserializedFrameStream(aeaData)\n const decodedFrames = AudioProcessor.decodeStream(encodedFrameStream, {\n channelCount: decodingInfo.channelCount,\n })\n\n const pcmFrames = await AudioProcessor.collectFrames(decodedFrames)\n\n // Create WAV blob directly\n const wavBlob = AudioProcessor.createWavBlob(\n pcmFrames,\n decodingInfo.channelCount,\n decodingInfo.sampleRate\n )\n\n return { wavBlob, info: decodingInfo }\n}\n"],"names":["SAMPLE_RATE","SAMPLES_PER_FRAME","AEA_MAGIC","Uint8Array","AEA_HEADER_SIZE","SOUND_UNIT_SIZE","NUM_BFUS","SPECS_PER_BFU","Int32Array","BFU_AMOUNTS","BFU_BAND_BOUNDARIES","BFU_FREQUENCIES","Float32Array","BFU_START_LONG","BFU_START_SHORT","MDCT_SIZE_MID","MDCT_SIZE_LONG","WINDOW_SHORT","table","i","Math","sin","PI","QMF_DELAY","QMF_COEFFS","QMF_WINDOW","window","QMF_EVEN","even","QMF_ODD","odd","MAX_WORD_LENGTH_INDEX","WORD_LENGTH_BITS","QUANT_DISTORTION_TABLE","wl","quantRange","DISTORTION_DELTA_DB","log10","SCALE_FACTORS","pow","BARK_SCALE","freq","atan","PSYMODEL_MIN_POWER_DB","matrix","masker","masked","distance","spreading","PSYMODEL_FFT_SIZE","_ref","half","sizeMinus1","halfDiv2","idx0","Uint16Array","idx1","w1","src","base","j0","j1","_ref2","PSYMODEL_PSD_SOURCE_IDX0","PSYMODEL_PSD_SOURCE_IDX1","PSYMODEL_PSD_INTERP_WEIGHT","MDCT_BAND_CONFIGS","size","windowStart","MDCT_SHORT_BLOCK_SIZE","MDCT_OVERLAP_SIZE","MDCT_TAIL_WINDOW_SIZE","WAV_PCM_MAX_POSITIVE","WAV_PCM_MAX_NEGATIVE","PSYMODEL_LOG10_FACTOR","LN10","PSYMODEL_POW10_FACTOR","PSYMODEL_CRITICAL_BANDS","PSYMODEL_THRESHOLD_TABLE","PSYMODEL_CB_FREQ_INDICES","map","cbIdx","PSYMODEL_FREQ_TO_CB_MAP","packBits","buffer","bitPosition","value","bitCount","byteIndex","floor","bitOffset","bitsWritten","length","bitsAvailable","bitsToWrite","min","valueBits","mask","unpackBits","bitsRead","bitsToRead","unpackSignedBits","serializeFrame","frameData","view","DataView","bfuIndex","indexOf","nBfu","header","blockSizeMode","setUint16","wordLengthIndices","scaleFactorIndices","bitsPerSample","_step","_iterator","_createForOfIteratorHelper","quantizedCoefficients","s","n","done","coefficient","err","e","f","deserializeFrame","Error","concat","byteOffset","byteLength","getUint16","bfuSize","coefficients","j","push","AeaFile","_createClass","_classCallCheck","key","title","arguments","undefined","frameCount","channelCount","set","titleBytes","TextEncoder","encode","subarray","AEA_TITLE_SIZE","setUint32","titleEnd","titleLength","TextDecoder","decode","getUint32","EncoderOptions","options","this","values","transientThresholdLow","transientThresholdMid","transientThresholdHigh","normalizationDb","metadata","default","name","description","range","step","setOptions","_i","_Object$entries","Object","entries","_Object$entries$_i","_slicedToArray","setValue","_meta$range","max","get","_objectSpread","_i2","_Object$entries2","_Object$entries2$_i","meta","t","r","Symbol","iterator","o","toStringTag","c","prototype","Generator","u","create","_regeneratorDefine2","p","y","G","v","a","d","bind","l","TypeError","call","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","defineProperty","enumerable","configurable","writable","_invoke","_awaitAsyncGenerator","_OverloadYield","_wrapAsyncGenerator","AsyncGenerator","apply","resume","Promise","resolve","then","k","settle","reject","next","arg","_asyncIterator","asyncIterator","AsyncFromSyncIterator","AsyncFromSyncIteratorContinuation","throwError","msg","pipe","context","_len","stages","Array","_key","functions","stage","input","reduce","fn","withFlushSamples","_x","_withFlushSamples","iter","samplesToFlush","_callee","lastFrameLength","_iteratorAbruptCompletion","_didIteratorError","_iteratorError","frame","paddedFrame","_t","_context","withDelayCompensation","_x2","_withDelayCompensation","pcmFrameStream","samplesToDrop","_callee2","droppedInitialSamples","_iteratorAbruptCompletion2","_didIteratorError2","_iteratorError2","_iterator2","_step2","combined","offset","_t2","_context2","slice","withStereo","monoTransform","_len2","args","_key2","_callee5","stereoIter","leftFrames","rightFrames","_iteratorAbruptCompletion3","_didIteratorError3","_iteratorError3","_iterator3","_step3","_step3$value","left","right","leftIter","rightIter","leftTransformed","rightTransformed","_iteratorAbruptCompletion4","_didIteratorError4","_iteratorError4","_iterator4","_step4","_left","_yield$_awaitAsyncGen","_right","_t3","_t4","_context5","_callee3","_leftFrames","_context3","_callee4","_rightFrames","_context4","_x3","reverseSpectrum","spectrum","reversalBuffers","reversed","withStereoFlushSamples","withStereoDelayCompensation","qmfAnalysis","delayLine","_qmfWorkBuffers$delay","_qmfWorkBuffers$delay2","qmfWorkBuffers","inputLength","outputLength","workBuffer","delay","lowBand","highBand","evenSum","oddSum","newDelay","qmfSynthesis","_qmfWorkBuffers$delay3","_qmfWorkBuffers$delay4","subbandLength","low","high","output","sample0","sample1","idx","FFT","real","imag","cache","_cache","_buildCache","bitRev","cosTbl","cos","sinTbl","tempR","tempI","evenR","evenI","oddR","oddI","tR","tI","idx4","r0","i0","r4","i4","idx5","sqrt2_2","idx2","idx6","idx3","idx7","stride","halfStride","grp","evenIdx","oddIdx","r1","i1","twiddleIdx","cosW","sinW","log2n","log2","Uint32Array","halfN","angleStep","angle","fround","_defineProperty","Map","MDCTBase","scale","halfSize","quarterSize","fftSize","alpha","omega","scaleRoot","sqrt","sinCosTable","MDCT","_callSuper","_inherits","_buffers$real","_buffers$imag","mdctBuffers","buffers","n4","n34","fill","i2","i3","im","fft","re","IMDCT","_buffers$real2","_buffers$imag2","mdct64","mdct256","mdct512","imdct64","MDCT_SIZE_SHORT","imdct256","imdct512","overlapAdd","prev","curr","w2","findScaleFactor","maxAmplitude","abs","mid","quantize","scaleFactorIndex","normFactor","quantized","normalized","round","dequantize","denormFactor","dequantized","allocateBits","psychoResults","bfuData","bfuSizes","maxBfuCount","signalEnergyDb","bfuCount","energyPerBfu","data","energy","calculateBfuEnergy","smrValues","maskThresholdDb","bfu","Infinity","calculateSMR","criticalBandThresholds","maskThresholdPerBfu","freqPerBin","bfuFreq","fftBinIndex","bandIndex","x0","x1","y0","y1","bandWidth","interpolated","compensation","interpolateCriticalBandsToBfus","actualBfuCount","hasAudibleContent","some","smr","contributions","index","sort","b","cumulativeSMR","sum","candidateCount","requiredBfus","_toConsumableArray","capturedIndex","remainingIndices","highestSignalBfu","BFU_AMOUNTS_COUNT","selectOptimalBfuCount","allocation","availableBits","heap","priority","heapifyDown","bestBfu","currentWl","pop","upgradeCost","calculateUpgradeCost","performBitAllocation","FRAME_BITS","currentBits","startIdx","element","leftChild","rightChild","largest","largestPriority","BufferPool","transformBuffers","highBandDelay","QMF_HIGH_BAND_DELAY","qmfDelays","midBand","transientDetection","mdctOverlap","imdctOverlap","detectTransient","currentCoeffs","prevCoeffs","threshold","features","spectralFlux","flux","currentEnergy","currentMag","diff","normalization","calculateSpectralFlux","currentFlatness","calculateSpectralFlatness","prevFlatness","flatnessChange","currentHfRatio","calculateHighFrequencyRatio","prevHfRatio","hfChange","energyChange","prevEnergy","changeDb","calculateEnergyChange","calculateSpectralFeatures","transientScore","fluxContribution","flatnessContribution","hfContribution","log1p","energyContribution","calculateTransientScore","coeffs","sumLog","sumLinear","validBins","magnitude","log","geometricMean","exp","arithmeticMean","midPoint","lowEnergy","highEnergy","totalEnergy","toDb","fromDb","db","psychoAnalysis","mdctCoeffs","psd","linearPower","maxLinearPower","power","calculatePSDFromMDCT","_findAllMaskers","fftScale","flags","tonalList","maxTonalBin","RANGE_LOW","RANGE_MID","RANGE_HIGH","searchOffsets","isTonal","spl","markTonalComponent","findTonalMaskers","nonTonalList","cbStart","bandAnalysis","analyzeCriticalBand","powerDb","centroidOffset","findNonTonalMaskers","decimated","isAudible","markInaudible","audibleTonal","tonal","audibleNonTonal","nonTonal","decimateMaskers","tonalMaskers","nonTonalMaskers","findAllMaskers","maskers","bark","_step5","_iterator5","_step6","bandData","maskedBark","summedEnergy","_iterator6","barkDistance","calculateMaskingLevel","calculateCriticalBandThresholds","tonalMaskersCount","nonTonalMaskersCount","offsets","_arr","startBin","endBin","totalPower","weightedPower","baseBark","maskerSpl","maskerPsd","maskerBark","psdFactor1","qmfAnalysisStage","_context$bufferPool","bufferPool","delays","pcmSamples","stage1","stage2","delayedHigh","bands","blockSelectorStage","_context$bufferPool2","_context$options","fftSizes","blockModes","bandSamples","samples","copyLen","performFFT","transient","mdctStage","_context$bufferPool3","overlapBuffers","TRANSFORM_FUNCS","transformBand","blockMode","overlapBuffer","config","transformFunc","mdctSize","mdctInput","applyTailWindowing","transform","transformLongBlock","numBlocks","block","blockStart","blockSamples","transformShortBlocks","blockSize","tailStart","tailValue","originalFrame","forEach","transformed","calculateBandOffset","quantizationStage","_context$bufferPool4","_context$options2","_groupIntoBFUs","bfuBuffers","coeffIndex","band","bandStart","bandSize","bandEnd","startPositions","startPos","actualSize","groupIntoBFUs","_allocateBits","selectedBfuCount","wordLength","dequantizationStage","position","imdctStage","blockSpecs","inv","invStart","invBuf","prevBuf","dstPart","inverseLongBlock","start","pos","inverseShortBlocks","_input","bandCoeffs","extractBandCoefficients","qmfSynthesisStage","_defineProperties","_toPropertyKey","_typeof","toPrimitive","String","Number","_toPrimitive","_asyncGeneratorDelegate","pump","AudioProcessor","audioFrames","_options$channelCount","onProgress","encoderOptions","_regeneratorValues","_encodeMonoStream","_encodeStereoStream","encoder","frameIndex","result","leftEncoder","rightEncoder","_step2$value","leftFrame","rightFrame","leftResult","rightResult","encodedFrames","_options$channelCount2","_decodeMonoStream","_decodeStereoStream","_callee6","decoder","rawPcmFrames","_context6","_callee8","leftDecoder","rightDecoder","_context8","_callee7","isLeftChannel","_rightFrame","_leftResult","_rightResult","_context7","_createDummyFrame","frameSize","_callee9","_buffers","end","_buffers2","maxLength","_end","_j","_context9","_collectFrames","_asyncToGenerator","_callee0","frameStream","frames","_iteratorAbruptCompletion5","_didIteratorError5","_iteratorError5","_t5","_context0","_createAeaBlob","_callee1","_options$title","_options$channelCount3","_iteratorAbruptCompletion6","_didIteratorError6","_iteratorError6","totalSize","_frames","_frame","_t6","_args1","_context1","createHeader","Blob","type","_x4","pcmFrames","sampleRate","isArray","_createMonoWavBlob","_createStereoWavBlob","totalSamples","ArrayBuffer","_writeWavHeader","_step7","_iterator7","sample","setInt16","framePairs","_ref3","_ref4","_step8","_iterator8","_step8$value","frameLength","leftSample","rightSample","leftClipped","rightClipped","byteRate","blockAlign","dataSize","fileSize","writeString","string","setUint8","charCodeAt","_parseAeaBlob","_callee10","blob","info","_context10","arrayBuffer","parseHeader","_x5","deserializedFrameStream","_iterator9","_step9","_t7","_context11","_step0","pcm","_iterator0","_step1","_ref5","_ref6","pcmOffset","_iterator1","_step1$value","asyncGeneratorStep","_next","_throw","encodeAtrac","_encodeAtrac","pcmData","frameArray","aeaBlob","frameBufferToFrames","encodeStream","collectFrames","createAeaBlob","console","error","getEncoderOptionsMetadata","toObject","decodeAtrac","_decodeAtrac","aea","aeaData","decodingInfo","headerInfo","encodedFrameStream","decodedFrames","wavBlob","decodeStream","createWavBlob","self","onmessage","_e$data","jobId","parseAeaBlob","postMessage","message"],"sourceRoot":""}
1
+ {"version":3,"file":"carta1-worker.min.js","mappings":"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","sources":["webpack://carta1/./codec/core/constants.js","webpack://carta1/./codec/io/bitstream.js","webpack://carta1/./codec/io/serialization.js","webpack://carta1/./codec/core/options.js","webpack://carta1/./codec/utils.js","webpack://carta1/./codec/transforms/qmf.js","webpack://carta1/./codec/transforms/fft.js","webpack://carta1/./codec/transforms/mdct.js","webpack://carta1/./codec/coding/quantization.js","webpack://carta1/./codec/coding/bitallocation.js","webpack://carta1/./codec/core/buffers.js","webpack://carta1/./codec/analysis/transient.js","webpack://carta1/./codec/analysis/psychoacoustics.js","webpack://carta1/./codec/pipeline/encoder.js","webpack://carta1/./codec/pipeline/decoder.js","webpack://carta1/./codec/io/processor.js","webpack://carta1/./codec/browser/worker.js"],"sourcesContent":["/**\n * Carta1 Audio Codec - Core Constants\n */\n\n// Audio format\nexport const SAMPLE_RATE = 44100\nexport const SAMPLES_PER_FRAME = 512\nexport const FRAME_RATE = SAMPLE_RATE / SAMPLES_PER_FRAME\nexport const CODEC_DELAY = 266\n\n// AEA file format\nexport const AEA_MAGIC = new Uint8Array([0x00, 0x08, 0x00, 0x00])\nexport const AEA_HEADER_SIZE = 2048\nexport const AEA_TITLE_OFFSET = 4\nexport const AEA_TITLE_SIZE = 256\nexport const AEA_FRAME_COUNT_OFFSET = 260\nexport const AEA_CHANNEL_COUNT_OFFSET = 264\n\n// Frame structure\nexport const SOUND_UNIT_SIZE = 212\nexport const FRAME_BITS = SOUND_UNIT_SIZE * 8\nexport const FRAME_OVERHEAD_BITS = 40\nexport const BITRATE_PER_CHANNEL = SOUND_UNIT_SIZE * FRAME_RATE * 8\n\n// BFU (Block Floating Unit) configuration\nexport const NUM_BFUS = 52\nexport const MAX_BFU_SIZE = 20\nexport const BITS_PER_BFU_METADATA = 10\n\nexport const SPECS_PER_BFU = new Int32Array([\n 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7,\n 7, 7, 9, 9, 9, 9, 10, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 20, 20, 20,\n 20, 20, 20, 20, 20,\n])\n\nexport const BFU_AMOUNTS_COUNT = 8\nexport const BFU_AMOUNTS = new Int32Array([20, 28, 32, 36, 40, 44, 48, 52])\nexport const BFU_BAND_BOUNDARIES = new Int32Array([20, 36, 52])\n\n// BFU center frequencies (Hz)\nexport const BFU_FREQUENCIES = new Float32Array([\n 172.3, 516.8, 861.3, 1205.9, 1464.3, 1636.5, 1808.8, 1981.1, 2239.5, 2584.0,\n 2928.5, 3273.0, 3574.5, 3832.9, 4091.3, 4349.7, 4608.1, 4866.5, 5124.9,\n 5383.3, 5641.7, 5900.1, 6158.5, 6416.9, 6696.8, 6998.3, 7299.8, 7601.2,\n 7945.8, 8333.3, 8720.9, 9108.5, 9517.7, 9948.3, 10379.0, 10809.7, 11283.4,\n 11800.2, 12317.0, 12833.8, 13350.6, 13867.4, 14384.2, 14901.0, 15590.0,\n 16451.4, 17312.7, 18174.0, 19035.4, 19896.7, 20758.0, 21619.3,\n])\n\n// BFU start positions\nexport const BFU_START_LONG = new Int32Array([\n 0, 8, 16, 24, 32, 36, 40, 44, 48, 56, 64, 72, 80, 86, 92, 98, 104, 110, 116,\n 122, 128, 134, 140, 146, 152, 159, 166, 173, 180, 189, 198, 207, 216, 226,\n 236, 246, 256, 268, 280, 292, 304, 316, 328, 340, 352, 372, 392, 412, 432,\n 452, 472, 492,\n])\n\nexport const BFU_START_SHORT = new Int32Array([\n 0, 32, 64, 96, 8, 40, 72, 104, 12, 44, 76, 108, 20, 52, 84, 116, 26, 58, 90,\n 122, 128, 160, 192, 224, 134, 166, 198, 230, 141, 173, 205, 237, 150, 182,\n 214, 246, 256, 288, 320, 352, 384, 416, 448, 480, 268, 300, 332, 364, 396,\n 428, 460, 492,\n])\n\n// Transform sizes\nexport const MDCT_SIZE_SHORT = 64\nexport const MDCT_SIZE_MID = 256\nexport const MDCT_SIZE_LONG = 512\n\n// Window functions\nexport const WINDOW_SHORT = (() => {\n const table = new Float32Array(32)\n for (let i = 0; i < 32; i++) {\n table[i] = Math.sin(((i + 0.5) * Math.PI) / 64)\n }\n return table\n})()\n\n// QMF configuration\nexport const QMF_TAPS = 48\nexport const QMF_DELAY = 46\nexport const QMF_HIGH_BAND_DELAY = 39\n\n// QMF prototype filter coefficients\nexport const QMF_COEFFS = new Float32Array([\n -0.00001461907, -0.00009205479, -0.000056157569, 0.00030117269, 0.0002422519,\n -0.00085293897, -0.0005205574, 0.0020340169, 0.00078333891, -0.0042153862,\n -0.00075614988, 0.0078402944, -0.000061169922, -0.01344162, 0.0024626821,\n 0.021736089, -0.007801671, -0.034090221, 0.01880949, 0.054326009,\n -0.043596379, -0.099384367, 0.13207909, 0.46424159,\n])\n\n// QMF window function\nexport const QMF_WINDOW = (() => {\n const window = new Float32Array(QMF_TAPS)\n for (let i = 0; i < 24; i++) {\n window[i] = QMF_COEFFS[i] * 2.0\n window[47 - i] = QMF_COEFFS[i] * 2.0\n }\n return window\n})()\n\n// QMF even/odd taps for optimization\nexport const QMF_EVEN = (() => {\n const even = new Float32Array(24)\n for (let i = 0; i < 24; i++) {\n even[i] = QMF_WINDOW[i * 2]\n }\n return even\n})()\n\nexport const QMF_ODD = (() => {\n const odd = new Float32Array(24)\n for (let i = 0; i < 24; i++) {\n odd[i] = QMF_WINDOW[i * 2 + 1]\n }\n return odd\n})()\n\n// Bit allocation\nexport const INTERPOLATION_COMPENSATION_FACTOR = 0.25\n\n// Quantization\nexport const MAX_WORD_LENGTH_INDEX = 15\nexport const WORD_LENGTH_BITS = new Int32Array([\n 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,\n])\nexport const QUANT_DISTORTION_TABLE = (() => {\n const table = new Float32Array(MAX_WORD_LENGTH_INDEX + 1)\n table[0] = 1.0\n for (let wl = 1; wl <= MAX_WORD_LENGTH_INDEX; wl++) {\n const bitsPerSample = WORD_LENGTH_BITS[wl]\n const quantRange = (1 << (bitsPerSample - 1)) - 1\n table[wl] = 1.0 / (12.0 * quantRange * quantRange)\n }\n return table\n})()\nexport const DISTORTION_DELTA_DB = (() => {\n const table = new Float32Array(MAX_WORD_LENGTH_INDEX)\n for (let i = 0; i < MAX_WORD_LENGTH_INDEX; i++) {\n table[i] =\n 10 *\n Math.log10(\n QUANT_DISTORTION_TABLE[i + 1] / (QUANT_DISTORTION_TABLE[i] || 1.0)\n )\n }\n return table\n})()\nexport const SCALE_FACTORS = (() => {\n const table = new Float32Array(64)\n for (let i = 0; i < 64; i++) {\n table[i] = Math.pow(2.0, i / 3.0 - 21)\n }\n return table\n})()\n\n// Psychoacoustic model\nexport const BARK_SCALE = (() => {\n const table = new Float32Array(NUM_BFUS)\n for (let i = 0; i < NUM_BFUS; i++) {\n const freq = BFU_FREQUENCIES[i]\n table[i] =\n 13.0 * Math.atan(0.00076 * freq) + 3.5 * Math.atan((freq / 7500) ** 2)\n }\n return table\n})()\n\nexport const SPREADING_MATRIX = (() => {\n const matrix = new Float32Array(NUM_BFUS * NUM_BFUS)\n for (let masker = 0; masker < NUM_BFUS; masker++) {\n for (let masked = 0; masked < NUM_BFUS; masked++) {\n const distance = BARK_SCALE[masker] - BARK_SCALE[masked]\n let spreading = -100.0\n\n if (distance >= -3.0 && distance < -1.0) {\n spreading = 17.0 * (distance + 3.0) - 70.0\n } else if (distance >= -1.0 && distance < 0) {\n spreading = 36.0 * distance\n } else if (distance >= 0 && distance < 1.0) {\n spreading = -27.0 * distance\n } else if (distance >= 1.0 && distance < 8.0) {\n spreading = -(distance - 1.0) * 4.0 - 27.0\n }\n\n matrix[masker * NUM_BFUS + masked] = spreading\n }\n }\n return matrix\n})()\n\n// ISO/IEC 11172-3:1993 Psychoacoustic Model Constants\nexport const PSYMODEL_MIN_POWER_DB = -200\nexport const PSYMODEL_FFT_SIZE = 2048\n\n// Pre-computes lookup tables for resampling the MDCT power spectrum into a PSD.\n// For each PSD bin, these tables provide the two source MDCT indices and the\n// linear interpolation weight needed to calculate the final power value.\nexport const [\n PSYMODEL_PSD_SOURCE_IDX0,\n PSYMODEL_PSD_SOURCE_IDX1,\n PSYMODEL_PSD_INTERP_WEIGHT,\n] = (() => {\n const half = PSYMODEL_FFT_SIZE >>> 1\n const sizeMinus1 = PSYMODEL_FFT_SIZE - 1\n const halfDiv2 = half / 2\n const scale = sizeMinus1 / half\n\n const idx0 = new Uint16Array(half + 1)\n const idx1 = new Uint16Array(half + 1)\n const w1 = new Float32Array(half + 1)\n\n for (let i = 0; i <= half; i++) {\n const src = i * scale\n const base = src | 0\n\n const j0 = base\n idx0[i] =\n j0 < half\n ? j0 < halfDiv2\n ? j0\n : half - 1 - (j0 - halfDiv2)\n : sizeMinus1 - (j0 - half)\n\n const j1 = base + 1\n if (j1 >= PSYMODEL_FFT_SIZE) {\n idx1[i] = idx0[i]\n } else {\n idx1[i] =\n j1 < half\n ? j1 < halfDiv2\n ? j1\n : half - 1 - (j1 - halfDiv2)\n : sizeMinus1 - (j1 - half)\n }\n\n w1[i] = src - base\n }\n\n return [idx0, idx1, w1]\n})()\n\n// FFT sizes for transient detection\nexport const FFT_SIZE_LOW = 128\nexport const FFT_SIZE_MID = 128\nexport const FFT_SIZE_HIGH = 256\n\n// MDCT/IMDCT transform configuration\nexport const MDCT_BAND_CONFIGS = [\n { size: 128, windowStart: 48 }, // Low band (0-5.5kHz)\n { size: 128, windowStart: 48 }, // Mid band (5.5-11kHz)\n { size: 256, windowStart: 112 }, // High band (11-22kHz)\n]\n\nexport const MDCT_SHORT_BLOCK_SIZE = 32\nexport const MDCT_OVERLAP_SIZE = 32\nexport const MDCT_TAIL_WINDOW_SIZE = 16\n\n// Quantization\nexport const QUANTIZATION_SIGN_BIT_SHIFT = 1\n\n// WAV format\nexport const WAV_HEADER_SIZE = 44\nexport const WAV_BYTES_PER_SAMPLE = 2\nexport const WAV_BITS_PER_SAMPLE = 16\nexport const WAV_PCM_MAX_POSITIVE = 0x7fff\nexport const WAV_PCM_MAX_NEGATIVE = 0x8000\nexport const WAV_DATA_OFFSET = 36\n\n// Frame serialization\nexport const FRAME_HEADER_BITS = 16\nexport const FRAME_WORD_LENGTH_BITS = 4\nexport const FRAME_SCALE_FACTOR_BITS = 6\n\n// Tonal analysis flags\nexport const PSYMODEL_NOT_EXAMINED = 0\nexport const PSYMODEL_TONAL = 1\nexport const PSYMODEL_NON_TONAL = 2\nexport const PSYMODEL_IRRELEVANT = 3\n\n// Pre-computed conversion factors\nexport const PSYMODEL_LOG10_FACTOR = 10 / Math.LN10\nexport const PSYMODEL_POW10_FACTOR = Math.LN10 / 10\n\n// Critical band boundaries (0-24)\nexport const PSYMODEL_CRITICAL_BANDS = new Uint8Array([\n 0, 1, 2, 4, 5, 7, 8, 10, 12, 14, 16, 19, 22, 26, 31, 36, 44, 49, 54, 60, 67,\n 74, 80, 92, 105,\n])\n\n// Threshold table: [frequency_index, bark_value, threshold_value]\n// prettier-ignore\nexport const PSYMODEL_THRESHOLD_TABLE = [\n [1.0, 0.85, 13.87], [2.0, 1.694, 2.85], [3.0, 2.525, -1.28], [4.0, 3.337, -3.5],\n [5.0, 4.124, -4.9], [6.0, 4.882, -5.89], [7.0, 5.608, -6.63], [8.0, 6.301, -7.21],\n [9.0, 6.959, -7.68], [10.0, 7.581, -8.08], [11.0, 8.169, -8.43], [12.0, 8.723, -8.75],\n [13.0, 9.244, -9.05], [14.0, 9.734, -9.33], [15.0, 10.195, -9.61], [16.0, 10.629, -9.89],\n [17.0, 11.037, -10.17], [18.0, 11.421, -10.47], [19.0, 11.783, -10.77], [20.0, 12.125, -11.1],\n [21.0, 12.448, -11.44], [22.0, 12.753, -11.79], [23.0, 13.042, -12.17], [24.0, 13.317, -12.56],\n [25.0, 13.577, -12.96], [26.0, 13.825, -13.38], [27.0, 14.062, -13.79], [28.0, 14.288, -14.21],\n [29.0, 14.504, -14.63], [30.0, 14.711, -15.03], [31.0, 14.909, -15.41], [32.0, 15.1, -15.77],\n [33.0, 15.283, -16.09], [34.0, 15.46, -16.37], [35.0, 15.631, -16.6], [36.0, 15.795, -16.78],\n [37.0, 15.955, -16.91], [38.0, 16.11, -16.97], [39.0, 16.26, -16.98], [40.0, 16.405, -16.92],\n [41.0, 16.547, -16.81], [42.0, 16.685, -16.65], [43.0, 16.82, -16.43], [44.0, 16.951, -16.17],\n [45.0, 17.079, -15.87], [46.0, 17.204, -15.54], [47.0, 17.327, -15.19], [48.0, 17.447, -14.82],\n [50.0, 17.68, -14.06], [52.0, 17.904, -13.32], [54.0, 18.121, -12.64], [56.0, 18.331, -12.04],\n [58.0, 18.534, -11.53], [60.0, 18.73, -11.11], [62.0, 18.922, -10.77], [64.0, 19.108, -10.49],\n [66.0, 19.288, -10.26], [68.0, 19.464, -10.07], [70.0, 19.635, -9.89], [72.0, 19.801, -9.72],\n [74.0, 19.963, -9.54], [76.0, 20.12, -9.37], [78.0, 20.273, -9.18], [80.0, 20.421, -8.97],\n [82.0, 20.565, -8.75], [84.0, 20.705, -8.51], [86.0, 20.84, -8.26], [88.0, 20.971, -7.98],\n [90.0, 21.099, -7.68], [92.0, 21.222, -7.36], [94.0, 21.341, -7.02], [96.0, 21.457, -6.65],\n [100.0, 21.676, -5.85], [104.0, 21.882, -4.93], [108.0, 22.074, -3.9], [112.0, 22.253, -2.75],\n [116.0, 22.42, -1.46], [120.0, 22.575, -0.03], [124.0, 22.721, 1.56], [128.0, 22.857, 3.31],\n [132.0, 22.984, 5.23], [136.0, 23.102, 7.34], [140.0, 23.213, 9.64], [144.0, 23.317, 12.15],\n [148.0, 23.414, 14.88], [152.0, 23.506, 17.84], [156.0, 23.592, 21.05], [160.0, 23.673, 24.52],\n [164.0, 23.749, 28.25], [168.0, 23.821, 32.27], [172.0, 23.888, 36.59], [176.0, 23.952, 41.22],\n [180.0, 24.013, 46.18], [184.0, 24.07, 51.49], [188.0, 24.124, 56.0], [192.0, 24.176, 56.0],\n [196.0, 24.225, 56.0], [200.0, 24.271, 56.0], [204.0, 24.316, 56.0], [208.0, 24.358, 56.0],\n [212.0, 24.398, 56.0], [216.0, 24.436, 56.0], [220.0, 24.473, 56.0], [224.0, 24.508, 56.0],\n [228.0, 24.541, 56.0], [232.0, 24.573, 56.0]\n]\nexport const PSYMODEL_CB_FREQ_INDICES = PSYMODEL_CRITICAL_BANDS.map(\n (cbIdx) => PSYMODEL_THRESHOLD_TABLE[cbIdx][0] - 1\n)\n\n// Frequency to critical band mapping\nexport const PSYMODEL_FREQ_TO_CB_MAP = new Uint8Array([\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,\n 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,\n 41, 42, 43, 44, 45, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53,\n 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62,\n 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 71,\n 71, 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, 76, 76,\n 76, 76, 77, 77, 77, 77, 78, 78, 78, 78, 79, 79, 79, 79, 80, 80, 80, 80, 81,\n 81, 81, 81, 82, 82, 82, 82, 83, 83, 83, 83, 84, 84, 84, 84, 85, 85, 85, 85,\n 86, 86, 86, 86, 87, 87, 87, 87, 88, 88, 88, 88, 89, 89, 89, 89, 90, 90, 90,\n 90, 91, 91, 91, 91, 92, 92, 92, 92, 93, 93, 93, 93, 94, 94, 94, 94, 95, 95,\n 95, 95, 96, 96, 96, 96, 97, 97, 97, 97, 98, 98, 98, 98, 99, 99, 99, 99, 100,\n 100, 100, 100, 101, 101, 101, 101, 102, 102, 102, 102, 103, 103, 103, 103,\n 104, 104, 104, 104, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,\n 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,\n 105,\n])\n","/**\n * Carta1 Audio Codec - Bitstream Operations\n *\n * This module provides low-level bitstream packing and unpacking operations\n * for reading and writing ATRAC1 frame data with bit-level precision.\n */\n\n/**\n * Pack bits into a buffer at a specific bit position\n * @param {Uint8Array} buffer - Destination buffer\n * @param {number} bitPosition - Bit position to start writing at\n * @param {number} value - Value to pack\n * @param {number} bitCount - Number of bits to pack\n */\nexport function packBits(buffer, bitPosition, value, bitCount) {\n if (bitCount === 0) return\n\n let byteIndex = Math.floor(bitPosition / 8)\n let bitOffset = bitPosition % 8\n\n value &= (1 << bitCount) - 1\n\n let bitsWritten = 0\n while (bitsWritten < bitCount && byteIndex < buffer.length) {\n const bitsAvailable = 8 - bitOffset\n const bitsToWrite = Math.min(bitCount - bitsWritten, bitsAvailable)\n\n const shift = bitCount - bitsWritten - bitsToWrite\n const valueBits = (value >> shift) & ((1 << bitsToWrite) - 1)\n\n const mask = ((1 << bitsToWrite) - 1) << (bitsAvailable - bitsToWrite)\n buffer[byteIndex] =\n (buffer[byteIndex] & ~mask) | (valueBits << (bitsAvailable - bitsToWrite))\n\n bitsWritten += bitsToWrite\n byteIndex++\n bitOffset = 0\n }\n}\n\n/**\n * Unpack bits from a buffer at a specific bit position\n * @param {Uint8Array} buffer - Source buffer\n * @param {number} bitPosition - Bit position to start reading from\n * @param {number} bitCount - Number of bits to unpack\n * @returns {number} Unpacked unsigned value\n */\nexport function unpackBits(buffer, bitPosition, bitCount) {\n if (bitCount === 0) return 0\n\n let byteIndex = Math.floor(bitPosition / 8)\n let bitOffset = bitPosition % 8\n let value = 0\n\n for (let bitsRead = 0; bitsRead < bitCount && byteIndex < buffer.length; ) {\n const bitsAvailable = 8 - bitOffset\n const bitsToRead = Math.min(bitCount - bitsRead, bitsAvailable)\n\n const mask = (1 << bitsToRead) - 1\n const bits = (buffer[byteIndex] >> (bitsAvailable - bitsToRead)) & mask\n\n value = (value << bitsToRead) | bits\n bitsRead += bitsToRead\n byteIndex++\n bitOffset = 0\n }\n\n return value\n}\n\n/**\n * Unpack signed bits from a buffer at a specific bit position\n * @param {Uint8Array} buffer - Source buffer\n * @param {number} bitPosition - Bit position to start reading from\n * @param {number} bitCount - Number of bits to unpack\n * @returns {number} Unpacked signed value (two's complement)\n */\nexport function unpackSignedBits(buffer, bitPosition, bitCount) {\n const value = unpackBits(buffer, bitPosition, bitCount)\n const signBit = 1 << (bitCount - 1)\n return value >= signBit ? value - (1 << bitCount) : value\n}\n","/**\n * Carta1 Audio Codec - Serialization Module\n *\n * Handles serialization and deserialization of ATRAC1 audio frames and AEA file format.\n * Provides functions for packing encoded frame data into binary format and unpacking\n * it back into structured data for processing.\n *\n * The module manages:\n * - Frame data serialization/deserialization with proper bit packing\n * - AEA file header creation and parsing\n * - Binary format compliance for ATRAC1 specification\n */\n\nimport {\n SOUND_UNIT_SIZE,\n BFU_AMOUNTS,\n SPECS_PER_BFU,\n AEA_HEADER_SIZE,\n AEA_MAGIC,\n AEA_TITLE_OFFSET,\n AEA_TITLE_SIZE,\n AEA_FRAME_COUNT_OFFSET,\n AEA_CHANNEL_COUNT_OFFSET,\n WORD_LENGTH_BITS,\n FRAME_HEADER_BITS,\n FRAME_WORD_LENGTH_BITS,\n FRAME_SCALE_FACTOR_BITS,\n} from '../core/constants.js'\nimport { packBits, unpackBits, unpackSignedBits } from './bitstream.js'\n\n/**\n * Serializes encoded frame data into binary format\n * @param {Object} frameData - The encoded frame data to serialize\n * @param {number} frameData.nBfu - Number of block floating units\n * @param {number[]} frameData.blockModes - Block modes for each band [0-2]\n * @param {Int32Array} frameData.scaleFactorIndices - Scale factor indices for each BFU\n * @param {Int32Array} frameData.wordLengthIndices - Word length indices for each BFU\n * @param {Int32Array[]} frameData.quantizedCoefficients - Quantized spectral coefficients\n * @returns {Uint8Array} Serialized frame data buffer\n */\nexport function serializeFrame(frameData) {\n const buffer = new Uint8Array(SOUND_UNIT_SIZE)\n const view = new DataView(buffer.buffer)\n\n // Pack header (16 bits)\n const bfuIndex = BFU_AMOUNTS.indexOf(frameData.nBfu)\n const header =\n ((2 - frameData.blockModes[0]) << 14) |\n ((2 - frameData.blockModes[1]) << 12) |\n ((3 - frameData.blockModes[2]) << 10) |\n (bfuIndex << 5)\n\n view.setUint16(0, header, false)\n let bitPosition = FRAME_HEADER_BITS\n\n // Pack word lengths (4 bits each)\n for (let i = 0; i < frameData.nBfu; i++) {\n packBits(\n buffer,\n bitPosition,\n frameData.wordLengthIndices[i],\n FRAME_WORD_LENGTH_BITS\n )\n bitPosition += FRAME_WORD_LENGTH_BITS\n }\n\n // Pack scale factors (6 bits each)\n for (let i = 0; i < frameData.nBfu; i++) {\n packBits(\n buffer,\n bitPosition,\n frameData.scaleFactorIndices[i],\n FRAME_SCALE_FACTOR_BITS\n )\n bitPosition += FRAME_SCALE_FACTOR_BITS\n }\n\n // Pack quantized coefficients\n for (let i = 0; i < frameData.nBfu; i++) {\n const bitsPerSample = WORD_LENGTH_BITS[frameData.wordLengthIndices[i]]\n if (bitsPerSample > 0) {\n const coefficients = frameData.quantizedCoefficients[i]\n for (const coefficient of coefficients) {\n const value =\n coefficient < 0 ? coefficient + (1 << bitsPerSample) : coefficient\n packBits(buffer, bitPosition, value, bitsPerSample)\n bitPosition += bitsPerSample\n }\n }\n }\n\n // Zero padding at end\n buffer[SOUND_UNIT_SIZE - 3] = 0\n buffer[SOUND_UNIT_SIZE - 2] = 0\n buffer[SOUND_UNIT_SIZE - 1] = 0\n\n return buffer\n}\n\n/**\n * Deserializes binary frame data back into structured format\n * @param {Uint8Array} buffer - Binary frame data buffer\n * @returns {Object} Deserialized frame data\n * @returns {number} returns.nBfu - Number of block floating units\n * @returns {number[]} returns.blockModes - Block modes for each band\n * @returns {Int32Array} returns.scaleFactorIndices - Scale factor indices for each BFU\n * @returns {Int32Array} returns.wordLengthIndices - Word length indices for each BFU\n * @returns {Int32Array[]} returns.quantizedCoefficients - Quantized spectral coefficients\n * @throws {Error} If buffer size is invalid\n */\nexport function deserializeFrame(buffer) {\n if (buffer.length !== SOUND_UNIT_SIZE) {\n throw new Error(`Frame must be ${SOUND_UNIT_SIZE} bytes`)\n }\n\n const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength)\n\n // Unpack header\n const header = view.getUint16(0, false)\n const blockModes = [\n 2 - ((header >> 14) & 3),\n 2 - ((header >> 12) & 3),\n 3 - ((header >> 10) & 3),\n ]\n const bfuIndex = (header >> 5) & 7\n const nBfu = BFU_AMOUNTS[bfuIndex]\n\n let bitPosition = FRAME_HEADER_BITS\n\n // Unpack word lengths\n const wordLengthIndices = new Int32Array(nBfu)\n for (let i = 0; i < nBfu; i++) {\n wordLengthIndices[i] = unpackBits(\n buffer,\n bitPosition,\n FRAME_WORD_LENGTH_BITS\n )\n bitPosition += FRAME_WORD_LENGTH_BITS\n }\n\n // Unpack scale factors\n const scaleFactorIndices = new Int32Array(nBfu)\n for (let i = 0; i < nBfu; i++) {\n scaleFactorIndices[i] = unpackBits(\n buffer,\n bitPosition,\n FRAME_SCALE_FACTOR_BITS\n )\n bitPosition += FRAME_SCALE_FACTOR_BITS\n }\n\n // Unpack coefficients\n const quantizedCoefficients = []\n for (let i = 0; i < nBfu; i++) {\n const bitsPerSample = WORD_LENGTH_BITS[wordLengthIndices[i]]\n const bfuSize = SPECS_PER_BFU[i]\n const coefficients = new Int32Array(bfuSize)\n\n if (bitsPerSample > 0) {\n for (let j = 0; j < bfuSize; j++) {\n coefficients[j] = unpackSignedBits(buffer, bitPosition, bitsPerSample)\n bitPosition += bitsPerSample\n }\n }\n\n quantizedCoefficients.push(coefficients)\n }\n\n return {\n nBfu,\n scaleFactorIndices,\n wordLengthIndices,\n quantizedCoefficients,\n blockModes,\n }\n}\n\n/**\n * AEA file format handler for ATRAC1 audio files\n * Manages creation and parsing of AEA file headers\n */\nexport class AeaFile {\n /**\n * Creates an AEA file header with the specified metadata\n * @param {string} [title=''] - Audio file title (max 255 characters)\n * @param {number} [frameCount=0] - Number of audio frames in the file\n * @param {number} [channelCount=1] - Number of audio channels (1 or 2)\n * @returns {Uint8Array} AEA file header buffer\n */\n static createHeader(title = '', frameCount = 0, channelCount = 1) {\n const header = new Uint8Array(AEA_HEADER_SIZE)\n const view = new DataView(header.buffer)\n\n // Magic number\n header.set(AEA_MAGIC, 0)\n\n // Title (null-terminated string)\n const titleBytes = new TextEncoder().encode(title)\n header.set(\n titleBytes.subarray(0, Math.min(titleBytes.length, AEA_TITLE_SIZE - 1)),\n AEA_TITLE_OFFSET\n )\n\n // Frame count\n view.setUint32(AEA_FRAME_COUNT_OFFSET, frameCount, true)\n\n // Channel count\n header[AEA_CHANNEL_COUNT_OFFSET] = channelCount\n\n return header\n }\n\n /**\n * Parses an AEA file header to extract metadata\n * @param {Uint8Array} header - AEA file header buffer\n * @returns {Object} Parsed header information\n * @returns {string} returns.title - Audio file title\n * @returns {number} returns.frameCount - Number of audio frames\n * @returns {number} returns.channelCount - Number of audio channels\n * @throws {Error} If header size is invalid or magic number doesn't match\n */\n static parseHeader(header) {\n if (header.length !== AEA_HEADER_SIZE) {\n throw new Error(`Header must be ${AEA_HEADER_SIZE} bytes`)\n }\n\n // Check magic number\n for (let i = 0; i < AEA_MAGIC.length; i++) {\n if (header[i] !== AEA_MAGIC[i]) {\n throw new Error('Invalid AEA file')\n }\n }\n\n const view = new DataView(\n header.buffer,\n header.byteOffset,\n header.byteLength\n )\n\n // Extract title\n const titleEnd = header.indexOf(0, AEA_TITLE_OFFSET)\n const titleLength =\n titleEnd === -1 ? AEA_TITLE_SIZE : titleEnd - AEA_TITLE_OFFSET\n const title = new TextDecoder().decode(\n header.subarray(AEA_TITLE_OFFSET, AEA_TITLE_OFFSET + titleLength)\n )\n\n // Extract metadata\n const frameCount = view.getUint32(AEA_FRAME_COUNT_OFFSET, true)\n const channelCount = header[AEA_CHANNEL_COUNT_OFFSET]\n\n return { title, frameCount, channelCount }\n }\n}\n","/**\n * Carta1 Audio Codec - Encoder Options\n *\n * This module provides configuration management for the ATRAC1 encoder,\n * including parameter validation and metadata for UI controls.\n */\n\n/**\n * Configuration options for the ATRAC1 encoder\n */\nclass EncoderOptions {\n /**\n * Create a new EncoderOptions instance\n * @param {Object} options - Initial option values\n */\n constructor(options = {}) {\n this.values = {\n transientThresholdLow: 1.0,\n transientThresholdMid: 1.5,\n transientThresholdHigh: 2.0,\n normalizationDb: 68,\n }\n\n this.metadata = {\n transientThresholdLow: {\n default: this.values.transientThresholdLow,\n name: 'Low Band Transient Threshold',\n description:\n 'Controls the transient detection threshold for the low frequency band (0-5.5kHz). Lower values make detection more sensitive, triggering short blocks more easily. Higher values require stronger transients.',\n range: [0.01, 2],\n step: 0.01,\n },\n transientThresholdMid: {\n default: this.values.transientThresholdMid,\n name: 'Mid Band Transient Threshold',\n description:\n 'Controls the transient detection threshold for the mid frequency band (5.5-11kHz). Lower values make detection more sensitive, triggering short blocks more easily. Higher values require stronger transients.',\n range: [0.01, 3],\n step: 0.01,\n },\n transientThresholdHigh: {\n default: this.values.transientThresholdHigh,\n name: 'High Band Transient Threshold',\n description:\n 'Controls the transient detection threshold for the high frequency band (11-22kHz). Lower values make detection more sensitive, triggering short blocks more easily. Higher values require stronger transients.',\n range: [0.01, 4],\n step: 0.01,\n },\n normalizationDb: {\n default: this.values.normalizationDb,\n name: 'Normalization Target (dB)',\n description:\n 'Sets the target maximum level in decibels for psychoacoustic model normalization. This affects the dynamic range allocation and quantization precision. Higher values may increase bitrate but preserve more detail.',\n range: [60, 80],\n step: 1,\n },\n }\n\n // Apply user-provided options\n if (options) {\n this.setOptions(options)\n }\n }\n\n /**\n * Set multiple options at once\n * @param {Object} options - Object containing option key-value pairs\n */\n setOptions(options) {\n for (const [key, value] of Object.entries(options)) {\n if (key in this.values) {\n this.setValue(key, value)\n }\n }\n }\n\n /**\n * Set a single option value with validation\n * @param {string} key - Option key\n * @param {*} value - Option value\n * @throws {Error} If key is unknown or value is out of range\n */\n setValue(key, value) {\n if (!(key in this.metadata)) {\n throw new Error(`Unknown option: ${key}`)\n }\n\n const meta = this.metadata[key]\n const [min, max] = meta.range\n\n if (value < min || value > max) {\n throw new Error(\n `Value for ${key} must be between ${min} and ${max}, got ${value}`\n )\n }\n\n this.values[key] = value\n }\n\n /**\n * Get the value of an option\n * @param {string} key - Option key\n * @returns {*} Option value\n * @throws {Error} If key is unknown\n */\n getValue(key) {\n if (!(key in this.values)) {\n throw new Error(`Unknown option: ${key}`)\n }\n return this.values[key]\n }\n\n get transientThresholdLow() {\n return this.values.transientThresholdLow\n }\n\n get transientThresholdMid() {\n return this.values.transientThresholdMid\n }\n\n get transientThresholdHigh() {\n return this.values.transientThresholdHigh\n }\n\n get normalizationDb() {\n return this.values.normalizationDb\n }\n\n getMetadata(key) {\n return this.metadata[key]\n }\n\n getAllMetadata() {\n return { ...this.metadata }\n }\n\n reset() {\n for (const [key, meta] of Object.entries(this.metadata)) {\n this.values[key] = meta.default\n }\n }\n\n toObject() {\n return {\n values: { ...this.values },\n metadata: { ...this.metadata },\n }\n }\n}\n\nexport { EncoderOptions }\n","/**\n * Carta1 Audio Codec - Utilities\n *\n * This module provides common utility functions for the ATRAC1 codec including\n * pipeline composition, error handling, and audio stream processing utilities\n * for delay compensation and frame padding.\n */\n\nimport { CODEC_DELAY, SAMPLES_PER_FRAME } from './core/constants.js'\n\n/**\n * Throws an error with the given message\n * @param {string} msg - Error message\n * @throws {Error} Always throws an error with the provided message\n */\nexport function throwError(msg) {\n throw new Error(msg)\n}\n\n/**\n * Creates a pipeline by composing multiple processing stages\n * @param {Object} context - Shared context passed to all stages\n * @param {...Function} stages - Stage functions to compose\n * @returns {Function} Composed pipeline function\n */\nexport function pipe(context, ...stages) {\n const functions = stages.map((stage) => stage(context))\n\n return (input) => {\n return functions.reduce((value, fn) => fn(value), input)\n }\n}\n\n/**\n * Pads audio frames and adds flush samples for proper codec delay handling\n * @param {AsyncIterable<Float32Array>} iter - Input frame stream\n * @param {number} [samplesToFlush=CODEC_DELAY] - Number of samples to flush\n * @yields {Float32Array} Padded frames with flush samples\n */\nexport async function* withFlushSamples(iter, samplesToFlush = CODEC_DELAY) {\n let lastFrameLength = SAMPLES_PER_FRAME\n for await (const frame of iter) {\n lastFrameLength = frame.length\n if (lastFrameLength === SAMPLES_PER_FRAME) {\n yield frame\n } else {\n // We need to pad\n const paddedFrame = new Float32Array(SAMPLES_PER_FRAME)\n paddedFrame.set(frame)\n yield paddedFrame\n }\n }\n if (SAMPLES_PER_FRAME - lastFrameLength < samplesToFlush) {\n yield new Float32Array(SAMPLES_PER_FRAME)\n }\n}\n\n/**\n * Applies delay compensation to PCM frame stream by dropping initial samples\n * @param {AsyncIterable<Float32Array>} pcmFrameStream - Input PCM frame stream\n * @param {number} [samplesToDrop=CODEC_DELAY] - Number of samples to drop for delay compensation\n * @yields {Float32Array} Delay-compensated PCM frames\n */\nexport async function* withDelayCompensation(\n pcmFrameStream,\n samplesToDrop = CODEC_DELAY\n) {\n let buffer = new Float32Array(0)\n let droppedInitialSamples = false\n\n for await (const frame of pcmFrameStream) {\n // Drop samples from the very first frame only\n if (!droppedInitialSamples) {\n droppedInitialSamples = true\n if (samplesToDrop >= frame.length) {\n // Entire first frame is dropped\n samplesToDrop -= frame.length\n continue\n }\n // Keep only the portion after dropped samples\n buffer = frame.slice(samplesToDrop)\n samplesToDrop = 0\n continue\n }\n\n // Concatenate buffer with new frame\n const combined = new Float32Array(buffer.length + frame.length)\n combined.set(buffer)\n combined.set(frame, buffer.length)\n\n // Emit all complete frames\n let offset = 0\n while (offset + SAMPLES_PER_FRAME <= combined.length) {\n yield combined.slice(offset, offset + SAMPLES_PER_FRAME)\n offset += SAMPLES_PER_FRAME\n }\n\n // Buffer the remainder for next iteration\n buffer = combined.slice(offset)\n }\n\n // Emit final partial frame\n if (buffer.length > 0) {\n yield buffer\n }\n}\n\n/**\n * Adapts a mono transform function to work with stereo audio streams\n * @param {Function} monoTransform - Transform function for mono audio\n * @param {...*} args - Additional arguments to pass to the transform\n * @returns {Function} Stereo-adapted transform function\n */\nexport function withStereo(monoTransform, ...args) {\n return async function* (stereoIter) {\n // Buffer to store frames temporarily\n const leftFrames = []\n const rightFrames = []\n\n // Collect all frames first (necessary for proper synchronization)\n for await (const [left, right] of stereoIter) {\n leftFrames.push(left)\n rightFrames.push(right)\n }\n\n // Create mono iterators\n const leftIter = (async function* () {\n for (const frame of leftFrames) yield frame\n })()\n\n const rightIter = (async function* () {\n for (const frame of rightFrames) yield frame\n })()\n\n // Apply transform to each channel\n const leftTransformed = monoTransform(leftIter, ...args)\n const rightTransformed = monoTransform(rightIter, ...args)\n\n // Zip back together\n for await (const left of leftTransformed) {\n const { value: right } = await rightTransformed.next()\n if (right !== undefined) {\n yield [left, right]\n }\n }\n }\n}\n\n/**\n * Reverses the spectral order of coefficients for mid/high band processing\n *\n * Used in both MDCT and IMDCT stages to handle spectral reversal required\n * by the ATRAC1 format for mid and high frequency bands.\n *\n * @param {Float32Array} spectrum - Input spectrum coefficients\n * @param {Object} reversalBuffers - Pre-allocated buffers for different spectrum sizes\n * @returns {Float32Array} Spectrum with reversed coefficient order\n */\nexport function reverseSpectrum(spectrum, reversalBuffers) {\n const reversed = reversalBuffers[spectrum.length]\n for (let i = 0; i < spectrum.length; i++) {\n reversed[i] = spectrum[spectrum.length - 1 - i]\n }\n return reversed\n}\n\n/**\n * Calculates the starting offset for a frequency band in the coefficient array\n *\n * @param {number} bandIndex - Band index (0=low, 1=mid, 2=high)\n * @returns {number} Starting offset in the 512-sample coefficient array\n */\nexport function calculateBandOffset(bandIndex) {\n return bandIndex === 0 ? 0 : bandIndex === 1 ? 128 : 256\n}\n\n/**\n * Extracts coefficients for a specific frequency band from the full coefficient array\n *\n * @param {Float32Array} coefficients - Full 512-sample coefficient array\n * @param {number} bandIndex - Band index (0=low, 1=mid, 2=high)\n * @returns {Float32Array} Subarray containing coefficients for the specified band\n */\nexport function extractBandCoefficients(coefficients, bandIndex) {\n const offsets = [0, 128, 256, 512]\n return coefficients.subarray(offsets[bandIndex], offsets[bandIndex + 1])\n}\n\n// Stereo-adapted utility functions\nexport const withStereoFlushSamples = withStereo(withFlushSamples)\nexport const withStereoDelayCompensation = withStereo(withDelayCompensation)\n","/**\n * Carta1 Audio Codec - Quadrature Mirror Filter\n *\n * This module implements QMF analysis and synthesis for subband decomposition\n * in the ATRAC1 codec. The QMF splits the audio signal into multiple frequency\n * bands for independent processing and coding.\n */\n\nimport { QMF_DELAY, QMF_EVEN, QMF_ODD } from '../core/constants.js'\nimport { throwError } from '../utils.js'\n\n/**\n * Perform QMF analysis filtering to split input into low and high frequency bands\n * @param {Float32Array} input - Input audio samples\n * @param {Float32Array} delayLine - QMF delay line state\n * @param {Object} qmfWorkBuffers - Optional work buffers for processing\n * @returns {Object} Object containing lowBand, highBand, and newDelay\n */\nexport function qmfAnalysis(input, delayLine, qmfWorkBuffers = null) {\n const inputLength = input.length\n const outputLength = inputLength >> 1\n\n const workBuffer =\n qmfWorkBuffers?.delay?.[inputLength] ??\n throwError(`qmfAnalysis: qmfWorkBuffers.delay[${inputLength}] is required`)\n workBuffer.set(delayLine)\n workBuffer.set(input, delayLine.length)\n\n const lowBand = new Float32Array(outputLength)\n const highBand = new Float32Array(outputLength)\n\n for (let i = 0; i < outputLength; i++) {\n let evenSum = 0\n let oddSum = 0\n const offset = i * 2\n\n // Unrolled convolution\n for (let j = 0; j < 24; j++) {\n evenSum += workBuffer[offset + 47 - j * 2] * QMF_EVEN[j]\n oddSum += workBuffer[offset + 46 - j * 2] * QMF_ODD[j]\n }\n\n lowBand[i] = evenSum + oddSum\n highBand[i] = evenSum - oddSum\n }\n\n // Update delay line\n const newDelay = workBuffer.slice(-QMF_DELAY)\n return { lowBand, highBand, newDelay }\n}\n\n/**\n * Perform QMF synthesis filtering to reconstruct audio from low and high frequency bands\n * @param {Float32Array} lowBand - Low frequency band samples\n * @param {Float32Array} highBand - High frequency band samples\n * @param {Float32Array} delayLine - QMF delay line state\n * @param {Object} qmfWorkBuffers - Optional work buffers for processing\n * @returns {Object} Object containing output and newDelay\n */\nexport function qmfSynthesis(\n lowBand,\n highBand,\n delayLine,\n qmfWorkBuffers = null\n) {\n const subbandLength = lowBand.length\n const outputLength = subbandLength * 2\n\n const workBuffer =\n qmfWorkBuffers?.delay?.[outputLength] ??\n throwError(\n `qmfSynthesis: qmfWorkBuffers.delay[${outputLength}] is required`\n )\n workBuffer.set(delayLine)\n\n // Upsample and merge\n for (let i = 0; i < subbandLength; i++) {\n const low = lowBand[i]\n const high = highBand[i]\n const offset = QMF_DELAY + i * 2\n workBuffer[offset] = 0.5 * (low + high)\n workBuffer[offset + 1] = 0.5 * (low - high)\n }\n\n const output = new Float32Array(outputLength)\n\n // Convolution\n for (let i = 0; i < subbandLength; i++) {\n const offset = i * 2\n let sample0 = 0\n let sample1 = 0\n\n for (let j = 0; j < 24; j++) {\n const idx = offset + j * 2\n sample0 += workBuffer[idx] * QMF_EVEN[j]\n sample1 += workBuffer[idx + 1] * QMF_ODD[j]\n }\n\n output[i * 2] = sample1\n output[i * 2 + 1] = sample0\n }\n\n const newDelay = workBuffer.slice(-QMF_DELAY)\n return { output, newDelay }\n}\n","/**\n * Carta1 Audio Codec - Fast Fourier Transform\n * Optimized radix-2 Cooley-Tukey FFT implementation\n */\nexport class FFT {\n static _cache = new Map()\n\n /**\n * Perform an in-place forward FFT on complex data.\n * @param {Float32Array} real - Real part of the input/output data\n * @param {Float32Array} imag - Imaginary part of the input/output data\n */\n static fft(real, imag) {\n const n = real.length\n if (n !== imag.length) throw new Error('Mismatched array lengths.')\n if ((n & (n - 1)) !== 0) throw new Error('Length must be power of 2.')\n if (n <= 1) return\n\n let cache = FFT._cache.get(n)\n if (!cache) {\n cache = FFT._buildCache(n)\n FFT._cache.set(n, cache)\n }\n\n const bitRev = cache.bitRev\n const cosTbl = cache.cos\n const sinTbl = cache.sin\n\n // Bit reversal\n for (let i = 0; i < n; i++) {\n const j = bitRev[i]\n if (j > i) {\n let tr = real[i]\n let ti = imag[i]\n real[i] = real[j]\n imag[i] = imag[j]\n real[j] = tr\n imag[j] = ti\n }\n }\n\n // First stage: stride=2\n for (let i = 0; i < n; i += 2) {\n let r0 = real[i],\n i0 = imag[i]\n let r1 = real[i + 1],\n i1 = imag[i + 1]\n real[i] = r0 + r1\n imag[i] = i0 + i1\n real[i + 1] = r0 - r1\n imag[i + 1] = i0 - i1\n }\n\n // Second stage: stride=4\n if (n >= 4) {\n for (let i = 0; i < n; i += 4) {\n let r0 = real[i],\n i0 = imag[i]\n let r2 = real[i + 2],\n i2 = imag[i + 2]\n real[i] = r0 + r2\n imag[i] = i0 + i2\n real[i + 2] = r0 - r2\n imag[i + 2] = i0 - i2\n\n r0 = real[i + 1]\n i0 = imag[i + 1]\n r2 = real[i + 3]\n i2 = imag[i + 3]\n // W^1 = -i\n let tR = i2\n let tI = -r2\n real[i + 1] = r0 + tR\n imag[i + 1] = i0 + tI\n real[i + 3] = r0 - tR\n imag[i + 3] = i0 - tI\n }\n }\n\n // Higher stages\n for (let stride = 8; stride <= n; stride <<= 1) {\n const halfStride = stride >>> 1\n const tblStep = n / stride\n for (let base = 0; base < n; base += stride) {\n // k = 0\n let r0 = real[base],\n i0 = imag[base]\n let r1 = real[base + halfStride],\n i1 = imag[base + halfStride]\n real[base] = r0 + r1\n imag[base] = i0 + i1\n real[base + halfStride] = r0 - r1\n imag[base + halfStride] = i0 - i1\n\n let tw = tblStep\n for (let k = 1; k < halfStride; k++) {\n const c = cosTbl[tw]\n const s = sinTbl[tw]\n r1 = real[base + k]\n i1 = imag[base + k]\n let r2 = real[base + k + halfStride]\n let i2 = imag[base + k + halfStride]\n let tr = r2 * c - i2 * s\n let ti = r2 * s + i2 * c\n real[base + k] = r1 + tr\n imag[base + k] = i1 + ti\n real[base + k + halfStride] = r1 - tr\n imag[base + k + halfStride] = i1 - ti\n tw += tblStep\n }\n }\n }\n }\n\n /**\n * Build cache tables for FFT of size n\n * @private\n */\n static _buildCache(n) {\n const bitRev = new Uint32Array(n)\n const log2n = Math.log2(n) | 0\n for (let i = 1; i < n; i++) {\n bitRev[i] = (bitRev[i >>> 1] >>> 1) | ((i & 1) << (log2n - 1))\n }\n const halfN = n >>> 1\n const cosTbl = new Float32Array(halfN)\n const sinTbl = new Float32Array(halfN)\n const ang = (-2 * Math.PI) / n\n for (let i = 0; i < halfN; i++) {\n const a = ang * i\n cosTbl[i] = Math.cos(a)\n sinTbl[i] = Math.sin(a)\n }\n return { bitRev, cos: cosTbl, sin: sinTbl }\n }\n}\n","/**\n * Carta1 Audio Codec - Modified Discrete Cosine Transform\n *\n * This module implements forward and inverse MDCT transforms for the ATRAC1 codec.\n * The MDCT provides time-frequency analysis with perfect reconstruction and\n * 50% overlap between adjacent blocks to avoid blocking artifacts.\n */\n\nimport { FFT } from './fft.js'\nimport {\n MDCT_SIZE_SHORT,\n MDCT_SIZE_MID,\n MDCT_SIZE_LONG,\n} from '../core/constants.js'\nimport { throwError } from '../utils.js'\n\n/**\n * Base class for MDCT and IMDCT transforms\n */\nclass MDCTBase {\n constructor(size, scale) {\n this.size = size\n this.halfSize = size >> 1\n this.quarterSize = size >> 2\n this.fftSize = this.halfSize >> 1\n\n const alpha = (2.0 * Math.PI) / (8.0 * size)\n const omega = (2.0 * Math.PI) / size\n const scaleRoot = Math.sqrt(scale / size)\n\n this.sinCosTable = new Float32Array(this.halfSize)\n for (let i = 0; i < this.quarterSize; i++) {\n const angle = omega * i + alpha\n this.sinCosTable[i * 2] = scaleRoot * Math.cos(angle)\n this.sinCosTable[i * 2 + 1] = scaleRoot * Math.sin(angle)\n }\n }\n}\n\n/**\n * Forward MDCT transform\n */\nexport class MDCT extends MDCTBase {\n constructor(size, scale) {\n super(size, scale)\n }\n\n /**\n * Perform forward MDCT transform\n * @param {Float32Array} input - Time-domain input samples\n * @param {Object} mdctBuffers - Optional work buffers for FFT\n * @returns {Float32Array} Frequency-domain MDCT coefficients\n */\n transform(input, mdctBuffers = null) {\n const buffers =\n mdctBuffers?.[this.fftSize] ??\n throwError(`MDCT.transform: mdctBuffers[${this.fftSize}] is required`)\n const real =\n buffers?.real ??\n throwError(\n `MDCT.transform: mdctBuffers[${this.fftSize}].real is required`\n )\n const imag =\n buffers?.imag ??\n throwError(\n `MDCT.transform: mdctBuffers[${this.fftSize}].imag is required`\n )\n\n const n4 = this.quarterSize\n const n34 = 3 * n4\n\n real.fill(0)\n imag.fill(0)\n\n // Pre-FFT butterfly\n for (let i = 0; i < n4; i += 2) {\n const i1 = n34 - 1 - i\n const i2 = n34 + i\n const i3 = n4 + i\n const i4 = n4 - 1 - i\n\n const r = input[i1] + input[i2]\n const im = input[i3] - input[i4]\n const c = this.sinCosTable[i]\n const s = this.sinCosTable[i + 1]\n\n real[i >> 1] = r * c + im * s\n imag[i >> 1] = im * c - r * s\n }\n\n for (let i = n4; i < this.halfSize; i += 2) {\n const idx = i >> 1\n const i1 = n34 - 1 - i\n const i2 = i - n4\n const i3 = n4 + i\n const i4 = 5 * n4 - 1 - i\n\n const r = input[i1] - input[i2]\n const im = input[i3] + input[i4]\n const c = this.sinCosTable[i]\n const s = this.sinCosTable[i + 1]\n\n real[idx] = r * c + im * s\n imag[idx] = im * c - r * s\n }\n\n FFT.fft(real, imag)\n\n // Post-FFT processing\n const output = new Float32Array(this.halfSize)\n for (let i = 0; i < this.fftSize; i++) {\n const c = this.sinCosTable[i * 2]\n const s = this.sinCosTable[i * 2 + 1]\n const re = real[i]\n const im = imag[i]\n\n output[i * 2] = -re * c - im * s\n output[this.halfSize - 1 - i * 2] = -re * s + im * c\n }\n\n return output\n }\n}\n\n/**\n * Inverse MDCT transform\n */\nexport class IMDCT extends MDCTBase {\n constructor(size, scale = null) {\n super(size, scale || size)\n }\n\n /**\n * Perform inverse MDCT transform\n * @param {Float32Array} input - Frequency-domain MDCT coefficients\n * @param {Object} mdctBuffers - Optional work buffers for FFT\n * @returns {Float32Array} Time-domain output samples\n */\n transform(input, mdctBuffers = null) {\n const buffers =\n mdctBuffers?.[this.fftSize] ??\n throwError(`IMDCT.transform: mdctBuffers[${this.fftSize}] is required`)\n const real =\n buffers?.real ??\n throwError(\n `IMDCT.transform: mdctBuffers[${this.fftSize}].real is required`\n )\n const imag =\n buffers?.imag ??\n throwError(\n `IMDCT.transform: mdctBuffers[${this.fftSize}].imag is required`\n )\n\n const n4 = this.quarterSize\n const n34 = 3 * n4\n\n real.fill(0)\n imag.fill(0)\n\n // Pre-FFT processing\n for (let i = 0; i < this.fftSize; i++) {\n const i2 = i * 2\n const r = input[i2]\n const im = input[this.halfSize - 1 - i2]\n const c = this.sinCosTable[i2]\n const s = this.sinCosTable[i2 + 1]\n\n real[i] = -2.0 * (im * s + r * c)\n imag[i] = -2.0 * (im * c - r * s)\n }\n\n FFT.fft(real, imag)\n\n // Post-FFT butterfly\n const output = new Float32Array(this.size)\n\n for (let i = 0; i < this.fftSize / 2; i++) {\n const i2 = i * 2\n const c = this.sinCosTable[i2]\n const s = this.sinCosTable[i2 + 1]\n const re = real[i]\n const im = imag[i]\n\n const r1 = re * c + im * s\n const i1 = re * s - im * c\n\n output[n34 - 1 - i2] = r1\n output[n34 + i2] = r1\n output[n4 + i2] = i1\n output[n4 - 1 - i2] = -i1\n }\n\n for (let i = this.fftSize / 2; i < this.fftSize; i++) {\n const idx = (i - this.fftSize / 2) * 2 + n4\n const i2 = i * 2\n const c = this.sinCosTable[i2]\n const s = this.sinCosTable[i2 + 1]\n const re = real[i]\n const im = imag[i]\n\n const r1 = re * c + im * s\n const i1 = re * s - im * c\n\n output[n34 - 1 - idx] = r1\n output[idx - n4] = -r1\n output[n4 + idx] = i1\n output[5 * n4 - 1 - idx] = i1\n }\n\n return output\n }\n}\n\n// Pre-instantiated transforms\nexport const mdct64 = new MDCT(MDCT_SIZE_SHORT, 0.5)\nexport const mdct256 = new MDCT(MDCT_SIZE_MID, 0.5)\nexport const mdct512 = new MDCT(MDCT_SIZE_LONG, 1.0)\n\nexport const imdct64 = new IMDCT(MDCT_SIZE_SHORT, MDCT_SIZE_SHORT * 4)\nexport const imdct256 = new IMDCT(MDCT_SIZE_MID, MDCT_SIZE_MID * 4)\nexport const imdct512 = new IMDCT(MDCT_SIZE_LONG, MDCT_SIZE_LONG * 2)\n\n/**\n * Perform overlap-add operation for MDCT reconstruction\n * @param {Float32Array} prev - Previous block samples\n * @param {Float32Array} curr - Current block samples\n * @param {Float32Array} window - Window function coefficients\n * @returns {Float32Array} Overlap-added output samples\n */\nexport function overlapAdd(prev, curr, window) {\n const size = prev.length\n const output = new Float32Array(size * 2)\n\n for (let i = 0; i < size; i++) {\n const w1 = window[i]\n const w2 = window[2 * size - 1 - i]\n const p = prev[i]\n const c = curr[size - 1 - i]\n\n output[i] = p * w2 - c * w1\n output[2 * size - 1 - i] = p * w1 + c * w2\n }\n\n return output\n}\n","/**\n * Carta1 Audio Codec - Quantization\n *\n * This module implements quantization and dequantization of MDCT coefficients\n * for the ATRAC1 audio codec, organizing coefficients into Block Floating Units (BFUs)\n * and applying appropriate scale factors for optimal bit allocation.\n */\n\nimport {\n SPECS_PER_BFU,\n BFU_START_LONG,\n BFU_START_SHORT,\n BFU_BAND_BOUNDARIES,\n SCALE_FACTORS,\n QUANTIZATION_SIGN_BIT_SHIFT,\n} from '../core/constants.js'\n\n/**\n * Find the optimal scale factor index for a set of coefficients\n * @param {Float32Array} coefficients - MDCT coefficients to analyze\n * @returns {number} Scale factor index (0-63)\n */\nexport function findScaleFactor(coefficients) {\n let maxAmplitude = 0\n\n for (let i = 0; i < coefficients.length; i++) {\n maxAmplitude = Math.max(maxAmplitude, Math.abs(coefficients[i]))\n }\n\n if (maxAmplitude === 0) return 0\n\n // Binary search for optimal scale factor\n let low = 0\n let high = SCALE_FACTORS.length - 1\n\n while (low < high) {\n const mid = (low + high) >> 1\n if (maxAmplitude <= SCALE_FACTORS[mid]) {\n high = mid\n } else {\n low = mid + 1\n }\n }\n\n return low\n}\n\n/**\n * Quantize floating-point coefficients to integer values\n * @param {Float32Array} coefficients - Input coefficients to quantize\n * @param {number} scaleFactorIndex - Index into SCALE_FACTORS table\n * @param {number} bitsPerSample - Number of bits per quantized sample\n * @returns {Int32Array} Quantized integer coefficients\n */\nexport function quantize(coefficients, scaleFactorIndex, bitsPerSample) {\n if (bitsPerSample === 0 || scaleFactorIndex === 0) {\n return new Int32Array(coefficients.length)\n }\n\n const scaleFactor = SCALE_FACTORS[scaleFactorIndex]\n const quantRange = (1 << (bitsPerSample - QUANTIZATION_SIGN_BIT_SHIFT)) - 1\n const normFactor = quantRange / scaleFactor\n\n const quantized = new Int32Array(coefficients.length)\n\n for (let i = 0; i < coefficients.length; i++) {\n const normalized = coefficients[i] * normFactor\n quantized[i] = Math.max(\n -quantRange - 1,\n Math.min(quantRange, Math.round(normalized))\n )\n }\n\n return quantized\n}\n\n/**\n * Dequantize integer coefficients back to floating-point values\n * @param {Int32Array} quantized - Quantized integer coefficients\n * @param {number} scaleFactorIndex - Index into SCALE_FACTORS table\n * @param {number} bitsPerSample - Number of bits per quantized sample\n * @returns {Float32Array} Dequantized floating-point coefficients\n */\nexport function dequantize(quantized, scaleFactorIndex, bitsPerSample) {\n if (bitsPerSample === 0 || scaleFactorIndex === 0) {\n return new Float32Array(quantized.length)\n }\n\n const scaleFactor = SCALE_FACTORS[scaleFactorIndex]\n const quantRange = (1 << (bitsPerSample - QUANTIZATION_SIGN_BIT_SHIFT)) - 1\n const denormFactor = scaleFactor / quantRange\n\n const dequantized = new Float32Array(quantized.length)\n\n for (let i = 0; i < quantized.length; i++) {\n dequantized[i] = quantized[i] * denormFactor\n }\n\n return dequantized\n}\n\n/**\n * Group MDCT coefficients into Block Floating Units (BFUs)\n * @param {Float32Array} coefficients - Input MDCT coefficients\n * @param {number[]} blockModes - Block mode for each band (0=long, 1=short)\n * @param {Array<Float32Array>} bfuBuffers - Optional pre-allocated BFU buffers\n * @returns {Object} Object containing bfuData, bfuSizes, and bfuCount\n */\nexport function groupIntoBFUs(coefficients, blockModes, bfuBuffers = null) {\n const bfuData = bfuBuffers ?? []\n const bfuSizes = []\n\n let coeffIndex = 0\n let bfuIndex = 0\n\n for (let band = 0; band < 3; band++) {\n const bandStart = coeffIndex\n const bandSize = band === 2 ? 256 : 128\n const bandEnd = band < 2 ? BFU_BAND_BOUNDARIES[band] : SPECS_PER_BFU.length\n const isLongBlock = blockModes[band] === 0\n const startPositions = isLongBlock ? BFU_START_LONG : BFU_START_SHORT\n\n while (bfuIndex < bandEnd) {\n const size = SPECS_PER_BFU[bfuIndex]\n const startPos = startPositions[bfuIndex] - bandStart\n\n const bfu = bfuBuffers ? bfuBuffers[bfuIndex] : new Float32Array(size)\n bfu.fill(0) // Clear the buffer\n\n if (startPos >= 0 && startPos < bandSize) {\n const endPos = Math.min(startPos + size, bandSize)\n const actualSize = endPos - startPos\n\n for (let i = 0; i < actualSize; i++) {\n bfu[i] = coefficients[bandStart + startPos + i]\n }\n }\n\n if (!bfuBuffers) {\n bfuData.push(bfu)\n }\n bfuSizes.push(size)\n bfuIndex++\n }\n\n coeffIndex += bandSize\n }\n\n return { bfuData, bfuSizes, bfuCount: bfuIndex }\n}\n","/**\n * Carta1 Audio Codec - Bit Allocation Module\n *\n * This module implements the bit allocation algorithm for ATRAC1 compression,\n * distributing available bits among Block Floating Units (BFUs) based on\n * psychoacoustic masking and signal-to-mask ratios.\n */\n\nimport {\n FRAME_BITS,\n FRAME_OVERHEAD_BITS,\n BITS_PER_BFU_METADATA,\n BFU_AMOUNTS,\n MAX_WORD_LENGTH_INDEX,\n WORD_LENGTH_BITS,\n DISTORTION_DELTA_DB,\n NUM_BFUS,\n SAMPLE_RATE,\n BFU_FREQUENCIES,\n BFU_AMOUNTS_COUNT,\n PSYMODEL_MIN_POWER_DB,\n PSYMODEL_CB_FREQ_INDICES,\n INTERPOLATION_COMPENSATION_FACTOR,\n PSYMODEL_FFT_SIZE,\n} from '../core/constants.js'\n\n/**\n * Allocate bits to BFUs based on psychoacoustic analysis\n * @param {Object} psychoResults - Psychoacoustic analysis results\n * @param {Array} bfuData - BFU coefficient data\n * @param {Array} bfuSizes - Size of each BFU\n * @param {number} maxBfuCount - Maximum number of BFUs to use\n * @returns {Object} Allocation results with BFU count and bit distribution\n */\nexport function allocateBits(psychoResults, bfuData, bfuSizes, maxBfuCount) {\n // Calculate signal energy for each BFU\n const signalEnergyDb = calculateBfuEnergy(bfuData, bfuSizes, maxBfuCount)\n\n // Interpolate critical band thresholds to BFUs\n const maskThresholdDb = interpolateCriticalBandsToBfus(\n psychoResults.criticalBandThresholds\n )\n\n // Calculate Signal-to-Mask Ratios\n const smrValues = calculateSMR(signalEnergyDb, maskThresholdDb, maxBfuCount)\n\n // Determine optimal number of BFUs to use\n const actualBfuCount = selectOptimalBfuCount(\n smrValues,\n signalEnergyDb,\n maxBfuCount\n )\n\n // Calculate available bits for allocation\n const availableBits =\n FRAME_BITS - FRAME_OVERHEAD_BITS - actualBfuCount * BITS_PER_BFU_METADATA\n\n // Perform actual bit allocation\n const allocation = performBitAllocation(\n actualBfuCount,\n smrValues,\n bfuSizes,\n availableBits\n )\n\n return {\n bfuCount: actualBfuCount,\n allocation,\n }\n}\n\n/**\n * Calculate energy in dB for each BFU\n * @param {Array} bfuData - BFU coefficient data\n * @param {Array} bfuSizes - Size of each BFU\n * @param {number} bfuCount - Number of BFUs to process\n * @returns {Float32Array} Energy values in dB\n */\nfunction calculateBfuEnergy(bfuData, bfuSizes, bfuCount) {\n const energyPerBfu = new Float32Array(bfuCount)\n\n for (let i = 0; i < bfuCount; i++) {\n const data = bfuData[i]\n const size = bfuSizes[i]\n\n if (size === 0) {\n energyPerBfu[i] = PSYMODEL_MIN_POWER_DB\n continue\n }\n\n // Calculate mean square energy\n let energy = 0\n for (let j = 0; j < size; j++) {\n energy += data[j] * data[j]\n }\n\n // Convert to dB correctly using log10\n energyPerBfu[i] =\n energy > 0 ? 10 * Math.log10(energy / size) : PSYMODEL_MIN_POWER_DB\n }\n\n return energyPerBfu\n}\n\n/**\n * Interpolate critical band thresholds directly to BFU frequencies\n * @param {Float32Array} criticalBandThresholds - Critical band thresholds\n * @returns {Float32Array} Masking threshold per BFU\n */\nfunction interpolateCriticalBandsToBfus(criticalBandThresholds) {\n const maskThresholdPerBfu = new Float32Array(NUM_BFUS)\n const freqPerBin = SAMPLE_RATE / PSYMODEL_FFT_SIZE\n\n for (let i = 0; i < NUM_BFUS; i++) {\n const bfuFreq = BFU_FREQUENCIES[i]\n const fftBinIndex = Math.round(bfuFreq / freqPerBin)\n\n // Find which critical bands surround this FFT bin\n let bandIndex = 0\n while (\n bandIndex < PSYMODEL_CB_FREQ_INDICES.length - 1 &&\n PSYMODEL_CB_FREQ_INDICES[bandIndex + 1] < fftBinIndex\n ) {\n bandIndex++\n }\n\n if (fftBinIndex <= PSYMODEL_CB_FREQ_INDICES[0]) {\n maskThresholdPerBfu[i] = criticalBandThresholds[0]\n } else if (\n fftBinIndex >=\n PSYMODEL_CB_FREQ_INDICES[PSYMODEL_CB_FREQ_INDICES.length - 1]\n ) {\n maskThresholdPerBfu[i] =\n criticalBandThresholds[criticalBandThresholds.length - 1]\n } else {\n const x0 = PSYMODEL_CB_FREQ_INDICES[bandIndex]\n const x1 = PSYMODEL_CB_FREQ_INDICES[bandIndex + 1]\n const y0 = criticalBandThresholds[bandIndex]\n const y1 = criticalBandThresholds[bandIndex + 1]\n const bandWidth = x1 - x0\n\n if (bandWidth > 0) {\n const t = (fftBinIndex - x0) / bandWidth\n const interpolated = y0 + (y1 - y0) * t\n const compensation =\n Math.abs(y1 - y0) * INTERPOLATION_COMPENSATION_FACTOR\n maskThresholdPerBfu[i] = interpolated + compensation\n } else {\n maskThresholdPerBfu[i] = y0\n }\n }\n }\n\n return maskThresholdPerBfu\n}\n\n/**\n * Calculate Signal-to-Mask Ratio for each BFU\n * @param {Float32Array} signalEnergyDb - Signal energy per BFU\n * @param {Float32Array} maskThresholdDb - Masking threshold per BFU\n * @param {number} maxBfuCount - Maximum number of BFUs\n * @returns {Float32Array} SMR values in dB\n */\nfunction calculateSMR(signalEnergyDb, maskThresholdDb, maxBfuCount) {\n const smrValues = new Float32Array(maxBfuCount)\n\n for (let bfu = 0; bfu < maxBfuCount; bfu++) {\n smrValues[bfu] =\n signalEnergyDb[bfu] <= PSYMODEL_MIN_POWER_DB\n ? -Infinity\n : signalEnergyDb[bfu] - maskThresholdDb[bfu]\n }\n\n return smrValues\n}\n\n/**\n * Select optimal number of BFUs to use based on SMR distribution\n * @param {Float32Array} smrValues - Signal-to-Mask ratios\n * @param {Float32Array} signalEnergyDb - Signal energy per BFU\n * @param {number} maxBfuCount - Maximum available BFUs\n * @returns {number} Optimal BFU count\n */\nfunction selectOptimalBfuCount(smrValues, signalEnergyDb, maxBfuCount) {\n // Check if we have any audible content (positive SMR)\n const hasAudibleContent = smrValues.some((smr) => smr > 0)\n\n if (hasAudibleContent) {\n // Create sorted list of BFUs by their contribution (positive SMR only)\n const contributions = []\n for (let i = 0; i < maxBfuCount; i++) {\n if (smrValues[i] > 0) {\n contributions.push({ index: i, smr: smrValues[i] })\n }\n }\n contributions.sort((a, b) => b.smr - a.smr)\n\n if (contributions.length === 0) {\n return BFU_AMOUNTS[BFU_AMOUNTS.length - 1]\n }\n\n // Find the natural cutoff using gradient of cumulative SMR\n const cumulativeSMR = []\n let sum = 0\n for (let i = 0; i < contributions.length; i++) {\n sum += contributions[i].smr\n cumulativeSMR.push(sum)\n }\n\n // Find where the gradient becomes shallow (diminishing returns)\n for (const candidateCount of BFU_AMOUNTS) {\n if (candidateCount > maxBfuCount) continue\n\n // Check if all significant contributions fit within this count\n const requiredBfus = contributions\n .slice(0, Math.min(contributions.length, candidateCount))\n .map((c) => c.index)\n\n const maxRequiredIndex = Math.max(...requiredBfus, 0)\n\n if (maxRequiredIndex < candidateCount) {\n // Check if we've captured the bulk of the contribution\n const capturedIndex = Math.min(\n candidateCount - 1,\n contributions.length - 1\n )\n if (capturedIndex >= contributions.length - 1) {\n return candidateCount\n }\n\n // Use gradient to detect diminishing returns\n const remainingIndices = contributions.length - capturedIndex - 1\n if (remainingIndices > 0) {\n const avgRemaining =\n (cumulativeSMR[cumulativeSMR.length - 1] -\n cumulativeSMR[capturedIndex]) /\n remainingIndices\n const avgCaptured = cumulativeSMR[capturedIndex] / (capturedIndex + 1)\n\n // If remaining BFUs contribute much less on average, we've found our cutoff\n if (avgRemaining < avgCaptured * 0.1) {\n return candidateCount\n }\n }\n }\n }\n } else {\n // Find the highest BFU index that contains actual signal\n let highestSignalBfu = -1\n for (let i = maxBfuCount - 1; i >= 0; i--) {\n if (\n signalEnergyDb[i] > PSYMODEL_MIN_POWER_DB &&\n smrValues[i] > -Infinity\n ) {\n highestSignalBfu = i\n break\n }\n }\n\n // Find smallest BFU count that includes all signal\n for (const candidateCount of BFU_AMOUNTS) {\n if (candidateCount > highestSignalBfu) {\n return candidateCount\n }\n }\n }\n\n return BFU_AMOUNTS[BFU_AMOUNTS_COUNT - 1]\n}\n\n/**\n * Allocate available bits among BFUs using a greedy algorithm\n * @param {number} actualBfuCount - Number of BFUs to allocate\n * @param {Float32Array} smrValues - Signal-to-Mask ratios\n * @param {Array} bfuSizes - Size of each BFU\n * @param {number} availableBits - Total bits available for allocation\n * @returns {Int32Array} Word length index allocation per BFU\n */\nfunction performBitAllocation(\n actualBfuCount,\n smrValues,\n bfuSizes,\n availableBits\n) {\n const allocation = new Int32Array(actualBfuCount)\n const heap = []\n\n // Initialize heap with BFUs that have signal\n for (let i = 0; i < actualBfuCount; i++) {\n if (smrValues[i] > -Infinity) {\n heap.push({ bfu: i, priority: smrValues[i] })\n }\n }\n\n // Build max heap\n for (let i = Math.floor(heap.length / 2) - 1; i >= 0; i--) {\n heapifyDown(heap, i)\n }\n\n // Greedy allocation\n while (heap.length > 0 && availableBits > 0) {\n const bestBfu = heap[0]\n const currentWl = allocation[bestBfu.bfu]\n\n if (currentWl >= MAX_WORD_LENGTH_INDEX) {\n heap[0] = heap[heap.length - 1]\n heap.pop()\n if (heap.length > 0) heapifyDown(heap, 0)\n continue\n }\n\n const upgradeCost = calculateUpgradeCost(bestBfu.bfu, currentWl, bfuSizes)\n\n if (upgradeCost <= availableBits) {\n availableBits -= upgradeCost\n allocation[bestBfu.bfu]++\n bestBfu.priority += DISTORTION_DELTA_DB[currentWl]\n heapifyDown(heap, 0)\n } else {\n heap[0] = heap[heap.length - 1]\n heap.pop()\n if (heap.length > 0) heapifyDown(heap, 0)\n }\n }\n\n return allocation\n}\n\n/**\n * Calculate bit cost to upgrade a BFU's word length\n * @param {number} bfuIndex - Index of the BFU to upgrade\n * @param {number} currentWl - Current word length of the BFU\n * @param {number[]} bfuSizes - Array of BFU sizes (number of coefficients per BFU)\n * @returns {number} Additional bits required to upgrade word length by 1\n */\nfunction calculateUpgradeCost(bfuIndex, currentWl, bfuSizes) {\n const currentBits = WORD_LENGTH_BITS[currentWl] * bfuSizes[bfuIndex]\n const nextBits = WORD_LENGTH_BITS[currentWl + 1] * bfuSizes[bfuIndex]\n return nextBits - currentBits\n}\n\n/**\n * Maintain max heap property by moving element down\n * @param {Array} heap - Heap array\n * @param {number} startIdx - Starting index\n */\nfunction heapifyDown(heap, startIdx) {\n const length = heap.length\n const element = heap[startIdx]\n\n while (true) {\n const leftChild = 2 * startIdx + 1\n const rightChild = 2 * startIdx + 2\n let largest = startIdx\n let largestPriority = element.priority\n\n if (leftChild < length && heap[leftChild].priority > largestPriority) {\n largest = leftChild\n largestPriority = heap[leftChild].priority\n }\n\n if (rightChild < length && heap[rightChild].priority > largestPriority) {\n largest = rightChild\n }\n\n if (largest === startIdx) break\n\n heap[startIdx] = heap[largest]\n startIdx = largest\n }\n\n heap[startIdx] = element\n}\n","/**\n * Carta1 Audio Codec - Buffer Management\n */\n\nimport {\n NUM_BFUS,\n MAX_BFU_SIZE,\n QMF_DELAY,\n QMF_HIGH_BAND_DELAY,\n} from './constants.js'\n\nexport class BufferPool {\n constructor() {\n // Transform buffers\n this.transformBuffers = {\n 64: new Float32Array(64),\n 128: new Float32Array(128),\n 256: new Float32Array(256),\n 512: new Float32Array(512),\n }\n\n // QMF work buffers\n this.qmfWorkBuffers = {\n delay: {\n 128: new Float32Array(QMF_DELAY + 128),\n 256: new Float32Array(QMF_DELAY + 256),\n 512: new Float32Array(QMF_DELAY + 512),\n },\n highBandDelay: {\n 128: new Float32Array(QMF_HIGH_BAND_DELAY + 128),\n 256: new Float32Array(QMF_HIGH_BAND_DELAY + 256),\n },\n }\n\n // QMF delay lines\n this.qmfDelays = {\n lowBand: new Float32Array(QMF_DELAY),\n midBand: new Float32Array(QMF_DELAY),\n highBand: new Float32Array(QMF_HIGH_BAND_DELAY),\n }\n\n // Transient detector\n this.transientDetection = [\n new Float32Array(64),\n new Float32Array(64),\n new Float32Array(128),\n ]\n\n // MDCT/IMDCT work buffers\n this.mdctBuffers = {\n 16: {\n real: new Float32Array(16),\n imag: new Float32Array(16),\n },\n 64: {\n real: new Float32Array(64),\n imag: new Float32Array(64),\n },\n 128: {\n real: new Float32Array(128),\n imag: new Float32Array(128),\n },\n }\n\n // MDCT overlap buffers (encoder)\n this.mdctOverlap = [\n new Float32Array(32),\n new Float32Array(32),\n new Float32Array(32),\n ]\n\n // IMDCT overlap buffers (decoder)\n this.imdctOverlap = [\n new Float32Array(256),\n new Float32Array(256),\n new Float32Array(512),\n ]\n\n // Spectrum reversal buffers\n this.reversalBuffers = {\n 32: new Float32Array(32),\n 128: new Float32Array(128),\n 256: new Float32Array(256),\n }\n\n // Bit allocation buffers\n this.bfuData = new Array(NUM_BFUS)\n for (let i = 0; i < NUM_BFUS; i++) {\n this.bfuData[i] = new Float32Array(MAX_BFU_SIZE)\n }\n }\n}\n","/**\n * Carta1 Audio Codec - Transient Detection Module\n *\n * Detects transients using spectral flux analysis to prevent pre-echo artifacts.\n * Combines multiple spectral features to identify sudden changes in signal\n * characteristics that require special handling during encoding.\n */\n\nimport { FFT } from '../transforms/fft.js'\n\n/**\n * Perform FFT on time-domain samples and return magnitude spectrum\n * @param {Float32Array} samples - Time-domain samples\n * @param {number} fftSize - FFT size (must be power of 2)\n * @returns {Float32Array} Magnitude spectrum (positive frequencies only)\n */\nexport function performFFT(samples, fftSize) {\n const real = new Float32Array(fftSize)\n const imag = new Float32Array(fftSize)\n\n // Copy samples with zero-padding if necessary\n const copyLen = Math.min(samples.length, fftSize)\n real.set(samples.subarray(0, copyLen))\n\n // Perform FFT\n FFT.fft(real, imag)\n\n // Calculate magnitude spectrum for positive frequencies\n const magnitude = new Float32Array(fftSize / 2)\n for (let i = 0; i < fftSize / 2; i++) {\n magnitude[i] = Math.sqrt(real[i] * real[i] + imag[i] * imag[i])\n }\n\n return magnitude\n}\n\n/**\n * Detect transients by analyzing spectral changes between frames\n * @param {Float32Array} currentCoeffs - Current frame coefficients\n * @param {Float32Array} prevCoeffs - Previous frame coefficients\n * @param {number} threshold - Detection threshold\n * @returns {boolean} True if transient detected\n */\nexport function detectTransient(currentCoeffs, prevCoeffs, threshold) {\n // Can't detect transients without previous frame\n if (!prevCoeffs) return false\n\n // Calculate all spectral features\n const features = calculateSpectralFeatures(currentCoeffs, prevCoeffs)\n\n // Combine features using perceptually-motivated weighting\n const transientScore = calculateTransientScore(features)\n\n return transientScore > threshold\n}\n\n/**\n * Calculate all spectral features for transient detection\n * @param {Float32Array} currentCoeffs - Current frame coefficients\n * @param {Float32Array} prevCoeffs - Previous frame coefficients\n * @returns {Object} Computed spectral features\n */\nfunction calculateSpectralFeatures(currentCoeffs, prevCoeffs) {\n // Calculate spectral flux (positive differences only)\n const spectralFlux = calculateSpectralFlux(currentCoeffs, prevCoeffs)\n\n // Calculate spectral flatness for both frames\n const currentFlatness = calculateSpectralFlatness(currentCoeffs)\n const prevFlatness = calculateSpectralFlatness(prevCoeffs)\n const flatnessChange = Math.abs(currentFlatness - prevFlatness)\n\n // Calculate high-frequency content ratio\n const currentHfRatio = calculateHighFrequencyRatio(currentCoeffs)\n const prevHfRatio = calculateHighFrequencyRatio(prevCoeffs)\n const hfChange = Math.abs(currentHfRatio - prevHfRatio)\n\n // Calculate energy change in dB\n const energyChange = calculateEnergyChange(currentCoeffs, prevCoeffs)\n\n return {\n spectralFlux,\n flatnessChange,\n hfChange,\n energyChange,\n }\n}\n\n/**\n * Calculate normalized spectral flux (positive spectral differences)\n * High values indicate sudden onset of new spectral components\n */\nfunction calculateSpectralFlux(currentCoeffs, prevCoeffs) {\n let flux = 0\n let currentEnergy = 0\n\n for (let i = 0; i < currentCoeffs.length; i++) {\n const currentMag = Math.abs(currentCoeffs[i])\n const prevMag = Math.abs(prevCoeffs[i])\n\n // Only count positive differences (new energy)\n const diff = currentMag - prevMag\n if (diff > 0) {\n flux += diff\n }\n\n currentEnergy += currentMag * currentMag\n }\n\n // Normalize by current frame energy to make threshold independent of level\n const normalization = Math.sqrt(currentEnergy) || 1e-6\n return flux / normalization\n}\n\n/**\n * Calculate spectral flatness (geometric mean / arithmetic mean)\n * Measures how noise-like vs tonal the spectrum is\n * @param {Float32Array} coeffs - Spectral coefficients\n * @returns {number} Flatness measure (0 = tonal, 1 = noise-like)\n */\nfunction calculateSpectralFlatness(coeffs) {\n const EPSILON = 1e-10\n let sumLog = 0\n let sumLinear = 0\n let validBins = 0\n\n for (let i = 0; i < coeffs.length; i++) {\n const magnitude = Math.abs(coeffs[i])\n if (magnitude > EPSILON) {\n sumLog += Math.log(magnitude)\n sumLinear += magnitude\n validBins++\n }\n }\n\n if (validBins === 0) return 0\n\n const geometricMean = Math.exp(sumLog / validBins)\n const arithmeticMean = sumLinear / validBins\n\n return arithmeticMean > EPSILON ? geometricMean / arithmeticMean : 0\n}\n\n/**\n * Calculate ratio of high-frequency to total energy\n * High values indicate bright/harsh sounds that are perceptually important\n * @param {Float32Array} coeffs - Spectral coefficients\n * @returns {number} High-frequency energy ratio (0-1)\n */\nfunction calculateHighFrequencyRatio(coeffs) {\n const midPoint = Math.floor(coeffs.length / 2)\n let lowEnergy = 0\n let highEnergy = 0\n\n for (let i = 0; i < midPoint; i++) {\n lowEnergy += coeffs[i] * coeffs[i]\n }\n\n for (let i = midPoint; i < coeffs.length; i++) {\n highEnergy += coeffs[i] * coeffs[i]\n }\n\n const totalEnergy = lowEnergy + highEnergy\n return totalEnergy > 0 ? highEnergy / totalEnergy : 0\n}\n\n/**\n * Calculate energy change between frames in dB\n * @param {Float32Array} currentCoeffs - Current frame coefficients\n * @param {Float32Array} prevCoeffs - Previous frame coefficients\n * @returns {number} Energy change in dB (positive values only)\n */\nfunction calculateEnergyChange(currentCoeffs, prevCoeffs) {\n let currentEnergy = 0\n let prevEnergy = 0\n\n for (let i = 0; i < currentCoeffs.length; i++) {\n currentEnergy += currentCoeffs[i] * currentCoeffs[i]\n prevEnergy += prevCoeffs[i] * prevCoeffs[i]\n }\n\n // Avoid log of zero and ensure minimum energy\n currentEnergy = Math.max(currentEnergy, 1e-10)\n prevEnergy = Math.max(prevEnergy, 1e-10)\n\n const changeDb = 10 * Math.log10(currentEnergy / prevEnergy)\n\n // Only interested in energy increases (potential transients)\n return Math.max(0, changeDb)\n}\n\n/**\n * Calculate unified transient score from spectral features\n * Uses perceptually-motivated combination instead of magic numbers\n * @param {Object} features - Spectral features\n * @returns {number} Transient score\n */\nfunction calculateTransientScore(features) {\n const { spectralFlux, flatnessChange, hfChange, energyChange } = features\n\n // Spectral flux is the primary indicator - it directly measures\n // sudden onset of new frequency components\n const fluxContribution = spectralFlux\n\n // Flatness change indicates transition between tonal and noise-like\n // signals (e.g., pitched to unpitched percussion)\n // Scale by sqrt to reduce dominance\n const flatnessContribution = Math.sqrt(flatnessChange)\n\n // High-frequency changes are perceptually important but shouldn't\n // dominate the decision. Use log scaling for perceptual relevance\n const hfContribution = Math.log1p(hfChange * 10) / Math.log1p(10)\n\n // Energy changes in dB are already perceptually scaled\n // Normalize to 0-1 range assuming 30dB is a strong transient\n const energyContribution = Math.min(energyChange / 30, 1)\n\n // Combine features with equal perceptual importance\n // Each contribution is normalized to roughly 0-1 range\n return (\n (fluxContribution +\n flatnessContribution +\n hfContribution +\n energyContribution) /\n 4\n )\n}\n","/**\n * Carta1 Audio Codec - MDCT-based Psychoacoustic Analysis\n *\n * This module implements the psychoacoustic model for ATRAC1 compression,\n * analyzing audio signals to determine masking thresholds for perceptual coding.\n */\n\nimport {\n PSYMODEL_MIN_POWER_DB,\n PSYMODEL_NOT_EXAMINED,\n PSYMODEL_TONAL,\n PSYMODEL_FFT_SIZE,\n PSYMODEL_NON_TONAL,\n PSYMODEL_IRRELEVANT,\n PSYMODEL_LOG10_FACTOR,\n PSYMODEL_POW10_FACTOR,\n PSYMODEL_CRITICAL_BANDS,\n PSYMODEL_THRESHOLD_TABLE,\n PSYMODEL_FREQ_TO_CB_MAP,\n PSYMODEL_PSD_SOURCE_IDX0,\n PSYMODEL_PSD_INTERP_WEIGHT,\n PSYMODEL_PSD_SOURCE_IDX1,\n} from '../core/constants.js'\n\n/**\n * Convert linear power value to decibels\n * @param {number} value - Linear power value\n * @returns {number} Power in decibels\n */\nexport function toDb(value) {\n return value > 0\n ? PSYMODEL_LOG10_FACTOR * Math.log(value)\n : PSYMODEL_MIN_POWER_DB\n}\n\n/**\n * Convert decibels to linear power value\n * @param {number} db - Power in decibels\n * @returns {number} Linear power value\n */\nexport function fromDb(db) {\n return Math.exp(db * PSYMODEL_POW10_FACTOR)\n}\n\n/**\n * Perform complete psychoacoustic analysis on MDCT coefficients\n * @param {Float32Array} mdctCoeffs - MDCT coefficients (512 samples)\n * @param {number} normalizationDb - Target maximum power level in dB\n * @returns {Object} Analysis results including PSD, maskers, and thresholds\n */\nexport function psychoAnalysis(mdctCoeffs, normalizationDb) {\n const fftScale = PSYMODEL_FFT_SIZE / 512\n\n // Calculate power spectral density\n const psd = calculatePSDFromMDCT(mdctCoeffs, normalizationDb)\n\n // Find tonal and non-tonal maskers\n const { flags, tonalMaskers, nonTonalMaskers } = findAllMaskers(psd, fftScale)\n\n // Calculate critical band masking thresholds\n const criticalBandThresholds = calculateCriticalBandThresholds(\n psd,\n tonalMaskers,\n nonTonalMaskers\n )\n\n return {\n psd,\n tonalMaskers,\n tonalMaskersCount: tonalMaskers.length,\n nonTonalMaskers,\n nonTonalMaskersCount: nonTonalMaskers.length,\n criticalBandThresholds,\n flags,\n }\n}\n\n/**\n * Calculate Power Spectral Density from MDCT coefficients\n * @param {Float32Array} mdctCoeffs - MDCT coefficients\n * @returns {Float32Array} Power spectral density in dB\n */\nfunction calculatePSDFromMDCT(mdctCoeffs, normalizationDb) {\n const half = PSYMODEL_FFT_SIZE >>> 1\n const psd = new Float32Array(half + 1)\n const linearPower = new Float32Array(half + 1)\n\n let maxLinearPower = 0\n for (let i = 0; i <= half; i++) {\n const a = mdctCoeffs[PSYMODEL_PSD_SOURCE_IDX0[i]]\n const b = mdctCoeffs[PSYMODEL_PSD_SOURCE_IDX1[i]]\n\n const power =\n a * a * (1 - PSYMODEL_PSD_INTERP_WEIGHT[i]) +\n b * b * PSYMODEL_PSD_INTERP_WEIGHT[i]\n linearPower[i] = power\n\n if (power > maxLinearPower) {\n maxLinearPower = power\n }\n }\n\n const offset =\n normalizationDb - PSYMODEL_LOG10_FACTOR * Math.log(maxLinearPower || 1)\n\n for (let i = 0; i <= half; i++) {\n const power = linearPower[i]\n if (power > 0) {\n psd[i] = PSYMODEL_LOG10_FACTOR * Math.log(power) + offset\n } else {\n psd[i] = PSYMODEL_MIN_POWER_DB\n }\n }\n\n return psd\n}\n\n/**\n * Find all maskers (tonal and non-tonal) in the spectrum\n * @param {Float32Array} psd - Power spectral density\n * @param {number} fftScale - FFT scaling factor\n * @returns {Object} Flags array and lists of maskers\n */\nfunction findAllMaskers(psd, fftScale) {\n // Initialize flags\n const flags = new Uint8Array(PSYMODEL_FFT_SIZE / 2)\n flags.fill(PSYMODEL_NOT_EXAMINED)\n\n // Find tonal maskers first\n const tonalList = findTonalMaskers(psd, flags, fftScale)\n\n // Find non-tonal maskers\n const nonTonalList = findNonTonalMaskers(flags, psd)\n\n // Apply decimation to remove weak maskers\n const decimated = decimateMaskers(flags, tonalList, nonTonalList)\n\n return {\n flags,\n tonalMaskers: decimated.tonalList,\n nonTonalMaskers: decimated.nonTonalList,\n }\n}\n\n/**\n * Detect tonal maskers (peaks in spectrum)\n * @param {Float32Array} psd - Power spectral density\n * @param {Uint8Array} flags - Component classification flags\n * @param {number} fftScale - FFT scaling factor\n * @returns {Object} Updated flags and tonal masker list\n */\nfunction findTonalMaskers(psd, flags, fftScale) {\n const tonalList = []\n const maxTonalBin = Math.floor(249 * fftScale)\n\n // Frequency range boundaries\n const RANGE_LOW = Math.floor(63 * fftScale)\n const RANGE_MID = Math.floor(127 * fftScale)\n const RANGE_HIGH = Math.floor(150 * fftScale)\n\n for (let k = 1; k < psd.length - 1 && k <= maxTonalBin; k++) {\n // Check for local maximum\n if (psd[k] <= psd[k - 1] || psd[k] < psd[k + 1]) continue\n\n // Determine search range based on frequency\n let searchOffsets\n if (k > 2 && k < RANGE_LOW) {\n searchOffsets = [-2, 2]\n } else if (k >= RANGE_LOW && k < RANGE_MID) {\n searchOffsets = [-3, -2, 2, 3]\n } else if (k >= RANGE_MID && k < RANGE_HIGH) {\n searchOffsets = [-6, -5, -4, -3, -2, 2, 3, 4, 5, 6]\n } else {\n continue\n }\n\n // Check tonality criteria\n if (isTonal(psd, k, searchOffsets)) {\n // Calculate combined SPL\n const spl = toDb(fromDb(psd[k - 1]) + fromDb(psd[k]) + fromDb(psd[k + 1]))\n tonalList.push({ index: k, spl })\n markTonalComponent(flags, k, searchOffsets)\n }\n }\n\n return tonalList\n}\n\n/**\n * Check if a peak is tonal based on surrounding bins\n * @param {Float32Array} psd - Power spectral density array\n * @param {number} k - Index of the peak to test\n * @param {number[]} offsets - Array of offset indices to check around the peak\n * @returns {boolean} True if the peak qualifies as tonal\n */\nfunction isTonal(psd, k, offsets) {\n const TONAL_THRESHOLD = 7.0\n for (const offset of offsets) {\n const idx = k + offset\n if (idx >= 0 && idx < psd.length && psd[k] - psd[idx] < TONAL_THRESHOLD) {\n return false\n }\n }\n return true\n}\n\n/**\n * Mark component and neighbors as tonal/irrelevant\n * @param {Uint8Array} flags - Component classification flags array\n * @param {number} k - Index of the tonal component\n * @param {number[]} searchOffsets - Array of offset indices used for tonal detection\n */\nfunction markTonalComponent(flags, k, searchOffsets) {\n flags[k] = PSYMODEL_TONAL\n for (const offset of [...searchOffsets, -1, 1]) {\n const idx = k + offset\n if (idx >= 0 && idx < flags.length && idx !== k) {\n flags[idx] = PSYMODEL_IRRELEVANT\n }\n }\n}\n\n/**\n * Detect non-tonal maskers (noise-like components)\n * @param {Uint8Array} flags - Component classification flags\n * @param {Float32Array} psd - Power spectral density\n * @returns {Object} Updated flags and non-tonal masker list\n */\nfunction findNonTonalMaskers(flags, psd) {\n const nonTonalList = []\n\n for (let i = 0; i < PSYMODEL_CRITICAL_BANDS.length - 1; i++) {\n const cbStart = PSYMODEL_THRESHOLD_TABLE[PSYMODEL_CRITICAL_BANDS[i]][0] - 1\n const cbEnd =\n PSYMODEL_THRESHOLD_TABLE[PSYMODEL_CRITICAL_BANDS[i + 1]][0] - 1\n\n const bandAnalysis = analyzeCriticalBand(\n psd,\n flags,\n cbStart,\n cbEnd,\n PSYMODEL_CRITICAL_BANDS[i]\n )\n\n if (bandAnalysis.powerDb > PSYMODEL_MIN_POWER_DB) {\n // Place masker at energy centroid\n let index = Math.round(cbStart + bandAnalysis.centroidOffset)\n index = Math.max(0, Math.min(index, flags.length - 1))\n\n // Avoid conflict with tonal maskers\n if (flags[index] === PSYMODEL_TONAL) {\n index = Math.min(index + 1, flags.length - 1)\n }\n\n nonTonalList.push({ index, spl: bandAnalysis.powerDb })\n flags[index] = PSYMODEL_NON_TONAL\n }\n }\n\n return nonTonalList\n}\n\n/**\n * Analyze a critical band for non-tonal masking\n * @param {Float32Array} psd - Power spectral density array\n * @param {Uint8Array} flags - Component classification flags array\n * @param {number} startBin - Starting frequency bin of the critical band\n * @param {number} endBin - Ending frequency bin of the critical band\n * @param {number} bandIndex - Critical band index for threshold table lookup\n * @returns {Object} Analysis results with power and centroid offset\n */\nfunction analyzeCriticalBand(psd, flags, startBin, endBin, bandIndex) {\n let totalPower = 0\n let weightedPower = 0\n const baseBark = PSYMODEL_THRESHOLD_TABLE[bandIndex][1]\n\n for (let k = startBin; k < endBin && k < flags.length; k++) {\n if (flags[k] === PSYMODEL_NOT_EXAMINED) {\n const power = fromDb(psd[k])\n totalPower += power\n\n if (k < PSYMODEL_FREQ_TO_CB_MAP.length) {\n const barkDiff =\n PSYMODEL_THRESHOLD_TABLE[PSYMODEL_FREQ_TO_CB_MAP[k]][1] - baseBark\n weightedPower += power * barkDiff\n }\n\n flags[k] = PSYMODEL_IRRELEVANT\n }\n }\n\n return {\n powerDb: toDb(totalPower),\n centroidOffset:\n totalPower > 0 ? (weightedPower / totalPower) * (endBin - startBin) : 0,\n }\n}\n\n/**\n * Remove weak maskers below absolute threshold\n * @param {Uint8Array} flags - Component classification flags\n * @param {Array} tonalList - List of tonal maskers\n * @param {Array} nonTonalList - List of non-tonal maskers\n * @returns {Object} Filtered masker lists\n */\nfunction decimateMaskers(flags, tonalList, nonTonalList) {\n const isAudible = (masker) => {\n const k = masker.index\n return (\n k < PSYMODEL_FREQ_TO_CB_MAP.length &&\n masker.spl >= PSYMODEL_THRESHOLD_TABLE[PSYMODEL_FREQ_TO_CB_MAP[k]][2]\n )\n }\n\n const markInaudible = (masker) => {\n if (masker.index < flags.length) {\n flags[masker.index] = PSYMODEL_IRRELEVANT\n }\n }\n\n // Filter tonal maskers\n const audibleTonal = []\n for (const tonal of tonalList) {\n if (isAudible(tonal)) {\n audibleTonal.push(tonal)\n } else {\n markInaudible(tonal)\n }\n }\n\n // Filter non-tonal maskers\n const audibleNonTonal = []\n for (const nonTonal of nonTonalList) {\n if (isAudible(nonTonal)) {\n audibleNonTonal.push(nonTonal)\n } else {\n markInaudible(nonTonal)\n }\n }\n\n return {\n tonalList: audibleTonal,\n nonTonalList: audibleNonTonal,\n }\n}\n\n/**\n * Calculate critical band masking thresholds\n * @param {Float32Array} psd - Power spectral density\n * @param {Array} tonalMaskers - List of tonal maskers\n * @param {Array} nonTonalMaskers - List of non-tonal maskers\n * @returns {Float32Array} Critical band thresholds\n */\nfunction calculateCriticalBandThresholds(psd, tonalMaskers, nonTonalMaskers) {\n const criticalBandThresholds = new Float32Array(\n PSYMODEL_CRITICAL_BANDS.length\n )\n\n // Pre-collect all maskers with their properties\n const maskers = []\n\n for (const masker of tonalMaskers) {\n const j = masker.index\n if (j < PSYMODEL_FREQ_TO_CB_MAP.length) {\n maskers.push({\n spl: masker.spl,\n psd: psd[j],\n bark: PSYMODEL_THRESHOLD_TABLE[PSYMODEL_FREQ_TO_CB_MAP[j]][1],\n isTonal: true,\n })\n }\n }\n\n for (const masker of nonTonalMaskers) {\n const j = masker.index\n if (j < PSYMODEL_FREQ_TO_CB_MAP.length) {\n maskers.push({\n spl: masker.spl,\n psd: psd[j],\n bark: PSYMODEL_THRESHOLD_TABLE[PSYMODEL_FREQ_TO_CB_MAP[j]][1],\n isTonal: false,\n })\n }\n }\n\n // Calculate threshold for each critical band\n for (let i = 0; i < PSYMODEL_CRITICAL_BANDS.length; i++) {\n const bandData = PSYMODEL_THRESHOLD_TABLE[PSYMODEL_CRITICAL_BANDS[i]]\n const maskedBark = bandData[1]\n const quietThreshold = bandData[2]\n\n // Start with threshold in quiet\n let summedEnergy = fromDb(quietThreshold)\n\n // Add contributions from all maskers\n for (const masker of maskers) {\n const barkDistance = maskedBark - masker.bark\n\n // Check if within masking range\n if (barkDistance >= -3 && barkDistance < 8) {\n const maskedDb = calculateMaskingLevel(\n masker.spl,\n masker.psd,\n masker.bark,\n barkDistance,\n masker.isTonal\n )\n summedEnergy += fromDb(maskedDb)\n }\n }\n\n criticalBandThresholds[i] = toDb(summedEnergy)\n }\n\n return criticalBandThresholds\n}\n\n/**\n * Calculate energy contributions from a set of maskers\n * @param {number} maskerSpl - Sound pressure level of the masker in dB\n * @param {number} maskerPsd - Power spectral density of the masker in dB\n * @param {number} maskerBark - Bark frequency of the masker\n * @param {number} barkDistance - Distance in Bark scale from masker to maskee\n * @param {boolean} isTonal - Whether the masker is tonal or non-tonal\n * @returns {number} Masking threshold contribution in dB\n */\nfunction calculateMaskingLevel(\n maskerSpl,\n maskerPsd,\n maskerBark,\n barkDistance,\n isTonal\n) {\n const tonalOffset = isTonal\n ? -1.525 - 0.275 * maskerBark - 4.5\n : -1.525 - 0.175 * maskerBark - 0.5\n\n const psdFactor1 = 0.4 * maskerPsd + 6.0\n const psdFactor2 = 0.15 * maskerPsd\n\n let maskingFunction\n if (barkDistance < -1.0) {\n maskingFunction = 17.0 * (barkDistance + 1.0) - psdFactor1\n } else if (barkDistance < 0.0) {\n maskingFunction = psdFactor1 * barkDistance\n } else if (barkDistance < 1.0) {\n maskingFunction = -17.0 * barkDistance\n } else {\n maskingFunction = -(barkDistance - 1.0) * (17.0 - psdFactor2) - 17.0\n }\n\n return maskerSpl + tonalOffset + maskingFunction\n}\n","/**\n * Carta1 Audio Codec - Encoding Pipeline\n *\n * The encoding pipeline transforms PCM audio samples into ATRAC1 compressed format\n * through a series of processing stages:\n *\n * 1. QMF Analysis: Splits audio into frequency bands using quadrature mirror filters\n * 2. Block Selection: Detects transients to choose appropriate transform block sizes\n * 3. MDCT Transform: Applies Modified Discrete Cosine Transform to frequency bands\n * 4. Quantization: Performs psychoacoustic analysis, bit allocation, and quantization\n *\n * Each stage is implemented as a functional pipeline component that can be composed\n * using the pipe utility. The pipeline maintains state through a shared context\n * containing buffer pools and encoding options.\n */\n\nimport {\n pipe,\n throwError,\n reverseSpectrum,\n calculateBandOffset,\n} from '../utils.js'\nimport { qmfAnalysis } from '../transforms/qmf.js'\nimport { mdct64, mdct256, mdct512 } from '../transforms/mdct.js'\nimport {\n groupIntoBFUs,\n findScaleFactor,\n quantize,\n} from '../coding/quantization.js'\nimport { allocateBits } from '../coding/bitallocation.js'\nimport { BufferPool } from '../core/buffers.js'\nimport { EncoderOptions } from '../core/options.js'\nimport {\n WORD_LENGTH_BITS,\n WINDOW_SHORT,\n FFT_SIZE_LOW,\n FFT_SIZE_MID,\n FFT_SIZE_HIGH,\n MDCT_SIZE_SHORT,\n MDCT_SIZE_MID,\n MDCT_SIZE_LONG,\n MDCT_BAND_CONFIGS,\n MDCT_SHORT_BLOCK_SIZE,\n MDCT_OVERLAP_SIZE,\n} from '../core/constants.js'\nimport { performFFT, detectTransient } from '../analysis/transient.js'\nimport { psychoAnalysis } from '../analysis/psychoacoustics.js'\n\n/**\n * QMF Analysis Stage - Splits audio into frequency bands\n *\n * Performs two-stage QMF analysis to decompose the input signal into three bands:\n * - Low band (0-5.5kHz): processed at full resolution\n * - Mid band (5.5-11kHz): processed at half resolution\n * - High band (11-22kHz): processed at quarter resolution with delay compensation\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes PCM samples\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function qmfAnalysisStage(context) {\n const bufferPool =\n context?.bufferPool ??\n throwError('qmfAnalysisStage: bufferPool is required')\n const delays = bufferPool.qmfDelays\n\n /**\n * Process PCM samples through QMF analysis\n * @param {Float32Array} pcmSamples - Input PCM samples\n * @returns {Object} Analysis result containing frequency bands\n * @returns {Array<Float32Array>} returns.bands - Three frequency bands [low, mid, high]\n */\n return (pcmSamples) => {\n const stage1 = qmfAnalysis(\n pcmSamples,\n delays.lowBand,\n bufferPool.qmfWorkBuffers\n )\n delays.lowBand = stage1.newDelay\n\n const stage2 = qmfAnalysis(\n stage1.lowBand,\n delays.midBand,\n bufferPool.qmfWorkBuffers\n )\n delays.midBand = stage2.newDelay\n\n const delayedHigh =\n bufferPool.qmfWorkBuffers.highBandDelay[stage1.highBand.length]\n delayedHigh.set(delays.highBand)\n delayedHigh.set(stage1.highBand, delays.highBand.length)\n\n const highBand = delayedHigh.slice(0, stage1.highBand.length)\n delays.highBand = delayedHigh.slice(stage1.highBand.length)\n\n return {\n bands: [stage2.lowBand, stage2.highBand, highBand],\n }\n }\n}\n\n/**\n * Block Selection Stage - Detects transients to choose transform block sizes\n *\n * Analyzes frequency bands using FFT and transient detection to determine\n * appropriate MDCT block sizes. Short blocks are used for transient signals\n * to prevent pre-echo artifacts, while long blocks provide better frequency\n * resolution for steady-state signals.\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes QMF analysis results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function blockSelectorStage(context) {\n const bufferPool =\n context?.bufferPool ??\n throwError('blockSelectorStage: bufferPool is required')\n const options =\n context?.options ?? throwError('blockSelectorStage: options is required')\n\n /**\n * Analyze frequency bands and determine block modes\n * @param {Object} input - QMF analysis results\n * @param {Array<Float32Array>} input.bands - Three frequency bands [low, mid, high]\n * @returns {Object} Block selection results\n * @returns {Array<Float32Array>} returns.bands - Original frequency bands\n * @returns {Array<number>} returns.blockModes - Block modes for each band\n */\n return (input) => {\n const { bands } = input\n const fftSizes = [FFT_SIZE_LOW, FFT_SIZE_MID, FFT_SIZE_HIGH]\n const blockModes = bands.map((bandSamples, bandIndex) => {\n const coeffs = performFFT(bandSamples, fftSizes[bandIndex])\n const transient = detectTransient(\n coeffs,\n bufferPool.transientDetection[bandIndex],\n options.transientThresholdLow\n )\n bufferPool.transientDetection[bandIndex] = coeffs\n return transient * Math.max(bandIndex + 1, 2)\n })\n\n return {\n bands,\n blockModes,\n }\n }\n}\n\n/**\n * MDCT Transform Stage - Applies Modified Discrete Cosine Transform\n *\n * Transforms time-domain samples to frequency-domain coefficients using MDCT.\n * The transform size depends on the block mode determined by transient detection:\n * - Long blocks: 512/256 samples for better frequency resolution\n * - Short blocks: 64 samples for better time resolution\n *\n * Applies windowing and overlap-add processing to prevent blocking artifacts.\n * Mid and high bands are spectrally reversed to match ATRAC1 format.\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes block selection results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function mdctStage(context) {\n const bufferPool =\n context?.bufferPool ?? throwError('mdctStage: bufferPool is required')\n const overlapBuffers = bufferPool.mdctOverlap\n\n // Transform function mapping for each band\n const TRANSFORM_FUNCS = [mdct256, mdct256, mdct512]\n\n /**\n * Transform a single frequency band using MDCT\n */\n function transformBand(\n samples,\n bandIndex,\n blockMode,\n overlapBuffer,\n bufferPool\n ) {\n const config = MDCT_BAND_CONFIGS[bandIndex]\n const transformFunc = TRANSFORM_FUNCS[bandIndex]\n const isLongBlock = blockMode === 0\n\n if (isLongBlock) {\n return transformLongBlock(\n samples,\n bandIndex,\n config,\n transformFunc,\n overlapBuffer,\n bufferPool\n )\n } else {\n return transformShortBlocks(\n samples,\n bandIndex,\n config,\n overlapBuffer,\n bufferPool\n )\n }\n }\n\n /**\n * Transform using long block (better frequency resolution)\n */\n function transformLongBlock(\n samples,\n bandIndex,\n config,\n transformFunc,\n overlapBuffer,\n bufferPool\n ) {\n const mdctSize = bandIndex === 2 ? MDCT_SIZE_LONG : MDCT_SIZE_MID\n const mdctInput = bufferPool.transformBuffers[mdctSize]\n mdctInput.fill(0)\n\n // Apply overlap from previous frame\n mdctInput.set(overlapBuffer, config.windowStart)\n\n // Window and save tail for next frame\n applyTailWindowing(samples, overlapBuffer, config.size)\n\n // Add current frame samples\n mdctInput.set(samples, config.windowStart + MDCT_OVERLAP_SIZE)\n\n // Transform\n let spectrum = transformFunc.transform(mdctInput, bufferPool.mdctBuffers)\n\n // Apply spectral reversal for mid/high bands\n if (bandIndex > 0) {\n spectrum = reverseSpectrum(spectrum, bufferPool.reversalBuffers)\n }\n\n return spectrum\n }\n\n /**\n * Transform using short blocks (better time resolution for transients)\n */\n function transformShortBlocks(\n samples,\n bandIndex,\n config,\n overlapBuffer,\n bufferPool\n ) {\n const numBlocks = 1 << (config.size === 256 ? 3 : 2) // 8 for band 2, 4 for bands 0-1\n const output = new Float32Array(config.size)\n\n for (let block = 0; block < numBlocks; block++) {\n const blockStart = block * MDCT_SHORT_BLOCK_SIZE\n const blockSamples = samples.subarray(\n blockStart,\n blockStart + MDCT_SHORT_BLOCK_SIZE\n )\n\n // Prepare MDCT input\n const mdctInput = bufferPool.transformBuffers[MDCT_SIZE_SHORT]\n mdctInput.fill(0)\n mdctInput.set(overlapBuffer, 0)\n\n // Window and save tail\n applyTailWindowing(blockSamples, overlapBuffer, MDCT_SHORT_BLOCK_SIZE)\n mdctInput.set(blockSamples, MDCT_OVERLAP_SIZE)\n\n // Transform\n let spectrum = mdct64.transform(mdctInput, bufferPool.mdctBuffers)\n\n // Apply spectral reversal for mid/high bands\n if (bandIndex > 0) {\n spectrum = reverseSpectrum(spectrum, bufferPool.reversalBuffers)\n }\n\n output.set(spectrum, blockStart)\n }\n\n return output\n }\n\n function applyTailWindowing(samples, overlapBuffer, blockSize) {\n const tailStart = blockSize - MDCT_OVERLAP_SIZE\n for (let i = 0; i < MDCT_OVERLAP_SIZE; i++) {\n const tailValue = samples[tailStart + i]\n overlapBuffer[i] = WINDOW_SHORT[i] * tailValue\n samples[tailStart + i] = tailValue * WINDOW_SHORT[31 - i]\n }\n }\n\n /**\n * Transform frequency bands using MDCT\n * @param {Object} input - Block selection results\n * @param {Array<Float32Array>} input.bands - Three frequency bands\n * @param {Array<number>} input.blockModes - Block modes for each band\n * @param {any} input.originalFrame - Original frame data (passed through)\n * @returns {Object} MDCT transform results\n * @returns {Array<Float32Array>} returns.bands - Original frequency bands\n * @returns {Float32Array} returns.coefficients - MDCT coefficients (512 samples)\n * @returns {Array<number>} returns.blockModes - Block modes\n * @returns {any} returns.originalFrame - Original frame data\n */\n return (input) => {\n const { bands, blockModes, originalFrame } = input\n const coefficients = new Float32Array(512)\n\n bands.forEach((bandSamples, bandIndex) => {\n const transformed = transformBand(\n bandSamples,\n bandIndex,\n blockModes[bandIndex],\n overlapBuffers[bandIndex],\n bufferPool\n )\n\n const offset = calculateBandOffset(bandIndex)\n coefficients.set(transformed, offset)\n })\n\n return { bands, coefficients, blockModes, originalFrame }\n }\n}\n\n/**\n * Quantization Stage - Performs psychoacoustic analysis and quantization\n *\n * The final encoding stage that:\n * 1. Groups coefficients into Block Floating Units (BFUs)\n * 2. Performs psychoacoustic analysis to determine masking thresholds\n * 3. Allocates bits based on perceptual importance\n * 4. Quantizes coefficients using scale factors and word lengths\n *\n * Uses a perceptual model to ensure quantization noise remains below\n * the masking threshold, maximizing quality within the bit budget.\n *\n * @param {Object} context - Pipeline context containing bufferPool and options\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @param {EncoderOptions} context.options - Encoding configuration options\n * @returns {Function} Stage function that processes MDCT results\n * @throws {Error} If bufferPool or options are not provided in context\n */\nexport function quantizationStage(context) {\n const bufferPool =\n context?.bufferPool ??\n throwError('quantizationStage: bufferPool is required')\n const options =\n context?.options ?? throwError('quantizationStage: options is required')\n\n /**\n * Perform psychoacoustic analysis and quantization\n * @param {Object} input - MDCT transform results\n * @param {Float32Array} input.coefficients - MDCT coefficients\n * @param {Array<number>} input.blockModes - Block modes\n * @returns {Object} Quantization results ready for bitstream encoding\n * @returns {number} returns.nBfu - Number of active BFUs\n * @returns {Int32Array} returns.scaleFactorIndices - Scale factor indices for each BFU\n * @returns {Int32Array} returns.wordLengthIndices - Word length indices for each BFU\n * @returns {Array<Int32Array>} returns.quantizedCoefficients - Quantized coefficient data\n * @returns {Array<number>} returns.blockModes - Block modes for each band\n */\n return (input) => {\n const { coefficients, blockModes } = input\n\n const { bfuData, bfuSizes, bfuCount } = groupIntoBFUs(\n coefficients,\n blockModes,\n bufferPool.bfuData\n )\n\n const psychoResults = psychoAnalysis(coefficients, options.normalizationDb)\n const { bfuCount: selectedBfuCount, allocation } = allocateBits(\n psychoResults,\n bfuData,\n bfuSizes,\n bfuCount\n )\n\n const scaleFactorIndices = new Int32Array(selectedBfuCount)\n const quantizedCoefficients = []\n\n for (let bfu = 0; bfu < selectedBfuCount; bfu++) {\n const data = bfuData[bfu].subarray(0, bfuSizes[bfu])\n const wordLength = allocation[bfu]\n const bitsPerSample = WORD_LENGTH_BITS[wordLength]\n\n scaleFactorIndices[bfu] = findScaleFactor(data)\n const quantized = quantize(data, scaleFactorIndices[bfu], bitsPerSample)\n quantizedCoefficients.push(quantized)\n }\n\n return {\n nBfu: selectedBfuCount,\n scaleFactorIndices,\n wordLengthIndices: allocation.slice(0, selectedBfuCount),\n quantizedCoefficients,\n blockModes,\n }\n }\n}\n\n/**\n * Create ATRAC1 encoding pipeline\n *\n * Constructs a complete encoding pipeline that transforms PCM audio samples\n * into ATRAC1 compressed format. The pipeline processes audio through QMF\n * analysis, transient detection, MDCT transform, and psychoacoustic quantization.\n *\n * The returned function can be called repeatedly to encode audio frames,\n * maintaining state through the shared buffer pool for efficient processing.\n *\n * @param {EncoderOptions} [options=new EncoderOptions()] - Encoding configuration\n * @param {BufferPool} [bufferPool=new BufferPool()] - Shared buffer pool for state\n * @returns {Function} Encoding pipeline function that processes PCM samples\n *\n * @example\n * const encoder = encode(new EncoderOptions(), new BufferPool())\n * const result = encoder(pcmSamples) // Returns quantized ATRAC1 frame data\n */\nexport function encode(\n options = new EncoderOptions(),\n bufferPool = new BufferPool()\n) {\n const context = { options, bufferPool }\n return pipe(\n context,\n qmfAnalysisStage,\n blockSelectorStage,\n mdctStage,\n quantizationStage\n )\n}\n","/**\n * Carta1 Audio Codec - Decoding Pipeline\n *\n * The decoding pipeline transforms ATRAC1 compressed format back into PCM audio samples\n * through a series of processing stages:\n *\n * 1. Dequantization: Reconstructs MDCT coefficients from quantized data using scale factors\n * 2. Inverse MDCT: Applies Inverse Modified Discrete Cosine Transform to frequency bands\n * 3. QMF Synthesis: Reconstructs full-spectrum audio using quadrature mirror filters\n *\n * Each stage is implemented as a functional pipeline component that can be composed\n * using the pipe utility. The pipeline maintains state through a shared context\n * containing buffer pools and decoding options.\n */\n\nimport {\n pipe,\n throwError,\n reverseSpectrum,\n extractBandCoefficients,\n} from '../utils.js'\nimport { qmfSynthesis } from '../transforms/qmf.js'\nimport { imdct64, imdct256, imdct512, overlapAdd } from '../transforms/mdct.js'\nimport { dequantize } from '../coding/quantization.js'\nimport { BufferPool } from '../core/buffers.js'\nimport {\n BFU_BAND_BOUNDARIES,\n BFU_START_LONG,\n BFU_START_SHORT,\n WORD_LENGTH_BITS,\n WINDOW_SHORT,\n MDCT_SIZE_LONG,\n MDCT_BAND_CONFIGS,\n MDCT_SHORT_BLOCK_SIZE,\n MDCT_TAIL_WINDOW_SIZE,\n} from '../core/constants.js'\n\n/**\n * Dequantization Stage - Reconstructs MDCT coefficients from quantized data\n *\n * Reverses the quantization process by:\n * - Reconstructing coefficient values using scale factors and word lengths\n * - Organizing coefficients back into Block Floating Units (BFUs)\n * - Preparing coefficient array for inverse MDCT transform\n *\n * Uses the same BFU organization as the encoder but reconstructs the original\n * coefficient values from the quantized representation.\n *\n * @returns {Function} Stage function that processes quantized frame data\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function dequantizationStage() {\n /**\n * Reconstruct MDCT coefficients from quantized data\n * @param {Object} frameData - Quantized frame data\n * @param {number} frameData.nBfu - Number of active BFUs\n * @param {Int32Array} frameData.scaleFactorIndices - Scale factor indices for each BFU\n * @param {Int32Array} frameData.wordLengthIndices - Word length indices for each BFU\n * @param {Array<Int32Array>} frameData.quantizedCoefficients - Quantized coefficient data\n * @param {Array<number>} frameData.blockModes - Block modes for each band\n * @returns {Object} Dequantization results\n * @returns {Float32Array} returns.coefficients - Reconstructed MDCT coefficients (512 samples)\n * @returns {Array<number>} returns.blockModes - Block modes for each band\n */\n return (frameData) => {\n const coefficients = new Float32Array(512)\n const {\n nBfu,\n scaleFactorIndices,\n wordLengthIndices,\n quantizedCoefficients,\n blockModes,\n } = frameData\n\n for (let bfu = 0; bfu < nBfu; bfu++) {\n const bitsPerSample = WORD_LENGTH_BITS[wordLengthIndices[bfu]]\n\n let band = 0\n if (bfu >= BFU_BAND_BOUNDARIES[0]) band = 1\n if (bfu >= BFU_BAND_BOUNDARIES[1]) band = 2\n\n const isLongBlock = blockModes[band] === 0\n const position = isLongBlock ? BFU_START_LONG[bfu] : BFU_START_SHORT[bfu]\n\n if (bitsPerSample > 0) {\n const quantized = quantizedCoefficients[bfu]\n const dequantized = dequantize(\n quantized,\n scaleFactorIndices[bfu],\n bitsPerSample\n )\n coefficients.set(dequantized, position)\n }\n }\n\n return { coefficients, blockModes }\n }\n}\n\n/**\n * Inverse MDCT Stage - Transforms frequency coefficients back to time domain\n *\n * Applies Inverse Modified Discrete Cosine Transform to reconstruct time-domain\n * samples from frequency coefficients. The transform size depends on block modes:\n * - Long blocks: 512/256 samples for steady-state signals\n * - Short blocks: 64 samples for transient signals\n *\n * Applies windowing and overlap-add processing to prevent blocking artifacts.\n * Mid and high bands are spectrally unreversed from ATRAC1 format.\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes dequantization results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function imdctStage(context) {\n const bufferPool =\n context?.bufferPool ?? throwError('imdctStage: bufferPool is required')\n const overlapBuffers = bufferPool.imdctOverlap\n\n // Transform function mapping for each band\n const TRANSFORM_FUNCS = [imdct256, imdct256, imdct512]\n\n /**\n * Inverse transform a single frequency band\n */\n function transformBand(\n coeffs,\n bandIndex,\n blockMode,\n overlapBuffer,\n bufferPool,\n config\n ) {\n const isLongBlock = blockMode === 0\n const transformFunc = TRANSFORM_FUNCS[bandIndex]\n\n if (isLongBlock) {\n return inverseLongBlock(\n coeffs,\n bandIndex,\n overlapBuffer,\n bufferPool,\n config,\n transformFunc\n )\n } else {\n return inverseShortBlocks(\n coeffs,\n bandIndex,\n overlapBuffer,\n bufferPool,\n config\n )\n }\n }\n\n /**\n * Inverse transform using long block\n */\n function inverseLongBlock(\n coeffs,\n bandIndex,\n overlapBuffer,\n bufferPool,\n config,\n transformFunc\n ) {\n // Unreverse spectral reversal for mid/high bands\n let blockSpecs = coeffs\n if (bandIndex > 0) {\n blockSpecs = reverseSpectrum(coeffs, bufferPool.reversalBuffers)\n }\n\n // Apply inverse transform\n const inv = transformFunc.transform(blockSpecs, bufferPool.mdctBuffers)\n const invStart = inv.length / 4\n\n // Prepare output buffer\n const invBuf = bufferPool.transformBuffers[MDCT_SIZE_LONG]\n invBuf.fill(0)\n\n // Copy transformed samples\n for (let i = 0; i < config.size; i++) {\n invBuf[i] = inv[invStart + i]\n }\n\n // Handle overlap-add with previous frame\n const prevBuf = overlapBuffer.slice(\n config.size * 2 - MDCT_TAIL_WINDOW_SIZE,\n config.size * 2\n )\n const dstPart = overlapAdd(\n prevBuf.slice(0, MDCT_TAIL_WINDOW_SIZE),\n invBuf.slice(0, MDCT_TAIL_WINDOW_SIZE),\n WINDOW_SHORT\n )\n\n overlapBuffer.set(dstPart, 0)\n\n // Save tail for next frame\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n prevBuf[i] = invBuf[MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n // Copy main samples\n const copyLen = bandIndex === 2 ? 240 : 112\n for (let i = 0; i < copyLen; i++) {\n overlapBuffer[32 + i] = invBuf[MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n // Copy final samples\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n overlapBuffer[config.size * 2 - MDCT_TAIL_WINDOW_SIZE + i] =\n invBuf[config.size - MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n return overlapBuffer.slice(0, config.size)\n }\n\n /**\n * Inverse transform using short blocks\n */\n function inverseShortBlocks(\n coeffs,\n bandIndex,\n overlapBuffer,\n bufferPool,\n config\n ) {\n const numBlocks = 1 << (config.size === 256 ? 3 : 2)\n const invBuf = bufferPool.transformBuffers[MDCT_SIZE_LONG]\n invBuf.fill(0)\n\n const prevBuf = overlapBuffer.slice(\n config.size * 2 - MDCT_TAIL_WINDOW_SIZE,\n config.size * 2\n )\n\n let start = 0\n let pos = 0\n\n for (let block = 0; block < numBlocks; block++) {\n // Extract block coefficients\n let blockSpecs = coeffs.slice(pos, pos + MDCT_SHORT_BLOCK_SIZE)\n\n // Unreverse spectral reversal for mid/high bands\n if (bandIndex > 0) {\n blockSpecs = reverseSpectrum(blockSpecs, bufferPool.reversalBuffers)\n }\n\n // Apply inverse transform\n const inv = imdct64.transform(blockSpecs, bufferPool.mdctBuffers)\n const invStart = inv.length / 4\n\n // Copy to intermediate buffer\n for (let i = 0; i < MDCT_SHORT_BLOCK_SIZE; i++) {\n invBuf[start + i] = inv[invStart + i]\n }\n\n // Overlap-add with previous block\n const dstPart = overlapAdd(\n prevBuf.slice(0, MDCT_TAIL_WINDOW_SIZE),\n invBuf.slice(start, start + MDCT_TAIL_WINDOW_SIZE),\n WINDOW_SHORT\n )\n\n overlapBuffer.set(dstPart, start)\n\n // Save tail for next block\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n prevBuf[i] = invBuf[start + MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n start += MDCT_SHORT_BLOCK_SIZE\n pos += MDCT_SHORT_BLOCK_SIZE\n }\n\n // Copy final tail samples\n for (let i = 0; i < MDCT_TAIL_WINDOW_SIZE; i++) {\n overlapBuffer[config.size * 2 - MDCT_TAIL_WINDOW_SIZE + i] =\n invBuf[config.size - MDCT_TAIL_WINDOW_SIZE + i]\n }\n\n return overlapBuffer.slice(0, config.size)\n }\n\n /**\n * Transform coefficients back to time domain using inverse MDCT\n * @param {Object} input - Dequantization results\n * @param {Float32Array} input.coefficients - MDCT coefficients (512 samples)\n * @param {Array<number>} input.blockModes - Block modes for each band\n * @returns {Array<Float32Array>} Three reconstructed frequency bands [low, mid, high]\n */\n return (input) => {\n const { coefficients, blockModes } = input\n\n return MDCT_BAND_CONFIGS.map((config, bandIndex) => {\n const bandCoeffs = extractBandCoefficients(coefficients, bandIndex)\n return transformBand(\n bandCoeffs,\n bandIndex,\n blockModes[bandIndex],\n overlapBuffers[bandIndex],\n bufferPool,\n config\n )\n })\n }\n}\n\n/**\n * QMF Synthesis Stage - Reconstructs full-spectrum audio from frequency bands\n *\n * Performs two-stage QMF synthesis to reconstruct the full-spectrum signal\n * from three frequency bands:\n * - Low band (0-5.5kHz): processed at full resolution\n * - Mid band (5.5-11kHz): processed at half resolution\n * - High band (11-22kHz): processed at quarter resolution with delay compensation\n *\n * This is the inverse operation of the QMF analysis performed during encoding,\n * combining the separate frequency bands back into a single wideband signal.\n *\n * @param {Object} context - Pipeline context containing bufferPool\n * @param {BufferPool} context.bufferPool - Shared buffer pool for efficient memory management\n * @returns {Function} Stage function that processes inverse MDCT results\n * @throws {Error} If bufferPool is not provided in context\n */\nexport function qmfSynthesisStage(context) {\n const bufferPool =\n context?.bufferPool ??\n throwError('qmfSynthesisStage: bufferPool is required')\n const delays = bufferPool.qmfDelays\n\n /**\n * Reconstruct full-spectrum PCM samples from frequency bands\n * @param {Array<Float32Array>} bands - Three frequency bands [low, mid, high]\n * @returns {Float32Array} Reconstructed PCM samples\n */\n return (bands) => {\n // Apply high band delay compensation\n const delayedHigh = bufferPool.qmfWorkBuffers.highBandDelay[bands[2].length]\n delayedHigh.set(delays.highBand)\n delayedHigh.set(bands[2])\n\n const highBand = delayedHigh.slice(0, bands[0].length * 2)\n delays.highBand = delayedHigh.slice(bands[0].length * 2)\n\n // Second stage synthesis: combine low and mid bands\n const stage2 = qmfSynthesis(\n bands[0],\n bands[1],\n delays.midBand,\n bufferPool.qmfWorkBuffers\n )\n delays.midBand = stage2.newDelay\n\n // First stage synthesis: combine result with high band\n const stage1 = qmfSynthesis(\n stage2.output,\n highBand,\n delays.lowBand,\n bufferPool.qmfWorkBuffers\n )\n delays.lowBand = stage1.newDelay\n\n return stage1.output\n }\n}\n\n/**\n * Create ATRAC1 decoding pipeline\n *\n * Constructs a complete decoding pipeline that transforms ATRAC1 compressed format\n * back into PCM audio samples. The pipeline processes quantized data through\n * dequantization, inverse MDCT transform, and QMF synthesis.\n *\n * The returned function can be called repeatedly to decode audio frames,\n * maintaining state through the shared buffer pool for efficient processing.\n *\n * @param {BufferPool} [bufferPool=new BufferPool()] - Shared buffer pool for state\n * @returns {Function} Decoding pipeline function that processes quantized frame data\n *\n * @example\n * const decoder = decode(new BufferPool())\n * const result = decoder(quantizedFrame) // Returns reconstructed PCM samples\n */\nexport function decode(bufferPool = new BufferPool()) {\n const context = { bufferPool }\n return pipe(context, dequantizationStage, imdctStage, qmfSynthesisStage)\n}\n","/**\n * Carta1 Audio Codec - Audio Processing Module\n *\n * High-level audio processing interface that provides stream-based encoding and decoding\n * for ATRAC1 audio format. Handles both mono and stereo audio processing with proper\n * delay compensation and frame management.\n *\n * Key features:\n * - Stream-based processing for large audio files\n * - Automatic delay compensation for codec processing\n * - Support for mono and stereo audio\n * - Progress tracking callbacks\n * - AEA file format creation and parsing\n * - WAV file generation from decoded audio\n */\n\nimport { encode } from '../pipeline/encoder.js'\nimport { decode } from '../pipeline/decoder.js'\nimport { EncoderOptions } from '../core/options.js'\nimport {\n SAMPLES_PER_FRAME,\n SAMPLE_RATE,\n AEA_HEADER_SIZE,\n SOUND_UNIT_SIZE,\n WAV_HEADER_SIZE,\n WAV_BYTES_PER_SAMPLE,\n WAV_BITS_PER_SAMPLE,\n WAV_PCM_MAX_POSITIVE,\n WAV_PCM_MAX_NEGATIVE,\n WAV_DATA_OFFSET,\n} from '../core/constants.js'\nimport { serializeFrame, deserializeFrame, AeaFile } from './serialization.js'\nimport {\n withFlushSamples,\n withDelayCompensation,\n withStereoFlushSamples,\n withStereoDelayCompensation,\n} from '../utils.js'\n\n/**\n * Audio processing utility class providing high-level encoding and decoding operations\n */\nexport class AudioProcessor {\n /**\n * Encodes a stream of audio frames to ATRAC1 format\n * @param {AsyncIterable<Float32Array>|AsyncIterable<[Float32Array, Float32Array]>} audioFrames - Audio frame stream\n * @param {Object} [options={}] - Encoding options\n * @param {number} [options.channelCount=1] - Number of audio channels (1 or 2)\n * @param {Function} [options.onProgress] - Progress callback function\n * @param {EncoderOptions} [options.encoderOptions] - Encoder configuration options\n * @returns {AsyncGenerator<Object>} Stream of encoded frame data\n * @throws {Error} If unsupported channel count is provided\n */\n static async *encodeStream(audioFrames, options = {}) {\n const { channelCount = 1, onProgress, encoderOptions } = options\n\n if (channelCount === 1) {\n yield* AudioProcessor._encodeMonoStream(\n audioFrames,\n onProgress,\n encoderOptions\n )\n } else if (channelCount === 2) {\n yield* AudioProcessor._encodeStereoStream(\n audioFrames,\n onProgress,\n encoderOptions\n )\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n\n /**\n * Internal method for encoding mono audio streams\n * @param {AsyncIterable<Float32Array>} audioFrames - Mono audio frame stream\n * @param {Function} onProgress - Progress callback function\n * @param {EncoderOptions} encoderOptions - Encoder configuration\n * @returns {AsyncGenerator<Object>} Stream of encoded frame data\n * @private\n */\n static async *_encodeMonoStream(audioFrames, onProgress, encoderOptions) {\n const options = encoderOptions || new EncoderOptions()\n const encoder = encode(options)\n let frameIndex = 0\n for await (const frame of withFlushSamples(audioFrames)) {\n const result = encoder(frame)\n yield result\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n }\n\n /**\n * Internal method for encoding stereo audio streams\n * @param {AsyncIterable<[Float32Array, Float32Array]>} audioFrames - Stereo audio frame stream\n * @param {Function} onProgress - Progress callback function\n * @param {EncoderOptions} encoderOptions - Encoder configuration\n * @returns {AsyncGenerator<Object>} Stream of encoded frame data (left then right)\n * @private\n */\n static async *_encodeStereoStream(audioFrames, onProgress, encoderOptions) {\n const options = encoderOptions || new EncoderOptions()\n const leftEncoder = encode(options)\n const rightEncoder = encode(options)\n let frameIndex = 0\n\n for await (const [leftFrame, rightFrame] of withStereoFlushSamples(\n audioFrames\n )) {\n const leftResult = leftEncoder(leftFrame)\n const rightResult = rightEncoder(rightFrame)\n\n yield leftResult\n yield rightResult\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n }\n\n /**\n * Decodes a stream of ATRAC1 encoded frames back to PCM audio\n * @param {AsyncIterable<Object>} encodedFrames - Stream of encoded frame data\n * @param {Object} [options={}] - Decoding options\n * @param {number} [options.channelCount=1] - Number of audio channels (1 or 2)\n * @param {Function} [options.onProgress] - Progress callback function\n * @returns {AsyncGenerator<Float32Array>|AsyncGenerator<[Float32Array, Float32Array]>} Stream of decoded PCM frames\n * @throws {Error} If unsupported channel count is provided\n */\n static async *decodeStream(encodedFrames, options = {}) {\n const { channelCount = 1, onProgress } = options\n\n if (channelCount === 1) {\n yield* AudioProcessor._decodeMonoStream(encodedFrames, onProgress)\n } else if (channelCount === 2) {\n yield* AudioProcessor._decodeStereoStream(encodedFrames, onProgress)\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n\n /**\n * Internal method for decoding mono audio streams\n * @param {AsyncIterable<Object>} encodedFrames - Mono encoded frame stream\n * @param {Function} onProgress - Progress callback function\n * @returns {AsyncGenerator<Float32Array>} Stream of decoded mono PCM frames\n * @private\n */\n static async *_decodeMonoStream(encodedFrames, onProgress) {\n const decoder = decode()\n let frameIndex = 0\n\n // Create raw PCM frame stream\n const rawPcmFrames = async function* () {\n for await (const frame of encodedFrames) {\n const result = decoder(frame)\n yield result\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n }\n\n // Always apply delay compensation\n yield* withDelayCompensation(rawPcmFrames())\n }\n\n /**\n * Internal method for decoding stereo audio streams\n * @param {AsyncIterable<Object>} encodedFrames - Stereo encoded frame stream (interleaved left/right)\n * @param {Function} onProgress - Progress callback function\n * @returns {AsyncGenerator<[Float32Array, Float32Array]>} Stream of decoded stereo PCM frame pairs\n * @private\n */\n static async *_decodeStereoStream(encodedFrames, onProgress) {\n const leftDecoder = decode()\n const rightDecoder = decode()\n let frameIndex = 0\n\n const rawPcmFrames = async function* () {\n let leftFrame = null\n let isLeftChannel = true\n\n for await (const frame of encodedFrames) {\n if (isLeftChannel) {\n leftFrame = frame\n } else {\n const rightFrame = frame\n\n // Decode and yield the pair\n const leftResult = leftDecoder(leftFrame)\n const rightResult = rightDecoder(rightFrame)\n\n yield [leftResult, rightResult]\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n\n isLeftChannel = !isLeftChannel\n }\n\n if (!isLeftChannel && leftFrame) {\n const rightFrame = AudioProcessor._createDummyFrame()\n const leftResult = leftDecoder(leftFrame)\n const rightResult = rightDecoder(rightFrame)\n\n yield [leftResult, rightResult]\n\n if (onProgress) {\n onProgress(frameIndex++)\n }\n }\n }\n\n // Always apply stereo delay compensation\n yield* withStereoDelayCompensation(rawPcmFrames())\n }\n\n /**\n * Converts channel buffer arrays to frame-based stream format\n * @param {Float32Array[]} buffers - Array of channel buffers (1 for mono, 2 for stereo)\n * @param {number} [frameSize=SAMPLES_PER_FRAME] - Frame size in samples\n * @returns {Generator<Float32Array>|Generator<[Float32Array, Float32Array]>} Stream of audio frames\n * @throws {Error} If unsupported channel count is provided\n */\n static *frameBufferToFrames(buffers, frameSize = SAMPLES_PER_FRAME) {\n const channelCount = buffers.length\n\n if (channelCount === 1) {\n const [left] = buffers\n for (let i = 0; i < left.length; i += frameSize) {\n const frame = new Float32Array(frameSize)\n const end = Math.min(i + frameSize, left.length)\n for (let j = 0; j < end - i; j++) {\n frame[j] = left[i + j]\n }\n yield frame\n }\n } else if (channelCount === 2) {\n const [left, right] = buffers\n const maxLength = Math.max(left.length, right.length)\n\n for (let i = 0; i < maxLength; i += frameSize) {\n const leftFrame = new Float32Array(frameSize)\n const rightFrame = new Float32Array(frameSize)\n\n const end = Math.min(i + frameSize, maxLength)\n\n for (let j = 0; j < end - i; j++) {\n leftFrame[j] = i + j < left.length ? left[i + j] : 0\n rightFrame[j] = i + j < right.length ? right[i + j] : 0\n }\n\n yield [leftFrame, rightFrame]\n }\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n\n /**\n * Collects all frames from a stream into an array\n * @param {AsyncIterable} frameStream - Stream of frames to collect\n * @returns {Promise<Array>} Array of all frames from the stream\n */\n static async collectFrames(frameStream) {\n const frames = []\n for await (const frame of frameStream) {\n frames.push(frame)\n }\n return frames\n }\n\n /**\n * Creates a dummy frame for padding purposes\n * @returns {Object} Empty frame structure\n * @private\n */\n static _createDummyFrame() {\n return {\n nBfu: 0,\n blockModes: [0, 0, 0],\n scaleFactorIndices: new Int32Array(0),\n wordLengthIndices: new Int32Array(0),\n quantizedCoefficients: [],\n }\n }\n\n /**\n * Creates an AEA file blob from encoded frames\n * @param {AsyncIterable<Object>} encodedFrames - Stream of encoded frame data\n * @param {Object} [options={}] - AEA file options\n * @param {string} [options.title='encoded by atrac1.js'] - File title\n * @param {number} [options.channelCount=1] - Number of audio channels\n * @returns {Promise<Blob>} AEA file blob\n */\n static async createAeaBlob(encodedFrames, options = {}) {\n const { title = 'encoded by atrac1.js', channelCount = 1 } = options\n\n const frames = []\n for await (const frame of encodedFrames) {\n frames.push(serializeFrame(frame))\n }\n\n const header = AeaFile.createHeader(title, frames.length, channelCount)\n const totalSize =\n header.length + frames.reduce((sum, frame) => sum + frame.length, 0)\n\n const buffer = new Uint8Array(totalSize)\n buffer.set(header, 0)\n\n let offset = header.length\n for (const frame of frames) {\n buffer.set(frame, offset)\n offset += frame.length\n }\n\n return new Blob([buffer], { type: 'application/octet-stream' })\n }\n\n /**\n * Creates a WAV file blob from PCM audio frames\n * @param {Float32Array[]|Float32Array|[Float32Array, Float32Array][]} pcmFrames - PCM audio frames\n * @param {number} [channelCount=1] - Number of audio channels\n * @param {number} [sampleRate=SAMPLE_RATE] - Audio sample rate\n * @returns {Blob} WAV file blob\n * @throws {Error} If unsupported channel count is provided\n */\n static createWavBlob(pcmFrames, channelCount = 1, sampleRate = SAMPLE_RATE) {\n const frames = Array.isArray(pcmFrames) ? pcmFrames : [pcmFrames]\n\n if (channelCount === 1) {\n return AudioProcessor._createMonoWavBlob(frames, sampleRate)\n } else if (channelCount === 2) {\n return AudioProcessor._createStereoWavBlob(frames, sampleRate)\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n\n /**\n * Creates a mono WAV file blob from PCM frames\n * @param {Float32Array[]} frames - Array of mono PCM frames\n * @param {number} sampleRate - Audio sample rate\n * @returns {Blob} Mono WAV file blob\n * @private\n */\n static _createMonoWavBlob(frames, sampleRate) {\n const totalSamples = frames.reduce((sum, frame) => sum + frame.length, 0)\n const buffer = new ArrayBuffer(\n WAV_HEADER_SIZE + totalSamples * WAV_BYTES_PER_SAMPLE\n )\n const view = new DataView(buffer)\n\n // WAV header\n AudioProcessor._writeWavHeader(view, totalSamples, 1, sampleRate)\n\n // PCM data using DataView for consistency\n let offset = WAV_HEADER_SIZE\n for (const frame of frames) {\n for (let i = 0; i < frame.length; i++) {\n const sample = Math.max(-1, Math.min(1, frame[i]))\n view.setInt16(\n offset,\n sample < 0\n ? sample * WAV_PCM_MAX_NEGATIVE\n : sample * WAV_PCM_MAX_POSITIVE,\n true\n )\n offset += WAV_BYTES_PER_SAMPLE\n }\n }\n\n return new Blob([buffer], { type: 'audio/wav' })\n }\n\n /**\n * Creates a stereo WAV file blob from PCM frame pairs\n * @param {[Float32Array, Float32Array][]} framePairs - Array of stereo PCM frame pairs\n * @param {number} sampleRate - Audio sample rate\n * @returns {Blob} Stereo WAV file blob\n * @private\n */\n static _createStereoWavBlob(framePairs, sampleRate) {\n const totalSamples = framePairs.reduce(\n (sum, [left, right]) => sum + Math.max(left.length, right.length),\n 0\n )\n\n const buffer = new ArrayBuffer(\n WAV_HEADER_SIZE + totalSamples * WAV_BYTES_PER_SAMPLE * 2\n )\n const view = new DataView(buffer)\n\n // WAV header\n AudioProcessor._writeWavHeader(view, totalSamples, 2, sampleRate)\n\n // Interleaved PCM data using DataView for consistency\n let offset = WAV_HEADER_SIZE\n for (const [leftFrame, rightFrame] of framePairs) {\n const frameLength = Math.max(leftFrame.length, rightFrame.length)\n for (let i = 0; i < frameLength; i++) {\n const leftSample = i < leftFrame.length ? leftFrame[i] : 0\n const rightSample = i < rightFrame.length ? rightFrame[i] : 0\n const leftClipped = Math.max(-1, Math.min(1, leftSample))\n const rightClipped = Math.max(-1, Math.min(1, rightSample))\n view.setInt16(\n offset,\n leftClipped < 0\n ? leftClipped * WAV_PCM_MAX_NEGATIVE\n : leftClipped * WAV_PCM_MAX_POSITIVE,\n true\n )\n offset += WAV_BYTES_PER_SAMPLE\n view.setInt16(\n offset,\n rightClipped < 0\n ? rightClipped * WAV_PCM_MAX_NEGATIVE\n : rightClipped * WAV_PCM_MAX_POSITIVE,\n true\n )\n offset += WAV_BYTES_PER_SAMPLE\n }\n }\n\n return new Blob([buffer], { type: 'audio/wav' })\n }\n\n /**\n * Writes WAV file header to DataView\n * @param {DataView} view - DataView to write to\n * @param {number} totalSamples - Total number of samples\n * @param {number} channelCount - Number of audio channels\n * @param {number} sampleRate - Audio sample rate\n * @private\n */\n static _writeWavHeader(view, totalSamples, channelCount, sampleRate) {\n const byteRate = sampleRate * channelCount * WAV_BYTES_PER_SAMPLE\n const blockAlign = channelCount * WAV_BYTES_PER_SAMPLE\n const dataSize = totalSamples * blockAlign\n const fileSize = WAV_DATA_OFFSET + dataSize\n\n let pos = 0\n\n // Helper function to write ASCII strings\n const writeString = (offset, string) => {\n for (let i = 0; i < string.length; i++) {\n view.setUint8(offset + i, string.charCodeAt(i))\n }\n }\n\n // RIFF header\n writeString(pos, 'RIFF')\n pos += 4\n view.setUint32(pos, fileSize, true)\n pos += 4\n writeString(pos, 'WAVE')\n pos += 4\n\n // fmt chunk\n writeString(pos, 'fmt ')\n pos += 4\n view.setUint32(pos, 16, true) // chunk size\n pos += 4\n view.setUint16(pos, 1, true) // PCM format\n pos += 2\n view.setUint16(pos, channelCount, true)\n pos += 2\n view.setUint32(pos, sampleRate, true)\n pos += 4\n view.setUint32(pos, byteRate, true)\n pos += 4\n view.setUint16(pos, blockAlign, true)\n pos += 2\n view.setUint16(pos, WAV_BITS_PER_SAMPLE, true) // bits per sample\n pos += 2\n\n // data chunk\n writeString(pos, 'data')\n pos += 4\n view.setUint32(pos, dataSize, true)\n }\n\n /**\n * Parses an AEA file blob to extract header info and frame data\n * @param {Blob} blob - AEA file blob to parse\n * @returns {Promise<Object>} Parsed AEA file data\n * @returns {Object} returns.info - AEA file header information\n * @returns {Uint8Array[]} returns.frameData - Array of frame data buffers\n */\n static async parseAeaBlob(blob) {\n const buffer = await blob.arrayBuffer()\n const header = new Uint8Array(buffer.slice(0, AEA_HEADER_SIZE))\n const info = AeaFile.parseHeader(header)\n\n const frameData = []\n for (let i = AEA_HEADER_SIZE; i < buffer.byteLength; i += SOUND_UNIT_SIZE) {\n const frame = new Uint8Array(buffer.slice(i, i + SOUND_UNIT_SIZE))\n if (frame.length === SOUND_UNIT_SIZE) {\n frameData.push(frame)\n }\n }\n\n return { info, frameData }\n }\n\n /**\n * Creates a stream of deserialized frames from binary frame data\n * @param {Uint8Array[]} frameData - Array of binary frame data\n * @returns {Generator<Object>} Stream of deserialized frame objects\n */\n static *deserializedFrameStream(frameData) {\n for (const frame of frameData) {\n yield deserializeFrame(frame)\n }\n }\n\n /**\n * Assembles PCM frames into a continuous buffer\n * @param {Float32Array[]|[Float32Array, Float32Array][]} pcmFrames - Array of PCM frames\n * @param {number} channelCount - Number of audio channels\n * @returns {Float32Array} Continuous PCM buffer (interleaved for stereo)\n * @throws {Error} If unsupported channel count is provided\n */\n static assemblePcmFrames(pcmFrames, channelCount) {\n if (channelCount === 1) {\n const totalSamples = pcmFrames.reduce(\n (sum, frame) => sum + frame.length,\n 0\n )\n const pcm = new Float32Array(totalSamples)\n let offset = 0\n for (const frame of pcmFrames) {\n pcm.set(frame, offset)\n offset += frame.length\n }\n return pcm\n } else if (channelCount === 2) {\n const totalSamples = pcmFrames.reduce(\n (sum, [left, right]) => sum + Math.max(left.length, right.length),\n 0\n )\n const pcm = new Float32Array(totalSamples * 2)\n\n let pcmOffset = 0\n for (const [leftFrame, rightFrame] of pcmFrames) {\n const frameLength = Math.max(leftFrame.length, rightFrame.length)\n for (let j = 0; j < frameLength; j++) {\n pcm[pcmOffset * 2] = j < leftFrame.length ? leftFrame[j] : 0\n pcm[pcmOffset * 2 + 1] = j < rightFrame.length ? rightFrame[j] : 0\n pcmOffset++\n }\n }\n return pcm\n } else {\n throw new Error(`Unsupported channel count: ${channelCount}`)\n }\n }\n}\n","/**\n * Carta1 Web Worker - Self-contained audio codec worker\n *\n * Provides asynchronous encoding and decoding of ATRAC1 audio format\n * in a separate thread to prevent blocking the main UI thread.\n *\n * Usage:\n * Include this file as a web worker:\n * new Worker('carta1-worker.min.js')\n */\n\nimport { AeaFile } from '../io/serialization.js'\nimport { EncoderOptions } from '../core/options.js'\nimport { AudioProcessor } from '../io/processor.js'\nimport { SAMPLE_RATE } from '../core/constants.js'\n\n/**\n * Handle messages from the main thread\n *\n * Supported message types:\n * - 'encode': Encode PCM to ATRAC1\n * - 'decode': Decode ATRAC1 to PCM\n * - 'parseAea': Parse AEA blob metadata\n * - 'getEncoderOptions': Get default encoder options\n */\nself.onmessage = async (e) => {\n const { jobId, type, pcmData, aea, options, title, blob } = e.data\n\n try {\n let result\n\n switch (type) {\n case 'encode':\n result = await encodeAtrac(pcmData, options, title)\n break\n case 'decode':\n result = await decodeAtrac(aea)\n break\n case 'parseAea':\n result = await AudioProcessor.parseAeaBlob(blob)\n break\n case 'getEncoderOptions':\n result = getEncoderOptionsMetadata()\n break\n default:\n throw new Error(`Unknown worker message type: ${type}`)\n }\n\n self.postMessage({ jobId, result })\n } catch (error) {\n console.error('Worker error:', error)\n self.postMessage({ jobId, error: error.message })\n }\n}\n\n/**\n * Encode PCM audio data to ATRAC1 format\n *\n * @param {Array<Float32Array>} pcmData - PCM audio data [mono] or [left, right]\n * @param {Object} options - Encoder options\n * @returns {Promise<Object>} Encoded AEA blob\n */\nasync function encodeAtrac(pcmData, options, title) {\n title = title ?? 'encoded by carta1'\n try {\n const audioFrames = AudioProcessor.frameBufferToFrames(pcmData)\n const channelCount = pcmData.length\n\n // Create encoder options from provided settings\n const encoderOptions = new EncoderOptions(options)\n\n const encodedFrames = AudioProcessor.encodeStream(audioFrames, {\n channelCount,\n encoderOptions,\n })\n\n const frameArray = await AudioProcessor.collectFrames(encodedFrames)\n\n const aeaBlob = await AudioProcessor.createAeaBlob(frameArray, {\n title,\n channelCount,\n })\n\n // Return the blob\n return { aeaBlob }\n } catch (error) {\n console.error('Worker encode error:', error)\n throw error\n }\n}\n\n/**\n * Get default encoder options metadata\n *\n * @returns {Object} Default encoder options as plain object\n */\nfunction getEncoderOptionsMetadata() {\n const defaultOptions = new EncoderOptions()\n return defaultOptions.toObject()\n}\n\n/**\n * Decode ATRAC1 data to PCM WAV format\n *\n * @param {Object} aea - AEA data object\n * @param {Uint8Array} aea.header - AEA file header\n * @param {Array} aea.aeaData - Serialized frame data\n * @param {Object} [aea.info] - Optional metadata\n * @returns {Promise<Object>} WAV blob and decoding info\n */\nasync function decodeAtrac(aea) {\n const { header, aeaData, info } = aea\n\n // Use provided info, or fall back to header parsing, or defaults\n let decodingInfo\n if (info) {\n decodingInfo = { sampleRate: SAMPLE_RATE, ...info }\n } else if (header) {\n const headerInfo = AeaFile.parseHeader(header)\n decodingInfo = { sampleRate: SAMPLE_RATE, ...headerInfo }\n } else {\n decodingInfo = { channelCount: 2, sampleRate: SAMPLE_RATE }\n }\n\n const encodedFrameStream = AudioProcessor.deserializedFrameStream(aeaData)\n const decodedFrames = AudioProcessor.decodeStream(encodedFrameStream, {\n channelCount: decodingInfo.channelCount,\n })\n\n const pcmFrames = await AudioProcessor.collectFrames(decodedFrames)\n\n // Create WAV blob directly\n const wavBlob = AudioProcessor.createWavBlob(\n pcmFrames,\n decodingInfo.channelCount,\n decodingInfo.sampleRate\n )\n\n return { wavBlob, info: decodingInfo }\n}\n"],"names":["SAMPLE_RATE","SAMPLES_PER_FRAME","AEA_MAGIC","Uint8Array","AEA_HEADER_SIZE","SOUND_UNIT_SIZE","NUM_BFUS","SPECS_PER_BFU","Int32Array","BFU_AMOUNTS","BFU_BAND_BOUNDARIES","BFU_FREQUENCIES","Float32Array","BFU_START_LONG","BFU_START_SHORT","MDCT_SIZE_MID","MDCT_SIZE_LONG","WINDOW_SHORT","table","i","Math","sin","PI","QMF_DELAY","QMF_COEFFS","QMF_WINDOW","window","QMF_EVEN","even","QMF_ODD","odd","MAX_WORD_LENGTH_INDEX","WORD_LENGTH_BITS","QUANT_DISTORTION_TABLE","wl","quantRange","DISTORTION_DELTA_DB","log10","SCALE_FACTORS","pow","BARK_SCALE","freq","atan","PSYMODEL_MIN_POWER_DB","matrix","masker","masked","distance","spreading","PSYMODEL_FFT_SIZE","_ref","half","sizeMinus1","halfDiv2","idx0","Uint16Array","idx1","w1","src","base","j0","j1","_ref2","PSYMODEL_PSD_SOURCE_IDX0","PSYMODEL_PSD_SOURCE_IDX1","PSYMODEL_PSD_INTERP_WEIGHT","MDCT_BAND_CONFIGS","size","windowStart","MDCT_SHORT_BLOCK_SIZE","MDCT_OVERLAP_SIZE","MDCT_TAIL_WINDOW_SIZE","WAV_PCM_MAX_POSITIVE","WAV_PCM_MAX_NEGATIVE","PSYMODEL_LOG10_FACTOR","LN10","PSYMODEL_POW10_FACTOR","PSYMODEL_CRITICAL_BANDS","PSYMODEL_THRESHOLD_TABLE","PSYMODEL_CB_FREQ_INDICES","map","cbIdx","PSYMODEL_FREQ_TO_CB_MAP","packBits","buffer","bitPosition","value","bitCount","byteIndex","floor","bitOffset","bitsWritten","length","bitsAvailable","bitsToWrite","min","valueBits","mask","unpackBits","bitsRead","bitsToRead","unpackSignedBits","serializeFrame","frameData","view","DataView","bfuIndex","indexOf","nBfu","header","blockModes","setUint16","wordLengthIndices","scaleFactorIndices","bitsPerSample","_step","_iterator","_createForOfIteratorHelper","quantizedCoefficients","s","n","done","coefficient","err","e","f","deserializeFrame","Error","concat","byteOffset","byteLength","getUint16","bfuSize","coefficients","j","push","AeaFile","_createClass","_classCallCheck","key","title","arguments","undefined","frameCount","channelCount","set","titleBytes","TextEncoder","encode","subarray","AEA_TITLE_SIZE","setUint32","titleEnd","titleLength","TextDecoder","decode","getUint32","EncoderOptions","options","this","values","transientThresholdLow","transientThresholdMid","transientThresholdHigh","normalizationDb","metadata","default","name","description","range","step","setOptions","_i","_Object$entries","Object","entries","_Object$entries$_i","_slicedToArray","setValue","_meta$range","max","get","_objectSpread","_i2","_Object$entries2","_Object$entries2$_i","meta","t","r","Symbol","iterator","o","toStringTag","c","prototype","Generator","u","create","_regeneratorDefine2","p","y","G","v","a","d","bind","l","TypeError","call","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","defineProperty","enumerable","configurable","writable","_invoke","_awaitAsyncGenerator","_OverloadYield","_wrapAsyncGenerator","AsyncGenerator","apply","resume","Promise","resolve","then","k","settle","reject","next","arg","_asyncIterator","asyncIterator","AsyncFromSyncIterator","AsyncFromSyncIteratorContinuation","throwError","msg","pipe","context","_len","stages","Array","_key","functions","stage","input","reduce","fn","withFlushSamples","_x","_withFlushSamples","iter","samplesToFlush","_callee","lastFrameLength","_iteratorAbruptCompletion","_didIteratorError","_iteratorError","frame","paddedFrame","_t","_context","withDelayCompensation","_x2","_withDelayCompensation","pcmFrameStream","samplesToDrop","_callee2","droppedInitialSamples","_iteratorAbruptCompletion2","_didIteratorError2","_iteratorError2","_iterator2","_step2","combined","offset","_t2","_context2","slice","withStereo","monoTransform","_len2","args","_key2","_callee5","stereoIter","leftFrames","rightFrames","_iteratorAbruptCompletion3","_didIteratorError3","_iteratorError3","_iterator3","_step3","_step3$value","left","right","leftIter","rightIter","leftTransformed","rightTransformed","_iteratorAbruptCompletion4","_didIteratorError4","_iteratorError4","_iterator4","_step4","_left","_yield$_awaitAsyncGen","_right","_t3","_t4","_context5","_callee3","_leftFrames","_context3","_callee4","_rightFrames","_context4","_x3","reverseSpectrum","spectrum","reversalBuffers","reversed","withStereoFlushSamples","withStereoDelayCompensation","qmfAnalysis","delayLine","_qmfWorkBuffers$delay","_qmfWorkBuffers$delay2","qmfWorkBuffers","inputLength","outputLength","workBuffer","delay","lowBand","highBand","evenSum","oddSum","newDelay","qmfSynthesis","_qmfWorkBuffers$delay3","_qmfWorkBuffers$delay4","subbandLength","low","high","output","sample0","sample1","idx","FFT","real","imag","cache","_cache","_buildCache","bitRev","cosTbl","cos","sinTbl","tr","ti","r0","i0","r1","i1","r2","i2","tR","tI","stride","halfStride","tblStep","tw","Uint32Array","log2n","log2","halfN","ang","_defineProperty","Map","MDCTBase","scale","halfSize","quarterSize","fftSize","alpha","omega","scaleRoot","sqrt","sinCosTable","angle","MDCT","_callSuper","_inherits","_mdctBuffers$this$fft","_buffers$real","_buffers$imag","mdctBuffers","buffers","n4","n34","fill","i3","i4","im","fft","re","IMDCT","_mdctBuffers$this$fft2","_buffers$real2","_buffers$imag2","mdct64","mdct256","mdct512","imdct64","MDCT_SIZE_SHORT","imdct256","imdct512","overlapAdd","prev","curr","w2","findScaleFactor","maxAmplitude","abs","mid","quantize","scaleFactorIndex","normFactor","quantized","normalized","round","dequantize","denormFactor","dequantized","allocateBits","psychoResults","bfuData","bfuSizes","maxBfuCount","signalEnergyDb","bfuCount","energyPerBfu","data","energy","calculateBfuEnergy","smrValues","maskThresholdDb","bfu","Infinity","calculateSMR","criticalBandThresholds","maskThresholdPerBfu","freqPerBin","bfuFreq","fftBinIndex","bandIndex","x0","x1","y0","y1","bandWidth","interpolated","compensation","interpolateCriticalBandsToBfus","actualBfuCount","hasAudibleContent","some","smr","contributions","index","sort","b","cumulativeSMR","sum","candidateCount","requiredBfus","_toConsumableArray","capturedIndex","remainingIndices","highestSignalBfu","BFU_AMOUNTS_COUNT","selectOptimalBfuCount","allocation","availableBits","heap","priority","heapifyDown","bestBfu","currentWl","pop","upgradeCost","calculateUpgradeCost","performBitAllocation","FRAME_BITS","currentBits","startIdx","element","leftChild","rightChild","largest","largestPriority","BufferPool","transformBuffers","highBandDelay","QMF_HIGH_BAND_DELAY","qmfDelays","midBand","transientDetection","mdctOverlap","imdctOverlap","detectTransient","currentCoeffs","prevCoeffs","threshold","features","spectralFlux","flux","currentEnergy","currentMag","diff","normalization","calculateSpectralFlux","currentFlatness","calculateSpectralFlatness","prevFlatness","flatnessChange","currentHfRatio","calculateHighFrequencyRatio","prevHfRatio","hfChange","energyChange","prevEnergy","changeDb","calculateEnergyChange","calculateSpectralFeatures","transientScore","fluxContribution","flatnessContribution","hfContribution","log1p","energyContribution","calculateTransientScore","coeffs","sumLog","sumLinear","validBins","magnitude","log","geometricMean","exp","arithmeticMean","midPoint","lowEnergy","highEnergy","totalEnergy","toDb","fromDb","db","psychoAnalysis","mdctCoeffs","psd","linearPower","maxLinearPower","power","calculatePSDFromMDCT","_findAllMaskers","fftScale","flags","tonalList","maxTonalBin","RANGE_LOW","RANGE_MID","RANGE_HIGH","searchOffsets","isTonal","spl","markTonalComponent","findTonalMaskers","nonTonalList","cbStart","bandAnalysis","analyzeCriticalBand","powerDb","centroidOffset","findNonTonalMaskers","decimated","isAudible","markInaudible","audibleTonal","tonal","audibleNonTonal","nonTonal","decimateMaskers","tonalMaskers","nonTonalMaskers","findAllMaskers","maskers","bark","_step5","_iterator5","_step6","bandData","maskedBark","summedEnergy","_iterator6","barkDistance","calculateMaskingLevel","calculateCriticalBandThresholds","tonalMaskersCount","nonTonalMaskersCount","offsets","_arr","startBin","endBin","totalPower","weightedPower","baseBark","maskerSpl","maskerPsd","maskerBark","psdFactor1","qmfAnalysisStage","_context$bufferPool","bufferPool","delays","pcmSamples","stage1","stage2","delayedHigh","bands","blockSelectorStage","_context$bufferPool2","_context$options","fftSizes","bandSamples","samples","copyLen","performFFT","transient","mdctStage","_context$bufferPool3","overlapBuffers","TRANSFORM_FUNCS","transformBand","blockMode","overlapBuffer","config","transformFunc","mdctSize","mdctInput","applyTailWindowing","transform","transformLongBlock","numBlocks","block","blockStart","blockSamples","transformShortBlocks","blockSize","tailStart","tailValue","originalFrame","forEach","transformed","calculateBandOffset","quantizationStage","_context$bufferPool4","_context$options2","_groupIntoBFUs","bfuBuffers","coeffIndex","band","bandStart","bandSize","bandEnd","startPositions","startPos","actualSize","groupIntoBFUs","_allocateBits","selectedBfuCount","wordLength","dequantizationStage","position","imdctStage","blockSpecs","inv","invStart","invBuf","prevBuf","dstPart","inverseLongBlock","start","pos","inverseShortBlocks","bandCoeffs","extractBandCoefficients","qmfSynthesisStage","_defineProperties","_toPropertyKey","_typeof","toPrimitive","String","Number","_toPrimitive","_asyncGeneratorDelegate","pump","AudioProcessor","audioFrames","_options$channelCount","onProgress","encoderOptions","_regeneratorValues","_encodeMonoStream","_encodeStereoStream","encoder","frameIndex","result","leftEncoder","rightEncoder","_step2$value","leftFrame","rightFrame","leftResult","rightResult","encodedFrames","_options$channelCount2","_decodeMonoStream","_decodeStereoStream","_callee6","decoder","rawPcmFrames","_context6","_callee8","leftDecoder","rightDecoder","_context8","_callee7","isLeftChannel","_rightFrame","_leftResult","_rightResult","_context7","_createDummyFrame","frameSize","_callee9","_buffers","end","_buffers2","maxLength","_end","_j","_context9","_collectFrames","_asyncToGenerator","_callee0","frameStream","frames","_iteratorAbruptCompletion5","_didIteratorError5","_iteratorError5","_t5","_context0","_createAeaBlob","_callee1","_options$title","_options$channelCount3","_iteratorAbruptCompletion6","_didIteratorError6","_iteratorError6","totalSize","_frames","_frame","_t6","_args1","_context1","createHeader","Blob","type","_x4","pcmFrames","sampleRate","isArray","_createMonoWavBlob","_createStereoWavBlob","totalSamples","ArrayBuffer","_writeWavHeader","_step7","_iterator7","sample","setInt16","framePairs","_ref3","_ref4","_step8","_iterator8","_step8$value","frameLength","leftSample","rightSample","leftClipped","rightClipped","byteRate","blockAlign","dataSize","fileSize","writeString","string","setUint8","charCodeAt","_parseAeaBlob","_callee10","blob","info","_context10","arrayBuffer","parseHeader","_x5","deserializedFrameStream","_iterator9","_step9","_t7","_context11","_step0","pcm","_iterator0","_step1","_ref5","_ref6","pcmOffset","_iterator1","_step1$value","asyncGeneratorStep","_next","_throw","encodeAtrac","_encodeAtrac","pcmData","frameArray","aeaBlob","frameBufferToFrames","encodeStream","collectFrames","createAeaBlob","console","error","getEncoderOptionsMetadata","toObject","decodeAtrac","_decodeAtrac","aea","aeaData","decodingInfo","headerInfo","encodedFrameStream","decodedFrames","wavBlob","decodeStream","createWavBlob","self","onmessage","_e$data","jobId","parseAeaBlob","postMessage","message"],"sourceRoot":""}