#include #include #include #include "WaveUtil.h" #include "WaveHC.h" #include #include #define MAX_OUT_CHARS 16 //max nbr of characters to be sent on any one serial command char buffer[MAX_OUT_CHARS + 1]; //buffer used to format a line (+1 is for trailing 0) SdReader card; // This object holds the information for the card FatVolume vol; // This holds the information for the partition on the card FatReader root; // This holds the information for the filesystem on the card FatReader f; // This holds the information for the file we're play WaveHC wave; // This is the only wave (audio) object, since we will only play one at a time #define DEBOUNCE 100 // button debouncer int reading1 = 0; int currentsound = 0; // this handy function will return the number of bytes currently free in RAM, great for debugging! int freeRam(void) { extern int __bss_end; extern int *__brkval; int free_memory; if((int)__brkval == 0) { free_memory = ((int)&free_memory) - ((int)&__bss_end); } else { free_memory = ((int)&free_memory) - ((int)__brkval); } return free_memory; } void sdErrorCheck(void) { if (!card.errorCode()) return; putstring("\n\rSD I/O error: "); Serial.print(card.errorCode(), HEX); putstring(", "); Serial.println(card.errorData(), HEX); while(1); } uint32_t testnewsamplerate; int randomnumber = 0; int switchon = 0; int serialnumber = 0; int file; char* ext = ".wav"; String currentfile; void setup() { Wire.begin(3); // join i2c bus with address #4 Wire.onReceive(receiveEvent); // register event Serial.begin(9600); // start serial for output // set up serial port Serial.begin(9600); putstring_nl("WaveHC with 6 buttons"); putstring("Free RAM: "); // This can help with debugging, running out of RAM is bad Serial.println(freeRam()); // if this is under 150 bytes it may spell trouble! // Set the output pins for the DAC control. This pins are defined in the library pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); // pin13 LED pinMode(13, OUTPUT); // enable pull-up resistors on switch pins (analog inputs) digitalWrite(14, HIGH); digitalWrite(15, HIGH); digitalWrite(16, HIGH); digitalWrite(17, HIGH); digitalWrite(18, HIGH); digitalWrite(19, HIGH); // if (!card.init(true)) { //play with 4 MHz spi if 8MHz isn't working for you if (!card.init()) { //play with 8 MHz spi (default faster!) putstring_nl("Card init. failed!"); // Something went wrong, lets print out why sdErrorCheck(); while(1); // then 'halt' - do nothing! } // enable optimize read - some cards may timeout. Disable if you're having problems card.partialBlockRead(true); // Now we will look for a FAT partition! uint8_t part; for (part = 0; part < 5; part++) { // we have up to 5 slots to look in if (vol.init(card, part)) break; // we found one, lets bail } if (part == 5) { // if we ended up not finding one :( putstring_nl("No valid FAT partition!"); sdErrorCheck(); // Something went wrong, lets print out why while(1); // then 'halt' - do nothing! } // Lets tell the user about what we found putstring("Using partition "); Serial.print(part, DEC); putstring(", type is FAT"); Serial.println(vol.fatType(),DEC); // FAT16 or FAT32? // Try to open the root directory if (!root.openRoot(vol)) { putstring_nl("Can't open root dir!"); // Something went wrong, while(1); // then 'halt' - do nothing! } // Whew! We got past the tough parts. putstring_nl("Ready!"); } void loop() { reading1 = digitalRead(14); if (switchon==1) { sprintf(buffer,"%d.wav",file); playcomplete(buffer); switchon=0; } } int16_t lastpotval = 0; #define HYSTERESIS 3 void playcomplete(char *name) { int16_t potval; uint32_t newsamplerate; playfile(name); while (wave.isplaying) { potval = 545; if ( ((potval - lastpotval) > HYSTERESIS) || ((lastpotval - potval) > HYSTERESIS)) { newsamplerate = wave.dwSamplesPerSec; // get the original sample rate newsamplerate *= potval; // scale it by the analog value newsamplerate /= 512; // we want to 'split' between 2x sped up and slowed down. wave.setSampleRate(newsamplerate); // set it immediately! Serial.println(newsamplerate, DEC); // for debugging //lastpotval = potval; } delay(100); } } /* // Plays a full file from beginning to end with no pause. void playcomplete(char* name) { // call our helper to find and play this name playfile(name); while (wave.isplaying) { //wave.setSampleRate(22050); } // now its done playing } */ void playfile(char* name) { // see if the wave object is currently doing something if (wave.isplaying) {// already playing something, so stop it! wave.stop(); // stop it } // look in the root directory and open the file if (!f.open(root, name)) { putstring("Couldn't open file "); Serial.print(name); return; } // OK read the file and turn it into a wave object if (!wave.create(f)) { putstring_nl("Not a valid WAV"); return; } // ok time to play! start playback wave.play(); } void receiveEvent(int howMany) { while(1 < Wire.available()) // loop through all but the last { int a = Wire.receive(); // receive On int x = Wire.receive(); // receive directory int y = Wire.receive(); // receive bfile number switchon = a; serialnumber = x*100; // math to deterime directory file = serialnumber + y; //adds directory number to the file number } }