// Plays all WAV files from the root directory on the SD card #include #include #include #include // GUItool: begin automatically generated code AudioPlaySdResmp playSd1; //xy=324,457 AudioOutputI2S i2s2; //xy=840.8571472167969,445.5714416503906 AudioConnection patchCord1(playSd1, 0, i2s2, 0); AudioConnection patchCord2(playSd1, 1, i2s2, 1); AudioControlSGTL5000 audioShield; // GUItool: end automatically generated code #define A14 10 char** _filenames = nullptr; uint16_t _fileIndex = 0; uint16_t _numWaveFiles = 0; const int analogInPin = A14; unsigned long lastSamplePlayed = 0; double getPlaybackRate(int16_t analog) { //analog: 0..1023 return (analog - 512.0) / 512.0; } uint16_t getNumWavFilesInDirectory(char *directory); void populateFilenames(char *directory, char **filenames); void setup() { analogReference(0); pinMode(analogInPin, INPUT_DISABLE); // i.e. Analog Serial.begin(57600); if (!(SD.begin(BUILTIN_SDCARD))) { // stop here if no SD card, but print a message while (1) { Serial.println("Unable to access the SD card"); delay(500); } } audioShield.enable(); audioShield.volume(0.5); playSd1.enableInterpolation(true); int newsensorValue = analogRead(analogInPin); playSd1.setPlaybackRate(getPlaybackRate(newsensorValue)); _numWaveFiles = getNumWavFilesInDirectory("/"); Serial.printf("Num wave files: %d\n", _numWaveFiles); _filenames = new char*[_numWaveFiles]; populateFilenames("/", _filenames); AudioMemory(24); } void loop() { int newsensorValue = analogRead(analogInPin); playSd1.setPlaybackRate(getPlaybackRate(newsensorValue)); unsigned currentMillis = millis(); if (currentMillis > lastSamplePlayed + 1000) { if (!playSd1.isPlaying()) { if (playSd1.playWav(_filenames[_fileIndex])) { lastSamplePlayed = currentMillis; Serial.printf("playing %s\n", _filenames[_fileIndex]); } _fileIndex++; _fileIndex %= _numWaveFiles; Serial.print("Memory: "); Serial.print(AudioMemoryUsage()); Serial.print(","); Serial.print(AudioMemoryUsageMax()); Serial.println(); } } delay(10); } uint16_t getNumWavFilesInDirectory(char *directory) { File dir = SD.open(directory); uint16_t numWaveFiles = 0; while (true) { File files = dir.openNextFile(); if (!files) { //If no more files, break out. break; } String curfile = files.name(); //put file in string int m = curfile.lastIndexOf(".WAV"); int a = curfile.lastIndexOf(".wav"); int underscore = curfile.indexOf("_"); // if returned results is more then 0 add them to the list. if ((m > 0 || a > 0) && (underscore != 0)) { numWaveFiles++; } files.close(); } // close dir.close(); return numWaveFiles; } void populateFilenames(char *directory, char **filenames) { File dir = SD.open(directory); uint16_t index = 0; while (true) { File files = dir.openNextFile(); if (!files) { //If no more files, break out. break; } String curfile = files.name(); //put file in string int m = curfile.lastIndexOf(".WAV"); int a = curfile.lastIndexOf(".wav"); int underscore = curfile.indexOf("_"); // if returned results is more then 0 add them to the list. if ((m > 0 || a > 0) && (underscore != 0)) { filenames[index] = new char[curfile.length()+1] {0}; memcpy(filenames[index], curfile.c_str(), curfile.length()); index++; } files.close(); } // close dir.close(); } namespace std { void __throw_bad_function_call() {} void __throw_length_error(char const*) {} }