-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathoscillator.cpp
More file actions
45 lines (38 loc) · 1.28 KB
/
Copy pathoscillator.cpp
File metadata and controls
45 lines (38 loc) · 1.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include "oscillator.h"
#include <math.h>
Oscillator::Oscillator() {
set_frequency(440);
clock = 0;
gate = false;
voice_gain = 0.1f;
pulse_width_duty_cycle = 0.5;
}
void Oscillator::set_sample_rate(uint32_t rate) {
sample_rate = rate;
sample_period = 1.0 / static_cast<double>(rate);
}
void Oscillator::cycle() {
clock += sample_period;
update_sine(clock);
update_pulse(clock);
update_saw(clock);
}
void Oscillator::set_frequency(double f) {
frequency = f;
period = 1.0 / f;
}
void Oscillator::update_sine(double t){
sine_amplitude = std::sin(2 * M_PI * frequency * t) * voice_gain;
}
void Oscillator::update_pulse(double t){
//pulse_amplitude = std::sin(2 * M_PI * frequency * t);
//pulse_amplitude = (pulse_amplitude < 0) ? voice_gain : -(voice_gain);
pulse_amplitude = saw_amplitude - phased_saw_amplitude;
}
void Oscillator::update_saw(double t){
saw_amplitude = -(2.0 / M_PI) * std::atan(1.0/std::tan((M_PI * t) / period)) * voice_gain;
phased_saw_amplitude = -(2.0 / M_PI) * std::atan(1.0/std::tan(((M_PI * t) / period) + M_PI * pulse_width_duty_cycle)) * voice_gain;
}
void Oscillator::update_inverse_saw(double t){
inverse_saw_amplitude = (2.0 / M_PI) * std::atan(1.0/std::tan((M_PI * t) / period)) * voice_gain;
}