Skip to content

Commit 6bc5d5e

Browse files
authored
Add High Gain Preset (#42)
1 parent 0a719c0 commit 6bc5d5e

13 files changed

Lines changed: 224 additions & 139 deletions

File tree

Cargo.lock

Lines changed: 99 additions & 101 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

presets/High_Gain.json

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
{
2+
"name": "High Gain",
3+
"description": null,
4+
"author": null,
5+
"stages": [
6+
{
7+
"Filter": {
8+
"filter_type": "Highpass",
9+
"cutoff_hz": 68.0,
10+
"resonance": 0.2
11+
}
12+
},
13+
{
14+
"Filter": {
15+
"filter_type": "Lowpass",
16+
"cutoff_hz": 5737.0,
17+
"resonance": 0.15
18+
}
19+
},
20+
{
21+
"Preamp": {
22+
"gain": 6.7000003,
23+
"bias": 0.0,
24+
"clipper_type": "ClassA"
25+
}
26+
},
27+
{
28+
"ToneStack": {
29+
"model": "British",
30+
"bass": 0.65000004,
31+
"mid": 0.90000004,
32+
"treble": 0.7,
33+
"presence": 0.4
34+
}
35+
},
36+
{
37+
"Compressor": {
38+
"attack_ms": 1.0,
39+
"release_ms": 80.0,
40+
"threshold_db": -16.0,
41+
"ratio": 4.0,
42+
"makeup_db": 17.9
43+
}
44+
},
45+
{
46+
"Preamp": {
47+
"gain": 6.8,
48+
"bias": 0.0,
49+
"clipper_type": "Hard"
50+
}
51+
},
52+
{
53+
"Level": {
54+
"gain": 0.3
55+
}
56+
}
57+
]
58+
}

src/gui/app.rs

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@ use crate::sim::chain::AmplifierChain;
1111
pub struct AmplifierApp {
1212
processor_manager: ProcessorManager,
1313
stages: Vec<StageConfig>,
14-
selected_stage_type: StageType,
1514
is_recording: bool,
1615
preset_manager: PresetManager,
1716
selected_preset: Option<String>,
1817
preset_bar: PresetBar,
18+
stage_list: StageList,
19+
control_bar: Control,
1920
new_preset_name: String,
2021
show_save_input: bool,
2122
}
@@ -43,14 +44,18 @@ impl AmplifierApp {
4344
Vec::new()
4445
};
4546

47+
let stage_list = StageList::new(stages.clone());
48+
let control_bar = Control::new(StageType::default());
49+
4650
let app = Self {
4751
processor_manager,
4852
stages,
49-
selected_stage_type: StageType::default(),
5053
is_recording: false,
5154
preset_manager,
5255
selected_preset,
5356
preset_bar,
57+
stage_list,
58+
control_bar,
5459
new_preset_name: String::new(),
5560
show_save_input: false,
5661
};
@@ -63,33 +68,38 @@ impl AmplifierApp {
6368

6469
pub fn update(&mut self, message: Message) -> Task<Message> {
6570
let mut should_update_chain = false;
71+
let mut should_update_stages = false;
6672

6773
match message {
6874
Message::AddStage => {
69-
let new_stage = StageConfig::create_default(self.selected_stage_type);
75+
let new_stage = StageConfig::create_default(self.control_bar.selected());
7076
self.stages.push(new_stage);
7177
should_update_chain = true;
78+
should_update_stages = true;
7279
}
7380
Message::RemoveStage(idx) => {
7481
if idx < self.stages.len() {
7582
self.stages.remove(idx);
7683
}
7784
should_update_chain = true;
85+
should_update_stages = true;
7886
}
7987
Message::MoveStageUp(idx) => {
8088
if idx > 0 {
8189
self.stages.swap(idx - 1, idx);
8290
should_update_chain = true;
91+
should_update_stages = true;
8392
}
8493
}
8594
Message::MoveStageDown(idx) => {
8695
if idx < self.stages.len().saturating_sub(1) {
8796
self.stages.swap(idx, idx + 1);
8897
should_update_chain = true;
98+
should_update_stages = true;
8999
}
90100
}
91101
Message::StageTypeSelected(stage_type) => {
92-
self.selected_stage_type = stage_type;
102+
self.control_bar.set_selected_stage_type(stage_type);
93103
}
94104
Message::PresetSelected(preset_name) => {
95105
if let Some(preset) = self.preset_manager.get_preset_by_name(&preset_name) {
@@ -98,6 +108,7 @@ impl AmplifierApp {
98108
self.preset_bar
99109
.set_selected_preset(Some(preset_name.clone()));
100110
should_update_chain = true;
111+
should_update_stages = true;
101112
info!("Loaded preset: {preset_name}");
102113
}
103114
}
@@ -205,6 +216,7 @@ impl AmplifierApp {
205216
Message::Stage(idx, stage_msg) => {
206217
if self.update_stage(idx, stage_msg) {
207218
should_update_chain = true;
219+
should_update_stages = true
208220
}
209221
}
210222
}
@@ -213,6 +225,10 @@ impl AmplifierApp {
213225
self.update_processor_chain();
214226
}
215227

228+
if should_update_stages {
229+
self.stage_list.set_stages(&self.stages);
230+
}
231+
216232
Task::none()
217233
}
218234

@@ -308,14 +324,14 @@ impl AmplifierApp {
308324
self.processor_manager.set_amp_chain(chain);
309325
}
310326

311-
pub fn view(&self) -> Element<Message> {
327+
pub fn view(&self) -> Element<'_, Message> {
312328
use iced::widget::{column, container};
313329

314330
container(
315331
column![
316332
self.preset_bar.view(),
317-
StageList::new(&self.stages).view(),
318-
Control::new(self.selected_stage_type, self.is_recording).view()
333+
self.stage_list.view(),
334+
self.control_bar.view(self.is_recording),
319335
]
320336
.spacing(20)
321337
.padding(20),

src/gui/components/control.rs

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,32 @@ use crate::gui::messages::Message;
66

77
pub struct Control {
88
selected_stage_type: StageType,
9-
is_recording: bool,
109
}
1110

11+
const STAGE_TYPES: &[StageType] = &[
12+
StageType::Filter,
13+
StageType::Preamp,
14+
StageType::Compressor,
15+
StageType::ToneStack,
16+
StageType::PowerAmp,
17+
StageType::Level,
18+
];
19+
1220
impl Control {
13-
pub fn new(selected_stage_type: StageType, is_recording: bool) -> Self {
21+
pub fn new(selected_stage_type: StageType) -> Self {
1422
Self {
1523
selected_stage_type,
16-
is_recording,
1724
}
1825
}
1926

20-
pub fn view(&self) -> Element<'static, Message> {
21-
let stage_types = vec![
22-
StageType::Filter,
23-
StageType::Preamp,
24-
StageType::Compressor,
25-
StageType::ToneStack,
26-
StageType::PowerAmp,
27-
StageType::Level,
28-
];
27+
pub fn set_selected_stage_type(&mut self, ty: StageType) {
28+
self.selected_stage_type = ty;
29+
}
2930

31+
pub fn view(&self, is_recording: bool) -> Element<'_, Message> {
3032
let stage_controls = row![
3133
pick_list(
32-
stage_types,
34+
STAGE_TYPES,
3335
Some(self.selected_stage_type),
3436
Message::StageTypeSelected
3537
),
@@ -39,7 +41,7 @@ impl Control {
3941
.align_y(Alignment::Center);
4042

4143
// Recording controls
42-
let record_button = if self.is_recording {
44+
let record_button = if is_recording {
4345
button(text("Stop Recording"))
4446
.on_press(Message::StopRecording)
4547
.style(iced::widget::button::danger)
@@ -49,7 +51,7 @@ impl Control {
4951
.style(iced::widget::button::success)
5052
};
5153

52-
let recording_status = if self.is_recording {
54+
let recording_status = if is_recording {
5355
text("Recording...").style(|_| iced::widget::text::Style {
5456
color: Some(iced::Color::from_rgb(1.0, 0.3, 0.3)),
5557
})
@@ -76,4 +78,11 @@ impl Control {
7678
.width(Length::Fill)
7779
.into()
7880
}
81+
82+
pub fn set_selected(&mut self, t: StageType) {
83+
self.selected_stage_type = t;
84+
}
85+
pub fn selected(&self) -> StageType {
86+
self.selected_stage_type
87+
}
7988
}

src/gui/components/stage_list.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,20 @@ use crate::gui::components::stages;
55
use crate::gui::config::StageConfig;
66
use crate::gui::messages::Message;
77

8-
pub struct StageList<'a> {
9-
stages: &'a [StageConfig],
8+
pub struct StageList {
9+
stages: Vec<StageConfig>,
1010
}
1111

12-
impl<'a> StageList<'a> {
13-
pub fn new(stages: &'a [StageConfig]) -> Self {
12+
impl StageList {
13+
pub fn new(stages: Vec<StageConfig>) -> Self {
1414
Self { stages }
1515
}
1616

17-
pub fn view(&self) -> Element<'a, Message> {
17+
pub fn set_stages(&mut self, stages: &[StageConfig]) {
18+
self.stages = stages.to_vec();
19+
}
20+
21+
pub fn view(&self) -> Element<'_, Message> {
1822
let mut col = column![].spacing(10).width(Length::Fill);
1923

2024
for (idx, stage) in self.stages.iter().enumerate() {

src/gui/components/stages/compressor.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::gui::messages::{CompressorMessage, Message, StageMessage};
77

88
const HEADER_TEXT: &str = "Compressor";
99

10-
pub fn view(idx: usize, cfg: &CompressorConfig, total_stages: usize) -> Element<Message> {
10+
pub fn view(idx: usize, cfg: &CompressorConfig, total_stages: usize) -> Element<'_, Message> {
1111
let header = stage_header(HEADER_TEXT, idx, total_stages);
1212

1313
let body = column![

src/gui/components/stages/filter.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const FILTER_TYPES: [FilterType; 4] = [
1414
FilterType::Notch,
1515
];
1616

17-
pub fn view(idx: usize, cfg: &FilterConfig, total_stages: usize) -> Element<Message> {
17+
pub fn view(idx: usize, cfg: &FilterConfig, total_stages: usize) -> Element<'_, Message> {
1818
let header = stage_header(HEADER_TEXT, idx, total_stages);
1919

2020
let type_picker = row![

src/gui/components/stages/level.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::gui::messages::{LevelMessage, Message, StageMessage};
77

88
const HEADER_TEXT: &str = "Level";
99

10-
pub fn view(idx: usize, cfg: &LevelConfig, total_stages: usize) -> Element<Message> {
10+
pub fn view(idx: usize, cfg: &LevelConfig, total_stages: usize) -> Element<'_, Message> {
1111
let header = stage_header(HEADER_TEXT, idx, total_stages);
1212

1313
let body = column![labeled_slider(

src/gui/components/stages/poweramp.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const POWER_AMP_TYPES: [PowerAmpType; 3] = [
1313
PowerAmpType::ClassB,
1414
];
1515

16-
pub fn view(idx: usize, cfg: &PowerAmpConfig, total_stages: usize) -> Element<Message> {
16+
pub fn view(idx: usize, cfg: &PowerAmpConfig, total_stages: usize) -> Element<'_, Message> {
1717
let header = stage_header(HEADER_TEXT, idx, total_stages);
1818

1919
let type_picker = row![

src/gui/components/stages/preamp.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const CLIPPER_TYPES: [ClipperType; 5] = [
1515
ClipperType::ClassA,
1616
];
1717

18-
pub fn view(idx: usize, cfg: &PreampConfig, total_stages: usize) -> Element<Message> {
18+
pub fn view(idx: usize, cfg: &PreampConfig, total_stages: usize) -> Element<'_, Message> {
1919
let header = stage_header(HEADER_TEXT, idx, total_stages);
2020

2121
let clipper_picker = row![

0 commit comments

Comments
 (0)