{"_id":"@audio/dynamics-unlimit","_rev":"2-34cd5bc34772674ab498514c62f2059a","name":"@audio/dynamics-unlimit","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@audio/dynamics-unlimit","version":"0.1.0","keywords":["audio","dsp","dynamics","unlimit","delimiter","expander"],"author":{"name":"Dmitry Iv.","email":"dfcreative@gmail.com"},"license":"MIT","_id":"@audio/dynamics-unlimit@0.1.0","maintainers":[{"name":"jamen","email":"jamenmarz@gmail.com"},{"name":"dfcreative","email":"df.creative@gmail.com"},{"name":"dy","email":"df.creative@gmail.com"}],"homepage":"https://github.com/audiojs/dynamics/tree/main/packages/dynamics-unlimit","bugs":{"url":"https://github.com/audiojs/dynamics/issues"},"dist":{"shasum":"beb75fa8b1535ca92f753a4fc45cd616bc6f70a3","tarball":"https://registry.npmjs.org/@audio/dynamics-unlimit/-/dynamics-unlimit-0.1.0.tgz","fileCount":5,"integrity":"sha512-aYqh3xgsFXa2Fj8qewa2gfJZbeK32+wVjaSjgqTPZM8pYzrtgryLBy5oogtYdeoQJ5aalafd5P9cNRrnq7kNyA==","signatures":[{"sig":"MEUCIQDZLy2bhMbFi/plomQx7HrRtAkEatJ5M+EOJ3VHz0kROAIgQdKkHcQKjzdFAmD42mcUBRpaCLJcA93FdNdiaUCX2jw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17518},"main":"unlimit.js","type":"module","audio":"./audio.js","engines":{"node":">=18"},"exports":{".":"./unlimit.js","./audio":{"types":"./audio.d.ts","default":"./audio.js"},"./package.json":"./package.json"},"gitHead":"4646ef1bb5b69cdd00f5c1e3b211d26174f33a47","_npmUser":{"name":"dy","email":"df.creative@gmail.com"},"repository":{"url":"git+https://github.com/audiojs/dynamics.git","type":"git","directory":"packages/dynamics-unlimit"},"_npmVersion":"11.12.1","description":"Classical de-limiter: transient-gated upward expansion restoring crest a brickwall limiter flattened","directories":{},"sideEffects":false,"_nodeVersion":"25.9.0","dependencies":{"@audio/dynamics-envelope":"^0.1.0","@audio/dynamics-expander":"^0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/dynamics-unlimit_0.1.0_1783722909938_0.3286988517784699","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@audio/dynamics-unlimit","version":"0.1.1","description":"Classical de-limiter: transient-gated upward expansion restoring crest a brickwall limiter flattened","type":"module","sideEffects":false,"main":"unlimit.js","exports":{".":"./unlimit.js","./package.json":"./package.json","./audio":{"types":"./audio.d.ts","default":"./audio.js"}},"dependencies":{"@audio/dynamics-envelope":"^0.1.0","@audio/dynamics-expander":"^0.2.0"},"keywords":["audio","dsp","dynamics","unlimit","delimiter","expander"],"license":"MIT","author":{"name":"Dmitry Iv.","email":"dfcreative@gmail.com"},"repository":{"type":"git","url":"git+https://github.com/audiojs/dynamics.git","directory":"packages/dynamics-unlimit"},"homepage":"https://github.com/audiojs/dynamics/tree/main/packages/dynamics-unlimit","bugs":{"url":"https://github.com/audiojs/dynamics/issues"},"engines":{"node":">=18"},"publishConfig":{"access":"public"},"types":"./unlimit.d.ts","audio":"./audio.js","funding":"https://github.com/sponsors/audiojs","gitHead":"28b8fc7ed183f5872771bc2066b7b2db0585a644","_id":"@audio/dynamics-unlimit@0.1.1","_nodeVersion":"25.9.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-4/SolRimmiLXnHxLpdzrL66EmkzK1Jz7EAywNHa9S0msWU5FkvhaOBIpQ4Ryez+evYQ4EnCbIIZN0Phr3Ade7g==","shasum":"17d9d5d3d76e02ef849c1406a6dc5375a9b04a38","tarball":"https://registry.npmjs.org/@audio/dynamics-unlimit/-/dynamics-unlimit-0.1.1.tgz","fileCount":7,"unpackedSize":24413,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDDTqXsM+bFDTGA7W/qvtpV8xsTCvc4ZHVRsQk4A8H67wIgMeQEEN2ycyzXOdjzKa8wPrJmS76vjQ9bNEjspWEQ3wo="}]},"_npmUser":{"name":"dy","email":"df.creative@gmail.com"},"directories":{},"maintainers":[{"name":"jamen","email":"jamenmarz@gmail.com"},{"name":"dfcreative","email":"df.creative@gmail.com"},{"name":"dy","email":"df.creative@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dynamics-unlimit_0.1.1_1783731453907_0.9468844503168286"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-10T22:35:09.763Z","modified":"2026-07-11T00:57:34.191Z","0.1.0":"2026-07-10T22:35:10.079Z","0.1.1":"2026-07-11T00:57:34.038Z"},"bugs":{"url":"https://github.com/audiojs/dynamics/issues"},"author":{"name":"Dmitry Iv.","email":"dfcreative@gmail.com"},"license":"MIT","homepage":"https://github.com/audiojs/dynamics/tree/main/packages/dynamics-unlimit","keywords":["audio","dsp","dynamics","unlimit","delimiter","expander"],"repository":{"type":"git","url":"git+https://github.com/audiojs/dynamics.git","directory":"packages/dynamics-unlimit"},"description":"Classical de-limiter: transient-gated upward expansion restoring crest a brickwall limiter flattened","maintainers":[{"name":"jamen","email":"jamenmarz@gmail.com"},{"name":"dfcreative","email":"df.creative@gmail.com"},{"name":"dy","email":"df.creative@gmail.com"}],"readme":"# @audio/dynamics-unlimit [![npm](https://img.shields.io/npm/v/@audio/dynamics-unlimit)](https://www.npmjs.com/package/@audio/dynamics-unlimit) [![MIT](https://img.shields.io/badge/MIT-%E0%A5%90-white)](https://github.com/krishnized/license)\n\nClassical de-limiter: transient-gated upward expansion restoring crest a brickwall limiter flattened\n\n```\nnpm install @audio/dynamics-unlimit\n```\n\n```js\nimport unlimit from '@audio/dynamics-unlimit'\n```\n\nDe-limiter. iZotope Ozone 12's \"Unlimiter\" (Sept 2025) created the de-limiting category with a trained ML model; this atom is the **classical counterpart** — transient-synchronous upward expansion, restoring the crest factor a brickwall limiter (or an over-eager bus compressor) flattened. Program-adaptive upward expansion gated to transients, not level — one more cell in the four-quadrant dynamics taxonomy (Giannoulis, Massberg & Reiss 2012, JAES 60(6); Izhaki, *Mixing Audio*), built on [expander](#expander)'s `upwardExpanderGain` curve.\n\nA fast envelope (`fastAttack`/`fastRelease`, near-instant) and a slow envelope (`slowAttack`/`slowRelease`, sluggish) both track the input; their gap in dB — *transientness* — rises sharply on attacks and sits near zero on sustained material. Gain lift follows transientness, not absolute level: an absolute-level upward expander would pump sustains; gating on the fast/slow gap instead is what makes this a de-limiter rather than a leveler.\n\n```js\nimport { unlimit } from '@audio/dynamics'\n\nunlimit(data, { amount: 9, drive: 2 })                  // deliberate restoration\nunlimit(data, { amount: 9, drive: 2, ceiling: -1 })      // guard restored peaks at -1 dBFS\n```\n\n| Param | Default | |\n|---|---|---|\n| `amount` | `6` | dB, max crest restoration (range 0–18) |\n| `drive` | `1` | scales the deficit-driven restoration (1 = restore attacks to `crestTarget`); in `adaptive: false` mode, dB of lift per dB of transientness |\n| `adaptive` | `true` | deficit mode (see below); `false` = raw proportional transient-following (a transient exaggerator, for manual sound design) |\n| `crestTarget` | `10` | dB of transientness a healthy attack is expected to show; flattened attacks get lifted by what they're missing |\n| `ceiling` | `null` | dBFS; post guard so restored peaks don't exceed it. `null` (default): peaks may exceed 0 dBFS by design (float domain) |\n| `fastAttack` | `0.5` | ms |\n| `fastRelease` | `20` | ms |\n| `slowAttack` | `20` | ms |\n| `slowRelease` | `200` | ms |\n\nThe default mode lifts by transient **deficit**, not transient presence — the inverse-limiter insight: a brickwall limiter's fingerprint is attacks that are too *small* (3–8 dB of fast-over-slow transientness where healthy program shows 12–25 dB), so each onset gets back `crestTarget − measured` dB, and a naturally healthy attack gets structurally **zero** lift. Safety on dynamic material is a property of the curve, not a timid default: measured on the test fixture, defaults change never-limited program by ≤ 0.2 dB RMS while `amount: 9` recovers ~4.5 dB of crest from a 9 dB-crushed brickwall (see tests). Three gates make that separation robust — peak-hold (deficit is judged against an attack's *peak* transientness, not its rise samples), a 10 ms attack window (a decaying tail keeps the fast envelope above the slow one for its whole length; a decay is not an onset), and a ~3 ms confirmation ramp (a healthy attack outruns `crestTarget` in ~1.5 ms, collapsing its own deficit before lift confirms; a limiter-flattened plateau is still standing).\n\n**Honest scope:** this restores dynamics/crest — it cannot recover information a clipper already destroyed (pair with [`@audio/denoise-declip`](https://github.com/audiojs/denoise) for that), and it does not un-mix limiter pumping artifacts baked into the waveform's history. Over-driving `amount`/`drive` invents transients that were never there. v1 is zero-latency with no lookahead — it reacts to a transient already underway, it cannot anticipate one; lookahead attack-anticipation is a future option.\n\n**Use when:** restoring life to over-limited masters, streaming-loudness-flattened stems, squashed dialogue or game audio.<br>\n**Not for:** recovering clipped/distorted peaks — use a declipper. Undoing audible limiter pumping — remix from an earlier, unlimited stage if one exists.\n\n---\n\nPart of [@audio/dynamics](https://github.com/audiojs/dynamics) — the dynamics family umbrella. This README is generated from the umbrella docs.\n\nMIT © [audiojs](https://github.com/audiojs)\n","readmeFilename":"README.md"}