/*************************************************** This is a short program to run a musical Christmas tree. Written by Mark Giovannetti 2016-03-12. NOTE: the SD object is global and comes from the music player code. Perhaps it should have been placed in the MusicTree as a member variable, but the effort didn't seem worth any questionable benefits. BSD license, all text above must be included in any redistribution ****************************************************/ #include "MusicTree.h" // includes SPI, MP3 (Adafruit music maker shield), NeoPixels and SD libraries // Create our musical tree object. MusicTree mtree; boolean musicEnabled = true; // Detect SD card failure and run the lights only // For expansion of patterns, a small pattern class. // Used for type and direction. Ranges are TODO class Pattern { public: boolean direction; // direction, true = forward, false = backward uint8_t pattern; // patternType (see MusicTree.h) uint8_t startRange; uint8_t endRange; Pattern() { direction = true; pattern = 0; startRange = 0; endRange = 0; } // end default ctor Pattern(boolean dir, uint8_t pat, uint8_t start, uint8_t end) { direction = dir; pattern = pat; startRange = start; endRange = end; } // end ctor }; // end class Pattern // We'll use an array of patterns for expandability #define NUM_PATTERNS 12 Pattern *patterns[NUM_PATTERNS]; uint8_t pattern = 0; // which pattern object to display (counter, cycles from 0 to NUM_PATTERNS-1) int red = 0; // colour variables int green = 0; int blue = 255; void setup() { Serial.begin(115200); Serial.print(F("Setup started ")); Serial.println(F("Adafruit VS1053 Library Test")); if (mtree.init()) { Serial.println(F("VS1053 found")); mtree.beep(); } else { mtree.beep(); // Make 10 tones to indicate music tree failure mtree.beep(); mtree.beep(); mtree.beep(); mtree.beep(); mtree.beep(); mtree.beep(); mtree.beep(); mtree.beep(); mtree.beep(); while (1); // don't do anything more } // end if init OK // Populate our patterns (ranges aren't used yet) // We cycle through them in loop() patterns[0] = new Pattern(true, 1, 0, 132); // dir, pat, start, end patterns[1] = new Pattern(false, 3, 0, 132); // dir, pat, start, end patterns[2] = new Pattern(true, 2, 0, 132); // dir, pat, start, end patterns[3] = new Pattern(false, 1, 0, 132); // dir, pat, start, end patterns[4] = new Pattern(true, 4, 0, 132); // dir, pat, start, end patterns[5] = new Pattern(false, 3, 0, 132); // dir, pat, start, end patterns[6] = new Pattern(true, 2, 0, 132); // dir, pat, start, end patterns[7] = new Pattern(false, 4, 0, 132); // dir, pat, start, end patterns[8] = new Pattern(true, 5, 0, 132); // dir, pat, start, end patterns[9] = new Pattern(false, 5, 0, 132); // dir, pat, start, end patterns[10] = new Pattern(true, 6, 0, 132); // dir, pat, start, end patterns[11] = new Pattern(false, 6, 0, 132); // dir, pat, start, end //patterns[12] = new Pattern(true, 2, 0, 132); // dir, pat, start, end //patterns[13] = new Pattern(false, 2, 0, 132); // dir, pat, start, end //patterns[14] = new Pattern(true, 2, 0, 132); // dir, pat, start, end //patterns[15] = new Pattern(false, 2, 0, 132); // dir, pat, start, end Serial.print(F("MusicTree init., track: ")); Serial.println(mtree.getCurrentTrack()); // Random numbers randomSeed(analogRead(0)); //mtree.beep(); // Make a tone to indicate VS1053 is working if (!SD.begin(CARDCS)) { Serial.println(F("SD failed, or not present")); mtree.beep(); // Make three tones to indicate SD card failure mtree.beep(); mtree.beep(); musicEnabled = false; // lights should still run. // while (1); } else { Serial.println(F("SD OK!")); } // end if SD // list files (good for debugging) //printDirectory(SD.open("/"), 0); } // end setup void loop() { if (musicEnabled) { // Check and set volume //Serial.println(F("Set vol")); mtree.setVolume(); // See if a button was pressed //Serial.println(F("Check butt")); mtree.checkButtons(); //if (mtree.musicPlayer->paused()) Serial.println("paused() true"); //if (mtree.musicPlayer->stopped()) Serial.println("stopped() true"); // Start playing a file, then we can do stuff while waiting for it to finish if (mtree.isPlaying()) { Serial.println(F("Playing")); } else if (!mtree.isStopped() && !mtree.isPaused()) { Serial.println(F("not stopped nor paused")); mtree.nextTrack(); } else { Serial.println(F("Stopped")); } // end if playing } // end if musicEnabled // Show a new pattern through each loop. mtree.setPatternType(patterns[pattern]->pattern); Serial.print(F("Pattern: ")); Serial.print(mtree.getPatternType()); mtree.setPatternDirection(patterns[pattern]->direction); Serial.print(F(", Direction: ")); Serial.print(mtree.getPatternDirection()); Serial.println(F(".")); mtree.showPattern(); pattern++; if (pattern > NUM_PATTERNS) pattern = 0; if (!musicEnabled) delay(25); // slow things down if there is no music //Serial.println(F("Bottom of loop")); // if (pattern > mtree.getNumPatterns()) pattern = 1; } // end loop /// File listing helper (code is from SD examples in music player library) void printDirectory(File dir, int numTabs) { while(true) { File entry = dir.openNextFile(); if (! entry) { // no more files Serial.println(F("**nomorefiles**")); break; } for (uint8_t i=0; i