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