From 7b989f76853b3c795d35cf5f66010cc6471e2c42 Mon Sep 17 00:00:00 2001 From: Nils Pukropp Date: Fri, 6 Nov 2026 16:30:23 +0100 Subject: [PATCH] feat(forge): add Forge tracked channel strip One note tracker reads the input and Lathe, Temper and Knurl follow it as modules, in any of six orders, each on or off. Every module gets the tracker's events delayed by the latency of the modules in front of it. - One module alone matches its standalone plugin sample for sample in every order. - With Knurl's sub-octave pattern in front, Lathe in Forge follows the played note; a standalone Lathe after Knurl reads it an octave low. - About 72 ms latency against about 206 ms for the three in a row. The module pages reuse the standalone editors. Register Forge in the catalog, CI, README, docs and website, and drop the built Ballast from the site's idea list. --- .gitea/workflows/check.yml | 4 +- .gitea/workflows/release.yml | 2 +- Cargo.lock | 28 + Cargo.toml | 4 +- README.md | 12 +- docs/chain.md | 13 +- docs/development.md | 9 +- docs/forge/CHANGELOG.md | 13 + docs/forge/README.md | 63 + docs/forge/assets/editor.png | Bin 0 -> 321741 bytes docs/ideas.md | 27 +- plugins/catalog.json | 23 + plugins/forge/core/Cargo.toml | 15 + plugins/forge/core/src/lib.rs | 271 +++ plugins/forge/core/src/settings.rs | 119 ++ plugins/forge/core/tests/dsp.rs | 219 +++ plugins/forge/core/tests/realtime.rs | 72 + plugins/forge/plugin/Cargo.lock | 2448 ++++++++++++++++++++++++++ plugins/forge/plugin/Cargo.toml | 29 + plugins/forge/plugin/src/lib.rs | 201 +++ plugins/forge/plugin/src/params.rs | 605 +++++++ plugins/forge/plugin/tests/host.rs | 231 +++ plugins/forge/ui/Cargo.toml | 17 + plugins/forge/ui/src/lib.rs | 175 ++ tools/editor-check/Cargo.lock | 29 + tools/editor-check/Cargo.toml | 2 + tools/editor-check/src/main.rs | 50 +- website/src/data/plugins.ts | 20 +- 28 files changed, 4678 insertions(+), 23 deletions(-) create mode 100644 docs/forge/CHANGELOG.md create mode 100644 docs/forge/README.md create mode 100644 docs/forge/assets/editor.png create mode 100644 plugins/forge/core/Cargo.toml create mode 100644 plugins/forge/core/src/lib.rs create mode 100644 plugins/forge/core/src/settings.rs create mode 100644 plugins/forge/core/tests/dsp.rs create mode 100644 plugins/forge/core/tests/realtime.rs create mode 100644 plugins/forge/plugin/Cargo.lock create mode 100644 plugins/forge/plugin/Cargo.toml create mode 100644 plugins/forge/plugin/src/lib.rs create mode 100644 plugins/forge/plugin/src/params.rs create mode 100644 plugins/forge/plugin/tests/host.rs create mode 100644 plugins/forge/ui/Cargo.toml create mode 100644 plugins/forge/ui/src/lib.rs diff --git a/.gitea/workflows/check.yml b/.gitea/workflows/check.yml index 37b0381..c4b713c 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, quench, ballast] + plugin: [rivet, patina, anvil, crucible, lathe, temper, weld, knurl, planish, braze, quench, ballast, forge] steps: - uses: https://github.com/actions/checkout@v4 with: @@ -66,6 +66,7 @@ jobs: 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 cargo run --manifest-path tools/editor-check/Cargo.toml --locked -- target/editor/ballast.png --plugin ballast + cargo run --manifest-path tools/editor-check/Cargo.toml --locked -- target/editor/forge.png --plugin forge - uses: https://github.com/actions/upload-artifact@v3-node20 with: name: editor-previews @@ -101,6 +102,7 @@ jobs: 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/build-plugin.py --plugin ballast --target x86_64-pc-windows-gnu + python3 scripts/build-plugin.py --plugin forge --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 8c142f3..af63c6b 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*", "quench-v*", "ballast-v*"] + tags: ["rivet-v*", "patina-v*", "anvil-v*", "crucible-v*", "lathe-v*", "temper-v*", "weld-v*", "knurl-v*", "planish-v*", "braze-v*", "quench-v*", "ballast-v*", "forge-v*"] permissions: contents: read diff --git a/Cargo.lock b/Cargo.lock index 069d7e4..c33c362 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -202,6 +202,34 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7e7a64c02cf7a5b51e745a9e45f60660a286f151c238b9d397b3e923f5082f" +[[package]] +name = "forge-core" +version = "0.1.0" +dependencies = [ + "common-dsp", + "knurl-core", + "lathe-core", + "serde", + "serde_json", + "temper-core", +] + +[[package]] +name = "forge-ui" +version = "0.1.0" +dependencies = [ + "common-dsp", + "common-ui", + "egui", + "forge-core", + "knurl-core", + "knurl-ui", + "lathe-core", + "lathe-ui", + "temper-core", + "temper-ui", +] + [[package]] name = "itoa" version = "1.0.18" diff --git a/Cargo.toml b/Cargo.toml index 9e666a0..681e48d 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/quench/core", "plugins/quench/ui", "plugins/ballast/core", "plugins/ballast/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/ballast/core", "plugins/ballast/ui", "plugins/forge/core", "plugins/forge/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] @@ -35,3 +35,5 @@ opt-level = 2 opt-level = 2 [profile.dev.package.ballast-core] opt-level = 2 +[profile.dev.package.forge-core] +opt-level = 2 diff --git a/README.md b/README.md index 94071b4..3c44f0b 100644 --- a/README.md +++ b/README.md @@ -32,9 +32,10 @@ note. Each plugin is a separate product with its own version, guide and release. | **[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) | | **[Ballast](docs/ballast/README.md)** | Levels every note or switch-up to one loudness with a single gain each: no compression inside a part | Bass, after the sound design | ≈ 172 ms | [Guide](docs/ballast/README.md) · [Changes](docs/ballast/CHANGELOG.md) | +| **[Forge](docs/forge/README.md)** | Lathe, Temper and Knurl as one channel strip behind one note tracker, in any order: one lookahead, and no module hears Knurl's sub-octave | Bass, after the synth | ≈ 72 ms | [Guide](docs/forge/README.md) · [Changes](docs/forge/CHANGELOG.md) | Plugins with latency report it to the host, so FL Studio compensates the delay. -Anvil, Lathe, Temper, Knurl, Planish, Braze and Ballast detect notes from the audio. They can also take the +Anvil, Lathe, Temper, Knurl, Planish, Braze, Ballast and Forge detect notes from the audio. They can also take the pitch from MIDI. The order of the plugins matters: see [Signal chain](docs/chain.md). The names come from metalwork: a **rivet** joins pieces; **patina** changes a @@ -44,7 +45,8 @@ 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; **quenching** hardens hot metal in one -fast step; **ballast** is the weight that keeps a ship level. +fast step; **ballast** is the weight that keeps a ship level; a **forge** is the hearth where +every piece is heated and worked. 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*. @@ -75,6 +77,9 @@ finished. Hosts list the plugins under the vendor name *Bass Foundry*. Quench editor
Quench: sub-safe clipper Ballast editor
Ballast: switch-up leveller + + Forge editor
Forge: tracked channel strip + The previews are rendered headless from the real editor code by @@ -133,7 +138,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`, `braze`, `quench` and `ballast`. Builds go to `dist//.clap`. No +`lathe`, `temper`, `weld`, `knurl`, `planish`, `braze`, `quench`, `ballast` and `forge`. Builds go to `dist//.clap`. No script installs anything into a DAW. [Development and testing](docs/development.md) has the full command list. @@ -175,6 +180,7 @@ plugins/ braze/ core · ui · plugin quench/ core · ui · plugin ballast/ core · ui · plugin + forge/ 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 8e46e6e..a94739b 100644 --- a/docs/chain.md +++ b/docs/chain.md @@ -1,19 +1,24 @@ # Signal chain The order of the Bass Foundry plugins in a chain matters. Anvil, Lathe, Temper, -Knurl, Planish, Braze and Ballast each detect the pitch from the audio they receive. If a plugin earlier +Knurl, Planish, Braze, Ballast and Forge each detect the pitch from the audio they receive. If a plugin earlier in the chain changes the audio, the pitch detection after it can go wrong. ## Recommended order ```text bass track: synth → Lathe → Temper → Planish → Braze → Knurl → Patina → Ballast → Weld + or: synth → Forge (Lathe, Temper, Knurl) → Planish → Braze → Patina → Ballast → Weld 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 is clear. +- **Or Forge in their place.** Forge runs Lathe, Temper and Knurl behind one + tracker that reads its input, so the order inside it does not upset the pitch + detection, and the three cost one lookahead (about 72 ms) instead of three. + Planish and Braze then come after Knurl: run them from MIDI. - **Planish after the distortion, before Knurl.** OTT usually comes after distortion. Planish's band edges follow the tracked note, so it also needs a clear pitch: after Knurl, use MIDI. @@ -58,13 +63,15 @@ tracker on a saw bass: its phase on each, Lathe, Temper and Planish retune on each. When a tracked plugin must come after Knurl, select **MIDI** as its pitch source -and route the bass's MIDI notes to it. +and route the bass's MIDI notes to it. Inside Forge this does not apply: its one +tracker reads the input before Knurl. ## 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, Ballast -about 172 ms, Quench under 1 ms. A full chain is +about 172 ms, Quench under 1 ms. Forge holds Lathe, Temper and Knurl in about +72 ms, against about 206 ms for the three plugins in a row. 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 3648d4b..47075f6 100644 --- a/docs/development.md +++ b/docs/development.md @@ -25,8 +25,10 @@ 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, Braze and Ballast, 4× oversampling (also Quench's), - BS.1770 K-weighting (Ballast), meters and WAV files. + Lathe, Temper, Knurl, Planish, Braze, Ballast and Forge (with the `Tracked` + module trait that lets Lathe, Temper and Knurl run behind one shared tracker), + 4× oversampling (also Quench's), BS.1770 K-weighting (Ballast), 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 @@ -46,7 +48,7 @@ python3 -m unittest discover -s scripts/tests -v ``` Products: `rivet`, `patina`, `anvil`, `crucible`, `lathe`, `temper`, `weld`, -`knurl`, `planish`, `braze`, `quench`, `ballast`. +`knurl`, `planish`, `braze`, `quench`, `ballast`, `forge`. `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 @@ -149,6 +151,7 @@ identify plugins by CLAP ID, so the vendor name does not affect saved projects. | Braze | (new) | `io.narl.bass-foundry.braze` | | Quench | (new) | `io.narl.bass-foundry.quench` | | Ballast | (new) | `io.narl.bass-foundry.ballast` | +| Forge | (new) | `io.narl.bass-foundry.forge` | 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/forge/CHANGELOG.md b/docs/forge/CHANGELOG.md new file mode 100644 index 0000000..67ff16d --- /dev/null +++ b/docs/forge/CHANGELOG.md @@ -0,0 +1,13 @@ +# Forge changelog + +## Unreleased (0.1.0) + +- Introduce Forge, one tracked channel strip: Lathe, Temper and Knurl behind a + single note tracker, in any of the six orders, each module on or off. +- Every module follows the note read from the strip's input, so a module after + Knurl no longer hears Knurl's sub-octave. +- One latency of about 72 ms, the same in every order, instead of more than + 200 ms for the three plugins in a row. +- A single module on its own gives the same output, sample for sample, as its + standalone plugin. +- Editor: the chain, and each module's standalone editor as its page. diff --git a/docs/forge/README.md b/docs/forge/README.md new file mode 100644 index 0000000..9b95f3f --- /dev/null +++ b/docs/forge/README.md @@ -0,0 +1,63 @@ +# Forge + +Forge is one tracked channel strip: Lathe, Temper and Knurl run behind a single +note tracker, in the order you choose. Current version **0.1.0** (unreleased). + +Each of the three plugins detects the played note itself. In a row, their +lookaheads add up (Lathe 67 ms, Temper 68 ms, Knurl 71 ms: more than 200 ms), +and a tracker after Knurl hears Knurl's sub-octave and follows a note an octave +low. Forge reads the note once, from its input, and every module follows that +one tracker. In a test with Knurl's sub-octave pattern in front of Lathe, a +standalone Lathe after Knurl followed the note an octave low in every frame; +Lathe inside Forge followed the played note in every frame. + +![Forge](assets/editor.png) + +## Install on Windows + +Copy `Forge.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 Forge in the mixer slot of the bass, right after the +synth. Keep the font license with redistributed packages. + +## Work with it + +1. Choose **Pitch from** in the header: **AUDIO** detects the note from the + input; **MIDI** follows MIDI notes sent to the effect. All modules use it. +2. The **Chain** row shows the modules in processing order. Click a module's + name to edit it below; **ON** switches it on or off. The button between two + modules swaps them. The default order is Lathe, Temper, Knurl, as in the + standalone chain. +3. Each module's page is its standalone editor: [Lathe](../lathe/README.md), + [Temper](../temper/README.md) and [Knurl](../knurl/README.md) explain the + controls. Temper's **AUTO GAIN** sits in the Chain row while its page is + open. +4. The **Gate** knob on every page is the one shared tracker gate: turning it on + one page turns it on all. + +**Bypass** in the header crossfades the whole strip to the delayed input. + +## How it works + +The tracker reads the strip's input, and the audio is delayed by its lookahead +once. Every module gets the note events delayed by the latency of the modules +in front of it, so each module sees a note start exactly on the attack of the +audio it receives. A single module on its own in Forge gives the same output, +sample for sample, as its standalone plugin, in every position of the chain. + +Temper's **Normalize** measures each note's level one lookahead ahead. In Forge +it measures the strip's input, not the output of the modules in front of it. +Lathe and Knurl change the level about equally on every note, so the notes +still reach the shaper at one level. + +## Timing and limits + +Latency is the tracker's lookahead (about 67 ms), Temper's oversampling filters +(under 1 ms) and Knurl's room for timing jitter (about 4 ms): about 72 ms in +all, reported to the host. A module that is off still delays its audio by its +own latency, so the latency stays the same in every order and with any module +off. + +Changing the order while audio plays switches the routing at once and can +click. The standalone plugins stay: use them when you need only one module, or +when another plugin must sit between two of them. diff --git a/docs/forge/assets/editor.png b/docs/forge/assets/editor.png new file mode 100644 index 0000000000000000000000000000000000000000..18858887d9b2eff5161a7802a36f8afb9712cbb6 GIT binary patch literal 321741 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�E&zCv$L7#9M@y7J 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

