From b3ebe4d9521ef321a9c26a22cc0f4913b6ff6104 Mon Sep 17 00:00:00 2001 From: Nils Pukropp Date: Fri, 6 Nov 2026 06:08:51 +0100 Subject: [PATCH] feat: add Lathe harmonic EQ and Temper tracked distortion Lathe places EQ bands on harmonics 1-32 of the played note, so a cut on harmonic 3 stays on harmonic 3 on every note. Temper normalises each note's level before an oversampled shaper and tunes its floor, push and bright filters to the note, so every note distorts the same. The note tracker moves from Anvil into common-dsp, together with a state-variable filter, 4x oversampler and harmonic meter. Anvil's behaviour and editor render are unchanged. docs/ideas.md collects all plugin ideas and their status. --- .gitea/workflows/check.yml | 6 +- .gitea/workflows/release.yml | 2 +- Cargo.lock | 38 + Cargo.toml | 12 +- README.md | 32 +- docs/development.md | 6 + docs/ideas.md | 101 ++ docs/lathe/CHANGELOG.md | 13 + docs/lathe/README.md | 66 + docs/lathe/assets/editor.png | Bin 0 -> 308165 bytes docs/temper/CHANGELOG.md | 14 + docs/temper/README.md | 66 + docs/temper/assets/editor.png | Bin 0 -> 286221 bytes plugins/anvil/core/src/lib.rs | 412 +---- plugins/catalog.json | 34 + plugins/common/dsp/src/lib.rs | 4 + plugins/common/dsp/src/meter.rs | 91 + plugins/common/dsp/src/oversample.rs | 131 ++ plugins/common/dsp/src/svf.rs | 106 ++ plugins/common/dsp/src/tracker.rs | 399 +++++ plugins/common/dsp/tests/blocks.rs | 225 +++ plugins/lathe/core/Cargo.toml | 12 + plugins/lathe/core/src/lib.rs | 258 +++ plugins/lathe/core/src/settings.rs | 106 ++ plugins/lathe/core/tests/dsp.rs | 139 ++ plugins/lathe/core/tests/realtime.rs | 69 + plugins/lathe/plugin/Cargo.lock | 2381 +++++++++++++++++++++++++ plugins/lathe/plugin/Cargo.toml | 25 + plugins/lathe/plugin/src/lib.rs | 189 ++ plugins/lathe/plugin/src/params.rs | 186 ++ plugins/lathe/plugin/tests/host.rs | 219 +++ plugins/lathe/ui/Cargo.toml | 11 + plugins/lathe/ui/src/lib.rs | 431 +++++ plugins/temper/core/Cargo.toml | 12 + plugins/temper/core/src/lib.rs | 405 +++++ plugins/temper/core/src/settings.rs | 138 ++ plugins/temper/core/tests/dsp.rs | 244 +++ plugins/temper/core/tests/realtime.rs | 71 + plugins/temper/plugin/Cargo.lock | 2381 +++++++++++++++++++++++++ plugins/temper/plugin/Cargo.toml | 25 + plugins/temper/plugin/src/lib.rs | 183 ++ plugins/temper/plugin/src/params.rs | 207 +++ plugins/temper/plugin/tests/host.rs | 211 +++ plugins/temper/ui/Cargo.toml | 11 + plugins/temper/ui/src/lib.rs | 413 +++++ tools/editor-check/Cargo.lock | 40 + tools/editor-check/Cargo.toml | 4 + tools/editor-check/src/main.rs | 72 +- 48 files changed, 9862 insertions(+), 339 deletions(-) create mode 100644 docs/ideas.md create mode 100644 docs/lathe/CHANGELOG.md create mode 100644 docs/lathe/README.md create mode 100644 docs/lathe/assets/editor.png create mode 100644 docs/temper/CHANGELOG.md create mode 100644 docs/temper/README.md create mode 100644 docs/temper/assets/editor.png create mode 100644 plugins/common/dsp/src/meter.rs create mode 100644 plugins/common/dsp/src/oversample.rs create mode 100644 plugins/common/dsp/src/svf.rs create mode 100644 plugins/common/dsp/src/tracker.rs create mode 100644 plugins/common/dsp/tests/blocks.rs create mode 100644 plugins/lathe/core/Cargo.toml create mode 100644 plugins/lathe/core/src/lib.rs create mode 100644 plugins/lathe/core/src/settings.rs create mode 100644 plugins/lathe/core/tests/dsp.rs create mode 100644 plugins/lathe/core/tests/realtime.rs create mode 100644 plugins/lathe/plugin/Cargo.lock create mode 100644 plugins/lathe/plugin/Cargo.toml create mode 100644 plugins/lathe/plugin/src/lib.rs create mode 100644 plugins/lathe/plugin/src/params.rs create mode 100644 plugins/lathe/plugin/tests/host.rs create mode 100644 plugins/lathe/ui/Cargo.toml create mode 100644 plugins/lathe/ui/src/lib.rs create mode 100644 plugins/temper/core/Cargo.toml create mode 100644 plugins/temper/core/src/lib.rs create mode 100644 plugins/temper/core/src/settings.rs create mode 100644 plugins/temper/core/tests/dsp.rs create mode 100644 plugins/temper/core/tests/realtime.rs create mode 100644 plugins/temper/plugin/Cargo.lock create mode 100644 plugins/temper/plugin/Cargo.toml create mode 100644 plugins/temper/plugin/src/lib.rs create mode 100644 plugins/temper/plugin/src/params.rs create mode 100644 plugins/temper/plugin/tests/host.rs create mode 100644 plugins/temper/ui/Cargo.toml create mode 100644 plugins/temper/ui/src/lib.rs diff --git a/.gitea/workflows/check.yml b/.gitea/workflows/check.yml index 6cd5edd..5d7dab2 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] + plugin: [rivet, patina, anvil, crucible, lathe, temper] steps: - uses: https://github.com/actions/checkout@v4 with: @@ -58,6 +58,8 @@ jobs: cargo run --manifest-path tools/editor-check/Cargo.toml --locked -- target/editor/patina-compact.png --plugin patina --compact cargo run --manifest-path tools/editor-check/Cargo.toml --locked -- target/editor/anvil.png --plugin anvil cargo run --manifest-path tools/editor-check/Cargo.toml --locked -- target/editor/crucible.png --plugin crucible + cargo run --manifest-path tools/editor-check/Cargo.toml --locked -- target/editor/lathe.png --plugin lathe + cargo run --manifest-path tools/editor-check/Cargo.toml --locked -- target/editor/temper.png --plugin temper - uses: https://github.com/actions/upload-artifact@v3-node20 with: name: editor-previews @@ -85,6 +87,8 @@ jobs: python3 scripts/build-plugin.py --plugin patina --target x86_64-pc-windows-gnu python3 scripts/build-plugin.py --plugin anvil --target x86_64-pc-windows-gnu python3 scripts/build-plugin.py --plugin crucible --target x86_64-pc-windows-gnu + python3 scripts/build-plugin.py --plugin lathe --target x86_64-pc-windows-gnu + python3 scripts/build-plugin.py --plugin temper --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 a753917..a146bdc 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*"] + tags: ["rivet-v*", "patina-v*", "anvil-v*", "crucible-v*", "lathe-v*", "temper-v*"] permissions: contents: read diff --git a/Cargo.lock b/Cargo.lock index d191581..1b78060 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -170,6 +170,25 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +[[package]] +name = "lathe-core" +version = "0.1.0" +dependencies = [ + "common-dsp", + "serde", + "serde_json", +] + +[[package]] +name = "lathe-ui" +version = "0.1.0" +dependencies = [ + "common-dsp", + "common-ui", + "egui", + "lathe-core", +] + [[package]] name = "libc" version = "0.2.191" @@ -460,6 +479,25 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "temper-core" +version = "0.1.0" +dependencies = [ + "common-dsp", + "serde", + "serde_json", +] + +[[package]] +name = "temper-ui" +version = "0.1.0" +dependencies = [ + "common-dsp", + "common-ui", + "egui", + "temper-core", +] + [[package]] name = "transpose" version = "0.2.3" diff --git a/Cargo.toml b/Cargo.toml index 9e255a1..1c04f28 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [workspace] resolver = "2" -members = ["plugins/common/ui", "plugins/common/dsp", "plugins/anvil/core", "plugins/anvil/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"] +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/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"] [workspace.package] edition = "2021" @@ -16,3 +16,11 @@ rivet-midi = { path = "plugins/rivet/midi" } [profile.release] lto = "thin" strip = "symbols" + +# Signal-level tests render seconds of audio; unoptimised DSP makes them crawl. +[profile.dev.package.common-dsp] +opt-level = 2 +[profile.dev.package.lathe-core] +opt-level = 2 +[profile.dev.package.temper-core] +opt-level = 2 diff --git a/README.md b/README.md index cd35551..129d185 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Rivet & Patina -Four Rust CLAP plugins for writing, designing and mixing bass music. +Six Rust CLAP plugins for writing, designing and mixing bass music. | Plugin | Purpose | Guide | | --- | --- | --- | @@ -8,17 +8,22 @@ Four Rust CLAP plugins for writing, designing and mixing bass music. | **Patina** | Smooth harsh resonances while retaining tone and transient character | [Patina](docs/patina/README.md) | | **Anvil** | Give every bass note the same clean sub: one level, one start phase | [Anvil](docs/anvil/README.md) | | **Crucible** | Capture the last bars, slice them and export clean, key-labelled samples | [Crucible](docs/crucible/README.md) | +| **Lathe** | EQ the harmonics of the played note: a cut on harmonic 3 stays on harmonic 3 | [Lathe](docs/lathe/README.md) | +| **Temper** | Distort every note the same: level and tone filters follow the note | [Temper](docs/temper/README.md) | The names come from metalwork: a **rivet** joins pieces; **patina** changes a surface while leaving its character; an **anvil** is the solid base everything is -struck on; a **crucible** melts material down to be cast again. They share a Rust foundation and keep -their own musical purpose, code, documentation, and version. +struck on; a **crucible** melts material down to be cast again; a **lathe** turns +a piece so each cut lands the same all the way round; **tempering** sets how hard +and how tough a metal ends up. They share a Rust foundation and keep their own +musical purpose, code, documentation, and version. Ideas for further plugins are +collected in [docs/ideas.md](docs/ideas.md). ## Install Download the desired plugin's Windows ZIP from its Gitea release. Extract it -and copy its `.clap` file (`Rivet.clap`, `Patina.clap`, `Anvil.clap` or -`Crucible.clap`) into: +and copy its `.clap` file (`Rivet.clap`, `Patina.clap`, `Anvil.clap`, +`Crucible.clap`, `Lathe.clap` or `Temper.clap`) into: ```text C:\Program Files\Common Files\CLAP\ @@ -26,11 +31,12 @@ 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 Rivet in the Channel Rack; -load Patina, Anvil and Crucible in mixer effect slots. +load the others in mixer effect slots. Normal branch/PR pipelines also provide a combined Windows preview ZIP in the **windows** job. Releases are separate: tags such as `rivet-v0.4.0`, -`patina-v0.2.0`, `anvil-v0.1.0` and `crucible-v0.1.0` publish independently. See [release workflow](docs/releases.md). +`patina-v0.2.0`, `anvil-v0.1.0`, `crucible-v0.1.0`, `lathe-v0.1.0` and +`temper-v0.1.0` publish independently. See [release workflow](docs/releases.md). These names replace Motif Storyboard and Resonance Compressor. Their CLAP IDs and saved-state identifiers are preserved; replace old scanned copies and rescan. @@ -59,9 +65,17 @@ plugins/ core/ Input history, capture, slicing, cleanup and export ui/ Crucible's native editor plugin/ CLAP audio-effect wrapper + lathe/ + core/ Harmonic band bank tuned to the tracked note + ui/ Lathe's native editor + plugin/ CLAP audio-effect wrapper with MIDI input + temper/ + core/ Note-tracked filters, level normalising, oversampled shaper + ui/ Temper's native editor + plugin/ CLAP audio-effect wrapper with MIDI input common/ ui/ Shared look: palette, embedded fonts, knobs and panels - dsp/ Shared filters, YIN pitch detection and WAV files + dsp/ Shared filters, note tracking, oversampling, meters, WAV files tools/editor-check/ Headless visual QA for all editors scripts/ Shared build, packaging, release, and analysis tools docs// Guide, changelog and editor preview per plugin @@ -78,6 +92,8 @@ python scripts/build-plugin.py --plugin rivet --target x86_64-pc-windows-gnu python scripts/build-plugin.py --plugin patina --target x86_64-pc-windows-gnu python scripts/build-plugin.py --plugin anvil --target x86_64-pc-windows-gnu python scripts/build-plugin.py --plugin crucible --target x86_64-pc-windows-gnu +python scripts/build-plugin.py --plugin lathe --target x86_64-pc-windows-gnu +python scripts/build-plugin.py --plugin temper --target x86_64-pc-windows-gnu python scripts/package-windows.py ``` diff --git a/docs/development.md b/docs/development.md index dc58494..7508d2a 100644 --- a/docs/development.md +++ b/docs/development.md @@ -27,6 +27,8 @@ python scripts/check-plugin.py --plugin rivet python scripts/check-plugin.py --plugin patina python scripts/check-plugin.py --plugin anvil python scripts/check-plugin.py --plugin crucible +python scripts/check-plugin.py --plugin lathe +python scripts/check-plugin.py --plugin temper python -m unittest discover -s scripts/tests -v ``` @@ -49,6 +51,8 @@ python scripts/build-plugin.py --plugin rivet --target x86_64-pc-windows-gnu python scripts/build-plugin.py --plugin patina --target x86_64-pc-windows-gnu python scripts/build-plugin.py --plugin anvil --target x86_64-pc-windows-gnu python scripts/build-plugin.py --plugin crucible --target x86_64-pc-windows-gnu +python scripts/build-plugin.py --plugin lathe --target x86_64-pc-windows-gnu +python scripts/build-plugin.py --plugin temper --target x86_64-pc-windows-gnu python scripts/package-windows.py python scripts/package-windows.py --plugin rivet python scripts/package-windows.py --plugin patina @@ -77,6 +81,8 @@ cargo run --manifest-path tools/editor-check/Cargo.toml -- /tmp/patina.png --plu cargo run --manifest-path tools/editor-check/Cargo.toml -- /tmp/patina-compact.png --plugin patina --compact cargo run --manifest-path tools/editor-check/Cargo.toml -- /tmp/anvil.png --plugin anvil cargo run --manifest-path tools/editor-check/Cargo.toml -- /tmp/crucible.png --plugin crucible +cargo run --manifest-path tools/editor-check/Cargo.toml -- /tmp/lathe.png --plugin lathe +cargo run --manifest-path tools/editor-check/Cargo.toml -- /tmp/temper.png --plugin temper ``` Patina also accepts `--silent`, `--delta`, and `--bypass` as render fixtures. diff --git a/docs/ideas.md b/docs/ideas.md new file mode 100644 index 0000000..39a565b --- /dev/null +++ b/docs/ideas.md @@ -0,0 +1,101 @@ +# Plugin ideas + +A running list of plugin ideas for riddim, dubstep and bass-music sound design. +Each entry names the problem first. Entries are grouped as released or idea. Names follow the metalwork theme of Rivet, Patina, Anvil and Crucible. + +## Problems seen in bass-music production + +1. Every bass patch brings its own sub level and phase, so the weight of a drop + jumps between switch-ups, and layered patches cancel in the sub. +2. Patches at the same peak level still differ in perceived loudness and + brightness. The usual fix is hand-set gain or clipping per patch. +3. Resampling is repetitive: bounce, chop, trim, declick, normalise, find the + root key, name, save, load into a sampler. +4. Writing wobbles: LFO shapes are drawn, synced, copied and edited for every + variation. Triplet and dotted patterns plus per-note changes take long. +5. Unison, OTT and stereo distortion widen the mids. Parts disappear in mono or + on club systems. +6. Kick and bass clash. Sidechain helps, but the sub phase at each note start + changes how the kick hits. +7. Distortion chains build up harsh resonances. (Patina covers this.) +8. Comparing a drop with a reference: the difference is usually sub/mid balance + over time, which generic meters do not show clearly. +9. Fixed-frequency tools act differently on every note. An EQ boost at 300 Hz + lifts the 4th harmonic of one note and the 7th of another; a distortion with + a fixed tone filter sounds brighter on low notes than on high notes. +10. Layered bass patches partly cancel in the mids, not only in the sub. + +## Released + +### Anvil — sub anchor (problems 1, 6) + +Replaces the band below a split frequency with a clean mono sine that follows +the bass pitch, at one level and one start phase for every note. Pitch comes +from detection with 80 ms lookahead or from MIDI. See [Anvil](anvil/README.md). + +### Crucible — resampler (problem 3) + +Records the input continuously. One click captures the last bars on the host +bar grid, slices on a grid or on hits, trims, declicks, normalises, detects the +root key and exports labelled WAVs, a full loop and an optional Serum/Vital +wavetable. See [Crucible](crucible/README.md). + +### Lathe — harmonic EQ (problem 9) + +EQ bands placed on harmonics 1–32 of the detected note instead of fixed +frequencies. "+4 dB on harmonic 3, −6 dB on harmonic 7" sounds the same on F1 +and on C2. Odd/even balance, tilt over harmonic number, and a Focus control +that lifts or cuts everything between the harmonics. Uses Anvil's pitch +tracker, or MIDI. See [Lathe](lathe/README.md). + +### Temper — note-tracked distortion (problem 9) + +A waveshaper whose tone filters before and after the shaper follow the note, so +every note distorts with the same character and the same harmonic content. +Input level is normalised before the shaper, so drive does not depend on how +loud the patch is, and the output is gain-matched. Oversampled to keep aliasing +(which is never harmonic) out. See [Temper](temper/README.md). + +## Ideas + +### Weld — layer phase alignment (problem 10) + +Takes a second bass layer through the sidechain. Per band, it rotates phase +with allpass filters (no added delay) and flips polarity so the layers sum +instead of cancel. A display shows how much level the cancellation cost. Anvil +solves the sub band; Weld solves the mids. Hardest of the list: phase matching +against a moving sidechain. + +### Ballast — switch-up loudness leveller (problem 2) + +Measures short-term perceived loudness per note or per switch-up against a +target or a reference patch and adjusts gain only, so each switch-up lands at +the same loudness without compression changing its character. Earlier working +name: Hit Leveler. Pairs with Anvil: Anvil levels the sub, Ballast the whole +patch. + +### Bellows — pitch-tracked resonator + +A comb or Karplus-style resonator tuned to the detected note. It turns noise, +distortion or drums into pitched metallic tone that is in key on every note. +Damping, harmonic spread, single or multiple combs. + +### Gauge — low-end mono check (problem 5) + +Shows phase correlation and mono-sum loss per band and per note in the bass +range, and marks the notes where widening breaks the mono sum. Optional fixes: +mono below a chosen frequency and phase rotation on the mids. Display-first, so +it is a small build. Earlier working name: Bass Mono Check. + +### Wobble sequencer (problem 4) + +Step patterns for volume, filter, formant and pitch with triplet and dotted +grids built in. Each MIDI note selects a different pattern, so a switch-up is a +different note in the piano roll. ShaperBox overlaps, but it has no note-keyed +patterns. No name yet. + +### Drop compare (problem 8) + +Loudness-matched A/B of a drop against a reference, with sub, low-mid, mid and +high energy over time: for example "your sub is 3 dB under the reference in +bars 2–4". No name yet. diff --git a/docs/lathe/CHANGELOG.md b/docs/lathe/CHANGELOG.md new file mode 100644 index 0000000..45b1f3c --- /dev/null +++ b/docs/lathe/CHANGELOG.md @@ -0,0 +1,13 @@ +# Lathe changelog + +## 0.1.0 + +- Introduce Lathe, a harmonic EQ for bass sound design. +- Bands sit on harmonics 1–32 of the played note instead of fixed frequencies, + so a cut on harmonic 3 stays on harmonic 3 on every note. +- Draw a gain per harmonic; Tilt, Odd/Even and Between shape the whole series. +- Detect pitch and note starts from the audio with 67 ms lookahead, or follow + MIDI notes sent to the effect. Filters retune at each note's attack. +- Controls: Tilt, Odd/Even, Between, Width, Harmonics, Smooth, Gate, Mix, + Output, Snap to semitone, Bypass. Shapes: Flat, Odd only, Even only, Hollow. +- Harmonic editor shows the measured level of each harmonic before and after. diff --git a/docs/lathe/README.md b/docs/lathe/README.md new file mode 100644 index 0000000..4f9cb7c --- /dev/null +++ b/docs/lathe/README.md @@ -0,0 +1,66 @@ +# Lathe + +Lathe is an EQ whose bands sit on the harmonics of the note being played. +Current version **0.1.0**. + +A normal EQ works in fixed frequencies. A cut at 130 Hz takes out the 3rd +harmonic of an F1 bass, the 2nd of a C2, and the fundamental of a C3, so the +same bass sounds different on every note of a riddim line. Lathe follows the +pitch and places one band on each harmonic: "−12 dB on harmonic 3" stays on +harmonic 3 whatever note plays. + +![Lathe](assets/editor.png) + +## Install on Windows + +Copy `Lathe.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 Lathe in a mixer slot of the bass, after the synth and before bus +processing. Keep the font license with redistributed packages. + +## Work with it + +1. Play the bass. The note readout shows what Lathe tracks; the lower strip of the + editor shows each harmonic's level going in (grey) and coming out (pink). +2. Draw gains on the harmonic bars. Drag across bars to paint a shape; + Shift-drag for fine steps; double-click a bar to reset it. +3. Use the macros for the whole series: + - **Tilt** brightens or darkens in dB per octave of harmonic number. The + fundamental is the pivot. + - **Odd/Even** lifts odd harmonics and lowers even ones (positive, more + square-like) or the reverse (negative, more octave-like). + - **Between** sets the gain halfway between harmonics. Cut it to clean up noise, + beating and inharmonic grit; lift it for dirt. +4. **Width** sets every band's bandwidth as a share of the harmonic spacing. Narrow + bands touch only the harmonic; wide bands also move its surroundings. + +Other controls: + +- **Harmonics** is how many harmonics are shaped (8–32). Higher harmonics pass + unchanged. +- **Smooth** is the retune time for slides and pitch bends. A new note always + retunes at once, on its attack. +- **Gate** is the input level that counts as a note. Raise it if tails or reverb + start new notes. +- **Mix** blends with the delayed dry signal; **Output** trims the level. +- **Snap to semitone** rounds the detected pitch. Turn it off for slides. +- **Shapes** set the drawn gains: Flat, Odd only, Even only, or Hollow (harmonics + 2–4 cut). + +The drawn gains are saved with the project but are not automation parameters; +the macros are. + +### Pitch from MIDI + +For basses whose fundamental is unclear (heavy FM, formant or noise patches), +select **MIDI** and route the bass's MIDI notes to Lathe. In FL Studio, set the +bass channel's MIDI output port and Lathe's input port to the same number. + +## Timing and limits + +Detection uses about 67 ms of lookahead, reported to the host for delay +compensation, so the bands are tuned before each note's attack leaves the +plugin. Pitch range is 30–500 Hz, one note at a time; chords are not separated. +Before the first note Lathe passes audio unchanged; between notes it holds the +last tuning so tails keep their shape. Bands above 0.45 × the sample rate are +skipped. diff --git a/docs/lathe/assets/editor.png b/docs/lathe/assets/editor.png new file mode 100644 index 0000000000000000000000000000000000000000..fb3980051f796720921bff18432a9df1e6e83150 GIT binary patch literal 308165 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νLs3*a~p@_?Cl%_^9c~HKQ{S+k7 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 z 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 self.start(s, pitch, glide), + NoteEvent::Move { pitch } => { + if !s.snap { + self.voice.target = midi_to_hz(pitch + 12. * s.octave as f32); + } + } + NoteEvent::Stop => self.voice.releasing = true, + } + } + fn start(&mut self, s: &Settings, pitch: f32, glide: bool) { + let note = if s.snap { pitch.round() } else { pitch }; + let hz = midi_to_hz(note + 12. * s.octave as f32); + let audible = self.voice.amp > 1e-4 && !self.voice.releasing; + if glide && audible { + self.voice.target = hz; + return; + } + if s.retrigger || !audible { + if self.voice.amp > 1e-4 { + // Restarting the phase mid-cycle would click; the old cycle fades out instead. + self.old = self.voice; + self.old_gain = 1.; + } + self.voice = Voice { + phase: s.phase / 360., + hz, + target: hz, + amp: 0., + releasing: false, + }; + } else { + self.voice.target = hz; + self.voice.hz = hz; + } + self.note_peak = 0.; + } +} + pub struct Engine { rate: f32, channels: usize, @@ -95,37 +122,10 @@ pub struct Engine { delay: Vec<[f32; 2]>, delay_at: usize, crossover: [Crossover; 2], - detect: [Biquad; 2], - decimate: usize, - decimate_count: usize, - detect_rate: f32, - ring: Vec, - ring_at: usize, - scratch: Vec, - yin: Yin, - hop: usize, - hop_count: usize, - gate_env: f32, - gate_release: f32, - gate_open: bool, - gate_hold: usize, - clock: u64, - events: [Event; EVENTS], - event_head: usize, - event_len: usize, - /// Output-time note state. - sounding: bool, - pending: bool, - tracked: f32, - candidate: Option<(f32, u8)>, - voice: Voice, - old: Voice, - old_gain: f32, + tracker: Tracker, + synth: Synth, glide: f32, - held: [u8; 16], - held_len: usize, low_env: f32, - note_peak: f32, env_coef: f32, smooth: f32, level: f32, @@ -150,12 +150,8 @@ impl Engine { if !(1..=2).contains(&channels) { return Err("unsupported channel count"); } - let decimate = (rate / DETECT_RATE).round().max(1.) as usize; - let detect_rate = rate / decimate as f32; - let max_lag = (detect_rate / MIN_HZ).ceil() as usize; - // YIN needs one comparison window of at least the longest period after the lags. - let analysis = 2 * max_lag + 3; - let latency = analysis * decimate; + let tracker = Tracker::new(rate, TrackerConfig::SUB); + let latency = tracker.latency(); let settings = Settings::default(); let mut e = Self { rate, @@ -165,39 +161,10 @@ impl Engine { delay: vec![[0.; 2]; latency + 1], delay_at: 0, crossover: [Crossover::new(rate, settings.split); 2], - detect: [Biquad::lowpass(rate, 400., std::f32::consts::FRAC_1_SQRT_2); 2], - decimate, - decimate_count: 0, - detect_rate, - ring: vec![0.; analysis], - ring_at: 0, - scratch: vec![0.; analysis], - yin: Yin::new(max_lag + 2), - hop: ((detect_rate * HOP_MS * 0.001) as usize).max(1), - hop_count: 0, - gate_env: 0., - gate_release: 1. - coefficient(rate, 30.), - gate_open: false, - gate_hold: 0, - clock: 0, - events: [Event { - time: 0, - kind: Kind::Release, - }; EVENTS], - event_head: 0, - event_len: 0, - sounding: false, - pending: false, - tracked: 0., - candidate: None, - voice: Voice::default(), - old: Voice::default(), - old_gain: 0., + tracker, + synth: Synth::default(), glide: 1., - held: [0; 16], - held_len: 0, low_env: 0., - note_peak: 0., env_coef: coefficient(rate, 10.), smooth: coefficient(rate, 10.), level: db_to_gain(settings.level), @@ -233,8 +200,11 @@ impl Engine { x.retune(self.rate, s.split); } } - if s.source != old.source { - self.release_all(); + if self + .tracker + .set(s.source == Source::Midi, s.gate, s.glide > 0.) + { + self.synth.voice.releasing = true; } self.glide = if s.glide <= 0. { 1. @@ -244,34 +214,14 @@ impl Engine { self.settings = s; Ok(()) } - fn release_all(&mut self) { - self.voice.releasing = true; - self.sounding = false; - self.pending = false; - self.held_len = 0; - self.event_len = 0; - self.candidate = None; - } pub fn reset(&mut self) { self.delay.fill([0.; 2]); for x in &mut self.crossover { x.reset(); } - for f in &mut self.detect { - f.reset(); - } - self.ring.fill(0.); - self.decimate_count = 0; - self.hop_count = 0; - self.gate_env = 0.; - self.gate_open = false; - self.gate_hold = 0; - self.release_all(); - self.voice = Voice::default(); - self.old = Voice::default(); - self.old_gain = 0.; + self.tracker.reset(); + self.synth = Synth::default(); self.low_env = 0.; - self.note_peak = 0.; self.low_power = 0.; self.sub_power = 0.; self.scope_low = [0.; 2 * SCOPE]; @@ -279,190 +229,10 @@ impl Engine { } /// MIDI note start at the current input sample. Used when the source is MIDI. pub fn note_on(&mut self, note: u8) { - self.push(Kind::NoteOn(note.min(127))); + self.tracker.note_on(note); } pub fn note_off(&mut self, note: u8) { - self.push(Kind::NoteOff(note.min(127))); - } - fn push(&mut self, kind: Kind) { - if self.event_len == EVENTS { - // Dropping the oldest keeps the newest note state; overflow only happens on floods. - self.event_head = (self.event_head + 1) % EVENTS; - self.event_len -= 1; - } - let at = (self.event_head + self.event_len) % EVENTS; - self.events[at] = Event { - time: self.clock, - kind, - }; - self.event_len += 1; - } - /// Detected pitch of the most recent analysis window, in fractional MIDI notes. - fn estimate(&mut self) -> Option { - let n = self.ring.len(); - for i in 0..n { - self.scratch[i] = self.ring[(self.ring_at + i) % n]; - } - let (hz, clarity) = self - .yin - .estimate(&self.scratch, self.detect_rate, MIN_HZ, MAX_HZ)?; - (clarity >= CLARITY).then(|| hz_to_midi(hz)) - } - fn start(&mut self, pitch: f32, glide: bool) { - let s = self.settings; - let note = if s.snap { pitch.round() } else { pitch }; - let hz = midi_to_hz(note + 12. * s.octave as f32); - self.tracked = pitch; - self.candidate = None; - self.pending = false; - self.sounding = true; - let audible = self.voice.amp > 1e-4 && !self.voice.releasing; - if glide && audible { - self.voice.target = hz; - return; - } - if s.retrigger || !audible { - if self.voice.amp > 1e-4 { - // Restarting the phase mid-cycle would click; the old cycle fades out instead. - self.old = self.voice; - self.old_gain = 1.; - } - self.voice = Voice { - phase: s.phase / 360., - hz, - target: hz, - amp: 0., - releasing: false, - }; - } else { - self.voice.target = hz; - self.voice.hz = hz; - } - self.note_peak = 0.; - } - fn stop(&mut self) { - self.voice.releasing = true; - self.sounding = false; - self.pending = false; - self.candidate = None; - } - fn handle(&mut self, kind: Kind) { - let midi = self.settings.source == Source::Midi; - match kind { - Kind::Onset if !midi => match self.estimate() { - Some(p) => self.start(p, false), - None => { - self.pending = true; - self.sounding = true; - } - }, - Kind::Release if !midi => self.stop(), - Kind::NoteOn(n) if midi => { - let len = self.held_len; - if let Some(i) = self.held[..len].iter().position(|h| *h == n) { - self.held.copy_within(i + 1..len, i); - self.held_len -= 1; - } - if self.held_len == self.held.len() { - self.held.copy_within(1.., 0); - self.held_len -= 1; - } - let legato = self.held_len > 0; - self.held[self.held_len] = n; - self.held_len += 1; - self.start(n as f32, legato && self.settings.glide > 0.); - } - Kind::NoteOff(n) if midi => { - let len = self.held_len; - let Some(i) = self.held[..len].iter().position(|h| *h == n) else { - return; - }; - let top = i + 1 == len; - self.held.copy_within(i + 1..len, i); - self.held_len -= 1; - if self.held_len == 0 { - self.stop(); - } else if top { - let next = self.held[self.held_len - 1]; - self.start(next as f32, self.settings.glide > 0.); - } - } - _ => {} - } - } - /// Regular analysis; its window starts at the current output time. - fn hop_analysis(&mut self) { - if self.settings.source != Source::Audio || !self.sounding { - return; - } - let Some(p) = self.estimate() else { - return; - }; - if self.pending { - self.start(p, false); - return; - } - if (p - self.tracked).abs() >= JUMP { - match self.candidate { - Some((c, count)) if (c - p).abs() < 0.5 => { - if count + 1 >= 2 { - self.start(p, self.settings.glide > 0.); - } else { - self.candidate = Some((p, count + 1)); - } - } - _ => self.candidate = Some((p, 1)), - } - } else { - self.candidate = None; - self.tracked += 0.3 * (p - self.tracked); - if !self.settings.snap { - self.voice.target = midi_to_hz(self.tracked + 12. * self.settings.octave as f32); - } - } - } - fn detect(&mut self, x: [f32; 2]) { - let mono = if self.channels == 2 { - 0.5 * (x[0] + x[1]) - } else { - x[0] - }; - let d = self.detect[0].process(mono); - let d = self.detect[1].process(d); - if self.settings.source == Source::Audio { - let a = d.abs(); - self.gate_env = if a > self.gate_env { - a - } else { - self.gate_env * self.gate_release - }; - let level = gain_to_db(self.gate_env); - if level > self.settings.gate { - self.gate_hold = (self.rate * GATE_HOLD_MS * 0.001) as usize; - if !self.gate_open { - self.gate_open = true; - self.push(Kind::Onset); - } - } else if self.gate_open && level < self.settings.gate - GATE_HYSTERESIS_DB { - if self.gate_hold == 0 { - self.gate_open = false; - self.push(Kind::Release); - } else { - self.gate_hold -= 1; - } - } - } - self.decimate_count += 1; - if self.decimate_count >= self.decimate { - self.decimate_count = 0; - self.ring[self.ring_at] = d; - self.ring_at = (self.ring_at + 1) % self.ring.len(); - self.hop_count += 1; - if self.hop_count >= self.hop { - self.hop_count = 0; - self.hop_analysis(); - } - } + self.tracker.note_off(note); } #[inline] fn shape(&self, x: f32) -> f32 { @@ -476,7 +246,7 @@ impl Engine { fn oscillator(&mut self) -> f32 { let attack = 1. / (self.rate * ATTACK_MS * 0.001); let release = 1. / (self.rate * RELEASE_MS * 0.001); - let v = &mut self.voice; + let v = &mut self.synth.voice; v.amp = if v.releasing { (v.amp - release).max(0.) } else { @@ -488,31 +258,28 @@ impl Engine { out += (TAU * v.phase).sin() * v.amp; v.phase = (v.phase + v.hz / self.rate).fract(); } - if self.old_gain > 0. { - let o = &mut self.old; - out += (TAU * o.phase).sin() * o.amp * self.old_gain; + let s = &mut self.synth; + if s.old_gain > 0. { + let o = &mut s.old; + out += (TAU * o.phase).sin() * o.amp * s.old_gain; o.phase = (o.phase + o.hz / self.rate).fract(); - self.old_gain = (self.old_gain - 1. / (self.rate * CROSSFADE_MS * 0.001)).max(0.); + s.old_gain = (s.old_gain - 1. / (self.rate * CROSSFADE_MS * 0.001)).max(0.); } self.shape(out) } pub fn process_sample(&mut self, x: [f32; 2], monitor: Monitor) -> [f32; 2] { - self.detect(x); + let mono = if self.channels == 2 { + 0.5 * (x[0] + x[1]) + } else { + x[0] + }; + let (synth, settings) = (&mut self.synth, &self.settings); + self.tracker.process(mono, |e| synth.event(settings, e)); let len = self.delay.len(); self.delay[self.delay_at] = x; self.delay_at = (self.delay_at + 1) % len; // The slot after the newest write is the oldest: exactly `latency` samples ago. let y = self.delay[self.delay_at]; - while self.event_len > 0 { - let e = self.events[self.event_head]; - if e.time + self.latency as u64 > self.clock { - break; - } - self.event_head = (self.event_head + 1) % EVENTS; - self.event_len -= 1; - self.handle(e.kind); - } - self.clock += 1; let s = self.settings; let (l0, h0) = self.crossover[0].process(y[0]); let (l1, h1) = if self.channels == 2 { @@ -523,11 +290,11 @@ impl Engine { let low = 0.5 * (l0 + l1); self.low_env += (low * low - self.low_env) * self.env_coef; let env = self.low_env.sqrt(); - if !self.voice.releasing { - self.note_peak = self.note_peak.max(env); + if !self.synth.voice.releasing { + self.synth.note_peak = self.synth.note_peak.max(env); } - let follow = if self.note_peak > 1e-6 { - (env / self.note_peak).min(1.) + let follow = if self.synth.note_peak > 1e-6 { + (env / self.synth.note_peak).min(1.) } else { 1. }; @@ -570,9 +337,10 @@ impl Engine { scope_ms: (self.scope_stride * SCOPE) as f32 / self.rate * 1000., ..AnalyzerFrame::default() }; - if self.voice.amp > 0. && !self.voice.releasing { - f.hz = self.voice.hz; - f.note = Some(hz_to_midi(self.voice.hz).round().clamp(0., 127.) as u8); + let v = self.synth.voice; + if v.amp > 0. && !v.releasing { + f.hz = v.hz; + f.note = Some(hz_to_midi(v.hz).round().clamp(0., 127.) as u8); } // Trigger on the latest rising zero crossing that still leaves a full window behind it. let n = 2 * SCOPE; diff --git a/plugins/catalog.json b/plugins/catalog.json index f4d99c3..d42b276 100644 --- a/plugins/catalog.json +++ b/plugins/catalog.json @@ -64,5 +64,39 @@ "crucible-core", "crucible-ui" ] + }, + "lathe": { + "name": "Lathe", + "description": "EQ the harmonics of the played note: a cut on harmonic 3 stays on harmonic 3", + "manifest": "plugins/lathe/plugin/Cargo.toml", + "library": "lathe", + "documentation": "docs/lathe", + "clap_id": "io.storyboard.harmonic-eq", + "licenses": { + "plugins/common/ui/assets/OFL.txt": "licenses/Roboto-OFL.txt" + }, + "packages": [ + "common-ui", + "common-dsp", + "lathe-core", + "lathe-ui" + ] + }, + "temper": { + "name": "Temper", + "description": "Distortion whose drive and tone filters follow the note, so every note distorts the same", + "manifest": "plugins/temper/plugin/Cargo.toml", + "library": "temper", + "documentation": "docs/temper", + "clap_id": "io.storyboard.tracked-distortion", + "licenses": { + "plugins/common/ui/assets/OFL.txt": "licenses/Roboto-OFL.txt" + }, + "packages": [ + "common-ui", + "common-dsp", + "temper-core", + "temper-ui" + ] } } diff --git a/plugins/common/dsp/src/lib.rs b/plugins/common/dsp/src/lib.rs index 9a2b878..b6c8f2a 100644 --- a/plugins/common/dsp/src/lib.rs +++ b/plugins/common/dsp/src/lib.rs @@ -1,4 +1,8 @@ //! Shared allocation-free DSP building blocks: filters, pitch detection, notes, WAV files. +pub mod meter; +pub mod oversample; +pub mod svf; +pub mod tracker; pub mod wav; use std::f32::consts::TAU; diff --git a/plugins/common/dsp/src/meter.rs b/plugins/common/dsp/src/meter.rs new file mode 100644 index 0000000..fbe7855 --- /dev/null +++ b/plugins/common/dsp/src/meter.rs @@ -0,0 +1,91 @@ +//! Levels of the harmonics of a known fundamental, measured with Hann-windowed Goertzel +//! filters. Work is spread evenly over the samples, so there is no per-window spike. +use std::f32::consts::TAU; + +pub const HARMONICS: usize = 32; + +pub struct HarmonicMeter { + rate: f32, + window: Vec, + count: usize, + hz: f32, + coef: [f32; HARMONICS], + s1: [f32; HARMONICS], + s2: [f32; HARMONICS], + levels: [f32; HARMONICS], +} +impl HarmonicMeter { + /// Window of about `ms`; 85 ms resolves harmonics of fundamentals down to 30 Hz. + pub fn new(rate: f32, ms: f32) -> Self { + let n = ((rate * ms * 0.001) as usize).max(64); + Self { + rate, + window: (0..n) + .map(|i| 0.5 - 0.5 * (TAU * i as f32 / n as f32).cos()) + .collect(), + count: 0, + hz: 0., + coef: [0.; HARMONICS], + s1: [0.; HARMONICS], + s2: [0.; HARMONICS], + levels: [-120.; HARMONICS], + } + } + /// Peak level in dBFS of each harmonic (index 0 is the fundamental) from the last + /// complete window. Harmonics above 0.45 × the sample rate read −120. + pub fn levels(&self) -> &[f32; HARMONICS] { + &self.levels + } + /// Fundamental of the last complete window, 0 if none. + pub fn hz(&self) -> f32 { + self.hz + } + /// Feeds one sample. `hz` is read at the start of each window (0 = no note: skip it). + /// Returns true when a window completed and `levels` changed. + #[inline] + pub fn push(&mut self, x: f32, hz: f32) -> bool { + if self.count == 0 { + self.hz = hz; + for k in 0..HARMONICS { + let f = hz * (k + 1) as f32; + self.coef[k] = if hz > 0. && f < 0.45 * self.rate { + 2. * (TAU * f / self.rate).cos() + } else { + 0. + }; + } + self.s1 = [0.; HARMONICS]; + self.s2 = [0.; HARMONICS]; + } + let w = x * self.window[self.count]; + for k in 0..HARMONICS { + let s = w + self.coef[k] * self.s1[k] - self.s2[k]; + self.s2[k] = self.s1[k]; + self.s1[k] = s; + } + self.count += 1; + if self.count < self.window.len() { + return false; + } + self.count = 0; + let n = self.window.len() as f32; + for k in 0..HARMONICS { + let f = self.hz * (k + 1) as f32; + self.levels[k] = if self.hz > 0. && f < 0.45 * self.rate { + let c = self.coef[k]; + let p = + self.s1[k] * self.s1[k] + self.s2[k] * self.s2[k] - c * self.s1[k] * self.s2[k]; + // Hann coherent gain is 0.5: a sine of peak A gives |X| = A·N/4. + let amp = 4. * p.max(0.).sqrt() / n; + 20. * amp.max(1e-6).log10() + } else { + -120. + }; + } + true + } + pub fn reset(&mut self) { + self.count = 0; + self.levels = [-120.; HARMONICS]; + } +} diff --git a/plugins/common/dsp/src/oversample.rs b/plugins/common/dsp/src/oversample.rs new file mode 100644 index 0000000..5d08839 --- /dev/null +++ b/plugins/common/dsp/src/oversample.rs @@ -0,0 +1,131 @@ +//! 4× oversampling with two linear-phase half-band FIR stages. The round trip (up, then +//! down) delays the signal by a whole number of base-rate samples, `latency()`. +const STAGE1_HALF: usize = 31; // 63 taps at 2×: steep, carries the audio band edge +const STAGE2_HALF: usize = 11; // 23 taps at 4×: the band edge is far from its images +const BETA: f32 = 9.; + +/// Kaiser-windowed half-band lowpass with gain `gain`, `2 * half + 1` taps. +fn halfband(half: usize, gain: f32) -> Vec { + fn i0(x: f32) -> f32 { + let (mut sum, mut term) = (1f64, 1f64); + let y = (x as f64 / 2.).powi(2); + for k in 1..50 { + term *= y / (k * k) as f64; + sum += term; + } + sum as f32 + } + let n = 2 * half + 1; + let norm = i0(BETA); + let mut h: Vec = (0..n) + .map(|i| { + let m = i as f32 - half as f32; + let sinc = if m == 0. { + 0.5 + } else { + (std::f32::consts::FRAC_PI_2 * m).sin() / (std::f32::consts::PI * m) + }; + let r = m / half as f32; + sinc * i0(BETA * (1. - r * r).max(0.).sqrt()) / norm + }) + .collect(); + let sum: f32 = h.iter().sum(); + for v in &mut h { + *v *= gain / sum; + } + h +} + +/// FIR with a doubled circular buffer so every convolution reads one contiguous slice. +struct Fir { + taps: Vec, + buf: Vec, + at: usize, +} +impl Fir { + fn new(taps: Vec) -> Self { + let n = taps.len(); + Self { + taps, + buf: vec![0.; 2 * n], + at: 0, + } + } + #[inline] + fn process(&mut self, x: f32) -> f32 { + let n = self.taps.len(); + self.at = if self.at == 0 { n - 1 } else { self.at - 1 }; + self.buf[self.at] = x; + self.buf[self.at + n] = x; + let window = &self.buf[self.at..self.at + n]; + window.iter().zip(&self.taps).map(|(a, b)| a * b).sum() + } + fn reset(&mut self) { + self.buf.fill(0.); + self.at = 0; + } +} + +/// One channel of 4× oversampling. Allocation-free after `new`. +pub struct Oversampler { + up1: Fir, + up2: Fir, + down2: Fir, + down1: Fir, + /// Two samples at 4× make the round trip a whole number of base samples. + pad: [f32; 2], +} +impl Default for Oversampler { + fn default() -> Self { + Self::new() + } +} +impl Oversampler { + pub const FACTOR: usize = 4; + pub fn new() -> Self { + Self { + up1: Fir::new(halfband(STAGE1_HALF, 2.)), + up2: Fir::new(halfband(STAGE2_HALF, 2.)), + down2: Fir::new(halfband(STAGE2_HALF, 1.)), + down1: Fir::new(halfband(STAGE1_HALF, 1.)), + pad: [0.; 2], + } + } + /// Round-trip delay in base-rate samples. + pub const fn latency() -> usize { + STAGE1_HALF + STAGE2_HALF.div_ceil(2) + } + #[inline] + pub fn up(&mut self, x: f32) -> [f32; 4] { + let a = self.up1.process(x); + let b = self.up1.process(0.); + let mut out = [ + self.up2.process(a), + self.up2.process(0.), + self.up2.process(b), + self.up2.process(0.), + ]; + // Delay by two 4× samples. + let [p0, p1] = self.pad; + self.pad = [out[2], out[3]]; + out = [p0, p1, out[0], out[1]]; + out + } + #[inline] + pub fn down(&mut self, y: [f32; 4]) -> f32 { + let a = self.down2.process(y[0]); + self.down2.process(y[1]); + let b = self.down2.process(y[2]); + self.down2.process(y[3]); + let out = self.down1.process(a); + self.down1.process(b); + out + } + pub fn reset(&mut self) { + self.up1.reset(); + self.up2.reset(); + self.down2.reset(); + self.down1.reset(); + self.pad = [0.; 2]; + } +} diff --git a/plugins/common/dsp/src/svf.rs b/plugins/common/dsp/src/svf.rs new file mode 100644 index 0000000..abe88d7 --- /dev/null +++ b/plugins/common/dsp/src/svf.rs @@ -0,0 +1,106 @@ +//! Trapezoidal state-variable filter (Simper/Cytomic). Stable and click-free under fast +//! retuning, so it can follow a gliding note. Coefficients are separate from state, so one +//! set can drive both channels. +use std::f32::consts::PI; + +#[derive(Clone, Copy, Debug, PartialEq)] +pub struct SvfCoef { + a1: f32, + a2: f32, + a3: f32, + m0: f32, + m1: f32, + m2: f32, +} +impl Default for SvfCoef { + /// Identity: passes the input unchanged. + fn default() -> Self { + Self::IDENTITY + } +} +impl SvfCoef { + pub const IDENTITY: Self = Self { + a1: 1., + a2: 0., + a3: 0., + m0: 1., + m1: 0., + m2: 0., + }; + fn base(rate: f32, hz: f32, k: f32, warp: f32) -> (f32, f32, f32) { + let g = (PI * (hz / rate).clamp(1e-6, 0.49)).tan() * warp; + let a1 = 1. / (1. + g * (g + k)); + let a2 = g * a1; + (a1, a2, g * a2) + } + /// Peaking filter. At 0 dB it is an exact identity. + pub fn bell(rate: f32, hz: f32, q: f32, gain_db: f32) -> Self { + let a = 10f32.powf(gain_db / 40.); + let k = 1. / (q.max(1e-3) * a); + let (a1, a2, a3) = Self::base(rate, hz, k, 1.); + Self { + a1, + a2, + a3, + m0: 1., + m1: k * (a * a - 1.), + m2: 0., + } + } + pub fn lowpass(rate: f32, hz: f32, q: f32) -> Self { + let (a1, a2, a3) = Self::base(rate, hz, 1. / q.max(1e-3), 1.); + Self { + a1, + a2, + a3, + m0: 0., + m1: 0., + m2: 1., + } + } + pub fn highpass(rate: f32, hz: f32, q: f32) -> Self { + let k = 1. / q.max(1e-3); + let (a1, a2, a3) = Self::base(rate, hz, k, 1.); + Self { + a1, + a2, + a3, + m0: 1., + m1: -k, + m2: -1., + } + } + pub fn high_shelf(rate: f32, hz: f32, q: f32, gain_db: f32) -> Self { + let a = 10f32.powf(gain_db / 40.); + let k = 1. / q.max(1e-3); + let (a1, a2, a3) = Self::base(rate, hz, k, a.sqrt()); + Self { + a1, + a2, + a3, + m0: a * a, + m1: k * (1. - a) * a, + m2: 1. - a * a, + } + } +} + +#[derive(Clone, Copy, Debug, Default)] +pub struct Svf { + ic1: f32, + ic2: f32, +} +impl Svf { + #[inline] + pub fn process(&mut self, c: &SvfCoef, v0: f32) -> f32 { + let v3 = v0 - self.ic2; + let v1 = c.a1 * self.ic1 + c.a2 * v3; + let v2 = self.ic2 + c.a2 * self.ic1 + c.a3 * v3; + self.ic1 = 2. * v1 - self.ic1; + self.ic2 = 2. * v2 - self.ic2; + c.m0 * v0 + c.m1 * v1 + c.m2 * v2 + } + pub fn reset(&mut self) { + *self = Self::default(); + } +} diff --git a/plugins/common/dsp/src/tracker.rs b/plugins/common/dsp/src/tracker.rs new file mode 100644 index 0000000..c2e2d59 --- /dev/null +++ b/plugins/common/dsp/src/tracker.rs @@ -0,0 +1,399 @@ +//! Note tracker with lookahead: pitch and note starts of a monophonic bass, from audio or MIDI. +//! +//! Detection runs on the undelayed input. Events are reported at *output* time, `latency()` +//! samples later, so a host that delays its audio path by the same amount sees each note start +//! exactly on its attack, with the pitch already known. +use crate::{coefficient, gain_to_db, hz_to_midi, Biquad, Yin}; + +const EVENTS: usize = 64; +const HOP_MS: f32 = 5.; +const GATE_HOLD_MS: f32 = 20.; +const GATE_HYSTERESIS_DB: f32 = 6.; +/// A pitch move this large (semitones) counts as a new note. +const JUMP: f32 = 0.7; +const CLARITY: f32 = 0.5; + +#[derive(Clone, Copy, Debug, PartialEq)] +pub struct TrackerConfig { + /// Lowest detectable fundamental. Sets the lookahead (two periods plus a margin). + pub min_hz: f32, + pub max_hz: f32, + /// Lowpass in front of detection, removing upper harmonics that confuse YIN. + pub detect_lowpass: f32, + /// Approximate decimated analysis rate. + pub detect_rate: f32, +} +impl TrackerConfig { + /// Sub range: 25–250 Hz. + pub const SUB: Self = Self { + min_hz: 25., + max_hz: 250., + detect_lowpass: 400., + detect_rate: 3000., + }; + /// Bass range for harmonic tools: 30–500 Hz. + pub const BASS: Self = Self { + min_hz: 30., + max_hz: 500., + detect_lowpass: 1000., + detect_rate: 6000., + }; +} + +#[derive(Clone, Copy, Debug, PartialEq)] +pub enum NoteEvent { + /// A new note. `glide` asks to slide from the previous pitch instead of restarting. + Start { + pitch: f32, + glide: bool, + }, + /// The sounding note's smoothed pitch moved within a semitone (bends, vibrato). + Move { + pitch: f32, + }, + Stop, +} + +#[derive(Clone, Copy, Debug, PartialEq)] +enum Kind { + Onset, + Release, + NoteOn(u8), + NoteOff(u8), +} +#[derive(Clone, Copy, Debug)] +struct Event { + time: u64, + kind: Kind, +} + +/// Allocation-free after `new`. Pitches are fractional MIDI notes. +pub struct Tracker { + rate: f32, + cfg: TrackerConfig, + latency: usize, + midi: bool, + gate_db: f32, + glide: bool, + detect: [Biquad; 2], + decimate: usize, + decimate_count: usize, + detect_rate: f32, + ring: Vec, + ring_at: usize, + scratch: Vec, + yin: Yin, + hop: usize, + hop_count: usize, + gate_env: f32, + gate_release: f32, + gate_open: bool, + gate_hold: usize, + clock: u64, + events: [Event; EVENTS], + event_head: usize, + event_len: usize, + /// Output-time note state. + sounding: bool, + pending: bool, + tracked: f32, + candidate: Option<(f32, u8)>, + held: [u8; 16], + held_len: usize, +} + +impl Tracker { + pub fn new(rate: f32, cfg: TrackerConfig) -> Self { + let decimate = (rate / cfg.detect_rate).round().max(1.) as usize; + let detect_rate = rate / decimate as f32; + let max_lag = (detect_rate / cfg.min_hz).ceil() as usize; + // YIN needs one comparison window of at least the longest period after the lags. + let analysis = 2 * max_lag + 3; + let q = std::f32::consts::FRAC_1_SQRT_2; + Self { + rate, + cfg, + latency: analysis * decimate, + midi: false, + gate_db: -42., + glide: false, + detect: [Biquad::lowpass(rate, cfg.detect_lowpass, q); 2], + decimate, + decimate_count: 0, + detect_rate, + ring: vec![0.; analysis], + ring_at: 0, + scratch: vec![0.; analysis], + yin: Yin::new(max_lag + 2), + hop: ((detect_rate * HOP_MS * 0.001) as usize).max(1), + hop_count: 0, + gate_env: 0., + gate_release: 1. - coefficient(rate, 30.), + gate_open: false, + gate_hold: 0, + clock: 0, + events: [Event { + time: 0, + kind: Kind::Release, + }; EVENTS], + event_head: 0, + event_len: 0, + sounding: false, + pending: false, + tracked: 0., + candidate: None, + held: [0; 16], + held_len: 0, + } + } + /// Lookahead in samples. Delay the audio path by exactly this much. + pub fn latency(&self) -> usize { + self.latency + } + pub fn config(&self) -> TrackerConfig { + self.cfg + } + /// `midi` selects note input over detection; `gate_db` is the detection threshold; + /// `glide` lets legato notes slide. Returns true when the source changed, which drops + /// every pending and held note: the caller should release its sound. + pub fn set(&mut self, midi: bool, gate_db: f32, glide: bool) -> bool { + let changed = midi != self.midi; + self.midi = midi; + self.gate_db = gate_db; + self.glide = glide; + if changed { + self.release_all(); + } + changed + } + fn release_all(&mut self) { + self.sounding = false; + self.pending = false; + self.held_len = 0; + self.event_len = 0; + self.candidate = None; + } + pub fn reset(&mut self) { + for f in &mut self.detect { + f.reset(); + } + self.ring.fill(0.); + self.decimate_count = 0; + self.hop_count = 0; + self.gate_env = 0.; + self.gate_open = false; + self.gate_hold = 0; + self.release_all(); + } + /// MIDI note start at the current input sample. Used when the source is MIDI. + pub fn note_on(&mut self, note: u8) { + self.push(Kind::NoteOn(note.min(127))); + } + pub fn note_off(&mut self, note: u8) { + self.push(Kind::NoteOff(note.min(127))); + } + /// True while a note sounds at output time. + pub fn sounding(&self) -> bool { + self.sounding + } + fn push(&mut self, kind: Kind) { + if self.event_len == EVENTS { + // Dropping the oldest keeps the newest note state; overflow only happens on floods. + self.event_head = (self.event_head + 1) % EVENTS; + self.event_len -= 1; + } + let at = (self.event_head + self.event_len) % EVENTS; + self.events[at] = Event { + time: self.clock, + kind, + }; + self.event_len += 1; + } + /// Detected pitch of the most recent analysis window, in fractional MIDI notes. + fn estimate(&mut self) -> Option { + let n = self.ring.len(); + for i in 0..n { + self.scratch[i] = self.ring[(self.ring_at + i) % n]; + } + let (hz, clarity) = self.yin.estimate( + &self.scratch, + self.detect_rate, + self.cfg.min_hz, + self.cfg.max_hz, + )?; + (clarity >= CLARITY).then(|| hz_to_midi(hz)) + } + fn start(&mut self, pitch: f32, glide: bool, emit: &mut impl FnMut(NoteEvent)) { + self.tracked = pitch; + self.candidate = None; + self.pending = false; + self.sounding = true; + emit(NoteEvent::Start { pitch, glide }); + } + fn stop(&mut self, emit: &mut impl FnMut(NoteEvent)) { + self.sounding = false; + self.pending = false; + self.candidate = None; + emit(NoteEvent::Stop); + } + fn handle(&mut self, kind: Kind, emit: &mut impl FnMut(NoteEvent)) { + let midi = self.midi; + match kind { + Kind::Onset if !midi => match self.estimate() { + Some(p) => self.start(p, false, emit), + None => { + self.pending = true; + self.sounding = true; + } + }, + Kind::Release if !midi => self.stop(emit), + Kind::NoteOn(n) if midi => { + let len = self.held_len; + if let Some(i) = self.held[..len].iter().position(|h| *h == n) { + self.held.copy_within(i + 1..len, i); + self.held_len -= 1; + } + if self.held_len == self.held.len() { + self.held.copy_within(1.., 0); + self.held_len -= 1; + } + let legato = self.held_len > 0; + self.held[self.held_len] = n; + self.held_len += 1; + self.start(n as f32, legato && self.glide, emit); + } + Kind::NoteOff(n) if midi => { + let len = self.held_len; + let Some(i) = self.held[..len].iter().position(|h| *h == n) else { + return; + }; + let top = i + 1 == len; + self.held.copy_within(i + 1..len, i); + self.held_len -= 1; + if self.held_len == 0 { + self.stop(emit); + } else if top { + let next = self.held[self.held_len - 1]; + self.start(next as f32, self.glide, emit); + } + } + _ => {} + } + } + /// Regular analysis; its window starts at the current output time. + fn hop_analysis(&mut self, emit: &mut impl FnMut(NoteEvent)) { + if self.midi || !self.sounding { + return; + } + let Some(p) = self.estimate() else { + return; + }; + if self.pending { + self.start(p, false, emit); + return; + } + if (p - self.tracked).abs() >= JUMP { + match self.candidate { + Some((c, count)) if (c - p).abs() < 0.5 => { + if count + 1 >= 2 { + self.start(p, self.glide, emit); + } else { + self.candidate = Some((p, count + 1)); + } + } + _ => self.candidate = Some((p, 1)), + } + } else { + self.candidate = None; + self.tracked += 0.3 * (p - self.tracked); + emit(NoteEvent::Move { + pitch: self.tracked, + }); + } + } + /// Feeds one undelayed mono input sample. Events due at output time go to `emit`, in order. + pub fn process(&mut self, mono: f32, mut emit: impl FnMut(NoteEvent)) { + let d = self.detect[0].process(mono); + let d = self.detect[1].process(d); + if !self.midi { + let a = d.abs(); + self.gate_env = if a > self.gate_env { + a + } else { + self.gate_env * self.gate_release + }; + let level = gain_to_db(self.gate_env); + if level > self.gate_db { + self.gate_hold = (self.rate * GATE_HOLD_MS * 0.001) as usize; + if !self.gate_open { + self.gate_open = true; + self.push(Kind::Onset); + } + } else if self.gate_open && level < self.gate_db - GATE_HYSTERESIS_DB { + if self.gate_hold == 0 { + self.gate_open = false; + self.push(Kind::Release); + } else { + self.gate_hold -= 1; + } + } + } + self.decimate_count += 1; + if self.decimate_count >= self.decimate { + self.decimate_count = 0; + self.ring[self.ring_at] = d; + self.ring_at = (self.ring_at + 1) % self.ring.len(); + self.hop_count += 1; + if self.hop_count >= self.hop { + self.hop_count = 0; + self.hop_analysis(&mut emit); + } + } + while self.event_len > 0 { + let e = self.events[self.event_head]; + if e.time + self.latency as u64 > self.clock { + break; + } + self.event_head = (self.event_head + 1) % EVENTS; + self.event_len -= 1; + self.handle(e.kind, &mut emit); + } + self.clock += 1; + } +} + +/// Fundamental that follows tracker events: jumps on new notes, slides on bends and legato. +#[derive(Clone, Copy, Debug, Default)] +pub struct PitchFollower { + target: f32, + hz: f32, + jump: bool, +} +impl PitchFollower { + pub fn event(&mut self, snap: bool, e: NoteEvent) { + match e { + NoteEvent::Start { pitch, glide } => { + let p = if snap { pitch.round() } else { pitch }; + self.target = crate::midi_to_hz(p); + self.jump |= !glide; + } + NoteEvent::Move { pitch } if !snap => self.target = crate::midi_to_hz(pitch), + // The last pitch is held so tails keep their tuning. + _ => {} + } + } + /// Advances one sample with one-pole coefficient `coef`. Returns the frequency, 0 before the + /// first note, and whether it jumped this sample (a new note, or the first one). + pub fn step(&mut self, coef: f32) -> (f32, bool) { + let jump = std::mem::take(&mut self.jump) || (self.hz == 0. && self.target > 0.); + if jump { + self.hz = self.target; + } else { + self.hz += (self.target - self.hz) * coef; + } + (self.hz, jump) + } + pub fn hz(&self) -> f32 { + self.hz + } +} diff --git a/plugins/common/dsp/tests/blocks.rs b/plugins/common/dsp/tests/blocks.rs new file mode 100644 index 0000000..56b27c9 --- /dev/null +++ b/plugins/common/dsp/tests/blocks.rs @@ -0,0 +1,225 @@ +use common_dsp::meter::HarmonicMeter; +use common_dsp::oversample::Oversampler; +use common_dsp::svf::{Svf, SvfCoef}; +use common_dsp::tracker::{NoteEvent, Tracker, TrackerConfig}; +use common_dsp::{hz_to_midi, Saw}; +use std::f32::consts::TAU; + +const RATE: f32 = 48000.; + +/// Steady-state gain in dB of a sine at `hz` through `f`. +fn sine_gain(mut f: impl FnMut(f32) -> f32, hz: f32) -> f32 { + let n = (RATE * 0.5) as usize; + let (mut pin, mut pout) = (0., 0.); + for i in 0..n { + let x = (TAU * hz * i as f32 / RATE).sin(); + let y = f(x); + if i > n / 2 { + pin += x * x; + pout += y * y; + } + } + 10. * (pout / pin).log10() +} + +#[test] +fn svf_bell_hits_its_gain_and_leaves_the_rest() { + for (hz, db) in [(130., -12.), (400., 6.), (2000., -24.)] { + let c = SvfCoef::bell(RATE, hz, 4., db); + let mut s = Svf::default(); + let g = sine_gain(|x| s.process(&c, x), hz); + assert!((g - db).abs() < 0.1, "{hz}: {g}"); + let mut s = Svf::default(); + let g = sine_gain(|x| s.process(&c, x), hz * 4.); + assert!(g.abs() < 0.3, "{hz} away: {g}"); + } +} + +#[test] +fn svf_bell_at_zero_db_is_an_exact_identity() { + let c = SvfCoef::bell(RATE, 100., 2., 0.); + let mut s = Svf::default(); + let mut saw = Saw::new(RATE, 55.); + for _ in 0..4800 { + let x = saw.sample(); + assert_eq!(s.process(&c, x), x); + } +} + +#[test] +fn svf_survives_retuning_every_sample() { + let mut s = Svf::default(); + let mut saw = Saw::new(RATE, 55.); + let mut peak: f32 = 0.; + for i in 0..48000 { + let hz = 40. + 4000. * (0.5 + 0.5 * (i as f32 * 0.003).sin()); + let c = SvfCoef::bell(RATE, hz, 8., 12.); + let y = s.process(&c, saw.sample()); + assert!(y.is_finite()); + peak = peak.max(y.abs()); + } + assert!(peak < 8., "{peak}"); + let c = SvfCoef::lowpass(RATE, 200., 0.707); + let mut s = Svf::default(); + assert!(sine_gain(|x| s.process(&c, x), 2000.) < -35.); + let c = SvfCoef::highpass(RATE, 200., 0.707); + let mut s = Svf::default(); + assert!(sine_gain(|x| s.process(&c, x), 20.) < -35.); +} + +#[test] +fn oversampler_round_trip_is_a_whole_sample_delay() { + let mut o = Oversampler::new(); + let l = Oversampler::latency(); + let mut saw = Saw::new(RATE, 97.); + let x: Vec = (0..9600).map(|_| saw.sample() * 0.5).collect(); + let y: Vec = x + .iter() + .map(|&v| { + let u = o.up(v); + o.down(u) + }) + .collect(); + // Band-limited content passes; compare after the delay, away from the start. + let mut err: f32 = 0.; + let mut sig: f32 = 0.; + for i in 2000..9600 { + let d = y[i] - x[i - l]; + err += d * d; + sig += x[i - l] * x[i - l]; + } + let null = 10. * (err / sig).log10(); + // The saw has energy above the passband edge, so the null is limited by that, not by timing. + assert!(null < -40., "{null}"); +} + +#[test] +fn oversampler_passband_is_flat_and_images_are_removed() { + for hz in [50., 1000., 10000., 18000.] { + let mut o = Oversampler::new(); + let g = sine_gain( + |x| { + let u = o.up(x); + o.down(u) + }, + hz, + ); + assert!(g.abs() < 0.1, "{hz}: {g}"); + } + // An image of a 1 kHz tone at 4× would sit at 47 kHz; check the 4× signal there. + let mut o = Oversampler::new(); + let n = 48000; + let (mut a, mut b) = (0f64, 0f64); + let w = TAU as f64 * 47000. / (4. * RATE as f64); + for i in 0..n { + let x = (TAU * 1000. * i as f32 / RATE).sin(); + for (k, v) in o.up(x).into_iter().enumerate() { + let t = (4 * i + k) as f64; + a += v as f64 * (w * t).cos(); + b += v as f64 * (w * t).sin(); + } + } + let image = 20. + * ((a * a + b * b).sqrt() / (2. * n as f64)) + .max(1e-12) + .log10(); + assert!(image < -85., "{image}"); +} + +#[test] +fn harmonic_meter_reads_saw_harmonics() { + let hz = 55.; + let mut m = HarmonicMeter::new(RATE, 85.); + let mut saw = Saw::new(RATE, hz); + let mut done = 0; + for _ in 0..48000 { + if m.push(saw.sample(), hz) { + done += 1; + } + } + assert!(done >= 5); + // A saw's k-th harmonic has peak 2/(πk). + for k in 1..=16 { + let want = 20. * (2. / (std::f32::consts::PI * k as f32)).log10(); + let got = m.levels()[k - 1]; + assert!((got - want).abs() < 0.5, "harmonic {k}: {got} vs {want}"); + } +} + +#[test] +fn tracker_reports_notes_at_output_time() { + let mut t = Tracker::new(RATE, TrackerConfig::BASS); + t.set(false, -42., false); + let l = t.latency(); + assert!(l < (0.08 * RATE) as usize, "{l}"); + let onset = 4800; + let mut events = vec![]; + let mut saw_a = Saw::new(RATE, 87.31); + let mut saw_b = Saw::new(RATE, 220.); + for i in 0..onset + 48000 { + let x = if i < onset { + 0. + } else if i < onset + 24000 { + 0.5 * saw_a.sample() + } else { + 0.5 * saw_b.sample() + }; + t.process(x, |e| events.push((i, e))); + } + let starts: Vec<_> = events + .iter() + .filter_map(|(i, e)| match e { + NoteEvent::Start { pitch, .. } => Some((*i, *pitch)), + _ => None, + }) + .collect(); + assert_eq!(starts.len(), 2, "{starts:?}"); + assert!( + (starts[0].0 as i64 - (onset + l) as i64).abs() <= 24, + "{starts:?}" + ); + assert!((starts[0].1 - hz_to_midi(87.31)).abs() < 0.2); + assert!((starts[1].1 - hz_to_midi(220.)).abs() < 0.2); +} + +#[test] +fn tracker_delays_midi_by_the_latency() { + let mut t = Tracker::new(RATE, TrackerConfig::BASS); + assert!(t.set(true, -42., true)); + let l = t.latency(); + let mut events = vec![]; + for i in 0..l + 2000 { + if i == 100 { + t.note_on(41); + } + if i == 600 { + t.note_on(43); + } + if i == 900 { + // Releasing the lower held note first leaves the top note; then the top ends it. + t.note_off(41); + t.note_off(43); + } + t.process(0., |e| events.push((i, e))); + } + assert_eq!( + events, + vec![ + ( + 100 + l, + NoteEvent::Start { + pitch: 41., + glide: false + } + ), + ( + 600 + l, + NoteEvent::Start { + pitch: 43., + glide: true + } + ), + (900 + l, NoteEvent::Stop), + ] + ); +} diff --git a/plugins/lathe/core/Cargo.toml b/plugins/lathe/core/Cargo.toml new file mode 100644 index 0000000..3a6b87b --- /dev/null +++ b/plugins/lathe/core/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "lathe-core" +version = "0.1.0" +edition.workspace = true +license.workspace = true + +[dependencies] +common-dsp = { path = "../../common/dsp" } +serde = { workspace = true } + +[dev-dependencies] +serde_json = { workspace = true } diff --git a/plugins/lathe/core/src/lib.rs b/plugins/lathe/core/src/lib.rs new file mode 100644 index 0000000..a21260c --- /dev/null +++ b/plugins/lathe/core/src/lib.rs @@ -0,0 +1,258 @@ +//! Harmonic EQ: bands sit on the harmonics of the played note instead of fixed frequencies, +//! so a cut on harmonic 3 stays on harmonic 3 on every note. +//! +//! The audio path is delayed by the tracker's lookahead, so the filters are already tuned to +//! a note when its attack leaves the plugin. +mod settings; +use common_dsp::meter::HarmonicMeter; +use common_dsp::svf::{Svf, SvfCoef}; +use common_dsp::tracker::{PitchFollower, Tracker, TrackerConfig}; +use common_dsp::{coefficient, db_to_gain, hz_to_midi}; +pub use settings::{Settings, Source, GAIN_MAX, GAIN_MIN, HARMONICS}; + +pub const MIN_HZ: f32 = TrackerConfig::BASS.min_hz; +pub const MAX_HZ: f32 = TrackerConfig::BASS.max_hz; +/// Harmonic bands plus the bands halfway between them. +const BANDS: usize = 2 * HARMONICS; +/// Filter coefficients are recomputed this often, in samples. +const RETUNE: usize = 16; +const GAIN_MS: f32 = 20.; + +#[derive(Clone, Copy, Debug)] +pub struct AnalyzerFrame { + /// Fundamental the filters are tuned to, 0 before the first note. + pub hz: f32, + /// Sounding note, rounded; None between notes. + pub note: Option, + /// Harmonic levels in dBFS of the delayed input and of the output (index 0 = fundamental). + pub input: [f32; HARMONICS], + pub output: [f32; HARMONICS], + pub latency: u32, + pub sample_rate: f32, +} +impl Default for AnalyzerFrame { + fn default() -> Self { + Self { + hz: 0., + note: None, + input: [-120.; HARMONICS], + output: [-120.; HARMONICS], + latency: 0, + sample_rate: 48000., + } + } +} + +pub struct Engine { + rate: f32, + channels: usize, + settings: Settings, + latency: usize, + delay: Vec<[f32; 2]>, + delay_at: usize, + tracker: Tracker, + pitch: PitchFollower, + hz: f32, + hz_coef: f32, + countdown: usize, + coefs: [SvfCoef; BANDS], + active: [bool; BANDS], + gains: [f32; BANDS], + state: [[Svf; BANDS]; 2], + gain_coef: f32, + smooth: f32, + mix: f32, + output: f32, + bypass: f32, + meter_in: HarmonicMeter, + meter_out: HarmonicMeter, + /// Smoothed controls start at the next settings instead of gliding from defaults. + fresh: bool, +} + +impl Engine { + pub fn new(rate: f32, channels: usize) -> Result { + if !(8000.0..=768000.).contains(&rate) { + return Err("unsupported sample rate"); + } + if !(1..=2).contains(&channels) { + return Err("unsupported channel count"); + } + let tracker = Tracker::new(rate, TrackerConfig::BASS); + let latency = tracker.latency(); + let settings = Settings::default(); + let mut e = Self { + rate, + channels, + settings, + latency, + delay: vec![[0.; 2]; latency + 1], + delay_at: 0, + tracker, + pitch: PitchFollower::default(), + hz: 0., + hz_coef: 1., + countdown: 0, + coefs: [SvfCoef::IDENTITY; BANDS], + active: [false; BANDS], + gains: [0.; BANDS], + state: [[Svf::default(); BANDS]; 2], + gain_coef: coefficient(rate / RETUNE as f32, GAIN_MS), + smooth: coefficient(rate, 10.), + mix: 1., + output: 1., + bypass: 0., + meter_in: HarmonicMeter::new(rate, 85.), + meter_out: HarmonicMeter::new(rate, 85.), + fresh: true, + }; + e.set_settings(settings)?; + e.fresh = true; + Ok(e) + } + pub fn latency_samples(&self) -> u32 { + self.latency 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()?; + self.tracker + .set(s.source == Source::Midi, s.gate, s.smooth > 0.); + self.hz_coef = coefficient(self.rate, s.smooth / 3.); + self.settings = s; + if std::mem::take(&mut self.fresh) { + self.mix = s.mix * 0.01; + self.output = db_to_gain(s.output); + self.bypass = f32::from(s.bypass); + self.gains = self.targets(); + } + Ok(()) + } + pub fn reset(&mut self) { + self.delay.fill([0.; 2]); + self.tracker.reset(); + for ch in &mut self.state { + for f in ch.iter_mut() { + f.reset(); + } + } + self.meter_in.reset(); + self.meter_out.reset(); + self.countdown = 0; + 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); + } + /// Gain targets in dB of every band for the current settings. + fn targets(&self) -> [f32; BANDS] { + let s = &self.settings; + let mut t = [0.; BANDS]; + for k in 1..=s.harmonics as usize { + t[k - 1] = s.effective(k); + t[HARMONICS + k - 1] = s.between; + } + t + } + fn retune(&mut self, jump: bool) { + let s = self.settings; + let targets = self.targets(); + let width = s.width * 0.01; + for b in 0..BANDS { + self.gains[b] = if jump { + targets[b] + } else { + self.gains[b] + (targets[b] - self.gains[b]) * self.gain_coef + }; + if (self.gains[b] - targets[b]).abs() < 1e-4 { + self.gains[b] = targets[b]; + } + let order = if b < HARMONICS { + (b + 1) as f32 + } else { + (b - HARMONICS + 1) as f32 + 0.5 + }; + let centre = order * self.hz; + let audible = self.hz > 0. && centre < 0.45 * self.rate; + if audible && !self.active[b] { + for ch in &mut self.state { + ch[b].reset(); + } + } + self.active[b] = audible && self.gains[b] != 0.; + if self.active[b] { + self.coefs[b] = SvfCoef::bell(self.rate, centre, order / width, self.gains[b]); + } + } + } + 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 (pitch, snap) = (&mut self.pitch, self.settings.snap); + self.tracker.process(mono, |e| pitch.event(snap, e)); + 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 first = self.hz == 0.; + let (hz, jump) = self.pitch.step(self.hz_coef); + let first = first && jump; + self.hz = hz; + if jump || self.countdown == 0 { + self.retune(first); + self.countdown = RETUNE; + } + self.countdown -= 1; + + let s = self.settings; + self.mix += (s.mix * 0.01 - self.mix) * self.smooth; + self.output += (db_to_gain(s.output) - self.output) * self.smooth; + self.bypass += (f32::from(s.bypass) - self.bypass) * self.smooth; + let mut out = [0.; 2]; + for c in 0..self.channels { + let mut v = y[c]; + for b in 0..BANDS { + if self.active[b] { + v = self.state[c][b].process(&self.coefs[b], v); + } + } + let wet = (self.mix * v + (1. - self.mix) * y[c]) * self.output; + out[c] = wet * (1. - self.bypass) + y[c] * self.bypass; + } + let hz = if self.tracker.sounding() { self.hz } else { 0. }; + let (dry, wet) = if self.channels == 2 { + (0.5 * (y[0] + y[1]), 0.5 * (out[0] + out[1])) + } else { + (y[0], out[0]) + }; + self.meter_in.push(dry, hz); + self.meter_out.push(wet, hz); + out + } + pub fn take_analyzer(&self) -> AnalyzerFrame { + let mut f = AnalyzerFrame { + hz: self.hz, + latency: self.latency as u32, + sample_rate: self.rate, + input: *self.meter_in.levels(), + output: *self.meter_out.levels(), + ..AnalyzerFrame::default() + }; + if self.tracker.sounding() && self.hz > 0. { + f.note = Some(hz_to_midi(self.hz).round().clamp(0., 127.) as u8); + } + f + } +} diff --git a/plugins/lathe/core/src/settings.rs b/plugins/lathe/core/src/settings.rs new file mode 100644 index 0000000..c738cd1 --- /dev/null +++ b/plugins/lathe/core/src/settings.rs @@ -0,0 +1,106 @@ +//! Host-independent controls. Gains in dB, times in milliseconds. +use serde::{Deserialize, Serialize}; + +/// Editable harmonics: the fundamental is harmonic 1. +pub const HARMONICS: usize = 32; +pub const GAIN_MIN: f32 = -24.; +pub const GAIN_MAX: f32 = 12.; + +#[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, +} + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)] +#[serde(deny_unknown_fields)] +pub struct Settings { + pub source: Source, + /// Gain per harmonic, index 0 = fundamental. + pub gains: [f32; HARMONICS], + /// dB per octave of harmonic number, added on top of `gains`. Harmonic 1 is the pivot. + pub tilt: f32, + /// Positive lifts odd harmonics and lowers even ones by half this amount each. + pub odd_even: f32, + /// Gain of the regions halfway between harmonics: noise, beating, inharmonic grit. + pub between: f32, + /// Bandwidth of every band as a percentage of the fundamental. + pub width: f32, + /// Number of harmonics that are shaped; higher ones pass unchanged. + pub harmonics: u32, + /// Retune time when the pitch slides or bends. + pub smooth: f32, + /// Detection threshold in dBFS for note starts (Audio source). + pub gate: f32, + /// Round detected pitch to the nearest semitone. + pub snap: bool, + pub mix: f32, + pub output: f32, + pub bypass: bool, +} +impl Default for Settings { + fn default() -> Self { + Self { + source: Source::Audio, + gains: [0.; HARMONICS], + tilt: 0., + odd_even: 0., + between: 0., + width: 20., + harmonics: 24, + smooth: 10., + gate: -42., + snap: true, + mix: 100., + output: 0., + bypass: false, + } + } +} +impl Settings { + pub fn validate(&self) -> Result<(), &'static str> { + let finite = [ + self.tilt, + self.odd_even, + self.between, + self.width, + self.smooth, + self.gate, + self.mix, + self.output, + ] + .iter() + .chain(self.gains.iter()) + .all(|v| v.is_finite()); + if !finite { + return Err("non-finite setting"); + } + let ok = self.gains.iter().all(|g| (GAIN_MIN..=GAIN_MAX).contains(g)) + && (-12.0..=12.).contains(&self.tilt) + && (-12.0..=12.).contains(&self.odd_even) + && (-24.0..=12.).contains(&self.between) + && (5.0..=50.).contains(&self.width) + && (8..=HARMONICS as u32).contains(&self.harmonics) + && (0.0..=100.).contains(&self.smooth) + && (-60.0..=-20.).contains(&self.gate) + && (0.0..=100.).contains(&self.mix) + && (-12.0..=12.).contains(&self.output); + if ok { + Ok(()) + } else { + Err("setting out of range") + } + } + /// Gain applied to harmonic `k` (1-based), with tilt and odd/even included. + pub fn effective(&self, k: usize) -> f32 { + if k == 0 || k > self.harmonics as usize || k > HARMONICS { + return 0.; + } + let parity = if k % 2 == 1 { 0.5 } else { -0.5 }; + (self.gains[k - 1] + self.tilt * (k as f32).log2() + self.odd_even * parity) + .clamp(-30., 18.) + } +} diff --git a/plugins/lathe/core/tests/dsp.rs b/plugins/lathe/core/tests/dsp.rs new file mode 100644 index 0000000..ad8e3a8 --- /dev/null +++ b/plugins/lathe/core/tests/dsp.rs @@ -0,0 +1,139 @@ +use common_dsp::meter::HarmonicMeter; +use common_dsp::Saw; +use lathe_core::{Engine, Settings, Source}; + +const RATE: f32 = 48000.; + +fn engine(s: Settings) -> (Engine, usize) { + let mut e = Engine::new(RATE, 2).unwrap(); + e.set_settings(s).unwrap(); + let l = e.latency_samples() as usize; + (e, l) +} +fn saw(hz: f32, seconds: f32, amp: f32) -> Vec { + let mut s = Saw::new(RATE, hz); + (0..(seconds * RATE) as usize) + .map(|_| s.sample() * amp) + .collect() +} +fn render(e: &mut Engine, x: &[f32]) -> Vec { + x.iter().map(|&v| e.process_sample([v, v])[0]).collect() +} +/// Harmonic levels of the last complete window of `x`. +fn harmonics(x: &[f32], hz: f32) -> [f32; 32] { + let mut m = HarmonicMeter::new(RATE, 85.); + for &v in x { + m.push(v, hz); + } + *m.levels() +} + +#[test] +fn a_cut_on_harmonic_three_stays_on_harmonic_three_on_every_note() { + let mut s = Settings::default(); + s.gains[2] = -12.; + for hz in [43.65, 65.41, 130.81] { + let x = saw(hz, 1., 0.5); + let (mut e, l) = engine(s); + let y = render(&mut e, &x); + let a = harmonics(&x[..x.len() - l], hz); + let b = harmonics(&y[l..], hz); + let d: Vec = (0..6).map(|k| b[k] - a[k]).collect(); + assert!((d[2] + 12.).abs() < 0.7, "{hz}: {d:?}"); + for k in [0, 1, 3, 4] { + assert!(d[k].abs() < 1., "{hz} harmonic {}: {d:?}", k + 1); + } + } +} + +#[test] +fn a_flat_map_passes_the_delayed_input_exactly() { + let x = saw(55., 0.5, 0.5); + let (mut e, l) = engine(Settings::default()); + let y = render(&mut e, &x); + for i in l..x.len() { + assert_eq!(y[i], x[i - l]); + } +} + +#[test] +fn odd_even_balances_the_harmonic_series() { + let s = Settings { + odd_even: 6., + ..Settings::default() + }; + let hz = 55.; + let x = saw(hz, 1., 0.5); + let (mut e, l) = engine(s); + let y = render(&mut e, &x); + let a = harmonics(&x[..x.len() - l], hz); + let b = harmonics(&y[l..], hz); + for k in 1..8 { + let want = if k % 2 == 1 { 3. } else { -3. }; + let got = b[k - 1] - a[k - 1]; + assert!((got - want).abs() < 0.8, "harmonic {k}: {got}"); + } +} + +#[test] +fn note_changes_do_not_click() { + let mut s = Settings::default(); + s.gains[1] = 12.; + s.gains[3] = -24.; + s.tilt = -3.; + let mut x = saw(43.65, 0.5, 0.5); + x.extend(saw(58.27, 0.5, 0.5)); + x.extend(saw(87.31, 0.5, 0.5)); + let (mut e, _) = engine(s); + let y = render(&mut e, &x); + let step = y + .windows(2) + .map(|w| (w[1] - w[0]).abs()) + .fold(0f32, f32::max); + let in_step = x + .windows(2) + .map(|w| (w[1] - w[0]).abs()) + .fold(0f32, f32::max); + assert!(y.iter().all(|v| v.is_finite())); + // A saw has its own jumps; the filtered output must not jump much further than that. + assert!(step < 2. * in_step, "{step} vs {in_step}"); +} + +#[test] +fn midi_source_tunes_the_bands_at_the_delayed_note_time() { + let mut s = Settings { + source: Source::Midi, + ..Settings::default() + }; + s.gains[0] = -24.; + let (mut e, l) = engine(s); + // 43.65 Hz is MIDI 29. Notes arrive at sample 0; the bands must be tuned by sample l. + e.note_on(29); + let x = saw(43.65, 1., 0.5); + let y = render(&mut e, &x); + let a = harmonics(&x[..x.len() - l], 43.65); + let b = harmonics(&y[l..], 43.65); + assert!(b[0] - a[0] < -20., "{}", b[0] - a[0]); + let f = e.take_analyzer(); + assert_eq!(f.note, Some(29)); + assert!((f.hz - 43.65).abs() < 0.05); +} + +#[test] +fn settings_are_validated_and_serialise() { + let s = Settings::default(); + let json = serde_json::to_string(&s).unwrap(); + assert_eq!(serde_json::from_str::(&json).unwrap(), s); + let mut bad = s; + bad.gains[5] = 40.; + assert!(bad.validate().is_err()); + bad = s; + bad.harmonics = 4; + assert!(bad.validate().is_err()); + bad = s; + bad.width = f32::NAN; + assert!(bad.validate().is_err()); + let mut e = Engine::new(RATE, 2).unwrap(); + assert!(e.set_settings(bad).is_err()); + assert_eq!(e.settings(), s); +} diff --git a/plugins/lathe/core/tests/realtime.rs b/plugins/lathe/core/tests/realtime.rs new file mode 100644 index 0000000..2e02911 --- /dev/null +++ b/plugins/lathe/core/tests/realtime.rs @@ -0,0 +1,69 @@ +use lathe_core::{Engine, Settings, Source}; +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(); + engine.set_settings(settings).unwrap(); + CHECK.with(|v| v.set(true)); + for i in 0..96000 { + if i % 4800 == 0 { + settings.gains[(i / 4800) % 32] = -6.; + settings.tilt = ((i / 4800) % 5) as f32 - 2.; + settings.source = if i > 48000 { + Source::Midi + } else { + Source::Audio + }; + engine.set_settings(settings).unwrap(); + engine.note_on(30 + (i / 4800 % 12) as u8); + } + if i % 4800 == 2400 { + engine.note_off(30 + (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/lathe/plugin/Cargo.lock b/plugins/lathe/plugin/Cargo.lock new file mode 100644 index 0000000..8a297c1 --- /dev/null +++ b/plugins/lathe/plugin/Cargo.lock @@ -0,0 +1,2381 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ab_glyph" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" + +[[package]] +name = "addr2line" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e567177890eb1617b1f774005b66b26b2377afd138a2ca37aae7d8f0c81429d4" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "android-activity" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd" +dependencies = [ + "android-properties", + "bitflags 2.13.2", + "cc", + "jni", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "num_enum", + "thiserror 2.0.21", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "anymap3" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5dfbc6d8d2675589ccbe4d0fd61df2419075625f8c1a62325e718e2b0049f9" + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "atomic_float" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62af46d040ba9df09edc6528dae9d8e49f5f3e82f55b7d2ec31a733c38dbc49d" + +[[package]] +name = "atomic_refcell" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21e4227379beff4205943696e6c3e0cd809bacdf3f0edd6e3dd153e2269571a4" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "backtrace" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f4220217f3288537b83684130f42fad43320b1c3b805f1910d683d52ded24f" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link", +] + +[[package]] +name = "baseview" +version = "0.1.0" +source = "git+https://github.com/RustAudio/baseview.git?rev=9a0b42c09d712777b2edb4c5e0cb6baf21e988f0#9a0b42c09d712777b2edb4c5e0cb6baf21e988f0" +dependencies = [ + "cocoa", + "core-foundation", + "keyboard-types", + "nix", + "objc", + "raw-window-handle 0.5.2", + "uuid", + "winapi", + "x11", + "x11rb", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a1f896587b6f2c069c73d2f0913e2d590c3990285cd2f0b6aa02b786b4c679c" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.13.2", + "log", + "polling", + "rustix 0.38.44", + "slab", + "thiserror 1.0.69", +] + +[[package]] +name = "cc" +version = "1.11.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 = "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 = "lathe" +version = "0.1.0" +dependencies = [ + "clap-sys", + "crossbeam-queue", + "lathe-core", + "lathe-ui", + "nih_plug", + "nih_plug_egui", + "serde_json", +] + +[[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 = "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/lathe/plugin/Cargo.toml b/plugins/lathe/plugin/Cargo.toml new file mode 100644 index 0000000..facc04e --- /dev/null +++ b/plugins/lathe/plugin/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "lathe" +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" } +lathe-core = { path = "../core" } +lathe-ui = { path = "../ui" } +crossbeam-queue = "0.3" + +[dev-dependencies] +clap-sys = { git = "https://github.com/micahrj/clap-sys.git", rev = "25d7f53fdb6363ad63fbd80049cb7a42a97ac156" } +serde_json = "1" + +[profile.release] +lto = "thin" +strip = "symbols" diff --git a/plugins/lathe/plugin/src/lib.rs b/plugins/lathe/plugin/src/lib.rs new file mode 100644 index 0000000..923db8c --- /dev/null +++ b/plugins/lathe/plugin/src/lib.rs @@ -0,0 +1,189 @@ +//! CLAP audio effect. All DSP state is owned by the processing thread. +mod params; +use crossbeam_queue::ArrayQueue; +use lathe_core::{AnalyzerFrame, Engine, HARMONICS}; +use nih_plug::prelude::*; +use nih_plug_egui::{create_egui_editor, egui}; +use params::LatheParams; +use std::sync::Arc; + +struct EditorData { + ui: lathe_ui::State, + gestures: [bool; 8], +} +pub struct Lathe { + params: Arc, + analyzer: Arc>, + engine: Option, + gains: [f32; HARMONICS], + publish_count: usize, + publish_interval: usize, +} +impl Default for Lathe { + fn default() -> Self { + Self { + params: Arc::new(LatheParams::default()), + analyzer: Arc::new(ArrayQueue::new(2)), + engine: None, + gains: [0.; HARMONICS], + publish_count: 0, + publish_interval: 1600, + } + } +} +impl Plugin for Lathe { + const NAME: &'static str = "Lathe"; + const VENDOR: &'static str = "Rivet & Patina"; + 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: lathe_ui::State::default(), + gestures: [false; 8], + }, + |ctx, _| lathe_ui::style(ctx), + move |ctx, setter, data| { + while let Some(frame) = analyzer.pop() { + data.ui.accept_frame(frame); + } + let current = params.gains.read().map(|g| *g).unwrap_or([0.; HARMONICS]); + let before = params.settings(¤t); + let mut edited = before; + nih_plug_egui::resizable_window::ResizableWindow::new("lathe-editor") + .min_size(egui::vec2( + lathe_ui::WIDTH as f32 - 80., + lathe_ui::HEIGHT as f32 - 40., + )) + .show(ctx, ¶ms.editor, |ui| { + lathe_ui::show(ui, &mut edited, &mut data.ui) + }); + params.apply( + setter, + &before, + &edited, + data.ui.gesture_active, + &mut data.gestures, + ); + // Harmonic levels 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.params.settings(&self.gains); + self.gains = settings.gains; + 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 Some(engine) = self.engine.as_mut() else { + return ProcessStatus::Normal; + }; + let settings = self.params.settings(&self.gains); + self.gains = settings.gains; + 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 filter tails must drain after input stops. + ProcessStatus::KeepAlive + } +} +impl ClapPlugin for Lathe { + const CLAP_ID: &'static str = "io.storyboard.harmonic-eq"; + const CLAP_DESCRIPTION: Option<&'static str> = + Some("EQ the harmonics of the played note: a cut on harmonic 3 stays on harmonic 3"); + const CLAP_MANUAL_URL: Option<&'static str> = None; + const CLAP_SUPPORT_URL: Option<&'static str> = None; + const CLAP_FEATURES: &'static [ClapFeature] = &[ + ClapFeature::AudioEffect, + ClapFeature::Equalizer, + ClapFeature::Stereo, + ClapFeature::Mono, + ]; +} +nih_export_clap!(Lathe); diff --git a/plugins/lathe/plugin/src/params.rs b/plugins/lathe/plugin/src/params.rs new file mode 100644 index 0000000..db97a95 --- /dev/null +++ b/plugins/lathe/plugin/src/params.rs @@ -0,0 +1,186 @@ +use lathe_core::{Settings, Source, HARMONICS}; +use nih_plug::prelude::*; +use nih_plug_egui::EguiState; +use std::sync::{Arc, RwLock}; + +#[derive(Enum, Debug, PartialEq, Eq, Clone, Copy)] +pub enum SourceParam { + #[id = "audio"] + Audio, + #[id = "midi"] + #[name = "MIDI"] + Midi, +} +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) +} +/// Continuous controls, in the order of the gesture slots. +const FLOATS: usize = 8; + +#[derive(Params)] +pub struct LatheParams { + #[persist = "editor"] + pub editor: Arc, + /// Drawn per-harmonic gains. Saved with the project, not exposed as automation lanes. + #[persist = "lathe-gains"] + pub gains: RwLock<[f32; HARMONICS]>, + #[id = "source"] + pub source: EnumParam, + #[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 = "gate"] + pub gate: FloatParam, + #[id = "mix"] + pub mix: FloatParam, + #[id = "output"] + pub output: FloatParam, + #[id = "harmonics"] + pub harmonics: IntParam, + #[id = "snap"] + pub snap: BoolParam, + #[id = "bypass"] + pub bypass: BoolParam, +} +impl Default for LatheParams { + fn default() -> Self { + let d = Settings::default(); + Self { + editor: EguiState::from_size(lathe_ui::WIDTH, lathe_ui::HEIGHT), + gains: RwLock::new(d.gains), + source: EnumParam::new("Pitch source", SourceParam::Audio), + tilt: linear("Tilt", d.tilt, -12., 12., " dB/oct"), + odd_even: linear("Odd/Even", d.odd_even, -12., 12., " dB"), + between: linear("Between", d.between, -24., 12., " dB"), + width: linear("Width", d.width, 5., 50., " %"), + smooth: linear("Smooth", d.smooth, 0., 100., " ms"), + gate: linear("Gate", d.gate, -60., -20., " dB"), + mix: linear("Mix", d.mix, 0., 100., " %"), + output: linear("Output", d.output, -12., 12., " dB"), + harmonics: IntParam::new( + "Harmonics", + d.harmonics as i32, + IntRange::Linear { + min: 8, + max: HARMONICS as i32, + }, + ), + snap: BoolParam::new("Snap to semitone", d.snap), + bypass: BoolParam::new("Bypass", false).make_bypass(), + } + } +} +impl LatheParams { + /// Current settings. `gains` falls back to `last` when the editor holds the lock, so the + /// audio thread never waits. + pub fn settings(&self, last: &[f32; HARMONICS]) -> Settings { + let gains = self.gains.try_read().map(|g| *g).unwrap_or(*last); + Settings { + source: match self.source.value() { + SourceParam::Audio => Source::Audio, + SourceParam::Midi => Source::Midi, + }, + gains: gains.map(|g| { + if g.is_finite() { + g.clamp(lathe_core::GAIN_MIN, lathe_core::GAIN_MAX) + } else { + 0. + } + }), + tilt: self.tilt.value(), + odd_even: self.odd_even.value(), + between: self.between.value(), + width: self.width.value(), + harmonics: self.harmonics.value() as u32, + smooth: self.smooth.value(), + gate: self.gate.value(), + snap: self.snap.value(), + mix: self.mix.value(), + output: self.output.value(), + bypass: self.bypass.value(), + } + } + fn floats(&self) -> [&FloatParam; FLOATS] { + [ + &self.tilt, + &self.odd_even, + &self.between, + &self.width, + &self.smooth, + &self.gate, + &self.mix, + &self.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. Gains are stored + /// directly. + pub fn apply( + &self, + setter: &ParamSetter, + old: &Settings, + new: &Settings, + dragging: bool, + open: &mut [bool; FLOATS], + ) { + if new.gains != old.gains { + if let Ok(mut g) = self.gains.write() { + *g = new.gains; + } + } + let values = [ + (old.tilt, new.tilt), + (old.odd_even, new.odd_even), + (old.between, new.between), + (old.width, new.width), + (old.smooth, new.smooth), + (old.gate, new.gate), + (old.mix, new.mix), + (old.output, new.output), + ]; + for (i, (p, (a, b))) in self.floats().into_iter().zip(values).enumerate() { + if a != b { + if !open[i] { + open[i] = true; + setter.begin_set_parameter(p); + } + setter.set_parameter(p, b); + } + if !dragging && open[i] { + setter.end_set_parameter(p); + open[i] = false; + } + } + if new.harmonics != old.harmonics { + setter.begin_set_parameter(&self.harmonics); + setter.set_parameter(&self.harmonics, new.harmonics as i32); + setter.end_set_parameter(&self.harmonics); + } + for (p, a, b) in [ + (&self.snap, old.snap, new.snap), + (&self.bypass, old.bypass, new.bypass), + ] { + if a != b { + setter.begin_set_parameter(p); + setter.set_parameter(p, b); + setter.end_set_parameter(p); + } + } + if new.source != old.source { + let v = match new.source { + Source::Audio => SourceParam::Audio, + Source::Midi => SourceParam::Midi, + }; + setter.begin_set_parameter(&self.source); + setter.set_parameter(&self.source, v); + setter.end_set_parameter(&self.source); + } + } +} diff --git a/plugins/lathe/plugin/tests/host.rs b/plugins/lathe/plugin/tests/host.rs new file mode 100644 index 0000000..018af67 --- /dev/null +++ b/plugins/lathe/plugin/tests/host.rs @@ -0,0 +1,219 @@ +//! 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 = &lathe::clap_entry; + assert!(entry.init.unwrap()(c"lathe.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"Lathe"); + assert_eq!( + CStr::from_ptr((*descriptor).id), + c"io.storyboard.harmonic-eq" + ); + 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("tilt".into(), ParamValue::F32(-3.)); + envelope + .params + .insert("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("snap".into(), ParamValue::Bool(false)); + 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; + // About 67 ms lookahead: two periods of the lowest detected note (30 Hz). + assert!((delay as f64 / rate - 0.067).abs() < 0.01, "{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); + // A 1 kHz tone sits above the split and passes through 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/lathe/ui/Cargo.toml b/plugins/lathe/ui/Cargo.toml new file mode 100644 index 0000000..9208628 --- /dev/null +++ b/plugins/lathe/ui/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "lathe-ui" +version = "0.1.0" +edition.workspace = true +license.workspace = true + +[dependencies] +egui = "0.31.1" +lathe-core = { path = "../core" } +common-ui = { path = "../../common/ui" } +common-dsp = { path = "../../common/dsp" } diff --git a/plugins/lathe/ui/src/lib.rs b/plugins/lathe/ui/src/lib.rs new file mode 100644 index 0000000..7ac276f --- /dev/null +++ b/plugins/lathe/ui/src/lib.rs @@ -0,0 +1,431 @@ +//! Lathe editor, shared by the CLAP wrapper and the headless renderer. +use common_ui::*; +use egui::{self, Color32, FontId, Pos2, Rect, RichText, Sense, Stroke, Vec2}; +use lathe_core::{AnalyzerFrame, Settings, Source, GAIN_MAX, GAIN_MIN, HARMONICS}; + +pub use common_ui::style; +pub const WIDTH: u32 = 1040; +pub const HEIGHT: u32 = 650; + +pub struct State { + pub analyzer: AnalyzerFrame, + /// True while a pointer button is held, so knob drags become one host gesture. + pub gesture_active: bool, + pub help: String, + /// Last point of a draw stroke in the harmonic editor: (harmonic index, dB). + stroke: Option<(usize, f32)>, +} +impl Default for State { + fn default() -> Self { + Self { + analyzer: AnalyzerFrame::default(), + gesture_active: false, + help: DEFAULT_HELP.into(), + stroke: None, + } + } +} +const DEFAULT_HELP: &str = + "Draw gains on the harmonics. They follow the note: harmonic 3 stays harmonic 3 on every pitch."; +impl State { + pub fn accept_frame(&mut self, frame: AnalyzerFrame) { + let old = self.analyzer; + self.analyzer = frame; + // Levels fall smoothly so bars stay readable between windows. + for k in 0..HARMONICS { + self.analyzer.input[k] = frame.input[k].max(old.input[k] - 3.); + self.analyzer.output[k] = frame.output[k].max(old.output[k] - 3.); + } + } +} +fn hint(r: &egui::Response, state: &mut State, text: &str) { + if r.hovered() || r.has_focus() { + state.help = text.into(); + } +} +#[allow(clippy::too_many_arguments)] +fn knob( + ui: &mut egui::Ui, + state: &mut State, + name: &str, + value: &mut f32, + range: std::ops::RangeInclusive, + default: f32, + unit: &str, + size: f32, + help: &str, +) { + ui.vertical_centered(|ui| { + let r = rotary(ui, name, value, range, default, unit, size, ACCENT); + hint(&r, state, help); + }); +} + +const GRID: Color32 = Color32::from_rgb(24, 26, 30); +const LEVEL_FLOOR: f32 = -72.; + +fn gain_y(rect: Rect, db: f32) -> f32 { + let t = (db - GAIN_MIN) / (GAIN_MAX - GAIN_MIN); + rect.bottom() - rect.height() * t.clamp(0., 1.) +} +fn y_gain(rect: Rect, y: f32) -> f32 { + let t = (rect.bottom() - y) / rect.height(); + // Snap near 0 dB so drawing a flat line is easy. + let db = GAIN_MIN + t * (GAIN_MAX - GAIN_MIN); + let db = if db.abs() < 0.4 { 0. } else { db }; + db.clamp(GAIN_MIN, GAIN_MAX) +} + +/// Bar editor of the per-harmonic gains, with the effective curve and measured levels. +fn harmonic_editor(ui: &mut egui::Ui, settings: &mut Settings, state: &mut State, height: f32) { + let size = Vec2::new(ui.available_width(), height); + let (outer, response) = ui.allocate_exact_size(size, Sense::click_and_drag()); + let p = ui.painter_at(outer); + p.rect_filled(outer, 2., SCREEN); + let levels_h = 64.; + let labels_h = 18.; + let left = 34.; + let gains = Rect::from_min_max( + outer.left_top() + Vec2::new(left, 12.), + Pos2::new( + outer.right() - 10., + outer.bottom() - levels_h - labels_h - 8., + ), + ); + let levels = Rect::from_min_max( + Pos2::new(gains.left(), gains.bottom() + labels_h + 4.), + Pos2::new(gains.right(), outer.bottom() - 6.), + ); + let col = gains.width() / HARMONICS as f32; + let column = |x: f32| { + (((x - gains.left()) / col).floor() as isize).clamp(0, HARMONICS as isize - 1) as usize + }; + + // Interaction: drag draws, Shift-drag nudges, double-click resets a bar. + if let Some(pos) = response.interact_pointer_pos() { + let k = column(pos.x); + if response.double_clicked() { + settings.gains[k] = 0.; + state.stroke = None; + } else if response.dragged() || response.drag_started() || response.clicked() { + if ui.input(|i| i.modifiers.shift) { + let dy = ui.input(|i| i.pointer.delta().y); + let step = dy * (GAIN_MAX - GAIN_MIN) / gains.height() * 0.15; + settings.gains[k] = (settings.gains[k] - step).clamp(GAIN_MIN, GAIN_MAX); + } else { + let db = y_gain(gains, pos.y); + // Fill every column the pointer skipped since the last frame. + let (from, from_db) = state.stroke.unwrap_or((k, db)); + let (a, b) = (from.min(k), from.max(k)); + for i in a..=b { + let t = if b == a { + 1. + } else { + (i as f32 - from as f32) / (k as f32 - from as f32) + }; + settings.gains[i] = from_db + (db - from_db) * t.clamp(0., 1.); + } + state.stroke = Some((k, db)); + } + } + } + if !response.dragged() { + state.stroke = None; + } + + // Grid: dB lines with labels. + for db in [12., 6., 0., -6., -12., -18., -24.] { + let y = gain_y(gains, db); + let zero = db == 0.; + p.line_segment( + [Pos2::new(gains.left(), y), Pos2::new(gains.right(), y)], + Stroke::new(1.0_f32, if zero { EDGE } else { GRID }), + ); + p.text( + Pos2::new(outer.left() + 6., y), + egui::Align2::LEFT_CENTER, + if zero { + "0".into() + } else { + format!("{db:+.0}") + }, + FontId::proportional(10.), + if zero { MUTED } else { DIM }, + ); + } + let zero = gain_y(gains, 0.); + let active = settings.harmonics as usize; + let hover = response.hover_pos().map(|pos| column(pos.x)); + let mut curve = Vec::with_capacity(HARMONICS); + for k in 0..HARMONICS { + let x0 = gains.left() + col * k as f32; + let bar = Rect::from_min_max( + Pos2::new(x0 + col * 0.18, zero.min(gain_y(gains, settings.gains[k]))), + Pos2::new(x0 + col * 0.82, zero.max(gain_y(gains, settings.gains[k]))), + ); + let on = k < active; + let fill = if !on { + Color32::from_rgb(40, 42, 47) + } else if hover == Some(k) { + Color32::from_rgb(255, 60, 130) + } else { + ACCENT + }; + if bar.height() >= 1. { + p.rect_filled(bar, 1., fill); + } else { + p.line_segment( + [Pos2::new(bar.left(), zero), Pos2::new(bar.right(), zero)], + Stroke::new(2.0_f32, if on { DIM } else { GRID }), + ); + } + if on { + curve.push(Pos2::new( + x0 + col * 0.5, + gain_y(gains, settings.effective(k + 1)), + )); + } + let label_color = if hover == Some(k) { + TEXT + } else if on { + MUTED + } else { + DIM + }; + p.text( + Pos2::new(x0 + col * 0.5, gains.bottom() + 4.), + egui::Align2::CENTER_TOP, + format!("{}", k + 1), + FontId::proportional(10.), + label_color, + ); + // Measured levels: input (steel) and output (accent), side by side. + let f = &state.analyzer; + for (i, (db, color)) in [(f.input[k], STEEL), (f.output[k], ACCENT)] + .into_iter() + .enumerate() + { + let t = ((db - LEVEL_FLOOR) / -LEVEL_FLOOR).clamp(0., 1.); + if t <= 0. { + continue; + } + let w = col * 0.3; + let x = x0 + col * 0.18 + i as f32 * (w + col * 0.04); + let r = Rect::from_min_max( + Pos2::new(x, levels.bottom() - levels.height() * t), + Pos2::new(x + w, levels.bottom()), + ); + p.rect_filled(r, 0., color.gamma_multiply(if on { 0.9 } else { 0.4 })); + } + } + if curve.len() > 1 { + p.add(egui::Shape::line(curve, Stroke::new(1.5_f32, FOCUS))); + } + p.line_segment( + [ + Pos2::new(levels.left(), levels.top() - 2.), + Pos2::new(levels.right(), levels.top() - 2.), + ], + Stroke::new(1.0_f32, GRID), + ); + p.text( + gains.right_top() + Vec2::new(-4., 2.), + egui::Align2::RIGHT_TOP, + "GAIN · EFFECTIVE", + FontId::proportional(11.), + MUTED, + ); + p.text( + Pos2::new(levels.right() - 4., levels.top() + 2.), + egui::Align2::RIGHT_TOP, + "LEVEL IN · OUT", + FontId::proportional(11.), + MUTED, + ); + p.rect_stroke( + outer, + 2., + Stroke::new(1.0_f32, EDGE), + egui::StrokeKind::Inside, + ); + if let Some(k) = hover { + let f = &state.analyzer; + let at = if f.hz > 0. { + format!(" at {:.0} Hz", f.hz * (k + 1) as f32) + } else { + String::new() + }; + state.help = format!( + "Harmonic {}{at}: drawn {:+.1} dB, effective {:+.1} dB. Drag to draw, Shift-drag fine, double-click resets.", + k + 1, + settings.gains[k], + settings.effective(k + 1), + ); + } +} + +pub fn show(ui: &mut egui::Ui, settings: &mut Settings, state: &mut State) { + backdrop(ui); + state.help = DEFAULT_HELP.into(); + state.gesture_active = ui.input(|i| i.pointer.any_down()); + ui.add_space(2.); + header(ui, "LATHE", "HARMONIC EQ", |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.); + let frame = state.analyzer; + ui.horizontal_top(|ui| { + panel(ui, |ui| { + ui.set_width(210.); + ui.set_min_height(TOP); + ui.vertical(|ui| note_panel(ui, settings, state, &frame)); + }); + ui.add_space(4.); + panel(ui, |ui| { + ui.set_width(ui.available_width()); + harmonic_editor(ui, settings, state, TOP); + }); + }); + ui.add_space(6.); + panel(ui, |ui| { + ui.set_width(ui.available_width()); + ui.vertical(|ui| controls(ui, settings, state)); + }); + ui.separator(); + ui.label(RichText::new(&state.help).color(MUTED)); +} +const TOP: f32 = 330.; + +/// Label, help text, and gain in dB for 1-based harmonic `k`. +type Preset = (&'static str, &'static str, fn(usize) -> f32); + +fn note_panel( + ui: &mut egui::Ui, + settings: &mut Settings, + state: &mut State, + frame: &AnalyzerFrame, +) { + caption(ui, "NOTE"); + let (name, hz) = match frame.note { + Some(n) if frame.hz > 0. => (common_dsp::note_name(n), format!("{:.1} Hz", frame.hz)), + _ if frame.hz > 0. => ("—".into(), format!("holding {:.1} Hz", frame.hz)), + _ => ("—".into(), "no note yet".into()), + }; + ui.label( + RichText::new(name) + .font(FontId::new(54., egui::FontFamily::Name("medium".into()))) + .color(if frame.note.is_some() { TEXT } else { DIM }), + ); + ui.label(RichText::new(hz).monospace().size(14.).color(MUTED)); + ui.add_space(6.); + ui.label( + RichText::new(format!( + "{:.0} ms lookahead · {}", + frame.latency as f32 / frame.sample_rate * 1000., + match settings.source { + Source::Audio => "detecting pitch", + Source::Midi => "following MIDI", + } + )) + .size(12.) + .color(MUTED), + ); + ui.add_space(14.); + caption(ui, "SHAPES"); + let presets: [Preset; 4] = [ + ("FLAT", "Reset every drawn gain to 0 dB.", |_| 0.), + ( + "ODD ONLY", + "Remove even harmonics: hollow, square-like.", + |k| { + if k % 2 == 0 { + -24. + } else { + 0. + } + }, + ), + ( + "EVEN ONLY", + "Keep the fundamental and even harmonics: octave-like, smooth.", + |k| { + if k > 1 && k % 2 == 1 { + -24. + } else { + 0. + } + }, + ), + ( + "HOLLOW", + "Cut harmonics 2–4: scooped, vocal growl body.", + |k| { + if (2..=4).contains(&k) { + -12. + } else { + 0. + } + }, + ), + ]; + ui.horizontal_wrapped(|ui| { + for (label, help, f) in presets { + let r = ui.button(RichText::new(label).size(12.)); + if r.clicked() { + for k in 0..HARMONICS { + settings.gains[k] = f(k + 1); + } + } + hint(&r, state, help); + } + }); + ui.add_space(10.); + let r = ui.selectable_label(settings.snap, RichText::new("SNAP TO SEMITONE").size(13.)); + if r.clicked() { + settings.snap = !settings.snap; + } + hint( + &r, + state, + "Round the detected pitch. Turn off for slides and pitch bends.", + ); +} + +fn controls(ui: &mut egui::Ui, settings: &mut Settings, state: &mut State) { + let d = Settings::default(); + ui.columns(9, |c| { + knob(&mut c[0], state, "Tilt", &mut settings.tilt, -12. ..=12., d.tilt, " dB/oct", 80., + "Brighter or darker by harmonic number: dB per octave of harmonics, pivot on the fundamental."); + knob(&mut c[1], state, "Odd/Even", &mut settings.odd_even, -12. ..=12., d.odd_even, " dB", 80., + "Positive: odd harmonics up, even down (square-like). Negative: the reverse."); + knob(&mut c[2], state, "Between", &mut settings.between, -24. ..=12., d.between, " dB", 80., + "Gain between the harmonics. Cut to clean noise and beating, lift for grit."); + knob(&mut c[3], state, "Width", &mut settings.width, 5. ..=50., d.width, " %", 80., + "Bandwidth of every band as a share of the harmonic spacing."); + let mut harmonics = settings.harmonics as f32; + knob(&mut c[4], state, "Harmonics", &mut harmonics, 8. ..=32., d.harmonics as f32, "", 54., + "How many harmonics are shaped. Higher harmonics pass unchanged."); + settings.harmonics = harmonics.round() as u32; + knob(&mut c[5], state, "Smooth", &mut settings.smooth, 0. ..=100., d.smooth, " ms", 54., + "Retune time for slides and bends. New notes always retune at once."); + knob(&mut c[6], state, "Gate", &mut settings.gate, -60. ..=-20., d.gate, " dB", 54., + "Input level that counts as a note. Raise it if tails retrigger."); + knob(&mut c[7], state, "Mix", &mut settings.mix, 0. ..=100., d.mix, " %", 54., + "Blend with the delayed dry signal."); + knob(&mut c[8], state, "Output", &mut settings.output, -12. ..=12., d.output, " dB", 54., + "Output trim."); + }); +} diff --git a/plugins/temper/core/Cargo.toml b/plugins/temper/core/Cargo.toml new file mode 100644 index 0000000..e0e1d4c --- /dev/null +++ b/plugins/temper/core/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "temper-core" +version = "0.1.0" +edition.workspace = true +license.workspace = true + +[dependencies] +common-dsp = { path = "../../common/dsp" } +serde = { workspace = true } + +[dev-dependencies] +serde_json = { workspace = true } diff --git a/plugins/temper/core/src/lib.rs b/plugins/temper/core/src/lib.rs new file mode 100644 index 0000000..78c19fd --- /dev/null +++ b/plugins/temper/core/src/lib.rs @@ -0,0 +1,405 @@ +//! Note-tracked distortion: the filters around the shaper follow the played note and the +//! input level is normalised per note, so every note distorts with the same character. +//! +//! The audio path is delayed by the tracker's lookahead, so filters and drive are set for a +//! note before its attack reaches the shaper. The shaper runs at 4× the sample rate. +mod settings; +use common_dsp::meter::{HarmonicMeter, HARMONICS}; +use common_dsp::oversample::Oversampler; +use common_dsp::svf::{Svf, SvfCoef}; +use common_dsp::tracker::{NoteEvent, PitchFollower, Tracker, TrackerConfig}; +use common_dsp::{coefficient, db_to_gain, gain_to_db, hz_to_midi}; +pub use settings::{Curve, Settings, Source}; + +pub const MIN_HZ: f32 = TrackerConfig::BASS.min_hz; +pub const MAX_HZ: f32 = TrackerConfig::BASS.max_hz; +/// Harmonics shown by the editor. +pub const SHOWN: usize = 16; +/// RMS level that Normalize brings every note to before Drive. +const TARGET_DB: f32 = -12.; +const RETUNE: usize = 16; +const DRY: usize = 64; + +#[derive(Clone, Copy, Debug)] +pub struct AnalyzerFrame { + pub hz: f32, + pub note: Option, + /// Harmonic levels in dBFS of the delayed input and of the output (index 0 = fundamental). + pub input: [f32; SHOWN], + pub output: [f32; SHOWN], + /// Peak level reaching the shaper, after normalisation and drive, in dB. + pub shaper_db: f32, + /// Gain applied by Normalize and by Auto gain, in dB. + pub normalize_db: f32, + pub auto_db: f32, + pub latency: u32, + pub sample_rate: f32, +} +impl Default for AnalyzerFrame { + fn default() -> Self { + Self { + hz: 0., + note: None, + input: [-120.; SHOWN], + output: [-120.; SHOWN], + shaper_db: -120., + normalize_db: 0., + auto_db: 0., + latency: 0, + sample_rate: 48000., + } + } +} + +/// Per-note input level, measured on the undelayed input so it is known at the attack. +#[derive(Clone, Copy, Debug, Default)] +struct Level { + /// RMS of the undelayed input. + ahead: f32, + /// Loudest `ahead` since the note started, slowly released. + note: f32, +} +impl Level { + fn event(&mut self, e: NoteEvent) { + if let NoteEvent::Start { glide: false, .. } = e { + // `ahead` already looks one lookahead into the new note. + self.note = self.ahead; + } + } +} + +#[derive(Clone, Copy, Debug)] +struct Filters { + floor: SvfCoef, + push: SvfCoef, + bright: SvfCoef, +} + +struct Channel { + floor: Svf, + push: Svf, + bright: Svf, + over: Oversampler, + dc_x: f32, + dc_y: f32, + dry: [f32; DRY], +} +impl Channel { + fn new() -> Self { + Self { + floor: Svf::default(), + push: Svf::default(), + bright: Svf::default(), + over: Oversampler::new(), + dc_x: 0., + dc_y: 0., + dry: [0.; DRY], + } + } + fn reset(&mut self) { + self.floor.reset(); + self.push.reset(); + self.bright.reset(); + self.over.reset(); + self.dc_x = 0.; + self.dc_y = 0.; + self.dry = [0.; DRY]; + } +} + +struct Smoothed { + value: f32, + coef: f32, +} +impl Smoothed { + fn new(value: f32, coef: f32) -> Self { + Self { value, coef } + } + #[inline] + fn next(&mut self, target: f32) -> f32 { + let d = target - self.value; + self.value = if d.abs() < 1e-6 { + target + } else { + self.value + d * self.coef + }; + self.value + } +} + +pub struct Engine { + rate: f32, + channels: usize, + settings: Settings, + latency: usize, + delay: Vec<[f32; 2]>, + delay_at: usize, + dry_at: usize, + tracker: Tracker, + pitch: PitchFollower, + hz_coef: f32, + countdown: usize, + filters: Filters, + channel: [Channel; 2], + level: Level, + rms_coef: f32, + release: f32, + norm_db: Smoothed, + drive: Smoothed, + bias: Smoothed, + mix: Smoothed, + output: Smoothed, + bypass: Smoothed, + auto_db: Smoothed, + power_in: f32, + power_out: f32, + power_coef: f32, + dc_r: f32, + shaper_peak: f32, + meter_in: HarmonicMeter, + meter_out: HarmonicMeter, + /// Smoothed controls start at the next settings instead of gliding from defaults. + fresh: bool, +} + +impl Engine { + pub fn new(rate: f32, channels: usize) -> Result { + if !(8000.0..=768000.).contains(&rate) { + return Err("unsupported sample rate"); + } + if !(1..=2).contains(&channels) { + return Err("unsupported channel count"); + } + let tracker = Tracker::new(rate, TrackerConfig::BASS); + let lookahead = tracker.latency(); + let smooth = coefficient(rate, 10.); + let settings = Settings::default(); + let mut e = Self { + rate, + channels, + settings, + latency: lookahead + Oversampler::latency(), + delay: vec![[0.; 2]; lookahead + 1], + delay_at: 0, + dry_at: 0, + tracker, + pitch: PitchFollower::default(), + hz_coef: coefficient(rate, 5.), + countdown: 0, + filters: Filters { + floor: SvfCoef::IDENTITY, + push: SvfCoef::IDENTITY, + bright: SvfCoef::IDENTITY, + }, + channel: [Channel::new(), Channel::new()], + level: Level::default(), + rms_coef: coefficient(rate, 10.), + release: 1. - coefficient(rate, 1500.), + norm_db: Smoothed::new(0., coefficient(rate, 5.)), + drive: Smoothed::new(db_to_gain(settings.drive), smooth), + bias: Smoothed::new(0., smooth), + mix: Smoothed::new(1., smooth), + output: Smoothed::new(1., smooth), + bypass: Smoothed::new(0., smooth), + auto_db: Smoothed::new(0., coefficient(rate, 50.)), + power_in: 0., + power_out: 0., + power_coef: coefficient(rate, 300.), + dc_r: 1. - std::f32::consts::TAU * 10. / rate, + shaper_peak: 0., + meter_in: HarmonicMeter::new(rate, 85.), + meter_out: HarmonicMeter::new(rate, 85.), + fresh: true, + }; + e.set_settings(settings)?; + e.fresh = true; + Ok(e) + } + /// Lookahead plus the oversampling filters. + pub fn latency_samples(&self) -> u32 { + self.latency 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()?; + self.tracker.set(s.source == Source::Midi, s.gate, true); + if std::mem::take(&mut self.fresh) { + self.drive.value = db_to_gain(s.drive); + self.bias.value = s.bias * 0.008; + self.mix.value = s.mix * 0.01; + self.output.value = db_to_gain(s.output); + self.bypass.value = f32::from(s.bypass); + } + self.settings = s; + Ok(()) + } + pub fn reset(&mut self) { + self.delay.fill([0.; 2]); + self.tracker.reset(); + for c in &mut self.channel { + c.reset(); + } + self.level = Level::default(); + self.power_in = 0.; + self.power_out = 0.; + self.shaper_peak = 0.; + self.meter_in.reset(); + self.meter_out.reset(); + self.countdown = 0; + 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 retune(&mut self, hz: f32) { + let s = &self.settings; + let limit = 0.45 * self.rate; + let tuned = |mult: f32| hz > 0. && mult > 0. && hz * mult < limit; + self.filters.floor = if tuned(s.floor) { + SvfCoef::highpass(self.rate, hz * s.floor, std::f32::consts::FRAC_1_SQRT_2) + } else { + SvfCoef::IDENTITY + }; + let k = s.push_harmonic as f32; + self.filters.push = if tuned(k) && s.push_gain != 0. { + SvfCoef::bell(self.rate, hz * k, k / 0.6, s.push_gain) + } else { + SvfCoef::IDENTITY + }; + self.filters.bright = if tuned(s.bright) { + SvfCoef::lowpass(self.rate, hz * s.bright, std::f32::consts::FRAC_1_SQRT_2) + } else { + SvfCoef::IDENTITY + }; + } + 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] + }; + // Level of the input one lookahead ahead of the audio that is about to be shaped. + let a = &mut self.level; + a.ahead += (mono * mono - a.ahead) * self.rms_coef; + a.note = (a.note * self.release).max(a.ahead); + let (pitch, level) = (&mut self.pitch, &mut self.level); + self.tracker.process(mono, |e| { + pitch.event(false, e); + level.event(e); + }); + 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 (hz, jump) = self.pitch.step(self.hz_coef); + if jump || self.countdown == 0 { + self.retune(hz); + self.countdown = RETUNE; + } + self.countdown -= 1; + + let s = self.settings; + let rms_db = 10. * self.level.note.max(1e-12).log10(); + // Below −60 dBFS there is nothing to normalise; hold the last gain. + let norm_target = if rms_db > -60. { + (s.normalize * 0.01 * (TARGET_DB - rms_db)).clamp(-24., 36.) + } else { + self.norm_db.value + }; + let norm = db_to_gain(self.norm_db.next(norm_target)); + let drive = self.drive.next(db_to_gain(s.drive)); + let bias = self.bias.next(s.bias * 0.008); + let mix = self.mix.next(s.mix * 0.01); + let output = self.output.next(db_to_gain(s.output)); + let bypass = self.bypass.next(f32::from(s.bypass)); + let curve = s.curve; + let offset = curve.shape(bias); + let f = self.filters; + let dry_at = self.dry_at; + let back = (dry_at + DRY - Oversampler::latency()) % DRY; + let mut wet = [0.; 2]; + let mut dry = [0.; 2]; + let mut peak = self.shaper_peak; + for c in 0..self.channels { + let ch = &mut self.channel[c]; + ch.dry[dry_at] = y[c]; + dry[c] = ch.dry[back]; + let v = ch.floor.process(&f.floor, y[c]); + let v = ch.push.process(&f.push, v) * norm * drive; + let up = ch.over.up(v); + let shaped = up.map(|u| { + peak = peak.max(u.abs()); + curve.shape(u + bias) - offset + }); + let v = ch.over.down(shaped); + let v = ch.bright.process(&f.bright, v); + // DC blocker: bias and asymmetric curves leave an offset. + let d = v - ch.dc_x + self.dc_r * ch.dc_y; + ch.dc_x = v; + ch.dc_y = d; + wet[c] = d; + } + self.shaper_peak = peak; + self.dry_at = (dry_at + 1) % DRY; + + let (dry_mono, wet_mono) = if self.channels == 2 { + (0.5 * (dry[0] + dry[1]), 0.5 * (wet[0] + wet[1])) + } else { + (dry[0], wet[0]) + }; + self.power_in += (dry_mono * dry_mono - self.power_in) * self.power_coef; + self.power_out += (wet_mono * wet_mono - self.power_out) * self.power_coef; + let auto_target = if !s.auto_gain { + 0. + } else if self.power_in > 1e-7 && self.power_out > 1e-9 { + (10. * (self.power_in / self.power_out).log10()).clamp(-36., 24.) + } else { + self.auto_db.value + }; + let auto = db_to_gain(self.auto_db.next(auto_target)); + let mut out = [0.; 2]; + for c in 0..self.channels { + let v = (mix * wet[c] * auto + (1. - mix) * dry[c]) * output; + out[c] = v * (1. - bypass) + dry[c] * bypass; + } + let tone = if self.tracker.sounding() { hz } else { 0. }; + let o = if self.channels == 2 { + 0.5 * (out[0] + out[1]) + } else { + out[0] + }; + self.meter_in.push(dry_mono, tone); + self.meter_out.push(o, tone); + out + } + pub fn take_analyzer(&mut self) -> AnalyzerFrame { + let hz = self.pitch.hz(); + let mut f = AnalyzerFrame { + hz, + latency: self.latency as u32, + sample_rate: self.rate, + shaper_db: gain_to_db(self.shaper_peak), + normalize_db: self.norm_db.value, + auto_db: self.auto_db.value, + ..AnalyzerFrame::default() + }; + self.shaper_peak = 0.; + f.input + .copy_from_slice(&self.meter_in.levels()[..SHOWN.min(HARMONICS)]); + f.output + .copy_from_slice(&self.meter_out.levels()[..SHOWN.min(HARMONICS)]); + if self.tracker.sounding() && hz > 0. { + f.note = Some(hz_to_midi(hz).round().clamp(0., 127.) as u8); + } + f + } +} diff --git a/plugins/temper/core/src/settings.rs b/plugins/temper/core/src/settings.rs new file mode 100644 index 0000000..da0220c --- /dev/null +++ b/plugins/temper/core/src/settings.rs @@ -0,0 +1,138 @@ +//! Host-independent controls. Levels in dB, harmonic positions as multiples of the fundamental. +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, +} + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)] +pub enum Curve { + /// tanh: smooth, odd harmonics, rounded top. + #[default] + Soft, + /// Clipping with a narrow knee: dense, square-like. + Hard, + /// Sine wavefolder: drive folds the wave back, adding moving upper harmonics. + Fold, + /// Asymmetric: the negative half clips earlier, adding even harmonics. + Tube, +} +impl Curve { + pub const ALL: [Curve; 4] = [Curve::Soft, Curve::Hard, Curve::Fold, Curve::Tube]; + pub fn name(self) -> &'static str { + match self { + Curve::Soft => "Soft", + Curve::Hard => "Hard", + Curve::Fold => "Fold", + Curve::Tube => "Tube", + } + } + /// Transfer function; maps 0 to 0. + #[inline] + pub fn shape(self, u: f32) -> f32 { + match self { + Curve::Soft => u.tanh(), + Curve::Hard => { + let u = u.clamp(-8., 8.); + u / (1. + u.abs().powi(8)).powf(0.125) + } + // Scaled so full drive gives about five folds; more is mostly aliasing noise. + Curve::Fold => (std::f32::consts::FRAC_PI_2 * 0.4 * u.clamp(-64., 64.)).sin(), + Curve::Tube => { + if u >= 0. { + u.tanh() + } else { + 0.6 * (u / 0.6).tanh() + } + } + } + } +} + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)] +#[serde(deny_unknown_fields)] +pub struct Settings { + pub source: Source, + /// Gain into the shaper after level normalisation. + pub drive: f32, + pub curve: Curve, + /// Asymmetry in percent: shifts the curve's operating point, adding even harmonics. + pub bias: f32, + /// How far the input level is normalised per note before the shaper, in percent. At 100 % + /// a quiet patch and a loud patch are driven the same. + pub normalize: f32, + /// Highpass in front of the shaper at this multiple of the fundamental; 0 is off. + pub floor: f32, + /// Harmonic that `push_gain` boosts or cuts before the shaper. + pub push_harmonic: u32, + pub push_gain: f32, + /// Lowpass after the shaper at this harmonic number; 0 is off. + pub bright: f32, + /// Matches output loudness to the input, so Drive changes character, not level. + pub auto_gain: bool, + /// Detection threshold in dBFS for note starts (Audio source). + pub gate: f32, + pub mix: f32, + pub output: f32, + pub bypass: bool, +} +impl Default for Settings { + fn default() -> Self { + Self { + source: Source::Audio, + drive: 12., + curve: Curve::Soft, + bias: 0., + normalize: 100., + floor: 0., + push_harmonic: 3, + push_gain: 0., + bright: 0., + auto_gain: true, + gate: -42., + mix: 100., + output: 0., + bypass: false, + } + } +} +impl Settings { + pub fn validate(&self) -> Result<(), &'static str> { + let finite = [ + self.drive, + self.bias, + self.normalize, + self.floor, + self.push_gain, + self.bright, + self.gate, + self.mix, + self.output, + ] + .iter() + .all(|v| v.is_finite()); + if !finite { + return Err("non-finite setting"); + } + let ok = (0.0..=36.).contains(&self.drive) + && (0.0..=100.).contains(&self.bias) + && (0.0..=100.).contains(&self.normalize) + && (self.floor == 0. || (0.25..=2.).contains(&self.floor)) + && (1..=16).contains(&self.push_harmonic) + && (-12.0..=12.).contains(&self.push_gain) + && (self.bright == 0. || (4.0..=64.).contains(&self.bright)) + && (-60.0..=-20.).contains(&self.gate) + && (0.0..=100.).contains(&self.mix) + && (-12.0..=12.).contains(&self.output); + if ok { + Ok(()) + } else { + Err("setting out of range") + } + } +} diff --git a/plugins/temper/core/tests/dsp.rs b/plugins/temper/core/tests/dsp.rs new file mode 100644 index 0000000..d11e2f2 --- /dev/null +++ b/plugins/temper/core/tests/dsp.rs @@ -0,0 +1,244 @@ +use common_dsp::meter::HarmonicMeter; +use common_dsp::Saw; +use std::f32::consts::TAU; +use temper_core::{Curve, Engine, Settings, Source}; + +const RATE: f32 = 48000.; + +fn engine(s: Settings) -> (Engine, usize) { + let mut e = Engine::new(RATE, 2).unwrap(); + e.set_settings(s).unwrap(); + let l = e.latency_samples() as usize; + (e, l) +} +fn saw(hz: f32, seconds: f32, amp: f32) -> Vec { + let mut s = Saw::new(RATE, hz); + (0..(seconds * RATE) as usize) + .map(|_| s.sample() * amp) + .collect() +} +fn render(e: &mut Engine, x: &[f32]) -> Vec { + x.iter().map(|&v| e.process_sample([v, v])[0]).collect() +} +fn harmonics(x: &[f32], hz: f32) -> [f32; 32] { + let mut m = HarmonicMeter::new(RATE, 85.); + for &v in x { + m.push(v, hz); + } + *m.levels() +} +/// Harmonics 1–n relative to the fundamental. +fn profile(x: &[f32], hz: f32, n: usize) -> Vec { + let h = harmonics(x, hz); + (0..n).map(|k| h[k] - h[0]).collect() +} +fn rms_db(x: &[f32]) -> f32 { + 10. * (x.iter().map(|v| v * v).sum::() / x.len() as f32).log10() +} + +#[test] +fn quiet_and_loud_patches_distort_the_same() { + let s = Settings { + drive: 18., + auto_gain: false, + ..Settings::default() + }; + let mut profiles = vec![]; + for amp in [0.5, 0.06] { + let (mut e, _) = engine(s); + let y = render(&mut e, &saw(55., 1.2, amp)); + profiles.push(profile(&y[y.len() / 2..], 55., 8)); + } + for k in 1..8 { + let d = profiles[0][k] - profiles[1][k]; + assert!(d.abs() < 1., "harmonic {}: {profiles:?}", k + 1); + } + // Without normalisation the quiet patch is barely distorted. + let s = Settings { normalize: 0., ..s }; + let (mut e, _) = engine(s); + let y = render(&mut e, &saw(55., 1.2, 0.06)); + let quiet = profile(&y[y.len() / 2..], 55., 8); + assert!( + (quiet[2] - profiles[0][2]).abs() > 2., + "{quiet:?} vs {profiles:?}" + ); +} + +#[test] +fn bright_follows_the_note() { + let s = Settings { + drive: 24., + curve: Curve::Hard, + bright: 8., + ..Settings::default() + }; + let mut profiles = vec![]; + for hz in [43.65, 87.31] { + let (mut e, _) = engine(s); + let y = render(&mut e, &saw(hz, 1.2, 0.4)); + profiles.push(profile(&y[y.len() / 2..], hz, 14)); + } + for k in 1..14 { + let d = profiles[0][k] - profiles[1][k]; + assert!(d.abs() < 1.5, "harmonic {}: {profiles:?}", k + 1); + } + // Above the cutoff the harmonics fall away on both notes. + assert!(profiles[0][12] < profiles[0][4] - 10.); +} + +/// Energy away from the harmonics of `hz`, relative to the harmonics, in dB. +fn alias_ratio(curve: Curve, drive: f32, hz: f32) -> f32 { + let s = Settings { + drive, + curve, + auto_gain: false, + ..Settings::default() + }; + let (mut e, _) = engine(s); + let x: Vec = (0..36000) + .map(|i| 0.3 * (TAU * hz * i as f32 / RATE).sin()) + .collect(); + let y = render(&mut e, &x); + let tail = &y[12000..]; + let n = tail.len(); + let window: Vec = (0..n) + .map(|i| 0.5 - 0.5 * (TAU * i as f32 / n as f32).cos()) + .collect(); + let (mut harmonic, mut other) = (0f64, 0f64); + for f in (20..23000).step_by(10) { + // Goertzel power at f. + let c = 2. * (TAU as f64 * f as f64 / RATE as f64).cos(); + let (mut s1, mut s2) = (0f64, 0f64); + for (v, w) in tail.iter().zip(&window) { + let s0 = (v * w) as f64 + c * s1 - s2; + s2 = s1; + s1 = s0; + } + let p = s1 * s1 + s2 * s2 - c * s1 * s2; + let near = (f as f32 / hz - (f as f32 / hz).round()).abs() * hz < 30.; + if near { + harmonic += p; + } else { + other += p; + } + } + (10. * (other / harmonic).log10()) as f32 +} + +#[test] +fn oversampling_keeps_aliasing_down_in_the_bass_range() { + // 2 kHz stands for the upper harmonics of a growl, 440 Hz for a high bass fundamental. + for curve in Curve::ALL { + let r = alias_ratio(curve, 24., 2000.); + assert!(r < -60., "{} 2 kHz: {r}", curve.name()); + let r = alias_ratio(curve, 36., 440.); + assert!(r < -55., "{} 440 Hz: {r}", curve.name()); + } +} + +#[test] +#[ignore] +fn print_alias_ratios() { + for curve in Curve::ALL { + for hz in [440., 2000., 5000.] { + for drive in [12., 24., 36.] { + println!( + "{} {hz} {drive}: {:.1}", + curve.name(), + alias_ratio(curve, drive, hz) + ); + } + } + } +} + +#[test] +fn auto_gain_matches_input_loudness() { + for drive in [6., 24., 36.] { + let s = Settings { + drive, + ..Settings::default() + }; + let (mut e, l) = engine(s); + let x = saw(55., 2., 0.3); + let y = render(&mut e, &x); + let d = rms_db(&y[y.len() / 2..]) - rms_db(&x[x.len() / 2 - l..x.len() - l]); + assert!(d.abs() < 1., "{drive}: {d}"); + } +} + +#[test] +fn zero_mix_is_the_delayed_dry_signal_and_latency_is_exact() { + let s = Settings { + mix: 0., + ..Settings::default() + }; + let (mut e, l) = engine(s); + let x = saw(55., 1., 0.5); + let y = render(&mut e, &x); + for i in RATE as usize / 2..x.len() { + assert_eq!(y[i], x[i - l], "{i}"); + } + // With the shaper nearly linear the wet path lines up with the dry one. + let s = Settings { + drive: 0., + normalize: 0., + curve: Curve::Soft, + auto_gain: false, + ..Settings::default() + }; + let (mut e, l) = engine(s); + let mut x = vec![0f32; 9600]; + x[100] = 0.01; + let y = render(&mut e, &x); + let at = y + .iter() + .enumerate() + .max_by(|a, b| a.1.abs().total_cmp(&b.1.abs())) + .unwrap() + .0; + assert_eq!(at, 100 + l); +} + +#[test] +fn midi_source_tunes_filters_at_the_delayed_note_time() { + let s = Settings { + source: Source::Midi, + bright: 4., + drive: 18., + curve: Curve::Hard, + ..Settings::default() + }; + let (mut e, _) = engine(s); + e.note_on(29); + let y = render(&mut e, &saw(43.65, 1., 0.4)); + let p = profile(&y[y.len() / 2..], 43.65, 12); + assert!(p[10] < p[2] - 12., "{p:?}"); + let f = e.take_analyzer(); + assert_eq!(f.note, Some(29)); +} + +#[test] +fn settings_are_validated_and_serialise() { + let s = Settings::default(); + let json = serde_json::to_string(&s).unwrap(); + assert_eq!(serde_json::from_str::(&json).unwrap(), s); + for bad in [ + Settings { floor: 0.1, ..s }, + Settings { bright: 2., ..s }, + Settings { + push_harmonic: 0, + ..s + }, + Settings { + drive: f32::NAN, + ..s + }, + ] { + assert!(bad.validate().is_err(), "{bad:?}"); + } + for c in Curve::ALL { + assert_eq!(c.shape(0.), 0.); + assert!(c.shape(100.).abs() <= 1.0001); + } +} diff --git a/plugins/temper/core/tests/realtime.rs b/plugins/temper/core/tests/realtime.rs new file mode 100644 index 0000000..3fc273d --- /dev/null +++ b/plugins/temper/core/tests/realtime.rs @@ -0,0 +1,71 @@ +use std::{ + alloc::{GlobalAlloc, Layout, System}, + cell::Cell, +}; +use temper_core::{Curve, Engine, Settings, Source}; + +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(); + engine.set_settings(settings).unwrap(); + CHECK.with(|v| v.set(true)); + for i in 0..96000 { + if i % 4800 == 0 { + settings.curve = Curve::ALL[(i / 4800) % 4]; + settings.bright = if i % 9600 == 0 { 8. } else { 0. }; + settings.floor = if i % 9600 == 0 { 0. } else { 0.5 }; + settings.push_gain = ((i / 4800) % 5) as f32 - 2.; + settings.source = if i > 48000 { + Source::Midi + } else { + Source::Audio + }; + engine.set_settings(settings).unwrap(); + engine.note_on(30 + (i / 4800 % 12) as u8); + } + if i % 4800 == 2400 { + engine.note_off(30 + (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/temper/plugin/Cargo.lock b/plugins/temper/plugin/Cargo.lock new file mode 100644 index 0000000..4eedc63 --- /dev/null +++ b/plugins/temper/plugin/Cargo.lock @@ -0,0 +1,2381 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ab_glyph" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" + +[[package]] +name = "addr2line" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e567177890eb1617b1f774005b66b26b2377afd138a2ca37aae7d8f0c81429d4" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "android-activity" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd" +dependencies = [ + "android-properties", + "bitflags 2.13.2", + "cc", + "jni", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "num_enum", + "thiserror 2.0.21", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "anymap3" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5dfbc6d8d2675589ccbe4d0fd61df2419075625f8c1a62325e718e2b0049f9" + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "atomic_float" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62af46d040ba9df09edc6528dae9d8e49f5f3e82f55b7d2ec31a733c38dbc49d" + +[[package]] +name = "atomic_refcell" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21e4227379beff4205943696e6c3e0cd809bacdf3f0edd6e3dd153e2269571a4" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "backtrace" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f4220217f3288537b83684130f42fad43320b1c3b805f1910d683d52ded24f" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link", +] + +[[package]] +name = "baseview" +version = "0.1.0" +source = "git+https://github.com/RustAudio/baseview.git?rev=9a0b42c09d712777b2edb4c5e0cb6baf21e988f0#9a0b42c09d712777b2edb4c5e0cb6baf21e988f0" +dependencies = [ + "cocoa", + "core-foundation", + "keyboard-types", + "nix", + "objc", + "raw-window-handle 0.5.2", + "uuid", + "winapi", + "x11", + "x11rb", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a1f896587b6f2c069c73d2f0913e2d590c3990285cd2f0b6aa02b786b4c679c" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.13.2", + "log", + "polling", + "rustix 0.38.44", + "slab", + "thiserror 1.0.69", +] + +[[package]] +name = "cc" +version = "1.11.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 = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] + +[[package]] +name = "gethostname" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +dependencies = [ + "rustix 1.1.6", + "windows-link", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi", +] + +[[package]] +name = "gimli" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1033caf0b349c518623b5396bfb2cf0bddf44f0306d543a250e5743297aafd10" + +[[package]] +name = "glow" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" + +[[package]] +name = "indexmap" +version = "2.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys 0.4.1", + "log", + "simd_cesu8", + "thiserror 2.0.21", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn 2.0.119", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom 0.4.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dc09d2154098bbf4ef54eab6b117a3c24cbbffe94046b16ee6d6d4510584d3a" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "keyboard-types" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7668b7cff6a51fe61cdde64cd27c8a220786f399501b57ebe36f7d8112fd68" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "libc" +version = "0.2.191" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a" + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[package]] +name = "libredox" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d" +dependencies = [ + "bitflags 2.13.2", + "libc", + "plain", + "redox_syscall 0.9.5", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d15f86d12da44cd8d4ec3c73984537eb7f4cadcb9776a575a0a8a05ca11005c" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "midi-consts" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f2dd5c7f8aaf48a76e389068ab25ed80bdbc226b887f9013844c415698c9952" + +[[package]] +name = "miniz_oxide" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" +dependencies = [ + "adler2", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.13.2", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle 0.6.2", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "nih_log" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0cdb52ef79af48ae110401c883bdb9c15e0306a99ab6ecf18bc52068b668e54" +dependencies = [ + "atty", + "log", + "once_cell", + "termcolor", + "time", + "windows", +] + +[[package]] +name = "nih_plug" +version = "0.0.0" +source = "git+https://github.com/robbert-vdh/nih-plug.git?rev=de421011f41a6d10fc8c7a6084e4f4dee0143683#de421011f41a6d10fc8c7a6084e4f4dee0143683" +dependencies = [ + "anyhow", + "anymap3", + "atomic_float", + "atomic_refcell", + "backtrace", + "bitflags 1.3.2", + "cfg-if", + "clap-sys", + "core-foundation", + "crossbeam", + "libc", + "log", + "midi-consts", + "nih_log", + "nih_plug_derive", + "objc", + "parking_lot", + "raw-window-handle 0.5.2", + "serde", + "serde_json", + "widestring", + "windows", +] + +[[package]] +name = "nih_plug_derive" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/nih-plug.git?rev=de421011f41a6d10fc8c7a6084e4f4dee0143683#de421011f41a6d10fc8c7a6084e4f4dee0143683" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "nih_plug_egui" +version = "0.0.0" +source = "git+https://github.com/robbert-vdh/nih-plug.git?rev=de421011f41a6d10fc8c7a6084e4f4dee0143683#de421011f41a6d10fc8c7a6084e4f4dee0143683" +dependencies = [ + "baseview", + "crossbeam", + "egui-baseview", + "nih_plug", + "parking_lot", + "raw-window-handle 0.5.2", + "serde", +] + +[[package]] +name = "nix" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" +dependencies = [ + "bitflags 1.3.2", + "cc", + "cfg-if", + "libc", + "memoffset 0.6.5", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "num_threads" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cabcc654086861f9e1bc5115258de62ef92c79b20f4615a1b0cc57c4e82027d4" +dependencies = [ + "libc", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d5490aaf8f1d7cf7688dfa9b0ce07900e168852c45cd2c03f534dfd27cfd0b" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.13.2", + "block2", + "libc", + "objc2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2", + "objc2", + "objc2-contacts", + "objc2-foundation", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.13.2", + "block2", + "dispatch", + "libc", + "objc2", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2", + "objc2", + "objc2-app-kit", + "objc2-foundation", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-image", + "objc2-core-location", + "objc2-foundation", + "objc2-link-presentation", + "objc2-quartz-core", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "object" +version = "0.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd229a0361b9d0d4396176e02d65897f487eebeab7caa6d443855ee152ca0b9c" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "open" +version = "5.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d8c8b8e725ad26404d6896eb2f064294a0a7b4f1d9120210d85544684c4ca95" +dependencies = [ + "is-wsl", + "libc", +] + +[[package]] +name = "orbclient" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5df339f526ea9a60e371768d50efc2f2508c7203290731565d1f7a6f71d21747" +dependencies = [ + "libc", + "libredox", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.5.3", + "pin-project-lite", + "rustix 1.1.6", + "windows-sys 0.61.2", +] + +[[package]] +name = "powerfmt" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a6394b9e965e73d0a289ee54f589087e2c676aedf60885baf52c76b771e4958" + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" + +[[package]] +name = "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" +version = "0.1.0" +dependencies = [ + "clap-sys", + "crossbeam-queue", + "nih_plug", + "nih_plug_egui", + "serde_json", + "temper-core", + "temper-ui", +] + +[[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/temper/plugin/Cargo.toml b/plugins/temper/plugin/Cargo.toml new file mode 100644 index 0000000..067cf14 --- /dev/null +++ b/plugins/temper/plugin/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "temper" +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" } +temper-core = { path = "../core" } +temper-ui = { path = "../ui" } +crossbeam-queue = "0.3" + +[dev-dependencies] +clap-sys = { git = "https://github.com/micahrj/clap-sys.git", rev = "25d7f53fdb6363ad63fbd80049cb7a42a97ac156" } +serde_json = "1" + +[profile.release] +lto = "thin" +strip = "symbols" diff --git a/plugins/temper/plugin/src/lib.rs b/plugins/temper/plugin/src/lib.rs new file mode 100644 index 0000000..9eb35e0 --- /dev/null +++ b/plugins/temper/plugin/src/lib.rs @@ -0,0 +1,183 @@ +//! CLAP audio effect. All DSP state is owned by the processing thread. +mod params; +use crossbeam_queue::ArrayQueue; +use nih_plug::prelude::*; +use nih_plug_egui::{create_egui_editor, egui}; +use params::TemperParams; +use std::sync::Arc; +use temper_core::{AnalyzerFrame, Engine}; + +struct EditorData { + ui: temper_ui::State, + gestures: [bool; 9], +} +pub struct Temper { + params: Arc, + analyzer: Arc>, + engine: Option, + publish_count: usize, + publish_interval: usize, +} +impl Default for Temper { + fn default() -> Self { + Self { + params: Arc::new(TemperParams::default()), + analyzer: Arc::new(ArrayQueue::new(2)), + engine: None, + publish_count: 0, + publish_interval: 1600, + } + } +} +impl Plugin for Temper { + const NAME: &'static str = "Temper"; + const VENDOR: &'static str = "Rivet & Patina"; + 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: temper_ui::State::default(), + gestures: [false; 9], + }, + |ctx, _| temper_ui::style(ctx), + move |ctx, setter, data| { + while let Some(frame) = analyzer.pop() { + data.ui.accept_frame(frame); + } + let before = params.settings(); + let mut edited = before; + nih_plug_egui::resizable_window::ResizableWindow::new("temper-editor") + .min_size(egui::vec2( + temper_ui::WIDTH as f32 - 80., + temper_ui::HEIGHT as f32 - 40., + )) + .show(ctx, ¶ms.editor, |ui| { + temper_ui::show(ui, &mut edited, &mut data.ui) + }); + params.apply( + setter, + &before, + &edited, + data.ui.gesture_active, + &mut data.gestures, + ); + // Meters 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; + }; + if engine.set_settings(self.params.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 Some(engine) = self.engine.as_mut() else { + return ProcessStatus::Normal; + }; + let _ = engine.set_settings(self.params.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, oversampling filters and tails must drain after input stops. + ProcessStatus::KeepAlive + } +} +impl ClapPlugin for Temper { + const CLAP_ID: &'static str = "io.storyboard.tracked-distortion"; + const CLAP_DESCRIPTION: Option<&'static str> = Some( + "Distortion whose drive and tone filters follow the note, so every note distorts the same", + ); + 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::Stereo, + ClapFeature::Mono, + ]; +} +nih_export_clap!(Temper); diff --git a/plugins/temper/plugin/src/params.rs b/plugins/temper/plugin/src/params.rs new file mode 100644 index 0000000..245a955 --- /dev/null +++ b/plugins/temper/plugin/src/params.rs @@ -0,0 +1,207 @@ +use nih_plug::prelude::*; +use nih_plug_egui::EguiState; +use std::sync::Arc; +use temper_core::{Curve, Settings, Source}; + +#[derive(Enum, Debug, PartialEq, Eq, Clone, Copy)] +pub enum SourceParam { + #[id = "audio"] + Audio, + #[id = "midi"] + #[name = "MIDI"] + Midi, +} +#[derive(Enum, Debug, PartialEq, Eq, Clone, Copy)] +pub enum CurveParam { + #[id = "soft"] + Soft, + #[id = "hard"] + Hard, + #[id = "fold"] + Fold, + #[id = "tube"] + Tube, +} +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) +} +const FLOATS: usize = 9; + +#[derive(Params)] +pub struct TemperParams { + #[persist = "editor"] + pub editor: Arc, + #[id = "source"] + pub source: EnumParam, + #[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 = "gate"] + pub gate: 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, + #[id = "bypass"] + pub bypass: BoolParam, +} +impl Default for TemperParams { + fn default() -> Self { + let d = Settings::default(); + Self { + editor: EguiState::from_size(temper_ui::WIDTH, temper_ui::HEIGHT), + source: EnumParam::new("Pitch source", SourceParam::Audio), + curve: EnumParam::new("Curve", CurveParam::Soft), + drive: linear("Drive", d.drive, 0., 36., " dB"), + bias: linear("Bias", d.bias, 0., 100., " %"), + normalize: linear("Normalize", d.normalize, 0., 100., " %"), + floor: linear("Floor", d.floor, 0., 2., " ×f0"), + push_gain: linear("Push", d.push_gain, -12., 12., " dB"), + bright: linear("Bright", d.bright, 0., 64., " ×f0"), + gate: linear("Gate", d.gate, -60., -20., " dB"), + mix: linear("Mix", d.mix, 0., 100., " %"), + output: linear("Output", d.output, -12., 12., " dB"), + push_harmonic: IntParam::new( + "Push at", + d.push_harmonic as i32, + IntRange::Linear { min: 1, max: 16 }, + ), + auto_gain: BoolParam::new("Auto gain", d.auto_gain), + bypass: BoolParam::new("Bypass", false).make_bypass(), + } + } +} +fn curve_to(c: CurveParam) -> Curve { + match c { + CurveParam::Soft => Curve::Soft, + CurveParam::Hard => Curve::Hard, + CurveParam::Fold => Curve::Fold, + CurveParam::Tube => Curve::Tube, + } +} +fn curve_from(c: Curve) -> CurveParam { + match c { + Curve::Soft => CurveParam::Soft, + Curve::Hard => CurveParam::Hard, + Curve::Fold => CurveParam::Fold, + Curve::Tube => CurveParam::Tube, + } +} +impl TemperParams { + pub fn settings(&self) -> Settings { + // Floor and Bright are continuous for automation; below their ranges they are off. + let floor = self.floor.value(); + let bright = self.bright.value(); + Settings { + source: match self.source.value() { + SourceParam::Audio => Source::Audio, + SourceParam::Midi => Source::Midi, + }, + curve: curve_to(self.curve.value()), + drive: self.drive.value(), + bias: self.bias.value(), + normalize: self.normalize.value(), + floor: if floor < 0.25 { 0. } else { floor }, + push_harmonic: self.push_harmonic.value() as u32, + push_gain: self.push_gain.value(), + bright: if bright < 4. { 0. } else { bright }, + auto_gain: self.auto_gain.value(), + gate: self.gate.value(), + mix: self.mix.value(), + output: self.output.value(), + bypass: self.bypass.value(), + } + } + fn floats(&self) -> [&FloatParam; FLOATS] { + [ + &self.drive, + &self.bias, + &self.normalize, + &self.floor, + &self.push_gain, + &self.bright, + &self.gate, + &self.mix, + &self.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. + pub fn apply( + &self, + setter: &ParamSetter, + old: &Settings, + new: &Settings, + dragging: bool, + open: &mut [bool; FLOATS], + ) { + let values = [ + (old.drive, new.drive), + (old.bias, new.bias), + (old.normalize, new.normalize), + (old.floor, new.floor), + (old.push_gain, new.push_gain), + (old.bright, new.bright), + (old.gate, new.gate), + (old.mix, new.mix), + (old.output, new.output), + ]; + for (i, (p, (a, b))) in self.floats().into_iter().zip(values).enumerate() { + if a != b { + if !open[i] { + open[i] = true; + setter.begin_set_parameter(p); + } + setter.set_parameter(p, b); + } + if !dragging && open[i] { + setter.end_set_parameter(p); + open[i] = false; + } + } + if new.push_harmonic != old.push_harmonic { + setter.begin_set_parameter(&self.push_harmonic); + setter.set_parameter(&self.push_harmonic, new.push_harmonic as i32); + setter.end_set_parameter(&self.push_harmonic); + } + for (p, a, b) in [ + (&self.auto_gain, old.auto_gain, new.auto_gain), + (&self.bypass, old.bypass, new.bypass), + ] { + if a != b { + setter.begin_set_parameter(p); + setter.set_parameter(p, b); + setter.end_set_parameter(p); + } + } + if new.curve != old.curve { + setter.begin_set_parameter(&self.curve); + setter.set_parameter(&self.curve, curve_from(new.curve)); + setter.end_set_parameter(&self.curve); + } + if new.source != old.source { + let v = match new.source { + Source::Audio => SourceParam::Audio, + Source::Midi => SourceParam::Midi, + }; + setter.begin_set_parameter(&self.source); + setter.set_parameter(&self.source, v); + setter.end_set_parameter(&self.source); + } + } +} diff --git a/plugins/temper/plugin/tests/host.rs b/plugins/temper/plugin/tests/host.rs new file mode 100644 index 0000000..4453ba3 --- /dev/null +++ b/plugins/temper/plugin/tests/host.rs @@ -0,0 +1,211 @@ +//! 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 = &temper::clap_entry; + assert!(entry.init.unwrap()(c"temper.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"Temper"); + assert_eq!( + CStr::from_ptr((*descriptor).id), + c"io.storyboard.tracked-distortion" + ); + 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("drive".into(), ParamValue::F32(24.)); + envelope + .params + .insert("curve".into(), ParamValue::String("fold".into())); + envelope.params.insert("push-at".into(), ParamValue::I32(5)); + envelope + .params + .insert("source".into(), ParamValue::String("midi".into())); + // Mix 0: the output must be the dry signal, delayed by the reported latency. + envelope.params.insert("mix".into(), ParamValue::F32(0.)); + let encoded = serde_json::to_vec(&envelope).unwrap(); + let mut framed = (encoded.len() as u64).to_le_bytes().to_vec(); + framed.extend_from_slice(&encoded); + let mut bytes = Cursor::new(framed); + let stream = clap_istream { + ctx: &mut bytes as *mut Cursor> as *mut c_void, + read: Some(read), + }; + assert!(state.load.unwrap()(plugin, &stream)); + let restored: nih_plug::prelude::PluginState = + serde_json::from_slice(&save()[8..]).unwrap(); + assert_eq!( + serde_json::to_value(&restored.params).unwrap(), + serde_json::to_value(&envelope.params).unwrap() + ); + for rate in [44100., 48000., 96000.] { + assert!(p.activate.unwrap()(plugin, rate, 1, 512)); + let delay = (*latency).get.unwrap()(plugin) as usize; + // About 67 ms lookahead plus the oversampling filters. + assert!((delay as f64 / rate - 0.068).abs() < 0.01, "{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); + // A 1 kHz tone sits above the split and passes through 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/temper/ui/Cargo.toml b/plugins/temper/ui/Cargo.toml new file mode 100644 index 0000000..52f17d7 --- /dev/null +++ b/plugins/temper/ui/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "temper-ui" +version = "0.1.0" +edition.workspace = true +license.workspace = true + +[dependencies] +egui = "0.31.1" +temper-core = { path = "../core" } +common-ui = { path = "../../common/ui" } +common-dsp = { path = "../../common/dsp" } diff --git a/plugins/temper/ui/src/lib.rs b/plugins/temper/ui/src/lib.rs new file mode 100644 index 0000000..f13f2b0 --- /dev/null +++ b/plugins/temper/ui/src/lib.rs @@ -0,0 +1,413 @@ +//! Temper editor, shared by the CLAP wrapper and the headless renderer. +use common_dsp::db_to_gain; +use common_ui::*; +use egui::{self, Color32, FontId, Pos2, Rect, RichText, Sense, Stroke, Vec2}; +use temper_core::{AnalyzerFrame, Curve, Settings, Source, SHOWN}; + +pub use common_ui::style; +pub const WIDTH: u32 = 1040; +pub const HEIGHT: u32 = 650; + +pub struct State { + pub analyzer: AnalyzerFrame, + /// True while a pointer button is held, so knob drags become one host gesture. + pub gesture_active: bool, + pub help: String, +} +impl Default for State { + fn default() -> Self { + Self { + analyzer: AnalyzerFrame::default(), + gesture_active: false, + help: DEFAULT_HELP.into(), + } + } +} +const DEFAULT_HELP: &str = + "Every note is driven the same: the input level is normalised per note and the tone filters follow the pitch."; +impl State { + pub fn accept_frame(&mut self, frame: AnalyzerFrame) { + let old = self.analyzer; + self.analyzer = frame; + for k in 0..SHOWN { + self.analyzer.input[k] = frame.input[k].max(old.input[k] - 3.); + self.analyzer.output[k] = frame.output[k].max(old.output[k] - 3.); + } + self.analyzer.shaper_db = frame.shaper_db.max(old.shaper_db - 1.5); + } +} +fn hint(r: &egui::Response, state: &mut State, text: &str) { + if r.hovered() || r.has_focus() { + state.help = text.into(); + } +} +#[allow(clippy::too_many_arguments)] +fn knob( + ui: &mut egui::Ui, + state: &mut State, + name: &str, + value: &mut f32, + range: std::ops::RangeInclusive, + default: f32, + unit: &str, + size: f32, + help: &str, +) { + ui.vertical_centered(|ui| { + let r = rotary(ui, name, value, range, default, unit, size, ACCENT); + hint(&r, state, help); + }); +} + +const GRID: Color32 = Color32::from_rgb(24, 26, 30); +/// Input peak at which a normalised note reaches the shaper before Drive. +const NOMINAL: f32 = 0.35; + +fn transfer(ui: &mut egui::Ui, settings: &Settings, size: f32) { + let (rect, _) = ui.allocate_exact_size(Vec2::splat(size), Sense::hover()); + let p = ui.painter_at(rect); + p.rect_filled(rect, 2., SCREEN); + let c = rect.center(); + let half = rect.width() * 0.45; + for t in [-1., -0.5, 0.5, 1.] { + p.line_segment( + [ + Pos2::new(c.x + t * half, rect.top()), + Pos2::new(c.x + t * half, rect.bottom()), + ], + Stroke::new(1.0_f32, GRID), + ); + p.line_segment( + [ + Pos2::new(rect.left(), c.y - t * half), + Pos2::new(rect.right(), c.y - t * half), + ], + Stroke::new(1.0_f32, GRID), + ); + } + p.line_segment( + [Pos2::new(rect.left(), c.y), Pos2::new(rect.right(), c.y)], + Stroke::new(1.0_f32, EDGE), + ); + p.line_segment( + [Pos2::new(c.x, rect.top()), Pos2::new(c.x, rect.bottom())], + Stroke::new(1.0_f32, EDGE), + ); + p.line_segment( + [ + Pos2::new(c.x - half, c.y + half), + Pos2::new(c.x + half, c.y - half), + ], + Stroke::new(1.0_f32, DIM), + ); + // Input axis: a normalised note's peak at ±1; output: the shaper's ±1. + let gain = db_to_gain(settings.drive) * NOMINAL; + let bias = settings.bias * 0.008; + let offset = settings.curve.shape(bias); + let points: Vec = (0..=160) + .map(|i| { + let x = -1.1 + 2.2 * i as f32 / 160.; + let y = settings.curve.shape(x * gain + bias) - offset; + Pos2::new(c.x + x * half, c.y - y.clamp(-1.1, 1.1) * half) + }) + .collect(); + p.add(egui::Shape::line(points, Stroke::new(2.0_f32, ACCENT))); + p.text( + rect.left_top() + Vec2::new(8., 6.), + egui::Align2::LEFT_TOP, + "TRANSFER", + FontId::proportional(11.), + MUTED, + ); + p.rect_stroke( + rect, + 2., + Stroke::new(1.0_f32, EDGE), + egui::StrokeKind::Inside, + ); +} + +fn spectrum(ui: &mut egui::Ui, frame: &AnalyzerFrame, settings: &Settings, height: f32) { + let size = Vec2::new(ui.available_width(), height); + let (outer, response) = ui.allocate_exact_size(size, Sense::hover()); + let p = ui.painter_at(outer); + p.rect_filled(outer, 2., SCREEN); + let area = Rect::from_min_max( + outer.left_top() + Vec2::new(34., 24.), + outer.right_bottom() - Vec2::new(10., 24.), + ); + let floor = -72.; + let y = |db: f32| area.bottom() - area.height() * ((db - floor) / -floor).clamp(0., 1.); + for db in [0., -12., -24., -36., -48., -60.] { + let yy = y(db); + p.line_segment( + [Pos2::new(area.left(), yy), Pos2::new(area.right(), yy)], + Stroke::new(1.0_f32, GRID), + ); + p.text( + Pos2::new(outer.left() + 6., yy), + egui::Align2::LEFT_CENTER, + format!("{db:.0}"), + FontId::proportional(10.), + DIM, + ); + } + let col = area.width() / SHOWN as f32; + for k in 0..SHOWN { + let x0 = area.left() + col * k as f32; + for (i, (db, color)) in [(frame.input[k], STEEL), (frame.output[k], ACCENT)] + .into_iter() + .enumerate() + { + if db <= floor { + continue; + } + let w = col * 0.32; + let x = x0 + col * 0.16 + i as f32 * (w + col * 0.04); + p.rect_filled( + Rect::from_min_max(Pos2::new(x, y(db)), Pos2::new(x + w, area.bottom())), + 0., + color, + ); + } + let marked = (k + 1) as u32 == settings.push_harmonic && settings.push_gain != 0.; + p.text( + Pos2::new(x0 + col * 0.5, area.bottom() + 4.), + egui::Align2::CENTER_TOP, + format!("{}", k + 1), + FontId::proportional(10.), + if marked { ACCENT } else { MUTED }, + ); + } + // Tracked filter positions, in harmonic numbers. + let mark = |h: f32, label: &str| { + if h > 0. && h <= SHOWN as f32 + 0.5 { + let x = area.left() + col * (h - 0.5); + p.line_segment( + [Pos2::new(x, area.top()), Pos2::new(x, area.bottom())], + Stroke::new(1.0_f32, FOCUS), + ); + p.text( + Pos2::new(x + 4., area.top()), + egui::Align2::LEFT_TOP, + label, + FontId::proportional(10.), + FOCUS, + ); + } + }; + mark(settings.floor, "FLOOR"); + mark(settings.bright, "BRIGHT"); + p.text( + outer.left_top() + Vec2::new(34., 6.), + egui::Align2::LEFT_TOP, + "HARMONICS", + FontId::proportional(11.), + MUTED, + ); + p.text( + outer.right_top() + Vec2::new(-10., 6.), + egui::Align2::RIGHT_TOP, + "IN · OUT", + FontId::proportional(11.), + MUTED, + ); + p.rect_stroke( + outer, + 2., + Stroke::new(1.0_f32, EDGE), + egui::StrokeKind::Inside, + ); + let _ = response; +} + +pub fn show(ui: &mut egui::Ui, settings: &mut Settings, state: &mut State) { + backdrop(ui); + state.help = DEFAULT_HELP.into(); + state.gesture_active = ui.input(|i| i.pointer.any_down()); + ui.add_space(2.); + header(ui, "TEMPER", "TRACKED DISTORTION", |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; + } + let r = ui + .selectable_label(settings.auto_gain, RichText::new("AUTO GAIN").size(13.)) + .on_hover_text( + "Match output loudness to the input, so Drive changes character, not level.", + ); + if r.clicked() { + settings.auto_gain = !settings.auto_gain; + } + 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.); + let frame = state.analyzer; + ui.horizontal_top(|ui| { + panel(ui, |ui| { + ui.set_width(210.); + ui.set_min_height(TOP); + ui.vertical(|ui| note_panel(ui, settings, &frame)); + }); + ui.add_space(4.); + panel(ui, |ui| { + ui.set_min_height(TOP); + ui.vertical(|ui| { + transfer(ui, settings, 236.); + ui.add_space(4.); + ui.horizontal(|ui| { + for curve in Curve::ALL { + let r = ui.selectable_label( + settings.curve == curve, + RichText::new(curve.name().to_uppercase()).size(12.), + ); + if r.clicked() { + settings.curve = curve; + } + hint(&r, state, match curve { + Curve::Soft => "Soft: tanh. Smooth, odd harmonics, rounded top.", + Curve::Hard => "Hard: clipping with a narrow knee. Dense, square-like.", + Curve::Fold => "Fold: the wave folds back on itself. Drive moves the upper harmonics.", + Curve::Tube => "Tube: the negative half clips earlier. Adds even harmonics.", + }); + } + }); + }); + }); + ui.add_space(4.); + panel(ui, |ui| { + ui.set_width(ui.available_width()); + spectrum(ui, &frame, settings, TOP); + }); + }); + ui.add_space(6.); + panel(ui, |ui| { + ui.set_width(ui.available_width()); + ui.vertical(|ui| controls(ui, settings, state)); + }); + ui.separator(); + ui.label(RichText::new(&state.help).color(MUTED)); +} +const TOP: f32 = 290.; + +fn note_panel(ui: &mut egui::Ui, settings: &Settings, frame: &AnalyzerFrame) { + caption(ui, "NOTE"); + let (name, hz) = match frame.note { + Some(n) if frame.hz > 0. => (common_dsp::note_name(n), format!("{:.1} Hz", frame.hz)), + _ if frame.hz > 0. => ("—".into(), format!("holding {:.1} Hz", frame.hz)), + _ => ("—".into(), "no note yet".into()), + }; + ui.label( + RichText::new(name) + .font(FontId::new(54., egui::FontFamily::Name("medium".into()))) + .color(if frame.note.is_some() { TEXT } else { DIM }), + ); + ui.label(RichText::new(hz).monospace().size(14.).color(MUTED)); + ui.add_space(6.); + ui.label( + RichText::new(format!( + "{:.0} ms lookahead · {}", + frame.latency as f32 / frame.sample_rate * 1000., + match settings.source { + Source::Audio => "detecting pitch", + Source::Midi => "following MIDI", + } + )) + .size(12.) + .color(MUTED), + ); + ui.add_space(14.); + caption(ui, "INTO SHAPER"); + let (rect, _) = ui.allocate_exact_size(Vec2::new(180., 10.), Sense::hover()); + let p = ui.painter(); + p.rect_filled(rect, 1., SCREEN); + // −24..+24 dB around the curve's knee at 0 dB. + let t = ((frame.shaper_db + 24.) / 48.).clamp(0., 1.); + let mut fill = rect; + fill.set_width(rect.width() * t); + p.rect_filled(fill, 1., ACCENT); + let knee = rect.left() + rect.width() * 0.5; + p.line_segment( + [ + Pos2::new(knee, rect.top() - 2.), + Pos2::new(knee, rect.bottom() + 2.), + ], + Stroke::new(1.0_f32, TEXT), + ); + p.rect_stroke( + rect, + 1., + Stroke::new(1.0_f32, EDGE), + egui::StrokeKind::Inside, + ); + ui.label( + RichText::new(if frame.shaper_db < -60. { + "—".to_string() + } else { + format!("{:+.1} dB over the knee", frame.shaper_db) + }) + .monospace() + .size(12.) + .color(TEXT), + ); + ui.add_space(8.); + readout( + ui, + "NORMALIZE GAIN", + format!("{:+.1} dB", frame.normalize_db), + STEEL, + ); + readout( + ui, + "AUTO GAIN", + if settings.auto_gain { + format!("{:+.1} dB", frame.auto_db) + } else { + "off".into() + }, + STEEL, + ); +} + +fn controls(ui: &mut egui::Ui, settings: &mut Settings, state: &mut State) { + let d = Settings::default(); + ui.columns(10, |c| { + knob(&mut c[0], state, "Drive", &mut settings.drive, 0. ..=36., d.drive, " dB", 80., + "Gain into the curve. With Normalize at 100 % every note starts from the same level."); + knob(&mut c[1], state, "Bias", &mut settings.bias, 0. ..=100., d.bias, " %", 80., + "Shift the curve's operating point: asymmetric clipping, even harmonics."); + knob(&mut c[2], state, "Push", &mut settings.push_gain, -12. ..=12., d.push_gain, " dB", 80., + "Boost or cut one harmonic before the curve, so the distortion bites there on every note."); + knob(&mut c[3], state, "Mix", &mut settings.mix, 0. ..=100., d.mix, " %", 80., + "Blend with the delayed dry signal."); + let mut push = settings.push_harmonic as f32; + knob(&mut c[4], state, "Push at", &mut push, 1. ..=16., d.push_harmonic as f32, "", 54., + "Harmonic number that Push boosts or cuts."); + settings.push_harmonic = push.round().clamp(1., 16.) as u32; + knob(&mut c[5], state, "Floor", &mut settings.floor, 0. ..=2., d.floor, " ×f0", 54., + "Highpass before the curve at this multiple of the note. 0 is off. Keeps sub mud out of the distortion."); + if settings.floor < 0.25 { + settings.floor = 0.; + } + knob(&mut c[6], state, "Bright", &mut settings.bright, 0. ..=64., d.bright, " ×f0", 54., + "Lowpass after the curve at this harmonic. 0 is off. The top end stops at the same harmonic on every note."); + if settings.bright < 4. { + settings.bright = 0.; + } + knob(&mut c[7], state, "Normalize", &mut settings.normalize, 0. ..=100., d.normalize, " %", 54., + "How far each note's level is evened out before Drive. 100 %: quiet and loud patches distort the same."); + knob(&mut c[8], state, "Gate", &mut settings.gate, -60. ..=-20., d.gate, " dB", 54., + "Input level that counts as a note. Raise it if tails retrigger."); + knob(&mut c[9], state, "Output", &mut settings.output, -12. ..=12., d.output, " dB", 54., + "Output trim."); + }); +} diff --git a/tools/editor-check/Cargo.lock b/tools/editor-check/Cargo.lock index 059dd1b..ca570db 100644 --- a/tools/editor-check/Cargo.lock +++ b/tools/editor-check/Cargo.lock @@ -158,11 +158,15 @@ dependencies = [ "crucible-ui", "egui", "image", + "lathe-core", + "lathe-ui", "patina-core", "patina-ui", "rivet-app", "rivet-core", "rivet-midi", + "temper-core", + "temper-ui", ] [[package]] @@ -246,6 +250,24 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +[[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" @@ -574,6 +596,24 @@ dependencies = [ "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 = "transpose" version = "0.2.3" diff --git a/tools/editor-check/Cargo.toml b/tools/editor-check/Cargo.toml index ab0eeae..fb9cc68 100644 --- a/tools/editor-check/Cargo.toml +++ b/tools/editor-check/Cargo.toml @@ -19,3 +19,7 @@ anvil-ui = { path = "../../plugins/anvil/ui" } common-dsp = { path = "../../plugins/common/dsp" } crucible-core = { path = "../../plugins/crucible/core" } crucible-ui = { path = "../../plugins/crucible/ui" } +lathe-core = { path = "../../plugins/lathe/core" } +lathe-ui = { path = "../../plugins/lathe/ui" } +temper-core = { path = "../../plugins/temper/core" } +temper-ui = { path = "../../plugins/temper/ui" } diff --git a/tools/editor-check/src/main.rs b/tools/editor-check/src/main.rs index 94065dc..7a41eb6 100644 --- a/tools/editor-check/src/main.rs +++ b/tools/editor-check/src/main.rs @@ -10,15 +10,21 @@ fn main() { .find(|a| a[0] == "--plugin") .map(|a| a[1].as_str()) .unwrap_or("rivet"); - if !["rivet", "patina", "anvil", "crucible"].contains(&plugin) { - eprintln!("Use --plugin rivet, patina, anvil or crucible"); + if !["rivet", "patina", "anvil", "crucible", "lathe", "temper"].contains(&plugin) { + eprintln!("Use --plugin rivet, patina, anvil, crucible, lathe or temper"); std::process::exit(2); } let patina = plugin == "patina" || args.iter().any(|arg| arg == "--resonance"); let compact = std::env::args().any(|arg| arg == "--compact"); let anvil = plugin == "anvil"; let crucible = plugin == "crucible"; - let (width, height) = if crucible { + let lathe = plugin == "lathe"; + let temper = plugin == "temper"; + let (width, height) = if temper { + (temper_ui::WIDTH, temper_ui::HEIGHT) + } else if lathe { + (lathe_ui::WIDTH, lathe_ui::HEIGHT) + } else if crucible { (crucible_ui::WIDTH, crucible_ui::HEIGHT) } else if anvil { (anvil_ui::WIDTH, anvil_ui::HEIGHT) @@ -85,6 +91,54 @@ fn main() { } anvil_state.accept_frame(engine.take_analyzer()); } + let mut lathe_settings = lathe_core::Settings::default(); + let mut lathe_state = lathe_ui::State::default(); + if lathe { + // A growl-like map: cut the hollow region, lift the 5th, darker top. + lathe_settings.gains[1] = -4.; + lathe_settings.gains[2] = -12.; + lathe_settings.gains[4] = 6.; + lathe_settings.gains[6] = 3.; + lathe_settings.gains[10] = -8.; + lathe_settings.gains[11] = -8.; + lathe_settings.tilt = -1.5; + lathe_settings.between = -6.; + let mut engine = lathe_core::Engine::new(48000., 2).unwrap(); + engine.set_settings(lathe_settings).unwrap(); + let mut saw = common_dsp::Saw::new(48000., 43.65); + for i in 0..36000 { + let x = (saw.sample() * 1.6).tanh() * 0.4; + engine.process_sample([x, x]); + if i % 1600 == 0 { + lathe_state.accept_frame(engine.take_analyzer()); + } + } + lathe_state.accept_frame(engine.take_analyzer()); + } + let mut temper_settings = temper_core::Settings { + drive: 20., + curve: temper_core::Curve::Hard, + bias: 20., + floor: 0.5, + push_harmonic: 5, + push_gain: 6., + bright: 12., + ..Default::default() + }; + let mut temper_state = temper_ui::State::default(); + if temper { + let mut engine = temper_core::Engine::new(48000., 2).unwrap(); + engine.set_settings(temper_settings).unwrap(); + let mut saw = common_dsp::Saw::new(48000., 43.65); + for i in 0..36000 { + let x = saw.sample() * 0.3; + engine.process_sample([x, x]); + if i % 1600 == 0 { + temper_state.accept_frame(engine.take_analyzer()); + } + } + temper_state.accept_frame(engine.take_analyzer()); + } let mut crucible_settings = crucible_core::Settings { folder: "C:\\Users\\you\\Documents\\Crucible".into(), ..Default::default() @@ -173,7 +227,11 @@ fn main() { let session_motif = session.motifs[0].id; shared.replace(session).unwrap(); let ctx = egui::Context::default(); - if crucible { + if temper { + temper_ui::style(&ctx); + } else if lathe { + lathe_ui::style(&ctx); + } else if crucible { crucible_ui::style(&ctx); } else if anvil { anvil_ui::style(&ctx); @@ -202,7 +260,11 @@ fn main() { }, |ui| { egui::CentralPanel::default().show(ui, |ui| { - if crucible { + if temper { + temper_ui::show(ui, &mut temper_settings, &mut temper_state); + } else if lathe { + lathe_ui::show(ui, &mut lathe_settings, &mut lathe_state); + } else if crucible { crucible_ui::show( ui, &mut crucible_settings,