33use rodio:: source:: Source ;
44use std:: f32:: consts:: PI ;
55
6+ use super :: osc:: AnalogOsc ;
7+
68const 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.
2629impl 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