Well, here's the whole mess as it is making sounds now, lots of experimental this and that in there. Probably doesn't work right but spits out notes on the piezos I have hooked up. Will breadboard a digital pot to play with envelope generation for filtering and output. I think I need to get this whole thing working with millis(), I'm looking in bafflement at the TLC fades library for clues on how to handle envelope fading.
#include <Tone.h>
//Declare scale
#define scaleC 0
#define scaleC# 1
#define scaleD 2
#define scaleD# 3
#define scaleE 4
#define scaleF 5
#define scaleF# 6
#define scaleG 7
#define scaleG# 8
#define scaleA 9
#define scaleA# 10
#define scaleB 11
int NumVoices = 4;
int CurrentVoice;
int CurrentOctaveRange [] = {1, 2, 2, 1 };
int CurrentOctaveOffset [] = {4, 4, 4, 6 };
int NoteLength [4] = {1200,800,400,200};
unsigned long time;
unsigned long Lasttime = millis();
//TIME
//declare tone array!
Tone NotePlayer[4];
//SigOffsets
int C = 0;
int CS = 1;
int D = 2;
int DS = 3;
int E = 4;
int F = 5;
int FS = 6;
int G = 7;
int GS = 8;
int A = 9;
int AS = 10;
int B = 11;
int KeySig;
int ModeSig;
int OctaveRange;
int OctaveOffset;
int PlayNote;
int CurrentKeySig [] = {C, G, B, A};
int OctaveKeys[] = {C, CS, D, DS, E, F, FS, G, GS, A, AS, B };
int Major = 2773;
int Minor = 2906;
int Adonai = 3670;
int Algerian = 2937;
int Altered = 3498;
int Augmented = 2457;
int Blues = 2418;
int Chromatic = 4095;
int Arabic = 3289;
int Enigmatic = 3243;
int HalfDim = 2922;
int Bebop = 3449;
int HarmMaj = 2777;
int HarmMin = 2905;
int Hirajoshi = 3170;
int HuGypsy = 2875;
int HuMinor = 2873;
int Insen = 3162;
int Iwato = 2840;
int Locrian = 3434;
int Lydian = 2742;
int Hemitonic = 3352;
int Mixolydian = 2774;
int NeaMajor = 3413;
int NeaMinor = 3417;
int Octatonic = 3510;
int Persian = 3305;
int Phrygian = 3290;
int Prometheus = 2726;
int Slendro = 2642;
int Tritone = 3250;
int UkrDorian = 2869;
int WholeTon = 2730;
int CurrentModeSig [] = {Bebop, Bebop, Bebop, Bebop};
int Notes[] = {
NOTE_B0,
NOTE_C1,
NOTE_CS1,
NOTE_D1,
NOTE_DS1,
NOTE_E1,
NOTE_F1,
NOTE_FS1,
NOTE_G1,
NOTE_GS1,
NOTE_A1,
NOTE_AS1,
NOTE_B1,
NOTE_C2,
NOTE_CS2,
NOTE_D2,
NOTE_DS2,
NOTE_E2,
NOTE_F2,
NOTE_FS2,
NOTE_G2,
NOTE_GS2,
NOTE_A2,
NOTE_AS2,
NOTE_B2,
NOTE_C3,
NOTE_CS3,
NOTE_D3,
NOTE_DS3,
NOTE_E3,
NOTE_F3,
NOTE_FS3,
NOTE_G3,
NOTE_GS3,
NOTE_A3,
NOTE_AS3,
NOTE_B3,
NOTE_C4,
NOTE_CS4,
NOTE_D4,
NOTE_DS4,
NOTE_E4,
NOTE_F4,
NOTE_FS4,
NOTE_G4,
NOTE_GS4,
NOTE_A4,
NOTE_AS4,
NOTE_B4,
NOTE_C5,
NOTE_CS5,
NOTE_D5,
NOTE_DS5,
NOTE_E5,
NOTE_F5,
NOTE_FS5,
NOTE_G5,
NOTE_GS5,
NOTE_A5,
NOTE_AS5,
NOTE_B5,
NOTE_C6,
NOTE_CS6,
NOTE_D6,
NOTE_DS6,
NOTE_E6,
NOTE_F6,
NOTE_FS6,
NOTE_G6,
NOTE_GS6,
NOTE_A6,
NOTE_AS6,
NOTE_B6,
NOTE_C7,
NOTE_CS7,
NOTE_D7,
NOTE_DS7,
NOTE_E7,
NOTE_F7,
NOTE_FS7,
NOTE_G7,
NOTE_GS7,
NOTE_A7,
NOTE_AS7,
NOTE_B7,
NOTE_C8,
NOTE_CS8,
NOTE_D8,
NOTE_DS8
};
void setup()
{
NotePlayer[1].begin(41);
NotePlayer[2].begin(43);
NotePlayer[3].begin(45);
NotePlayer[4].begin(47);
}
void loop()
{
for (CurrentVoice = 0; CurrentVoice <= NumVoices-1; CurrentVoice++)
{
//time = millis();
if (NotePlayer[CurrentVoice].isPlaying() == false)
//if (time > Lasttime + NoteLength [CurrentVoice])
{
OctaveRange = CurrentOctaveRange[CurrentVoice];
OctaveOffset = CurrentOctaveOffset[CurrentVoice];
KeySig = CurrentKeySig[CurrentVoice];
ModeSig = CurrentModeSig[CurrentVoice];
int SelectNote = random ((OctaveRange*12));
if ((bitRead(ModeSig, SelectNote)) ==1)
{
PlayNote = (SelectNote + KeySig + OctaveOffset);
}
// else{return;}
if (PlayNote > (OctaveRange*12))
{
PlayNote = PlayNote - (OctaveRange*12);
}
//NotePlayer[CurrentVoice].stop();
NotePlayer[CurrentVoice].play(Notes[PlayNote], (NoteLength [CurrentVoice]));
randomSeed(analogRead(CurrentVoice));
//Lasttime = millis();
}
//else{return;}
}
}