carta1 1.0.0 → 1.0.2
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.
- package/bin/cli.js +2 -2
- package/codec/browser/interface.js +25 -11
- package/codec/core/constants.js +37 -78
- package/codec/io/serialization.js +1 -1
- package/codec/transforms/qmf.js +1 -25
- package/dist/carta1-worker-interface.min.js +1 -1
- package/dist/carta1-worker-interface.min.js.map +1 -1
- package/dist/carta1-worker.min.js +1 -1
- package/dist/carta1-worker.min.js.map +1 -1
- package/dist/carta1.min.js +1 -1
- package/dist/carta1.min.js.map +1 -1
- package/package.json +1 -1
- /package/codec/{core → io}/bitstream.js +0 -0
package/dist/carta1.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"carta1.min.js","mappings":"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","sources":["webpack://Carta1/webpack/universalModuleDefinition","webpack://Carta1/webpack/bootstrap","webpack://Carta1/webpack/runtime/define property getters","webpack://Carta1/webpack/runtime/hasOwnProperty shorthand","webpack://Carta1/webpack/runtime/make namespace object","webpack://Carta1/./codec/core/constants.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/core/options.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/core/bitstream.js","webpack://Carta1/./codec/io/serialization.js","webpack://Carta1/./codec/io/processor.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Carta1\"] = factory();\n\telse\n\t\troot[\"Carta1\"] = factory();\n})(this, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\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 = new Int32Array([20, 28, 32, 36, 40, 44, 48, 52])\nexport const BFU_BAND_BOUNDARIES = new Int32Array([20, 36, 52])\nexport const BFU_TO_BAND = (() => {\n const table = new Uint8Array(52)\n for (let i = 0; i < BFU_BAND_BOUNDARIES[0]; i++) table[i] = 0\n for (let i = BFU_BAND_BOUNDARIES[0]; i < BFU_BAND_BOUNDARIES[1]; i++)\n table[i] = 1\n for (let i = BFU_BAND_BOUNDARIES[1]; i < BFU_BAND_BOUNDARIES[2]; i++)\n table[i] = 2\n return table\n})()\n\n// Perceptually important bfus\nexport const CRITICAL_BFUS = new Uint8Array([\n 20, 21, 22, 19, 23, 18, 24, 17, 25, 16, 26, 15, 27, 14, 28, 32, 33, 34, 35,\n 36, 37, 38, 31, 30, 29,\n])\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// Band sizes\nexport const BAND_SIZE_LOW = 128\nexport const BAND_SIZE_MID = 128\nexport const BAND_SIZE_HIGH = 256\n\n// Window positions\nexport const WINDOW_START_LONG_HIGH = 112\nexport const WINDOW_START_LONG_MID = 48\nexport const WINDOW_START_SHORT = 0\n\n// IMDCT overlap sizes\nexport const IMDCT_OVERLAP_SIZE = 16\nexport const IMDCT_QUARTER_SIZE = 4\nexport const IMDCT_SHORT_BLOCK_SIZE = 32\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 filter configuration\nexport const QMF_TAPS = 48\nexport const QMF_DELAY = 46\nexport const QMF_HIGH_BAND_DELAY = 39\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 ATH_LINEAR = (() => {\n const table = new Float32Array(NUM_BFUS)\n for (let i = 0; i < NUM_BFUS; i++) {\n const freqKhz = BFU_FREQUENCIES[i] / 1000\n const athDb =\n 3.64 * Math.pow(freqKhz, -0.8) -\n 6.5 * Math.exp(-0.6 * Math.pow(freqKhz - 3.3, 2)) +\n 1e-3 * Math.pow(freqKhz, 4)\n table[i] = Math.pow(10, Math.max(-10, Math.min(96, athDb)) / 10)\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\nexport const PSYMODEL_INPUT_SIZE = 512\nexport const PSYMODEL_PN = 90.302\n\n// Transient detection\nexport const TRANSIENT_DETECTION_THRESHOLD = 0.1\nexport const TRANSIENT_FLATNESS_EPSILON = 1e-10\n\n// FFT sizes for transient detection\nexport const FFT_SIZE_LOW = 256\nexport const FFT_SIZE_MID = 256\nexport const FFT_SIZE_HIGH = 512\n\n// Bit allocation\nexport const ALLOCATION_DIMINISHING_RETURNS_THRESHOLD = 0.1\nexport const ALLOCATION_MAX_ITERATIONS = 100\n\n// Quantization\nexport const QUANTIZATION_SIGN_BIT_SHIFT = 1\nexport const QUANTIZATION_MAX_RANGE_SHIFT = 1\n\n// WAV format\nexport const WAV_HEADER_SIZE = 44\nexport const WAV_RIFF_CHUNK_ID = 0x46464952\nexport const WAV_WAVE_FORMAT = 0x45564157\nexport const WAV_FMT_CHUNK_ID = 0x20746d66\nexport const WAV_DATA_CHUNK_ID = 0x61746164\nexport const WAV_PCM_FORMAT = 1\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// Display formatting\nexport const DISPLAY_HEADER_WIDTH = 64\nexport const DISPLAY_FRAME_WIDTH = 32\nexport const DISPLAY_FORMAT_WIDTH = 16\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// Hann window for 512 samples (single-band psychoacoustics)\nexport const PSYMODEL_HANN_WINDOW = (() => {\n const table = new Float32Array(512)\n const normalizationFactor = Math.sqrt(8.0 / 3.0)\n\n for (let i = 0; i < 512; i++) {\n const hann = 0.5 * (1 - Math.cos((2 * Math.PI * i) / 512))\n const normalized = hann * normalizationFactor\n table[i] = Math.round(normalized * 10000) / 10000\n }\n return table\n})()\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 - 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// 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_TAPS, QMF_DELAY } from '../core/constants.js'\nimport { throwError } from '../utils.js'\n\n// QMF prototype filter coefficients\nconst 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// Build full window\nconst QMF_WINDOW = new Float32Array(QMF_TAPS)\nfor (let i = 0; i < 24; i++) {\n QMF_WINDOW[i] = QMF_COEFFS[i] * 2.0\n QMF_WINDOW[47 - i] = QMF_COEFFS[i] * 2.0\n}\n\n// Separate even/odd taps for optimization\nconst QMF_EVEN = new Float32Array(24)\nconst QMF_ODD = new Float32Array(24)\nfor (let i = 0; i < 24; i++) {\n QMF_EVEN[i] = QMF_WINDOW[i * 2]\n QMF_ODD[i] = QMF_WINDOW[i * 2 + 1]\n}\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 *\n * This module implements a radix-2 Cooley-Tukey FFT algorithm for frequency domain\n * analysis used in psychoacoustic modeling and transient detection.\n */\n\nexport class FFT {\n /**\n * Perform in-place FFT on complex data\n * @param {Float32Array} real - Real part of input/output data\n * @param {Float32Array} imag - Imaginary part of input/output data\n */\n static fft(real, imag) {\n const size = real.length\n if (size === 1) return\n\n const bits = Math.log2(size)\n\n // Bit reversal\n for (let i = 0; i < size; i++) {\n let reversed = 0\n let temp = i\n for (let b = 0; b < bits; b++) {\n reversed = (reversed << 1) | (temp & 1)\n temp >>= 1\n }\n if (reversed > i) {\n ;[real[i], real[reversed]] = [real[reversed], real[i]]\n ;[imag[i], imag[reversed]] = [imag[reversed], imag[i]]\n }\n }\n\n // Cooley-Tukey decimation-in-time\n for (let stride = 2; stride <= size; stride <<= 1) {\n const halfStride = stride >> 1\n const angle = (-2 * Math.PI) / stride\n const wReal = Math.cos(angle)\n const wImag = Math.sin(angle)\n\n for (let start = 0; start < size; start += stride) {\n let twiddleReal = 1\n let twiddleImag = 0\n\n for (let k = 0; k < halfStride; k++) {\n const evenIndex = start + k\n const oddIndex = evenIndex + halfStride\n\n const evenReal = real[evenIndex]\n const evenImag = imag[evenIndex]\n const oddReal = real[oddIndex]\n const oddImag = imag[oddIndex]\n\n const tReal = oddReal * twiddleReal - oddImag * twiddleImag\n const tImag = oddReal * twiddleImag + oddImag * twiddleReal\n\n real[evenIndex] = evenReal + tReal\n imag[evenIndex] = evenImag + tImag\n real[oddIndex] = evenReal - tReal\n imag[oddIndex] = evenImag - tImag\n\n const nextReal = twiddleReal * wReal - twiddleImag * wImag\n twiddleImag = twiddleReal * wImag + twiddleImag * wReal\n twiddleReal = nextReal\n }\n }\n }\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 PSYMODEL_MIN_POWER_DB,\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 // Map psychoacoustic masking threshold to BFUs\n const maskingThreshold =\n psychoResults.maskingThreshold || psychoResults.globalThreshold\n const maskThresholdDb = mapThresholdToBfus(maskingThreshold)\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 (10 * log10(energy/size))\n energyPerBfu[i] =\n energy > 0 ? 10 * Math.log10(energy / size) : PSYMODEL_MIN_POWER_DB\n }\n\n return energyPerBfu\n}\n\n/**\n * Map frequency-domain masking threshold to BFU indices\n * @param {Float32Array} globalThreshold - Frequency-domain masking threshold\n * @returns {Float32Array} Masking threshold per BFU\n */\nfunction mapThresholdToBfus(globalThreshold) {\n const maskThresholdPerBfu = new Float32Array(NUM_BFUS)\n maskThresholdPerBfu.fill(PSYMODEL_MIN_POWER_DB)\n\n // Calculate frequency resolution\n const fftSize = (globalThreshold.length - 1) * 2\n const freqPerBin = SAMPLE_RATE / fftSize\n\n // Map each BFU's center frequency to nearest FFT bin\n for (let i = 0; i < NUM_BFUS; i++) {\n const bfuFreq = BFU_FREQUENCIES[i]\n const fftBinIndex = Math.round(bfuFreq / freqPerBin)\n\n if (fftBinIndex >= 0 && fftBinIndex < globalThreshold.length) {\n maskThresholdPerBfu[i] = globalThreshold[fftBinIndex]\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 // BFUs with no signal have undefined SMR\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 return selectBfuCountForAudibleContent(smrValues, maxBfuCount)\n } else {\n return selectBfuCountForInaudibleContent(\n smrValues,\n signalEnergyDb,\n maxBfuCount\n )\n }\n}\n\n/**\n * Select BFU count when content is above masking threshold\n * Uses diminishing returns approach - find where adding more BFUs\n * provides minimal benefit\n */\nfunction selectBfuCountForAudibleContent(smrValues, maxBfuCount) {\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 currentValue = cumulativeSMR[capturedIndex]\n const totalValue = cumulativeSMR[cumulativeSMR.length - 1]\n const remainingIndices = contributions.length - capturedIndex - 1\n\n if (remainingIndices > 0) {\n const averageRemaining = (totalValue - currentValue) / remainingIndices\n const averageCaptured = currentValue / (capturedIndex + 1)\n\n // If remaining BFUs contribute much less on average, we've found our cutoff\n if (averageRemaining < averageCaptured * 0.1) {\n return candidateCount\n }\n }\n }\n }\n\n return BFU_AMOUNTS[BFU_AMOUNTS.length - 1]\n}\n\n/**\n * Select BFU count when all content is below masking threshold\n * Simply finds the smallest count that includes all BFUs with signal\n */\nfunction selectBfuCountForInaudibleContent(\n smrValues,\n signalEnergyDb,\n maxBfuCount\n) {\n // Find the highest BFU index that contains actual signal\n let highestSignalBfu = -1\n\n for (let i = maxBfuCount - 1; i >= 0; i--) {\n if (signalEnergyDb[i] > PSYMODEL_MIN_POWER_DB && smrValues[i] > -Infinity) {\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 return BFU_AMOUNTS[BFU_AMOUNTS.length - 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).fill(0)\n\n // Initialize priority queue with BFUs that have signal\n const priorityQueue = createPriorityQueue(smrValues, actualBfuCount)\n\n // Greedy allocation: always upgrade BFU with highest priority\n while (!priorityQueue.isEmpty()) {\n const bestBfu = priorityQueue.peek()\n const currentWl = allocation[bestBfu.bfu]\n\n // Check if BFU is already at maximum word length\n if (currentWl >= MAX_WORD_LENGTH_INDEX) {\n priorityQueue.pop()\n continue\n }\n\n // Calculate cost to upgrade this BFU\n const upgradeCost = calculateUpgradeCost(bestBfu.bfu, currentWl, bfuSizes)\n\n if (upgradeCost <= availableBits) {\n // Perform upgrade\n availableBits -= upgradeCost\n allocation[bestBfu.bfu]++\n\n // Update priority based on distortion reduction\n bestBfu.priority += DISTORTION_DELTA_DB[currentWl]\n priorityQueue.updateTop()\n } else {\n // Not enough bits for this BFU\n priorityQueue.pop()\n }\n }\n\n return allocation\n}\n\n/**\n * Calculate bit cost to upgrade a BFU's word length\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 * Create a priority queue for BFU allocation\n * @param {Float32Array} smrValues - Initial priorities (SMR values)\n * @param {number} bfuCount - Number of BFUs\n * @returns {Object} Priority queue interface\n */\nfunction createPriorityQueue(smrValues, bfuCount) {\n const heap = []\n\n // Initialize with BFUs that have signal\n for (let i = 0; i < bfuCount; 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 return {\n isEmpty: () => heap.length === 0,\n peek: () => heap[0],\n pop: () => popMax(heap),\n updateTop: () => heapifyDown(heap, 0),\n }\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 let idx = startIdx\n const element = heap[idx]\n const length = heap.length\n\n while (true) {\n const leftChild = 2 * idx + 1\n const rightChild = 2 * idx + 2\n let largest = idx\n let largestPriority = element.priority\n\n // Find largest among parent and children\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 parent is largest, we're done\n if (largest === idx) break\n\n // Swap and continue\n heap[idx] = heap[largest]\n idx = largest\n }\n\n heap[idx] = element\n}\n\n/**\n * Remove and return the maximum element from heap\n * @param {Array} heap - Heap array\n * @returns {Object} Maximum element\n */\nfunction popMax(heap) {\n const max = heap[0]\n const last = heap.pop()\n\n if (heap.length > 0) {\n heap[0] = last\n heapifyDown(heap, 0)\n }\n\n return max\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 PSYMODEL_FFT_SIZE,\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 prevLowCoeffs: new Float32Array(128),\n prevMidCoeffs: new Float32Array(128),\n prevHighCoeffs: new Float32Array(256),\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 // Psychoacoustic model buffers\n this.psychoAnalysis = {\n flags: new Uint8Array(PSYMODEL_FFT_SIZE / 2),\n threshold: new Float32Array(PSYMODEL_FFT_SIZE / 2 + 1),\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 - 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 - 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_NON_TONAL,\n PSYMODEL_IRRELEVANT,\n PSYMODEL_LOG10_FACTOR,\n PSYMODEL_POW10_FACTOR,\n PSYMODEL_CRITICAL_BANDS,\n PSYMODEL_CB_FREQ_INDICES,\n PSYMODEL_THRESHOLD_TABLE,\n PSYMODEL_FREQ_TO_CB_MAP,\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} targetSize - Target FFT size for analysis\n * @param {Object} psychoBuffers - Reusable buffers for performance\n * @returns {Object} Analysis results including PSD, maskers, and thresholds\n */\nexport function psychoAnalysis(\n mdctCoeffs,\n targetSize,\n psychoBuffers,\n normalizationDb\n) {\n const fftScale = targetSize / 512\n\n // Apply frequency band reversal correction\n const correctedCoeffs = applyMdctCorrection(mdctCoeffs)\n\n // Calculate power spectral density\n const psd = calculatePSDFromMDCT(correctedCoeffs, targetSize, normalizationDb)\n\n // Find tonal and non-tonal maskers\n const { flags, tonalMaskers, nonTonalMaskers } = findAllMaskers(\n psd,\n psychoBuffers,\n fftScale\n )\n\n // Calculate global masking threshold\n const globalThreshold = calculateGlobalThreshold(\n psd,\n tonalMaskers,\n nonTonalMaskers,\n psychoBuffers.threshold,\n targetSize\n )\n\n return {\n psd,\n tonalMaskers,\n nonTonalMaskers,\n globalThreshold,\n flags,\n }\n}\n\n/**\n * Apply frequency band reversal correction to MDCT coefficients\n * @param {Float32Array} mdctCoeffs - Original MDCT coefficients\n * @returns {Float32Array} Corrected coefficients\n */\nfunction applyMdctCorrection(mdctCoeffs) {\n const corrected = new Float32Array(512)\n\n // Low band: direct copy\n corrected.set(mdctCoeffs.subarray(0, 128), 0)\n\n // Mid band: reversed\n for (let i = 0; i < 128; i++) {\n corrected[128 + i] = mdctCoeffs[255 - i]\n }\n\n // High band: reversed\n for (let i = 0; i < 256; i++) {\n corrected[256 + i] = mdctCoeffs[511 - i]\n }\n\n return corrected\n}\n\n/**\n * Calculate Power Spectral Density from MDCT coefficients\n * @param {Float32Array} mdctCoeffs - MDCT coefficients\n * @param {number} targetSize - Target FFT size\n * @returns {Float32Array} Power spectral density in dB\n */\nfunction calculatePSDFromMDCT(mdctCoeffs, targetSize, normalizationDb) {\n const halfTargetSize = targetSize / 2\n const psd = new Float32Array(halfTargetSize + 1)\n\n // Calculate power values and find maximum\n const powers = new Float32Array(512)\n let maxPower = 0\n\n for (let i = 0; i < 512; i++) {\n const power = mdctCoeffs[i] * mdctCoeffs[i]\n powers[i] = power\n maxPower = Math.max(maxPower, power)\n }\n\n const normFactor = 1 / (maxPower || 1)\n let maxPsdValue = -Infinity\n\n if (targetSize === 512) {\n // Direct averaging for same size\n for (let i = 0; i < 256; i++) {\n const avgPower = (powers[i * 2] + powers[i * 2 + 1]) * 0.5 * normFactor\n psd[i] = avgPower > 0 ? toDb(avgPower) : PSYMODEL_MIN_POWER_DB\n maxPsdValue = Math.max(maxPsdValue, psd[i])\n }\n psd[256] = psd[255]\n // Check if last value is the max\n maxPsdValue = Math.max(maxPsdValue, psd[256])\n } else {\n // Interpolate for different sizes\n const scaleFactor = 512 / targetSize\n\n for (let i = 0; i <= halfTargetSize; i++) {\n const srcIdx = i * scaleFactor\n const srcIdxInt = Math.floor(srcIdx)\n const frac = srcIdx - srcIdxInt\n\n const power =\n srcIdxInt < 511\n ? powers[srcIdxInt] * (1 - frac) + powers[srcIdxInt + 1] * frac\n : powers[511]\n\n const normalizedPower = power * normFactor\n psd[i] =\n normalizedPower > 0 ? toDb(normalizedPower) : PSYMODEL_MIN_POWER_DB\n\n maxPsdValue = Math.max(maxPsdValue, psd[i])\n }\n }\n\n // Apply normalization to target maximum\n const normalizationDelta = normalizationDb - maxPsdValue\n\n for (let i = 0; i < psd.length; i++) {\n if (psd[i] > PSYMODEL_MIN_POWER_DB) {\n psd[i] += normalizationDelta\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 {Object} psychoBuffers - Reusable buffers\n * @param {number} fftScale - FFT scaling factor\n * @returns {Object} Flags array and lists of maskers\n */\nfunction findAllMaskers(psd, psychoBuffers, fftScale) {\n // Initialize flags\n const flags = psychoBuffers.flags\n flags.fill(PSYMODEL_NOT_EXAMINED)\n\n // Find tonal maskers first\n let { tonalList } = findTonalMaskers(psd, flags, fftScale)\n\n // Find non-tonal maskers\n let { 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 const fftSize = (psd.length - 1) * 2\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 < fftSize / 2 - 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 const searchOffsets = getSearchOffsets(k, RANGE_LOW, RANGE_MID, RANGE_HIGH)\n if (!searchOffsets) continue\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\n tonalList.push({ index: k, spl })\n markTonalComponent(flags, k, searchOffsets)\n }\n }\n\n return { flags, tonalList }\n}\n\n/**\n * Get search offsets for tonality check based on frequency\n */\nfunction getSearchOffsets(k, rangeLow, rangeMid, rangeHigh) {\n if (k > 2 && k < rangeLow) return [-2, 2]\n if (k >= rangeLow && k < rangeMid) return [-3, -2, 2, 3]\n if (k >= rangeMid && k < rangeHigh) return [-6, -5, -4, -3, -2, 2, 3, 4, 5, 6]\n return null\n}\n\n/**\n * Check if a peak is tonal based on surrounding bins\n */\nfunction isTonal(psd, k, offsets) {\n const TONAL_THRESHOLD = 7 // dB\n\n for (const offset of offsets) {\n const idx = k + offset\n if (idx >= 0 && idx < psd.length) {\n if (psd[k] - psd[idx] < TONAL_THRESHOLD) return false\n }\n }\n\n return true\n}\n\n/**\n * Mark component and neighbors as tonal/irrelevant\n */\nfunction markTonalComponent(flags, k, searchOffsets) {\n flags[k] = PSYMODEL_TONAL\n\n const allOffsets = [...searchOffsets, -1, 1]\n for (const offset of allOffsets) {\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 // Calculate band energy and centroid\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 { flags, nonTonalList }\n}\n\n/**\n * Analyze a critical band for non-tonal masking\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 const barkDiff =\n PSYMODEL_THRESHOLD_TABLE[PSYMODEL_FREQ_TO_CB_MAP[k]][1] - baseBark\n weightedPower += power * barkDiff\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 global masking threshold\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 * @param {Float32Array} thresholdBuffer - Output buffer for threshold\n * @param {number} fftSize - FFT size\n * @returns {Float32Array} Global masking threshold\n */\nfunction calculateGlobalThreshold(\n psd,\n tonalMaskers,\n nonTonalMaskers,\n thresholdBuffer,\n fftSize\n) {\n const criticalBandThresholds = new Float32Array(\n PSYMODEL_CRITICAL_BANDS.length\n )\n\n // Calculate threshold for each critical band\n calculateCriticalBandThresholds(\n psd,\n tonalMaskers,\n nonTonalMaskers,\n criticalBandThresholds\n )\n\n // Interpolate to full spectrum with compensation\n interpolateThresholdCompensated(\n criticalBandThresholds,\n thresholdBuffer,\n fftSize\n )\n\n return thresholdBuffer\n}\n\n/**\n * Calculate masking threshold for each critical band\n */\nfunction calculateCriticalBandThresholds(\n psd,\n tonalMaskers,\n nonTonalMaskers,\n output\n) {\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 summedEnergy += calculateMaskerContributions(\n psd,\n tonalMaskers,\n maskedBark,\n true // isTonal\n )\n\n summedEnergy += calculateMaskerContributions(\n psd,\n nonTonalMaskers,\n maskedBark,\n false // isTonal\n )\n\n output[i] = toDb(summedEnergy)\n }\n}\n\n/**\n * Calculate energy contributions from a set of maskers\n */\nfunction calculateMaskerContributions(psd, maskers, maskedBark, isTonal) {\n let totalEnergy = 0\n\n for (const masker of maskers) {\n const j = masker.index\n if (j >= PSYMODEL_FREQ_TO_CB_MAP.length) continue\n\n const maskerBark = PSYMODEL_THRESHOLD_TABLE[PSYMODEL_FREQ_TO_CB_MAP[j]][1]\n const barkDistance = maskedBark - maskerBark\n\n // Check if within masking range\n if (barkDistance < -3 || barkDistance >= 8) continue\n\n // Calculate masking level\n const maskedDb = calculateMaskingLevel(\n masker.spl,\n psd[j],\n maskerBark,\n barkDistance,\n isTonal\n )\n\n totalEnergy += fromDb(maskedDb)\n }\n\n return totalEnergy\n}\n\n/**\n * Calculate masking level based on masker properties\n */\nfunction calculateMaskingLevel(\n maskerSpl,\n maskerPsd,\n maskerBark,\n barkDistance,\n isTonal\n) {\n // Masking index\n const tonalOffset = isTonal\n ? -1.525 - 0.275 * maskerBark - 4.5\n : -1.525 - 0.175 * maskerBark - 0.5\n\n // PSD-dependent factors\n const psdFactor1 = 0.4 * maskerPsd + 6\n const psdFactor2 = 0.15 * maskerPsd\n\n // Calculate masking function\n let maskingFunction\n if (barkDistance < -1) {\n maskingFunction = 17 * (barkDistance + 1) - psdFactor1\n } else if (barkDistance < 0) {\n maskingFunction = psdFactor1 * barkDistance\n } else if (barkDistance < 1) {\n maskingFunction = -17 * barkDistance\n } else {\n maskingFunction = -(barkDistance - 1) * (17 - psdFactor2) - 17\n }\n\n return maskerSpl + tonalOffset + maskingFunction\n}\n\n/**\n * Interpolate critical band thresholds to full spectrum\n * @param {Float32Array} cbThresholds - Critical band thresholds\n * @param {Float32Array} output - Output buffer\n * @param {number} fftSize - FFT size\n */\nfunction interpolateThresholdCompensated(cbThresholds, output, fftSize) {\n const COMPENSATION_FACTOR = 0.25\n const halfSize = fftSize / 2\n\n // Get frequency indices for critical bands\n const freqIndices = PSYMODEL_CB_FREQ_INDICES\n\n let bandIndex = 0\n for (let i = 0; i <= halfSize; i++) {\n if (i <= freqIndices[0]) {\n // Before first critical band\n output[i] = cbThresholds[0]\n } else if (i >= freqIndices[freqIndices.length - 1]) {\n // After last critical band\n output[i] = cbThresholds[cbThresholds.length - 1]\n } else {\n // Find current band\n while (\n bandIndex < freqIndices.length - 1 &&\n freqIndices[bandIndex + 1] < i\n ) {\n bandIndex++\n }\n\n // Interpolate with compensation\n const x0 = freqIndices[bandIndex]\n const x1 = freqIndices[bandIndex + 1]\n const y0 = cbThresholds[bandIndex]\n const y1 = cbThresholds[bandIndex + 1]\n const bandWidth = x1 - x0\n\n if (bandWidth > 0) {\n const t = (i - x0) / bandWidth\n const interpolated = y0 + (y1 - y0) * t\n const compensation = Math.abs(y1 - y0) * COMPENSATION_FACTOR\n output[i] = interpolated + compensation\n } else {\n output[i] = y0\n }\n }\n }\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 { pipe, throwError } 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 PSYMODEL_FFT_SIZE,\n MDCT_SIZE_SHORT,\n MDCT_SIZE_MID,\n MDCT_SIZE_LONG,\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 */\nfunction 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 */\nfunction 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 [lowBand, midBand, highBand] = bands\n\n const lowCoeffs = performFFT(lowBand, FFT_SIZE_LOW)\n const midCoeffs = performFFT(midBand, FFT_SIZE_MID)\n const highCoeffs = performFFT(highBand, FFT_SIZE_HIGH)\n\n const lowTransient = detectTransient(\n lowCoeffs,\n bufferPool.transientDetection.prevLowCoeffs,\n options.transientThresholdLow\n )\n const midTransient = detectTransient(\n midCoeffs,\n bufferPool.transientDetection.prevMidCoeffs,\n options.transientThresholdMid\n )\n const highTransient = detectTransient(\n highCoeffs,\n bufferPool.transientDetection.prevHighCoeffs,\n options.transientThresholdHigh\n )\n\n bufferPool.transientDetection.prevLowCoeffs = lowCoeffs\n bufferPool.transientDetection.prevMidCoeffs = midCoeffs\n bufferPool.transientDetection.prevHighCoeffs = highCoeffs\n\n return {\n bands,\n blockModes: [\n lowTransient ? 2 : 0,\n midTransient ? 2 : 0,\n highTransient ? 3 : 0,\n ],\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 */\nfunction mdctStage(context) {\n const bufferPool =\n context?.bufferPool ?? throwError('mdctStage: bufferPool is required')\n const overlapBuffers = bufferPool.mdctOverlap\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\n const coefficients = new Float32Array(512)\n\n for (let band = 0; band < 3; band++) {\n const samples = bands[band]\n const bandSize = band === 2 ? 256 : 128\n const numBlocks = 1 << blockModes[band]\n const blockSize = numBlocks === 1 ? bandSize : 32\n\n const mdctFunc =\n numBlocks === 1 ? (band === 2 ? mdct512 : mdct256) : mdct64\n const mdctSize =\n numBlocks === 1\n ? band === 2\n ? MDCT_SIZE_LONG\n : MDCT_SIZE_MID\n : MDCT_SIZE_SHORT\n const windowStart = numBlocks === 1 ? (band === 2 ? 112 : 48) : 0\n\n const offset = band === 0 ? 0 : band === 1 ? 128 : 256\n\n for (let block = 0; block < numBlocks; block++) {\n const blockStart = block * blockSize\n const mdctInput = bufferPool.transformBuffers[mdctSize]\n mdctInput.fill(0)\n\n mdctInput.set(overlapBuffers[band], windowStart)\n\n for (let i = 0; i < 32; i++) {\n const tailValue = samples[blockStart + blockSize - 32 + i]\n overlapBuffers[band][i] = WINDOW_SHORT[i] * tailValue\n samples[blockStart + blockSize - 32 + i] =\n tailValue * WINDOW_SHORT[31 - i]\n }\n\n mdctInput.set(\n samples.subarray(blockStart, blockStart + blockSize),\n windowStart + 32\n )\n\n let spectrum = mdctFunc.transform(mdctInput, bufferPool.mdctBuffers)\n\n if (band > 0) {\n const reversed = bufferPool.reversalBuffers[spectrum.length]\n reversed.fill(0)\n for (let i = 0; i < spectrum.length; i++) {\n reversed[i] = spectrum[spectrum.length - 1 - i]\n }\n spectrum = reversed\n }\n\n coefficients.set(spectrum, offset + blockStart)\n }\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 */\nfunction 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(\n coefficients,\n PSYMODEL_FFT_SIZE,\n bufferPool.psychoAnalysis,\n options.normalizationDb\n )\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 { pipe, throwError } 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} 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 */\nfunction 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 */\nfunction imdctStage(context) {\n const bufferPool =\n context?.bufferPool ?? throwError('imdctStage: bufferPool is required')\n const overlapBuffers = bufferPool.imdctOverlap\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 const bands = []\n\n const bandCoeffs = [\n coefficients.subarray(0, 128),\n coefficients.subarray(128, 256),\n coefficients.subarray(256, 512),\n ]\n\n for (let band = 0; band < 3; band++) {\n const bandSize = band === 2 ? 256 : 128\n const numBlocks = 1 << blockModes[band]\n const blockSize = numBlocks === 1 ? bandSize : 32\n\n const imdctFunc =\n numBlocks === 1 ? (band === 2 ? imdct512 : imdct256) : imdct64\n\n const invBuf = bufferPool.transformBuffers[MDCT_SIZE_LONG]\n invBuf.fill(0)\n const dstBuf = overlapBuffers[band]\n const prevBuf = dstBuf.slice(bandSize * 2 - 16, bandSize * 2)\n\n let start = 0\n let pos = 0\n\n for (let block = 0; block < numBlocks; block++) {\n let blockSpecs = bandCoeffs[band].slice(pos, pos + blockSize)\n\n // Reverse spectral reversal for mid and high bands\n if (band > 0) {\n const reversed = bufferPool.reversalBuffers[blockSpecs.length]\n for (let i = 0; i < blockSpecs.length; i++) {\n reversed[i] = blockSpecs[blockSpecs.length - 1 - i]\n }\n blockSpecs = reversed\n }\n\n const inv = imdctFunc.transform(blockSpecs, bufferPool.mdctBuffers)\n const invStart = inv.length / 4\n\n for (let i = 0; i < blockSize; i++) {\n invBuf[start + i] = inv[invStart + i]\n }\n\n const dstPart = overlapAdd(\n prevBuf.slice(0, 16),\n invBuf.slice(start, start + 16),\n WINDOW_SHORT\n )\n\n dstBuf.set(dstPart, start)\n\n for (let i = 0; i < 16; i++) {\n prevBuf[i] = invBuf[start + 16 + i]\n }\n\n start += blockSize\n pos += blockSize\n }\n\n if (numBlocks === 1) {\n const copyLen = band === 2 ? 240 : 112\n for (let i = 0; i < copyLen; i++) {\n dstBuf[32 + i] = invBuf[16 + i]\n }\n }\n\n for (let i = 0; i < 16; i++) {\n dstBuf[bandSize * 2 - 16 + i] = invBuf[bandSize - 16 + i]\n }\n\n bands.push(dstBuf.slice(0, bandSize))\n }\n\n return bands\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 */\nfunction 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 - 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 '../core/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 - 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"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","SAMPLE_RATE","SAMPLES_PER_FRAME","AEA_MAGIC","Uint8Array","AEA_HEADER_SIZE","SOUND_UNIT_SIZE","FRAME_BITS","FRAME_OVERHEAD_BITS","NUM_BFUS","BITS_PER_BFU_METADATA","SPECS_PER_BFU","Int32Array","BFU_AMOUNTS","BFU_BAND_BOUNDARIES","BFU_FREQUENCIES","table","i","Float32Array","BFU_START_LONG","BFU_START_SHORT","MDCT_SIZE_SHORT","MDCT_SIZE_MID","MDCT_SIZE_LONG","WINDOW_SHORT","Math","sin","PI","QMF_DELAY","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","freqKhz","athDb","exp","max","min","matrix","masker","masked","distance","spreading","PSYMODEL_FFT_SIZE","FFT_SIZE_LOW","FFT_SIZE_MID","FFT_SIZE_HIGH","QUANTIZATION_SIGN_BIT_SHIFT","WAV_PCM_MAX_POSITIVE","WAV_PCM_MAX_NEGATIVE","FRAME_HEADER_BITS","FRAME_WORD_LENGTH_BITS","FRAME_SCALE_FACTOR_BITS","PSYMODEL_NOT_EXAMINED","PSYMODEL_TONAL","PSYMODEL_NON_TONAL","PSYMODEL_IRRELEVANT","PSYMODEL_LOG10_FACTOR","LN10","PSYMODEL_POW10_FACTOR","PSYMODEL_CRITICAL_BANDS","normalizationFactor","sqrt","normalized","cos","round","PSYMODEL_THRESHOLD_TABLE","PSYMODEL_CB_FREQ_INDICES","map","cbIdx","PSYMODEL_FREQ_TO_CB_MAP","e","t","r","n","iterator","c","Generator","u","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","length","l","TypeError","done","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","configurable","writable","_invoke","_awaitAsyncGenerator","_OverloadYield","_wrapAsyncGenerator","AsyncGenerator","apply","arguments","resume","Promise","resolve","then","k","settle","reject","next","arg","_asyncIterator","asyncIterator","AsyncFromSyncIterator","AsyncFromSyncIteratorContinuation","s","throwError","msg","Error","pipe","context","_len","stages","Array","_key","functions","stage","input","reduce","fn","withFlushSamples","_x","_withFlushSamples","iter","samplesToFlush","undefined","_callee","lastFrameLength","_iteratorAbruptCompletion","_didIteratorError","_iteratorError","_iterator","_step","frame","paddedFrame","_t","_context","set","withDelayCompensation","_x2","_withDelayCompensation","pcmFrameStream","samplesToDrop","_callee2","buffer","droppedInitialSamples","_iteratorAbruptCompletion2","_didIteratorError2","_iteratorError2","_iterator2","_step2","combined","offset","_t2","_context2","slice","withStereo","monoTransform","_len2","args","_key2","_ref","_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","_slicedToArray","push","_callee3","_i","_leftFrames","_context3","_callee4","_i2","_rightFrames","_context4","concat","_x3","withStereoFlushSamples","withStereoDelayCompensation","QMF_COEFFS","QMF_WINDOW","QMF_EVEN","QMF_ODD","qmfAnalysis","delayLine","_qmfWorkBuffers$delay","_qmfWorkBuffers$delay2","qmfWorkBuffers","inputLength","outputLength","workBuffer","delay","lowBand","highBand","evenSum","oddSum","j","newDelay","qmfSynthesis","_qmfWorkBuffers$delay3","_qmfWorkBuffers$delay4","subbandLength","low","high","output","sample0","sample1","idx","FFT","_classCallCheck","real","imag","size","bits","log2","reversed","temp","b","_ref2","stride","halfStride","angle","wReal","wImag","start","twiddleReal","twiddleImag","evenIndex","oddIndex","evenReal","evenImag","oddReal","oddImag","tReal","tImag","nextReal","MDCTBase","_createClass","scale","halfSize","quarterSize","fftSize","alpha","omega","scaleRoot","sinCosTable","MDCT","_MDCTBase","_callSuper","_inherits","_buffers$real","_buffers$imag","mdctBuffers","buffers","n4","n34","fill","i2","i3","i4","im","fft","re","IMDCT","_MDCTBase2","_buffers$real2","_buffers$imag2","r1","i1","mdct64","mdct256","mdct512","imdct64","imdct256","imdct512","overlapAdd","prev","curr","window","w1","w2","findScaleFactor","coefficients","maxAmplitude","abs","mid","quantize","scaleFactorIndex","bitsPerSample","scaleFactor","normFactor","quantized","dequantize","denormFactor","dequantized","allocateBits","psychoResults","bfuData","bfuSizes","maxBfuCount","signalEnergyDb","bfuCount","energyPerBfu","data","energy","calculateBfuEnergy","maskThresholdDb","globalThreshold","maskThresholdPerBfu","freqPerBin","bfuFreq","fftBinIndex","mapThresholdToBfus","maskingThreshold","smrValues","bfu","Infinity","calculateSMR","actualBfuCount","hasAudibleContent","some","smr","contributions","index","sort","cumulativeSMR","sum","_createForOfIteratorHelper","candidateCount","requiredBfus","_toConsumableArray","capturedIndex","currentValue","totalValue","remainingIndices","err","selectBfuCountForAudibleContent","highestSignalBfu","selectBfuCountForInaudibleContent","selectOptimalBfuCount","allocation","availableBits","priorityQueue","heap","priority","floor","heapifyDown","isEmpty","peek","pop","last","popMax","updateTop","createPriorityQueue","bestBfu","currentWl","upgradeCost","calculateUpgradeCost","performBitAllocation","bfuIndex","currentBits","startIdx","element","leftChild","rightChild","largest","largestPriority","BufferPool","transformBuffers","highBandDelay","QMF_HIGH_BAND_DELAY","qmfDelays","midBand","transientDetection","prevLowCoeffs","prevMidCoeffs","prevHighCoeffs","mdctOverlap","imdctOverlap","reversalBuffers","psychoAnalysis","flags","threshold","EncoderOptions","options","values","transientThresholdLow","transientThresholdMid","transientThresholdHigh","normalizationDb","metadata","default","name","description","range","step","setOptions","_Object$entries","entries","_Object$entries$_i","setValue","_meta$range","_objectSpread","_Object$entries2","_Object$entries2$_i","meta","performFFT","samples","copyLen","subarray","magnitude","detectTransient","currentCoeffs","prevCoeffs","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","log","geometricMean","arithmeticMean","midPoint","lowEnergy","highEnergy","totalEnergy","toDb","fromDb","db","mdctCoeffs","targetSize","psychoBuffers","fftScale","correctedCoeffs","corrected","applyMdctCorrection","psd","halfTargetSize","powers","maxPower","power","maxPsdValue","avgPower","srcIdx","srcIdxInt","frac","normalizedPower","normalizationDelta","calculatePSDFromMDCT","_findAllMaskers","_findTonalMaskers","tonalList","maxTonalBin","RANGE_LOW","RANGE_MID","RANGE_HIGH","searchOffsets","getSearchOffsets","isTonal","spl","markTonalComponent","findTonalMaskers","_findNonTonalMaskers","nonTonalList","cbStart","bandAnalysis","analyzeCriticalBand","powerDb","centroidOffset","findNonTonalMaskers","decimated","isAudible","markInaudible","audibleTonal","tonal","audibleNonTonal","nonTonal","decimateMaskers","tonalMaskers","nonTonalMaskers","findAllMaskers","thresholdBuffer","criticalBandThresholds","bandData","maskedBark","summedEnergy","calculateMaskerContributions","calculateCriticalBandThresholds","cbThresholds","COMPENSATION_FACTOR","freqIndices","bandIndex","x0","x1","y0","y1","bandWidth","interpolated","compensation","interpolateThresholdCompensated","calculateGlobalThreshold","rangeLow","rangeMid","rangeHigh","offsets","startBin","endBin","totalPower","weightedPower","baseBark","maskers","_step5","_iterator5","maskerBark","barkDistance","calculateMaskingLevel","maskerSpl","maskerPsd","psdFactor1","qmfAnalysisStage","_context$bufferPool","bufferPool","delays","pcmSamples","stage1","stage2","delayedHigh","bands","blockSelectorStage","_context$bufferPool2","_context$options","_bands","lowCoeffs","midCoeffs","highCoeffs","lowTransient","midTransient","highTransient","blockModes","mdctStage","_context$bufferPool3","overlapBuffers","originalFrame","band","bandSize","numBlocks","blockSize","mdctFunc","mdctSize","windowStart","block","blockStart","mdctInput","tailValue","spectrum","transform","quantizationStage","_context$bufferPool4","_context$options2","_groupIntoBFUs","bfuBuffers","coeffIndex","bandStart","bandEnd","startPositions","startPos","actualSize","groupIntoBFUs","_allocateBits","selectedBfuCount","scaleFactorIndices","quantizedCoefficients","wordLength","nBfu","wordLengthIndices","blockSizeMode","encode","dequantizationStage","frameData","position","imdctStage","_input","bandCoeffs","imdctFunc","invBuf","dstBuf","prevBuf","pos","blockSpecs","inv","invStart","dstPart","qmfSynthesisStage","decode","packBits","bitPosition","bitCount","byteIndex","bitOffset","bitsWritten","bitsAvailable","bitsToWrite","valueBits","mask","unpackBits","bitsRead","bitsToRead","unpackSignedBits","serializeFrame","view","DataView","indexOf","header","setUint16","coefficient","deserializeFrame","byteOffset","byteLength","getUint16","bfuSize","AeaFile","title","frameCount","channelCount","titleBytes","TextEncoder","AEA_TITLE_SIZE","setUint32","titleEnd","titleLength","TextDecoder","getUint32","_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","_iterator6","_step6","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"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"carta1.min.js","mappings":"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","sources":["webpack://Carta1/webpack/universalModuleDefinition","webpack://Carta1/webpack/bootstrap","webpack://Carta1/webpack/runtime/define property getters","webpack://Carta1/webpack/runtime/hasOwnProperty shorthand","webpack://Carta1/webpack/runtime/make namespace object","webpack://Carta1/./codec/core/constants.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/core/options.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/bitstream.js","webpack://Carta1/./codec/io/serialization.js","webpack://Carta1/./codec/io/processor.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Carta1\"] = factory();\n\telse\n\t\troot[\"Carta1\"] = factory();\n})(this, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\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 = 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// 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// FFT sizes for transient detection\nexport const FFT_SIZE_LOW = 256\nexport const FFT_SIZE_MID = 256\nexport const FFT_SIZE_HIGH = 512\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 - 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// 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 *\n * This module implements a radix-2 Cooley-Tukey FFT algorithm for frequency domain\n * analysis used in psychoacoustic modeling and transient detection.\n */\n\nexport class FFT {\n /**\n * Perform in-place FFT on complex data\n * @param {Float32Array} real - Real part of input/output data\n * @param {Float32Array} imag - Imaginary part of input/output data\n */\n static fft(real, imag) {\n const size = real.length\n if (size === 1) return\n\n const bits = Math.log2(size)\n\n // Bit reversal\n for (let i = 0; i < size; i++) {\n let reversed = 0\n let temp = i\n for (let b = 0; b < bits; b++) {\n reversed = (reversed << 1) | (temp & 1)\n temp >>= 1\n }\n if (reversed > i) {\n ;[real[i], real[reversed]] = [real[reversed], real[i]]\n ;[imag[i], imag[reversed]] = [imag[reversed], imag[i]]\n }\n }\n\n // Cooley-Tukey decimation-in-time\n for (let stride = 2; stride <= size; stride <<= 1) {\n const halfStride = stride >> 1\n const angle = (-2 * Math.PI) / stride\n const wReal = Math.cos(angle)\n const wImag = Math.sin(angle)\n\n for (let start = 0; start < size; start += stride) {\n let twiddleReal = 1\n let twiddleImag = 0\n\n for (let k = 0; k < halfStride; k++) {\n const evenIndex = start + k\n const oddIndex = evenIndex + halfStride\n\n const evenReal = real[evenIndex]\n const evenImag = imag[evenIndex]\n const oddReal = real[oddIndex]\n const oddImag = imag[oddIndex]\n\n const tReal = oddReal * twiddleReal - oddImag * twiddleImag\n const tImag = oddReal * twiddleImag + oddImag * twiddleReal\n\n real[evenIndex] = evenReal + tReal\n imag[evenIndex] = evenImag + tImag\n real[oddIndex] = evenReal - tReal\n imag[oddIndex] = evenImag - tImag\n\n const nextReal = twiddleReal * wReal - twiddleImag * wImag\n twiddleImag = twiddleReal * wImag + twiddleImag * wReal\n twiddleReal = nextReal\n }\n }\n }\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 PSYMODEL_MIN_POWER_DB,\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 // Map psychoacoustic masking threshold to BFUs\n const maskingThreshold =\n psychoResults.maskingThreshold || psychoResults.globalThreshold\n const maskThresholdDb = mapThresholdToBfus(maskingThreshold)\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 (10 * log10(energy/size))\n energyPerBfu[i] =\n energy > 0 ? 10 * Math.log10(energy / size) : PSYMODEL_MIN_POWER_DB\n }\n\n return energyPerBfu\n}\n\n/**\n * Map frequency-domain masking threshold to BFU indices\n * @param {Float32Array} globalThreshold - Frequency-domain masking threshold\n * @returns {Float32Array} Masking threshold per BFU\n */\nfunction mapThresholdToBfus(globalThreshold) {\n const maskThresholdPerBfu = new Float32Array(NUM_BFUS)\n maskThresholdPerBfu.fill(PSYMODEL_MIN_POWER_DB)\n\n // Calculate frequency resolution\n const fftSize = (globalThreshold.length - 1) * 2\n const freqPerBin = SAMPLE_RATE / fftSize\n\n // Map each BFU's center frequency to nearest FFT bin\n for (let i = 0; i < NUM_BFUS; i++) {\n const bfuFreq = BFU_FREQUENCIES[i]\n const fftBinIndex = Math.round(bfuFreq / freqPerBin)\n\n if (fftBinIndex >= 0 && fftBinIndex < globalThreshold.length) {\n maskThresholdPerBfu[i] = globalThreshold[fftBinIndex]\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 // BFUs with no signal have undefined SMR\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 return selectBfuCountForAudibleContent(smrValues, maxBfuCount)\n } else {\n return selectBfuCountForInaudibleContent(\n smrValues,\n signalEnergyDb,\n maxBfuCount\n )\n }\n}\n\n/**\n * Select BFU count when content is above masking threshold\n * Uses diminishing returns approach - find where adding more BFUs\n * provides minimal benefit\n */\nfunction selectBfuCountForAudibleContent(smrValues, maxBfuCount) {\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 currentValue = cumulativeSMR[capturedIndex]\n const totalValue = cumulativeSMR[cumulativeSMR.length - 1]\n const remainingIndices = contributions.length - capturedIndex - 1\n\n if (remainingIndices > 0) {\n const averageRemaining = (totalValue - currentValue) / remainingIndices\n const averageCaptured = currentValue / (capturedIndex + 1)\n\n // If remaining BFUs contribute much less on average, we've found our cutoff\n if (averageRemaining < averageCaptured * 0.1) {\n return candidateCount\n }\n }\n }\n }\n\n return BFU_AMOUNTS[BFU_AMOUNTS.length - 1]\n}\n\n/**\n * Select BFU count when all content is below masking threshold\n * Simply finds the smallest count that includes all BFUs with signal\n */\nfunction selectBfuCountForInaudibleContent(\n smrValues,\n signalEnergyDb,\n maxBfuCount\n) {\n // Find the highest BFU index that contains actual signal\n let highestSignalBfu = -1\n\n for (let i = maxBfuCount - 1; i >= 0; i--) {\n if (signalEnergyDb[i] > PSYMODEL_MIN_POWER_DB && smrValues[i] > -Infinity) {\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 return BFU_AMOUNTS[BFU_AMOUNTS.length - 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).fill(0)\n\n // Initialize priority queue with BFUs that have signal\n const priorityQueue = createPriorityQueue(smrValues, actualBfuCount)\n\n // Greedy allocation: always upgrade BFU with highest priority\n while (!priorityQueue.isEmpty()) {\n const bestBfu = priorityQueue.peek()\n const currentWl = allocation[bestBfu.bfu]\n\n // Check if BFU is already at maximum word length\n if (currentWl >= MAX_WORD_LENGTH_INDEX) {\n priorityQueue.pop()\n continue\n }\n\n // Calculate cost to upgrade this BFU\n const upgradeCost = calculateUpgradeCost(bestBfu.bfu, currentWl, bfuSizes)\n\n if (upgradeCost <= availableBits) {\n // Perform upgrade\n availableBits -= upgradeCost\n allocation[bestBfu.bfu]++\n\n // Update priority based on distortion reduction\n bestBfu.priority += DISTORTION_DELTA_DB[currentWl]\n priorityQueue.updateTop()\n } else {\n // Not enough bits for this BFU\n priorityQueue.pop()\n }\n }\n\n return allocation\n}\n\n/**\n * Calculate bit cost to upgrade a BFU's word length\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 * Create a priority queue for BFU allocation\n * @param {Float32Array} smrValues - Initial priorities (SMR values)\n * @param {number} bfuCount - Number of BFUs\n * @returns {Object} Priority queue interface\n */\nfunction createPriorityQueue(smrValues, bfuCount) {\n const heap = []\n\n // Initialize with BFUs that have signal\n for (let i = 0; i < bfuCount; 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 return {\n isEmpty: () => heap.length === 0,\n peek: () => heap[0],\n pop: () => popMax(heap),\n updateTop: () => heapifyDown(heap, 0),\n }\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 let idx = startIdx\n const element = heap[idx]\n const length = heap.length\n\n while (true) {\n const leftChild = 2 * idx + 1\n const rightChild = 2 * idx + 2\n let largest = idx\n let largestPriority = element.priority\n\n // Find largest among parent and children\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 parent is largest, we're done\n if (largest === idx) break\n\n // Swap and continue\n heap[idx] = heap[largest]\n idx = largest\n }\n\n heap[idx] = element\n}\n\n/**\n * Remove and return the maximum element from heap\n * @param {Array} heap - Heap array\n * @returns {Object} Maximum element\n */\nfunction popMax(heap) {\n const max = heap[0]\n const last = heap.pop()\n\n if (heap.length > 0) {\n heap[0] = last\n heapifyDown(heap, 0)\n }\n\n return max\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 PSYMODEL_FFT_SIZE,\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 prevLowCoeffs: new Float32Array(128),\n prevMidCoeffs: new Float32Array(128),\n prevHighCoeffs: new Float32Array(256),\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 // Psychoacoustic model buffers\n this.psychoAnalysis = {\n flags: new Uint8Array(PSYMODEL_FFT_SIZE / 2),\n threshold: new Float32Array(PSYMODEL_FFT_SIZE / 2 + 1),\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 - 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 - 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_NON_TONAL,\n PSYMODEL_IRRELEVANT,\n PSYMODEL_LOG10_FACTOR,\n PSYMODEL_POW10_FACTOR,\n PSYMODEL_CRITICAL_BANDS,\n PSYMODEL_CB_FREQ_INDICES,\n PSYMODEL_THRESHOLD_TABLE,\n PSYMODEL_FREQ_TO_CB_MAP,\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} targetSize - Target FFT size for analysis\n * @param {Object} psychoBuffers - Reusable buffers for performance\n * @returns {Object} Analysis results including PSD, maskers, and thresholds\n */\nexport function psychoAnalysis(\n mdctCoeffs,\n targetSize,\n psychoBuffers,\n normalizationDb\n) {\n const fftScale = targetSize / 512\n\n // Apply frequency band reversal correction\n const correctedCoeffs = applyMdctCorrection(mdctCoeffs)\n\n // Calculate power spectral density\n const psd = calculatePSDFromMDCT(correctedCoeffs, targetSize, normalizationDb)\n\n // Find tonal and non-tonal maskers\n const { flags, tonalMaskers, nonTonalMaskers } = findAllMaskers(\n psd,\n psychoBuffers,\n fftScale\n )\n\n // Calculate global masking threshold\n const globalThreshold = calculateGlobalThreshold(\n psd,\n tonalMaskers,\n nonTonalMaskers,\n psychoBuffers.threshold,\n targetSize\n )\n\n return {\n psd,\n tonalMaskers,\n nonTonalMaskers,\n globalThreshold,\n flags,\n }\n}\n\n/**\n * Apply frequency band reversal correction to MDCT coefficients\n * @param {Float32Array} mdctCoeffs - Original MDCT coefficients\n * @returns {Float32Array} Corrected coefficients\n */\nfunction applyMdctCorrection(mdctCoeffs) {\n const corrected = new Float32Array(512)\n\n // Low band: direct copy\n corrected.set(mdctCoeffs.subarray(0, 128), 0)\n\n // Mid band: reversed\n for (let i = 0; i < 128; i++) {\n corrected[128 + i] = mdctCoeffs[255 - i]\n }\n\n // High band: reversed\n for (let i = 0; i < 256; i++) {\n corrected[256 + i] = mdctCoeffs[511 - i]\n }\n\n return corrected\n}\n\n/**\n * Calculate Power Spectral Density from MDCT coefficients\n * @param {Float32Array} mdctCoeffs - MDCT coefficients\n * @param {number} targetSize - Target FFT size\n * @returns {Float32Array} Power spectral density in dB\n */\nfunction calculatePSDFromMDCT(mdctCoeffs, targetSize, normalizationDb) {\n const halfTargetSize = targetSize / 2\n const psd = new Float32Array(halfTargetSize + 1)\n\n // Calculate power values and find maximum\n const powers = new Float32Array(512)\n let maxPower = 0\n\n for (let i = 0; i < 512; i++) {\n const power = mdctCoeffs[i] * mdctCoeffs[i]\n powers[i] = power\n maxPower = Math.max(maxPower, power)\n }\n\n const normFactor = 1 / (maxPower || 1)\n let maxPsdValue = -Infinity\n\n if (targetSize === 512) {\n // Direct averaging for same size\n for (let i = 0; i < 256; i++) {\n const avgPower = (powers[i * 2] + powers[i * 2 + 1]) * 0.5 * normFactor\n psd[i] = avgPower > 0 ? toDb(avgPower) : PSYMODEL_MIN_POWER_DB\n maxPsdValue = Math.max(maxPsdValue, psd[i])\n }\n psd[256] = psd[255]\n // Check if last value is the max\n maxPsdValue = Math.max(maxPsdValue, psd[256])\n } else {\n // Interpolate for different sizes\n const scaleFactor = 512 / targetSize\n\n for (let i = 0; i <= halfTargetSize; i++) {\n const srcIdx = i * scaleFactor\n const srcIdxInt = Math.floor(srcIdx)\n const frac = srcIdx - srcIdxInt\n\n const power =\n srcIdxInt < 511\n ? powers[srcIdxInt] * (1 - frac) + powers[srcIdxInt + 1] * frac\n : powers[511]\n\n const normalizedPower = power * normFactor\n psd[i] =\n normalizedPower > 0 ? toDb(normalizedPower) : PSYMODEL_MIN_POWER_DB\n\n maxPsdValue = Math.max(maxPsdValue, psd[i])\n }\n }\n\n // Apply normalization to target maximum\n const normalizationDelta = normalizationDb - maxPsdValue\n\n for (let i = 0; i < psd.length; i++) {\n if (psd[i] > PSYMODEL_MIN_POWER_DB) {\n psd[i] += normalizationDelta\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 {Object} psychoBuffers - Reusable buffers\n * @param {number} fftScale - FFT scaling factor\n * @returns {Object} Flags array and lists of maskers\n */\nfunction findAllMaskers(psd, psychoBuffers, fftScale) {\n // Initialize flags\n const flags = psychoBuffers.flags\n flags.fill(PSYMODEL_NOT_EXAMINED)\n\n // Find tonal maskers first\n let { tonalList } = findTonalMaskers(psd, flags, fftScale)\n\n // Find non-tonal maskers\n let { 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 const fftSize = (psd.length - 1) * 2\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 < fftSize / 2 - 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 const searchOffsets = getSearchOffsets(k, RANGE_LOW, RANGE_MID, RANGE_HIGH)\n if (!searchOffsets) continue\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\n tonalList.push({ index: k, spl })\n markTonalComponent(flags, k, searchOffsets)\n }\n }\n\n return { flags, tonalList }\n}\n\n/**\n * Get search offsets for tonality check based on frequency\n */\nfunction getSearchOffsets(k, rangeLow, rangeMid, rangeHigh) {\n if (k > 2 && k < rangeLow) return [-2, 2]\n if (k >= rangeLow && k < rangeMid) return [-3, -2, 2, 3]\n if (k >= rangeMid && k < rangeHigh) return [-6, -5, -4, -3, -2, 2, 3, 4, 5, 6]\n return null\n}\n\n/**\n * Check if a peak is tonal based on surrounding bins\n */\nfunction isTonal(psd, k, offsets) {\n const TONAL_THRESHOLD = 7 // dB\n\n for (const offset of offsets) {\n const idx = k + offset\n if (idx >= 0 && idx < psd.length) {\n if (psd[k] - psd[idx] < TONAL_THRESHOLD) return false\n }\n }\n\n return true\n}\n\n/**\n * Mark component and neighbors as tonal/irrelevant\n */\nfunction markTonalComponent(flags, k, searchOffsets) {\n flags[k] = PSYMODEL_TONAL\n\n const allOffsets = [...searchOffsets, -1, 1]\n for (const offset of allOffsets) {\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 // Calculate band energy and centroid\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 { flags, nonTonalList }\n}\n\n/**\n * Analyze a critical band for non-tonal masking\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 const barkDiff =\n PSYMODEL_THRESHOLD_TABLE[PSYMODEL_FREQ_TO_CB_MAP[k]][1] - baseBark\n weightedPower += power * barkDiff\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 global masking threshold\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 * @param {Float32Array} thresholdBuffer - Output buffer for threshold\n * @param {number} fftSize - FFT size\n * @returns {Float32Array} Global masking threshold\n */\nfunction calculateGlobalThreshold(\n psd,\n tonalMaskers,\n nonTonalMaskers,\n thresholdBuffer,\n fftSize\n) {\n const criticalBandThresholds = new Float32Array(\n PSYMODEL_CRITICAL_BANDS.length\n )\n\n // Calculate threshold for each critical band\n calculateCriticalBandThresholds(\n psd,\n tonalMaskers,\n nonTonalMaskers,\n criticalBandThresholds\n )\n\n // Interpolate to full spectrum with compensation\n interpolateThresholdCompensated(\n criticalBandThresholds,\n thresholdBuffer,\n fftSize\n )\n\n return thresholdBuffer\n}\n\n/**\n * Calculate masking threshold for each critical band\n */\nfunction calculateCriticalBandThresholds(\n psd,\n tonalMaskers,\n nonTonalMaskers,\n output\n) {\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 summedEnergy += calculateMaskerContributions(\n psd,\n tonalMaskers,\n maskedBark,\n true // isTonal\n )\n\n summedEnergy += calculateMaskerContributions(\n psd,\n nonTonalMaskers,\n maskedBark,\n false // isTonal\n )\n\n output[i] = toDb(summedEnergy)\n }\n}\n\n/**\n * Calculate energy contributions from a set of maskers\n */\nfunction calculateMaskerContributions(psd, maskers, maskedBark, isTonal) {\n let totalEnergy = 0\n\n for (const masker of maskers) {\n const j = masker.index\n if (j >= PSYMODEL_FREQ_TO_CB_MAP.length) continue\n\n const maskerBark = PSYMODEL_THRESHOLD_TABLE[PSYMODEL_FREQ_TO_CB_MAP[j]][1]\n const barkDistance = maskedBark - maskerBark\n\n // Check if within masking range\n if (barkDistance < -3 || barkDistance >= 8) continue\n\n // Calculate masking level\n const maskedDb = calculateMaskingLevel(\n masker.spl,\n psd[j],\n maskerBark,\n barkDistance,\n isTonal\n )\n\n totalEnergy += fromDb(maskedDb)\n }\n\n return totalEnergy\n}\n\n/**\n * Calculate masking level based on masker properties\n */\nfunction calculateMaskingLevel(\n maskerSpl,\n maskerPsd,\n maskerBark,\n barkDistance,\n isTonal\n) {\n // Masking index\n const tonalOffset = isTonal\n ? -1.525 - 0.275 * maskerBark - 4.5\n : -1.525 - 0.175 * maskerBark - 0.5\n\n // PSD-dependent factors\n const psdFactor1 = 0.4 * maskerPsd + 6\n const psdFactor2 = 0.15 * maskerPsd\n\n // Calculate masking function\n let maskingFunction\n if (barkDistance < -1) {\n maskingFunction = 17 * (barkDistance + 1) - psdFactor1\n } else if (barkDistance < 0) {\n maskingFunction = psdFactor1 * barkDistance\n } else if (barkDistance < 1) {\n maskingFunction = -17 * barkDistance\n } else {\n maskingFunction = -(barkDistance - 1) * (17 - psdFactor2) - 17\n }\n\n return maskerSpl + tonalOffset + maskingFunction\n}\n\n/**\n * Interpolate critical band thresholds to full spectrum\n * @param {Float32Array} cbThresholds - Critical band thresholds\n * @param {Float32Array} output - Output buffer\n * @param {number} fftSize - FFT size\n */\nfunction interpolateThresholdCompensated(cbThresholds, output, fftSize) {\n const COMPENSATION_FACTOR = 0.25\n const halfSize = fftSize / 2\n\n // Get frequency indices for critical bands\n const freqIndices = PSYMODEL_CB_FREQ_INDICES\n\n let bandIndex = 0\n for (let i = 0; i <= halfSize; i++) {\n if (i <= freqIndices[0]) {\n // Before first critical band\n output[i] = cbThresholds[0]\n } else if (i >= freqIndices[freqIndices.length - 1]) {\n // After last critical band\n output[i] = cbThresholds[cbThresholds.length - 1]\n } else {\n // Find current band\n while (\n bandIndex < freqIndices.length - 1 &&\n freqIndices[bandIndex + 1] < i\n ) {\n bandIndex++\n }\n\n // Interpolate with compensation\n const x0 = freqIndices[bandIndex]\n const x1 = freqIndices[bandIndex + 1]\n const y0 = cbThresholds[bandIndex]\n const y1 = cbThresholds[bandIndex + 1]\n const bandWidth = x1 - x0\n\n if (bandWidth > 0) {\n const t = (i - x0) / bandWidth\n const interpolated = y0 + (y1 - y0) * t\n const compensation = Math.abs(y1 - y0) * COMPENSATION_FACTOR\n output[i] = interpolated + compensation\n } else {\n output[i] = y0\n }\n }\n }\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 { pipe, throwError } 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 PSYMODEL_FFT_SIZE,\n MDCT_SIZE_SHORT,\n MDCT_SIZE_MID,\n MDCT_SIZE_LONG,\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 */\nfunction 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 */\nfunction 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 [lowBand, midBand, highBand] = bands\n\n const lowCoeffs = performFFT(lowBand, FFT_SIZE_LOW)\n const midCoeffs = performFFT(midBand, FFT_SIZE_MID)\n const highCoeffs = performFFT(highBand, FFT_SIZE_HIGH)\n\n const lowTransient = detectTransient(\n lowCoeffs,\n bufferPool.transientDetection.prevLowCoeffs,\n options.transientThresholdLow\n )\n const midTransient = detectTransient(\n midCoeffs,\n bufferPool.transientDetection.prevMidCoeffs,\n options.transientThresholdMid\n )\n const highTransient = detectTransient(\n highCoeffs,\n bufferPool.transientDetection.prevHighCoeffs,\n options.transientThresholdHigh\n )\n\n bufferPool.transientDetection.prevLowCoeffs = lowCoeffs\n bufferPool.transientDetection.prevMidCoeffs = midCoeffs\n bufferPool.transientDetection.prevHighCoeffs = highCoeffs\n\n return {\n bands,\n blockModes: [\n lowTransient ? 2 : 0,\n midTransient ? 2 : 0,\n highTransient ? 3 : 0,\n ],\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 */\nfunction mdctStage(context) {\n const bufferPool =\n context?.bufferPool ?? throwError('mdctStage: bufferPool is required')\n const overlapBuffers = bufferPool.mdctOverlap\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\n const coefficients = new Float32Array(512)\n\n for (let band = 0; band < 3; band++) {\n const samples = bands[band]\n const bandSize = band === 2 ? 256 : 128\n const numBlocks = 1 << blockModes[band]\n const blockSize = numBlocks === 1 ? bandSize : 32\n\n const mdctFunc =\n numBlocks === 1 ? (band === 2 ? mdct512 : mdct256) : mdct64\n const mdctSize =\n numBlocks === 1\n ? band === 2\n ? MDCT_SIZE_LONG\n : MDCT_SIZE_MID\n : MDCT_SIZE_SHORT\n const windowStart = numBlocks === 1 ? (band === 2 ? 112 : 48) : 0\n\n const offset = band === 0 ? 0 : band === 1 ? 128 : 256\n\n for (let block = 0; block < numBlocks; block++) {\n const blockStart = block * blockSize\n const mdctInput = bufferPool.transformBuffers[mdctSize]\n mdctInput.fill(0)\n\n mdctInput.set(overlapBuffers[band], windowStart)\n\n for (let i = 0; i < 32; i++) {\n const tailValue = samples[blockStart + blockSize - 32 + i]\n overlapBuffers[band][i] = WINDOW_SHORT[i] * tailValue\n samples[blockStart + blockSize - 32 + i] =\n tailValue * WINDOW_SHORT[31 - i]\n }\n\n mdctInput.set(\n samples.subarray(blockStart, blockStart + blockSize),\n windowStart + 32\n )\n\n let spectrum = mdctFunc.transform(mdctInput, bufferPool.mdctBuffers)\n\n if (band > 0) {\n const reversed = bufferPool.reversalBuffers[spectrum.length]\n reversed.fill(0)\n for (let i = 0; i < spectrum.length; i++) {\n reversed[i] = spectrum[spectrum.length - 1 - i]\n }\n spectrum = reversed\n }\n\n coefficients.set(spectrum, offset + blockStart)\n }\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 */\nfunction 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(\n coefficients,\n PSYMODEL_FFT_SIZE,\n bufferPool.psychoAnalysis,\n options.normalizationDb\n )\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 { pipe, throwError } 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} 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 */\nfunction 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 */\nfunction imdctStage(context) {\n const bufferPool =\n context?.bufferPool ?? throwError('imdctStage: bufferPool is required')\n const overlapBuffers = bufferPool.imdctOverlap\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 const bands = []\n\n const bandCoeffs = [\n coefficients.subarray(0, 128),\n coefficients.subarray(128, 256),\n coefficients.subarray(256, 512),\n ]\n\n for (let band = 0; band < 3; band++) {\n const bandSize = band === 2 ? 256 : 128\n const numBlocks = 1 << blockModes[band]\n const blockSize = numBlocks === 1 ? bandSize : 32\n\n const imdctFunc =\n numBlocks === 1 ? (band === 2 ? imdct512 : imdct256) : imdct64\n\n const invBuf = bufferPool.transformBuffers[MDCT_SIZE_LONG]\n invBuf.fill(0)\n const dstBuf = overlapBuffers[band]\n const prevBuf = dstBuf.slice(bandSize * 2 - 16, bandSize * 2)\n\n let start = 0\n let pos = 0\n\n for (let block = 0; block < numBlocks; block++) {\n let blockSpecs = bandCoeffs[band].slice(pos, pos + blockSize)\n\n // Reverse spectral reversal for mid and high bands\n if (band > 0) {\n const reversed = bufferPool.reversalBuffers[blockSpecs.length]\n for (let i = 0; i < blockSpecs.length; i++) {\n reversed[i] = blockSpecs[blockSpecs.length - 1 - i]\n }\n blockSpecs = reversed\n }\n\n const inv = imdctFunc.transform(blockSpecs, bufferPool.mdctBuffers)\n const invStart = inv.length / 4\n\n for (let i = 0; i < blockSize; i++) {\n invBuf[start + i] = inv[invStart + i]\n }\n\n const dstPart = overlapAdd(\n prevBuf.slice(0, 16),\n invBuf.slice(start, start + 16),\n WINDOW_SHORT\n )\n\n dstBuf.set(dstPart, start)\n\n for (let i = 0; i < 16; i++) {\n prevBuf[i] = invBuf[start + 16 + i]\n }\n\n start += blockSize\n pos += blockSize\n }\n\n if (numBlocks === 1) {\n const copyLen = band === 2 ? 240 : 112\n for (let i = 0; i < copyLen; i++) {\n dstBuf[32 + i] = invBuf[16 + i]\n }\n }\n\n for (let i = 0; i < 16; i++) {\n dstBuf[bandSize * 2 - 16 + i] = invBuf[bandSize - 16 + i]\n }\n\n bands.push(dstBuf.slice(0, bandSize))\n }\n\n return bands\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 */\nfunction 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 - 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 - 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"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","SAMPLE_RATE","SAMPLES_PER_FRAME","AEA_MAGIC","Uint8Array","AEA_HEADER_SIZE","SOUND_UNIT_SIZE","FRAME_BITS","FRAME_OVERHEAD_BITS","NUM_BFUS","BITS_PER_BFU_METADATA","SPECS_PER_BFU","Int32Array","BFU_AMOUNTS","BFU_BAND_BOUNDARIES","BFU_FREQUENCIES","Float32Array","BFU_START_LONG","BFU_START_SHORT","MDCT_SIZE_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","FFT_SIZE_LOW","FFT_SIZE_MID","FFT_SIZE_HIGH","QUANTIZATION_SIGN_BIT_SHIFT","WAV_PCM_MAX_POSITIVE","WAV_PCM_MAX_NEGATIVE","FRAME_HEADER_BITS","FRAME_WORD_LENGTH_BITS","FRAME_SCALE_FACTOR_BITS","PSYMODEL_NOT_EXAMINED","PSYMODEL_TONAL","PSYMODEL_NON_TONAL","PSYMODEL_IRRELEVANT","PSYMODEL_LOG10_FACTOR","LN10","PSYMODEL_POW10_FACTOR","PSYMODEL_CRITICAL_BANDS","PSYMODEL_THRESHOLD_TABLE","PSYMODEL_CB_FREQ_INDICES","map","cbIdx","PSYMODEL_FREQ_TO_CB_MAP","e","t","r","n","iterator","c","Generator","u","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","length","l","TypeError","done","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","configurable","writable","_invoke","_awaitAsyncGenerator","_OverloadYield","_wrapAsyncGenerator","AsyncGenerator","apply","arguments","resume","Promise","resolve","then","k","settle","reject","next","arg","_asyncIterator","asyncIterator","AsyncFromSyncIterator","AsyncFromSyncIteratorContinuation","s","throwError","msg","Error","pipe","context","_len","stages","Array","_key","functions","stage","input","reduce","fn","withFlushSamples","_x","_withFlushSamples","iter","samplesToFlush","undefined","_callee","lastFrameLength","_iteratorAbruptCompletion","_didIteratorError","_iteratorError","_iterator","_step","frame","paddedFrame","_t","_context","set","withDelayCompensation","_x2","_withDelayCompensation","pcmFrameStream","samplesToDrop","_callee2","buffer","droppedInitialSamples","_iteratorAbruptCompletion2","_didIteratorError2","_iteratorError2","_iterator2","_step2","combined","offset","_t2","_context2","slice","withStereo","monoTransform","_len2","args","_key2","_ref","_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","_slicedToArray","push","_callee3","_i","_leftFrames","_context3","_callee4","_i2","_rightFrames","_context4","concat","_x3","withStereoFlushSamples","withStereoDelayCompensation","qmfAnalysis","delayLine","_qmfWorkBuffers$delay","_qmfWorkBuffers$delay2","qmfWorkBuffers","inputLength","outputLength","workBuffer","delay","lowBand","highBand","evenSum","oddSum","j","newDelay","qmfSynthesis","_qmfWorkBuffers$delay3","_qmfWorkBuffers$delay4","subbandLength","low","high","output","sample0","sample1","idx","FFT","_classCallCheck","real","imag","size","bits","log2","reversed","temp","b","_ref2","stride","halfStride","angle","wReal","cos","wImag","start","twiddleReal","twiddleImag","evenIndex","oddIndex","evenReal","evenImag","oddReal","oddImag","tReal","tImag","nextReal","MDCTBase","_createClass","scale","halfSize","quarterSize","fftSize","alpha","omega","scaleRoot","sqrt","sinCosTable","MDCT","_MDCTBase","_callSuper","_inherits","_buffers$real","_buffers$imag","mdctBuffers","buffers","n4","n34","fill","i2","i3","i4","im","fft","re","IMDCT","_MDCTBase2","_buffers$real2","_buffers$imag2","r1","i1","mdct64","mdct256","mdct512","imdct64","imdct256","imdct512","overlapAdd","prev","curr","w1","w2","findScaleFactor","coefficients","maxAmplitude","max","abs","mid","quantize","scaleFactorIndex","bitsPerSample","scaleFactor","normFactor","quantized","normalized","min","round","dequantize","denormFactor","dequantized","allocateBits","psychoResults","bfuData","bfuSizes","maxBfuCount","signalEnergyDb","bfuCount","energyPerBfu","data","energy","calculateBfuEnergy","smrValues","maskThresholdDb","bfu","Infinity","calculateSMR","globalThreshold","maskThresholdPerBfu","freqPerBin","bfuFreq","fftBinIndex","mapThresholdToBfus","maskingThreshold","actualBfuCount","hasAudibleContent","some","smr","contributions","index","sort","cumulativeSMR","sum","_createForOfIteratorHelper","candidateCount","requiredBfus","_toConsumableArray","capturedIndex","currentValue","totalValue","remainingIndices","err","selectBfuCountForAudibleContent","highestSignalBfu","selectBfuCountForInaudibleContent","selectOptimalBfuCount","allocation","availableBits","priorityQueue","heap","priority","floor","heapifyDown","isEmpty","peek","pop","last","popMax","updateTop","createPriorityQueue","bestBfu","currentWl","upgradeCost","calculateUpgradeCost","performBitAllocation","bfuIndex","currentBits","startIdx","element","leftChild","rightChild","largest","largestPriority","BufferPool","transformBuffers","highBandDelay","QMF_HIGH_BAND_DELAY","qmfDelays","midBand","transientDetection","prevLowCoeffs","prevMidCoeffs","prevHighCoeffs","mdctOverlap","imdctOverlap","reversalBuffers","psychoAnalysis","flags","threshold","EncoderOptions","options","values","transientThresholdLow","transientThresholdMid","transientThresholdHigh","normalizationDb","metadata","default","name","description","range","step","setOptions","_Object$entries","entries","_Object$entries$_i","setValue","_meta$range","_objectSpread","_Object$entries2","_Object$entries2$_i","meta","performFFT","samples","copyLen","subarray","magnitude","detectTransient","currentCoeffs","prevCoeffs","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","log","geometricMean","exp","arithmeticMean","midPoint","lowEnergy","highEnergy","totalEnergy","toDb","fromDb","db","mdctCoeffs","targetSize","psychoBuffers","fftScale","correctedCoeffs","corrected","applyMdctCorrection","psd","halfTargetSize","powers","maxPower","power","maxPsdValue","avgPower","srcIdx","srcIdxInt","frac","normalizedPower","normalizationDelta","calculatePSDFromMDCT","_findAllMaskers","_findTonalMaskers","tonalList","maxTonalBin","RANGE_LOW","RANGE_MID","RANGE_HIGH","searchOffsets","getSearchOffsets","isTonal","spl","markTonalComponent","findTonalMaskers","_findNonTonalMaskers","nonTonalList","cbStart","bandAnalysis","analyzeCriticalBand","powerDb","centroidOffset","findNonTonalMaskers","decimated","isAudible","markInaudible","audibleTonal","tonal","audibleNonTonal","nonTonal","decimateMaskers","tonalMaskers","nonTonalMaskers","findAllMaskers","thresholdBuffer","criticalBandThresholds","bandData","maskedBark","summedEnergy","calculateMaskerContributions","calculateCriticalBandThresholds","cbThresholds","COMPENSATION_FACTOR","freqIndices","bandIndex","x0","x1","y0","y1","bandWidth","interpolated","compensation","interpolateThresholdCompensated","calculateGlobalThreshold","rangeLow","rangeMid","rangeHigh","offsets","startBin","endBin","totalPower","weightedPower","baseBark","maskers","_step5","_iterator5","maskerBark","barkDistance","calculateMaskingLevel","maskerSpl","maskerPsd","psdFactor1","qmfAnalysisStage","_context$bufferPool","bufferPool","delays","pcmSamples","stage1","stage2","delayedHigh","bands","blockSelectorStage","_context$bufferPool2","_context$options","_bands","lowCoeffs","midCoeffs","highCoeffs","lowTransient","midTransient","highTransient","blockModes","mdctStage","_context$bufferPool3","overlapBuffers","originalFrame","band","bandSize","numBlocks","blockSize","mdctFunc","mdctSize","windowStart","block","blockStart","mdctInput","tailValue","spectrum","transform","quantizationStage","_context$bufferPool4","_context$options2","_groupIntoBFUs","bfuBuffers","coeffIndex","bandStart","bandEnd","startPositions","startPos","actualSize","groupIntoBFUs","_allocateBits","selectedBfuCount","scaleFactorIndices","quantizedCoefficients","wordLength","nBfu","wordLengthIndices","blockSizeMode","encode","dequantizationStage","frameData","position","imdctStage","_input","bandCoeffs","imdctFunc","invBuf","dstBuf","prevBuf","pos","blockSpecs","inv","invStart","dstPart","qmfSynthesisStage","decode","packBits","bitPosition","bitCount","byteIndex","bitOffset","bitsWritten","bitsAvailable","bitsToWrite","valueBits","mask","unpackBits","bitsRead","bitsToRead","unpackSignedBits","serializeFrame","view","DataView","indexOf","header","setUint16","coefficient","deserializeFrame","byteOffset","byteLength","getUint16","bfuSize","AeaFile","title","frameCount","channelCount","titleBytes","TextEncoder","AEA_TITLE_SIZE","setUint32","titleEnd","titleLength","TextDecoder","getUint32","_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","_iterator6","_step6","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"],"sourceRoot":""}
|