From 330ec5415005200af78837e3cb05caf0416bc5dd Mon Sep 17 00:00:00 2001 From: Nils Pukropp Date: Fri, 6 Nov 2026 14:02:58 +0100 Subject: [PATCH] feat(braze): add Braze tempo-locked beating Adds a detuned copy of the bass whose beating stays on the tempo grid on every note. The chosen harmonic k beats once per Rate note value, and harmonic n beats n/k times as fast, so every harmonic is on the grid. - The copy is read from a delay line whose delay falls one period of the tracked note per beat cycle (r = 1 + B/(k f0)) and jumps back exactly one period, crossfaded over 6 ms. On a periodic note the jump has no seam: the output matches the ideal sum within 0.003 on harmonics 1-4. - The delay follows the host's beat position, shifted by the lookahead, so beat peaks land on the grid; free-running when stopped. - Low cut: LR4 high-pass on the copy, the bass split by the same crossover, so the sub does not beat and keeps its level. - Depth, Width, Phase, Gate, Output, Snap, Bypass. Pitch from audio (about 67 ms lookahead) or MIDI. - Editor: one bar of the beat per harmonic with the grid and a playhead. - Catalog, workflows, editor-check, docs, signal chain and site copy. --- .gitea/workflows/check.yml | 4 +- .gitea/workflows/release.yml | 2 +- Cargo.lock | 19 + Cargo.toml | 2 +- README.md | 10 +- docs/braze/CHANGELOG.md | 18 + docs/braze/README.md | 77 + docs/braze/assets/editor.png | Bin 0 -> 307732 bytes docs/chain.md | 14 +- docs/development.md | 5 +- docs/ideas.md | 15 +- plugins/braze/core/Cargo.toml | 12 + plugins/braze/core/src/lib.rs | 356 ++++ plugins/braze/core/src/settings.rs | 146 ++ plugins/braze/core/tests/dsp.rs | 278 +++ plugins/braze/core/tests/realtime.rs | 79 + plugins/braze/plugin/Cargo.lock | 2381 ++++++++++++++++++++++++++ plugins/braze/plugin/Cargo.toml | 25 + plugins/braze/plugin/src/lib.rs | 193 +++ plugins/braze/plugin/src/params.rs | 219 +++ plugins/braze/plugin/tests/host.rs | 216 +++ plugins/braze/ui/Cargo.toml | 11 + plugins/braze/ui/src/lib.rs | 410 +++++ plugins/catalog.json | 17 + tools/editor-check/Cargo.lock | 20 + tools/editor-check/Cargo.toml | 2 + tools/editor-check/src/main.rs | 37 +- website/src/data/plugins.ts | 15 + 28 files changed, 4565 insertions(+), 18 deletions(-) create mode 100644 docs/braze/CHANGELOG.md create mode 100644 docs/braze/README.md create mode 100644 docs/braze/assets/editor.png create mode 100644 plugins/braze/core/Cargo.toml create mode 100644 plugins/braze/core/src/lib.rs create mode 100644 plugins/braze/core/src/settings.rs create mode 100644 plugins/braze/core/tests/dsp.rs create mode 100644 plugins/braze/core/tests/realtime.rs create mode 100644 plugins/braze/plugin/Cargo.lock create mode 100644 plugins/braze/plugin/Cargo.toml create mode 100644 plugins/braze/plugin/src/lib.rs create mode 100644 plugins/braze/plugin/src/params.rs create mode 100644 plugins/braze/plugin/tests/host.rs create mode 100644 plugins/braze/ui/Cargo.toml create mode 100644 plugins/braze/ui/src/lib.rs diff --git a/.gitea/workflows/check.yml b/.gitea/workflows/check.yml index 32e0234..7ad0da7 100644 --- a/.gitea/workflows/check.yml +++ b/.gitea/workflows/check.yml @@ -22,7 +22,7 @@ jobs: strategy: fail-fast: false matrix: - plugin: [rivet, patina, anvil, crucible, lathe, temper, weld, knurl, planish] + plugin: [rivet, patina, anvil, crucible, lathe, temper, weld, knurl, planish, braze] steps: - uses: https://github.com/actions/checkout@v4 with: @@ -63,6 +63,7 @@ jobs: cargo run --manifest-path tools/editor-check/Cargo.toml --locked -- target/editor/weld.png --plugin weld cargo run --manifest-path tools/editor-check/Cargo.toml --locked -- target/editor/knurl.png --plugin knurl cargo run --manifest-path tools/editor-check/Cargo.toml --locked -- target/editor/planish.png --plugin planish + cargo run --manifest-path tools/editor-check/Cargo.toml --locked -- target/editor/braze.png --plugin braze - uses: https://github.com/actions/upload-artifact@v3-node20 with: name: editor-previews @@ -95,6 +96,7 @@ jobs: python3 scripts/build-plugin.py --plugin weld --target x86_64-pc-windows-gnu python3 scripts/build-plugin.py --plugin knurl --target x86_64-pc-windows-gnu python3 scripts/build-plugin.py --plugin planish --target x86_64-pc-windows-gnu + python3 scripts/build-plugin.py --plugin braze --target x86_64-pc-windows-gnu python3 scripts/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 60e5c9a..e7714c9 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -1,7 +1,7 @@ name: Independent plugin release on: push: - tags: ["rivet-v*", "patina-v*", "anvil-v*", "crucible-v*", "lathe-v*", "temper-v*", "weld-v*", "knurl-v*", "planish-v*"] + tags: ["rivet-v*", "patina-v*", "anvil-v*", "crucible-v*", "lathe-v*", "temper-v*", "weld-v*", "knurl-v*", "planish-v*", "braze-v*"] permissions: contents: read diff --git a/Cargo.lock b/Cargo.lock index 6b8583d..7b11ef2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -61,6 +61,25 @@ version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" +[[package]] +name = "braze-core" +version = "0.1.0" +dependencies = [ + "common-dsp", + "serde", + "serde_json", +] + +[[package]] +name = "braze-ui" +version = "0.1.0" +dependencies = [ + "braze-core", + "common-dsp", + "common-ui", + "egui", +] + [[package]] name = "cfg-if" version = "1.0.5" diff --git a/Cargo.toml b/Cargo.toml index bb4a0fa..55bf3c6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] resolver = "2" -members = ["plugins/common/ui", "plugins/common/dsp", "plugins/anvil/core", "plugins/anvil/ui", "plugins/lathe/core", "plugins/lathe/ui", "plugins/temper/core", "plugins/temper/ui", "plugins/weld/core", "plugins/weld/ui", "plugins/knurl/core", "plugins/knurl/ui", "plugins/planish/core", "plugins/planish/ui", "plugins/crucible/core", "plugins/crucible/ui", "plugins/rivet/core", "plugins/rivet/midi", "plugins/rivet/preview", "plugins/rivet/app", "plugins/patina/core", "plugins/patina/render", "plugins/patina/ui"] +members = ["plugins/common/ui", "plugins/common/dsp", "plugins/anvil/core", "plugins/anvil/ui", "plugins/lathe/core", "plugins/lathe/ui", "plugins/temper/core", "plugins/temper/ui", "plugins/weld/core", "plugins/weld/ui", "plugins/knurl/core", "plugins/knurl/ui", "plugins/planish/core", "plugins/planish/ui", "plugins/braze/core", "plugins/braze/ui", "plugins/crucible/core", "plugins/crucible/ui", "plugins/rivet/core", "plugins/rivet/midi", "plugins/rivet/preview", "plugins/rivet/app", "plugins/patina/core", "plugins/patina/render", "plugins/patina/ui"] exclude = ["plugins/rivet/plugin", "tools/editor-check", "plugins/patina/plugin", "plugins/anvil/plugin", "plugins/crucible/plugin", "plugins/lathe/plugin", "plugins/temper/plugin", "plugins/weld/plugin", "plugins/knurl/plugin", "plugins/planish/plugin"] [workspace.package] diff --git a/README.md b/README.md index 6ba78ee..f33cd69 100644 --- a/README.md +++ b/README.md @@ -29,9 +29,10 @@ note. Each plugin is a separate product with its own version, guide and release. | **[Weld](docs/weld/README.md)** | Phase-aligns one bass layer to another layer through the sidechain, so the layers sum in the mids instead of cancelling | One layer's track, other layer as sidechain | none | [Guide](docs/weld/README.md) · [Changes](docs/weld/CHANGELOG.md) | | **[Knurl](docs/knurl/README.md)** | Gives every cycle of the note its own level, timing and grit: in-tune subharmonic growl, rattle and fry on every note | Bass | ≈ 71 ms | [Guide](docs/knurl/README.md) · [Changes](docs/knurl/CHANGELOG.md) | | **[Planish](docs/planish/README.md)** | Upward and downward compression (OTT) in bands set by harmonic number: band 2 holds harmonics 2–4 on every note | Bass | ≈ 67 ms | [Guide](docs/planish/README.md) · [Changes](docs/planish/CHANGELOG.md) | +| **[Braze](docs/braze/README.md)** | Adds a detuned copy whose beating stays on the tempo grid on every note: reese movement in time | Bass | ≈ 67 ms | [Guide](docs/braze/README.md) · [Changes](docs/braze/CHANGELOG.md) | Plugins with latency report it to the host, so FL Studio compensates the delay. -Anvil, Lathe, Temper, Knurl and Planish detect pitch from the audio. They can also take the +Anvil, Lathe, Temper, Knurl, Planish and Braze detect pitch from the audio. They can also take the pitch from MIDI. The order of the plugins matters: see [Signal chain](docs/chain.md). The names come from metalwork: a **rivet** joins pieces; **patina** changes a @@ -40,7 +41,7 @@ is struck on; a **crucible** melts material down to be cast again; a **lathe** turns a piece so each cut lands the same all the way round; **tempering** sets how hard and how tough a metal ends up; a **weld** fuses two pieces into one; **knurling** presses a ridged grip pattern into a surface; **planishing** -hammers a surface smooth and even. +hammers a surface smooth and even; **brazing** joins two metals with a filler. The suite is the **foundry**: the workshop where the bass gets cast, shaped and finished. Hosts list the plugins under the vendor name *Bass Foundry*. @@ -65,7 +66,7 @@ finished. Hosts list the plugins under the vendor name *Bass Foundry*. Planish editor
Planish: harmonic OTT - + Braze editor
Braze: tempo-locked beating @@ -125,7 +126,7 @@ cargo run --manifest-path tools/editor-check/Cargo.toml -- target/editor/lathe.p ``` Plugin names for the scripts are `rivet`, `patina`, `anvil`, `crucible`, -`lathe`, `temper`, `weld`, `knurl` and `planish`. Builds go to `dist//.clap`. No +`lathe`, `temper`, `weld`, `knurl`, `planish` and `braze`. Builds go to `dist//.clap`. No script installs anything into a DAW. [Development and testing](docs/development.md) has the full command list. @@ -164,6 +165,7 @@ plugins/ weld/ core · ui · plugin knurl/ core · ui · plugin planish/ core · ui · plugin + braze/ core · ui · plugin common/ ui/ Shared look: palette, embedded fonts, knobs, panels, meters dsp/ Shared filters, pitch tracking, oversampling, meters, WAV files diff --git a/docs/braze/CHANGELOG.md b/docs/braze/CHANGELOG.md new file mode 100644 index 0000000..ce538ee --- /dev/null +++ b/docs/braze/CHANGELOG.md @@ -0,0 +1,18 @@ +# Braze changelog + +## Unreleased (0.1.0) + +- Introduce Braze, a detuned copy of the bass whose beating stays on the tempo + grid on every note. +- The chosen harmonic (1–8) beats once per Rate note value (1/1 to 1/32, and + triplets); harmonic n beats n/harmonic times as fast, so every harmonic beats + on the grid. The beat peaks land on the host's beat position. +- The detune follows the tracked note. The copy jumps by exactly one period of + the note, so the jumps are seamless on a steady note. +- Low cut keeps the copy out of the sub, so the sub neither beats nor changes + level. +- Depth, Width (right channel's beat against the left), Phase, Gate, Output, + Snap to semitone, Bypass. +- Detect pitch and note starts from the audio with about 67 ms of latency, or + follow MIDI notes sent to the effect. +- Editor: one bar of the beat per harmonic with the grid and a playhead. diff --git a/docs/braze/README.md b/docs/braze/README.md new file mode 100644 index 0000000..bb6857b --- /dev/null +++ b/docs/braze/README.md @@ -0,0 +1,77 @@ +# Braze + +Braze makes a reese's movement play in time. Current version **0.1.0** +(unreleased). + +Two layers detuned against each other beat: harmonic k of a note at f0 swells +and fades k·f0·(r − 1) times per second, where r is the detune ratio. With a +fixed detune that rate changes with every note, so the movement of a reese +never lines up with the track. Braze adds a detuned copy of the bass and sets +its detune on every note so that the beating follows the tempo. + +![Braze](assets/editor.png) + +## Install on Windows + +Copy `Braze.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 Braze in the mixer slot of the bass. Keep the font license with +redistributed packages. + +## Work with it + +1. Put Braze on a single bass layer: a plain saw, or a reese whose own detune + you have turned down. +2. Pick **Rate**: the note value one beat lasts. 1/8 at 140 BPM is 4.67 beats + per second. +3. Pick the **harmonic** that should beat at Rate. Harmonic n beats + n/harmonic times as fast, so all of them beat on the grid: with harmonic 4 at + 1/8, harmonic 2 beats in quarters, harmonic 8 in sixteenths, harmonic 3 in + quarter triplets. +4. Set **Depth**. At 100 % the beating goes down to full nulls; 50–70 % keeps + the note present. +5. Use **Phase** to move where the beat peaks. At 0° all harmonics peak + together on every beat of the chosen harmonic's cycle. + +The display shows one bar: a row per harmonic with the level it gets from the +beating, the grid at Rate, and the playhead. + +Other controls: + +- **Low cut** removes the copy below a frequency, so the sub does not beat. + The sub keeps its level. Harmonics under the cut show *cut* in the display. + Under 20 Hz the cut is off. If the chosen harmonic is under the cut on a + note, it does not beat: the note panel says so; pick a higher harmonic. +- **Width** moves the right channel's beat against the left, up to half a + cycle. At 100 % one side peaks while the other nulls. Check the mono sum. +- **Gate** is the input level that counts as a note. +- **Snap to semitone** rounds the detected pitch. Leave it off on detuned or + bent notes: the copy jumps by one period of the pitch in use. + +### How the detune is made + +The copy is the bass read from a delay line. Its delay falls by one period of +the note per beat cycle of the chosen harmonic, which tunes the copy up by +exactly r = 1 + B/(k·f0) (B: beats per second, k: the chosen harmonic). When it +has fallen a whole period, it jumps back by one period: on a steady note both +read positions hold the same waveform, so the jump is crossfaded over 6 ms +without a seam. At a beat peak the copy lines up with the bass sample for +sample. + +The low detune that low notes need is large: harmonic 1 at 1/8 and 140 BPM on +F1 (43.7 Hz) is r = 1.107, about 1.8 semitones. Higher harmonics need less: +harmonic 4 asks for about 45 cents on F1. + +## Timing and limits + +Detection uses about 67 ms of lookahead, reported to the host for delay +compensation. Pitch range is 30–500 Hz, one voice. The beat position comes from +the host while it plays, shifted by the lookahead so the beat stays on the +timeline. When the host is stopped, the beat runs on freely at the last tempo. + +Noise, chords and the attack of a note are not periodic, so the copy's jumps +are heard there as a short blur. Before the first note, the copy assumes 55 Hz. + +Braze changes the waveform in time, so pitch detection after it can be less +sure: put tracked plugins before Braze, or use MIDI. See +[Signal chain](../chain.md). diff --git a/docs/braze/assets/editor.png b/docs/braze/assets/editor.png new file mode 100644 index 0000000000000000000000000000000000000000..50d0a2e405239388fc91ba6ae659c66c39b6c8a2 GIT binary patch literal 307732 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. Builds tagged before this scheme used `io.storyboard.*` IDs; hosts treat the new IDs as different diff --git a/docs/ideas.md b/docs/ideas.md index 38fa102..73a6f1a 100644 --- a/docs/ideas.md +++ b/docs/ideas.md @@ -263,7 +263,8 @@ one period of the note, so heavy settings do not ripple at f0. See [Planish](pla - In parallel, from the research findings, in this order: Weld delay spread (done, unreleased); the fatness lane, as the first Assay piece (prototype `scripts/fatness.py`); Anvil Ghost harmonics and Phone listen - (done, unreleased); Braze; Anvil Kick lock with offset audition. + (done, unreleased); Braze (done, unreleased); Anvil Kick lock with offset + audition. 4. Forge, when enough modules exist. 5. Assay, one plugin for the display-only ideas. 6. Texture plugins (Anneal, Swarf, Etch, Bellows) and the note-keyed sequencer. @@ -296,6 +297,18 @@ beats at the same rate. Controls: rate (synced), target harmonic, depth, spread across harmonics, mode. It reuses the tracker, and Weld should not "fix" this beating: put Weld before Braze. +Built (unreleased 0.1.0, see [Braze](braze/README.md)). The detune is a delay +line whose delay falls one period per beat cycle and jumps back one period, +which is seamless on a periodic note, and the delay follows the host's beat +position, so the peaks land on the grid. Harmonic n then beats at n/k · B: every +harmonic is on the grid, so the planned spread control was not needed. A Low +cut (LR4 on the copy, the bass split by the same crossover) keeps the sub out. +Open: the frequency-shift mode. Mixed with the dry bass, a plain single-sideband +shift gives every harmonic the same envelope at the same moment, which is +tremolo; it needs a dispersive allpass on the copy to stagger the harmonics +before it sounds like movement. Also open: a listening check on a real reese, +and how Weld reads a layer after Braze. + ### Arc — self-FM growl (research spike) An arc welds with a sustained spark. Arc runs loopback FM (Smyth, DAFx 2026) diff --git a/plugins/braze/core/Cargo.toml b/plugins/braze/core/Cargo.toml new file mode 100644 index 0000000..267c9e6 --- /dev/null +++ b/plugins/braze/core/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "braze-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/braze/core/src/lib.rs b/plugins/braze/core/src/lib.rs new file mode 100644 index 0000000..bb0c29e --- /dev/null +++ b/plugins/braze/core/src/lib.rs @@ -0,0 +1,356 @@ +//! Tempo-locked beating: adds a detuned copy of the bass whose beating stays in time with +//! the track on every note. +//! +//! Two layers detuned by a ratio r beat at k·f0·(r − 1) on harmonic k, so a fixed detune +//! beats at a different rate on every note. Braze sets the detune per note from the tracked +//! fundamental: harmonic `harmonic` beats once per `rate` note value, and harmonic n beats +//! n/harmonic times as fast, so every harmonic beats on the tempo grid. +//! +//! The copy is the bass read from a delay line whose delay falls by one period of the note +//! per beat cycle of the chosen harmonic. That shifts the copy up by exactly the wanted +//! ratio. When the delay has fallen by a whole period it jumps back by one period: for a +//! periodic note both read positions hold the same waveform, so the jump is crossfaded over +//! a few milliseconds without a seam. The delay is set from the host's beat position, so +//! the beat's peaks land on the grid, not just at the right rate. At a beat peak the copy +//! lines up with the bass exactly. +//! +//! Low cut removes the copy below a frequency with a 4th-order Linkwitz–Riley high-pass, +//! so the sub does not beat. The bass is split by the same crossover; its two bands are in +//! phase with the copy's high-pass at every frequency, so the beat peaks stay on the grid, +//! and the loudness correction for the copy applies above the cut only, so the sub keeps +//! its level. +mod settings; +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::{Rate, Settings, Source, HARMONIC_MAX, LOW_CUT_MAX, LOW_CUT_OFF}; + +pub const MIN_HZ: f32 = TrackerConfig::BASS.min_hz; +pub const MAX_HZ: f32 = TrackerConfig::BASS.max_hz; +/// Fundamental the copy assumes before the first note. +pub const FALLBACK_HZ: f32 = 55.; +/// Tempo when the host reports none. +pub const DEFAULT_TEMPO: f64 = 120.; +/// Crossfade between the old and the new read position. +const FADE_MS: f32 = 6.; +/// A beat position that moves further than this (in cycles of the chosen harmonic) from +/// one sample to the next counts as a jump: a locate, a loop, or a changed control. +const JUMP: f64 = 1e-3; +/// Pitch smoothing for bends and slides. +const PITCH_MS: f32 = 5.; + +#[derive(Clone, Copy, Debug)] +pub struct AnalyzerFrame { + /// Fundamental the copy is tuned to, 0 before the first note. + pub hz: f32, + /// Sounding note, rounded; None between notes. + pub note: Option, + /// Beat position at the output, in quarter notes. + pub beats: f64, + pub tempo: f64, + /// True when the beat position comes from the host's transport. + pub synced: bool, + /// Detune of the copy as a ratio, 1 before the first note. + pub ratio: f32, + pub latency: u32, + pub sample_rate: f32, +} +impl Default for AnalyzerFrame { + fn default() -> Self { + Self { + hz: 0., + note: None, + beats: 0., + tempo: DEFAULT_TEMPO, + synced: false, + ratio: 1., + latency: 0, + sample_rate: 48000., + } + } +} + +/// Beat cycles of the chosen harmonic at `beats` quarter notes, for one channel. +pub fn cycles(s: &Settings, beats: f64, channel: usize) -> f64 { + beats / s.rate.quarters() + s.phase as f64 / 360. + channel as f64 * s.width as f64 * 0.005 +} +/// Level of harmonic `n` in the sum, against the bass alone, at `cycles` of the chosen +/// harmonic, with the copy at `depth` (0–1). Includes the output's loudness correction. +pub fn envelope(s: &Settings, n: u32, cycles: f64, depth: f32) -> f32 { + let theta = std::f64::consts::TAU * n as f64 / s.harmonic as f64 * cycles; + let (re, im) = (1. + depth as f64 * theta.cos(), depth as f64 * theta.sin()); + ((re * re + im * im).sqrt() / (1. + depth as f64 * depth as f64).sqrt()) as f32 +} + +#[derive(Clone, Copy, Debug, Default)] +struct Tap { + /// Delay in samples. + delay: f32, + /// Delay change per sample, so a fading tap keeps its course. + slope: f32, +} + +#[derive(Clone, Copy, Debug, Default)] +struct Channel { + active: Tap, + old: Tap, + /// Weight of the old tap, falling to 0. + fade: f32, + /// Whole cycles the active tap's delay is counted from. + whole: f64, + /// Beat cycle position (`cycles / harmonic + 0.5`) of the previous sample. + last: f64, + started: bool, + copy_high: [Svf; 2], + high: [Svf; 2], + low: [Svf; 2], +} + +pub struct Engine { + rate: f32, + channels: usize, + settings: Settings, + latency: usize, + audio: Vec<[f32; 2]>, + audio_at: usize, + tracker: Tracker, + pitch: PitchFollower, + pitch_coef: f32, + hz: f32, + beats: f64, + tempo: f64, + synced: bool, + state: [Channel; 2], + /// High-pass and low-pass of the low cut's crossover; None when off. + low_cut: Option<(SvfCoef, SvfCoef)>, + fade_step: f32, + smooth: f32, + depth: f32, + output: f32, + bypass: f32, + 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(); + // The copy reads up to half a period (plus a fade) on either side of the dry path. + let reach = (rate / MIN_HZ).ceil() as usize + 8; + let mut e = Self { + rate, + channels, + settings: Settings::default(), + latency, + audio: vec![[0.; 2]; latency + reach], + audio_at: 0, + tracker, + pitch: PitchFollower::default(), + pitch_coef: coefficient(rate, PITCH_MS), + hz: 0., + beats: 0., + tempo: DEFAULT_TEMPO, + synced: false, + state: [Channel::default(); 2], + low_cut: None, + fade_step: 1. / (rate * FADE_MS * 0.001), + smooth: coefficient(rate, 10.), + depth: 0., + output: 1., + bypass: 0., + fresh: true, + }; + e.set_settings(Settings::default())?; + 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, true); + if s.low_cut != self.settings.low_cut || self.fresh { + let q = std::f32::consts::FRAC_1_SQRT_2; + let hz = s.low_cut.min(0.45 * self.rate); + self.low_cut = (s.low_cut >= LOW_CUT_OFF).then(|| { + ( + SvfCoef::highpass(self.rate, hz, q), + SvfCoef::lowpass(self.rate, hz, q), + ) + }); + } + self.settings = s; + if std::mem::take(&mut self.fresh) { + self.depth = s.depth * 0.01; + self.output = db_to_gain(s.output); + self.bypass = f32::from(s.bypass); + } + Ok(()) + } + /// Tempo and, while the host plays, its beat position in quarter notes at the first + /// input sample of the next block. Without a position the beat runs on freely. + pub fn set_transport(&mut self, tempo: Option, position: Option) { + self.tempo = tempo + .filter(|t| t.is_finite() && *t > 0.) + .unwrap_or(DEFAULT_TEMPO) + .clamp(20., 999.); + match position.filter(|p| p.is_finite()) { + Some(p) => { + // The output lags the input by the lookahead, and the host compensates it: + // what leaves now belongs `latency` samples earlier on the timeline. + self.beats = p - self.latency as f64 / self.rate as f64 * self.tempo / 60.; + self.synced = true; + } + None => self.synced = false, + } + } + pub fn reset(&mut self) { + self.audio.fill([0.; 2]); + self.tracker.reset(); + self.pitch = PitchFollower::default(); + self.hz = 0.; + self.state = [Channel::default(); 2]; + 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); + } + /// The audio `back` samples (fractional) before the newest one, cubic Hermite. + #[inline] + fn read(&self, back: f32, c: usize) -> f32 { + let len = self.audio.len(); + let back = back.clamp(1., (len - 3) as f32); + let whole = back.floor(); + let t = back - whole; + let base = whole as usize; + let at = |back: usize| self.audio[(self.audio_at + len - back) % len][c]; + // y0 is one sample newer than y1; y2 and y3 are older. + let (y0, y1, y2, y3) = (at(base - 1), at(base), at(base + 1), at(base + 2)); + let c1 = 0.5 * (y2 - y0); + let c2 = y0 - 2.5 * y1 + 2. * y2 - 0.5 * y3; + let c3 = 0.5 * (y3 - y0) + 1.5 * (y1 - y2); + ((c3 * t + c2) * t + c1) * t + y1 + } + // Channels index the input, the state and the output at once. + #[allow(clippy::needless_range_loop)] + 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 (hz, jump) = self.pitch.step(self.pitch_coef); + self.hz = hz; + let len = self.audio.len(); + self.audio_at = (self.audio_at + 1) % len; + self.audio[self.audio_at] = x; + + let s = self.settings; + approach(&mut self.depth, s.depth * 0.01, self.smooth); + approach(&mut self.output, db_to_gain(s.output), self.smooth); + approach(&mut self.bypass, f32::from(s.bypass), self.smooth); + + let period = self.rate / if hz > 0. { hz } else { FALLBACK_HZ }; + let step = self.tempo / 60. / self.rate as f64 / s.rate.quarters() / s.harmonic as f64; + let centre = self.latency as f32; + let mut out = [0.; 2]; + for c in 0..self.channels { + // Position in beat cycles of the chosen harmonic, shifted so a cycle starts at + // the delay's highest point and the beat peaks (delay = centre) at cycle 0. + let u = cycles(&s, self.beats, c) / s.harmonic as f64 + 0.5; + let ch = self.state[c]; + let moved = (u - ch.last - step).abs() > JUMP; + let mut ch = ch; + if !ch.started || jump || moved || u.floor() != ch.whole { + if ch.started { + ch.old = ch.active; + ch.fade = 1.; + } + ch.whole = u.floor(); + ch.started = true; + } + let delay = centre + period * (0.5 - (u - ch.whole) as f32); + ch.active.slope = if ch.fade == 1. { + 0. + } else { + delay - ch.active.delay + }; + ch.active.delay = delay; + ch.last = u; + let mut copy = self.read(ch.active.delay, c); + if ch.fade > 0. { + ch.old.delay += ch.old.slope; + let w = ch.fade * ch.fade * (3. - 2. * ch.fade); + copy += (self.read(ch.old.delay, c) - copy) * w; + ch.fade = (ch.fade - self.fade_step).max(0.); + } + let delayed = self.audio[(self.audio_at + len - self.latency) % len][c]; + let g = self.depth; + let norm = 1. / (1. + g * g).sqrt(); + let wet = match &self.low_cut { + Some((high, low)) => { + let lr4 = |f: &mut [Svf; 2], c: &SvfCoef, x: f32| { + let first = f[0].process(c, x); + f[1].process(c, first) + }; + let copy = lr4(&mut ch.copy_high, high, copy); + let above = lr4(&mut ch.high, high, delayed); + let below = lr4(&mut ch.low, low, delayed); + below + (above + g * copy) * norm + } + None => (delayed + g * copy) * norm, + }; + self.state[c] = ch; + out[c] = wet * self.output * (1. - self.bypass) + delayed * self.bypass; + } + self.beats += self.tempo / 60. / self.rate as f64; + out + } + pub fn take_analyzer(&self) -> AnalyzerFrame { + let s = self.settings; + let hz = self.hz; + let mut f = AnalyzerFrame { + hz, + beats: self.beats, + tempo: self.tempo, + synced: self.synced, + latency: self.latency as u32, + sample_rate: self.rate, + ..AnalyzerFrame::default() + }; + if hz > 0. { + let beat_hz = self.tempo / 60. / s.rate.quarters(); + f.ratio = 1. + (beat_hz / (s.harmonic as f64 * hz as f64)) as f32; + } + if self.tracker.sounding() && hz > 0. { + f.note = Some(hz_to_midi(hz).round().clamp(0., 127.) as u8); + } + f + } +} + +/// One-pole step that lands exactly on the target, so switched states end bit-exact. +fn approach(value: &mut f32, target: f32, coef: f32) { + *value += (target - *value) * coef; + if (target - *value).abs() < 1e-6 { + *value = target; + } +} diff --git a/plugins/braze/core/src/settings.rs b/plugins/braze/core/src/settings.rs new file mode 100644 index 0000000..ee12c0d --- /dev/null +++ b/plugins/braze/core/src/settings.rs @@ -0,0 +1,146 @@ +//! Host-independent controls. Levels in dB, amounts in percent, angles in degrees. +use serde::{Deserialize, Serialize}; + +/// Highest harmonic the beat rate can be set on. +pub const HARMONIC_MAX: u32 = 8; +pub const LOW_CUT_MAX: f32 = 400.; +/// A low cut below this is off: no filter on either path. +pub const LOW_CUT_OFF: f32 = 20.; + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)] +pub enum Source { + /// Pitch and note starts are detected from the incoming bass. + #[default] + Audio, + /// Notes come from MIDI note input. + Midi, +} + +/// One beat cycle lasts this note value. +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)] +pub enum Rate { + Whole, + Half, + Quarter, + #[default] + Eighth, + Sixteenth, + ThirtySecond, + QuarterTriplet, + EighthTriplet, + SixteenthTriplet, +} +impl Rate { + pub const ALL: [Rate; 9] = [ + Rate::Whole, + Rate::Half, + Rate::Quarter, + Rate::Eighth, + Rate::Sixteenth, + Rate::ThirtySecond, + Rate::QuarterTriplet, + Rate::EighthTriplet, + Rate::SixteenthTriplet, + ]; + /// Length of one beat cycle in quarter notes. + pub fn quarters(self) -> f64 { + match self { + Rate::Whole => 4., + Rate::Half => 2., + Rate::Quarter => 1., + Rate::Eighth => 0.5, + Rate::Sixteenth => 0.25, + Rate::ThirtySecond => 0.125, + Rate::QuarterTriplet => 2. / 3., + Rate::EighthTriplet => 1. / 3., + Rate::SixteenthTriplet => 1. / 6., + } + } + pub fn label(self) -> &'static str { + match self { + Rate::Whole => "1/1", + Rate::Half => "1/2", + Rate::Quarter => "1/4", + Rate::Eighth => "1/8", + Rate::Sixteenth => "1/16", + Rate::ThirtySecond => "1/32", + Rate::QuarterTriplet => "1/4T", + Rate::EighthTriplet => "1/8T", + Rate::SixteenthTriplet => "1/16T", + } + } +} + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)] +#[serde(deny_unknown_fields)] +pub struct Settings { + pub source: Source, + /// How long one beat cycle of `harmonic` lasts. + pub rate: Rate, + /// The harmonic that beats exactly at `rate`. Harmonic n beats n/harmonic times as fast. + pub harmonic: u32, + /// Level of the detuned copy against the bass. 100 % gives full nulls. + pub depth: f32, + /// Below this frequency the copy is removed, so the sub stays steady and mono-safe. + /// Under `LOW_CUT_OFF` Hz the filter is off. + pub low_cut: f32, + /// Moves the right channel's beat against the left, up to half a cycle. + pub width: f32, + /// Where in the cycle the beat peaks, in degrees. 0 puts the peak on the beat. + pub phase: f32, + /// Detection threshold in dBFS for note starts (Audio source). + pub gate: f32, + /// Round detected pitch to the nearest semitone. Off by default: the copy jumps by one + /// period of the pitch in use, and a period that does not fit the note is heard. + pub snap: bool, + pub output: f32, + pub bypass: bool, +} +impl Default for Settings { + fn default() -> Self { + Self { + source: Source::Audio, + rate: Rate::Eighth, + // Harmonic 4 sits above the low cut on every bass note, and on F1 it asks for + // about 45 cents of detune, a usual reese spread. + harmonic: 4, + depth: 70., + low_cut: 100., + width: 0., + phase: 0., + gate: -48., + snap: false, + output: 0., + bypass: false, + } + } +} +impl Settings { + pub fn validate(&self) -> Result<(), &'static str> { + let finite = [ + self.depth, + self.low_cut, + self.width, + self.phase, + self.gate, + self.output, + ] + .iter() + .all(|v| v.is_finite()); + if !finite { + return Err("non-finite setting"); + } + let ok = (1..=HARMONIC_MAX).contains(&self.harmonic) + && (0.0..=100.).contains(&self.depth) + && (0.0..=LOW_CUT_MAX).contains(&self.low_cut) + && (0.0..=100.).contains(&self.width) + && (0.0..=360.).contains(&self.phase) + && (-60.0..=-20.).contains(&self.gate) + && (-12.0..=12.).contains(&self.output); + if ok { + Ok(()) + } else { + Err("setting out of range") + } + } +} diff --git a/plugins/braze/core/tests/dsp.rs b/plugins/braze/core/tests/dsp.rs new file mode 100644 index 0000000..ce2a0a9 --- /dev/null +++ b/plugins/braze/core/tests/dsp.rs @@ -0,0 +1,278 @@ +// Sample indices address several signals at once. +#![allow(clippy::needless_range_loop)] +use braze_core::{cycles, envelope, Engine, Rate, Settings}; +use common_dsp::Saw; +use std::f32::consts::TAU; + +const RATE: f32 = 48000.; +const TEMPO: f64 = 120.; + +fn engine(s: Settings) -> (Engine, usize) { + let mut e = Engine::new(RATE, 2).unwrap(); + e.set_settings(s).unwrap(); + e.set_transport(Some(TEMPO), Some(0.)); + let l = e.latency_samples() as usize; + (e, l) +} +fn seconds(t: f32) -> usize { + (t * RATE) as usize +} +fn render(e: &mut Engine, x: &[f32]) -> Vec<[f32; 2]> { + x.iter().map(|&s| e.process_sample([s, s])).collect() +} +/// A saw at `hz` from 0.05 s on, with a 1 ms fade-in. +fn saw(hz: f32, total: f32) -> Vec { + let mut osc = Saw::new(RATE, hz); + (0..seconds(total)) + .map(|i| { + let start = seconds(0.05); + if i < start { + return 0.; + } + 0.5 * osc.sample() * ((i - start) as f32 / seconds(0.001) as f32).min(1.) + }) + .collect() +} +/// Amplitude of harmonic `n` of `hz` over one period centred on sample `at`. +fn harmonic(x: &[f32], at: usize, hz: f32, n: u32) -> f32 { + let half = (RATE / hz / 2.).round() as usize; + let w = TAU * hz * n as f32 / RATE; + let (mut re, mut im) = (0f32, 0f32); + for i in at - half..at + half { + re += x[i] * (w * i as f32).cos(); + im -= x[i] * (w * i as f32).sin(); + } + 2. * (re * re + im * im).sqrt() / (2 * half) as f32 +} +/// Beat position (quarter notes) of output sample `i`. +fn beats(i: usize, latency: usize) -> f64 { + (i as f64 - latency as f64) / RATE as f64 * TEMPO / 60. +} + +/// Harmonics 1–4 of A1 at falling levels, a periodic note the tracker reads exactly. +fn partials(t: f64) -> f64 { + (1..=4) + .map(|n| 0.4 / n as f64 * (std::f64::consts::TAU * 55. * n as f64 * t).sin()) + .sum() +} + +#[test] +fn every_harmonic_beats_on_the_tempo_grid() { + for (harmonic, rate) in [(1, Rate::Eighth), (2, Rate::Sixteenth), (3, Rate::Quarter)] { + let s = Settings { + harmonic, + rate, + depth: 100., + snap: true, + low_cut: 0., + ..Settings::default() + }; + let (mut e, l) = engine(s); + let x: Vec = (0..seconds(1.5)) + .map(|i| partials(i as f64 / RATE as f64) as f32) + .collect(); + let y = render(&mut e, &x); + let mut worst = 0f32; + for i in seconds(0.5)..seconds(1.4) { + // Cycles of the chosen harmonic, from the grid alone: peaks on every multiple + // of `rate`. The copy lags the bass by (0.5 − frac(u)) periods. + let u = beats(i, l) / rate.quarters() / harmonic as f64 + 0.5; + let t = (i - l) as f64 / RATE as f64; + let lag = (0.5 - u.fract()) / 55.; + let ideal = (partials(t) + partials(t - lag)) / 2f64.sqrt(); + worst = worst.max((y[i][0] - ideal as f32).abs()); + } + assert!(worst < 3e-3, "harmonic {harmonic}, {rate:?}: {worst}"); + } +} + +#[test] +fn envelope_peaks_on_the_grid_and_harmonic_n_beats_n_over_k_as_fast() { + let s = Settings { + harmonic: 2, + ..Settings::default() + }; + // At cycle 0 every harmonic peaks: twice the bass, less the loudness correction. + for n in 1..=8 { + assert!((envelope(&s, n, 0., 1.) - 2f32.sqrt()).abs() < 1e-5); + } + // Harmonic 2 nulls half a cycle later; harmonic 1, beating half as fast, a cycle later. + assert!(envelope(&s, 2, 0.5, 1.) < 1e-5); + assert!(envelope(&s, 1, 1., 1.) < 1e-5); + assert!(envelope(&s, 4, 0.25, 1.) < 1e-5); +} + +#[test] +fn the_copy_is_seamless_across_its_jumps() { + // A pure sine at exactly A1: the ideal copy is a smooth sine whose phase follows the beat. + let s = Settings { + harmonic: 1, + rate: Rate::Sixteenth, + depth: 100., + snap: true, + low_cut: 0., + ..Settings::default() + }; + let (mut e, l) = engine(s); + let x: Vec = (0..seconds(1.5)) + .map(|i| 0.5 * (TAU * 55. * i as f32 / RATE).sin()) + .collect(); + let y = render(&mut e, &x); + let mut worst = 0f32; + for i in seconds(0.5)..seconds(1.4) { + let u = cycles(&s, beats(i, l), 0) + 0.5; + let dry = x[i - l]; + let phase = TAU as f64 * (55. * (i - l) as f64 / RATE as f64 + u.fract()); + let copy = -0.5 * phase.sin() as f32; + let ideal = (dry + copy) / 2f32.sqrt(); + worst = worst.max((y[i][0] - ideal).abs()); + } + assert!(worst < 2e-3, "{worst}"); +} + +#[test] +fn depth_zero_is_the_delayed_input() { + let (mut e, l) = engine(Settings { + depth: 0., + low_cut: 0., + ..Settings::default() + }); + let x = saw(55., 0.6); + let y = render(&mut e, &x); + for i in l..x.len() { + assert_eq!(y[i][0], x[i - l]); + } +} + +#[test] +fn width_moves_the_right_channel_half_a_cycle() { + let s = Settings { + harmonic: 1, + width: 100., + depth: 100., + rate: Rate::Quarter, + low_cut: 0., + ..Settings::default() + }; + let (mut e, l) = engine(s); + let x = saw(55., 1.5); + let y = render(&mut e, &x); + let left: Vec = y.iter().map(|v| v[0]).collect(); + let right: Vec = y.iter().map(|v| v[1]).collect(); + // On the beat the left fundamental peaks and the right one nulls; half a beat later + // they swap. + for (beat, loud, quiet) in [ + (1., &left, &right), + (1.5, &right, &left), + (2., &left, &right), + ] { + let at = l + (beat / (TEMPO / 60.) * RATE as f64) as usize; + let (a, b) = (harmonic(loud, at, 55., 1), harmonic(quiet, at, 55., 1)); + assert!(20. * (a / b).log10() > 20., "beat {beat}: {a} vs {b}"); + } +} + +#[test] +fn note_changes_and_transport_jumps_do_not_click() { + let s = Settings { + depth: 100., + ..Settings::default() + }; + let (mut e, _) = engine(s); + // Phase-continuous sine from A1 to D2, no gap. + let mut phase = 0f32; + let x: Vec = (0..seconds(1.2)) + .map(|i| { + let hz = if i < seconds(0.6) { 55. } else { 73.42 }; + phase = (phase + hz / RATE).fract(); + 0.5 * (TAU * phase).sin() + }) + .collect(); + let mut y = Vec::new(); + for (i, &v) in x.iter().enumerate() { + if i == seconds(0.9) { + // A locate to another bar. + e.set_transport(Some(TEMPO), Some(37.3)); + } + y.push(e.process_sample([v, v])[0]); + } + // Two sines of peak 0.5 at up to 79 Hz move at most this much per sample (after the + // loudness correction), plus some room for the fades. + let bound = 2. * 0.5 * TAU * 79. / RATE / 2f32.sqrt() * 1.5; + for i in seconds(0.2)..y.len() - 1 { + assert!( + (y[i + 1] - y[i]).abs() < bound, + "{i}: {}", + (y[i + 1] - y[i]).abs() + ); + } +} + +#[test] +fn low_cut_keeps_the_sub_steady_and_the_beat_on_the_grid() { + let s = Settings { + harmonic: 1, + depth: 100., + rate: Rate::Half, + low_cut: 150., + ..Settings::default() + }; + let (mut e, l) = engine(s); + let x = saw(55., 2.4); + let y: Vec = render(&mut e, &x).iter().map(|v| v[0]).collect(); + // One cycle (a half note, 1 s at 120 BPM): the fundamental, under the cut, does not beat. + let sub: Vec = (0..50) + .map(|k| harmonic(&y, seconds(1.) + k * seconds(0.02), 55., 1)) + .collect(); + let (lo, hi) = sub + .iter() + .fold((f32::MAX, 0f32), |(a, b), &v| (a.min(v), b.max(v))); + // Without the cut it would null fully; what remains is leakage of the beating + // harmonics into the one-period window. + assert!(20. * (hi / lo).log10() < 1.5, "{lo} .. {hi}"); + // And it keeps its level: the loudness correction for the copy applies above the cut. + let dry = harmonic(&x, seconds(1.) - l, 55., 1); + let mean = sub.iter().sum::() / sub.len() as f32; + assert!((20. * (mean / dry).log10()).abs() < 0.5, "{mean} vs {dry}"); + // Harmonic 6 (330 Hz) beats 6 times per cycle: it peaks on the grid, the high-pass's + // phase is matched on the bass, and nulls 1/12 cycle later. + for beat in [2., 4.] { + let peak = l + (beat / (TEMPO / 60.) * RATE as f64) as usize; + let null = peak + (RATE / 12.) as usize; + let (a, b) = (harmonic(&y, peak, 55., 6), harmonic(&y, null, 55., 6)); + assert!(20. * (a / b).log10() > 15., "beat {beat}: {a} vs {b}"); + } +} + +#[test] +fn the_ratio_follows_the_note() { + let (mut e, _) = engine(Settings { + harmonic: 1, + ..Settings::default() + }); + for hz in [55., 110.] { + let x = saw(hz, 0.5); + render(&mut e, &x); + let f = e.take_analyzer(); + // An eighth at 120 BPM beats 4 times per second: r = 1 + 4 / f0. + assert!((f.ratio - (1. + 4. / hz)).abs() < 2e-3, "{hz}: {}", f.ratio); + } +} + +#[test] +fn settings_are_validated_and_serialise() { + let mut e = Engine::new(RATE, 1).unwrap(); + assert!(e + .set_settings(Settings { + harmonic: 0, + ..Settings::default() + }) + .is_err()); + let json = serde_json::to_string(&Settings::default()).unwrap(); + assert_eq!( + serde_json::from_str::(&json).unwrap(), + Settings::default() + ); + assert!(Engine::new(1000., 2).is_err()); + assert!(Engine::new(48000., 3).is_err()); +} diff --git a/plugins/braze/core/tests/realtime.rs b/plugins/braze/core/tests/realtime.rs new file mode 100644 index 0000000..c463083 --- /dev/null +++ b/plugins/braze/core/tests/realtime.rs @@ -0,0 +1,79 @@ +use braze_core::{Engine, Rate, 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_transport_and_analysis_do_not_allocate_or_free() { + let mut engine = Engine::new(48000., 2).unwrap(); + let mut settings = Settings { + width: 50., + ..Settings::default() + }; + engine.set_settings(settings).unwrap(); + CHECK.with(|v| v.set(true)); + for i in 0..96000 { + if i % 512 == 0 { + let playing = (i / 24000) % 2 == 0; + engine.set_transport( + Some(140.), + playing.then_some(i as f64 / 48000. * 140. / 60.), + ); + } + if i % 4800 == 0 { + settings.rate = Rate::ALL[(i / 4800) % Rate::ALL.len()]; + settings.harmonic = 1 + (i / 4800 % 4) as u32; + 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/braze/plugin/Cargo.lock b/plugins/braze/plugin/Cargo.lock new file mode 100644 index 0000000..347c844 --- /dev/null +++ b/plugins/braze/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 = "braze" +version = "0.1.0" +dependencies = [ + "braze-core", + "braze-ui", + "clap-sys", + "crossbeam-queue", + "nih_plug", + "nih_plug_egui", + "serde_json", +] + +[[package]] +name = "braze-core" +version = "0.1.0" +dependencies = [ + "common-dsp", + "serde", +] + +[[package]] +name = "braze-ui" +version = "0.1.0" +dependencies = [ + "braze-core", + "common-dsp", + "common-ui", + "egui", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a1f896587b6f2c069c73d2f0913e2d590c3990285cd2f0b6aa02b786b4c679c" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.13.2", + "log", + "polling", + "rustix 0.38.44", + "slab", + "thiserror 1.0.69", +] + +[[package]] +name = "cc" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ff2a8126fff0f8c839080d619675a585e61720bb12d2baceae45769fd66f155" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" + +[[package]] +name = "cfg_aliases" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "clap-sys" +version = "0.5.0" +source = "git+https://github.com/micahrj/clap-sys.git?rev=25d7f53fdb6363ad63fbd80049cb7a42a97ac156#25d7f53fdb6363ad63fbd80049cb7a42a97ac156" + +[[package]] +name = "clipboard-win" +version = "5.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "052af7878466feccda12ba7a6a67d019d712f296809559b47c12c8cc196d3a9a" +dependencies = [ + "error-code", +] + +[[package]] +name = "cocoa" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics 0.22.3", + "foreign-types 0.3.2", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" +dependencies = [ + "bitflags 1.3.2", + "block", + "core-foundation", + "core-graphics-types", + "libc", + "objc", +] + +[[package]] +name = "combine" +version = "4.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4356eba6976435498d05a311ee9fc486da3bc81c200d3f0d7dd9703b41913f92" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "common-dsp" +version = "0.1.0" + +[[package]] +name = "common-ui" +version = "0.1.0" +dependencies = [ + "egui", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "copypasta" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e6811e17f81fe246ef2bc553f76b6ee6ab41a694845df1d37e52a92b7bbd38a" +dependencies = [ + "clipboard-win", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "x11-clipboard", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types 0.3.2", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types 0.5.0", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "crossbeam" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e71406cd8807725f7ac2f999a4cdd32e98f829fdf65f528343cebf945e41df1e" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98b0cc327b5bc766e7fda9c9260cc0fa81b43a8e240440422dff70788e3f9ef1" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03e8bd762f7479489c70ed6c768ddca99d7296857de437a68dcb2a94365b3fae" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" + +[[package]] +name = "cursor-icon" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" + +[[package]] +name = "deranged" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e9de72ce2ad1f90dc62fa25f0f430ef85eb4b0d8fa0be4f30373bc40a21d28e" + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dlib" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" +dependencies = [ + "libloading", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" + +[[package]] +name = "ecolor" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc4feb366740ded31a004a0e4452fbf84e80ef432ecf8314c485210229672fd1" +dependencies = [ + "bytemuck", + "emath", +] + +[[package]] +name = "egui" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dd34cec49ab55d85ebf70139cb1ccd29c977ef6b6ba4fe85489d6877ee9ef3" +dependencies = [ + "ahash", + "bitflags 2.13.2", + "emath", + "epaint", + "nohash-hasher", + "profiling", +] + +[[package]] +name = "egui-baseview" +version = "0.5.0" +source = "git+https://github.com/BillyDM/egui-baseview.git?rev=ec70c3fe6b2f070dcacbc22924431edbe24bd1c0#ec70c3fe6b2f070dcacbc22924431edbe24bd1c0" +dependencies = [ + "baseview", + "copypasta", + "egui", + "egui_glow", + "keyboard-types", + "log", + "open", + "raw-window-handle 0.5.2", + "thiserror 2.0.21", +] + +[[package]] +name = "egui_glow" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "910906e3f042ea6d2378ec12a6fd07698e14ddae68aed2d819ffe944a73aab9e" +dependencies = [ + "ahash", + "bytemuck", + "egui", + "glow", + "log", + "memoffset 0.9.1", + "profiling", + "wasm-bindgen", + "web-sys", + "winit", +] + +[[package]] +name = "emath" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e4cadcff7a5353ba72b7fea76bf2122b5ebdbc68e8155aa56dfdea90083fe1b" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "epaint" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fcc0f5a7c613afd2dee5e4b30c3e6acafb8ad6f0edb06068811f708a67c562" +dependencies = [ + "ab_glyph", + "ahash", + "bytemuck", + "ecolor", + "emath", + "epaint_default_fonts", + "nohash-hasher", + "parking_lot", + "profiling", +] + +[[package]] +name = "epaint_default_fonts" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7e7a64c02cf7a5b51e745a9e45f60660a286f151c238b9d397b3e923f5082f" + +[[package]] +name = "equivalent" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "error-code" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5343afd4a8365a643ac588dab4cf234a190c7f6c88c9f6dd6ffe00837661b7" + +[[package]] +name = "find-msvc-tools" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c66915cc5391097de7a2b0b972e8505aa33c0df401fd3a6811dbdb32881ba48" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] + +[[package]] +name = "gethostname" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +dependencies = [ + "rustix 1.1.6", + "windows-link", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi", +] + +[[package]] +name = "gimli" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1033caf0b349c518623b5396bfb2cf0bddf44f0306d543a250e5743297aafd10" + +[[package]] +name = "glow" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" + +[[package]] +name = "indexmap" +version = "2.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys 0.4.1", + "log", + "simd_cesu8", + "thiserror 2.0.21", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn 2.0.119", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom 0.4.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dc09d2154098bbf4ef54eab6b117a3c24cbbffe94046b16ee6d6d4510584d3a" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "keyboard-types" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7668b7cff6a51fe61cdde64cd27c8a220786f399501b57ebe36f7d8112fd68" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "libc" +version = "0.2.191" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a" + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[package]] +name = "libredox" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d" +dependencies = [ + "bitflags 2.13.2", + "libc", + "plain", + "redox_syscall 0.9.5", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d15f86d12da44cd8d4ec3c73984537eb7f4cadcb9776a575a0a8a05ca11005c" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "midi-consts" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f2dd5c7f8aaf48a76e389068ab25ed80bdbc226b887f9013844c415698c9952" + +[[package]] +name = "miniz_oxide" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" +dependencies = [ + "adler2", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.13.2", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle 0.6.2", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "nih_log" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0cdb52ef79af48ae110401c883bdb9c15e0306a99ab6ecf18bc52068b668e54" +dependencies = [ + "atty", + "log", + "once_cell", + "termcolor", + "time", + "windows", +] + +[[package]] +name = "nih_plug" +version = "0.0.0" +source = "git+https://github.com/robbert-vdh/nih-plug.git?rev=de421011f41a6d10fc8c7a6084e4f4dee0143683#de421011f41a6d10fc8c7a6084e4f4dee0143683" +dependencies = [ + "anyhow", + "anymap3", + "atomic_float", + "atomic_refcell", + "backtrace", + "bitflags 1.3.2", + "cfg-if", + "clap-sys", + "core-foundation", + "crossbeam", + "libc", + "log", + "midi-consts", + "nih_log", + "nih_plug_derive", + "objc", + "parking_lot", + "raw-window-handle 0.5.2", + "serde", + "serde_json", + "widestring", + "windows", +] + +[[package]] +name = "nih_plug_derive" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/nih-plug.git?rev=de421011f41a6d10fc8c7a6084e4f4dee0143683#de421011f41a6d10fc8c7a6084e4f4dee0143683" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "nih_plug_egui" +version = "0.0.0" +source = "git+https://github.com/robbert-vdh/nih-plug.git?rev=de421011f41a6d10fc8c7a6084e4f4dee0143683#de421011f41a6d10fc8c7a6084e4f4dee0143683" +dependencies = [ + "baseview", + "crossbeam", + "egui-baseview", + "nih_plug", + "parking_lot", + "raw-window-handle 0.5.2", + "serde", +] + +[[package]] +name = "nix" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" +dependencies = [ + "bitflags 1.3.2", + "cc", + "cfg-if", + "libc", + "memoffset 0.6.5", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "num_threads" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cabcc654086861f9e1bc5115258de62ef92c79b20f4615a1b0cc57c4e82027d4" +dependencies = [ + "libc", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d5490aaf8f1d7cf7688dfa9b0ce07900e168852c45cd2c03f534dfd27cfd0b" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.13.2", + "block2", + "libc", + "objc2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2", + "objc2", + "objc2-contacts", + "objc2-foundation", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.13.2", + "block2", + "dispatch", + "libc", + "objc2", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2", + "objc2", + "objc2-app-kit", + "objc2-foundation", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-image", + "objc2-core-location", + "objc2-foundation", + "objc2-link-presentation", + "objc2-quartz-core", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "object" +version = "0.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd229a0361b9d0d4396176e02d65897f487eebeab7caa6d443855ee152ca0b9c" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "open" +version = "5.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d8c8b8e725ad26404d6896eb2f064294a0a7b4f1d9120210d85544684c4ca95" +dependencies = [ + "is-wsl", + "libc", +] + +[[package]] +name = "orbclient" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5df339f526ea9a60e371768d50efc2f2508c7203290731565d1f7a6f71d21747" +dependencies = [ + "libc", + "libredox", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.5.3", + "pin-project-lite", + "rustix 1.1.6", + "windows-sys 0.61.2", +] + +[[package]] +name = "powerfmt" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a6394b9e965e73d0a289ee54f589087e2c676aedf60885baf52c76b771e4958" + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" + +[[package]] +name = "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/braze/plugin/Cargo.toml b/plugins/braze/plugin/Cargo.toml new file mode 100644 index 0000000..b95c642 --- /dev/null +++ b/plugins/braze/plugin/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "braze" +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" } +braze-core = { path = "../core" } +braze-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/braze/plugin/src/lib.rs b/plugins/braze/plugin/src/lib.rs new file mode 100644 index 0000000..92cf513 --- /dev/null +++ b/plugins/braze/plugin/src/lib.rs @@ -0,0 +1,193 @@ +//! CLAP audio effect. All DSP state is owned by the processing thread. +mod params; +use braze_core::{AnalyzerFrame, Engine}; +use crossbeam_queue::ArrayQueue; +use nih_plug::prelude::*; +use nih_plug_egui::{create_egui_editor, egui}; +use params::{BrazeParams, FLOATS}; +use std::sync::Arc; + +struct EditorData { + ui: braze_ui::State, + gestures: [bool; FLOATS], +} +pub struct Braze { + params: Arc, + analyzer: Arc>, + engine: Option, + publish_count: usize, + publish_interval: usize, +} +impl Default for Braze { + fn default() -> Self { + Self { + params: Arc::new(BrazeParams::default()), + analyzer: Arc::new(ArrayQueue::new(2)), + engine: None, + publish_count: 0, + publish_interval: 1600, + } + } +} +impl Plugin for Braze { + const NAME: &'static str = "Braze"; + const VENDOR: &'static str = "Bass Foundry"; + const URL: &'static str = ""; + const EMAIL: &'static str = ""; + const VERSION: &'static str = env!("CARGO_PKG_VERSION"); + const AUDIO_IO_LAYOUTS: &'static [AudioIOLayout] = &[ + AudioIOLayout { + main_input_channels: NonZeroU32::new(2), + main_output_channels: NonZeroU32::new(2), + ..AudioIOLayout::const_default() + }, + AudioIOLayout { + main_input_channels: NonZeroU32::new(1), + main_output_channels: NonZeroU32::new(1), + ..AudioIOLayout::const_default() + }, + ]; + const MIDI_INPUT: MidiConfig = MidiConfig::Basic; + const SAMPLE_ACCURATE_AUTOMATION: bool = false; + type SysExMessage = (); + type BackgroundTask = (); + fn params(&self) -> Arc { + self.params.clone() + } + fn editor(&mut self, _: AsyncExecutor) -> Option> { + let params = self.params.clone(); + let analyzer = self.analyzer.clone(); + create_egui_editor( + params.editor.clone(), + EditorData { + ui: braze_ui::State::default(), + gestures: [false; FLOATS], + }, + |ctx, _| braze_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("braze-editor") + .min_size(egui::vec2( + braze_ui::WIDTH as f32 - 80., + braze_ui::HEIGHT as f32 - 40., + )) + .show(ctx, ¶ms.editor, |ui| { + braze_ui::show(ui, &mut edited, &mut data.ui) + }); + params.apply( + setter, + &before, + &edited, + data.ui.gesture_active, + &mut data.gestures, + ); + // The playhead follows the transport. + 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(); + 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(); + let _ = engine.set_settings(settings); + let transport = context.transport(); + engine.set_transport( + transport.tempo, + if transport.playing { + transport.pos_beats() + } else { + None + }, + ); + 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 must drain after input stops. + ProcessStatus::KeepAlive + } +} +impl ClapPlugin for Braze { + const CLAP_ID: &'static str = "io.narl.bass-foundry.braze"; + const CLAP_DESCRIPTION: Option<&'static str> = + Some("Adds a detuned copy whose beating stays on the tempo grid on every note"); + const CLAP_MANUAL_URL: Option<&'static str> = None; + const CLAP_SUPPORT_URL: Option<&'static str> = None; + const CLAP_FEATURES: &'static [ClapFeature] = &[ + ClapFeature::AudioEffect, + ClapFeature::Chorus, + ClapFeature::Stereo, + ClapFeature::Mono, + ]; +} +nih_export_clap!(Braze); diff --git a/plugins/braze/plugin/src/params.rs b/plugins/braze/plugin/src/params.rs new file mode 100644 index 0000000..f340aa9 --- /dev/null +++ b/plugins/braze/plugin/src/params.rs @@ -0,0 +1,219 @@ +use braze_core::{Rate, Settings, Source, HARMONIC_MAX, LOW_CUT_MAX}; +use nih_plug::prelude::*; +use nih_plug_egui::EguiState; +use std::sync::Arc; + +#[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 RateParam { + #[id = "1-1"] + #[name = "1/1"] + Whole, + #[id = "1-2"] + #[name = "1/2"] + Half, + #[id = "1-4"] + #[name = "1/4"] + Quarter, + #[id = "1-8"] + #[name = "1/8"] + Eighth, + #[id = "1-16"] + #[name = "1/16"] + Sixteenth, + #[id = "1-32"] + #[name = "1/32"] + ThirtySecond, + #[id = "1-4t"] + #[name = "1/4T"] + QuarterTriplet, + #[id = "1-8t"] + #[name = "1/8T"] + EighthTriplet, + #[id = "1-16t"] + #[name = "1/16T"] + SixteenthTriplet, +} +const RATES: [(RateParam, Rate); 9] = [ + (RateParam::Whole, Rate::Whole), + (RateParam::Half, Rate::Half), + (RateParam::Quarter, Rate::Quarter), + (RateParam::Eighth, Rate::Eighth), + (RateParam::Sixteenth, Rate::Sixteenth), + (RateParam::ThirtySecond, Rate::ThirtySecond), + (RateParam::QuarterTriplet, Rate::QuarterTriplet), + (RateParam::EighthTriplet, Rate::EighthTriplet), + (RateParam::SixteenthTriplet, Rate::SixteenthTriplet), +]; +fn to_param(rate: Rate) -> RateParam { + RATES + .iter() + .find(|(_, r)| *r == rate) + .map_or(RateParam::Eighth, |(p, _)| *p) +} +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. +pub const FLOATS: usize = 6; + +#[derive(Params)] +pub struct BrazeParams { + #[persist = "editor"] + pub editor: Arc, + #[id = "source"] + pub source: EnumParam, + #[id = "rate"] + pub rate: EnumParam, + #[id = "harmonic"] + pub harmonic: IntParam, + #[id = "depth"] + pub depth: FloatParam, + #[id = "low_cut"] + pub low_cut: FloatParam, + #[id = "width"] + pub width: FloatParam, + #[id = "phase"] + pub phase: FloatParam, + #[id = "gate"] + pub gate: FloatParam, + #[id = "snap"] + pub snap: BoolParam, + #[id = "output"] + pub output: FloatParam, + #[id = "bypass"] + pub bypass: BoolParam, +} +impl Default for BrazeParams { + fn default() -> Self { + let d = Settings::default(); + Self { + editor: EguiState::from_size(braze_ui::WIDTH, braze_ui::HEIGHT), + source: EnumParam::new("Pitch source", SourceParam::Audio), + rate: EnumParam::new("Rate", to_param(d.rate)), + harmonic: IntParam::new( + "Harmonic", + d.harmonic as i32, + IntRange::Linear { + min: 1, + max: HARMONIC_MAX as i32, + }, + ), + depth: linear("Depth", d.depth, 0., 100., " %"), + low_cut: FloatParam::new( + "Low cut", + d.low_cut, + FloatRange::Skewed { + min: 0., + max: LOW_CUT_MAX, + factor: FloatRange::skew_factor(-1.), + }, + ) + .with_unit(" Hz"), + width: linear("Width", d.width, 0., 100., " %"), + phase: linear("Phase", d.phase, 0., 360., "°"), + gate: linear("Gate", d.gate, -60., -20., " dB"), + snap: BoolParam::new("Snap to semitone", d.snap), + output: linear("Output", d.output, -12., 12., " dB"), + bypass: BoolParam::new("Bypass", false).make_bypass(), + } + } +} +impl BrazeParams { + pub fn settings(&self) -> Settings { + let rate = self.rate.value(); + Settings { + source: match self.source.value() { + SourceParam::Audio => Source::Audio, + SourceParam::Midi => Source::Midi, + }, + rate: RATES + .iter() + .find(|(p, _)| *p == rate) + .map_or(Rate::Eighth, |(_, r)| *r), + harmonic: self.harmonic.value() as u32, + depth: self.depth.value(), + low_cut: self.low_cut.value(), + width: self.width.value(), + phase: self.phase.value(), + gate: self.gate.value(), + snap: self.snap.value(), + output: self.output.value(), + bypass: self.bypass.value(), + } + } + fn floats(&self) -> [&FloatParam; FLOATS] { + [ + &self.depth, + &self.low_cut, + &self.width, + &self.phase, + &self.gate, + &self.output, + ] + } + fn values(s: &Settings) -> [f32; FLOATS] { + [s.depth, s.low_cut, s.width, s.phase, s.gate, s.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 pairs = Self::values(old).into_iter().zip(Self::values(new)); + for (i, (p, (a, b))) in self.floats().into_iter().zip(pairs).enumerate() { + if a != b { + if !open[i] { + open[i] = true; + setter.begin_set_parameter(p); + } + setter.set_parameter(p, b); + } + if !dragging && open[i] { + setter.end_set_parameter(p); + open[i] = false; + } + } + if new.harmonic != old.harmonic { + setter.begin_set_parameter(&self.harmonic); + setter.set_parameter(&self.harmonic, new.harmonic as i32); + setter.end_set_parameter(&self.harmonic); + } + if new.rate != old.rate { + setter.begin_set_parameter(&self.rate); + setter.set_parameter(&self.rate, to_param(new.rate)); + setter.end_set_parameter(&self.rate); + } + 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/braze/plugin/tests/host.rs b/plugins/braze/plugin/tests/host.rs new file mode 100644 index 0000000..698c153 --- /dev/null +++ b/plugins/braze/plugin/tests/host.rs @@ -0,0 +1,216 @@ +//! 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 = &braze::clap_entry; + assert!(entry.init.unwrap()(c"braze.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"Braze"); + assert_eq!( + CStr::from_ptr((*descriptor).id), + c"io.narl.bass-foundry.braze" + ); + 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; + // Depth 0 passes the input through the lookahead delay unchanged. + envelope.params.insert("depth".into(), ParamValue::F32(0.)); + envelope.params.insert("width".into(), ParamValue::F32(40.)); + envelope + .params + .insert("harmonic".into(), ParamValue::I32(3)); + envelope + .params + .insert("rate".into(), ParamValue::String("1-16t".into())); + envelope + .params + .insert("snap".into(), ParamValue::Bool(true)); + 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() + ); + 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 at depth 0. + 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/braze/ui/Cargo.toml b/plugins/braze/ui/Cargo.toml new file mode 100644 index 0000000..d011425 --- /dev/null +++ b/plugins/braze/ui/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "braze-ui" +version = "0.1.0" +edition.workspace = true +license.workspace = true + +[dependencies] +egui = "0.31.1" +braze-core = { path = "../core" } +common-ui = { path = "../../common/ui" } +common-dsp = { path = "../../common/dsp" } diff --git a/plugins/braze/ui/src/lib.rs b/plugins/braze/ui/src/lib.rs new file mode 100644 index 0000000..3f2b271 --- /dev/null +++ b/plugins/braze/ui/src/lib.rs @@ -0,0 +1,410 @@ +//! Braze editor, shared by the CLAP wrapper and the headless renderer. +use braze_core::{ + cycles, envelope, AnalyzerFrame, Rate, Settings, Source, HARMONIC_MAX, LOW_CUT_MAX, LOW_CUT_OFF, +}; +use common_ui::*; +use egui::{self, Color32, FontId, Pos2, Rect, RichText, Sense, Stroke, Vec2}; + +pub use common_ui::style; +pub const WIDTH: u32 = 980; +pub const HEIGHT: u32 = 716; + +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 = + "Put Braze on a reese or a layered bass. Pick the note value the beating should follow."; +impl State { + pub fn accept_frame(&mut self, frame: AnalyzerFrame) { + self.analyzer = frame; + } +} +fn hint(r: &egui::Response, state: &mut State, text: &str) { + if r.hovered() || r.has_focus() { + state.help = text.into(); + } +} +#[allow(clippy::too_many_arguments)] +fn knob( + ui: &mut egui::Ui, + state: &mut State, + name: &str, + value: &mut f32, + range: std::ops::RangeInclusive, + default: f32, + unit: &str, + size: f32, + help: &str, +) { + ui.vertical_centered(|ui| { + let r = rotary(ui, name, value, range, default, unit, size, ACCENT); + hint(&r, state, help); + }); +} + +/// Note value of one beat of harmonic `n`, as a label: "1/8", "1/16T", "1/8D", or "1/40". +pub fn beat_label(s: &Settings, n: u32) -> String { + let quarters = s.rate.quarters() * s.harmonic as f64 / n as f64; + let per_whole = 4. / quarters; + for den in [1u32, 2, 4, 8, 16, 32, 64, 128] { + let d = den as f64; + if (per_whole - d).abs() < 1e-6 { + return format!("1/{den}"); + } + if (per_whole - d * 1.5).abs() < 1e-6 { + return format!("1/{den}T"); + } + if (per_whole - d / 1.5).abs() < 1e-6 { + return format!("1/{den}D"); + } + } + if (per_whole - per_whole.round()).abs() < 1e-6 { + format!("1/{}", per_whole.round()) + } else { + format!("{:.2} beats", quarters) + } +} + +/// One bar of the beat of harmonics 1–8, with the beat grid and a playhead. +fn beats(ui: &mut egui::Ui, settings: &Settings, frame: &AnalyzerFrame, height: f32) { + let (rect, _) = ui.allocate_exact_size(Vec2::new(ui.available_width(), height), Sense::hover()); + let p = ui.painter_at(rect); + p.rect_filled(rect, 2., SCREEN); + let label_w = 86.; + let area = Rect::from_min_max( + rect.left_top() + Vec2::new(label_w, 26.), + rect.right_bottom() - Vec2::new(12., 10.), + ); + p.text( + rect.left_top() + Vec2::new(10., 8.), + egui::Align2::LEFT_TOP, + "BEAT PER HARMONIC · ONE BAR", + FontId::proportional(11.), + MUTED, + ); + p.text( + rect.right_top() + Vec2::new(-12., 8.), + egui::Align2::RIGHT_TOP, + if frame.synced { + format!("{:.1} BPM · host transport", frame.tempo) + } else { + format!("{:.1} BPM · free running", frame.tempo) + }, + FontId::proportional(11.), + MUTED, + ); + // Grid: every beat of the chosen rate, quarters brighter. + let step = settings.rate.quarters(); + let mut q = 0f64; + while q < 4. - 1e-9 { + let x = area.left() + area.width() * (q / 4.) as f32; + let on_quarter = (q - q.round()).abs() < 1e-6; + let color = if on_quarter { + Color32::from_rgb(58, 62, 70) + } else { + Color32::from_rgb(32, 35, 40) + }; + p.line_segment( + [Pos2::new(x, area.top()), Pos2::new(x, area.bottom())], + Stroke::new(1.0_f32, color), + ); + q += step; + } + let rows = HARMONIC_MAX as usize; + let row_h = area.height() / rows as f32; + let depth = settings.depth * 0.01; + let points = 240; + let bar_start = (frame.beats / 4.).floor() * 4.; + for row in 0..rows { + let n = row as u32 + 1; + let top = area.top() + row_h * row as f32; + let chosen = n == settings.harmonic; + // Under the low cut the copy is removed: that harmonic keeps the bass's level. + let cut = settings.low_cut >= LOW_CUT_OFF + && frame.hz > 0. + && n as f32 * frame.hz < settings.low_cut; + let color = match (cut, chosen) { + (true, _) => DIM, + (false, true) => ACCENT, + (false, false) => STEEL, + }; + p.text( + Pos2::new(rect.left() + 10., top + row_h * 0.5), + egui::Align2::LEFT_CENTER, + format!("H{n}"), + FontId::proportional(11.), + if chosen { ACCENT } else { MUTED }, + ); + p.text( + Pos2::new(rect.left() + 36., top + row_h * 0.5), + egui::Align2::LEFT_CENTER, + if cut { + "cut".to_string() + } else { + beat_label(settings, n) + }, + FontId::monospace(11.), + if chosen { TEXT } else { DIM }, + ); + let line: Vec = (0..=points) + .map(|i| { + let t = i as f64 / points as f64; + let level = if cut { + 1. + } else { + envelope(settings, n, cycles(settings, bar_start + 4. * t, 0), depth) + }; + // 0 at the bottom of the row, twice the bass (√2 after correction) at the top. + let y = top + row_h * (0.92 - 0.8 * level / 2f32.sqrt()); + Pos2::new(area.left() + area.width() * t as f32, y) + }) + .collect(); + p.add(egui::Shape::line( + line, + Stroke::new(if chosen { 2.0_f32 } else { 1.2_f32 }, color), + )); + } + let head = area.left() + area.width() * ((frame.beats - bar_start) / 4.) as f32; + p.line_segment( + [Pos2::new(head, area.top()), Pos2::new(head, area.bottom())], + Stroke::new(1.0_f32, Color32::from_rgba_unmultiplied(255, 255, 255, 90)), + ); + p.rect_stroke( + rect, + 2., + Stroke::new(1.0_f32, EDGE), + egui::StrokeKind::Inside, + ); +} + +pub fn show(ui: &mut egui::Ui, settings: &mut Settings, state: &mut State) { + backdrop(ui); + state.help = DEFAULT_HELP.into(); + state.gesture_active = ui.input(|i| i.pointer.any_down()); + ui.add_space(2.); + header(ui, "BRAZE", "TEMPO-LOCKED BEATING", |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(240.); + ui.set_min_height(TOP); + ui.vertical(|ui| note_panel(ui, settings, &frame)); + }); + ui.add_space(4.); + panel(ui, |ui| { + ui.set_width(ui.available_width()); + beats(ui, settings, &frame, TOP); + }); + }); + ui.add_space(6.); + panel(ui, |ui| { + ui.set_width(ui.available_width()); + ui.vertical(|ui| controls(ui, settings, state)); + }); + ui.separator(); + ui.label(RichText::new(&state.help).color(MUTED)); +} +const TOP: f32 = 300.; +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)), + _ => ("—".into(), "no note".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(14.); + let beat_hz = frame.tempo / 60. / settings.rate.quarters(); + readout( + ui, + &format!("HARMONIC {} BEATS", settings.harmonic), + format!("{:.2} Hz, every {}", beat_hz, settings.rate.label()), + ACCENT, + ); + if settings.low_cut >= LOW_CUT_OFF + && frame.hz > 0. + && settings.harmonic as f32 * frame.hz < settings.low_cut + { + ui.label( + RichText::new("Under Low cut on this note: it does not beat. Pick a higher harmonic.") + .size(12.) + .color(ACCENT), + ); + ui.add_space(6.); + } + let cents = 1200. * frame.ratio.max(1e-6).log2(); + readout( + ui, + "COPY DETUNE ON THIS NOTE", + if frame.hz > 0. { + format!("+{cents:.1} cents") + } else { + "waiting for a note".into() + }, + TEXT, + ); + 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 notes", + } + )) + .size(12.) + .color(MUTED), + ); +} +fn controls(ui: &mut egui::Ui, settings: &mut Settings, state: &mut State) { + let d = Settings::default(); + ui.horizontal(|ui| { + caption(ui, "RATE"); + ui.add_space(6.); + for rate in Rate::ALL { + let r = + ui.selectable_label(settings.rate == rate, RichText::new(rate.label()).size(13.)); + if r.clicked() { + settings.rate = rate; + } + hint( + &r, + state, + "One beat cycle of the chosen harmonic lasts this note value, on every note.", + ); + } + ui.add_space(18.); + caption(ui, "ON HARMONIC"); + ui.add_space(6.); + for n in 1..=HARMONIC_MAX { + let r = ui.selectable_label( + settings.harmonic == n, + RichText::new(format!("{n}")).size(13.), + ); + if r.clicked() { + settings.harmonic = n; + } + hint( + &r, + state, + "This harmonic beats at Rate. Harmonic n beats n/this times as fast. \ + Pick the harmonic you hear the movement on.", + ); + } + }); + ui.add_space(8.); + ui.separator(); + ui.columns(6, |c| { + knob( + &mut c[0], + state, + "Depth", + &mut settings.depth, + 0. ..=100., + d.depth, + " %", + 72., + "Level of the detuned copy. 100 % beats down to full nulls; 0 % is the dry bass.", + ); + knob( + &mut c[1], + state, + "Low cut", + &mut settings.low_cut, + 0. ..=LOW_CUT_MAX, + d.low_cut, + " Hz", + 72., + "No copy below this frequency: the sub does not beat and keeps its level. \ + Under 20 Hz the cut is off.", + ); + knob( + &mut c[2], + state, + "Width", + &mut settings.width, + 0. ..=100., + d.width, + " %", + 72., + "Moves the right channel's beat against the left. 100 %: one side peaks while \ + the other nulls. Check the mono sum.", + ); + knob( + &mut c[3], + state, + "Phase", + &mut settings.phase, + 0. ..=360., + d.phase, + "°", + 72., + "Where the beat peaks. 0° puts the peak of the chosen harmonic on the beat.", + ); + knob( + &mut c[4], + state, + "Gate", + &mut settings.gate, + -60. ..=-20., + d.gate, + " dB", + 72., + "Input level that counts as a note. Raise it if tails retrigger.", + ); + knob( + &mut c[5], + state, + "Output", + &mut settings.output, + -12. ..=12., + d.output, + " dB", + 72., + "Output trim.", + ); + }); + ui.add_space(4.); + 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. Off keeps the copy's jumps on the real period, which is \ + seamless on detuned patches.", + ); +} diff --git a/plugins/catalog.json b/plugins/catalog.json index 604741e..292fab7 100644 --- a/plugins/catalog.json +++ b/plugins/catalog.json @@ -148,5 +148,22 @@ "planish-core", "planish-ui" ] + }, + "braze": { + "name": "Braze", + "description": "Adds a detuned copy whose beating stays on the tempo grid on every note", + "manifest": "plugins/braze/plugin/Cargo.toml", + "library": "braze", + "documentation": "docs/braze", + "clap_id": "io.narl.bass-foundry.braze", + "licenses": { + "plugins/common/ui/assets/OFL.txt": "licenses/Roboto-OFL.txt" + }, + "packages": [ + "common-ui", + "common-dsp", + "braze-core", + "braze-ui" + ] } } diff --git a/tools/editor-check/Cargo.lock b/tools/editor-check/Cargo.lock index 9a86dbd..50d1f37 100644 --- a/tools/editor-check/Cargo.lock +++ b/tools/editor-check/Cargo.lock @@ -66,6 +66,24 @@ version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" +[[package]] +name = "braze-core" +version = "0.1.0" +dependencies = [ + "common-dsp", + "serde", +] + +[[package]] +name = "braze-ui" +version = "0.1.0" +dependencies = [ + "braze-core", + "common-dsp", + "common-ui", + "egui", +] + [[package]] name = "bytemuck" version = "1.25.2" @@ -153,6 +171,8 @@ version = "0.1.0" dependencies = [ "anvil-core", "anvil-ui", + "braze-core", + "braze-ui", "common-dsp", "crucible-core", "crucible-ui", diff --git a/tools/editor-check/Cargo.toml b/tools/editor-check/Cargo.toml index c918ceb..a5fe513 100644 --- a/tools/editor-check/Cargo.toml +++ b/tools/editor-check/Cargo.toml @@ -27,5 +27,7 @@ knurl-core = { path = "../../plugins/knurl/core" } knurl-ui = { path = "../../plugins/knurl/ui" } planish-core = { path = "../../plugins/planish/core" } planish-ui = { path = "../../plugins/planish/ui" } +braze-core = { path = "../../plugins/braze/core" } +braze-ui = { path = "../../plugins/braze/ui" } weld-core = { path = "../../plugins/weld/core" } weld-ui = { path = "../../plugins/weld/ui" } diff --git a/tools/editor-check/src/main.rs b/tools/editor-check/src/main.rs index 7c697ee..71f86a9 100644 --- a/tools/editor-check/src/main.rs +++ b/tools/editor-check/src/main.rs @@ -12,11 +12,13 @@ fn main() { .unwrap_or("rivet"); if ![ "rivet", "patina", "anvil", "crucible", "lathe", "temper", "weld", "knurl", "planish", + "braze", ] .contains(&plugin) { eprintln!( - "Use --plugin rivet, patina, anvil, crucible, lathe, temper, weld, knurl or planish" + "Use --plugin rivet, patina, anvil, crucible, lathe, temper, weld, knurl, planish \ + or braze" ); std::process::exit(2); } @@ -29,7 +31,10 @@ fn main() { let weld = plugin == "weld"; let knurl = plugin == "knurl"; let planish = plugin == "planish"; - let (width, height) = if planish { + let braze = plugin == "braze"; + let (width, height) = if braze { + (braze_ui::WIDTH, braze_ui::HEIGHT) + } else if planish { (planish_ui::WIDTH, planish_ui::HEIGHT) } else if knurl { (knurl_ui::WIDTH, knurl_ui::HEIGHT) @@ -191,6 +196,26 @@ fn main() { } planish_state.accept_frame(engine.take_analyzer()); } + let mut braze_settings = braze_core::Settings { + width: 30., + ..Default::default() + }; + let mut braze_state = braze_ui::State::default(); + if braze { + // A reese-like F1 saw at 140 BPM, 2.3 beats into the bar. + let mut engine = braze_core::Engine::new(48000., 2).unwrap(); + engine.set_settings(braze_settings).unwrap(); + engine.set_transport(Some(140.), Some(0.)); + let mut saw = common_dsp::Saw::new(48000., 43.65); + for i in 0..47300 { + let x = (saw.sample() * 1.6).tanh() * 0.4; + engine.process_sample([x, x]); + if i % 1600 == 0 { + braze_state.accept_frame(engine.take_analyzer()); + } + } + braze_state.accept_frame(engine.take_analyzer()); + } let mut weld_settings = weld_core::Settings::default(); let mut weld_state = weld_ui::State::default(); if weld { @@ -320,7 +345,9 @@ fn main() { let session_motif = session.motifs[0].id; shared.replace(session).unwrap(); let ctx = egui::Context::default(); - if planish { + if braze { + braze_ui::style(&ctx); + } else if planish { planish_ui::style(&ctx); } else if knurl { knurl_ui::style(&ctx); @@ -359,7 +386,9 @@ fn main() { }, |ui| { egui::CentralPanel::default().show(ui, |ui| { - if planish { + if braze { + braze_ui::show(ui, &mut braze_settings, &mut braze_state); + } else if planish { planish_ui::show(ui, &mut planish_settings, &mut planish_state); } else if knurl { knurl_ui::show(ui, &mut knurl_settings, &mut knurl_state); diff --git a/website/src/data/plugins.ts b/website/src/data/plugins.ts index 29a0a6a..ac96105 100644 --- a/website/src/data/plugins.ts +++ b/website/src/data/plugins.ts @@ -184,6 +184,21 @@ const COPY: Record = { latency: '≈ 67 ms', tracksNotes: true, }, + braze: { + role: 'Tempo-locked beating', + metal: 'Brazing joins two metals with a filler.', + problem: + 'Detuned layers beat at a rate set by the detune and the note: the same reese pulses faster on C2 than on F1, and its movement never lines up with the track.', + points: [ + 'A detuned copy whose detune is set on every note from the tracked pitch.', + 'The chosen harmonic beats once per note value, 1/1 to 1/32 or triplets; every other harmonic beats on the grid too.', + 'Beat peaks follow the host’s beat position.', + 'Low cut keeps the sub out of the beating, at its own level.', + ], + loadOn: 'Bass, after Planish', + latency: '≈ 67 ms', + tracksNotes: true, + }, }; export interface Plugin extends Copy {