#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>
#include <LiquidCrystal.h>
#include "Variables.h"
#define REDLITE 33
#define GREENLITE 36
#define BLUELITE 37
// GUItool: begin automatically generated code
AudioSynthWaveform waveform1; //xy=231,240
AudioOutputI2S i2s1; //xy=390,239
AudioConnection patchCord1(waveform1, 0, i2s1, 0);
AudioConnection patchCord2(waveform1, 0, i2s1, 1);
AudioControlSGTL5000 sgtl5000_1; //xy=403,300
// GUItool: end automatically generated code
LiquidCrystal lcd (16, 22, 24, 25, 28, 29);
namespace mux
{
byte s0 = 6;
byte s1 = 9;
byte s2 = 10;
int muxIn0 = A2;
int muxIn1 = A3;
int muxIn2 = A12;
}
namespace shiftReg
{
const int dataPin = 12;
const int clockPin = 14;
const int latchPin = 11;
const int numBits = 8;
byte lastState = LOW;
unsigned long lastStateChange = 0;
}
namespace globEnc
{
byte encoder0PinA = 0;
byte encoder0PinB = 1;
int encoder0Pos0 = 0;
int encoder0PinALast0 = LOW;
int n0 = LOW;
byte encoder0PinC = 2;
byte encoder0PinD = 3;
int encoder0Pos1 = 0;
int encoder0PinALast1 = LOW;
int n1 = LOW;
byte encoder0PinE = 4;
byte encoder0PinF = 5;
int encoder0Pos2 = 0;
int encoder0PinALast2 = LOW;
int n2 = LOW;
}
namespace opCtrl
{
float ratioVal[21] = {0.16667,0.1818,0.2,0.2222,0.25,0.2857,0.33333,0.4,0.5,0.25,1.0,1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0};
float ratio0 = 1.0;
float ratio1 = 1.0;
float ratio2 = 1.0;
}
namespace ctrls
{
byte fmLoc1;
float amp1;
float fdbk1;
byte fdbkLoc1;
byte fmLoc2;
float amp2;
float fdbk2;
byte fdbkLoc2;
byte fmLoc3;
float amp3;
float fdbk3;
byte fdbkLoc3;
float coarse;
float fine;
float amp0;
float fdbk0;
byte fdbkLoc0;
int att;
int hol;
int dec;
int sus;
int rel;
int fulatt;
int fulhol;
int fuldec;
int fulsus;
int fulrel;
}
void setup ()
{
Serial.begin (115200);
AudioMemory (300);
AudioNoInterrupts ();
sgtl5000_1.enable ();
sgtl5000_1.volume(0.45);
waveform1.begin (WAVEFORM_SINE);
waveform1.amplitude (0.45);
waveform1.frequency (264);
usbMIDI.setHandleNoteOff (midiNoteOff);
usbMIDI.setHandleNoteOn (midiNoteOn);
using namespace globEnc;
pinMode (encoder0PinA, INPUT);
pinMode (encoder0PinB, INPUT);
pinMode (encoder0PinC, INPUT);
pinMode (encoder0PinD, INPUT);
pinMode (encoder0PinE, INPUT);
pinMode (encoder0PinF, INPUT);
using namespace mux;
pinMode (s0, OUTPUT);
pinMode (s1, OUTPUT);
pinMode (s2, OUTPUT);
using namespace shiftReg;
pinMode (dataPin, INPUT);
pinMode (clockPin, OUTPUT);
pinMode (latchPin, OUTPUT);
lcd.begin (20, 4);
lcd.print ("RGB 20x4 Display ");
lcd.setCursor (0,1);
lcd.print (" Multicolor LCD ");
pinMode (REDLITE, OUTPUT);
pinMode (GREENLITE, OUTPUT);
pinMode (BLUELITE, OUTPUT);
}
void loop ()
{
usbMIDI.read ();
updateMux ();
encoder ();
sRegister ();
lcdHello ();
}
void updateMux ()
{
using namespace mux;
using namespace ctrls;
for (byte state = 0; state < 8; state++)
{
digitalWrite (s0, HIGH && (state & B00000001));
digitalWrite (s1, HIGH && (state & B00000010));
digitalWrite (s2, HIGH && (state & B00000100));
switch (state)
{
case 0: amp2 = analogRead (muxIn0);
amp3 = analogRead (muxIn1);
fulatt = analogRead (muxIn2);
break;
case 1: fdbk1 = analogRead (muxIn0);
fdbk3 = analogRead (muxIn1);
fulrel = analogRead (muxIn2);
break;
case 2: amp1 = analogRead (muxIn0);
rel = analogRead (muxIn1);
fuldec = analogRead (muxIn2);
break;
case 3: fdbk2 = analogRead (muxIn0);
break;
case 4: amp0 = analogRead (muxIn0);
sus = analogRead (muxIn1);
break;
case 5: coarse = analogRead (muxIn0);
break;
case 6: fdbk0 = analogRead (muxIn0);
dec = analogRead (muxIn1);
fulsus = analogRead (muxIn2);
break;
case 7: fine = analogRead (muxIn0);
att = analogRead (muxIn1);
break;
}
}
}
void sRegister ()
{
using namespace shiftReg;
digitalWrite(latchPin, LOW);
digitalWrite(latchPin, HIGH);
for (int x = 0; x < numBits; x++) {
if (millis () - lastStateChange > 100) {
byte currentState = digitalRead (dataPin);
if (currentState != lastState) {
lastStateChange = millis();
lastState = currentState;
if (currentState == LOW) {
Serial.print(x);
Serial.print(": ON");
Serial.println();
}
}
}
digitalWrite (clockPin, HIGH);
digitalWrite (clockPin, LOW);
}
}
void encoder ()
{
using namespace globEnc;
using namespace opCtrl;
n0 = digitalRead (encoder0PinA);
if ((encoder0PinALast0 == LOW) && (n0 == HIGH))
{
if (digitalRead (encoder0PinB) == LOW)
{
encoder0Pos0 = encoder0Pos0 + 1;
if (encoder0Pos0 > 30)
{
encoder0Pos0 = 30;
}
} else {
encoder0Pos0 = encoder0Pos0 - 1;
if (encoder0Pos0 < 1)
{
encoder0Pos0 = 1;
}
}
if (encoder0Pos0 < 15) {
float x = encoder0Pos0;
x = x / 15.0;
Serial.println(x);
}
if (encoder0Pos0 > 15) {
float x = encoder0Pos0;
x = x - 15.0;
Serial.println(x);
}
}
encoder0PinALast0 = n0;
n1 = digitalRead (encoder0PinC);
if ((encoder0PinALast1 == LOW) && (n1 == HIGH))
{
if (digitalRead (encoder0PinD) == LOW)
{
encoder0Pos1 = encoder0Pos1 + 1;
if (encoder0Pos1 > 30)
{
encoder0Pos1 = 30;
}
} else {
encoder0Pos1 = encoder0Pos1 - 1;
if (encoder0Pos1 < 1)
{
encoder0Pos1 = 1;
}
}
if (encoder0Pos1 < 15) {
float x = encoder0Pos1;
x = x / 15.0;
Serial.println (x);
}
if (encoder0Pos1 > 15) {
float x = encoder0Pos1;
x = x - 15.0;
Serial.println (x);
}
}
encoder0PinALast1 = n1;
n2 = digitalRead (encoder0PinE);
if ((encoder0PinALast2 == LOW) && (n2 == HIGH))
{
if (digitalRead (encoder0PinF) == LOW)
{
encoder0Pos2 = encoder0Pos2 + 1;
if (encoder0Pos2 > 30)
{
encoder0Pos2 = 30;
}
} else {
encoder0Pos2 = encoder0Pos2 - 1;
if (encoder0Pos2 < 1)
{
encoder0Pos2 = 1;
}
}
if (encoder0Pos2 < 15) {
float x = encoder0Pos2;
x = x / 15.0;
Serial.println (x);
}
if (encoder0Pos2 > 15) {
float x = encoder0Pos2;
x = x - 15.0;
Serial.println (x);
}
}
encoder0PinALast2 = n2;
}
void lcdHello () {
float brightness = analogRead (A13);
float r = brightness * 0.2481;
//float g = brightness * 0.1036;
float g = brightness * 0.2481;
float b = brightness * 0.2481;
//Serial.println(b);
analogWrite (REDLITE, r);
analogWrite (GREENLITE, g);
analogWrite (BLUELITE, b);
}
void midiNoteOn (byte channel, byte note, byte velocity)
{
Serial.println (note);
float a = 440;
float freq = (a / 32) * pow (2, ((note - 9) / 12.0));
using namespace ctrls;
float total = coarse + fine;
freq = freq * total;
}
void midiNoteOff (byte channel, byte note, byte velocity)
{
Serial.println ("noteOFF");
}