!x~=t>0sQEz?R`M@f){+|Wu(z8;CMm;i@TnQ)N- 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 Ri^0Do0W1FV>>EMx{|AeqI41xA literal 0 HcmV?d00001 diff --git a/docs/ideas.md b/docs/ideas.md index 29b7a2f..a829feb 100644 --- a/docs/ideas.md +++ b/docs/ideas.md @@ -270,7 +270,7 @@ one period of the note, so heavy settings do not ripple at f0. See [Planish](pla (prototype `scripts/fatness.py`); Anvil Ghost harmonics and Phone listen (done, Anvil 0.3.0); Braze (done, 0.1.0); Anvil Kick lock with offset audition (done, Anvil 0.3.0). -4. Forge, when enough modules exist. +4. Forge (done, unreleased 0.1.0): Lathe, Temper and Knurl behind one tracker. 5. Assay, one plugin for the display-only ideas. 6. Texture plugins (Anneal, Swarf, Etch, Bellows) and the note-keyed sequencer. @@ -291,6 +291,31 @@ before Knurl) and the repeated MIDI routing. The standalone plugins stay. Sharing one tracker between separate `.clap` files would need named shared memory across DLLs, which is fragile; one strip is simpler. +Built (unreleased 0.1.0, see [Forge](forge/README.md)). Lathe, Temper and Knurl +became modules (a `Tracked` trait in common-dsp: `ahead`, `event`, `process`); +each standalone plugin is now its tracker plus its module, Lathe and Temper +bit-exact against the old engines, Knurl one sample later (its interpolation +needs one newer sample) and equal within float rounding. In the strip one +tracker reads the input; a per-sample record of the tracker's events, note state +and input is replayed to each module, delayed by the latency of the modules in +front of it. Findings: + +- One module alone in Forge matches its standalone plugin sample for sample, in + all six orders (tested). +- Knurl's Double-style pattern (0, −12 dB) in front of Lathe: standalone Lathe + after Knurl read the note an octave low in 149 of 149 frames on an A2 saw; + Lathe inside Forge read A2 in 149 of 149. +- Latency 72 ms against 206 ms for the three in a row (48 kHz). +- Temper's Normalize looks one lookahead ahead; in the strip it reads the strip + input, not the modules in front of it. Fine while those change every note's + level alike. + +Next for Forge: the *Tension* macro over Knurl (and later Anneal) at matched +loudness; Planish and Braze as modules (both are tracked, and Braze after +Knurl is the next tracker that hears the sub-octave); a short crossfade when +the order changes; one shared modulation source (per-note envelope or LFO in +cycles) that every module can read. + ### Braze — tempo-locked beating (problem 20) Brazing joins two metals with a filler. Braze adds a detuned copy of the bass diff --git a/plugins/catalog.json b/plugins/catalog.json index e509775..7b0b914 100644 --- a/plugins/catalog.json +++ b/plugins/catalog.json @@ -199,5 +199,28 @@ "ballast-core", "ballast-ui" ] + }, + "forge": { + "name": "Forge", + "description": "One tracked channel strip: Lathe, Temper and Knurl behind one note tracker, in any order", + "manifest": "plugins/forge/plugin/Cargo.toml", + "library": "forge", + "documentation": "docs/forge", + "clap_id": "io.narl.bass-foundry.forge", + "licenses": { + "plugins/common/ui/assets/OFL.txt": "licenses/Roboto-OFL.txt" + }, + "packages": [ + "common-ui", + "common-dsp", + "forge-core", + "forge-ui", + "lathe-core", + "lathe-ui", + "temper-core", + "temper-ui", + "knurl-core", + "knurl-ui" + ] } } diff --git a/plugins/forge/core/Cargo.toml b/plugins/forge/core/Cargo.toml new file mode 100644 index 0000000..cb33a35 --- /dev/null +++ b/plugins/forge/core/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "forge-core" +version = "0.1.0" +edition.workspace = true +license.workspace = true + +[dependencies] +common-dsp = { path = "../../common/dsp" } +lathe-core = { path = "../../lathe/core" } +temper-core = { path = "../../temper/core" } +knurl-core = { path = "../../knurl/core" } +serde = { workspace = true } + +[dev-dependencies] +serde_json = { workspace = true } diff --git a/plugins/forge/core/src/lib.rs b/plugins/forge/core/src/lib.rs new file mode 100644 index 0000000..bee8bc3 --- /dev/null +++ b/plugins/forge/core/src/lib.rs @@ -0,0 +1,271 @@ +//! Forge: one tracked channel strip. One note tracker reads the strip's input, and Lathe, +//! Temper and Knurl run behind it as modules in a chosen order. +//! +//! The audio path is delayed by the tracker's lookahead once. Every module gets the note events +//! delayed by the latency of the modules in front of it, so each module sees a note start on +//! that note's attack in the audio it receives. A module that is switched off still delays +//! its audio by its own latency, so the strip's latency never changes. Allocation-free after +//! `new`. +mod settings; +use common_dsp::tracker::{NoteEvent, Tracked, Tracker, TrackerConfig}; +use common_dsp::{coefficient, hz_to_midi}; +pub use settings::{Settings, Source, Stage, ORDERS, STAGES}; + +/// Note events kept per sample. More arrive only on floods; the oldest are dropped. +const EVENTS: usize = 4; + +#[derive(Clone, Copy, Debug)] +pub struct AnalyzerFrame { + pub lathe: lathe_core::AnalyzerFrame, + pub temper: temper_core::AnalyzerFrame, + pub knurl: knurl_core::AnalyzerFrame, + /// Pitch at the strip's output, 0 before the first note. + pub hz: f32, + pub note: Option, + pub latency: u32, + pub sample_rate: f32, +} +impl Default for AnalyzerFrame { + fn default() -> Self { + Self { + lathe: lathe_core::AnalyzerFrame::default(), + temper: temper_core::AnalyzerFrame::default(), + knurl: knurl_core::AnalyzerFrame::default(), + hz: 0., + note: None, + latency: 0, + sample_rate: 48000., + } + } +} + +/// What the tracker reported for one sample, kept so later modules can replay it. +#[derive(Clone, Copy)] +struct Slot { + events: [NoteEvent; EVENTS], + len: usize, + sounding: bool, + /// The undelayed input, one lookahead ahead of the audio this slot belongs to. + ahead: f32, +} +impl Default for Slot { + fn default() -> Self { + Self { + events: [NoteEvent::Stop; EVENTS], + len: 0, + sounding: false, + ahead: 0., + } + } +} +impl Slot { + fn push(&mut self, e: NoteEvent) { + if self.len == EVENTS { + self.events.copy_within(1.., 0); + self.len -= 1; + } + self.events[self.len] = e; + self.len += 1; + } +} + +pub struct Engine { + rate: f32, + channels: usize, + settings: Settings, + tracker: Tracker, + delay: Vec<[f32; 2]>, + delay_at: usize, + lathe: lathe_core::Module, + temper: temper_core::Module, + knurl: knurl_core::Module, + /// Tracker reports of the last samples, newest at `line_at`. + line: Vec, + line_at: usize, + /// How far back in `line` each position of the order reads. + offsets: [usize; STAGES], + /// The aligned input, delayed by every module's latency, for the strip's bypass. + dry: Vec<[f32; 2]>, + dry_at: usize, + /// Pitch at the output, for the editor. + pitch: common_dsp::tracker::PitchFollower, + sounding: bool, + smooth: f32, + bypass: f32, + fresh: bool, +} + +impl Engine { + pub fn new(rate: f32, channels: usize) -> Result { + let lathe = lathe_core::Module::new(rate, channels)?; + let temper = temper_core::Module::new(rate, channels)?; + let knurl = knurl_core::Module::new(rate, channels)?; + let tracker = Tracker::new(rate, TrackerConfig::BASS); + let modules = lathe.latency() + temper.latency() + knurl.latency(); + let lookahead = tracker.latency(); + let mut e = Self { + rate, + channels, + settings: Settings::default(), + tracker, + delay: vec![[0.; 2]; lookahead + 1], + delay_at: 0, + lathe, + temper, + knurl, + line: vec![Slot::default(); modules + 1], + line_at: 0, + offsets: [0; STAGES], + dry: vec![[0.; 2]; modules + 1], + dry_at: 0, + pitch: Default::default(), + sounding: false, + smooth: coefficient(rate, 10.), + bypass: 0., + fresh: true, + }; + // The modules already hold their defaults; only the routing still needs them. + e.route(&Settings::default()); + Ok(e) + } + /// The tracker's lookahead plus every module's latency, in any order. + pub fn latency_samples(&self) -> u32 { + (self.tracker.latency() + self.dry.len() - 1) as u32 + } + pub fn channels(&self) -> usize { + self.channels + } + pub fn settings(&self) -> Settings { + self.settings + } + pub fn set_settings(&mut self, s: Settings) -> Result<(), &'static str> { + s.validate()?; + let mut s = s; + s.share(); + self.lathe.set_settings(s.lathe)?; + self.temper.set_settings(s.temper)?; + self.knurl.set_settings(s.knurl)?; + self.route(&s); + self.settings = s; + if std::mem::take(&mut self.fresh) { + self.bypass = f32::from(s.bypass); + } + Ok(()) + } + /// Tracker settings and how far back each position reads the note events. + fn route(&mut self, s: &Settings) { + // Each module decides itself whether a legato note slides. + self.tracker.set(s.source == Source::Midi, s.gate, true); + let mut at = 0; + for (i, stage) in s.order.into_iter().enumerate() { + self.offsets[i] = at; + at += self.module(stage).latency(); + } + } + pub fn reset(&mut self) { + self.tracker.reset(); + self.delay.fill([0.; 2]); + self.line.fill(Slot::default()); + self.dry.fill([0.; 2]); + self.lathe.reset(); + self.temper.reset(); + self.knurl.reset(); + self.pitch = Default::default(); + self.sounding = false; + self.fresh = true; + } + pub fn note_on(&mut self, note: u8) { + self.tracker.note_on(note); + } + pub fn note_off(&mut self, note: u8) { + self.tracker.note_off(note); + } + fn module(&mut self, stage: Stage) -> &mut dyn Tracked { + match stage { + Stage::Lathe => &mut self.lathe, + Stage::Temper => &mut self.temper, + Stage::Knurl => &mut self.knurl, + } + } + pub fn process_sample(&mut self, x: [f32; 2]) -> [f32; 2] { + let mono = if self.channels == 2 { + 0.5 * (x[0] + x[1]) + } else { + x[0] + }; + let mut slot = Slot { + ahead: mono, + ..Slot::default() + }; + self.tracker.process(mono, |e| slot.push(e)); + slot.sounding = self.tracker.sounding(); + let len = self.line.len(); + self.line_at = (self.line_at + 1) % len; + self.line[self.line_at] = slot; + + let len = self.delay.len(); + self.delay[self.delay_at] = x; + self.delay_at = (self.delay_at + 1) % len; + let y = self.delay[self.delay_at]; + + let mut v = y; + let len = self.line.len(); + for i in 0..STAGES { + let slot = self.line[(self.line_at + len - self.offsets[i]) % len]; + let m: &mut dyn Tracked = match self.settings.order[i] { + Stage::Lathe => &mut self.lathe, + Stage::Temper => &mut self.temper, + Stage::Knurl => &mut self.knurl, + }; + m.ahead(slot.ahead); + for &e in &slot.events[..slot.len] { + m.event(e); + } + v = m.process(v, slot.sounding); + } + + // The pitch at the output: the oldest slot is the last module's input time minus its + // latency, which is the output time. + let last = self.line[(self.line_at + 1) % self.line.len()]; + for &e in &last.events[..last.len] { + self.pitch.event(false, e); + } + self.pitch.step(1.); + self.sounding = last.sounding; + + let len = self.dry.len(); + self.dry_at = (self.dry_at + 1) % len; + self.dry[self.dry_at] = y; + let dry = self.dry[(self.dry_at + 1) % len]; + let s = &self.settings; + self.bypass += (f32::from(s.bypass) - self.bypass) * self.smooth; + let mut out = [0.; 2]; + for c in 0..self.channels { + out[c] = v[c] * (1. - self.bypass) + dry[c] * self.bypass; + } + out + } + /// Editor data of every module, with the strip's latency. + pub fn take_analyzer(&mut self) -> AnalyzerFrame { + let latency = self.latency_samples(); + let hz = self.pitch.hz(); + AnalyzerFrame { + lathe: lathe_core::AnalyzerFrame { + latency, + ..self.lathe.take_analyzer() + }, + temper: temper_core::AnalyzerFrame { + latency, + ..self.temper.take_analyzer() + }, + knurl: knurl_core::AnalyzerFrame { + latency, + ..self.knurl.take_analyzer() + }, + hz, + note: (self.sounding && hz > 0.).then(|| hz_to_midi(hz).round().clamp(0., 127.) as u8), + latency, + sample_rate: self.rate, + } + } +} diff --git a/plugins/forge/core/src/settings.rs b/plugins/forge/core/src/settings.rs new file mode 100644 index 0000000..b296a90 --- /dev/null +++ b/plugins/forge/core/src/settings.rs @@ -0,0 +1,119 @@ +//! Host-independent controls of the strip and its modules. +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)] +pub enum Source { + /// Pitch and note starts are detected from the incoming bass. + #[default] + Audio, + /// Notes come from MIDI note input. + Midi, +} + +/// One module of the strip. +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] +pub enum Stage { + Lathe, + Temper, + Knurl, +} +impl Stage { + pub const ALL: [Stage; 3] = [Stage::Lathe, Stage::Temper, Stage::Knurl]; + pub fn name(self) -> &'static str { + match self { + Stage::Lathe => "Lathe", + Stage::Temper => "Temper", + Stage::Knurl => "Knurl", + } + } +} +pub const STAGES: usize = Stage::ALL.len(); + +/// Every order of the three modules. The first is the default: harmonic EQ, then distortion, +/// then the cycle texture, as in the standalone chain. +pub const ORDERS: [[Stage; STAGES]; 6] = [ + [Stage::Lathe, Stage::Temper, Stage::Knurl], + [Stage::Temper, Stage::Lathe, Stage::Knurl], + [Stage::Lathe, Stage::Knurl, Stage::Temper], + [Stage::Temper, Stage::Knurl, Stage::Lathe], + [Stage::Knurl, Stage::Lathe, Stage::Temper], + [Stage::Knurl, Stage::Temper, Stage::Lathe], +]; + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)] +#[serde(deny_unknown_fields)] +pub struct Settings { + /// Pitch source of the one tracker every module follows. + pub source: Source, + /// Detection threshold in dBFS for note starts (Audio source). + pub gate: f32, + /// Modules in processing order. + pub order: [Stage; STAGES], + /// Module settings. Their `source` and `gate` are replaced by the strip's, and their + /// `bypass` switches the module off. + pub lathe: lathe_core::Settings, + pub temper: temper_core::Settings, + pub knurl: knurl_core::Settings, + pub bypass: bool, +} +impl Default for Settings { + fn default() -> Self { + Self { + source: Source::Audio, + gate: lathe_core::Settings::default().gate, + order: ORDERS[0], + lathe: lathe_core::Settings::default(), + temper: temper_core::Settings::default(), + knurl: knurl_core::Settings::default(), + bypass: false, + } + } +} +impl Settings { + pub fn validate(&self) -> Result<(), &'static str> { + let ok = (-60.0..=-20.).contains(&self.gate) && ORDERS.contains(&self.order); + if !ok { + return Err("invalid settings"); + } + self.lathe.validate()?; + self.temper.validate()?; + self.knurl.validate() + } + /// True when the module is switched on. + pub fn on(&self, stage: Stage) -> bool { + !match stage { + Stage::Lathe => self.lathe.bypass, + Stage::Temper => self.temper.bypass, + Stage::Knurl => self.knurl.bypass, + } + } + pub fn set_on(&mut self, stage: Stage, on: bool) { + match stage { + Stage::Lathe => self.lathe.bypass = !on, + Stage::Temper => self.temper.bypass = !on, + Stage::Knurl => self.knurl.bypass = !on, + } + } + /// Copies the strip's pitch source and gate into every module. + pub fn share(&mut self) { + let midi = self.source == Source::Midi; + self.lathe.gate = self.gate; + self.temper.gate = self.gate; + self.knurl.gate = self.gate; + self.lathe.source = if midi { + lathe_core::Source::Midi + } else { + lathe_core::Source::Audio + }; + self.temper.source = if midi { + temper_core::Source::Midi + } else { + temper_core::Source::Audio + }; + self.knurl.source = if midi { + knurl_core::Source::Midi + } else { + knurl_core::Source::Audio + }; + } +} diff --git a/plugins/forge/core/tests/dsp.rs b/plugins/forge/core/tests/dsp.rs new file mode 100644 index 0000000..3713ab9 --- /dev/null +++ b/plugins/forge/core/tests/dsp.rs @@ -0,0 +1,219 @@ +use forge_core::{Engine, Settings, Source, Stage, ORDERS}; + +const RATE: f32 = 48000.; + +/// A bassline of saw notes with gaps, a different pitch each, at A1 to A2. +fn bass(i: usize) -> [f32; 2] { + let note = [33., 40., 36., 45., 38.][(i / 14400) % 5]; + let hz = 440. * 2f64.powf((note - 69.) / 12.); + let t = i as f64 / RATE as f64; + let on = i % 14400 < 12000; + let v = if on { + (0.4 * (2. * (hz * t).fract() - 1.)) as f32 + } else { + 0. + }; + [v, 0.8 * v] +} + +/// Module settings that change the sound, so a mismatch would show. +fn shaped() -> Settings { + let mut s = Settings::default(); + s.lathe.gains[2] = -12.; + s.lathe.tilt = -3.; + s.temper.drive = 12.; + s.temper.bias = 20.; + s.temper.push_gain = 6.; + s.temper.bright = 8.; + s.knurl.apply_pattern(&[0., -9.]); + s.knurl.time_jitter = 6.; + s.knurl.level_jitter = 2.; + s.knurl.grit = -18.; + s +} + +fn only(stage: Stage, order: [Stage; 3]) -> Settings { + let mut s = shaped(); + s.order = order; + for st in Stage::ALL { + s.set_on(st, st == stage); + } + s +} + +/// One module on its own in the strip sounds exactly like its standalone plugin, in every +/// position: the strip's tracker and note timing are the plugin's. +#[test] +fn each_module_alone_matches_its_standalone_plugin() { + let n = 80000; + for order in ORDERS { + for stage in Stage::ALL { + let s = only(stage, order); + let mut forge = Engine::new(RATE, 2).unwrap(); + forge.set_settings(s).unwrap(); + let (alone, latency): (Vec<[f32; 2]>, u32) = match stage { + Stage::Lathe => { + let mut e = lathe_core::Engine::new(RATE, 2).unwrap(); + e.set_settings(s.lathe).unwrap(); + ( + (0..n).map(|i| e.process_sample(bass(i))).collect(), + e.latency_samples(), + ) + } + Stage::Temper => { + let mut e = temper_core::Engine::new(RATE, 2).unwrap(); + e.set_settings(s.temper).unwrap(); + ( + (0..n).map(|i| e.process_sample(bass(i))).collect(), + e.latency_samples(), + ) + } + Stage::Knurl => { + let mut e = knurl_core::Engine::new(RATE, 2).unwrap(); + e.set_settings(s.knurl).unwrap(); + ( + (0..n).map(|i| e.process_sample(bass(i))).collect(), + e.latency_samples(), + ) + } + }; + let strip: Vec<[f32; 2]> = (0..n).map(|i| forge.process_sample(bass(i))).collect(); + let shift = (forge.latency_samples() - latency) as usize; + for i in 0..n - shift { + assert_eq!( + strip[i + shift], + alone[i], + "{stage:?} in {order:?}, sample {i}" + ); + } + } + } +} + +#[test] +fn the_strip_has_one_lookahead() { + let forge = Engine::new(RATE, 2).unwrap(); + let lathe = lathe_core::Engine::new(RATE, 2).unwrap().latency_samples(); + let temper = temper_core::Engine::new(RATE, 2).unwrap().latency_samples(); + let knurl = knurl_core::Engine::new(RATE, 2).unwrap().latency_samples(); + // Lathe has no latency of its own: its latency is the lookahead. + let own = (temper - lathe) + (knurl - lathe); + assert_eq!(forge.latency_samples(), lathe + own); + let ms = |s: u32| s as f32 / RATE * 1000.; + assert!( + ms(forge.latency_samples()) < 75., + "{}", + ms(forge.latency_samples()) + ); + assert!(ms(lathe + temper + knurl) > 200.); + // Changing the order keeps the latency. + let mut f = Engine::new(RATE, 2).unwrap(); + let before = f.latency_samples(); + for order in ORDERS { + f.set_settings(Settings { + order, + ..Settings::default() + }) + .unwrap(); + assert_eq!(f.latency_samples(), before); + } +} + +/// Knurl's sub-octave pattern first, then Lathe: Lathe still follows the played note, because +/// the tracker reads the strip's input. A standalone Lathe after Knurl hears the sub-octave. +#[test] +fn modules_after_knurl_follow_the_played_note() { + let mut s = Settings { + order: [Stage::Knurl, Stage::Lathe, Stage::Temper], + ..Settings::default() + }; + s.knurl.apply_pattern(&[0., -12.]); + s.temper.bypass = true; + let mut forge = Engine::new(RATE, 2).unwrap(); + forge.set_settings(s).unwrap(); + let mut knurl = knurl_core::Engine::new(RATE, 2).unwrap(); + knurl.set_settings(s.knurl).unwrap(); + let mut lathe = lathe_core::Engine::new(RATE, 2).unwrap(); + lathe.set_settings(s.lathe).unwrap(); + // One long note at A2 (110 Hz). + let hz = 110.; + let note = |i: usize| { + let v = (0.4 * (2. * (hz * i as f64 / RATE as f64).fract() - 1.)) as f32; + [v, v] + }; + let (mut strip_ok, mut chain_ok, mut frames) = (0, 0, 0); + for i in 0..96000 { + forge.process_sample(note(i)); + lathe.process_sample(knurl.process_sample(note(i))); + if i > 24000 && i % 480 == 0 { + frames += 1; + let near = |f: f32| (f / hz as f32 - 1.).abs() < 0.02; + strip_ok += usize::from(near(forge.take_analyzer().lathe.hz)); + chain_ok += usize::from(near(lathe.take_analyzer().hz)); + } + } + assert_eq!(strip_ok, frames); + assert!(chain_ok < frames / 2, "{chain_ok} of {frames}"); +} + +#[test] +fn bypass_is_the_input_delayed_by_the_latency() { + let mut e = Engine::new(RATE, 2).unwrap(); + e.set_settings(Settings { + bypass: true, + ..shaped() + }) + .unwrap(); + let latency = e.latency_samples() as usize; + let out: Vec<[f32; 2]> = (0..30000).map(|i| e.process_sample(bass(i))).collect(); + for (i, o) in out.iter().enumerate().skip(latency) { + assert_eq!(*o, bass(i - latency)); + } +} + +#[test] +fn midi_notes_drive_every_module() { + let mut s = shaped(); + s.source = Source::Midi; + let mut e = Engine::new(RATE, 1).unwrap(); + e.set_settings(s).unwrap(); + for i in 0..24000 { + if i == 100 { + e.note_on(45); + } + e.process_sample(bass(i)); + } + let f = e.take_analyzer(); + assert_eq!(f.note, Some(45)); + assert_eq!(f.lathe.note, Some(45)); + assert_eq!(f.temper.note, Some(45)); + assert_eq!(f.knurl.note, Some(45)); + assert_eq!(f.lathe.latency, e.latency_samples()); +} + +#[test] +fn settings_are_validated_and_serialise() { + assert!(Settings::default().validate().is_ok()); + let bad = Settings { + order: [Stage::Lathe, Stage::Lathe, Stage::Knurl], + ..Settings::default() + }; + assert!(bad.validate().is_err()); + assert!(Engine::new(RATE, 2).unwrap().set_settings(bad).is_err()); + let bad = Settings { + gate: -10., + ..Settings::default() + }; + assert!(bad.validate().is_err()); + let mut bad = Settings::default(); + bad.temper.drive = f32::NAN; + assert!(bad.validate().is_err()); + let s = Settings { + order: ORDERS[4], + source: Source::Midi, + ..shaped() + }; + let json = serde_json::to_string(&s).unwrap(); + assert_eq!(serde_json::from_str::(&json).unwrap(), s); + assert!(serde_json::from_str::(r#"{"gate":-40,"oops":1}"#).is_err()); +} diff --git a/plugins/forge/core/tests/realtime.rs b/plugins/forge/core/tests/realtime.rs new file mode 100644 index 0000000..466211a --- /dev/null +++ b/plugins/forge/core/tests/realtime.rs @@ -0,0 +1,72 @@ +use forge_core::{Engine, Settings, Source, Stage, ORDERS}; +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_notes_settings_and_analysis_do_not_allocate_or_free() { + let mut engine = Engine::new(48000., 2).unwrap(); + let mut settings = Settings::default(); + settings.knurl.grit = -12.; + engine.set_settings(settings).unwrap(); + CHECK.with(|v| v.set(true)); + for i in 0..96000 { + if i % 4800 == 0 { + let step = i / 4800; + settings.order = ORDERS[step % ORDERS.len()]; + settings.source = if step % 4 < 2 { + Source::Audio + } else { + Source::Midi + }; + settings.set_on(Stage::ALL[step % 3], step % 2 == 0); + settings.temper.drive = (step % 5) as f32 * 6.; + engine.set_settings(settings).unwrap(); + engine.note_on(33 + (step % 12) as u8); + } + if i % 4800 == 2400 { + engine.note_off(33 + (i / 4800 % 12) as u8); + } + let t = i as f32 / 48000.; + let x = if (i / 2400) % 2 == 0 { + (std::f32::consts::TAU * 55. * t).sin() * 0.5 + } else { + 0. + }; + std::hint::black_box(engine.process_sample([x, -x])); + 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/forge/plugin/Cargo.lock b/plugins/forge/plugin/Cargo.lock new file mode 100644 index 0000000..6c28d9e --- /dev/null +++ b/plugins/forge/plugin/Cargo.lock @@ -0,0 +1,2448 @@ +# 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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "375989decec1a0fa424442bed520fa12ede43a48475ce8c7417d2c69b32b5f6b" +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 = "forge" +version = "0.1.0" +dependencies = [ + "clap-sys", + "crossbeam-queue", + "forge-core", + "forge-ui", + "knurl-core", + "lathe-core", + "nih_plug", + "nih_plug_egui", + "serde", + "serde_json", + "temper-core", +] + +[[package]] +name = "forge-core" +version = "0.1.0" +dependencies = [ + "common-dsp", + "knurl-core", + "lathe-core", + "serde", + "temper-core", +] + +[[package]] +name = "forge-ui" +version = "0.1.0" +dependencies = [ + "common-dsp", + "common-ui", + "egui", + "forge-core", + "knurl-core", + "knurl-ui", + "lathe-core", + "lathe-ui", + "temper-core", + "temper-ui", +] + +[[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 = "knurl-core" +version = "0.1.0" +dependencies = [ + "common-dsp", + "serde", +] + +[[package]] +name = "knurl-ui" +version = "0.1.0" +dependencies = [ + "common-dsp", + "common-ui", + "egui", + "knurl-core", +] + +[[package]] +name = "lathe-core" +version = "0.1.0" +dependencies = [ + "common-dsp", + "serde", +] + +[[package]] +name = "lathe-ui" +version = "0.1.0" +dependencies = [ + "common-dsp", + "common-ui", + "egui", + "lathe-core", +] + +[[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 = "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 = "temper-core" +version = "0.1.0" +dependencies = [ + "common-dsp", + "serde", +] + +[[package]] +name = "temper-ui" +version = "0.1.0" +dependencies = [ + "common-dsp", + "common-ui", + "egui", + "temper-core", +] + +[[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/forge/plugin/Cargo.toml b/plugins/forge/plugin/Cargo.toml new file mode 100644 index 0000000..7be2ee4 --- /dev/null +++ b/plugins/forge/plugin/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "forge" +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" } +forge-core = { path = "../core" } +lathe-core = { path = "../../lathe/core" } +temper-core = { path = "../../temper/core" } +knurl-core = { path = "../../knurl/core" } +forge-ui = { path = "../ui" } +crossbeam-queue = "0.3" +serde = { version = "1", features = ["derive"] } + +[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/forge/plugin/src/lib.rs b/plugins/forge/plugin/src/lib.rs new file mode 100644 index 0000000..5e887a5 --- /dev/null +++ b/plugins/forge/plugin/src/lib.rs @@ -0,0 +1,201 @@ +//! CLAP audio effect. All DSP state is owned by the processing thread. +mod params; +use crossbeam_queue::ArrayQueue; +use forge_core::{AnalyzerFrame, Engine}; +use nih_plug::prelude::*; +use nih_plug_egui::{create_egui_editor, egui}; +use params::{Drawn, ForgeParams, FLOATS}; +use std::sync::Arc; + +struct EditorData { + ui: forge_ui::State, + gestures: [bool; FLOATS], +} +pub struct Forge { + params: Arc, + analyzer: Arc>, + engine: Option, + drawn: Drawn, + publish_count: usize, + publish_interval: usize, +} +impl Default for Forge { + fn default() -> Self { + Self { + params: Arc::new(ForgeParams::default()), + analyzer: Arc::new(ArrayQueue::new(2)), + engine: None, + drawn: Drawn::default(), + publish_count: 0, + publish_interval: 1600, + } + } +} +impl Forge { + fn settings(&mut self) -> forge_core::Settings { + let s = self.params.settings(&self.drawn); + self.drawn = Drawn { + gains: s.lathe.gains, + pattern: params::Pattern { + gains: s.knurl.pattern, + grit: s.knurl.grit_steps, + }, + }; + s + } +} +impl Plugin for Forge { + const NAME: &'static str = "Forge"; + 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 MIDI_INPUT: MidiConfig = MidiConfig::Basic; + 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 analyzer = self.analyzer.clone(); + create_egui_editor( + params.editor.clone(), + EditorData { + ui: forge_ui::State::default(), + gestures: [false; FLOATS], + }, + |ctx, _| forge_ui::style(ctx), + move |ctx, setter, data| { + while let Some(frame) = analyzer.pop() { + data.ui.accept_frame(frame); + } + let before = params.settings(¶ms.drawn()); + let mut edited = before; + nih_plug_egui::resizable_window::ResizableWindow::new("forge-editor") + .min_size(egui::vec2( + forge_ui::WIDTH as f32 - 80., + forge_ui::HEIGHT as f32 - 40., + )) + .show(ctx, ¶ms.editor, |ui| { + forge_ui::show(ui, &mut edited, &mut data.ui) + }); + params.apply( + setter, + &before, + &edited, + data.ui.gesture_active, + &mut data.gestures, + ); + // Meters and scopes follow the audio. + 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; + }; + let settings = self.settings(); + if engine.set_settings(settings).is_err() { + return false; + } + context.set_latency_samples(engine.latency_samples()); + 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, + context: &mut impl ProcessContext, + ) -> ProcessStatus { + let settings = self.settings(); + let Some(engine) = self.engine.as_mut() else { + return ProcessStatus::Normal; + }; + let _ = engine.set_settings(settings); + let mut next = context.next_event(); + for (index, mut sample) in buffer.iter_samples().enumerate() { + while let Some(event) = next { + if event.timing() as usize > index { + break; + } + match event { + NoteEvent::NoteOn { note, velocity, .. } if velocity > 0. => { + engine.note_on(note) + } + NoteEvent::NoteOn { note, .. } | NoteEvent::NoteOff { note, .. } => { + engine.note_off(note) + } + NoteEvent::Choke { note, .. } => engine.note_off(note), + _ => {} + } + next = context.next_event(); + } + let x = [ + *sample.get_mut(0).unwrap(), + if engine.channels() == 2 { + *sample.get_mut(1).unwrap() + } else { + 0. + }, + ]; + let out = engine.process_sample(x); + for (c, value) in sample.into_iter().enumerate() { + *value = out[c]; + } + self.publish_count += 1; + if self.publish_count >= self.publish_interval { + self.analyzer.force_push(engine.take_analyzer()); + self.publish_count = 0; + } + } + // The lookahead delay and the module tails must drain after input stops. + ProcessStatus::KeepAlive + } +} +impl ClapPlugin for Forge { + const CLAP_ID: &'static str = "io.narl.bass-foundry.forge"; + const CLAP_DESCRIPTION: Option<&'static str> = Some( + "One tracked channel strip: Lathe, Temper and Knurl behind one note tracker, in any order", + ); + 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::Equalizer, + ClapFeature::Stereo, + ClapFeature::Mono, + ]; +} +nih_export_clap!(Forge); diff --git a/plugins/forge/plugin/src/params.rs b/plugins/forge/plugin/src/params.rs new file mode 100644 index 0000000..0c6687d --- /dev/null +++ b/plugins/forge/plugin/src/params.rs @@ -0,0 +1,605 @@ +use forge_core::{Settings, Source, ORDERS}; +use knurl_core::{Seed, GRIT_OFF, STEPS, STEP_MIN}; +use lathe_core::HARMONICS; +use nih_plug::prelude::*; +use nih_plug_egui::EguiState; +use std::sync::{Arc, RwLock}; +use temper_core::Curve; + +#[derive(Enum, Debug, PartialEq, Eq, Clone, Copy)] +pub enum SourceParam { + #[id = "audio"] + Audio, + #[id = "midi"] + #[name = "MIDI"] + Midi, +} +/// The six orders of `ORDERS`, in the same order. +#[derive(Enum, Debug, PartialEq, Eq, Clone, Copy)] +pub enum OrderParam { + #[id = "lathe-temper-knurl"] + #[name = "Lathe, Temper, Knurl"] + LatheTemperKnurl, + #[id = "temper-lathe-knurl"] + #[name = "Temper, Lathe, Knurl"] + TemperLatheKnurl, + #[id = "lathe-knurl-temper"] + #[name = "Lathe, Knurl, Temper"] + LatheKnurlTemper, + #[id = "temper-knurl-lathe"] + #[name = "Temper, Knurl, Lathe"] + TemperKnurlLathe, + #[id = "knurl-lathe-temper"] + #[name = "Knurl, Lathe, Temper"] + KnurlLatheTemper, + #[id = "knurl-temper-lathe"] + #[name = "Knurl, Temper, Lathe"] + KnurlTemperLathe, +} +#[derive(Enum, Debug, PartialEq, Eq, Clone, Copy)] +pub enum CurveParam { + #[id = "soft"] + Soft, + #[id = "hard"] + Hard, + #[id = "fold"] + Fold, + #[id = "tube"] + Tube, +} +#[derive(Enum, Debug, PartialEq, Eq, Clone, Copy)] +pub enum SeedParam { + #[id = "same"] + #[name = "Same every note"] + Same, + #[id = "free"] + Free, +} + +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 on(name: &str) -> BoolParam { + BoolParam::new(format!("{name} on"), true) +} + +/// Knurl's drawn pattern: step gains and grit switches. +#[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] +pub struct Pattern { + pub gains: [f32; STEPS], + pub grit: [bool; STEPS], +} +impl Default for Pattern { + fn default() -> Self { + let d = knurl_core::Settings::default(); + Self { + gains: d.pattern, + grit: d.grit_steps, + } + } +} +/// Drawn data saved with the project, not exposed as automation lanes. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct Drawn { + pub gains: [f32; HARMONICS], + pub pattern: Pattern, +} +impl Default for Drawn { + fn default() -> Self { + Self { + gains: lathe_core::Settings::default().gains, + pattern: Pattern::default(), + } + } +} + +#[derive(Params)] +pub struct LatheParams { + #[persist = "gains"] + pub gains: RwLock<[f32; HARMONICS]>, + #[id = "on"] + pub on: BoolParam, + #[id = "tilt"] + pub tilt: FloatParam, + #[id = "odd-even"] + pub odd_even: FloatParam, + #[id = "between"] + pub between: FloatParam, + #[id = "width"] + pub width: FloatParam, + #[id = "smooth"] + pub smooth: FloatParam, + #[id = "mix"] + pub mix: FloatParam, + #[id = "output"] + pub output: FloatParam, + #[id = "harmonics"] + pub harmonics: IntParam, + #[id = "snap"] + pub snap: BoolParam, +} +impl Default for LatheParams { + fn default() -> Self { + let d = lathe_core::Settings::default(); + Self { + gains: RwLock::new(d.gains), + on: on("Lathe"), + tilt: linear("Lathe tilt", d.tilt, -12., 12., " dB/oct"), + odd_even: linear("Lathe odd/even", d.odd_even, -12., 12., " dB"), + between: linear("Lathe between", d.between, -24., 12., " dB"), + width: linear("Lathe width", d.width, 5., 50., " %"), + smooth: linear("Lathe smooth", d.smooth, 0., 100., " ms"), + mix: linear("Lathe mix", d.mix, 0., 100., " %"), + output: linear("Lathe output", d.output, -12., 12., " dB"), + harmonics: IntParam::new( + "Lathe harmonics", + d.harmonics as i32, + IntRange::Linear { + min: 8, + max: HARMONICS as i32, + }, + ), + snap: BoolParam::new("Lathe snap to semitone", d.snap), + } + } +} + +#[derive(Params)] +pub struct TemperParams { + #[id = "on"] + pub on: BoolParam, + #[id = "curve"] + pub curve: EnumParam, + #[id = "drive"] + pub drive: FloatParam, + #[id = "bias"] + pub bias: FloatParam, + #[id = "normalize"] + pub normalize: FloatParam, + #[id = "floor"] + pub floor: FloatParam, + #[id = "push"] + pub push_gain: FloatParam, + #[id = "bright"] + pub bright: FloatParam, + #[id = "mix"] + pub mix: FloatParam, + #[id = "output"] + pub output: FloatParam, + #[id = "push-at"] + pub push_harmonic: IntParam, + #[id = "auto-gain"] + pub auto_gain: BoolParam, +} +impl Default for TemperParams { + fn default() -> Self { + let d = temper_core::Settings::default(); + Self { + on: on("Temper"), + curve: EnumParam::new("Temper curve", CurveParam::Soft), + drive: linear("Temper drive", d.drive, 0., 36., " dB"), + bias: linear("Temper bias", d.bias, 0., 100., " %"), + normalize: linear("Temper normalize", d.normalize, 0., 100., " %"), + floor: linear("Temper floor", d.floor, 0., 2., " ×f0"), + push_gain: linear("Temper push", d.push_gain, -12., 12., " dB"), + bright: linear("Temper bright", d.bright, 0., 64., " ×f0"), + mix: linear("Temper mix", d.mix, 0., 100., " %"), + output: linear("Temper output", d.output, -12., 12., " dB"), + push_harmonic: IntParam::new( + "Temper push at", + d.push_harmonic as i32, + IntRange::Linear { min: 1, max: 16 }, + ), + auto_gain: BoolParam::new("Temper auto gain", d.auto_gain), + } + } +} + +#[derive(Params)] +pub struct KnurlParams { + #[persist = "pattern"] + pub pattern: RwLock, + #[id = "on"] + pub on: BoolParam, + #[id = "seed"] + pub seed: EnumParam, + #[id = "steps"] + pub steps: IntParam, + #[id = "edge"] + pub edge: FloatParam, + #[id = "level-jitter"] + pub level_jitter: FloatParam, + #[id = "time-jitter"] + pub time_jitter: FloatParam, + #[id = "grit"] + pub grit: FloatParam, + #[id = "tone"] + pub tone: FloatParam, + #[id = "position"] + pub position: FloatParam, + #[id = "length"] + pub length: FloatParam, + #[id = "mix"] + pub mix: FloatParam, + #[id = "output"] + pub output: FloatParam, + #[id = "snap"] + pub snap: BoolParam, +} +impl Default for KnurlParams { + fn default() -> Self { + let d = knurl_core::Settings::default(); + Self { + pattern: RwLock::new(Pattern::default()), + on: on("Knurl"), + seed: EnumParam::new("Knurl random", SeedParam::Same), + steps: IntParam::new( + "Knurl steps", + d.steps as i32, + IntRange::Linear { + min: 1, + max: STEPS as i32, + }, + ), + edge: linear("Knurl edge", d.edge, 5., 50., " %"), + level_jitter: linear("Knurl level jitter", d.level_jitter, 0., 6., " dB"), + time_jitter: linear("Knurl time jitter", d.time_jitter, 0., 10., " %"), + grit: linear("Knurl grit", d.grit, GRIT_OFF, 0., " dB").with_value_to_string(Arc::new( + |v| { + if v <= GRIT_OFF { + "Off".into() + } else { + format!("{v:.1}") + } + }, + )), + tone: FloatParam::new( + "Knurl tone", + d.tone, + FloatRange::Skewed { + min: 4., + max: 64., + factor: FloatRange::skew_factor(-1.), + }, + ) + .with_unit(" ×f0"), + position: linear("Knurl position", d.position, 0., 100., " %"), + length: linear("Knurl length", d.length, 2., 50., " %"), + mix: linear("Knurl mix", d.mix, 0., 100., " %"), + output: linear("Knurl output", d.output, -12., 12., " dB"), + snap: BoolParam::new("Knurl snap to semitone", d.snap), + } + } +} + +/// Continuous controls, in the order of the gesture slots. +pub const FLOATS: usize = 25; + +#[derive(Params)] +pub struct ForgeParams { + #[persist = "editor"] + pub editor: Arc, + #[id = "source"] + pub source: EnumParam, + #[id = "gate"] + pub gate: FloatParam, + #[id = "order"] + pub order: EnumParam, + #[id = "bypass"] + pub bypass: BoolParam, + #[nested(id_prefix = "lathe", group = "Lathe")] + pub lathe: LatheParams, + #[nested(id_prefix = "temper", group = "Temper")] + pub temper: TemperParams, + #[nested(id_prefix = "knurl", group = "Knurl")] + pub knurl: KnurlParams, +} +impl Default for ForgeParams { + fn default() -> Self { + let d = Settings::default(); + Self { + editor: EguiState::from_size(forge_ui::WIDTH, forge_ui::HEIGHT), + source: EnumParam::new("Pitch source", SourceParam::Audio), + gate: linear("Gate", d.gate, -60., -20., " dB"), + order: EnumParam::new("Order", OrderParam::LatheTemperKnurl), + bypass: BoolParam::new("Bypass", false).make_bypass(), + lathe: LatheParams::default(), + temper: TemperParams::default(), + knurl: KnurlParams::default(), + } + } +} + +const CURVES: [(CurveParam, Curve); 4] = [ + (CurveParam::Soft, Curve::Soft), + (CurveParam::Hard, Curve::Hard), + (CurveParam::Fold, Curve::Fold), + (CurveParam::Tube, Curve::Tube), +]; +const ORDER_PARAMS: [OrderParam; 6] = [ + OrderParam::LatheTemperKnurl, + OrderParam::TemperLatheKnurl, + OrderParam::LatheKnurlTemper, + OrderParam::TemperKnurlLathe, + OrderParam::KnurlLatheTemper, + OrderParam::KnurlTemperLathe, +]; + +/// Every continuous control's value, in the order of `ForgeParams::floats`. +fn float_values(s: &Settings) -> [f32; FLOATS] { + let (l, t, k) = (&s.lathe, &s.temper, &s.knurl); + [ + s.gate, + l.tilt, + l.odd_even, + l.between, + l.width, + l.smooth, + l.mix, + l.output, + t.drive, + t.bias, + t.normalize, + t.floor, + t.push_gain, + t.bright, + t.mix, + t.output, + k.edge, + k.level_jitter, + k.time_jitter, + k.grit, + k.tone, + k.position, + k.length, + k.mix, + k.output, + ] +} +fn switch(setter: &ParamSetter, p: &P, old: P::Plain, new: P::Plain) +where + P::Plain: PartialEq, +{ + if old != new { + setter.begin_set_parameter(p); + setter.set_parameter(p, new); + setter.end_set_parameter(p); + } +} + +impl ForgeParams { + /// The drawn data. Falls back to defaults while the editor holds a lock. + pub fn drawn(&self) -> Drawn { + let mut d = Drawn::default(); + if let Ok(g) = self.lathe.gains.read() { + d.gains = *g; + } + if let Ok(p) = self.knurl.pattern.read() { + d.pattern = *p; + } + d + } + /// Current settings. Drawn data falls back to `last` when the editor holds a lock, so the + /// audio thread never waits. + pub fn settings(&self, last: &Drawn) -> Settings { + let gains = self + .lathe + .gains + .try_read() + .map(|g| *g) + .unwrap_or(last.gains); + let pattern = self + .knurl + .pattern + .try_read() + .map(|p| *p) + .unwrap_or(last.pattern); + let (l, t, k) = (&self.lathe, &self.temper, &self.knurl); + let order = ORDER_PARAMS + .iter() + .position(|o| *o == self.order.value()) + .unwrap_or(0); + let curve = self.temper.curve.value(); + let mut s = Settings { + source: match self.source.value() { + SourceParam::Audio => Source::Audio, + SourceParam::Midi => Source::Midi, + }, + gate: self.gate.value(), + order: ORDERS[order], + lathe: lathe_core::Settings { + gains: gains.map(|g| { + if g.is_finite() { + g.clamp(lathe_core::GAIN_MIN, lathe_core::GAIN_MAX) + } else { + 0. + } + }), + tilt: l.tilt.value(), + odd_even: l.odd_even.value(), + between: l.between.value(), + width: l.width.value(), + harmonics: l.harmonics.value() as u32, + smooth: l.smooth.value(), + snap: l.snap.value(), + mix: l.mix.value(), + output: l.output.value(), + bypass: !l.on.value(), + ..lathe_core::Settings::default() + }, + temper: temper_core::Settings { + drive: t.drive.value(), + curve: CURVES + .iter() + .find(|(p, _)| *p == curve) + .map_or(Curve::Soft, |(_, c)| *c), + bias: t.bias.value(), + normalize: t.normalize.value(), + floor: t.floor.value(), + push_harmonic: t.push_harmonic.value() as u32, + push_gain: t.push_gain.value(), + bright: t.bright.value(), + auto_gain: t.auto_gain.value(), + mix: t.mix.value(), + output: t.output.value(), + bypass: !t.on.value(), + ..temper_core::Settings::default() + }, + knurl: knurl_core::Settings { + pattern: pattern.gains.map(|g| { + if g.is_finite() { + g.clamp(STEP_MIN, 0.) + } else { + 0. + } + }), + grit_steps: pattern.grit, + steps: k.steps.value().clamp(1, STEPS as i32) as usize, + edge: k.edge.value(), + level_jitter: k.level_jitter.value(), + time_jitter: k.time_jitter.value(), + grit: k.grit.value(), + tone: k.tone.value(), + position: k.position.value(), + length: k.length.value(), + seed: match k.seed.value() { + SeedParam::Same => Seed::Same, + SeedParam::Free => Seed::Free, + }, + snap: k.snap.value(), + mix: k.mix.value(), + output: k.output.value(), + bypass: !k.on.value(), + ..knurl_core::Settings::default() + }, + bypass: self.bypass.value(), + }; + s.share(); + s + } + fn floats(&self) -> [&FloatParam; FLOATS] { + let (l, t, k) = (&self.lathe, &self.temper, &self.knurl); + [ + &self.gate, + &l.tilt, + &l.odd_even, + &l.between, + &l.width, + &l.smooth, + &l.mix, + &l.output, + &t.drive, + &t.bias, + &t.normalize, + &t.floor, + &t.push_gain, + &t.bright, + &t.mix, + &t.output, + &k.edge, + &k.level_jitter, + &k.time_jitter, + &k.grit, + &k.tone, + &k.position, + &k.length, + &k.mix, + &k.output, + ] + } + /// 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. Drawn data is stored + /// directly. + pub fn apply( + &self, + setter: &ParamSetter, + old: &Settings, + new: &Settings, + dragging: bool, + open: &mut [bool; FLOATS], + ) { + if new.lathe.gains != old.lathe.gains { + if let Ok(mut g) = self.lathe.gains.write() { + *g = new.lathe.gains; + } + } + if new.knurl.pattern != old.knurl.pattern || new.knurl.grit_steps != old.knurl.grit_steps { + if let Ok(mut p) = self.knurl.pattern.write() { + *p = Pattern { + gains: new.knurl.pattern, + grit: new.knurl.grit_steps, + }; + } + } + let (a, b) = (float_values(old), float_values(new)); + for (i, p) in self.floats().into_iter().enumerate() { + if a[i] != b[i] { + if !open[i] { + open[i] = true; + setter.begin_set_parameter(p); + } + setter.set_parameter(p, b[i]); + } + if !dragging && open[i] { + setter.end_set_parameter(p); + open[i] = false; + } + } + let (l, t, k) = (&self.lathe, &self.temper, &self.knurl); + switch(setter, &self.bypass, old.bypass, new.bypass); + switch(setter, &l.on, !old.lathe.bypass, !new.lathe.bypass); + switch(setter, &t.on, !old.temper.bypass, !new.temper.bypass); + switch(setter, &k.on, !old.knurl.bypass, !new.knurl.bypass); + switch(setter, &l.snap, old.lathe.snap, new.lathe.snap); + switch(setter, &k.snap, old.knurl.snap, new.knurl.snap); + switch( + setter, + &t.auto_gain, + old.temper.auto_gain, + new.temper.auto_gain, + ); + switch( + setter, + &l.harmonics, + old.lathe.harmonics as i32, + new.lathe.harmonics as i32, + ); + switch( + setter, + &t.push_harmonic, + old.temper.push_harmonic as i32, + new.temper.push_harmonic as i32, + ); + switch( + setter, + &k.steps, + old.knurl.steps as i32, + new.knurl.steps as i32, + ); + let source = |s: Source| match s { + Source::Audio => SourceParam::Audio, + Source::Midi => SourceParam::Midi, + }; + switch(setter, &self.source, source(old.source), source(new.source)); + let order = + |s: &Settings| ORDER_PARAMS[ORDERS.iter().position(|o| *o == s.order).unwrap_or(0)]; + switch(setter, &self.order, order(old), order(new)); + let curve = |c: Curve| { + CURVES + .iter() + .find(|(_, k)| *k == c) + .map_or(CurveParam::Soft, |(p, _)| *p) + }; + switch( + setter, + &t.curve, + curve(old.temper.curve), + curve(new.temper.curve), + ); + let seed = |s: Seed| match s { + Seed::Same => SeedParam::Same, + Seed::Free => SeedParam::Free, + }; + switch(setter, &k.seed, seed(old.knurl.seed), seed(new.knurl.seed)); + } +} diff --git a/plugins/forge/plugin/tests/host.rs b/plugins/forge/plugin/tests/host.rs new file mode 100644 index 0000000..57096e5 --- /dev/null +++ b/plugins/forge/plugin/tests/host.rs @@ -0,0 +1,231 @@ +//! 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 = &forge::clap_entry; + assert!(entry.init.unwrap()(c"forge.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"Forge"); + assert_eq!( + CStr::from_ptr((*descriptor).id), + c"io.narl.bass-foundry.forge" + ); + 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("lathe_tilt".into(), ParamValue::F32(-3.)); + envelope + .params + .insert("lathe_harmonics".into(), ParamValue::I32(16)); + let mut gains = [0f32; 32]; + gains[2] = -12.; + gains[4] = 6.; + envelope + .fields + .insert("lathe_gains".into(), serde_json::to_string(&gains).unwrap()); + envelope + .params + .insert("lathe_snap".into(), ParamValue::Bool(false)); + // Every module off: the strip passes the input, delayed. + for module in ["lathe", "temper", "knurl"] { + envelope + .params + .insert(format!("{module}_on"), ParamValue::Bool(false)); + } + envelope.params.insert( + "order".into(), + ParamValue::String("knurl-lathe-temper".into()), + ); + envelope + .params + .insert("source".into(), ParamValue::String("midi".into())); + 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() + ); + let saved: [f32; 32] = serde_json::from_str(&restored.fields["lathe_gains"]).unwrap(); + assert_eq!(saved, gains); + for rate in [44100., 48000., 96000.] { + assert!(p.activate.unwrap()(plugin, rate, 1, 512)); + let delay = (*latency).get.unwrap()(plugin) as usize; + // One lookahead (about 67 ms), Temper's oversampling and Knurl's jitter headroom. + assert!((delay as f64 / rate - 0.072).abs() < 0.003, "{delay}"); + 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); + // With every module off a 1 kHz tone 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 { + assert!(left[i].abs() < 1e-6, "output before the lookahead"); + } 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/forge/ui/Cargo.toml b/plugins/forge/ui/Cargo.toml new file mode 100644 index 0000000..cfc789a --- /dev/null +++ b/plugins/forge/ui/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "forge-ui" +version = "0.1.0" +edition.workspace = true +license.workspace = true + +[dependencies] +egui = "0.31.1" +forge-core = { path = "../core" } +lathe-core = { path = "../../lathe/core" } +temper-core = { path = "../../temper/core" } +knurl-core = { path = "../../knurl/core" } +lathe-ui = { path = "../../lathe/ui" } +temper-ui = { path = "../../temper/ui" } +knurl-ui = { path = "../../knurl/ui" } +common-ui = { path = "../../common/ui" } +common-dsp = { path = "../../common/dsp" } diff --git a/plugins/forge/ui/src/lib.rs b/plugins/forge/ui/src/lib.rs new file mode 100644 index 0000000..5f88313 --- /dev/null +++ b/plugins/forge/ui/src/lib.rs @@ -0,0 +1,175 @@ +//! Forge editor, shared by the CLAP wrapper and the headless renderer. The module pages are +//! the standalone editors' bodies. +use common_ui::*; +use egui::{self, RichText}; +use forge_core::{AnalyzerFrame, Settings, Source, Stage, STAGES}; + +pub use common_ui::style; +pub const WIDTH: u32 = 1040; +pub const HEIGHT: u32 = 730; + +pub struct State { + pub lathe: lathe_ui::State, + pub temper: temper_ui::State, + pub knurl: knurl_ui::State, + /// Module whose page is shown. + pub page: Stage, + latency: u32, + sample_rate: f32, + /// 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 { + lathe: lathe_ui::State::default(), + temper: temper_ui::State::default(), + knurl: knurl_ui::State::default(), + page: Stage::Lathe, + latency: 0, + sample_rate: 48000., + gesture_active: false, + help: DEFAULT_HELP.into(), + } + } +} +const DEFAULT_HELP: &str = "One tracker for every module. Pick a module to edit it; switch \ + modules on and off and change their order in the chain."; +impl State { + pub fn accept_frame(&mut self, frame: AnalyzerFrame) { + self.lathe.accept_frame(frame.lathe); + self.temper.accept_frame(frame.temper); + self.knurl.accept_frame(frame.knurl); + self.latency = frame.latency; + self.sample_rate = frame.sample_rate; + } +} +fn hint(r: &egui::Response, help: &mut String, text: &str) { + if r.hovered() || r.has_focus() { + *help = text.into(); + } +} + +fn subtitle(stage: Stage) -> &'static str { + match stage { + Stage::Lathe => "harmonic EQ", + Stage::Temper => "tracked distortion", + Stage::Knurl => "cycle texture", + } +} + +/// The chain: modules in order, each with its switch, and the swaps between neighbours. +fn chain(ui: &mut egui::Ui, settings: &mut Settings, state: &mut State) { + ui.horizontal(|ui| { + caption(ui, "CHAIN"); + ui.add_space(8.); + for i in 0..STAGES { + if i > 0 { + let r = ui.button(RichText::new("<>").size(12.).color(MUTED)); + if r.clicked() { + settings.order.swap(i - 1, i); + } + hint(&r, &mut state.help, "Swap the two modules next to it."); + } + let stage = settings.order[i]; + let on = settings.on(stage); + let name = RichText::new(stage.name().to_uppercase()).size(14.); + let r = + ui.selectable_label(state.page == stage, if on { name } else { name.color(DIM) }); + if r.clicked() { + state.page = stage; + } + hint( + &r, + &mut state.help, + &format!("Show {} ({}).", stage.name(), subtitle(stage)), + ); + let r = ui.selectable_label(on, RichText::new("ON").size(11.)); + if r.clicked() { + settings.set_on(stage, !on); + } + hint( + &r, + &mut state.help, + "Switch the module on or off. Off, it still delays the audio, so the latency \ + stays.", + ); + } + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + ui.label( + RichText::new(format!( + "{:.0} ms latency, one lookahead", + state.latency as f32 / state.sample_rate.max(1.) * 1000. + )) + .size(12.) + .color(MUTED), + ); + ui.separator(); + match state.page { + Stage::Lathe => lathe_ui::toggles(ui, &mut settings.lathe), + Stage::Temper => temper_ui::toggles(ui, &mut settings.temper), + Stage::Knurl => knurl_ui::toggles(ui, &mut settings.knurl), + } + }); + }); +} + +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()); + settings.share(); + ui.add_space(2.); + header(ui, "FORGE", "TRACKED CHANNEL STRIP", |ui| { + let r = ui + .selectable_label(settings.bypass, RichText::new("BYPASS").size(13.)) + .on_hover_text("Crossfade to the delayed dry signal."); + if r.clicked() { + settings.bypass = !settings.bypass; + } + ui.separator(); + for (source, label) in [(Source::Midi, "MIDI"), (Source::Audio, "AUDIO")] { + let r = ui.selectable_label(settings.source == source, RichText::new(label).size(13.)); + if r.clicked() { + settings.source = source; + } + } + caption(ui, "PITCH FROM"); + }); + ui.add_space(6.); + panel(ui, |ui| { + ui.set_width(ui.available_width()); + chain(ui, settings, state); + }); + // A module page edits the module's own settings. Its Gate knob sets the strip's gate. + let gate = match state.page { + Stage::Lathe => { + state.lathe.help.clear(); + lathe_ui::body(ui, &mut settings.lathe, &mut state.lathe); + module_help(&mut state.help, &state.lathe.help); + settings.lathe.gate + } + Stage::Temper => { + state.temper.help.clear(); + temper_ui::body(ui, &mut settings.temper, &mut state.temper); + module_help(&mut state.help, &state.temper.help); + settings.temper.gate + } + Stage::Knurl => { + state.knurl.help.clear(); + knurl_ui::body(ui, &mut settings.knurl, &mut state.knurl); + module_help(&mut state.help, &state.knurl.help); + settings.knurl.gate + } + }; + settings.gate = gate; + settings.share(); + ui.separator(); + ui.label(RichText::new(&state.help).color(MUTED)); +} +fn module_help(help: &mut String, module: &str) { + if !module.is_empty() { + *help = module.into(); + } +} diff --git a/tools/editor-check/Cargo.lock b/tools/editor-check/Cargo.lock index d5f4398..f3f2d26 100644 --- a/tools/editor-check/Cargo.lock +++ b/tools/editor-check/Cargo.lock @@ -197,6 +197,8 @@ dependencies = [ "crucible-core", "crucible-ui", "egui", + "forge-core", + "forge-ui", "image", "knurl-core", "knurl-ui", @@ -279,6 +281,33 @@ dependencies = [ "zlib-rs", ] +[[package]] +name = "forge-core" +version = "0.1.0" +dependencies = [ + "common-dsp", + "knurl-core", + "lathe-core", + "serde", + "temper-core", +] + +[[package]] +name = "forge-ui" +version = "0.1.0" +dependencies = [ + "common-dsp", + "common-ui", + "egui", + "forge-core", + "knurl-core", + "knurl-ui", + "lathe-core", + "lathe-ui", + "temper-core", + "temper-ui", +] + [[package]] name = "image" version = "0.25.10" diff --git a/tools/editor-check/Cargo.toml b/tools/editor-check/Cargo.toml index 9b168ac..9c697ff 100644 --- a/tools/editor-check/Cargo.toml +++ b/tools/editor-check/Cargo.toml @@ -33,5 +33,7 @@ quench-core = { path = "../../plugins/quench/core" } quench-ui = { path = "../../plugins/quench/ui" } ballast-core = { path = "../../plugins/ballast/core" } ballast-ui = { path = "../../plugins/ballast/ui" } +forge-core = { path = "../../plugins/forge/core" } +forge-ui = { path = "../../plugins/forge/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 1e311b1..fa824c6 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", "quench", "ballast", + "braze", "quench", "ballast", "forge", ] .contains(&plugin) { eprintln!( "Use --plugin rivet, patina, anvil, crucible, lathe, temper, weld, knurl, planish, \ - braze, quench or ballast" + braze, quench, ballast or forge" ); std::process::exit(2); } @@ -34,7 +34,10 @@ fn main() { let braze = plugin == "braze"; let quench = plugin == "quench"; let ballast = plugin == "ballast"; - let (width, height) = if ballast { + let forge = plugin == "forge"; + let (width, height) = if forge { + (forge_ui::WIDTH, forge_ui::HEIGHT) + } else if ballast { (ballast_ui::WIDTH, ballast_ui::HEIGHT) } else if quench { (quench_ui::WIDTH, quench_ui::HEIGHT) @@ -195,6 +198,39 @@ fn main() { } knurl_state.accept_frame(engine.take_analyzer()); } + let mut forge_settings = forge_core::Settings::default(); + forge_settings.lathe.gains[1] = -9.; + forge_settings.lathe.gains[3] = 4.; + forge_settings.temper.drive = 9.; + forge_settings.order = [ + forge_core::Stage::Knurl, + forge_core::Stage::Lathe, + forge_core::Stage::Temper, + ]; + let mut forge_state = forge_ui::State::default(); + forge_state.page = match args + .iter() + .position(|a| a == "--page") + .map(|i| args[i + 1].as_str()) + { + Some("temper") => forge_core::Stage::Temper, + Some("knurl") => forge_core::Stage::Knurl, + _ => forge_core::Stage::Lathe, + }; + if forge { + // An F1 saw bass through Knurl's Fry pattern first: Lathe after it still follows F1. + let mut engine = forge_core::Engine::new(48000., 2).unwrap(); + engine.set_settings(forge_settings).unwrap(); + let mut saw = common_dsp::Saw::new(48000., 43.65); + for i in 0..36000 { + let x = (saw.sample() * 2.2).tanh() * 0.5; + engine.process_sample([x, x]); + if i % 1600 == 0 { + forge_state.accept_frame(engine.take_analyzer()); + } + } + forge_state.accept_frame(engine.take_analyzer()); + } let mut planish_settings = planish_core::Settings { depth: 80., gains: [0., 2., 3., -2.], @@ -416,7 +452,9 @@ fn main() { let session_motif = session.motifs[0].id; shared.replace(session).unwrap(); let ctx = egui::Context::default(); - if ballast { + if forge { + forge_ui::style(&ctx); + } else if ballast { ballast_ui::style(&ctx); } else if quench { quench_ui::style(&ctx); @@ -461,7 +499,9 @@ fn main() { }, |ui| { egui::CentralPanel::default().show(ui, |ui| { - if ballast { + if forge { + forge_ui::show(ui, &mut forge_settings, &mut forge_state); + } else if ballast { ballast_ui::show(ui, &mut ballast_settings, &mut ballast_state); } else if quench { quench_ui::show(ui, &mut quench_settings, &mut quench_state); diff --git a/website/src/data/plugins.ts b/website/src/data/plugins.ts index e168e0c..5053a59 100644 --- a/website/src/data/plugins.ts +++ b/website/src/data/plugins.ts @@ -229,6 +229,21 @@ const COPY: Record = { latency: '≈ 172 ms', tracksNotes: true, }, + forge: { + role: 'Tracked channel strip', + metal: 'A forge is the hearth where every piece is heated and worked.', + problem: + 'Lathe, Temper and Knurl in a row each run their own tracker: the lookaheads add up to over 200 ms, and a tracker after Knurl hears its sub-octave and follows the wrong note.', + points: [ + 'One note tracker reads the input; Lathe, Temper and Knurl follow it as modules.', + 'Any order, each module on or off, one latency of about 72 ms.', + 'Every module sounds exactly like its standalone plugin.', + 'The module pages are the standalone editors.', + ], + loadOn: 'Bass, after the synth', + latency: '≈ 72 ms', + tracksNotes: true, + }, }; export interface Plugin extends Copy { @@ -273,11 +288,6 @@ export const PLUGINS: Plugin[] = Object.entries(catalog).map(([slug, entry]) => /** Ideas from docs/ideas.md that are not built yet. */ export const IDEAS: { name: string; role: string; text: string; texture?: boolean }[] = [ - { - name: 'Ballast', - role: 'Switch-up loudness leveller', - text: 'Measures perceived loudness per switch-up and sets gain only, so every patch lands at the same loudness without compression.', - }, { name: 'Gauge', role: 'Low-end mono check',