You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
195 lines
4.7 KiB
C++
195 lines
4.7 KiB
C++
#include <MozziGuts.h>
|
|
#include <Oscil.h>
|
|
|
|
|
|
|
|
#include <tables/saw256_int8.h>
|
|
#include <Adafruit_ADS1015.h>
|
|
#include <Wire.h>
|
|
//#include <mozzi_fixmath.h>
|
|
//#include <utility/twi_nonblock.h>
|
|
|
|
#define CONTROL_RATE 128 // powers of 2 please
|
|
|
|
Oscil<SAW256_NUM_CELLS, AUDIO_RATE> tone_1(SAW256_DATA);
|
|
Oscil<SAW256_NUM_CELLS, AUDIO_RATE> tone_2(SAW256_DATA);
|
|
Oscil<SAW256_NUM_CELLS, AUDIO_RATE> tone_3(SAW256_DATA);
|
|
Oscil<SAW256_NUM_CELLS, AUDIO_RATE> tone_4(SAW256_DATA);
|
|
Oscil<SAW256_NUM_CELLS, AUDIO_RATE> tone_5(SAW256_DATA);
|
|
Oscil<SAW256_NUM_CELLS, AUDIO_RATE> tone_6(SAW256_DATA);
|
|
Oscil<SAW256_NUM_CELLS, AUDIO_RATE> tone_7(SAW256_DATA);
|
|
Oscil<SAW256_NUM_CELLS, AUDIO_RATE> tone_8(SAW256_DATA);
|
|
Oscil<SAW256_NUM_CELLS, AUDIO_RATE> tone_9(SAW256_DATA);
|
|
Oscil<SAW256_NUM_CELLS, AUDIO_RATE> tone_10(SAW256_DATA);
|
|
Oscil<SAW256_NUM_CELLS, AUDIO_RATE> tone_11(SAW256_DATA);
|
|
Oscil<SAW256_NUM_CELLS, AUDIO_RATE> tone_12(SAW256_DATA);
|
|
|
|
//multiplex adresses
|
|
Adafruit_ADS1115 adsa (0x48);
|
|
Adafruit_ADS1115 adsb (0x49);
|
|
Adafruit_ADS1115 adsc (0x4A);
|
|
Adafruit_ADS1115 adsd (0x4B);
|
|
|
|
int count= 0;
|
|
int TH;
|
|
int16_t adc0a, adc1a, adc2a, adc3a, adc0b, adc1b, adc2b, adc3b, adc0c, adc1c, adc2c, adc3c, adc0d, adc1d, adc2d, adc3d;
|
|
boolean note1 = false;
|
|
boolean note2 = false;
|
|
boolean note3 = false;
|
|
boolean codeswitch = false;
|
|
|
|
|
|
void setup(){
|
|
//set the gain for multiplexed ins
|
|
adsa.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2mV 0.125mV
|
|
adsb.setGain(GAIN_ONE);
|
|
adsc.setGain(GAIN_ONE);
|
|
adsd.setGain(GAIN_ONE);
|
|
|
|
//start the multiplexing
|
|
adsa.begin();
|
|
adsb.begin();
|
|
adsc.begin();
|
|
adsd.begin();
|
|
|
|
startMozzi(CONTROL_RATE);
|
|
|
|
//set tone frequency and phase
|
|
tone_1.setFreq(165);
|
|
tone_1.setPhase(0);
|
|
tone_2.setFreq(196);
|
|
tone_2.setPhase(30);
|
|
tone_3.setFreq(220);
|
|
tone_3.setPhase(60);
|
|
tone_4.setFreq(262);
|
|
tone_4.setPhase(90);
|
|
tone_5.setFreq(330);
|
|
tone_5.setPhase(120);
|
|
tone_6.setFreq(392);
|
|
tone_6.setPhase(150);
|
|
tone_7.setFreq(440);
|
|
tone_7.setPhase(180);
|
|
tone_8.setFreq(523);
|
|
tone_8.setPhase(210);
|
|
tone_9.setFreq(659);
|
|
tone_9.setPhase(240);
|
|
tone_10.setFreq(784);
|
|
tone_10.setPhase(270);
|
|
tone_11.setFreq(880);
|
|
tone_11.setPhase(300);
|
|
tone_12.setFreq(1047);
|
|
tone_12.setPhase(330);
|
|
|
|
//calibrate (set treshold)
|
|
TH = adsb.readADC_SingleEnded(3);
|
|
}
|
|
|
|
void updateControl(){
|
|
//log number of notes playing
|
|
if (adc0a < TH) {
|
|
count++;
|
|
}
|
|
if (adc1a < TH) {
|
|
count++;
|
|
}
|
|
if (adc2a < TH) {
|
|
count++;
|
|
}
|
|
if (adc3a < TH) {
|
|
count++;
|
|
}
|
|
if (adc0b < TH) {
|
|
count++;
|
|
}
|
|
if (adc1b < TH) {
|
|
count++;
|
|
}
|
|
if (adc2b < TH) {
|
|
count++;
|
|
}
|
|
if (adc3b < TH) {
|
|
count++;
|
|
}
|
|
if (adc0c < TH) {
|
|
count++;
|
|
}
|
|
if (adc1c < TH) {
|
|
count++;
|
|
}
|
|
if (adc2c < TH) {
|
|
count++;
|
|
}
|
|
if (adc3c < TH) {
|
|
count++;
|
|
}
|
|
}
|
|
|
|
|
|
int updateAudio(){
|
|
int result = 0;
|
|
|
|
//Play notes and mix down (according to notes playing
|
|
if (adc0a < TH) {
|
|
result += tone_1.next() * (1/count);
|
|
}
|
|
if (adc1a < TH) {
|
|
result += tone_2.next() * (1/count);
|
|
}
|
|
if (adc2a < TH) {
|
|
result += tone_3.next() * (1/count);
|
|
}
|
|
if (adc3a < TH) {
|
|
result += tone_4.next() * (1/count);
|
|
}
|
|
if (adc0b < TH) {
|
|
result += tone_5.next() * (1/count);
|
|
}
|
|
if (adc1b < TH) {
|
|
result += tone_6.next() * (1/count);
|
|
}
|
|
if (adc2b < TH) {
|
|
result += tone_7.next() * (1/count);
|
|
}
|
|
if (adc3b < TH) {
|
|
result += tone_8.next() * (1/count);
|
|
}
|
|
if (adc0c < TH) {
|
|
result += tone_9.next() * (1/count);
|
|
}
|
|
if (adc1c < TH) {
|
|
result += tone_10.next() * (1/count);
|
|
}
|
|
if (adc2c < TH) {
|
|
result += tone_11.next() * (1/count);
|
|
}
|
|
if (adc3c < TH) {
|
|
result += tone_12.next() * (1/count);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
void loop(){
|
|
//Messure LDR multiplex inputs
|
|
adc0a = adsa.readADC_SingleEnded(0);
|
|
adc1a = adsa.readADC_SingleEnded(1);
|
|
adc2a = adsa.readADC_SingleEnded(2);
|
|
adc3a = adsa.readADC_SingleEnded(3);
|
|
|
|
adc0b = adsb.readADC_SingleEnded(0);
|
|
adc1b = adsb.readADC_SingleEnded(1);
|
|
adc2b = adsb.readADC_SingleEnded(2);
|
|
adc3b = adsb.readADC_SingleEnded(3);
|
|
|
|
adc0c = adsc.readADC_SingleEnded(0);
|
|
adc1c = adsc.readADC_SingleEnded(1);
|
|
adc2c = adsc.readADC_SingleEnded(2);
|
|
adc3c = adsc.readADC_SingleEnded(3);
|
|
|
|
adc0d = adsd.readADC_SingleEnded(0);
|
|
adc1d = adsd.readADC_SingleEnded(1);
|
|
adc2d = adsd.readADC_SingleEnded(2);
|
|
adc3d = adsd.readADC_SingleEnded(3);
|
|
|
|
audioHook();
|
|
}
|