distortion and reverb
This commit is contained in:
+44
-3
@@ -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)));
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user