I have a VS1053 MP3 Shield stacked on an UNO R4 Minima. It plays MP3 files fine. I'm trying to get it to play MIDI files. It finds them but isn't loading/playing them, so something's off somewhere. Either I've missed a pin assignment in my code or got one wrong?
Code is below. Ideas/comments very much appreciated at this point.
#include <SPI.h>
#include <SdFat.h>
#include <MD_MIDIFile.h>
// ---------- SD ----------
SdFat SD;
// ---------- MIDI ----------
MD_MIDIFile SMF;
// ---------- VS1053 pins ----------
#define VS_XCS 6
#define VS_XDCS 7
#define VS_DREQ 2
#define VS_RESET 8
// ---------- MIDI callback ----------
void midiCallback(midi_event *pev)
{
// wait until VS1053 ready
while (!digitalRead(VS_DREQ));
// send MIDI byte stream to VS1053 SDI
digitalWrite(VS_XDCS, LOW);
for (uint8_t i = 0; i < pev->size; i++)
SPI.transfer(pev->data[i]);
digitalWrite(VS_XDCS, HIGH);
// ---------- VS1053 minimal init ----------
void vs1053Init()
{
pinMode(VS_XCS, OUTPUT);
pinMode(VS_XDCS, OUTPUT);
pinMode(VS_RESET, OUTPUT);
pinMode(VS_DREQ, INPUT);
digitalWrite(VS_XCS, HIGH);
digitalWrite(VS_XDCS, HIGH);
// reset pulse
digitalWrite(VS_RESET, LOW);
delay(20);
digitalWrite(VS_RESET, HIGH);
delay(200);
SPI.begin();
}
void setup()
{
Serial.begin(115200);
while (!Serial);
Serial.println("MIDI FILE PLAYBACK START");
vs1053Init();
// ---------- SD init ----------
if (!SD.begin(9, SPI_HALF_SPEED))
{
Serial.println("SD FAILED");
while (1);
}
Serial.println("SD OK");
// ---------- MIDI init ----------
SMF.begin(&SD);
SMF.setMidiHandler(midiCallback);
if (!SMF.load("SONG00.MID"))
{
Serial.println("FAILED TO LOAD SONG00.MID");
while (1);
}
Serial.println("PLAYING SONG00.MID");
}
void loop()
{
if (!SMF.isEOF())
{
SMF.getNextEvent();
}
else
{
Serial.println("DONE");
while (1);
}
}