|
|
|
|
|
|
|
|
|
|
|
#include <Audio.h> |
|
|
|
|
|
#include <Wire.h> |
|
|
|
|
|
#include <SD.h> |
|
|
|
|
|
#include <SPI.h> |
|
|
|
|
|
#include <SerialFlash.h> |
|
|
|
|
|
|
|
|
|
|
|
#include "chords.h" |
|
|
|
|
|
|
|
|
|
|
|
// Special thanks to Matthew Rahtz - http://amid.fish/karplus-strong/ |
|
|
|
|
|
|
|
|
|
|
|
AudioSynthKarplusStrong string1; |
|
|
|
|
|
AudioSynthKarplusStrong string2; |
|
|
|
|
|
AudioSynthKarplusStrong string3; |
|
|
|
|
|
AudioSynthKarplusStrong string4; |
|
|
|
|
|
AudioSynthKarplusStrong string5; |
|
|
|
|
|
AudioSynthKarplusStrong string6; |
|
|
|
|
|
AudioMixer4 mixer1; |
|
|
|
|
|
AudioMixer4 mixer2; |
|
|
|
|
|
AudioOutputI2S i2s1; |
|
|
|
|
|
AudioConnection patchCord1(string1, 0, mixer1, 0); |
|
|
|
|
|
AudioConnection patchCord2(string2, 0, mixer1, 1); |
|
|
|
|
|
AudioConnection patchCord3(string3, 0, mixer1, 2); |
|
|
|
|
|
AudioConnection patchCord4(string4, 0, mixer1, 3); |
|
|
|
|
|
AudioConnection patchCord5(mixer1, 0, mixer2, 0); |
|
|
|
|
|
AudioConnection patchCord6(string5, 0, mixer2, 1); |
|
|
|
|
|
AudioConnection patchCord7(string6, 0, mixer2, 2); |
|
|
|
|
|
AudioConnection patchCord8(mixer2, 0, i2s1, 0); |
|
|
|
|
|
AudioConnection patchCord9(mixer2, 0, i2s1, 1); |
|
|
|
|
|
AudioControlSGTL5000 sgtl5000_1; |
|
|
|
|
|
|
|
|
|
|
|
const int finger_delay = 5; |
|
|
|
|
|
const int hand_delay = 220; |
|
|
|
|
|
|
|
|
|
|
|
int chordnum=0; |
|
|
|
|
|
|
|
|
|
|
|
void setup() { |
|
|
|
|
|
AudioMemory(15); |
|
|
|
|
|
sgtl5000_1.enable(); |
|
|
|
|
|
sgtl5000_1.volume(0.6); |
|
|
|
|
|
mixer1.gain(0, 0.15); |
|
|
|
|
|
mixer1.gain(1, 0.15); |
|
|
|
|
|
mixer1.gain(2, 0.15); |
|
|
|
|
|
mixer1.gain(3, 0.15); |
|
|
|
|
|
mixer2.gain(1, 0.15); |
|
|
|
|
|
mixer2.gain(2, 0.15); |
|
|
|
|
|
delay(700); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void strum_up(const float *chord, float velocity); |
|
|
|
|
|
void strum_dn(const float *chord, float velocity); |
|
|
|
|
|
|
|
|
|
|
|
void loop() { |
|
|
|
|
|
const float *chord; |
|
|
|
|
|
|
|
|
|
|
|
// each time through the loop, play a different chord |
|
|
|
|
|
if (chordnum == 0) { |
|
|
|
|
|
chord = Cmajor; |
|
|
|
|
|
Serial.println("C major"); |
|
|
|
|
|
chordnum = 1; |
|
|
|
|
|
} else if (chordnum == 1) { |
|
|
|
|
|
chord = Gmajor; |
|
|
|
|
|
Serial.println("G major"); |
|
|
|
|
|
chordnum = 2; |
|
|
|
|
|
} else if (chordnum == 2) { |
|
|
|
|
|
chord = Aminor; |
|
|
|
|
|
Serial.println("A minor"); |
|
|
|
|
|
chordnum = 3; |
|
|
|
|
|
} else { |
|
|
|
|
|
chord = Eminor; |
|
|
|
|
|
Serial.println("E minor"); |
|
|
|
|
|
chordnum = 0; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// then strum the 6 string several times |
|
|
|
|
|
strum_up(chord, 1.0); |
|
|
|
|
|
delay(hand_delay); |
|
|
|
|
|
delay(hand_delay); |
|
|
|
|
|
strum_up(chord, 1.0); |
|
|
|
|
|
delay(hand_delay); |
|
|
|
|
|
strum_dn(chord, 0.8); |
|
|
|
|
|
delay(hand_delay); |
|
|
|
|
|
delay(hand_delay); |
|
|
|
|
|
strum_dn(chord, 0.8); |
|
|
|
|
|
delay(hand_delay); |
|
|
|
|
|
strum_up(chord, 1.0); |
|
|
|
|
|
delay(hand_delay); |
|
|
|
|
|
strum_dn(chord, 0.8); |
|
|
|
|
|
delay(hand_delay); |
|
|
|
|
|
strum_up(chord, 1.0); |
|
|
|
|
|
delay(hand_delay); |
|
|
|
|
|
delay(hand_delay); |
|
|
|
|
|
strum_up(chord, 1.0); |
|
|
|
|
|
delay(hand_delay); |
|
|
|
|
|
strum_dn(chord, 0.7); |
|
|
|
|
|
delay(hand_delay); |
|
|
|
|
|
delay(hand_delay); |
|
|
|
|
|
strum_dn(chord, 0.7); |
|
|
|
|
|
delay(hand_delay); |
|
|
|
|
|
strum_up(chord, 1.0); |
|
|
|
|
|
delay(hand_delay); |
|
|
|
|
|
strum_dn(chord, 0.7); |
|
|
|
|
|
delay(hand_delay); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void strum_up(const float *chord, float velocity) |
|
|
|
|
|
{ |
|
|
|
|
|
if (chord[0] > 20.0) string1.noteOn(chord[0], velocity); |
|
|
|
|
|
delay(finger_delay); |
|
|
|
|
|
if (chord[1] > 20.0) string2.noteOn(chord[1], velocity); |
|
|
|
|
|
delay(finger_delay); |
|
|
|
|
|
if (chord[2] > 20.0) string3.noteOn(chord[2], velocity); |
|
|
|
|
|
delay(finger_delay); |
|
|
|
|
|
if (chord[3] > 20.0) string4.noteOn(chord[3], velocity); |
|
|
|
|
|
delay(finger_delay); |
|
|
|
|
|
if (chord[4] > 20.0) string5.noteOn(chord[4], velocity); |
|
|
|
|
|
delay(finger_delay); |
|
|
|
|
|
if (chord[5] > 20.0) string6.noteOn(chord[5], velocity); |
|
|
|
|
|
delay(finger_delay); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void strum_dn(const float *chord, float velocity) |
|
|
|
|
|
{ |
|
|
|
|
|
if (chord[5] > 20.0) string1.noteOn(chord[5], velocity); |
|
|
|
|
|
delay(finger_delay); |
|
|
|
|
|
if (chord[4] > 20.0) string2.noteOn(chord[4], velocity); |
|
|
|
|
|
delay(finger_delay); |
|
|
|
|
|
if (chord[3] > 20.0) string3.noteOn(chord[3], velocity); |
|
|
|
|
|
delay(finger_delay); |
|
|
|
|
|
if (chord[2] > 20.0) string4.noteOn(chord[2], velocity); |
|
|
|
|
|
delay(finger_delay); |
|
|
|
|
|
if (chord[1] > 20.0) string5.noteOn(chord[1], velocity); |
|
|
|
|
|
delay(finger_delay); |
|
|
|
|
|
if (chord[0] > 20.0) string6.noteOn(chord[0], velocity); |
|
|
|
|
|
delay(finger_delay); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|