| @@ -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); | |||
| } | |||