Real time MIDI w/ music shield

Has anyone had any luck of getting real time MIDI to work with seedstudio music shield v1? It's based on VC1053B.

Ok I figured it out. MIDI works just fine...
Musicplayer.cpp (from Music_shield library) has function midiDemoPlayer() which can play notes, change banks, etc.
It was just a matter of moving midi functions from private to public in MusicPlayer.h file and then calling them from your sketch...
For example:

player.beginInMidiFmt();
player.midiWriteData(0xB0, 0x07, 120); // Set MIDI channel volume
player.midiWriteData(0xB0, 0, 0x00);  // Select bank GM1
player.midiWriteData(0xC0, 1, 0); // Select instrument (Piano)
player.midiNoteOn(0, 70, 127); // Play note (C4)
delay (1000);
player.midiNoteOff(0, 70, 127); // Stop playing note

Hi bratan, do you have a copy of your edited MusicPlayer.h? Can you share it with the group.
Thanks muchs

Pitchoilcan:
Hi bratan, do you have a copy of your edited MusicPlayer.h? Can you share it with the group.
Thanks muchs

Sure here it is...

MusicPlayer.h (7.42 KB)

Thanks much

Does your mididemoplayer code look like this?

#include <SD.h>
#include <SPI.h>
#include <Arduino.h>
#include <MusicPlayer.h>

void setup(void)
{
  Serial.begin(9600);
  player.beginInMidiFmt();
}
void loop(void)
{
  player.midiDemoPlayer();
}
delay(500);
}

because even with the modified musicplayer.h I couldn't get this to work.

I can't get my vs1053 shield to work in Midi mode. I'm using arduino Arduino uno and mega (either one). Can you help me?

I haven't played with it for a long time. I think this sketch should work if you connected all the pins correctly. It will just play middle C note.

#include <SD.h>
#include <SPI.h>
#include <MusicPlayer.h>

void setup()
{
  Serial.begin(115200);
  midiInit();
 
  //player.midiWriteData(0xC0, 1, 0); // Select instrument
  middleC();
  //triggerNotes();
 // playMIDIMelody();
  
}
void loop()
{
  //player.play();
 
  //delay(500);
}

void triggerNotes() {
  for (int note = 30; note <87; note++) {
    player.midiNoteOn(0, note, 127);
    delay (50);
    player.midiNoteOff(0, note, 127);
    delay (50);
  }
  
}

// Play one note for all instruments in bank GM1 
void middleC(){
  setMIDIBank (1);
  for (int i=0;i<127;i++) {
    Serial.print ("Playing instrument: ");
    Serial.println (i);
    player.midiWriteData(0xC0, i, 0); // Select instrument
    player.midiNoteOn(0, 60, 127); // Play C4
    delay (1000);
    player.midiNoteOff(0, 60, 127); // Stop playing C4
  }
}

void playMIDIMelody () {
  // Note numbers
  int C4=60,D4=62,E4=64,F4=65,G4=67,A4=69,B4=71,C5=72;
  int PP=0; //Pause
  int melody[] = {C4,C4,PP,G4,G4,PP,A4,A4,PP,G4,PP,PP,PP,PP,
                  F4,F4,PP,E4,E4,PP,D4,D4,PP,C4};
  // note durations: 4 = quarter note, 8 = eighth note, etc.:
  int noteDurations[] = { 8,8,8,8,8,4,
                        8,8,8,8,8,4,
                        8,8,8,8,8,4,
                        8,8,8,8,8,4,
                        8,8,8,8,8,4};
  player.midiWriteData(0xC0, 1, 0); // Select instrument
  
  for (int thisNote = 0; thisNote < 24; thisNote++) {
    if (melody[thisNote]==PP) // Pause
      delay (50);
   else {
      player.midiNoteOn(0, melody[thisNote], 127);
      delay (250);
      player.midiNoteOff(0, melody[thisNote], 127);
      Serial.println (melody[thisNote]);
    // to distinguish the notes, set a minimum time between them.
    // the note's duration + 30% seems to work well:
      delay (200);
    }
  }
  
  
}

// Initializes MIDI
void midiInit(){
  player.beginInMidiFmt();
  player.midiWriteData(0xB0, 0x07, 120); // Set MIDI channel volume
}

// Sets MIDI bank to GM1 or GM2. Takes values 1 or 2
void setMIDIBank(byte bank) {
 if (bank==1) player.midiWriteData(0xB0, 0, 0x00);  // Select bank GM1
 else player.midiWriteData(0xB0, 0, 0x78);  // Select bank GM2
}

I tried it, but didn't hear any tone.
Looking in Pin_config.h I see

//////////////////////for vs10xx///////////////////////////////////
#define VS_XRESET A0
#define VS_DREQ   A1
#define VS_XDCS   A2
#define VS_XCS    A3

which looks incorrect to me, my shield has

X_RESET D8
DREQ D2
XDCS D7
XCS D6
CS D9

Should I go ahead and edit those defines?

Horray! Finally I hear some tones. :smiley:
Thanks much Braton
changes defines in pin_config.h to

//////////////////////for vs10xx///////////////////////////////////
#define VS_XRESET 8
#define VS_DREQ 2
#define VS_XDCS 7
#define VS_XCS 6

Glad you got it working! :slight_smile: