From 3d316cbe49a439a8192e9645446415eac72f86dc Mon Sep 17 00:00:00 2001 From: Nils Pukropp Date: Fri, 6 Nov 2026 15:51:36 +0100 Subject: [PATCH] feat(quench): add Quench sub-safe clipper Quench splits the signal with a Linkwitz-Riley crossover and lets the sub pass unclipped. The top is clipped symmetrically at the ceiling minus the sub's held peak, so it does not pump at the sub's rate and the sum stays under the ceiling. What the clip removes is high-passed at the split, so its products stay out of the low band. Two correction passes and an oversampled hard clip hold the ceiling; a safety clip catches the downsampler's ringing. - Controls: Drive, Ceiling, Split, Hold, Soft, Bypass. - Listen to Quench, a plain clipper at the same settings, or the delta. - Editor meter compares how much the low band changed for Quench and for a plain clip, with a scope of the output, the sub and the top's room. - Measured: sub level +0.04 dB against -2.2 dB for a plain clip, low-band products -35 dB against -16 dB, at 0.5-1.2 dB less RMS. - Registered in the catalog, workflows, editor-check, README, chain and development docs, and the website copy. --- .gitea/workflows/check.yml | 4 +- .gitea/workflows/release.yml | 2 +- Cargo.lock | 19 + Cargo.toml | 4 +- README.md | 11 +- docs/chain.md | 10 +- docs/development.md | 5 +- docs/ideas.md | 27 +- docs/quench/CHANGELOG.md | 16 + docs/quench/README.md | 104 ++ docs/quench/assets/editor.png | Bin 0 -> 268195 bytes plugins/catalog.json | 17 + plugins/quench/core/Cargo.toml | 12 + plugins/quench/core/src/lib.rs | 422 +++++ plugins/quench/core/src/settings.rs | 58 + plugins/quench/core/tests/dsp.rs | 300 ++++ plugins/quench/core/tests/realtime.rs | 65 + plugins/quench/plugin/Cargo.lock | 2381 +++++++++++++++++++++++++ plugins/quench/plugin/Cargo.toml | 25 + plugins/quench/plugin/src/lib.rs | 204 +++ plugins/quench/plugin/src/params.rs | 108 ++ plugins/quench/plugin/tests/host.rs | 205 +++ plugins/quench/ui/Cargo.toml | 11 + plugins/quench/ui/src/lib.rs | 327 ++++ tools/editor-check/Cargo.lock | 20 + tools/editor-check/Cargo.toml | 2 + tools/editor-check/src/main.rs | 40 +- website/src/data/plugins.ts | 15 + 28 files changed, 4397 insertions(+), 17 deletions(-) create mode 100644 docs/quench/CHANGELOG.md create mode 100644 docs/quench/README.md create mode 100644 docs/quench/assets/editor.png create mode 100644 plugins/quench/core/Cargo.toml create mode 100644 plugins/quench/core/src/lib.rs create mode 100644 plugins/quench/core/src/settings.rs create mode 100644 plugins/quench/core/tests/dsp.rs create mode 100644 plugins/quench/core/tests/realtime.rs create mode 100644 plugins/quench/plugin/Cargo.lock create mode 100644 plugins/quench/plugin/Cargo.toml create mode 100644 plugins/quench/plugin/src/lib.rs create mode 100644 plugins/quench/plugin/src/params.rs create mode 100644 plugins/quench/plugin/tests/host.rs create mode 100644 plugins/quench/ui/Cargo.toml create mode 100644 plugins/quench/ui/src/lib.rs diff --git a/.gitea/workflows/check.yml b/.gitea/workflows/check.yml index 7ad0da7..67956bd 100644 --- a/.gitea/workflows/check.yml +++ b/.gitea/workflows/check.yml @@ -22,7 +22,7 @@ jobs: strategy: fail-fast: false matrix: - plugin: [rivet, patina, anvil, crucible, lathe, temper, weld, knurl, planish, braze] + plugin: [rivet, patina, anvil, crucible, lathe, temper, weld, knurl, planish, braze, quench] steps: - uses: https://github.com/actions/checkout@v4 with: @@ -64,6 +64,7 @@ jobs: cargo run --manifest-path tools/editor-check/Cargo.toml --locked -- target/editor/knurl.png --plugin knurl cargo run --manifest-path tools/editor-check/Cargo.toml --locked -- target/editor/planish.png --plugin planish cargo run --manifest-path tools/editor-check/Cargo.toml --locked -- target/editor/braze.png --plugin braze + cargo run --manifest-path tools/editor-check/Cargo.toml --locked -- target/editor/quench.png --plugin quench - uses: https://github.com/actions/upload-artifact@v3-node20 with: name: editor-previews @@ -97,6 +98,7 @@ jobs: python3 scripts/build-plugin.py --plugin knurl --target x86_64-pc-windows-gnu python3 scripts/build-plugin.py --plugin planish --target x86_64-pc-windows-gnu python3 scripts/build-plugin.py --plugin braze --target x86_64-pc-windows-gnu + python3 scripts/build-plugin.py --plugin quench --target x86_64-pc-windows-gnu python3 scripts/package-windows.py - uses: https://github.com/actions/upload-artifact@v3-node20 with: diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index e7714c9..e2285ad 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -1,7 +1,7 @@ name: Independent plugin release on: push: - tags: ["rivet-v*", "patina-v*", "anvil-v*", "crucible-v*", "lathe-v*", "temper-v*", "weld-v*", "knurl-v*", "planish-v*", "braze-v*"] + tags: ["rivet-v*", "patina-v*", "anvil-v*", "crucible-v*", "lathe-v*", "temper-v*", "weld-v*", "knurl-v*", "planish-v*", "braze-v*", "quench-v*"] permissions: contents: read diff --git a/Cargo.lock b/Cargo.lock index 7b11ef2..c229024 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -389,6 +389,25 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" +[[package]] +name = "quench-core" +version = "0.1.0" +dependencies = [ + "common-dsp", + "serde", + "serde_json", +] + +[[package]] +name = "quench-ui" +version = "0.1.0" +dependencies = [ + "common-dsp", + "common-ui", + "egui", + "quench-core", +] + [[package]] name = "quote" version = "1.0.47" diff --git a/Cargo.toml b/Cargo.toml index 55bf3c6..d23524d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] resolver = "2" -members = ["plugins/common/ui", "plugins/common/dsp", "plugins/anvil/core", "plugins/anvil/ui", "plugins/lathe/core", "plugins/lathe/ui", "plugins/temper/core", "plugins/temper/ui", "plugins/weld/core", "plugins/weld/ui", "plugins/knurl/core", "plugins/knurl/ui", "plugins/planish/core", "plugins/planish/ui", "plugins/braze/core", "plugins/braze/ui", "plugins/crucible/core", "plugins/crucible/ui", "plugins/rivet/core", "plugins/rivet/midi", "plugins/rivet/preview", "plugins/rivet/app", "plugins/patina/core", "plugins/patina/render", "plugins/patina/ui"] +members = ["plugins/common/ui", "plugins/common/dsp", "plugins/anvil/core", "plugins/anvil/ui", "plugins/lathe/core", "plugins/lathe/ui", "plugins/temper/core", "plugins/temper/ui", "plugins/weld/core", "plugins/weld/ui", "plugins/knurl/core", "plugins/knurl/ui", "plugins/planish/core", "plugins/planish/ui", "plugins/braze/core", "plugins/braze/ui", "plugins/quench/core", "plugins/quench/ui", "plugins/crucible/core", "plugins/crucible/ui", "plugins/rivet/core", "plugins/rivet/midi", "plugins/rivet/preview", "plugins/rivet/app", "plugins/patina/core", "plugins/patina/render", "plugins/patina/ui"] exclude = ["plugins/rivet/plugin", "tools/editor-check", "plugins/patina/plugin", "plugins/anvil/plugin", "plugins/crucible/plugin", "plugins/lathe/plugin", "plugins/temper/plugin", "plugins/weld/plugin", "plugins/knurl/plugin", "plugins/planish/plugin"] [workspace.package] @@ -31,3 +31,5 @@ opt-level = 2 [profile.dev.package.weld-core] opt-level = 2 +[profile.dev.package.quench-core] +opt-level = 2 diff --git a/README.md b/README.md index bf6da56..10ec66d 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ note. Each plugin is a separate product with its own version, guide and release. | **[Knurl](docs/knurl/README.md)** | Gives every cycle of the note its own level, timing and grit: in-tune subharmonic growl, rattle and fry on every note | Bass | ≈ 71 ms | [Guide](docs/knurl/README.md) · [Changes](docs/knurl/CHANGELOG.md) | | **[Planish](docs/planish/README.md)** | Upward and downward compression (OTT) in bands set by harmonic number: band 2 holds harmonics 2–4 on every note | Bass | ≈ 67 ms | [Guide](docs/planish/README.md) · [Changes](docs/planish/CHANGELOG.md) | | **[Braze](docs/braze/README.md)** | Adds a detuned copy whose beating stays on the tempo grid on every note: reese movement in time | Bass | ≈ 67 ms | [Guide](docs/braze/README.md) · [Changes](docs/braze/CHANGELOG.md) | +| **[Quench](docs/quench/README.md)** | Clips the top as hard as you like while the sub passes clean: the low end keeps its level under a loud master | Master or bass bus, last | < 1 ms (oversampling) | [Guide](docs/quench/README.md) · [Changes](docs/quench/CHANGELOG.md) | Plugins with latency report it to the host, so FL Studio compensates the delay. Anvil, Lathe, Temper, Knurl, Planish and Braze detect pitch from the audio. They can also take the @@ -41,7 +42,8 @@ is struck on; a **crucible** melts material down to be cast again; a **lathe** turns a piece so each cut lands the same all the way round; **tempering** sets how hard and how tough a metal ends up; a **weld** fuses two pieces into one; **knurling** presses a ridged grip pattern into a surface; **planishing** -hammers a surface smooth and even; **brazing** joins two metals with a filler. +hammers a surface smooth and even; **brazing** joins two metals with a filler; **quenching** hardens hot metal in one +fast step. The suite is the **foundry**: the workshop where the bass gets cast, shaped and finished. Hosts list the plugins under the vendor name *Bass Foundry*. @@ -68,6 +70,10 @@ finished. Hosts list the plugins under the vendor name *Bass Foundry*. Planish editor
Planish: harmonic OTT Braze editor
Braze: tempo-locked beating + + Quench editor
Quench: sub-safe clipper + + The previews are rendered headless from the real editor code by @@ -126,7 +132,7 @@ cargo run --manifest-path tools/editor-check/Cargo.toml -- target/editor/lathe.p ``` Plugin names for the scripts are `rivet`, `patina`, `anvil`, `crucible`, -`lathe`, `temper`, `weld`, `knurl`, `planish` and `braze`. Builds go to `dist//.clap`. No +`lathe`, `temper`, `weld`, `knurl`, `planish`, `braze` and `quench`. Builds go to `dist//.clap`. No script installs anything into a DAW. [Development and testing](docs/development.md) has the full command list. @@ -166,6 +172,7 @@ plugins/ knurl/ core · ui · plugin planish/ core · ui · plugin braze/ core · ui · plugin + quench/ core · ui · plugin common/ ui/ Shared look: palette, embedded fonts, knobs, panels, meters dsp/ Shared filters, pitch tracking, oversampling, meters, WAV files diff --git a/docs/chain.md b/docs/chain.md index e37a19c..87d61c8 100644 --- a/docs/chain.md +++ b/docs/chain.md @@ -8,7 +8,8 @@ in the chain changes the audio, the pitch detection after it can go wrong. ```text bass track: synth → Lathe → Temper → Planish → Braze → Knurl → Patina → Weld -bass bus: Anvil → (bus compression, clipping) → Crucible +bass bus: Anvil → (bus compression) → Quench → Crucible +master: … → Quench (last, or before a true-peak limiter) ``` - **Lathe and Temper before Knurl.** They hear the plain synth, where the pitch @@ -31,6 +32,10 @@ bass bus: Anvil → (bus compression, clipping) → Crucible that layer late. - **Anvil on the bus, in MIDI mode when Knurl is in the chain.** For Kick lock, send the kick's track to Anvil as a sidechain. +- **Quench last on the bus or the master.** It clips the top and leaves the sub + alone, so put it where you would put a clipper. On the bass bus after Anvil, + set its Split at or a little above Anvil's Split: Anvil's sub then passes + Quench untouched. Quench does not detect pitch, so it can sit after Knurl. - **Crucible at the end of the chain you want to resample.** ## Knurl and pitch detection @@ -53,7 +58,8 @@ and route the bass's MIDI notes to it. ## Latency Each tracked plugin adds its own lookahead: Anvil 80 ms, Lathe, Temper, -Planish and Braze about 67 ms, Knurl about 71 ms, Patina about 45 ms. A full chain is +Planish and Braze about 67 ms, Knurl about 71 ms, Patina about 45 ms, Quench +under 1 ms. A full chain is about 400 ms. FL Studio compensates this for playback and rendering, but playing a MIDI keyboard through the full chain is not practical. Write with a shorter chain and add the diff --git a/docs/development.md b/docs/development.md index 637ebe2..209f0fb 100644 --- a/docs/development.md +++ b/docs/development.md @@ -25,7 +25,7 @@ Patina has `render` for offline WAV evaluation. The shared crates are: - `common-ui`: palette, embedded fonts, header, panels, knobs, meters. - `common-dsp`: filters, YIN pitch tracking, the note tracker used by Anvil, - Lathe, Temper, Knurl, Planish and Braze, 4× oversampling, meters and WAV files. + Lathe, Temper, Knurl, Planish and Braze, 4× oversampling (also Quench's), meters and WAV files. The wrappers stay separate workspaces, each with its own lockfile, so the NIH-plug Git dependency stays out of the root workspace. Host identities and @@ -45,7 +45,7 @@ python3 -m unittest discover -s scripts/tests -v ``` Products: `rivet`, `patina`, `anvil`, `crucible`, `lathe`, `temper`, `weld`, -`knurl`, `planish`, `braze`. +`knurl`, `planish`, `braze`, `quench`. `check-plugin.py` runs formatting, tests and clippy for one product's packages and its wrapper, without compiling the other products. Run it for every product @@ -146,6 +146,7 @@ identify plugins by CLAP ID, so the vendor name does not affect saved projects. | Knurl | (new) | `io.narl.bass-foundry.knurl` | | Planish | (new) | `io.narl.bass-foundry.planish` | | Braze | (new) | `io.narl.bass-foundry.braze` | +| Quench | (new) | `io.narl.bass-foundry.quench` | CLAP IDs use the form `io.narl.bass-foundry.`. Builds tagged before this scheme used `io.storyboard.*` IDs; hosts treat the new IDs as different diff --git a/docs/ideas.md b/docs/ideas.md index 6468b50..9f1e8fe 100644 --- a/docs/ideas.md +++ b/docs/ideas.md @@ -263,8 +263,8 @@ one period of the note, so heavy settings do not ripple at f0. See [Planish](pla Patina already cut fixed formants on every note, but it also cut a boosted harmonic as hard (5.7 dB), at a position that moved with the note. Open: MIDI as the pitch source. -3. Planish (done, released 0.1.0), then Quench and Ballast: they fill the mix - and master gap. +3. Planish (done, released 0.1.0), then Quench (done, unreleased) and Ballast: + they fill the mix and master gap. - In parallel, from the research findings, in this order: Weld delay spread (done, Weld 0.3.0); the fatness lane, as the first Assay piece (prototype `scripts/fatness.py`); Anvil Ghost harmonics and Phone listen @@ -328,6 +328,29 @@ Quenching hardens hot metal in one fast step. Quench clips only above a split frequency and adds the clean sub back with its own headroom, so the master can be clipped hard without distorting the low end. Pairs with Anvil's split. +Built (unreleased 0.1.0, see [Quench](quench/README.md)). Design checks, made +in a prototype before the plugin: + +- Splitting and giving the top the instantaneous room, clamp(top, −C − sub, + C − sub), is exactly a plain clip of the sum: the error is the same signal. + The sub-safe part has to come from somewhere else. +- Feeding the clip error back through 1 − lowpass diverges: the complement of + an LR4 lowpass peaks at 1.5× near the split. +- What works: clip the top symmetrically at the ceiling minus the sub's held + peak (no pumping at the sub's rate, the sum stays under the ceiling), then + high-pass the clip error at the split so its products below the split go. + Two clip-and-high-pass passes and an oversampled hard clip hold the ceiling. + Measured: sub level +0.04 dB against −2.2 dB for a plain clip; low-band + products −35 dB against −16 dB. Cost: 0.5–1.2 dB less RMS at the same + ceiling. +- Where it does not help: a top whose fundamental lies within an octave of the + split is partly in the sub band (saw at 98 Hz over a 49 Hz sub: about the same + as a plain clip). +- Next ideas: link the channels' sub peak and offer mono below the split + (with Gauge); give the top the room on the sub's far side too (asymmetric) + with the error still high-passed, and measure whether that wins back the + loudness without pumping; a true-peak ceiling. + ### Scribe — audio to MIDI (problem 18) A scribe marks lines on metal. Scribe runs the note tracker on a bass and diff --git a/docs/quench/CHANGELOG.md b/docs/quench/CHANGELOG.md new file mode 100644 index 0000000..e1912e1 --- /dev/null +++ b/docs/quench/CHANGELOG.md @@ -0,0 +1,16 @@ +# Quench changelog + +## Unreleased (0.1.0) + +- Introduce Quench, a clipper that clips the top and lets the sub pass clean. +- A Linkwitz–Riley split at **Split** (40–300 Hz). The top is clipped at the + ceiling minus the sub's held peak; **Hold** sets how long that peak holds. +- What the clip removes is high-passed at Split, so its products stay out of + the low band. Two correction passes and an oversampled hard clip hold the + ceiling; a safety clip catches the downsampler's ringing. +- **Drive**, **Ceiling**, **Soft** (knee of the top's clip), **Bypass**. +- Listen to **Quench**, a **Plain** clipper at the same settings, or the + **Delta** that Quench takes away. Not saved. +- Editor: how much the low band changed for Quench and for a plain clip, how + far the top is clipped, the sub's peak and the room it leaves, and a scope. +- 4× oversampling; 37 samples of latency. diff --git a/docs/quench/README.md b/docs/quench/README.md new file mode 100644 index 0000000..88372fb --- /dev/null +++ b/docs/quench/README.md @@ -0,0 +1,104 @@ +# Quench + +Quench clips the top of the mix as hard as you like and lets the sub pass clean. +Current version **0.1.0** (unreleased). + +Riddim and dubstep masters are clipped hard. A plain clipper clips the sum of +the sub and everything above it. Near the sub's peaks only one side of the top +gets clipped, so the clipping takes energy out at the sub's rate: the sub loses +level, and the low end fills with products that were not in the mix. Quench +splits the signal at a frequency you set, never clips the sub, and clips only +the top, in the room the sub leaves under the ceiling. + +![Quench](assets/editor.png) + +## Install on Windows + +Copy `Quench.clap` into `C:\Program Files\Common Files\CLAP\`. In FL Studio +2024.1 or newer, open Options → Manage plugins, enable Verify plugins, and Find +installed plugins. Load Quench last on the master or on the bass bus. Keep the +font license with redistributed packages. + +## Work with it + +1. Put Quench where you would put a clipper: last on the master, or last on + the bass bus. Before a true-peak limiter is fine. +2. Set **Ceiling**, the highest output peak. +3. Set **Split** above the highest sub note, or at Anvil's Split when Anvil + makes the sub. Everything below Split passes without clipping. +4. Raise **Drive** until the top clips as hard as you want. The panel shows + how far the top is clipped. +5. Press **PLAIN** to hear a plain clipper at the same settings, then + **QUENCH** again. **DELTA** plays only what Quench takes away. The listen + choice is not saved and goes back to QUENCH when the editor closes. + +The panel shows: + +- **Low end changed by**: how much the band below Split differs from the + input, against the sub's level, for Quench and for a plain clip of the same + signal. Lower is cleaner. It reads "—" when no sub plays. +- **Top clipped by**: how far the top's loudest peak went past its room. +- **Sub peak · room left**: the sub's peak after Drive and the room it leaves + the top under the ceiling. +- The scope: the output (grey), the sub band (blue), and the sub plus or minus + the top's room (thin lines). The output stays between the thin lines. + +Other controls: + +- **Hold** keeps the room the sub's peak needs for this long. With a hold + longer than half a period of the lowest note (17 ms at 30 Hz), the top's + clip level stays steady through the sub's cycle and the top does not pump + with the sub. Shorter holds give the top a little more room between sub + peaks, and that room then changes at the sub's rate. +- **Soft** bends the top's clip: 0 % is a hard clip, 100 % a soft curve from + the start. The ceiling stays a hard limit. +- **Bypass** crossfades to the input, delayed by the latency. + +When the sub alone reaches the ceiling, the top has no room left. The panel +then warns: lower Drive or the sub. A safety clip still holds the ceiling, and +that clip does cut the sub. + +### How it works + +A Linkwitz–Riley crossover splits the signal at Split. The sub passes. The top +is clipped symmetrically at the ceiling minus the sub's held peak, so the sum +of sub and top never goes over the ceiling. + +Clipping the top also makes products below Split, for example difference +tones between its partials. Quench high-passes what the clip removed at Split, +so those products do not reach the low band. High-passing lets a few peaks +overshoot. Two correction passes clip those again and high-pass the correction, +and a final hard clip at the ceiling takes the small rest. All of this runs at +4× oversampling. A safety clip after the downsampler catches the filters' +ringing; it reads "idle" or a few hundredths of a dB. + +Measured on a 50 Hz sub at −10.5 dBFS under a top of five unrelated partials +peaking about 6 dB over the ceiling: + +| | Sub level | Low-band products | +| --- | --- | --- | +| Plain clip | −2.2 dB | −16 dB | +| Quench | +0.04 dB | −35 dB | + +Low-band products are everything below 110 Hz except the sub, against the +sub's level. + +Quench pays for this in loudness. The top gets the room on the sub's quieter +side only, so at the same ceiling Quench measured 0.5–1.2 dB lower in RMS +than a plain clip. Add Drive to make up for it. + +## Timing and limits + +Latency is the oversampling filters: 37 samples (0.8 ms at 48 kHz), reported +to the host for delay compensation. + +The split is a slope, not a wall. A top whose own fundamental lies near +Split, for example a distorted patch an octave above a 49 Hz sub, is partly in +the sub band. That part passes unclipped and takes up room, and Quench helps +less there: on a saw top at 98 Hz it changed the low end about as much as a +plain clip. Keep the top's lowest partial at least an octave above Split. + +Quench keeps the ceiling on sample peaks. True peaks between samples can +still go a little over it: put a true-peak limiter after Quench if the master +needs one. Each channel is clipped on its own; Quench does not link the +channels or turn the sub to mono. diff --git a/docs/quench/assets/editor.png b/docs/quench/assets/editor.png new file mode 100644 index 0000000000000000000000000000000000000000..3a2434870b04dcab6cd4eaa3ff878aee69442f6d GIT binary patch literal 268195 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%0A+Te9HeewT)#Cosk@OapH!AlqjbDU5aaO4HIc6 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

