Skip to content

Commit 1c3e640

Browse files
authored
Add Noise Gate (#43)
* Add Noise Gate * Update preset * Remove comment lines
1 parent 6bc5d5e commit 1c3e640

11 files changed

Lines changed: 374 additions & 0 deletions

File tree

presets/High_Gain.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,15 @@
5353
"Level": {
5454
"gain": 0.3
5555
}
56+
},
57+
{
58+
"NoiseGate": {
59+
"threshold_db": -13.0,
60+
"ratio": 10.0,
61+
"attack_ms": 3.7,
62+
"hold_ms": 10.0,
63+
"release_ms": 100.0
64+
}
5665
}
5766
]
5867
}

src/gui/app.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,17 @@ impl AmplifierApp {
291291
}
292292
true
293293
}
294+
(StageConfig::NoiseGate(cfg), StageMessage::NoiseGate(msg)) => {
295+
use crate::gui::messages::NoiseGateMessage::*;
296+
match msg {
297+
ThresholdChanged(v) => cfg.threshold_db = v,
298+
RatioChanged(v) => cfg.ratio = v,
299+
AttackChanged(v) => cfg.attack_ms = v,
300+
HoldChanged(v) => cfg.hold_ms = v,
301+
ReleaseChanged(v) => cfg.release_ms = v,
302+
}
303+
true
304+
}
294305
_ => false,
295306
}
296307
} else {
@@ -377,6 +388,11 @@ fn build_amplifier_chain(stages: &[StageConfig], sample_rate: f32) -> AmplifierC
377388
StageConfig::Level(cfg) => {
378389
chain.add_stage(Box::new(cfg.to_stage(&format!("Level {idx}"))));
379390
}
391+
StageConfig::NoiseGate(cfg) => {
392+
chain.add_stage(Box::new(
393+
cfg.to_stage(&format!("NoiseGate {idx}"), sample_rate),
394+
));
395+
}
380396
}
381397
}
382398

src/gui/components/control.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const STAGE_TYPES: &[StageType] = &[
1515
StageType::ToneStack,
1616
StageType::PowerAmp,
1717
StageType::Level,
18+
StageType::NoiseGate,
1819
];
1920

2021
impl Control {

src/gui/components/stage_list.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ impl StageList {
3131
StageConfig::ToneStack(cfg) => stages::tonestack::view(idx, cfg, self.stages.len()),
3232
StageConfig::PowerAmp(cfg) => stages::poweramp::view(idx, cfg, self.stages.len()),
3333
StageConfig::Level(cfg) => stages::level::view(idx, cfg, self.stages.len()),
34+
StageConfig::NoiseGate(cfg) => {
35+
stages::noise_gate::view(idx, cfg, self.stages.len())
36+
}
3437
};
3538
col = col.push(widget);
3639
}

src/gui/components/stages/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
pub mod compressor;
22
pub mod filter;
33
pub mod level;
4+
pub mod noise_gate;
45
pub mod poweramp;
56
pub mod preamp;
67
pub mod tonestack;
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
use iced::widget::{column, container};
2+
use iced::{Element, Length};
3+
4+
use crate::gui::components::widgets::common::{labeled_slider, stage_header};
5+
use crate::gui::config::NoiseGateConfig;
6+
use crate::gui::messages::{Message, NoiseGateMessage, StageMessage};
7+
8+
const HEADER_TEXT: &str = "Noise Gate";
9+
10+
pub fn view(idx: usize, cfg: &NoiseGateConfig, total_stages: usize) -> Element<'_, Message> {
11+
let header = stage_header(HEADER_TEXT, idx, total_stages);
12+
13+
let body = column![
14+
labeled_slider(
15+
"Threshold",
16+
-80.0..=0.0,
17+
cfg.threshold_db,
18+
move |v| Message::Stage(
19+
idx,
20+
StageMessage::NoiseGate(NoiseGateMessage::ThresholdChanged(v))
21+
),
22+
|v| format!("{v:.1} dB"),
23+
1.0
24+
),
25+
labeled_slider(
26+
"Ratio",
27+
1.0..=100.0,
28+
cfg.ratio,
29+
move |v| Message::Stage(
30+
idx,
31+
StageMessage::NoiseGate(NoiseGateMessage::RatioChanged(v))
32+
),
33+
|v| format!("{v:.0}:1"),
34+
1.0
35+
),
36+
labeled_slider(
37+
"Attack",
38+
0.1..=100.0,
39+
cfg.attack_ms,
40+
move |v| Message::Stage(
41+
idx,
42+
StageMessage::NoiseGate(NoiseGateMessage::AttackChanged(v))
43+
),
44+
|v| format!("{v:.1} ms"),
45+
0.1
46+
),
47+
labeled_slider(
48+
"Hold",
49+
0.0..=500.0,
50+
cfg.hold_ms,
51+
move |v| Message::Stage(
52+
idx,
53+
StageMessage::NoiseGate(NoiseGateMessage::HoldChanged(v))
54+
),
55+
|v| format!("{v:.0} ms"),
56+
1.0
57+
),
58+
labeled_slider(
59+
"Release",
60+
1.0..=1000.0,
61+
cfg.release_ms,
62+
move |v| Message::Stage(
63+
idx,
64+
StageMessage::NoiseGate(NoiseGateMessage::ReleaseChanged(v))
65+
),
66+
|v| format!("{v:.0} ms"),
67+
1.0
68+
),
69+
]
70+
.spacing(5);
71+
72+
container(column![header, body].spacing(5).padding(10))
73+
.width(Length::Fill)
74+
.style(|theme: &iced::Theme| {
75+
container::Style::default()
76+
.background(theme.palette().background)
77+
.border(iced::Border::default().rounded(5))
78+
})
79+
.into()
80+
}

