#include <SD.h>
#include <Servo.h>
#include <LiquidCrystal.h>
//Setting lcd screen
LiquidCrystal lcd(12,11,5,4,3,2);
//Sets all servos as an object
Servo Slider1; //String E (Left most)
Servo Slider2; //String B
Servo Slider3; //String G
Servo Slider4; //String D
Servo Slider5; //String A
Servo Slider6; //String E (Right most)
//Fret Postions
int Start = 0; //starting Positon
int Mute = 10; //Muting string
int First = 25; //Hold down first fret
int Second = 110; //Hold down second fret
int Third = 180; //Hold down third fret
//Reading SD Card + Selecting song
const int chipSelect = 53; //SD reader pin
const int beginPin = 28;
const int upPin = 29;
const int downPin = 30;
//Start song
String song;
int Begin = 0;
int up = 0;
int down = 0;
int BPM = 0; //Beats per Minute
float BeatLength = 0; //Seconds per Beat
float Bar = 0; //Length to hold for tempo
int Capo = 0; //Capo placement, useless
String Pause;
int Hold = 0; //number of beats to hold the chord for
String Chord; //Saves Chord string
int i = 0;
File root;
File file;
void setup() {
Serial.begin(115200);
pinMode(beginPin, INPUT);
pinMode(upPin, INPUT);
pinMode(downPin, INPUT);
//Attaches servos to pins
Slider1.attach(22);
Slider2.attach(23);
Slider3.attach(24);
Slider4.attach(25);
Slider5.attach(26);
Slider6.attach(27);
//Sets all servos to starting position
Slider1.write(Start);
Slider2.write(Start);
Slider3.write(Start);
Slider4.write(Start);
Slider5.write(Start);
Slider6.write(Start);
lcd.begin(16,2);
lcd.display();
while (!Serial)
; //Delays until Serial monitor is connected
lcd.setCursor(0,0);lcd.println("Initializing");
lcd.setCursor(0,1);lcd.print("SD card...");
delay(1000);
if (!SD.begin(chipSelect))
{
lcd.clear();
lcd.setCursor(0,0);lcd.println("initializaiton");
lcd.setCursor(0,1);lcd.println("failed!");
lcd.println("Try again!");
while (true)
;
}
lcd.clear();
lcd.setCursor(0,0);lcd.println("initializiation");
lcd.setCursor(0,1);lcd.println("done!");
delay(1000);
lcd.clear();
lcd.setCursor(0,0);lcd.print("Press up or down");
lcd.setCursor(0,1);lcd.print("to scroll!");
}
void loop() {
up = digitalRead(upPin);
down = digitalRead(downPin);
Begin = digitalRead(beginPin);
if(up == HIGH || down == HIGH){
Serial.println("here");
root = SD.open("/");
printDirectory(root,i);
if(i>0){
if(up == HIGH){
i++;
}
else if(down == HIGH){
i--;
}
}
}
if (Begin == HIGH) {
lcd.clear();
lcd.setCursor(0,0);lcd.print("PLAYING: ");
lcd.setCursor(0,1);lcd.print(song);
delay(1000);
lcd.clear();
lcd.setCursor(0,0);lcd.print("IN ");
lcd.setCursor(0,1);lcd.print("3...");
delay(1000);
lcd.clear();
lcd.setCursor(0,0);lcd.print("2...");
delay(1000);
lcd.setCursor(0,1);lcd.print("1...");
delay(1000);
PlaySong();
}
delay(1000);
}
//Reads file and saves BPM, Capo, Chord, and Hold
void PlaySong() {
lcd.println("Playing song!");
file = SD.open(song);
int n = 0;
if (file) {
while (file.available()) {
if (n == 0) {
//Saves Beats per minute
String Beats = file.readStringUntil(',');
BPM = Beats.toInt();
BeatLength = 1/(BPM/60.0);
n++;
}
else if (n == 1) {
String CapoPlace = file.readStringUntil('\n');
Capo = CapoPlace.toInt();
n++;
}
else {
Chord = file.readStringUntil(',');
Pause = file.readStringUntil('\n');
Hold = Pause.toInt();
PlayChord();
}
}
lcd.clear();
lcd.setCursor(0,0);lcd.print("Song Finished!");
lcd.setCursor(0,1);lcd.print("Choose another?");
file.close();
ChordReset();
}
}
void PlayChord()
{
lcd.clear();
lcd.print(Chord); lcd.print(" for ");
lcd.println(Hold); lcd.print("Beats!");
if (Chord == "D")
{
Slider1.write(Mute);
Slider2.write(Mute);
Slider3.write(Start);
Slider4.write(Second);
Slider5.write(Third);
Slider6.write(Second);
}
else if (Chord == "A")
{
Slider1.write(Mute);
Slider2.write(Second);
Slider3.write(Second);
Slider4.write(Second);
Slider5.write(Start);
Slider6.write(Start);
}
else if (Chord == "C")
{
Slider1.write(Mute);
Slider2.write(Third);
Slider3.write(Second);
Slider4.write(Start);
Slider5.write(First);
Slider6.write(Start);
}
else if (Chord == "G")
{
Slider1.write(Third);
Slider2.write(Second);
Slider3.write(Start);
Slider4.write(Start);
Slider5.write(Start);
Slider6.write(Third);
}
else if (Chord == "E")
{
Slider1.write(Start);
Slider2.write(Second);
Slider3.write(Second);
Slider4.write(First);
Slider5.write(Start);
Slider6.write(Start);
}
else if (Chord == "A7")
{
Slider1.write(Mute);
Slider2.write(Start);
Slider3.write(Second);
Slider4.write(Start);
Slider5.write(Third);
Slider6.write(Start);
}
Bar = BeatLength * Hold;
//digitalWrite(ledpin, HIGH);
delay(Bar * 1000);
//digitalWrite(ledpin, LOW);
}
void ChordReset()
{
Slider1.write(Start);
Slider2.write(Start);
Slider3.write(Start);
Slider4.write(Start);
Slider5.write(Start);
Slider6.write(Start);
}
//Displays full library to serial monitor
void printDirectory(File dir, int numTabs)
{
int a = 0;
File entry;
while (true)
{
for(int j = 0; j<=i ; j++){
entry = dir.openNextFile();
}
if(!entry){
dir.rewindDirectory();
numTabs = 0;
i = 0;
a++;
}
if(a == 0){
lcd.clear();
lcd.print(numTabs+1);lcd.print(". "); lcd.print(entry.name());
song = entry.name();
a++;
Serial.println(a);
i++;
}
Serial.println(i);
Serial.println("Now here");
entry.close();
break;
}
}