3
3
use rodio:: source:: Source ;
4
4
use std:: f32:: consts:: PI ;
5
5
6
+ use super :: osc:: AnalogOsc ;
7
+
6
8
const SAMPLE_RATE : u32 = 48000 ; // The sample rate of the audio in Hz.
7
9
8
10
// The wave type of the oscillator
@@ -19,48 +21,69 @@ pub struct Oscillator {
19
21
freq : f32 ,
20
22
num_sample : usize , // The number of samples that have been played
21
23
wave_type : WaveType ,
24
+ osc : AnalogOsc ,
22
25
}
23
26
24
27
// Allow dead code is used because main.rs doesn't use all of the wave types, just one of them
25
28
// Without this, the compiler would complain about unused code.
26
29
impl Oscillator {
27
30
#[ allow( dead_code) ]
28
31
pub fn sine_wave ( freq : f32 ) -> Oscillator {
32
+
33
+ let mut osc = AnalogOsc :: new ( ) ;
34
+ osc. set_sample_rate ( SAMPLE_RATE as usize ) ;
35
+
29
36
// Create a new sine wave oscillator
30
37
Oscillator {
31
38
freq,
32
39
num_sample : 0 ,
33
40
wave_type : WaveType :: Sine ,
41
+ osc
34
42
}
35
43
}
36
44
37
45
#[ allow( dead_code) ]
38
46
pub fn square_wave ( freq : f32 ) -> Oscillator {
47
+
48
+ let mut osc = AnalogOsc :: new ( ) ;
49
+ osc. set_sample_rate ( SAMPLE_RATE as usize ) ;
50
+
39
51
// Create a new square wave oscillator
40
52
Oscillator {
41
53
freq,
42
54
num_sample : 0 ,
43
55
wave_type : WaveType :: Square ,
56
+ osc
44
57
}
45
58
}
46
59
47
60
#[ allow( dead_code) ]
48
61
pub fn sawtooth_wave ( freq : f32 ) -> Oscillator {
62
+
63
+ let mut osc = AnalogOsc :: new ( ) ;
64
+ osc. set_sample_rate ( SAMPLE_RATE as usize ) ;
65
+
49
66
// Create a new sawtooth wave oscillator
50
67
Oscillator {
51
68
freq,
52
69
num_sample : 0 ,
53
70
wave_type : WaveType :: Sawtooth ,
71
+ osc
54
72
}
55
73
}
56
74
57
75
#[ allow( dead_code) ]
58
76
pub fn triangle_wave ( freq : f32 ) -> Oscillator {
77
+
78
+ let mut osc = AnalogOsc :: new ( ) ;
79
+ osc. set_sample_rate ( SAMPLE_RATE as usize ) ;
80
+
59
81
// Create a new triangle wave oscillator
60
82
Oscillator {
61
83
freq,
62
84
num_sample : 0 ,
63
85
wave_type : WaveType :: Triangle ,
86
+ osc
64
87
}
65
88
}
66
89
}
@@ -77,10 +100,10 @@ impl Iterator for Oscillator {
77
100
let value = 2.0 * PI * self . freq * t;
78
101
79
102
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.
84
107
}
85
108
}
86
109
}
0 commit comments