This is a holiday example. The sketch plays all the songs in a folder randomly.
This sketch randomly plays all the songs in a folder. You can control the volume, play/pause/stop/next, and ff/rew using serial input (from the IDE).
Throw a bunch of your favorite holiday songs in a folder named “XMAS” on your SD card, stick it in the rMP3, and run the sketch.
#include <RogueSD.h> #include <RogueMP3.h> #include <NewSoftSerial.h> NewSoftSerial rmp3_serial(6, 7); RogueMP3 rmp3(rmp3_serial); RogueSD filecommands(rmp3_serial); int numberOfSongs; int lastSong; char path[96]; const char *directory = "/XMAS"; void setup() { Serial.begin(9600); Serial.println("Merry Xmas!"); rmp3_serial.begin(9600); rmp3.sync(); rmp3.stop(); filecommands.sync(); // mix up our random number generator randomSeed(analogRead(0)); // get the number of songs available strcpy(path, directory); strcat(path, "/"); strcat(path, "*.mp3"); // we have to do this because the IDE thinks that "/*" needs to be terminated everywhere numberOfSongs = filecommands.filecount(path); lastSong = -1; } void playNextSong() { uint8_t s, i; char filename[80]; char path[96]; int nextSong = 0; if (numberOfSongs > 0) { // Select our next song randomly if (numberOfSongs > 2) { do nextSong = random(numberOfSongs); while (nextSong == lastSong); } else if (numberOfSongs == 2) { // we only have two songs if (lastSong == 0) nextSong = 1; else nextSong = 0; } // now, get our file name from file list filecommands.opendir(directory); for (i = 0; i <= nextSong; i++) { filecommands.readdir(filename, "*.mp3"); } strcpy(path, directory); strcat(path, "/"); strcat(path, filename); rmp3.playfile(path); Serial.print("Playing: "); Serial.println(path); lastSong = nextSong; } else { Serial.println("No files to play."); } } void loop() { char c; uint8_t i; uint8_t lastvolume = 20; int16_t newtime; playbackinfo playinfo; char status = 'S'; uint8_t playing = 1; uint8_t volume = 20; uint8_t boostOn = false; volume = rmp3.getvolume(); // this only gets the left volume playNextSong(); while(1) { while(!Serial.available()) { // we should do fancy stuff like flash lights on our Xmas tree here! // got lots of time! delay(200); status = rmp3.getplaybackstatus(); playinfo = rmp3.getplaybackinfo(); if (status == 'S' && playing) playNextSong(); } // OOH!! got a character! c = Serial.read(); switch(c) { case 'p': // pause if(status == 'D') { // fade in rmp3.playpause(); rmp3.fade(volume, 400); } else if(status == 'P') { // fade out rmp3.fade(100, 400); rmp3.playpause(); } else { // start playing playNextSong(); playing = 1; } break; case 's': rmp3.stop(); playing = 0; break; case 'n': playNextSong(); playing = 1; break; case 'e': if(boostOn) { rmp3.setboost(0); boostOn = false; } else { rmp3.setboost(8, 6, 7, 3); boostOn = true; } break; case 'a': // jump back 5 seconds newtime = playinfo.position - 5; if (newtime < 0) newtime = 0; rmp3.jump(newtime); break; case 'd': // jump forward 5 seconds rmp3.jump(playinfo.position + 5); break; case 'k': if(volume < 254) volume++; if(status != 'D') rmp3.setvolume(volume); break; case 'i': if(volume > 0) volume--; if(status != 'D') rmp3.setvolume(volume); break; } } }
Discussion
Last Christmas my Arduino ran our Christmas lights using AC relay (stage light dimmers). I guess this Christmas there will be music too.