feat(weld): add sidechain test build
Weld will phase-align a bass layer to another layer it hears through the sidechain. This first build only checks that FL Studio delivers the sidechain to a CLAP aux port: it passes the main layer through unchanged, meters the sidechain and offers Layer/Sum/Sum dry listening. No latency.
This commit is contained in:
1 parent
b3ebe4d952
commit
e3286f9094
21 files changed
+3471
-9
No files matched your search
@@ -10,8 +10,8 @@ fn main() {
|
||||
.find(|a| a[0] == "--plugin")
|
||||
.map(|a| a[1].as_str())
|
||||
.unwrap_or("rivet");
|
||||
if !["rivet", "patina", "anvil", "crucible", "lathe", "temper"].contains(&plugin) {
|
||||
eprintln!("Use --plugin rivet, patina, anvil, crucible, lathe or temper");
|
||||
if !["rivet", "patina", "anvil", "crucible", "lathe", "temper", "weld"].contains(&plugin) {
|
||||
eprintln!("Use --plugin rivet, patina, anvil, crucible, lathe, temper or weld");
|
||||
std::process::exit(2);
|
||||
}
|
||||
let patina = plugin == "patina" || args.iter().any(|arg| arg == "--resonance");
|
||||
@@ -20,7 +20,10 @@ fn main() {
|
||||
let crucible = plugin == "crucible";
|
||||
let lathe = plugin == "lathe";
|
||||
let temper = plugin == "temper";
|
||||
let (width, height) = if temper {
|
||||
let weld = plugin == "weld";
|
||||
let (width, height) = if weld {
|
||||
(weld_ui::WIDTH, weld_ui::HEIGHT)
|
||||
} else if temper {
|
||||
(temper_ui::WIDTH, temper_ui::HEIGHT)
|
||||
} else if lathe {
|
||||
(lathe_ui::WIDTH, lathe_ui::HEIGHT)
|
||||
@@ -139,6 +142,22 @@ fn main() {
|
||||
}
|
||||
temper_state.accept_frame(engine.take_analyzer());
|
||||
}
|
||||
let mut weld_settings = weld_core::Settings::default();
|
||||
let mut weld_state = weld_ui::State::default();
|
||||
if weld {
|
||||
// Two layers of an F1 saw bass; the sidechain layer is polarity-flipped.
|
||||
let mut engine = weld_core::Engine::new(48000., 2).unwrap();
|
||||
engine.set_settings(weld_settings).unwrap();
|
||||
let mut saw = common_dsp::Saw::new(48000., 43.65);
|
||||
for i in 0..36000 {
|
||||
let x = (saw.sample() * 1.6).tanh() * 0.4;
|
||||
engine.process_sample([x, x], [-0.7 * x, -0.7 * x]);
|
||||
if i % 1600 == 0 {
|
||||
weld_state.accept_frame(engine.take_analyzer());
|
||||
}
|
||||
}
|
||||
weld_state.accept_frame(engine.take_analyzer());
|
||||
}
|
||||
let mut crucible_settings = crucible_core::Settings {
|
||||
folder: "C:\\Users\\you\\Documents\\Crucible".into(),
|
||||
..Default::default()
|
||||
@@ -227,7 +246,9 @@ fn main() {
|
||||
let session_motif = session.motifs[0].id;
|
||||
shared.replace(session).unwrap();
|
||||
let ctx = egui::Context::default();
|
||||
if temper {
|
||||
if weld {
|
||||
weld_ui::style(&ctx);
|
||||
} else if temper {
|
||||
temper_ui::style(&ctx);
|
||||
} else if lathe {
|
||||
lathe_ui::style(&ctx);
|
||||
@@ -260,7 +281,9 @@ fn main() {
|
||||
},
|
||||
|ui| {
|
||||
egui::CentralPanel::default().show(ui, |ui| {
|
||||
if temper {
|
||||
if weld {
|
||||
weld_ui::show(ui, &mut weld_settings, &mut weld_state);
|
||||
} else if temper {
|
||||
temper_ui::show(ui, &mut temper_settings, &mut temper_state);
|
||||
} else if lathe {
|
||||
lathe_ui::show(ui, &mut lathe_settings, &mut lathe_state);
|
||||
|
||||
Reference in new issue
Block a user