#include <SD.h>
#include <SPI.h>
#define SD_CS 10 // SD card CS pin
// Parameter data structure for potentiometers, arranged into banks for presets
const int numParamBanks = 3; // number of parameter banks
const int numParams = 5; // number of parameters in each bank
const int numPresets = 3; // number of presets containing the parameter banks
struct paramBank {
int parameter[numParamBanks][numParams];
} preset[numPresets];
void setup() {
// Necessary for SD card operation on Teensy with audio shield
SPI.setMOSI(7); // Audio shield has MOSI on pin 7
SPI.setSCK(14); // Audio shield has SCK on pin 14
Serial.begin(9600);
while (!Serial);
if (!SD.begin(SD_CS)) {
Serial.println("Initialization of SD card failed");
}
presetRandom();
for (int i=0; i < numPresets; i++) {
presetWrite(i);
}
presetInitialize();
for (int i=0; i < numPresets; i++) {
presetPrint(i);
}
for (int i=0; i < numPresets; i++) {
presetRead(i);
}
for (int i=0; i < numPresets; i++) {
presetPrint(i);
}
}
void loop() {
}
void presetRandom() {
Serial.println("Parameter initialization...");
for (int i=0; i < numPresets; i++) {
for (int j=0; j < numParamBanks; j++) {
for (int k=0; k < numParams; k++) {
preset[i].parameter[j][k] = random(1,1023);
}
}
}
}
void presetInitialize() {
Serial.println("Parameter initialization...");
for (int i=0; i < numPresets; i++) {
for (int j=0; j < numParamBanks; j++) {
for (int k=0; k < numParams; k++) {
preset[i].parameter[j][k] = 1;
}
}
}
}
void presetWrite(int presetNumber) {
if ((presetNumber >= 0) && (presetNumber < numPresets)) {
char filename[13];
String fname = "Preset" + String(presetNumber);
fname = fname + ".dat";
fname.toCharArray(filename,13);
if (SD.exists(filename)) {
Serial.print("Removing ");
Serial.println(filename);
SD.remove(filename);
}
Serial.print("Writing to ");
Serial.println(filename);
File presetFile = SD.open(filename,FILE_WRITE);
for (int j=0; j < numParamBanks; j++) {
for (int k=0; k < numParams; k++) {
presetFile.print(String(preset[presetNumber].parameter[j][k]));
presetFile.print(",");
Serial.print(String(preset[presetNumber].parameter[j][k]));
Serial.print(",");
}
}
Serial.println();
presetFile.close();
}
else {
Serial.print("Error in presetWrite: Preset number (");
Serial.print(presetNumber);
Serial.println(") is out of range.");
}
}
void presetRead(int presetNumber) {
if ((presetNumber >= 0) && (presetNumber < numPresets)) {
char filename[13];
String fname = "Preset" + String(presetNumber);
fname = fname + ".dat";
fname.toCharArray(filename,13);
Serial.print("Reading from ");
Serial.println(filename);
File presetFile = SD.open(filename,FILE_READ);
for (int j=0; j < numParamBanks; j++) {
for (int k=0; k < numParams; k++) {
preset[presetNumber].parameter[j][k] = presetFile.parseInt();
Serial.print(String(preset[presetNumber].parameter[j][k]));
Serial.print(" ");
}
}
Serial.println();
presetFile.close();
}
else {
Serial.print("Error in presetRead: Preset number (");
Serial.print(presetNumber);
Serial.println(") is out of range.");
}
}
void presetPrint(int presetNumber) {
Serial.print("Preset ");
Serial.print(presetNumber);
Serial.print(": ");
for (int j=0; j < numParamBanks; j++) {
for (int k=0; k < numParams; k++) {
Serial.print(preset[presetNumber].parameter[j][k]);
Serial.print(" ");
}
}
Serial.println();
Serial.println();
}