Programme décodage
#include
#include
#include "expander.h"
const char MTHD[]={'M','T','h','d',0,0,0,6,0};
#define len_MTHD 9
const char MTRK[]="MTrk";
#define len_MTRK 4
//bool read_ok=true;
//#define check_read_ok if (!read_ok){fichier.close();}
#define SD_CS 10 // SD ChipSelect
unsigned char read_char(File &fichier) {
digitalWrite(7, HIGH); // indicateur de lecture (oscillo)
unsigned char c = fichier.read();
digitalWrite(7, LOW);
return c;
}
unsigned int read_nbr(File &fichier, int n) {
unsigned int ret_val=0;
while (n-- > 0) {
ret_val=ret_val*256+read_char(fichier);
}
return ret_val;
}
unsigned int read_nbr(File &fichier) {
unsigned char inByte;
unsigned int nbr=0;
do {
inByte=read_char(fichier);
if (inByte>127)
nbr=nbr*256+(inByte-128);
else
nbr=nbr*256+inByte;
} while (inByte>127);
return nbr;
}
void setup() {
pinMode(7, OUTPUT); // indicateur lecture SD
Serial.begin(9600);
//while(1){
expander_setup();
SdFat SD;
if (!SD.begin(SD_CS, SPI_HALF_SPEED))
Serial.println("Erreur initialisation carte SD !");
File fichier=SD.open("test.mid", O_READ);
int i;
int nb_tracks,resolution,lgr_bloc;
if (fichier.available()) {
i=0;
while ((read_char(fichier)==MTHD[i++]) && (i) delay (µs -> ms)
Serial.write(" ");
Serial.println(delay_tempo);
inByte=read_char(fichier); // status byte message
switch (inByte) {
case 0xFF: // meta event
case 0xF7: // SysEx event (escape sequence) OU continuation events (rares !?)
inByte=read_char(fichier); // message type
switch (inByte) {
case 0x2F: // Manque 1 octet… !?
end_file=1;
break;
case 0x51:
if (read_char(fichier)==3) { // toujours 3 octets… (sortie sinon… ?)
tempo=read_nbr(fichier, 3)/resolution; // (durée d'1 noire (µs) =>) durée d'1 tick (µs)
}
break;
case 3:
len=read_nbr(fichier);
i=0;
for (i; i CHOIX (taille en +)
while(millis()=0xE0 && inByte<=0xF2 || inByte<=0xBF)
read_char(fichier);
while(millis()