src/gui/config/mod.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
pub mod compressor;
22
pub mod filter;
33
pub mod level;
4+
pub mod noise_gate;
45
pub mod poweramp;
56
pub mod preamp;
67
pub mod tonestack;
78

89
pub use compressor::CompressorConfig;
910
pub use filter::FilterConfig;
1011
pub use level::LevelConfig;
12+
pub use noise_gate::NoiseGateConfig;
1113
pub use poweramp::PowerAmpConfig;
1214
pub use preamp::PreampConfig;
1315
pub use tonestack::ToneStackConfig;
@@ -24,6 +26,7 @@ pub enum StageType {
2426
ToneStack,
2527
PowerAmp,
2628
Level,
29+
NoiseGate,
2730
}
2831

2932
impl std::fmt::Display for StageType {
@@ -35,6 +38,7 @@ impl std::fmt::Display for StageType {
3538
StageType::ToneStack => write!(f, "Tone Stack"),
3639
StageType::PowerAmp => write!(f, "Power Amp"),
3740
StageType::Level => write!(f, "Level"),
41+
StageType::NoiseGate => write!(f, "Noise Gate"),
3842
}
3943
}
4044
}
@@ -48,6 +52,7 @@ pub enum StageConfig {
4852
ToneStack(ToneStackConfig),
4953
PowerAmp(PowerAmpConfig),
5054
Level(LevelConfig),
55+
NoiseGate(NoiseGateConfig),
5156
}
5257

5358
impl StageConfig {
@@ -59,6 +64,7 @@ impl StageConfig {
5964
StageType::ToneStack => StageConfig::ToneStack(ToneStackConfig::default()),
6065
StageType::PowerAmp => StageConfig::PowerAmp(PowerAmpConfig::default()),
6166
StageType::Level => StageConfig::Level(LevelConfig::default()),
67+
StageType::NoiseGate => StageConfig::NoiseGate(NoiseGateConfig::default()),
6268
}
6369
}
6470

@@ -70,6 +76,7 @@ impl StageConfig {
7076
StageConfig::ToneStack(_) => "Tone Stack",
7177
StageConfig::PowerAmp(_) => "Power Amp",
7278
StageConfig::Level(_) => "Level",
79+
StageConfig::NoiseGate(_) => "Noise Gate",
7380
}
7481
}
7582
}

src/gui/config/noise_gate.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
use crate::sim::stages::noise_gate::NoiseGateStage;
2+
use serde::{Deserialize, Serialize};
3+
4+
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
5+
pub struct NoiseGateConfig {
6+
pub threshold_db: f32,
7+
pub ratio: f32,
8+
pub attack_ms: f32,
9+
pub hold_ms: f32,
10+
pub release_ms: f32,
11+
}
12+
13+
impl Default for NoiseGateConfig {
14+
fn default() -> Self {
15+
Self {
16+
threshold_db: -40.0, // Typical threshold for guitar
17+
ratio: 10.0, // 10:1 ratio for smooth gating
18+
attack_ms: 1.0, // Fast attack to not cut transients
19+
hold_ms: 10.0, // Small hold to avoid choppy gating
20+
release_ms: 100.0, // Smooth release
21+
}
22+
}
23+
}
24+
25+
impl NoiseGateConfig {
26+
pub fn to_stage(&self, name: &str, sample_rate: f32) -> NoiseGateStage {
27+
NoiseGateStage::new(
28+
name,
29+
self.threshold_db,
30+
self.ratio,
31+
self.attack_ms,
32+
self.hold_ms,
33+
self.release_ms,
34+
sample_rate,
35+
)
36+
}
37+
}

src/gui/messages.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,16 @@ pub enum StageMessage {
3939
ToneStack(ToneStackMessage),
4040
PowerAmp(PowerAmpMessage),
4141
Level(LevelMessage),
42+
NoiseGate(NoiseGateMessage),
43+
}
44+
45+
#[derive(Debug, Clone)]
46+
pub enum NoiseGateMessage {
47+
ThresholdChanged(f32),
48+
RatioChanged(f32),
49+
AttackChanged(f32),
50+
HoldChanged(f32),
51+
ReleaseChanged(f32),
4252
}
4353

4454
#[derive(Debug, Clone)]

src/sim/stages/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ pub mod clipper;
22
pub mod compressor;
33
pub mod filter;
44
pub mod level;
5+
pub mod noise_gate;
56
pub mod poweramp;
67
pub mod preamp;
78
pub mod tonestack;

0 commit comments

Comments
 (0)