Skip to content

Commit 42be683

Browse files
committed
#75 use AnalogOsc
1 parent 3321cc7 commit 42be683

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

examples/synth/src/synth/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ use rodio::Sink;
77
mod oscillator;
88
pub use oscillator::Oscillator;
99

10+
mod osc;
11+
use osc::AnalogOsc;
12+
1013
// The envelope state struct
1114
struct EnvelopeState {
1215
envelope: Envelope,

examples/synth/src/synth/oscillator.rs

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
use rodio::source::Source;
44
use std::f32::consts::PI;
55

6+
use super::osc::AnalogOsc;
7+
68
const SAMPLE_RATE: u32 = 48000; // The sample rate of the audio in Hz.
79

810
// The wave type of the oscillator
@@ -19,48 +21,69 @@ pub struct Oscillator {
1921
freq: f32,
2022
num_sample: usize, // The number of samples that have been played
2123
wave_type: WaveType,
24+
osc: AnalogOsc,
2225
}
2326

2427
// Allow dead code is used because main.rs doesn't use all of the wave types, just one of them
2528
// Without this, the compiler would complain about unused code.
2629
impl Oscillator {
2730
#[allow(dead_code)]
2831
pub fn sine_wave(freq: f32) -> Oscillator {
32+
33+
let mut osc = AnalogOsc::new();
34+
osc.set_sample_rate(SAMPLE_RATE as usize);
35+
2936
// Create a new sine wave oscillator
3037
Oscillator {
3138
freq,
3239
num_sample: 0,
3340
wave_type: WaveType::Sine,
41+
osc
3442
}
3543
}
3644

3745
#[allow(dead_code)]
3846
pub fn square_wave(freq: f32) -> Oscillator {
47+
48+
let mut osc = AnalogOsc::new();
49+
osc.set_sample_rate(SAMPLE_RATE as usize);
50+
3951
// Create a new square wave oscillator
4052
Oscillator {
4153
freq,
4254
num_sample: 0,
4355
wave_type: WaveType::Square,
56+
osc
4457
}
4558
}
4659

4760
#[allow(dead_code)]
4861
pub fn sawtooth_wave(freq: f32) -> Oscillator {
62+
63+
let mut osc = AnalogOsc::new();
64+
osc.set_sample_rate(SAMPLE_RATE as usize);
65+
4966
// Create a new sawtooth wave oscillator
5067
Oscillator {
5168
freq,
5269
num_sample: 0,
5370
wave_type: WaveType::Sawtooth,
71+
osc
5472
}
5573
}
5674

5775
#[allow(dead_code)]
5876
pub fn triangle_wave(freq: f32) -> Oscillator {
77+
78+
let mut osc = AnalogOsc::new();
79+
osc.set_sample_rate(SAMPLE_RATE as usize);
80+
5981
// Create a new triangle wave oscillator
6082
Oscillator {
6183
freq,
6284
num_sample: 0,
6385
wave_type: WaveType::Triangle,
86+
osc
6487
}
6588
}
6689
}
@@ -77,10 +100,10 @@ impl Iterator for Oscillator {
77100
let value = 2.0 * PI * self.freq * t;
78101

79102
match self.wave_type {
80-
WaveType::Sine => Some(value.sin()), // Sine wave
81-
WaveType::Square => Some(value.sin().signum()), // Signing the sine wave locks it to 1 or -1, making it a square wave.
82-
WaveType::Sawtooth => Some(2.0 * (t % (1.0 / self.freq)) * self.freq - 1.0), // Sawtooth wave using modulo.
83-
WaveType::Triangle => Some(value.sin().asin()), // The arcsine of the sine wave makes it a triangle wave.
103+
WaveType::Sine => Some(value.sin()), // Sine wave, no anti-aliasing needed
104+
WaveType::Square => Some(self.osc.tick_square(self.freq, 0.0, 0.0)),
105+
WaveType::Sawtooth => Some(self.osc.tick_saw(self.freq, 0.0, 0.0)),
106+
WaveType::Triangle => Some(value.sin().asin()), // The arcsine of the sine wave makes it a triangle wave. The MinBLEP AA method doesn't support triangle waves.
84107
}
85108
}
86109
}

0 commit comments

Comments
 (0)