|
|
@@ -0,0 +1,146 @@ |
|
|
|
// Advanced Microcontroller-based Audio Workshop |
|
|
|
// |
|
|
|
// Part 2-8: Oscillators |
|
|
|
|
|
|
|
#include <Bounce.h> |
|
|
|
|
|
|
|
Bounce button0 = Bounce(0, 15); |
|
|
|
Bounce button1 = Bounce(1, 15); // 15 = 15 ms debounce time |
|
|
|
Bounce button2 = Bounce(2, 15); |
|
|
|
|
|
|
|
|
|
|
|
/////////////////////////////////// |
|
|
|
// copy the Design Tool code here |
|
|
|
/////////////////////////////////// |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void setup() { |
|
|
|
Serial.begin(9600); |
|
|
|
AudioMemory(20); |
|
|
|
sgtl5000_1.enable(); |
|
|
|
sgtl5000_1.volume(0.32); |
|
|
|
|
|
|
|
pinMode(0, INPUT_PULLUP); |
|
|
|
pinMode(1, INPUT_PULLUP); |
|
|
|
pinMode(2, INPUT_PULLUP); |
|
|
|
mixer1.gain(0, 0.75); |
|
|
|
mixer1.gain(1, 0.0); |
|
|
|
mixer1.gain(2, 0.0); |
|
|
|
mixer1.gain(3, 0.0); |
|
|
|
mixer2.gain(0, 0.15); |
|
|
|
mixer2.gain(1, 0.0); |
|
|
|
mixer2.gain(2, 0.0); |
|
|
|
mixer2.gain(3, 0.0); |
|
|
|
waveform1.begin(WAVEFORM_SAWTOOTH); |
|
|
|
waveform1.amplitude(0.75); |
|
|
|
waveform1.frequency(50); |
|
|
|
waveform1.pulseWidth(0.15); |
|
|
|
sine_fm1.frequency(440); |
|
|
|
sine_fm1.amplitude(0.75); |
|
|
|
sine1.frequency(200); |
|
|
|
sine1.amplitude(0.75); |
|
|
|
pink1.amplitude(0.75); |
|
|
|
envelope1.attack(10); |
|
|
|
envelope1.hold(10); |
|
|
|
envelope1.decay(25); |
|
|
|
envelope1.sustain(0.4); |
|
|
|
envelope1.release(70); |
|
|
|
} |
|
|
|
|
|
|
|
int waveform_type = WAVEFORM_SAWTOOTH; |
|
|
|
int mixer1_setting = 0; |
|
|
|
int mixer2_setting = 0; |
|
|
|
elapsedMillis timeout = 0; |
|
|
|
bool mixer2_envelope = false; |
|
|
|
|
|
|
|
void loop() { |
|
|
|
button0.update(); |
|
|
|
button1.update(); |
|
|
|
button2.update(); |
|
|
|
|
|
|
|
// Left changes the type of control waveform |
|
|
|
if (button0.fallingEdge()) { |
|
|
|
Serial.print("Control waveform: "); |
|
|
|
if (waveform_type == WAVEFORM_SAWTOOTH) { |
|
|
|
waveform_type = WAVEFORM_SINE; |
|
|
|
Serial.println("Sine"); |
|
|
|
} else if (waveform_type == WAVEFORM_SINE) { |
|
|
|
waveform_type = WAVEFORM_SQUARE; |
|
|
|
Serial.println("Square"); |
|
|
|
} else if (waveform_type == WAVEFORM_SQUARE) { |
|
|
|
waveform_type = WAVEFORM_TRIANGLE; |
|
|
|
Serial.println("Triangle"); |
|
|
|
} else if (waveform_type == WAVEFORM_TRIANGLE) { |
|
|
|
waveform_type = WAVEFORM_PULSE; |
|
|
|
Serial.println("Pulse"); |
|
|
|
} else if (waveform_type == WAVEFORM_PULSE) { |
|
|
|
waveform_type = WAVEFORM_SAWTOOTH; |
|
|
|
Serial.println("Sawtooth"); |
|
|
|
} |
|
|
|
waveform1.begin(waveform_type); |
|
|
|
} |
|
|
|
|
|
|
|
// middle button switch which source we hear from mixer1 |
|
|
|
if (button1.fallingEdge()) { |
|
|
|
mixer1_setting = mixer1_setting + 1; |
|
|
|
if (mixer1_setting == 0) { |
|
|
|
mixer1.gain(0, 0.75); |
|
|
|
mixer1.gain(1, 0.0); |
|
|
|
mixer1.gain(2, 0.0); |
|
|
|
mixer1.gain(3, 0.0); |
|
|
|
Serial.println("Mixer1: Control oscillator"); |
|
|
|
} else if (mixer1_setting == 1) { |
|
|
|
mixer1.gain(0, 0.0); |
|
|
|
mixer1.gain(1, 0.75); |
|
|
|
mixer1.gain(2, 0.0); |
|
|
|
mixer1.gain(3, 0.0); |
|
|
|
Serial.println("Mixer1: Frequency Modulated Oscillator"); |
|
|
|
} else if (mixer1_setting == 2) { |
|
|
|
mixer1.gain(0, 0.0); |
|
|
|
mixer1.gain(1, 0.0); |
|
|
|
mixer1.gain(2, 0.75); |
|
|
|
mixer1.gain(3, 0.0); |
|
|
|
Serial.println("Mixer1: Regular Sine Wave Oscillator"); |
|
|
|
} else if (mixer1_setting == 3) { |
|
|
|
mixer1.gain(0, 0.0); |
|
|
|
mixer1.gain(1, 0.0); |
|
|
|
mixer1.gain(2, 0.0); |
|
|
|
mixer1.gain(3, 0.75); |
|
|
|
Serial.println("Mixer1: Pink Noise"); |
|
|
|
mixer1_setting = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Right button activates the envelope |
|
|
|
if (button2.fallingEdge()) { |
|
|
|
mixer2.gain(0, 0.0); |
|
|
|
mixer2.gain(1, 1.0); |
|
|
|
mixer2_envelope = true; |
|
|
|
timeout = 0; |
|
|
|
envelope1.noteOn(); |
|
|
|
} |
|
|
|
if (button2.risingEdge()) { |
|
|
|
envelope1.noteOff(); |
|
|
|
timeout = 0; |
|
|
|
} |
|
|
|
|
|
|
|
// after 4 seconds of inactivity, go back to |
|
|
|
// steady listening intead of the envelope |
|
|
|
if (mixer2_envelope == true && timeout > 4000) { |
|
|
|
mixer2.gain(0, 0.15); |
|
|
|
mixer2.gain(1, 0.0); |
|
|
|
mixer2_envelope = false; |
|
|
|
} |
|
|
|
|
|
|
|
// use the knobs to adjust parameters |
|
|
|
//float knob1 = (float)analogRead(A1) / 1023.0; |
|
|
|
float knob2 = (float)analogRead(A2) / 1023.0; |
|
|
|
float knob3 = (float)analogRead(A3) / 1023.0; |
|
|
|
waveform1.frequency(360 * knob2 + 0.25); |
|
|
|
sine_fm1.frequency(knob3 * 1500 + 50); |
|
|
|
sine1.frequency(knob3 * 1500 + 50); |
|
|
|
} |
|
|
|
|
|
|
|
|