R^#(YW2OBkx#7Xr!_dOuSh0Nps|2)&lF98wBxS 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 Th{%3Q$G?R!OP?=|PR#mWvwF Self { + Self { + input_peak: SILENT, + output_peak: SILENT, + sub_peak: SILENT, + top_clip: 0., + safety: 0., + low_quench: f32::NAN, + low_plain: f32::NAN, + ceiling: Settings::default().ceiling, + latency: Oversampler::latency() as u32, + sample_rate: 48000., + scope_min: [0.; SCOPE], + scope_max: [0.; SCOPE], + scope_sub: [0.; SCOPE], + scope_room: [0.; SCOPE], + } + } +} + +/// Clips `h` to ±`limit`. `knee` (0–1) is the share of the range below `limit` that bends: +/// 0 is a hard clip. Never exceeds `limit`. +#[inline] +pub fn shape(h: f32, limit: f32, knee: f32) -> f32 { + let a = limit * (1. - knee); + let m = h.abs(); + if m <= a { + return h; + } + let w = limit - a; + let y = if w <= 1e-9 { + limit + } else { + a + w * ((m - a) / w).tanh() + }; + y.min(limit).copysign(h) +} + +/// One band of a Linkwitz–Riley crossover: two Butterworth stages. +#[inline] +fn lr4(f: &mut [Svf; 2], c: &SvfCoef, v: f32) -> f32 { + let v = f[0].process(c, v); + f[1].process(c, v) +} + +#[derive(Clone, Copy)] +struct Coefs { + low: SvfCoef, + high: SvfCoef, + /// Held-peak length in oversampled samples, and its release per sample after that. + hold: usize, + release: f32, + knee: f32, +} +impl Coefs { + fn new(rate: f32, s: &Settings) -> Self { + let fast = rate * FACTOR as f32; + Self { + low: SvfCoef::lowpass(fast, s.split, Q), + high: SvfCoef::highpass(fast, s.split, Q), + hold: (s.hold * 0.001 * fast) as usize, + release: 1. - coefficient(fast, s.hold), + knee: s.soft * 0.01, + } + } +} + +struct Channel { + os: Oversampler, + low: [Svf; 2], + high: [Svf; 2], + /// High-passes what the top's clip removed. + error: Svf, + passes: [Svf; PASSES], + env: f32, + hold_left: usize, + meter_quench: [Svf; 2], + meter_plain: [Svf; 2], + /// The input delayed by the latency, for bypass. + dry: Vec, +} +impl Channel { + fn new(latency: usize) -> Self { + Self { + os: Oversampler::new(), + low: [Svf::default(); 2], + high: [Svf::default(); 2], + error: Svf::default(), + passes: [Svf::default(); PASSES], + env: 0., + hold_left: 0, + meter_quench: [Svf::default(); 2], + meter_plain: [Svf::default(); 2], + dry: vec![0.; latency + 1], + } + } + fn reset(&mut self) { + self.os.reset(); + for f in self + .low + .iter_mut() + .chain(self.high.iter_mut()) + .chain(self.passes.iter_mut()) + .chain(self.meter_quench.iter_mut()) + .chain(self.meter_plain.iter_mut()) + { + f.reset(); + } + self.error.reset(); + self.env = 0.; + self.hold_left = 0; + self.dry.fill(0.); + } +} + +/// Peaks and energies gathered between two analyzer frames. +#[derive(Clone, Copy, Default)] +struct Gather { + input: f32, + output: f32, + sub: f32, + /// Largest ratio of the top to its room. + top: f32, + safety: f32, +} + +pub struct Engine { + rate: f32, + channels: usize, + settings: Settings, + coefs: Coefs, + channel: [Channel; 2], + drive: f32, + ceiling: f32, + bypass: f32, + primed: bool, + smooth: f32, + fade: f32, + meter: f32, + dry_at: usize, + energy_quench: f32, + energy_plain: f32, + energy_sub: f32, + gather: Gather, + scope: [[f32; 4]; SCOPE_LEN], + scope_at: usize, +} +impl Engine { + pub fn new(rate: f32, channels: usize) -> Result { + if !(8000.0..=384000.).contains(&rate) { + return Err("unsupported sample rate"); + } + if !(1..=2).contains(&channels) { + return Err("unsupported channel count"); + } + let settings = Settings::default(); + let latency = Oversampler::latency(); + Ok(Self { + rate, + channels, + settings, + coefs: Coefs::new(rate, &settings), + channel: [Channel::new(latency), Channel::new(latency)], + drive: 1., + ceiling: db_to_gain(settings.ceiling), + bypass: 0., + primed: false, + smooth: coefficient(rate, SMOOTH_MS), + fade: coefficient(rate, BYPASS_MS), + meter: coefficient(rate * FACTOR as f32, METER_MS), + dry_at: 0, + energy_quench: 0., + energy_plain: 0., + energy_sub: 0., + gather: Gather::default(), + scope: [[0.; 4]; SCOPE_LEN], + scope_at: 0, + }) + } + pub fn channels(&self) -> usize { + self.channels + } + pub fn latency_samples(&self) -> u32 { + Oversampler::latency() as u32 + } + pub fn settings(&self) -> Settings { + self.settings + } + pub fn set_settings(&mut self, s: Settings) -> Result<(), &'static str> { + s.validate()?; + if s != self.settings || !self.primed { + self.coefs = Coefs::new(self.rate, &s); + } + self.settings = s; + if !self.primed { + // The first settings after a start take effect at once instead of ramping. + self.drive = db_to_gain(s.drive); + self.ceiling = db_to_gain(s.ceiling); + self.bypass = if s.bypass { 1. } else { 0. }; + self.primed = true; + } + Ok(()) + } + pub fn reset(&mut self) { + for c in &mut self.channel { + c.reset(); + } + self.dry_at = 0; + self.energy_quench = 0.; + self.energy_plain = 0.; + self.energy_sub = 0.; + self.gather = Gather::default(); + self.scope = [[0.; 4]; SCOPE_LEN]; + self.scope_at = 0; + self.primed = false; + let s = self.settings; + let _ = self.set_settings(s); + } + + pub fn process_sample(&mut self, x: [f32; 2], monitor: Monitor) -> [f32; 2] { + let s = self.settings; + self.drive += self.smooth * (db_to_gain(s.drive) - self.drive); + self.ceiling += self.smooth * (db_to_gain(s.ceiling) - self.ceiling); + self.bypass += self.fade * (if s.bypass { 1. } else { 0. } - self.bypass); + let (c, k, drive) = (self.ceiling, self.coefs, self.drive); + let mut out = [0.; 2]; + let mut point = [f32::MAX, f32::MIN, 0., 0.]; + let n = self.channel[0].dry.len(); + for (ch, &input) in x.iter().enumerate().take(self.channels) { + let chan = &mut self.channel[ch]; + let driven = input * drive; + self.gather.input = self.gather.input.max(driven.abs()); + let up = chan.os.up(driven); + let mut picked = [0.; FACTOR]; + for (j, &v) in up.iter().enumerate() { + let low = lr4(&mut chan.low, &k.low, v); + let high = lr4(&mut chan.high, &k.high, v); + // The sub's held peak decides the top's room. + let a = low.abs(); + if a >= chan.env { + chan.env = a; + chan.hold_left = k.hold; + } else if chan.hold_left > 0 { + chan.hold_left -= 1; + } else { + chan.env = a.max(chan.env * k.release); + } + let room = (c - chan.env).max(0.); + let top = shape(high, room, k.knee); + let reference = low + high; + let mut y = reference + chan.error.process(&k.high, top - high); + for p in &mut chan.passes { + y += p.process(&k.high, y.clamp(-c, c) - y); + } + // What the passes leave over the ceiling is small; clipping it here, still + // oversampled, leaves the safety clip after the downsampler almost idle. + let y = y.clamp(-c, c); + let plain = shape(reference, c, k.knee); + let lq = lr4(&mut chan.meter_quench, &k.low, y - reference); + let lp = lr4(&mut chan.meter_plain, &k.low, plain - reference); + self.energy_quench += self.meter * (lq * lq - self.energy_quench); + self.energy_plain += self.meter * (lp * lp - self.energy_plain); + self.energy_sub += self.meter * (low * low - self.energy_sub); + self.gather.sub = self.gather.sub.max(a); + if high.abs() > room { + let ratio = high.abs() / room.max(c * 1e-3); + self.gather.top = self.gather.top.max(ratio); + } + picked[j] = match monitor { + Monitor::Quench => y, + Monitor::Plain => plain, + Monitor::Delta => y - reference, + }; + if ch == 0 { + point[0] = point[0].min(picked[j]); + point[1] = point[1].max(picked[j]); + point[2] = low; + point[3] = room; + } + } + let mut o = chan.os.down(picked); + if monitor != Monitor::Delta && o.abs() > c { + self.gather.safety = self.gather.safety.max(o.abs() / c); + o = o.clamp(-c, c); + } + let dry = chan.dry[(self.dry_at + 1) % n]; + chan.dry[self.dry_at] = input; + o = if self.bypass >= 1. - 1e-6 { + dry + } else { + o + self.bypass * (dry - o) + }; + self.gather.output = self.gather.output.max(o.abs()); + out[ch] = o; + } + self.dry_at = (self.dry_at + 1) % n; + self.scope[self.scope_at] = point; + self.scope_at = (self.scope_at + 1) % SCOPE_LEN; + out + } + + /// Readings since the last call. Never allocates. + pub fn take_analyzer(&mut self) -> AnalyzerFrame { + let g = std::mem::take(&mut self.gather); + let db = |v: f32| if v > 0. { gain_to_db(v) } else { SILENT }; + let relative = |e: f32| { + if self.energy_sub > SUB_FLOOR { + 10. * (e.max(1e-20) / self.energy_sub).log10() + } else { + f32::NAN + } + }; + let mut f = AnalyzerFrame { + input_peak: db(g.input), + output_peak: db(g.output), + sub_peak: db(g.sub), + top_clip: if g.top > 1. { gain_to_db(g.top) } else { 0. }, + safety: if g.safety > 1. { + gain_to_db(g.safety) + } else { + 0. + }, + low_quench: relative(self.energy_quench), + low_plain: relative(self.energy_plain), + ceiling: self.settings.ceiling, + latency: self.latency_samples(), + sample_rate: self.rate, + ..AnalyzerFrame::default() + }; + for i in 0..SCOPE { + let (mut lo, mut hi) = (f32::MAX, f32::MIN); + let mut last = [0.; 4]; + for j in 0..SCOPE_STEP { + let v = self.scope[(self.scope_at + i * SCOPE_STEP + j) % SCOPE_LEN]; + lo = lo.min(v[0]); + hi = hi.max(v[1]); + last = v; + } + f.scope_min[i] = if lo <= hi { lo } else { 0. }; + f.scope_max[i] = if lo <= hi { hi } else { 0. }; + f.scope_sub[i] = last[2]; + f.scope_room[i] = last[3]; + } + f + } +} diff --git a/plugins/quench/core/src/settings.rs b/plugins/quench/core/src/settings.rs new file mode 100644 index 0000000..a51b9a5 --- /dev/null +++ b/plugins/quench/core/src/settings.rs @@ -0,0 +1,58 @@ +//! Host-independent controls. Levels in dB, times in milliseconds, amounts in percent. +use serde::{Deserialize, Serialize}; + +pub const DRIVE_MAX: f32 = 24.; +pub const CEILING_MIN: f32 = -12.; +pub const SPLIT_MIN: f32 = 40.; +pub const SPLIT_MAX: f32 = 300.; +pub const HOLD_MIN: f32 = 10.; +pub const HOLD_MAX: f32 = 300.; + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)] +#[serde(deny_unknown_fields)] +pub struct Settings { + /// Gain into the clipper. + pub drive: f32, + /// Highest output peak, in dBFS. + pub ceiling: f32, + /// Everything below this frequency is the sub: it passes without clipping. + pub split: f32, + /// How long the sub's peak keeps its headroom reserved. Longer than half a period of the + /// lowest note keeps the top's clip level steady through the sub's cycle. + pub hold: f32, + /// Knee of the top's clipper: 0 % is a hard clip, 100 % a soft curve from the start. + pub soft: f32, + pub bypass: bool, +} +impl Default for Settings { + fn default() -> Self { + Self { + drive: 0., + ceiling: -0.3, + split: 120., + hold: 60., + soft: 0., + bypass: false, + } + } +} +impl Settings { + pub fn validate(&self) -> Result<(), &'static str> { + let finite = [self.drive, self.ceiling, self.split, self.hold, self.soft] + .iter() + .all(|v| v.is_finite()); + if !finite { + return Err("non-finite setting"); + } + let ok = (0.0..=DRIVE_MAX).contains(&self.drive) + && (CEILING_MIN..=0.).contains(&self.ceiling) + && (SPLIT_MIN..=SPLIT_MAX).contains(&self.split) + && (HOLD_MIN..=HOLD_MAX).contains(&self.hold) + && (0.0..=100.).contains(&self.soft); + if ok { + Ok(()) + } else { + Err("setting out of range") + } + } +} diff --git a/plugins/quench/core/tests/dsp.rs b/plugins/quench/core/tests/dsp.rs new file mode 100644 index 0000000..ad5663f --- /dev/null +++ b/plugins/quench/core/tests/dsp.rs @@ -0,0 +1,300 @@ +use quench_core::{shape, Engine, Monitor, Settings}; +use std::f64::consts::TAU; + +const RATE: f32 = 48000.; +/// Partials of the top: not harmonics of the sub, so their clipping products can be told +/// apart from the sub's own harmonics. +const TOPS: [f64; 5] = [437., 611., 1013., 1597., 2399.]; + +fn top(t: f64) -> f64 { + TOPS.iter() + .enumerate() + .map(|(i, f)| (TAU * f * t + i as f64).sin()) + .sum::() + / 4.2 +} +/// Mono render of `seconds` of `signal`, returned as the left channel. +fn render( + engine: &mut Engine, + seconds: f32, + monitor: Monitor, + signal: impl Fn(f64) -> f64, +) -> Vec { + let n = (seconds * RATE) as usize; + (0..n) + .map(|i| { + let v = signal(i as f64 / RATE as f64) as f32; + engine.process_sample([v, v], monitor)[0] + }) + .collect() +} +fn engine(s: Settings) -> Engine { + let mut e = Engine::new(RATE, 2).unwrap(); + e.set_settings(s).unwrap(); + e +} +/// Amplitude of `hz` over a whole number of its periods at the end of `x`. +fn amplitude(x: &[f32], hz: f64) -> f64 { + let n = (RATE as f64 / hz * (0.5 * hz).floor()) as usize; + let x = &x[x.len() - n..]; + let (mut re, mut im) = (0., 0.); + for (i, &v) in x.iter().enumerate() { + let a = TAU * hz * i as f64 / RATE as f64; + re += v as f64 * a.cos(); + im += v as f64 * a.sin(); + } + 2. * (re * re + im * im).sqrt() / n as f64 +} +/// Hann-windowed spectrum magnitude of the last half second, 2 Hz bins up to `top_bin`. +fn spectrum(x: &[f32], top_bin: usize) -> Vec { + let n = RATE as usize / 2; + let x = &x[x.len() - n..]; + let w: Vec = (0..n) + .map(|i| 0.5 - 0.5 * (TAU * i as f64 / n as f64).cos()) + .collect(); + let norm: f64 = w.iter().sum(); + (0..=top_bin) + .map(|b| { + let (mut re, mut im) = (0., 0.); + for i in 0..n { + let a = TAU * b as f64 * i as f64 / n as f64; + re += x[i] as f64 * w[i] * a.cos(); + im += x[i] as f64 * w[i] * a.sin(); + } + 2. * (re * re + im * im).sqrt() / norm + }) + .collect() +} +/// Everything below 110 Hz except the 50 Hz sub, against the sub, in dB. +fn low_junk(x: &[f32]) -> f64 { + let s = spectrum(x, 55); + let junk: f64 = s + .iter() + .enumerate() + .filter(|(b, _)| !(22..=28).contains(b) && *b > 0) + .map(|(_, v)| v * v) + .sum(); + let sub: f64 = s[22..=28].iter().map(|v| v * v).sum(); + 10. * (junk / sub).log10() +} +fn db(r: f64) -> f64 { + 20. * r.log10() +} + +#[test] +fn below_the_ceiling_the_signal_passes_unchanged() { + let mut e = engine(Settings::default()); + let signal = |t: f64| 0.3 * (TAU * 50. * t).sin() + 0.2 * (TAU * 1000. * t).sin(); + let out = render(&mut e, 1., Monitor::Quench, signal); + for (hz, a) in [(50., 0.3), (1000., 0.2)] { + let got = db(amplitude(&out, hz) / a); + assert!(got.abs() < 0.02, "{hz} Hz: {got:.3} dB"); + } + let f = e.take_analyzer(); + assert_eq!(f.top_clip, 0.); + assert_eq!(f.safety, 0.); + let mut e = engine(Settings::default()); + let delta = render(&mut e, 0.2, Monitor::Delta, signal); + assert!(delta.iter().all(|v| v.abs() < 1e-4)); +} + +#[test] +fn the_output_never_passes_the_ceiling() { + let mut seed = 1u32; + let noise: Vec = (0..RATE as usize) + .map(|_| { + seed = seed.wrapping_mul(1664525).wrapping_add(1013904223); + (seed >> 8) as f64 / (1u32 << 24) as f64 * 2. - 1. + }) + .collect(); + for ceiling in [-6., -0.3, 0.] { + for soft in [0., 50., 100.] { + for monitor in [Monitor::Quench, Monitor::Plain] { + let mut e = engine(Settings { + drive: 24., + ceiling, + soft, + ..Settings::default() + }); + let out = render(&mut e, 1., monitor, |t| { + let i = ((t * RATE as f64) as usize).min(noise.len() - 1); + 0.4 * (TAU * 41. * t).sin() + 0.3 * top(t) + 0.2 * noise[i] + }); + let limit = 10f32.powf(ceiling / 20.) * (1. + 1e-6); + let peak = out.iter().fold(0f32, |m, v| m.max(v.abs())); + assert!( + peak <= limit, + "{ceiling} dB, soft {soft}, {monitor:?}: {peak}" + ); + } + } + } +} + +#[test] +fn the_sub_keeps_its_level_and_the_low_band_stays_clean() { + // A quiet sub under a top that peaks far over the ceiling: the hard case for a clipper. + let signal = |t: f64| 0.3 * (TAU * 50. * t).sin() + 2. * top(t); + let mut results = Vec::new(); + for monitor in [Monitor::Quench, Monitor::Plain] { + let mut e = engine(Settings::default()); + let out = render(&mut e, 1.5, monitor, signal); + let sub = db(amplitude(&out, 50.) / 0.3); + results.push((sub, low_junk(&out))); + } + let [(q_sub, q_junk), (p_sub, p_junk)] = [results[0], results[1]]; + assert!(q_sub.abs() < 0.2, "Quench changes the sub by {q_sub:.2} dB"); + assert!( + p_sub < -0.8, + "a plain clip should squash the sub: {p_sub:.2} dB" + ); + assert!( + q_junk < p_junk - 10., + "low-band products: Quench {q_junk:.1} dB, plain {p_junk:.1} dB" + ); +} + +#[test] +fn the_meter_shows_how_much_less_the_low_band_changes() { + let mut e = engine(Settings::default()); + render(&mut e, 1.5, Monitor::Quench, |t| { + 0.3 * (TAU * 50. * t).sin() + 2. * top(t) + }); + let f = e.take_analyzer(); + assert!( + f.low_quench < f.low_plain - 10., + "Quench {:.1} dB, plain {:.1} dB", + f.low_quench, + f.low_plain + ); + assert!(f.top_clip > 6.); + // The oversampled clip leaves the safety clip after the downsampler almost idle. + assert!(f.safety < 0.2, "{}", f.safety); + let mut e = engine(Settings::default()); + render(&mut e, 0.5, Monitor::Quench, |t| { + 0.5 * (TAU * 1000. * t).sin() + }); + assert!( + e.take_analyzer().low_quench.is_nan(), + "no sub, nothing to compare" + ); +} + +#[test] +fn a_sub_over_the_ceiling_leaves_no_room_and_is_still_limited() { + let mut e = engine(Settings { + ceiling: -6., + ..Settings::default() + }); + let out = render(&mut e, 1., Monitor::Quench, |t| { + 0.8 * (TAU * 50. * t).sin() + 0.3 * top(t) + }); + let f = e.take_analyzer(); + assert!(f.sub_peak > -6., "{}", f.sub_peak); + assert!(f.safety > 0.); + let peak = out.iter().fold(0f32, |m, v| m.max(v.abs())); + assert!(peak <= 0.5012 * (1. + 1e-6)); + let room = f.scope_room.iter().fold(0f32, |m, v| m.max(*v)); + assert_eq!(room, 0., "the held sub peak is over the ceiling"); +} + +#[test] +fn the_held_peak_keeps_the_tops_room_steady_through_the_cycle() { + let room_ripple = |hold: f32, hz: f64| { + let mut e = engine(Settings { + hold, + ..Settings::default() + }); + render(&mut e, 1., Monitor::Quench, |t| { + 0.5 * (TAU * hz * t).sin() + 0.3 * top(t) + }); + let f = e.take_analyzer(); + let (lo, hi) = f + .scope_room + .iter() + .fold((f32::MAX, f32::MIN), |(a, b), v| (a.min(*v), b.max(*v))); + (hi - lo) / hi + }; + // 30 Hz: the sub peaks every 16.7 ms. + let held = room_ripple(60., 30.); + let short = room_ripple(10., 30.); + assert!(held < 0.01, "{held}"); + assert!(short > 0.1, "{short}"); +} + +#[test] +fn bypass_is_the_input_delayed_by_the_latency() { + let mut e = engine(Settings { + bypass: true, + drive: 12., + ..Settings::default() + }); + let latency = e.latency_samples() as usize; + let x: Vec = (0..4800) + .map(|i| (0.9 * (TAU * 50. * i as f64 / RATE as f64).sin()) as f32 + 0.5) + .collect(); + let out: Vec = x + .iter() + .map(|&v| e.process_sample([v, v], Monitor::Quench)[0]) + .collect(); + for i in latency..x.len() { + assert_eq!(out[i], x[i - latency]); + } +} + +#[test] +fn mono_works_and_the_shape_never_passes_its_limit() { + let mut e = Engine::new(44100., 1).unwrap(); + e.set_settings(Settings { + drive: 12., + ..Settings::default() + }) + .unwrap(); + for i in 0..44100 { + let v = (TAU * 55. * i as f64 / 44100.).sin() as f32; + let o = e.process_sample([v, 0.], Monitor::Quench); + assert!(o[0].abs() <= 0.9661 && o[1] == 0.); + } + for knee in [0., 0.3, 1.] { + for h in [-5., -1., -0.2, 0., 0.5, 0.99, 3.] { + let y = shape(h, 0.8, knee); + assert!(y.abs() <= 0.8 && y * h >= 0.); + } + } + assert_eq!(shape(0.5, 0.8, 0.), 0.5); + assert_eq!(shape(0.5, 0., 0.), 0.); +} + +#[test] +fn settings_are_validated_and_serialise() { + assert!(Settings::default().validate().is_ok()); + for bad in [ + Settings { + drive: -1., + ..Settings::default() + }, + Settings { + ceiling: 0.5, + ..Settings::default() + }, + Settings { + split: 20., + ..Settings::default() + }, + Settings { + hold: f32::NAN, + ..Settings::default() + }, + ] { + assert!(bad.validate().is_err()); + assert!(Engine::new(RATE, 2).unwrap().set_settings(bad).is_err()); + } + let s = Settings { + drive: 9., + soft: 40., + ..Settings::default() + }; + let json = serde_json::to_string(&s).unwrap(); + assert_eq!(serde_json::from_str::(&json).unwrap(), s); + assert!(serde_json::from_str::(r#"{"drive":0,"oops":1}"#).is_err()); +} diff --git a/plugins/quench/core/tests/realtime.rs b/plugins/quench/core/tests/realtime.rs new file mode 100644 index 0000000..9d23878 --- /dev/null +++ b/plugins/quench/core/tests/realtime.rs @@ -0,0 +1,65 @@ +use quench_core::{Engine, Monitor, Settings}; +use std::{ + alloc::{GlobalAlloc, Layout, System}, + cell::Cell, +}; + +struct CheckedAllocator; +thread_local! { + static CHECK:Cell=const {Cell::new(false)}; + static OPERATIONS:Cell=const {Cell::new(0)}; +} +fn record() { + if CHECK.try_with(Cell::get).unwrap_or(false) { + let _ = OPERATIONS.try_with(|n| n.set(n.get() + 1)); + } +} +unsafe impl GlobalAlloc for CheckedAllocator { + unsafe fn alloc(&self, layout: Layout) -> *mut u8 { + record(); + unsafe { System.alloc(layout) } + } + unsafe fn dealloc(&self, pointer: *mut u8, layout: Layout) { + record(); + unsafe { System.dealloc(pointer, layout) } + } + unsafe fn realloc(&self, pointer: *mut u8, layout: Layout, size: usize) -> *mut u8 { + record(); + unsafe { System.realloc(pointer, layout, size) } + } +} +#[global_allocator] +static ALLOCATOR: CheckedAllocator = CheckedAllocator; + +#[test] +fn processing_settings_monitors_and_analysis_do_not_allocate_or_free() { + let mut engine = Engine::new(48000., 2).unwrap(); + let mut settings = Settings { + drive: 12., + ..Settings::default() + }; + engine.set_settings(settings).unwrap(); + let monitors = [Monitor::Quench, Monitor::Plain, Monitor::Delta]; + CHECK.with(|v| v.set(true)); + for i in 0..96000 { + if i % 4800 == 0 { + let step = i / 4800; + settings.split = 60. + 20. * (step % 6) as f32; + settings.hold = 20. + 40. * (step % 3) as f32; + settings.soft = 25. * (step % 5) as f32; + settings.ceiling = -3. * (step % 3) as f32; + settings.bypass = step % 7 == 6; + engine.set_settings(settings).unwrap(); + } + let t = i as f32 / 48000.; + let x = (std::f32::consts::TAU * 45. * t).sin() * 0.5 + + (std::f32::consts::TAU * 733. * t).sin() * 0.5; + std::hint::black_box(engine.process_sample([x, -x], monitors[(i / 9600) % 3])); + if i % 1600 == 0 { + std::hint::black_box(engine.take_analyzer()); + } + } + engine.reset(); + CHECK.with(|v| v.set(false)); + assert_eq!(OPERATIONS.with(Cell::get), 0); +} diff --git a/plugins/quench/plugin/Cargo.lock b/plugins/quench/plugin/Cargo.lock new file mode 100644 index 0000000..0c34360 --- /dev/null +++ b/plugins/quench/plugin/Cargo.lock @@ -0,0 +1,2381 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ab_glyph" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" + +[[package]] +name = "addr2line" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e567177890eb1617b1f774005b66b26b2377afd138a2ca37aae7d8f0c81429d4" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "android-activity" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd" +dependencies = [ + "android-properties", + "bitflags 2.13.2", + "cc", + "jni", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "num_enum", + "thiserror 2.0.21", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "anymap3" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5dfbc6d8d2675589ccbe4d0fd61df2419075625f8c1a62325e718e2b0049f9" + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "atomic_float" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62af46d040ba9df09edc6528dae9d8e49f5f3e82f55b7d2ec31a733c38dbc49d" + +[[package]] +name = "atomic_refcell" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21e4227379beff4205943696e6c3e0cd809bacdf3f0edd6e3dd153e2269571a4" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "backtrace" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f4220217f3288537b83684130f42fad43320b1c3b805f1910d683d52ded24f" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link", +] + +[[package]] +name = "baseview" +version = "0.1.0" +source = "git+https://github.com/RustAudio/baseview.git?rev=9a0b42c09d712777b2edb4c5e0cb6baf21e988f0#9a0b42c09d712777b2edb4c5e0cb6baf21e988f0" +dependencies = [ + "cocoa", + "core-foundation", + "keyboard-types", + "nix", + "objc", + "raw-window-handle 0.5.2", + "uuid", + "winapi", + "x11", + "x11rb", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a1f896587b6f2c069c73d2f0913e2d590c3990285cd2f0b6aa02b786b4c679c" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.13.2", + "log", + "polling", + "rustix 0.38.44", + "slab", + "thiserror 1.0.69", +] + +[[package]] +name = "cc" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ff2a8126fff0f8c839080d619675a585e61720bb12d2baceae45769fd66f155" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" + +[[package]] +name = "cfg_aliases" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "clap-sys" +version = "0.5.0" +source = "git+https://github.com/micahrj/clap-sys.git?rev=25d7f53fdb6363ad63fbd80049cb7a42a97ac156#25d7f53fdb6363ad63fbd80049cb7a42a97ac156" + +[[package]] +name = "clipboard-win" +version = "5.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "052af7878466feccda12ba7a6a67d019d712f296809559b47c12c8cc196d3a9a" +dependencies = [ + "error-code", +] + +[[package]] +name = "cocoa" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics 0.22.3", + "foreign-types 0.3.2", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" +dependencies = [ + "bitflags 1.3.2", + "block", + "core-foundation", + "core-graphics-types", + "libc", + "objc", +] + +[[package]] +name = "combine" +version = "4.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4356eba6976435498d05a311ee9fc486da3bc81c200d3f0d7dd9703b41913f92" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "common-dsp" +version = "0.1.0" + +[[package]] +name = "common-ui" +version = "0.1.0" +dependencies = [ + "egui", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "copypasta" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e6811e17f81fe246ef2bc553f76b6ee6ab41a694845df1d37e52a92b7bbd38a" +dependencies = [ + "clipboard-win", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "x11-clipboard", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types 0.3.2", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types 0.5.0", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "crossbeam" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e71406cd8807725f7ac2f999a4cdd32e98f829fdf65f528343cebf945e41df1e" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98b0cc327b5bc766e7fda9c9260cc0fa81b43a8e240440422dff70788e3f9ef1" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03e8bd762f7479489c70ed6c768ddca99d7296857de437a68dcb2a94365b3fae" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" + +[[package]] +name = "cursor-icon" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" + +[[package]] +name = "deranged" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e9de72ce2ad1f90dc62fa25f0f430ef85eb4b0d8fa0be4f30373bc40a21d28e" + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dlib" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" +dependencies = [ + "libloading", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" + +[[package]] +name = "ecolor" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc4feb366740ded31a004a0e4452fbf84e80ef432ecf8314c485210229672fd1" +dependencies = [ + "bytemuck", + "emath", +] + +[[package]] +name = "egui" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dd34cec49ab55d85ebf70139cb1ccd29c977ef6b6ba4fe85489d6877ee9ef3" +dependencies = [ + "ahash", + "bitflags 2.13.2", + "emath", + "epaint", + "nohash-hasher", + "profiling", +] + +[[package]] +name = "egui-baseview" +version = "0.5.0" +source = "git+https://github.com/BillyDM/egui-baseview.git?rev=ec70c3fe6b2f070dcacbc22924431edbe24bd1c0#ec70c3fe6b2f070dcacbc22924431edbe24bd1c0" +dependencies = [ + "baseview", + "copypasta", + "egui", + "egui_glow", + "keyboard-types", + "log", + "open", + "raw-window-handle 0.5.2", + "thiserror 2.0.21", +] + +[[package]] +name = "egui_glow" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "910906e3f042ea6d2378ec12a6fd07698e14ddae68aed2d819ffe944a73aab9e" +dependencies = [ + "ahash", + "bytemuck", + "egui", + "glow", + "log", + "memoffset 0.9.1", + "profiling", + "wasm-bindgen", + "web-sys", + "winit", +] + +[[package]] +name = "emath" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e4cadcff7a5353ba72b7fea76bf2122b5ebdbc68e8155aa56dfdea90083fe1b" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "epaint" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fcc0f5a7c613afd2dee5e4b30c3e6acafb8ad6f0edb06068811f708a67c562" +dependencies = [ + "ab_glyph", + "ahash", + "bytemuck", + "ecolor", + "emath", + "epaint_default_fonts", + "nohash-hasher", + "parking_lot", + "profiling", +] + +[[package]] +name = "epaint_default_fonts" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7e7a64c02cf7a5b51e745a9e45f60660a286f151c238b9d397b3e923f5082f" + +[[package]] +name = "equivalent" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "error-code" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5343afd4a8365a643ac588dab4cf234a190c7f6c88c9f6dd6ffe00837661b7" + +[[package]] +name = "find-msvc-tools" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c66915cc5391097de7a2b0b972e8505aa33c0df401fd3a6811dbdb32881ba48" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] + +[[package]] +name = "gethostname" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +dependencies = [ + "rustix 1.1.6", + "windows-link", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi", +] + +[[package]] +name = "gimli" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1033caf0b349c518623b5396bfb2cf0bddf44f0306d543a250e5743297aafd10" + +[[package]] +name = "glow" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" + +[[package]] +name = "indexmap" +version = "2.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys 0.4.1", + "log", + "simd_cesu8", + "thiserror 2.0.21", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn 2.0.119", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom 0.4.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dc09d2154098bbf4ef54eab6b117a3c24cbbffe94046b16ee6d6d4510584d3a" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "keyboard-types" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7668b7cff6a51fe61cdde64cd27c8a220786f399501b57ebe36f7d8112fd68" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "libc" +version = "0.2.191" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a" + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[package]] +name = "libredox" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d" +dependencies = [ + "bitflags 2.13.2", + "libc", + "plain", + "redox_syscall 0.9.5", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d15f86d12da44cd8d4ec3c73984537eb7f4cadcb9776a575a0a8a05ca11005c" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "midi-consts" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f2dd5c7f8aaf48a76e389068ab25ed80bdbc226b887f9013844c415698c9952" + +[[package]] +name = "miniz_oxide" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" +dependencies = [ + "adler2", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.13.2", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle 0.6.2", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "nih_log" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0cdb52ef79af48ae110401c883bdb9c15e0306a99ab6ecf18bc52068b668e54" +dependencies = [ + "atty", + "log", + "once_cell", + "termcolor", + "time", + "windows", +] + +[[package]] +name = "nih_plug" +version = "0.0.0" +source = "git+https://github.com/robbert-vdh/nih-plug.git?rev=de421011f41a6d10fc8c7a6084e4f4dee0143683#de421011f41a6d10fc8c7a6084e4f4dee0143683" +dependencies = [ + "anyhow", + "anymap3", + "atomic_float", + "atomic_refcell", + "backtrace", + "bitflags 1.3.2", + "cfg-if", + "clap-sys", + "core-foundation", + "crossbeam", + "libc", + "log", + "midi-consts", + "nih_log", + "nih_plug_derive", + "objc", + "parking_lot", + "raw-window-handle 0.5.2", + "serde", + "serde_json", + "widestring", + "windows", +] + +[[package]] +name = "nih_plug_derive" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/nih-plug.git?rev=de421011f41a6d10fc8c7a6084e4f4dee0143683#de421011f41a6d10fc8c7a6084e4f4dee0143683" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "nih_plug_egui" +version = "0.0.0" +source = "git+https://github.com/robbert-vdh/nih-plug.git?rev=de421011f41a6d10fc8c7a6084e4f4dee0143683#de421011f41a6d10fc8c7a6084e4f4dee0143683" +dependencies = [ + "baseview", + "crossbeam", + "egui-baseview", + "nih_plug", + "parking_lot", + "raw-window-handle 0.5.2", + "serde", +] + +[[package]] +name = "nix" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" +dependencies = [ + "bitflags 1.3.2", + "cc", + "cfg-if", + "libc", + "memoffset 0.6.5", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "num_threads" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cabcc654086861f9e1bc5115258de62ef92c79b20f4615a1b0cc57c4e82027d4" +dependencies = [ + "libc", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d5490aaf8f1d7cf7688dfa9b0ce07900e168852c45cd2c03f534dfd27cfd0b" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.13.2", + "block2", + "libc", + "objc2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2", + "objc2", + "objc2-contacts", + "objc2-foundation", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.13.2", + "block2", + "dispatch", + "libc", + "objc2", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2", + "objc2", + "objc2-app-kit", + "objc2-foundation", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-image", + "objc2-core-location", + "objc2-foundation", + "objc2-link-presentation", + "objc2-quartz-core", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "object" +version = "0.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd229a0361b9d0d4396176e02d65897f487eebeab7caa6d443855ee152ca0b9c" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "open" +version = "5.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d8c8b8e725ad26404d6896eb2f064294a0a7b4f1d9120210d85544684c4ca95" +dependencies = [ + "is-wsl", + "libc", +] + +[[package]] +name = "orbclient" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5df339f526ea9a60e371768d50efc2f2508c7203290731565d1f7a6f71d21747" +dependencies = [ + "libc", + "libredox", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.5.3", + "pin-project-lite", + "rustix 1.1.6", + "windows-sys 0.61.2", +] + +[[package]] +name = "powerfmt" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a6394b9e965e73d0a289ee54f589087e2c676aedf60885baf52c76b771e4958" + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" + +[[package]] +name = "quench" +version = "0.1.0" +dependencies = [ + "clap-sys", + "crossbeam-queue", + "nih_plug", + "nih_plug_egui", + "quench-core", + "quench-ui", + "serde_json", +] + +[[package]] +name = "quench-core" +version = "0.1.0" +dependencies = [ + "common-dsp", + "serde", +] + +[[package]] +name = "quench-ui" +version = "0.1.0" +dependencies = [ + "common-dsp", + "common-ui", + "egui", + "quench-core", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.2", +] + +[[package]] +name = "redox_syscall" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "580c875845b41ecb1564ad1ae4703044cef774145e3d7a94dc2b3fa7c97868fd" +dependencies = [ + "bitflags 2.13.2", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b74b56ffa8bb2830709a538c2cbcae9aa062db0d2a42563bfb09bdaae44020eb" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.13.2", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5e76742e5294153d4dde1207dbec5bdd81eef6fabdc0d2118babadabfd858aa" +dependencies = [ + "bitflags 2.13.2", + "errno", + "libc", + "linux-raw-sys 0.12.1", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "serde_json" +version = "1.0.154" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "simd_cesu8" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" +dependencies = [ + "rustc_version", + "simdutf8", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "slotmap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.16.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0d5d4b1981b8bbbb7aed204cae5726d683d5d6ac7e74ec54122ea28f315e7c8" + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl 2.0.21", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "time" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" +dependencies = [ + "deranged", + "libc", + "num-conv", + "num_threads", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tokio" +version = "1.54.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b52fd3255258d26fac7264ab5a76b53c13367136dc011d3d6ad4f8ed070396a3" +dependencies = [ + "pin-project-lite", +] + +[[package]] +name = "toml_datetime" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b86d767906c6c42421dcba507eb9d203e779497710a47782a224bb871653053" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.18+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec6e78bd70db9420d8d212fa9dc97f116448a1ceff5d00eabb991d407e21396" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.1.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baa693a8032d7e1cada7d0041e96126df243179ff061456783ac7f12bda4744c" +dependencies = [ + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" + +[[package]] +name = "ttf-parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" + +[[package]] +name = "unicode-ident" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0181c14ddd6c7b8b0b0132a5f1ea2f32be0d893cd3ea97b6e3b28886b8a3d1c" +dependencies = [ + "cfg-if", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e14e0327cb5368ad60ccb22d04a9827a693c95a926d8d125e9fa39e0baec501" +dependencies = [ + "js-sys", + "tokio", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e931a02a39abdbf66966fc35902b5ed58344750a70885bed4ebb3d8eaf28ed9" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ca4b54280e455bd831e33a6b8e734baf432fe63fbc35c42ac14ce67a043a53a" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 3.0.9", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b1f9c3798725016c6ee5f2f57869ec0831e8bbc0ab0310a86e787e97f41389e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7d179596ff5ec0f6de4db64d54011bde6289cc49603d3a6e4ce3f329207ab88" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "widestring" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winit" +version = "0.30.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6755fa58a9f8350bd1e472d4c3fcc25f824ec358933bba33306d0b63df5978d" +dependencies = [ + "android-activity", + "atomic-waker", + "bitflags 2.13.2", + "block2", + "bytemuck", + "calloop", + "cfg_aliases", + "concurrent-queue", + "core-foundation", + "core-graphics 0.23.2", + "cursor-icon", + "dpi", + "js-sys", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "orbclient", + "percent-encoding", + "pin-project", + "raw-window-handle 0.6.2", + "redox_syscall 0.4.1", + "rustix 0.38.44", + "smol_str", + "tracing", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "web-time", + "windows-sys 0.52.0", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + +[[package]] +name = "winnow" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3b93199df0ab874cdf0c6a94f0a0dc3423fe41f1cafb62b8bd7b1deb277aef" +dependencies = [ + "memchr", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-clipboard" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "662d74b3d77e396b8e5beb00b9cad6a9eccf40b2ef68cc858784b14c41d535a3" +dependencies = [ + "libc", + "x11rb", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading", + "once_cell", + "rustix 1.1.6", + "x11rb-protocol", + "xcursor", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" + +[[package]] +name = "xcursor" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "163b33ed8786455e2fa5d72f554057ce3f3182425434f756cd39c99839d88e23" + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.13.2", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "zerocopy" +version = "0.8.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5fe1f8f1b06191a00962174c61aa5005e0bb391a6d80d07e24d115c01a92ed8" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863ad3ac83293fb4d740aedbfdc9240dd8d1a50c1099acd76ce80ce7c7230c7f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/plugins/quench/plugin/Cargo.toml b/plugins/quench/plugin/Cargo.toml new file mode 100644 index 0000000..076cbef --- /dev/null +++ b/plugins/quench/plugin/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "quench" +version = "0.1.0" +edition = "2021" +license = "ISC" + +[workspace] + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +nih_plug = { git = "https://github.com/robbert-vdh/nih-plug.git", rev = "de421011f41a6d10fc8c7a6084e4f4dee0143683", default-features = false } +nih_plug_egui = { git = "https://github.com/robbert-vdh/nih-plug.git", rev = "de421011f41a6d10fc8c7a6084e4f4dee0143683" } +quench-core = { path = "../core" } +quench-ui = { path = "../ui" } +crossbeam-queue = "0.3" + +[dev-dependencies] +clap-sys = { git = "https://github.com/micahrj/clap-sys.git", rev = "25d7f53fdb6363ad63fbd80049cb7a42a97ac156" } +serde_json = "1" + +[profile.release] +lto = "thin" +strip = "symbols" diff --git a/plugins/quench/plugin/src/lib.rs b/plugins/quench/plugin/src/lib.rs new file mode 100644 index 0000000..b8e3a61 --- /dev/null +++ b/plugins/quench/plugin/src/lib.rs @@ -0,0 +1,204 @@ +//! CLAP audio effect. All DSP state is owned by the processing thread. +mod params; +use crossbeam_queue::ArrayQueue; +use nih_plug::prelude::*; +use nih_plug_egui::{create_egui_editor, egui}; +use params::{QuenchParams, FLOATS}; +use quench_core::{AnalyzerFrame, Engine, Monitor}; +use std::sync::{ + atomic::{AtomicU8, Ordering}, + Arc, +}; + +struct Shared { + analyzer: ArrayQueue, + /// The editor's listen choice: 0 Quench, 1 Plain, 2 Delta. + monitor: AtomicU8, +} +fn encode(m: Monitor) -> u8 { + match m { + Monitor::Quench => 0, + Monitor::Plain => 1, + Monitor::Delta => 2, + } +} +fn decode(v: u8) -> Monitor { + match v { + 1 => Monitor::Plain, + 2 => Monitor::Delta, + _ => Monitor::Quench, + } +} +struct EditorData { + ui: quench_ui::State, + gestures: [bool; FLOATS], +} +pub struct Quench { + params: Arc, + shared: Arc, + engine: Option, + publish_count: usize, + publish_interval: usize, +} +impl Default for Quench { + fn default() -> Self { + Self { + params: Arc::new(QuenchParams::default()), + shared: Arc::new(Shared { + analyzer: ArrayQueue::new(2), + monitor: AtomicU8::new(0), + }), + engine: None, + publish_count: 0, + publish_interval: 1600, + } + } +} +impl Plugin for Quench { + const NAME: &'static str = "Quench"; + const VENDOR: &'static str = "Bass Foundry"; + const URL: &'static str = ""; + const EMAIL: &'static str = ""; + const VERSION: &'static str = env!("CARGO_PKG_VERSION"); + const AUDIO_IO_LAYOUTS: &'static [AudioIOLayout] = &[ + AudioIOLayout { + main_input_channels: NonZeroU32::new(2), + main_output_channels: NonZeroU32::new(2), + ..AudioIOLayout::const_default() + }, + AudioIOLayout { + main_input_channels: NonZeroU32::new(1), + main_output_channels: NonZeroU32::new(1), + ..AudioIOLayout::const_default() + }, + ]; + const SAMPLE_ACCURATE_AUTOMATION: bool = false; + type SysExMessage = (); + type BackgroundTask = (); + fn params(&self) -> Arc { + self.params.clone() + } + fn editor(&mut self, _: AsyncExecutor) -> Option> { + let params = self.params.clone(); + let shared = self.shared.clone(); + create_egui_editor( + params.editor.clone(), + EditorData { + ui: quench_ui::State::default(), + gestures: [false; FLOATS], + }, + |ctx, data| { + data.ui.monitor = Monitor::Quench; + quench_ui::style(ctx); + }, + move |ctx, setter, data| { + while let Some(frame) = shared.analyzer.pop() { + data.ui.accept_frame(frame); + } + let before = params.settings(); + let mut edited = before; + nih_plug_egui::resizable_window::ResizableWindow::new("quench-editor") + .min_size(egui::vec2( + quench_ui::WIDTH as f32 - 80., + quench_ui::HEIGHT as f32 - 40., + )) + .show(ctx, ¶ms.editor, |ui| { + quench_ui::show(ui, &mut edited, &mut data.ui) + }); + params.apply( + setter, + &before, + &edited, + data.ui.gesture_active, + &mut data.gestures, + ); + // The monitor is a listen choice only: never saved and never left on after + // the editor closes. + shared + .monitor + .store(encode(data.ui.monitor), Ordering::Release); + ctx.request_repaint_after(std::time::Duration::from_millis(40)); + }, + ) + } + fn initialize( + &mut self, + layout: &AudioIOLayout, + config: &BufferConfig, + context: &mut impl InitContext, + ) -> bool { + let Ok(mut engine) = Engine::new( + config.sample_rate, + layout.main_input_channels.map_or(0, |v| v.get() as usize), + ) else { + return false; + }; + if engine.set_settings(self.params.settings()).is_err() { + return false; + } + context.set_latency_samples(engine.latency_samples()); + self.shared.monitor.store(0, Ordering::Release); + self.publish_interval = (config.sample_rate / 30.) as usize; + self.engine = Some(engine); + true + } + fn reset(&mut self) { + if let Some(e) = self.engine.as_mut() { + e.reset(); + } + self.publish_count = 0; + } + fn process( + &mut self, + buffer: &mut Buffer, + _: &mut AuxiliaryBuffers, + _: &mut impl ProcessContext, + ) -> ProcessStatus { + let Some(engine) = self.engine.as_mut() else { + return ProcessStatus::Normal; + }; + let _ = engine.set_settings(self.params.settings()); + let monitor = if self.params.editor.is_open() { + decode(self.shared.monitor.load(Ordering::Acquire)) + } else { + Monitor::Quench + }; + for mut sample in buffer.iter_samples() { + let x = [ + *sample.get_mut(0).unwrap(), + if engine.channels() == 2 { + *sample.get_mut(1).unwrap() + } else { + 0. + }, + ]; + let out = engine.process_sample(x, monitor); + for (c, value) in sample.into_iter().enumerate() { + *value = out[c]; + } + self.publish_count += 1; + if self.publish_count >= self.publish_interval { + let _ = self.shared.analyzer.force_push(engine.take_analyzer()); + self.publish_count = 0; + } + } + // The oversampling filters must drain after input stops. + ProcessStatus::KeepAlive + } +} +impl ClapPlugin for Quench { + const CLAP_ID: &'static str = "io.narl.bass-foundry.quench"; + const CLAP_DESCRIPTION: Option<&'static str> = + Some("Clips the top as hard as you like while the sub passes clean"); + const CLAP_MANUAL_URL: Option<&'static str> = None; + const CLAP_SUPPORT_URL: Option<&'static str> = None; + const CLAP_FEATURES: &'static [ClapFeature] = &[ + ClapFeature::AudioEffect, + ClapFeature::Distortion, + ClapFeature::Limiter, + ClapFeature::Mastering, + ClapFeature::Stereo, + ClapFeature::Mono, + ]; +} +nih_export_clap!(Quench); diff --git a/plugins/quench/plugin/src/params.rs b/plugins/quench/plugin/src/params.rs new file mode 100644 index 0000000..ec94683 --- /dev/null +++ b/plugins/quench/plugin/src/params.rs @@ -0,0 +1,108 @@ +use nih_plug::prelude::*; +use nih_plug_egui::EguiState; +use quench_core::{Settings, CEILING_MIN, DRIVE_MAX, HOLD_MAX, HOLD_MIN, SPLIT_MAX, SPLIT_MIN}; +use std::sync::Arc; + +fn linear(name: &str, v: f32, min: f32, max: f32, unit: &'static str) -> FloatParam { + FloatParam::new(name, v, FloatRange::Linear { min, max }).with_unit(unit) +} +fn skewed(name: &str, v: f32, min: f32, max: f32, unit: &'static str) -> FloatParam { + FloatParam::new( + name, + v, + FloatRange::Skewed { + min, + max, + factor: FloatRange::skew_factor(-1.), + }, + ) + .with_unit(unit) +} +/// Continuous controls, in the order of the gesture slots. +pub const FLOATS: usize = 5; + +#[derive(Params)] +pub struct QuenchParams { + #[persist = "editor"] + pub editor: Arc, + #[id = "drive"] + pub drive: FloatParam, + #[id = "ceiling"] + pub ceiling: FloatParam, + #[id = "split"] + pub split: FloatParam, + #[id = "hold"] + pub hold: FloatParam, + #[id = "soft"] + pub soft: FloatParam, + #[id = "bypass"] + pub bypass: BoolParam, +} +impl Default for QuenchParams { + fn default() -> Self { + let d = Settings::default(); + Self { + editor: EguiState::from_size(quench_ui::WIDTH, quench_ui::HEIGHT), + drive: linear("Drive", d.drive, 0., DRIVE_MAX, " dB"), + ceiling: linear("Ceiling", d.ceiling, CEILING_MIN, 0., " dB"), + split: skewed("Split", d.split, SPLIT_MIN, SPLIT_MAX, " Hz"), + hold: skewed("Hold", d.hold, HOLD_MIN, HOLD_MAX, " ms"), + soft: linear("Soft", d.soft, 0., 100., " %"), + bypass: BoolParam::new("Bypass", false).make_bypass(), + } + } +} +impl QuenchParams { + pub fn settings(&self) -> Settings { + Settings { + drive: self.drive.value(), + ceiling: self.ceiling.value(), + split: self.split.value(), + hold: self.hold.value(), + soft: self.soft.value(), + bypass: self.bypass.value(), + } + } + fn floats(&self) -> [&FloatParam; FLOATS] { + [ + &self.drive, + &self.ceiling, + &self.split, + &self.hold, + &self.soft, + ] + } + fn values(s: &Settings) -> [f32; FLOATS] { + [s.drive, s.ceiling, s.split, s.hold, s.soft] + } + /// Pushes every changed editor value to the host. Continuous controls hold one gesture + /// while the pointer is down; switches are set in a single gesture. + pub fn apply( + &self, + setter: &ParamSetter, + old: &Settings, + new: &Settings, + dragging: bool, + open: &mut [bool; FLOATS], + ) { + let pairs = Self::values(old).into_iter().zip(Self::values(new)); + for (i, (p, (a, b))) in self.floats().into_iter().zip(pairs).enumerate() { + if a != b { + if !open[i] { + open[i] = true; + setter.begin_set_parameter(p); + } + setter.set_parameter(p, b); + } + if !dragging && open[i] { + setter.end_set_parameter(p); + open[i] = false; + } + } + if new.bypass != old.bypass { + setter.begin_set_parameter(&self.bypass); + setter.set_parameter(&self.bypass, new.bypass); + setter.end_set_parameter(&self.bypass); + } + } +} diff --git a/plugins/quench/plugin/tests/host.rs b/plugins/quench/plugin/tests/host.rs new file mode 100644 index 0000000..39347e4 --- /dev/null +++ b/plugins/quench/plugin/tests/host.rs @@ -0,0 +1,205 @@ +//! Exercise the actual exported CLAP ABI without requiring a GUI or installed DAW. +use clap_sys::{ + audio_buffer::*, + events::*, + ext::{audio_ports::*, latency::*, state::*}, + factory::plugin_factory::*, + host::*, + process::*, + stream::*, + version::*, +}; +use std::{ + ffi::{c_char, c_void, CStr}, + io::{Cursor, Read}, + ptr, +}; + +unsafe extern "C" fn extension(_: *const clap_host, _: *const c_char) -> *const c_void { + ptr::null() +} +unsafe extern "C" fn request(_: *const clap_host) {} +unsafe extern "C" fn count(_: *const clap_input_events) -> u32 { + 0 +} +unsafe extern "C" fn event(_: *const clap_input_events, _: u32) -> *const clap_event_header { + ptr::null() +} +unsafe extern "C" fn push(_: *const clap_output_events, _: *const clap_event_header) -> bool { + true +} +unsafe extern "C" fn write(stream: *const clap_ostream, buffer: *const c_void, size: u64) -> i64 { + // SAFETY: The test owns the Vec for the entire synchronous save call. + let bytes = unsafe { &mut *((*stream).ctx as *mut Vec) }; + bytes.extend_from_slice(unsafe { + std::slice::from_raw_parts(buffer as *const u8, size as usize) + }); + size as i64 +} +unsafe extern "C" fn read(stream: *const clap_istream, buffer: *mut c_void, size: u64) -> i64 { + // SAFETY: The test owns the Cursor; the wrapper supplies writable stream storage. + let cursor = unsafe { &mut *((*stream).ctx as *mut Cursor>) }; + cursor + .read(unsafe { std::slice::from_raw_parts_mut(buffer as *mut u8, size as usize) }) + .unwrap() as i64 +} + +#[test] +fn effect_ports_state_latency_and_audio_lifecycle() { + // SAFETY: All callbacks, strings, streams, buffers, and the host outlive their + // synchronous ABI calls. Activation/processing/destruction follow CLAP order. + unsafe { + let entry = &quench::clap_entry; + assert!(entry.init.unwrap()(c"quench.clap".as_ptr())); + let factory = entry.get_factory.unwrap()(CLAP_PLUGIN_FACTORY_ID.as_ptr()) + as *const clap_plugin_factory; + assert!(!factory.is_null()); + let factory = &*factory; + assert_eq!(factory.get_plugin_count.unwrap()(factory), 1); + let descriptor = factory.get_plugin_descriptor.unwrap()(factory, 0); + assert!(!descriptor.is_null()); + assert_eq!(CStr::from_ptr((*descriptor).name), c"Quench"); + assert_eq!( + CStr::from_ptr((*descriptor).id), + c"io.narl.bass-foundry.quench" + ); + assert!(factory.get_plugin_descriptor.unwrap()(factory, 1).is_null()); + let host = clap_host { + clap_version: CLAP_VERSION, + host_data: ptr::null_mut(), + name: c"Storyboard test host".as_ptr(), + vendor: c"Tests".as_ptr(), + url: c"".as_ptr(), + version: c"1.0".as_ptr(), + get_extension: Some(extension), + request_restart: Some(request), + request_process: Some(request), + request_callback: Some(request), + }; + let plugin = factory.create_plugin.unwrap()(factory, &host, (*descriptor).id); + assert!(!plugin.is_null()); + let p = &*plugin; + assert!(p.init.unwrap()(plugin)); + let ports = p.get_extension.unwrap()(plugin, CLAP_EXT_AUDIO_PORTS.as_ptr()) + as *const clap_plugin_audio_ports; + assert!(!ports.is_null()); + assert_eq!((*ports).count.unwrap()(plugin, false), 1); + assert_eq!((*ports).count.unwrap()(plugin, true), 1); + let latency = p.get_extension.unwrap()(plugin, CLAP_EXT_LATENCY.as_ptr()) + as *const clap_plugin_latency; + assert!(!latency.is_null()); + let state = + p.get_extension.unwrap()(plugin, CLAP_EXT_STATE.as_ptr()) as *const clap_plugin_state; + assert!(!state.is_null()); + let state = &*state; + let save = || { + let mut bytes = Vec::new(); + let stream = clap_ostream { + ctx: &mut bytes as *mut Vec as *mut c_void, + write: Some(write), + }; + assert!(state.save.unwrap()(plugin, &stream)); + bytes + }; + let mut envelope: nih_plug::prelude::PluginState = + serde_json::from_slice(&save()[8..]).unwrap(); + use nih_plug::wrapper::state::ParamValue; + envelope.params.insert("soft".into(), ParamValue::F32(40.)); + envelope.params.insert("hold".into(), ParamValue::F32(100.)); + envelope.params.insert("split".into(), ParamValue::F32(90.)); + let encoded = serde_json::to_vec(&envelope).unwrap(); + let mut framed = (encoded.len() as u64).to_le_bytes().to_vec(); + framed.extend_from_slice(&encoded); + let mut bytes = Cursor::new(framed); + let stream = clap_istream { + ctx: &mut bytes as *mut Cursor> as *mut c_void, + read: Some(read), + }; + assert!(state.load.unwrap()(plugin, &stream)); + let restored: nih_plug::prelude::PluginState = + serde_json::from_slice(&save()[8..]).unwrap(); + assert_eq!( + serde_json::to_value(&restored.params).unwrap(), + serde_json::to_value(&envelope.params).unwrap() + ); + for rate in [44100., 48000., 96000.] { + assert!(p.activate.unwrap()(plugin, rate, 1, 512)); + let delay = (*latency).get.unwrap()(plugin) as usize; + // Only the 4× oversampling filters: under a millisecond at every rate. + assert_eq!(delay, 37); + assert!(p.start_processing.unwrap()(plugin)); + let total = delay + 9600; + let mut position = 0; + let (mut energy_in, mut energy_out) = (0f64, 0f64); + while position < total { + let frames = [1, 127, 512, 31][position % 4].min(total - position); + // A 1 kHz tone well under the ceiling passes unchanged. + let tone = |n: usize| { + 0.25 * (std::f64::consts::TAU * 1000. * n as f64 / rate).sin() as f32 + }; + let mut input_left = [0f32; 512]; + let mut input_right = [0f32; 512]; + for i in 0..frames { + input_left[i] = tone(position + i); + input_right[i] = -tone(position + i); + } + let mut left = [0f32; 512]; + let mut right = [0f32; 512]; + let mut in_channels = [input_left.as_mut_ptr(), input_right.as_mut_ptr()]; + let mut out_channels = [left.as_mut_ptr(), right.as_mut_ptr()]; + let incoming = clap_audio_buffer { + data32: in_channels.as_mut_ptr(), + data64: ptr::null_mut(), + channel_count: 2, + latency: 0, + constant_mask: 0, + }; + let mut outgoing_audio = clap_audio_buffer { + data32: out_channels.as_mut_ptr(), + data64: ptr::null_mut(), + channel_count: 2, + latency: 0, + constant_mask: 0, + }; + let input = clap_input_events { + ctx: ptr::null_mut(), + size: Some(count), + get: Some(event), + }; + let outgoing = clap_output_events { + ctx: ptr::null_mut(), + try_push: Some(push), + }; + let process = clap_process { + steady_time: position as i64, + frames_count: frames as u32, + transport: ptr::null(), + audio_inputs: &incoming, + audio_outputs: &mut outgoing_audio, + audio_inputs_count: 1, + audio_outputs_count: 1, + in_events: &input, + out_events: &outgoing, + }; + assert_ne!(p.process.unwrap()(plugin, &process), CLAP_PROCESS_ERROR); + for i in 0..frames { + let n = position + i; + if n < delay + 4800 { + // The tone's onset rings in the filters, but never past the ceiling. + assert!(left[i].abs() <= 0.9661, "{}", left[i]); + } else if n > delay + 4800 { + energy_in += (tone(n - delay) as f64).powi(2); + energy_out += (left[i] as f64).powi(2) + (right[i] as f64).powi(2); + } + } + position += frames; + } + let ratio_db = 10. * (energy_out / (2. * energy_in)).log10(); + assert!(ratio_db.abs() < 0.2, "{ratio_db}"); + p.stop_processing.unwrap()(plugin); + p.deactivate.unwrap()(plugin); + } + p.destroy.unwrap()(plugin); + entry.deinit.unwrap()(); + } +} diff --git a/plugins/quench/ui/Cargo.toml b/plugins/quench/ui/Cargo.toml new file mode 100644 index 0000000..ed19faf --- /dev/null +++ b/plugins/quench/ui/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "quench-ui" +version = "0.1.0" +edition.workspace = true +license.workspace = true + +[dependencies] +egui = "0.31.1" +quench-core = { path = "../core" } +common-ui = { path = "../../common/ui" } +common-dsp = { path = "../../common/dsp" } diff --git a/plugins/quench/ui/src/lib.rs b/plugins/quench/ui/src/lib.rs new file mode 100644 index 0000000..207ea1e --- /dev/null +++ b/plugins/quench/ui/src/lib.rs @@ -0,0 +1,327 @@ +//! Quench editor, shared by the CLAP wrapper and the headless renderer. +use common_ui::*; +use egui::{self, Color32, FontId, Pos2, Rect, RichText, Sense, Stroke, Vec2}; +use quench_core::{ + AnalyzerFrame, Monitor, Settings, CEILING_MIN, DRIVE_MAX, HOLD_MAX, HOLD_MIN, SCOPE, SPLIT_MAX, + SPLIT_MIN, +}; + +pub use common_ui::style; +pub const WIDTH: u32 = 980; +pub const HEIGHT: u32 = 640; + +pub struct State { + pub analyzer: AnalyzerFrame, + /// What the output plays. Not saved: the wrapper resets it when the editor opens. + pub monitor: Monitor, + /// True while a pointer button is held, so knob drags become one host gesture. + pub gesture_active: bool, + pub help: String, +} +impl Default for State { + fn default() -> Self { + Self { + analyzer: AnalyzerFrame::default(), + monitor: Monitor::Quench, + gesture_active: false, + help: DEFAULT_HELP.into(), + } + } +} +const DEFAULT_HELP: &str = + "Put Quench last on the master or the bass bus. Raise Drive until the top clips as hard as you want."; +impl State { + pub fn accept_frame(&mut self, frame: AnalyzerFrame) { + self.analyzer = frame; + } +} +fn hint(r: &egui::Response, state: &mut State, text: &str) { + if r.hovered() || r.has_focus() { + state.help = text.into(); + } +} +#[allow(clippy::too_many_arguments)] +fn knob( + ui: &mut egui::Ui, + state: &mut State, + name: &str, + value: &mut f32, + range: std::ops::RangeInclusive, + default: f32, + unit: &str, + help: &str, +) { + ui.vertical_centered(|ui| { + let r = rotary(ui, name, value, range, default, unit, 72., ACCENT); + hint(&r, state, help); + }); +} + +/// The selected output with the ceiling, the sub band, and the room the sub leaves the top. +fn scope(ui: &mut egui::Ui, settings: &Settings, frame: &AnalyzerFrame, height: f32) { + let (rect, _) = ui.allocate_exact_size(Vec2::new(ui.available_width(), height), Sense::hover()); + let p = ui.painter_at(rect); + p.rect_filled(rect, 2., SCREEN); + p.text( + rect.left_top() + Vec2::new(10., 8.), + egui::Align2::LEFT_TOP, + "OUTPUT · SUB · ROOM FOR THE TOP", + FontId::proportional(11.), + MUTED, + ); + p.text( + rect.right_top() + Vec2::new(-12., 8.), + egui::Align2::RIGHT_TOP, + format!( + "{:.0} ms", + SCOPE as f32 * 8. / frame.sample_rate.max(1.) * 1000. + ), + FontId::proportional(11.), + MUTED, + ); + let area = Rect::from_min_max( + rect.left_top() + Vec2::new(12., 28.), + rect.right_bottom() - Vec2::new(12., 10.), + ); + let mid = area.center().y; + let scale = area.height() * 0.5 / 1.08; + let y = |v: f32| mid - v.clamp(-1.08, 1.08) * scale; + let x = |i: usize| area.left() + area.width() * i as f32 / (SCOPE - 1) as f32; + p.line_segment( + [Pos2::new(area.left(), mid), Pos2::new(area.right(), mid)], + Stroke::new(1.0_f32, Color32::from_rgb(32, 35, 40)), + ); + let c = 10f32.powf(settings.ceiling / 20.); + for v in [c, -c] { + p.line_segment( + [Pos2::new(area.left(), y(v)), Pos2::new(area.right(), y(v))], + Stroke::new(1.0_f32, ACCENT.gamma_multiply(0.6)), + ); + } + p.text( + Pos2::new(area.right() - 4., y(c) - 3.), + egui::Align2::RIGHT_BOTTOM, + format!("CEILING {:.1} dB", settings.ceiling), + FontId::proportional(10.), + ACCENT, + ); + for i in 0..SCOPE { + let (lo, hi) = (frame.scope_min[i], frame.scope_max[i]); + let top = y(hi); + let bottom = y(lo).max(top + 1.); + p.line_segment( + [Pos2::new(x(i), top), Pos2::new(x(i), bottom)], + Stroke::new(2.0_f32, STEEL.gamma_multiply(0.55)), + ); + } + // Where the output may go: the sub plus or minus the top's room. + for sign in [1., -1.] { + let line: Vec = (0..SCOPE) + .map(|i| Pos2::new(x(i), y(frame.scope_sub[i] + sign * frame.scope_room[i]))) + .collect(); + p.add(egui::Shape::line(line, Stroke::new(1.0_f32, MUTED))); + } + let sub: Vec = (0..SCOPE) + .map(|i| Pos2::new(x(i), y(frame.scope_sub[i]))) + .collect(); + p.add(egui::Shape::line(sub, Stroke::new(2.0_f32, FOCUS))); + p.rect_stroke( + rect, + 2., + Stroke::new(1.0_f32, EDGE), + egui::StrokeKind::Inside, + ); +} + +pub fn show(ui: &mut egui::Ui, settings: &mut Settings, state: &mut State) { + backdrop(ui); + state.help = DEFAULT_HELP.into(); + state.gesture_active = ui.input(|i| i.pointer.any_down()); + ui.add_space(2.); + header(ui, "QUENCH", "SUB-SAFE CLIPPER", |ui| { + let r = ui + .selectable_label(settings.bypass, RichText::new("BYPASS").size(13.)) + .on_hover_text("Crossfade to the input, delayed by the latency."); + if r.clicked() { + settings.bypass = !settings.bypass; + } + ui.separator(); + for (monitor, label, text) in [ + ( + Monitor::Delta, + "DELTA", + "Hear what Quench takes away. Not saved.", + ), + ( + Monitor::Plain, + "PLAIN", + "Hear a plain clipper at the same settings, to compare the low end. Not saved.", + ), + (Monitor::Quench, "QUENCH", "Hear Quench."), + ] { + let r = ui + .selectable_label(state.monitor == monitor, RichText::new(label).size(13.)) + .on_hover_text(text); + if r.clicked() { + state.monitor = monitor; + } + } + caption(ui, "LISTEN"); + }); + ui.add_space(6.); + let frame = state.analyzer; + ui.horizontal_top(|ui| { + panel(ui, |ui| { + ui.set_width(250.); + ui.set_min_height(TOP); + ui.vertical(|ui| readings(ui, settings, &frame)); + }); + ui.add_space(4.); + panel(ui, |ui| { + ui.set_width(ui.available_width()); + scope(ui, settings, &frame, TOP); + }); + }); + ui.add_space(6.); + panel(ui, |ui| { + ui.set_width(ui.available_width()); + ui.vertical(|ui| controls(ui, settings, state)); + }); + ui.separator(); + ui.label(RichText::new(&state.help).color(MUTED)); +} +const TOP: f32 = 330.; + +fn readings(ui: &mut egui::Ui, settings: &Settings, frame: &AnalyzerFrame) { + caption(ui, "LOW END CHANGED BY"); + let has_sub = frame.low_quench.is_finite(); + ui.label( + RichText::new(if has_sub { + format!("{:.0} dB", frame.low_quench) + } else { + "—".into() + }) + .font(FontId::new(44., egui::FontFamily::Name("medium".into()))) + .color(if has_sub { TEXT } else { DIM }), + ); + ui.label( + RichText::new(if has_sub { + format!("plain clip: {:.0} dB", frame.low_plain) + } else { + "no sub playing".into() + }) + .monospace() + .size(13.) + .color(MUTED), + ); + ui.add_space(12.); + readout( + ui, + "TOP CLIPPED BY", + if frame.top_clip >= 40. { + "no room left".into() + } else if frame.top_clip > 0. { + format!("{:.1} dB", frame.top_clip) + } else { + "not clipping".into() + }, + ACCENT, + ); + let room = settings.ceiling - frame.sub_peak; + readout( + ui, + "SUB PEAK · ROOM LEFT", + if frame.sub_peak > -119. { + format!("{:.1} dBFS · {:.1} dB", frame.sub_peak, room.max(0.)) + } else { + "—".into() + }, + FOCUS, + ); + if frame.sub_peak > settings.ceiling - 1. { + ui.label( + RichText::new( + "The sub alone reaches the ceiling: the top has no room and the safety clip \ + cuts the sub. Lower Drive or the sub.", + ) + .size(12.) + .color(ACCENT), + ); + ui.add_space(6.); + } + ui.add_space(4.); + meter(ui, "IN", frame.input_peak, STEEL, 150.); + meter(ui, "OUT", frame.output_peak, ACCENT, 150.); + ui.add_space(6.); + ui.label( + RichText::new(format!( + "safety clip {} · {:.1} ms latency", + if frame.safety > 0. { + format!("{:.2} dB", frame.safety) + } else { + "idle".into() + }, + frame.latency as f32 / frame.sample_rate.max(1.) * 1000. + )) + .size(12.) + .color(MUTED), + ); +} + +fn controls(ui: &mut egui::Ui, settings: &mut Settings, state: &mut State) { + let d = Settings::default(); + ui.columns(5, |c| { + knob( + &mut c[0], + state, + "Drive", + &mut settings.drive, + 0. ..=DRIVE_MAX, + d.drive, + " dB", + "Gain into the clipper. The sub rises with it: watch the room it leaves.", + ); + knob( + &mut c[1], + state, + "Ceiling", + &mut settings.ceiling, + CEILING_MIN..=0., + d.ceiling, + " dB", + "Highest output peak. The sub keeps its level; the top gets what is left.", + ); + knob( + &mut c[2], + state, + "Split", + &mut settings.split, + SPLIT_MIN..=SPLIT_MAX, + d.split, + " Hz", + "Below this the sub passes without clipping. Set it above the highest sub note, \ + or at Anvil's Split.", + ); + knob( + &mut c[3], + state, + "Hold", + &mut settings.hold, + HOLD_MIN..=HOLD_MAX, + d.hold, + " ms", + "How long the sub's peak keeps its room. Longer than half a period of the lowest \ + note keeps the top from pumping with the sub.", + ); + knob( + &mut c[4], + state, + "Soft", + &mut settings.soft, + 0. ..=100., + d.soft, + " %", + "Knee of the top's clip. 0 % is a hard clip, 100 % a soft curve.", + ); + }); +} diff --git a/tools/editor-check/Cargo.lock b/tools/editor-check/Cargo.lock index 50d1f37..a97da10 100644 --- a/tools/editor-check/Cargo.lock +++ b/tools/editor-check/Cargo.lock @@ -186,6 +186,8 @@ dependencies = [ "patina-ui", "planish-core", "planish-ui", + "quench-core", + "quench-ui", "rivet-app", "rivet-core", "rivet-midi", @@ -513,6 +515,24 @@ version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea" +[[package]] +name = "quench-core" +version = "0.1.0" +dependencies = [ + "common-dsp", + "serde", +] + +[[package]] +name = "quench-ui" +version = "0.1.0" +dependencies = [ + "common-dsp", + "common-ui", + "egui", + "quench-core", +] + [[package]] name = "quote" version = "1.0.47" diff --git a/tools/editor-check/Cargo.toml b/tools/editor-check/Cargo.toml index a5fe513..9986c3f 100644 --- a/tools/editor-check/Cargo.toml +++ b/tools/editor-check/Cargo.toml @@ -29,5 +29,7 @@ planish-core = { path = "../../plugins/planish/core" } planish-ui = { path = "../../plugins/planish/ui" } braze-core = { path = "../../plugins/braze/core" } braze-ui = { path = "../../plugins/braze/ui" } +quench-core = { path = "../../plugins/quench/core" } +quench-ui = { path = "../../plugins/quench/ui" } weld-core = { path = "../../plugins/weld/core" } weld-ui = { path = "../../plugins/weld/ui" } diff --git a/tools/editor-check/src/main.rs b/tools/editor-check/src/main.rs index 07e12a7..8fbff15 100644 --- a/tools/editor-check/src/main.rs +++ b/tools/editor-check/src/main.rs @@ -12,13 +12,13 @@ fn main() { .unwrap_or("rivet"); if ![ "rivet", "patina", "anvil", "crucible", "lathe", "temper", "weld", "knurl", "planish", - "braze", + "braze", "quench", ] .contains(&plugin) { eprintln!( - "Use --plugin rivet, patina, anvil, crucible, lathe, temper, weld, knurl, planish \ - or braze" + "Use --plugin rivet, patina, anvil, crucible, lathe, temper, weld, knurl, planish, \ + braze or quench" ); std::process::exit(2); } @@ -32,7 +32,10 @@ fn main() { let knurl = plugin == "knurl"; let planish = plugin == "planish"; let braze = plugin == "braze"; - let (width, height) = if braze { + let quench = plugin == "quench"; + let (width, height) = if quench { + (quench_ui::WIDTH, quench_ui::HEIGHT) + } else if braze { (braze_ui::WIDTH, braze_ui::HEIGHT) } else if planish { (planish_ui::WIDTH, planish_ui::HEIGHT) @@ -229,6 +232,27 @@ fn main() { } braze_state.accept_frame(engine.take_analyzer()); } + let mut quench_settings = quench_core::Settings { + drive: 9., + ..Default::default() + }; + let mut quench_state = quench_ui::State::default(); + if quench { + // A 49 Hz sub under a distorted saw top two octaves up, driven 9 dB into the clipper. + let mut engine = quench_core::Engine::new(48000., 2).unwrap(); + engine.set_settings(quench_settings).unwrap(); + let mut saw = common_dsp::Saw::new(48000., 196.); + for i in 0..48000 { + let t = i as f32 / 48000.; + let sub = 0.18 * (std::f32::consts::TAU * 49. * t).sin(); + let top = (saw.sample() * 3.).tanh() * 0.3; + engine.process_sample([sub + top, sub + top], quench_core::Monitor::Quench); + if i % 1600 == 0 { + quench_state.accept_frame(engine.take_analyzer()); + } + } + quench_state.accept_frame(engine.take_analyzer()); + } let mut weld_settings = weld_core::Settings::default(); let mut weld_state = weld_ui::State::default(); if weld { @@ -358,7 +382,9 @@ fn main() { let session_motif = session.motifs[0].id; shared.replace(session).unwrap(); let ctx = egui::Context::default(); - if braze { + if quench { + quench_ui::style(&ctx); + } else if braze { braze_ui::style(&ctx); } else if planish { planish_ui::style(&ctx); @@ -399,7 +425,9 @@ fn main() { }, |ui| { egui::CentralPanel::default().show(ui, |ui| { - if braze { + if quench { + quench_ui::show(ui, &mut quench_settings, &mut quench_state); + } else if braze { braze_ui::show(ui, &mut braze_settings, &mut braze_state); } else if planish { planish_ui::show(ui, &mut planish_settings, &mut planish_state); diff --git a/website/src/data/plugins.ts b/website/src/data/plugins.ts index ac96105..01dd806 100644 --- a/website/src/data/plugins.ts +++ b/website/src/data/plugins.ts @@ -199,6 +199,21 @@ const COPY: Record = { latency: '≈ 67 ms', tracksNotes: true, }, + quench: { + role: 'Sub-safe clipper', + metal: 'Quenching hardens hot metal in one fast step.', + problem: + 'Hard-clipped masters clip the sub with the top: near the sub’s peaks only one side of the top clips, so the sub loses level and the low end fills with products that were not in the mix.', + points: [ + 'The sub below Split passes unclipped; the top is clipped in the room the sub leaves under the ceiling.', + 'What the clip removes is high-passed, so its products stay out of the low band.', + 'Compare against a plain clipper, or hear only what Quench takes away.', + 'A meter shows how much the low end changed, for Quench and for a plain clip.', + ], + loadOn: 'Master or bass bus, last', + latency: '< 1 ms', + tracksNotes: false, + }, }; export interface Plugin extends Copy {