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::ops::RangeInclusive;
use std::time::Duration;
use eframe::egui; 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::mixer::MixerSource;
use rodio::Source; use rodio::Source;
use rodio::source::{SawtoothWave, SineWave, SquareWave, TriangleWave, WhiteUniform}; use rodio::source::{SawtoothWave, SineWave, SquareWave, TriangleWave, WhiteUniform};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::envelope::{Envelope, EnvelopeSource}; use crate::envelope::Envelope;
use crate::gui::Showable; use crate::gui::Showable;
#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq)] #[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq)]
@@ -15,6 +16,12 @@ pub struct Timbre {
square: f32, square: f32,
sawtooth: f32, sawtooth: f32,
noise: f32, noise: f32,
d_gain: f32,
d_thresh: f32,
reverb: f32,
reverb_duration: f32,
filter: bool,
filter_q: f32,
envelope: Envelope envelope: Envelope
} }
@@ -26,13 +33,19 @@ impl Default for Timbre {
square: 1.0, square: 1.0,
sawtooth: 0.0, sawtooth: 0.0,
noise: 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(), envelope: Default::default(),
} }
} }
} }
impl Timbre { 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); let (mixer, source) = rodio::mixer::mixer(1, 44100);
if self.sine > 0.0 { if self.sine > 0.0 {
mixer.add(SineWave::new(frequency).amplify(self.sine)) mixer.add(SineWave::new(frequency).amplify(self.sine))
@@ -49,7 +62,18 @@ impl Timbre {
if self.noise > 0.0 { if self.noise > 0.0 {
mixer.add(WhiteUniform::new(44100).amplify(self.noise)) 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) 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(Label::new("Release"));
ui.add(Slider::new(&mut self.0.envelope.release, RangeInclusive::new(0.0, 1.0))); ui.add(Slider::new(&mut self.0.envelope.release, RangeInclusive::new(0.0, 1.0)));
ui.end_row(); 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)));
}); });
}); });