distortion and reverb

This commit is contained in:
2025-10-05 23:57:23 -05:00
parent 47802ba782
commit 9a47b28fdb
+44 -3
View File
@@ -1,11 +1,12 @@
use std::ops::RangeInclusive;
use std::time::Duration;
use eframe::egui;
use eframe::egui::{Context, Id, Label, Slider, Window};
use eframe::egui::{Checkbox, Context, Id, Label, Slider, Window};
use rodio::mixer::MixerSource;
use rodio::Source;
use rodio::source::{SawtoothWave, SineWave, SquareWave, TriangleWave, WhiteUniform};
use serde::{Deserialize, Serialize};
use crate::envelope::{Envelope, EnvelopeSource};
use crate::envelope::Envelope;
use crate::gui::Showable;
#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq)]
@@ -15,6 +16,12 @@ pub struct Timbre {
square: f32,
sawtooth: f32,
noise: f32,
d_gain: f32,
d_thresh: f32,
reverb: f32,
reverb_duration: f32,
filter: bool,
filter_q: f32,
envelope: Envelope
}
@@ -26,13 +33,19 @@ impl Default for Timbre {
square: 1.0,
sawtooth: 0.0,
noise: 0.0,
d_gain: 1.0,
d_thresh: 10.0,
reverb: 0.0,
reverb_duration: 0.0,
filter: false,
filter_q: 50.0,
envelope: Default::default(),
}
}
}
impl Timbre {
pub fn source(&self, frequency: f32) -> EnvelopeSource<MixerSource> {
pub fn source(self, frequency: f32) -> impl Source {
let (mixer, source) = rodio::mixer::mixer(1, 44100);
if self.sine > 0.0 {
mixer.add(SineWave::new(frequency).amplify(self.sine))
@@ -49,7 +62,18 @@ impl Timbre {
if self.noise > 0.0 {
mixer.add(WhiteUniform::new(44100).amplify(self.noise))
}
let source = source.distortion(self.d_gain, self.d_thresh);
let source = source.buffered().reverb(Duration::from_millis((self.reverb_duration * 1000.0) as u64), self.reverb);
self.envelope.modulate(source)
// let (mixer2, m2source) = rodio::mixer::mixer(1, 44100);
// if self.filter {
// // let source = source.low_pass((frequency * self.filter_q) as u32);
// // mixer2.add(self.envelope.modulate(source));
// } else {
// mixer2.add(self.envelope.modulate(source));
// }
// m2source
}
}
@@ -98,6 +122,23 @@ impl Showable<(Id, String)> for (&mut Timbre, &mut bool, &mut String) {
ui.add(Label::new("Release"));
ui.add(Slider::new(&mut self.0.envelope.release, RangeInclusive::new(0.0, 1.0)));
ui.end_row();
ui.add(Label::new("Dist. Gain"));
ui.add(Slider::new(&mut self.0.d_gain, RangeInclusive::new(-10.0, 10.0)));
ui.add(Label::new("Reverb"));
ui.add(Slider::new(&mut self.0.reverb, RangeInclusive::new(0.0, 1.0)));
ui.end_row();
ui.add(Label::new("Dist. Thresh"));
ui.add(Slider::new(&mut self.0.d_thresh, RangeInclusive::new(0.0, 10.0)));
ui.add(Label::new("Rev. Duration"));
ui.add(Slider::new(&mut self.0.reverb_duration, RangeInclusive::new(0.0, 1.0)));
ui.end_row();
// ui.add(Checkbox::new(&mut self.0.filter, "Filter"));
// ui.end_row();
// ui.add(Label::new("Bandwidth"));
// ui.add_enabled(self.0.filter, Slider::new(&mut self.0.filter_q, RangeInclusive::new(0.0, 100.0)));
});
});