#include <IRremote.h>
#include <Encoder.h>
#include <Bounce.h>
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>
// GUItool: begin automatically generated code
AudioInputI2SQuad i2s_quad2; //xy=62.5,113
AudioPlaySdWav playSdWav1; //xy=69,62
AudioPlaySdWav playSdWav2; //xy=83,216
AudioMixer4 mixer1; //xy=216,75
AudioMixer4 mixer2; //xy=218,145
AudioMixer4 mixer4; //xy=286,229
AudioMixer4 mixer3; //xy=348,145
AudioMixer4 mixer5; //xy=430,234
AudioMixer4 mixer6; //xy=439,52
AudioFilterStateVariable filter3; //xy=606,105
AudioFilterStateVariable filter4; //xy=607,164
AudioFilterStateVariable filter1; //xy=625,27.5
AudioFilterStateVariable filter2; //xy=759,30
AudioOutputI2SQuad i2s_quad1; //xy=932,127
AudioConnection patchCord1(i2s_quad2, 0, mixer2, 0);
AudioConnection patchCord2(i2s_quad2, 1, mixer2, 1);
AudioConnection patchCord3(i2s_quad2, 2, mixer1, 2);
AudioConnection patchCord4(i2s_quad2, 3, mixer1, 3);
AudioConnection patchCord5(playSdWav1, 0, mixer1, 0);
AudioConnection patchCord6(playSdWav1, 1, mixer1, 1);
AudioConnection patchCord7(playSdWav2, 0, mixer4, 0);
AudioConnection patchCord8(playSdWav2, 1, mixer4, 1);
AudioConnection patchCord9(mixer1, 0, mixer3, 0);
AudioConnection patchCord10(mixer2, 0, mixer3, 1);
AudioConnection patchCord11(mixer4, 0, mixer5, 1);
AudioConnection patchCord12(mixer3, 0, mixer5, 0);
AudioConnection patchCord13(mixer5, 0, mixer6, 0);
AudioConnection patchCord14(mixer6, 0, filter1, 0);
AudioConnection patchCord15(mixer6, 0, filter3, 0);
AudioConnection patchCord16(mixer6, 0, filter4, 0);
AudioConnection patchCord17(filter3, 2, i2s_quad1, 1);
AudioConnection patchCord18(filter4, 0, i2s_quad1, 2);
AudioConnection patchCord19(filter1, 0, filter2, 0);
AudioConnection patchCord20(filter2, 2, i2s_quad1, 3);
AudioConnection patchCord21(filter2, 2, i2s_quad1, 0);
AudioControlSGTL5000 sgtl5000_1; //xy=69,21
AudioControlSGTL5000 sgtl5000_2; //xy=219,20
// GUItool: end automatically generated code
#define SDCARD_CS_PIN 10
#define SDCARD_MOSI_PIN 7
#define SDCARD_SCK_PIN 14
#define NUM_BUTTONS 7 // number of remote buttons
#define RECV_PIN 5
const int ledPin1 = 4;
const int ledPin2 = 3;
uint16_t lastCode = 0;
const uint16_t BUTTON_1 = 0xFF30CF; //ir remote codes
const uint16_t BUTTON_2 = 0xFF18E7;
const uint16_t BUTTON_3 = 0xFF7A85;
const uint16_t BUTTON_STOP = 0xFF629D;
const uint16_t BUTTON_SD = 0xFFA25D;
const uint16_t BUTTON_LINE = 0xFFE21D;
const uint16_t BUTTON_FART1 = 0xFF52AD;
elapsedMillis blinkTime;
Bounce button2 = Bounce(2, 15); // 15 = 15 ms debounce time
IRrecv irrecv(RECV_PIN);
decode_results results;
Encoder myEnc(20, 21);
int chfreqsel = 1;
int fil1 = 5000;
int fil2 = 800;
int fil3 = 136;
int fil4 = 11000;
long oldPosition1 = 0;
long newPosition;
void setup() {
AudioMemory(60);
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
pinMode (RECV_PIN, INPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(2, INPUT_PULLUP);
SPI.setMOSI(SDCARD_MOSI_PIN);
SPI.setSCK(SDCARD_SCK_PIN);
if (!(SD.begin(SDCARD_CS_PIN))) {
while (1) {
Serial.println("Unable to access the SD card");
delay(500);
}
}
sgtl5000_1.setAddress(LOW);
sgtl5000_1.enable();
sgtl5000_1.lineOutLevel(13);
sgtl5000_1.lineInLevel(9);
sgtl5000_1.muteHeadphone();
sgtl5000_2.setAddress(HIGH);
sgtl5000_2.enable();
sgtl5000_2.lineOutLevel(13);
sgtl5000_2.lineInLevel(9);
sgtl5000_2.muteHeadphone();
// midrange output
filter2.frequency(136);
filter1.frequency(11000);
// toprange output
filter4.frequency(5000);
// lowrange output
filter3.frequency(800);
// sd music in
mixer1.gain(0, 0.0);
mixer1.gain(1, 0.0);
// line1/bluetooth
mixer1.gain(2, 0.5);
mixer1.gain(3, 0.5);
// line2/mic
mixer2.gain(0, 0.5);
mixer2.gain(1, 0.5);
// mix line2/mic with sd/line1
mixer3.gain(0, 0.5);
mixer3.gain(1, 0.5);
// sd fx
mixer4.gain(0, .5);
mixer4.gain(1, .5);
// mixes sd fx and line/sd
mixer5.gain(0, .5);
mixer5.gain(1, .5);
//master volume
mixer6.gain(0, 0);
}
void loop() {
button2.update();
if (button2.fallingEdge()) {
chfreqsel ++ ;
if (chfreqsel == 5) chfreqsel = 1;
}
if (chfreqsel == 1){
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, LOW);
long newPosition = myEnc.read()/4;
if (newPosition != oldPosition1) {
oldPosition1 = newPosition;
// Serial.println(newPosition);
fil1 = fil1 + newPosition * 10;
if (fil1>20000){
fil1 = 20000;}
if (fil1<20){
fil1 = 20;}
Serial.println(fil1);
filter4.frequency(fil1);
myEnc.write(0);}
}
if (chfreqsel == 2){
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);
long newPosition = myEnc.read()/4;
if (newPosition != oldPosition1) {
oldPosition1 = newPosition;
// Serial.println(newPosition);
fil2 = fil2 + newPosition * 10;
if (fil2>20000){
fil2 = 20000;}
if (fil2<20){
fil2 = 20;}
Serial.println(fil2);
filter3.frequency(fil2);
myEnc.write(0);}
}
if (chfreqsel == 3){
digitalWrite(ledPin2, LOW);
if (blinkTime < 250) {
digitalWrite(ledPin1, LOW);
} else if (blinkTime < 500) {
digitalWrite(ledPin1, HIGH);
} else {
blinkTime = 0;
}
long newPosition = myEnc.read()/4;
if (newPosition != oldPosition1) {
oldPosition1 = newPosition;
// Serial.println(newPosition);
fil3 = fil3 + newPosition * 10;
if (fil3>20000){
fil3 = 20000;}
if (fil3<20){
fil3 = 20;}
Serial.println(fil3);
filter2.frequency(fil3);
myEnc.write(0);}
}
if (chfreqsel == 4){
digitalWrite(ledPin1, LOW);
if (blinkTime < 250) {
digitalWrite(ledPin2, LOW);
} else if (blinkTime < 500) {
digitalWrite(ledPin2, HIGH);
} else {
blinkTime = 0;
}
long newPosition = myEnc.read()/4;
if (newPosition != oldPosition1) {
oldPosition1 = newPosition;
// Serial.println(newPosition);
fil4 = fil4 + newPosition * 10;
if (fil4>20000){
fil4 = 20000;}
if (fil4<20){
fil4 = 20;}
Serial.println(fil4);
filter1.frequency(fil4);
myEnc.write(0);}
}
{
// Pan between line1/sd music and mic while allowing sd fx to play over both
int knob1 = analogRead(A3);
float gain1 = (float)knob1 / 1023.0;
float gain2 = 1.0 - gain1;
// line1/sd in
mixer3.gain(0, gain1 );
// mic/line2 in
mixer3.gain(1, gain2 );
// Master volume
int knob = analogRead(A2);
float vol = (float)knob / 1023.0;
mixer6.gain(0,vol);
//Serial.print("volume = ");
// Serial.println(vol);
}
// ir buttons and decoder
{
if (irrecv.decode(&results)) {
uint16_t resultCode = (results.value & 0xFFFF);
if (resultCode == 0xFFFF)
resultCode = lastCode;
else
lastCode = resultCode;
switch (resultCode)
{
case BUTTON_1:
if (playSdWav1.isPlaying() == false)
// Serial.println("Start playing1");
playSdWav1.play("FIRE1.WAV");
delay(10); // wait for library to parse WAV info
break;
case BUTTON_2:
if (playSdWav1.isPlaying() == false)
// Serial.println("Start playing2");
playSdWav1.play("FIRE2.WAV");
delay(10); // wait for library to parse WAV info
break;
case BUTTON_3:
if (playSdWav1.isPlaying() == false)
// Serial.println("Start playing3");
playSdWav1.play("FIRE3.WAV");
delay(10); // wait for library to parse WAV info
break;
case BUTTON_STOP:
if (playSdWav1.isPlaying() == true)
// Serial.println("Stop");
playSdWav1.stop();
playSdWav2.stop();
// delay(10); // wait for library to parse WAV info
break;
case BUTTON_SD:
// sd music in
mixer1.gain(0, 0.5);
mixer1.gain(1, 0.5);
// line1/bluetooth
mixer1.gain(2, 0);
mixer1.gain(3, 0);
// Serial.println("SD ON, LINE ONE OFF");
break;
case BUTTON_LINE:
// sd music in
mixer1.gain(0, 0.0);
mixer1.gain(1, 0.0);
// line1/bluetooth
mixer1.gain(2, 0.5);
mixer1.gain(3, 0.5);
// Serial.println("SD OFF, LINE ONE ON");
break;
case BUTTON_FART1:
if (playSdWav2.isPlaying() == false)
// Serial.println("FART2");
playSdWav2.play("FART2.WAV");
delay(10); // wait for library to parse WAV info
break;
default:
Serial.print("Unrecognized code received: 0x");
Serial.println(results.value, HEX);
break;
}
irrecv.resume();
}
}
}