#include <SoftwareSerial.h>
// define the pins used
#define VS1053_RX 1 // This is the pin that connects to the RX pin on VS1053
#define VS1053_RESET 9 // This is the pin that connects to the RESET pin on VS1053
// See http://www.vlsi.fi/fileadmin/datasheets/vs1053.pdf Pg 31
#define VS1053_BANK_DEFAULT 0x00
#define VS1053_BANK_DRUMS1 0x78
#define VS1053_BANK_DRUMS2 0x7F
#define VS1053_BANK_MELODY 0x79
// See http://www.vlsi.fi/fileadmin/datasheets/vs1053.pdf Pg 32 for more!
#define VS1053_GM1_OCARINA 80
#define MIDI_NOTE_ON 0x90
#define MIDI_NOTE_OFF 0x80
#define MIDI_CHAN_MSG 0xB0
#define MIDI_CHAN_BANK 0x00
#define MIDI_CHAN_VOLUME 0x07
#define MIDI_CHAN_PROGRAM 0xC0
#include <Audio.h>
#include <Wire.h>
#include <SD.h>
#include <SPI.h>
#include <SerialFlash.h>
#include <Bounce.h>
AudioInputI2S2 i2s2_1; //xy=109,316.20000648498535
AudioSynthWaveform waveform1; //xy=148.1999969482422,164.1999912261963
AudioMixer4 mixerR; //xy=421.2000274658203,266.1999912261963
AudioMixer4 mixerL; //xy=431.2000274658203,174.19998931884766
AudioOutputI2S i2s1; //xy=580.0001373291016,195.39998817443848
AudioConnection patchCord1(i2s2_1, 0, mixerL, 1);
AudioConnection patchCord2(i2s2_1, 1, mixerR, 1);
AudioConnection patchCord3(waveform1, 0, mixerL, 0);
AudioConnection patchCord4(waveform1, 0, mixerR, 0);
AudioConnection patchCord5(mixerR, 0, i2s1, 1);
AudioConnection patchCord6(mixerL, 0, i2s1, 0);
AudioControlSGTL5000 sgtl5000_1; //xy=219.20001220703125,368.3999881744385
SoftwareSerial VS1053_MIDI(0, VS1053_RX); // TX only, do not use the 'rx' side
void setup() {
Serial.begin(9600);
Serial.println("VS1053 MIDI test");
AudioMemory(10);
sgtl5000_1.enable();
sgtl5000_1.volume(0.3);
waveform1.begin(WAVEFORM_SINE);
sgtl5000_1.inputSelect(AUDIO_INPUT_LINEIN);
sgtl5000_1.adcHighPassFilterEnable();
VS1053_MIDI.begin(31250); // MIDI uses a 'strange baud rate'
pinMode(VS1053_RESET, OUTPUT);
digitalWrite(VS1053_RESET, LOW);
delay(10);
digitalWrite(VS1053_RESET, HIGH);
delay(10);
midiSetChannelBank(0, VS1053_BANK_MELODY);
midiSetInstrument(0, VS1053_GM1_OCARINA);
midiSetChannelVolume(0, 127);
}
unsigned long swapTime = 0;
bool waveIsOn = false;
void loop() {
for (uint8_t i=60; i<69; i++) {
midiNoteOn(0, i, 127);
delay(100);
midiNoteOff(0, i, 127);
}
if (millis() - swapTime > 1000) {
if (waveIsOn) {
waveform1.amplitude(0);
} else {
waveform1.frequency(440);
waveform1.amplitude(0.2);
}
waveIsOn = !waveIsOn;
swapTime = millis();
}
delay(1000);
}
void midiSetInstrument(uint8_t chan, uint8_t inst) {
if (chan > 15) return;
inst --; // page 32 has instruments starting with 1 not 0 :(
if (inst > 127) return;
VS1053_MIDI.write(MIDI_CHAN_PROGRAM | chan);
VS1053_MIDI.write(inst);
}
void midiSetChannelVolume(uint8_t chan, uint8_t vol) {
if (chan > 15) return;
if (vol > 127) return;
VS1053_MIDI.write(MIDI_CHAN_MSG | chan);
VS1053_MIDI.write(MIDI_CHAN_VOLUME);
VS1053_MIDI.write(vol);
}
void midiSetChannelBank(uint8_t chan, uint8_t bank) {
if (chan > 15) return;
if (bank > 127) return;
VS1053_MIDI.write(MIDI_CHAN_MSG | chan);
VS1053_MIDI.write((uint8_t)MIDI_CHAN_BANK);
VS1053_MIDI.write(bank);
}
void midiNoteOn(uint8_t chan, uint8_t n, uint8_t vel) {
if (chan > 15) return;
if (n > 127) return;
if (vel > 127) return;
VS1053_MIDI.write(MIDI_NOTE_ON | chan);
VS1053_MIDI.write(n);
VS1053_MIDI.write(vel);
}
void midiNoteOff(uint8_t chan, uint8_t n, uint8_t vel) {
if (chan > 15) return;
if (n > 127) return;
if (vel > 127) return;
VS1053_MIDI.write(MIDI_NOTE_OFF | chan);
VS1053_MIDI.write(n);
VS1053_MIDI.write(vel);
}