Lecteur SD et MIDI-Shield ??

Bonjour
Je viens de recevoir (enfin ) ceci : http://www.robotshop.com/eu/productinfo.aspx?pc=RB-Ada-12&lang=fr-CA
dont j'ai fait quelques tests ( concluant ) :grin:
Mais la question n'est pas là .
Le but est de reccuperer un fichier (ou plusieurs) de type MIDI et de prendre les données de ce fichier pour les envoyer via une MIDI-SHIELD , j'ai trouvé un utilitaire me permettant de convertir le fichier .mid en format .txt
j'ai donc fait une petite séquence de notes avec Ableton ,sauvegardé le fichier , et converti en txt , ça donne ça :

MFile 0 1 96
MTrk
0 Meta SeqName "3 2-MIDI\0"
0 TimeSig 4/4 36 8
0 TimeSig 4/4 36 8
183 On ch=1 n=53 v=62
669 On ch=1 n=60 v=51
676 Off ch=1 n=53 v=64
1027 On ch=1 n=59 v=22
1034 Off ch=1 n=60 v=64
1066 On ch=1 n=57 v=64
1077 Off ch=1 n=59 v=64
1130 On ch=1 n=53 v=55
1130 On ch=1 n=55 v=54
1138 Off ch=1 n=57 v=64
1391 Off ch=1 n=55 v=64
1439 On ch=1 n=55 v=46
1526 On ch=1 n=57 v=66
1535 Off ch=1 n=55 v=64
1539 Off ch=1 n=53 v=64
1666 On ch=1 n=60 v=52
1694 Off ch=1 n=57 v=64
1846 On ch=1 n=64 v=45
1857 Off ch=1 n=60 v=64
1944 Off ch=1 n=64 v=64
1964 On ch=1 n=67 v=57
1965 On ch=1 n=65 v=54
2008 Off ch=1 n=65 v=64
2081 On ch=1 n=65 v=51
2100 Off ch=1 n=67 v=64
2133 On ch=1 n=64 v=22
2138 Off ch=1 n=65 v=64
2169 On ch=1 n=60 v=61
2182 Off ch=1 n=64 v=64
2221 On ch=1 n=62 v=61
2230 Off ch=1 n=60 v=64
2253 On ch=1 n=60 v=62
2268 Off ch=1 n=62 v=64
2283 On ch=1 n=59 v=59
2304 Off ch=1 n=60 v=64
2319 On ch=1 n=55 v=51
2332 Off ch=1 n=59 v=64
2364 On ch=1 n=59 v=48
2375 Off ch=1 n=55 v=64
2385 On ch=1 n=57 v=55
2409 On ch=1 n=55 v=55
2418 Off ch=1 n=59 v=64
2429 Off ch=1 n=57 v=64
2438 On ch=1 n=52 v=61
2439 On ch=1 n=53 v=57
2450 Off ch=1 n=55 v=64
2474 On ch=1 n=57 v=51
2480 On ch=1 n=55 v=31
2482 Off ch=1 n=53 v=64
2486 Off ch=1 n=52 v=64
2506 Off ch=1 n=57 v=64
2511 On ch=1 n=53 v=9
2517 On ch=1 n=52 v=36
2526 Off ch=1 n=55 v=64
2535 On ch=1 n=50 v=58
2546 Off ch=1 n=52 v=64
2547 Off ch=1 n=53 v=64
2568 On ch=1 n=53 v=58
2584 On ch=1 n=52 v=72
2591 Off ch=1 n=50 v=64
2600 Off ch=1 n=53 v=64
2605 On ch=1 n=50 v=64
2619 Off ch=1 n=52 v=64
2640 Off ch=1 n=50 v=64
2667 On ch=1 n=52 v=64
2731 On ch=1 n=48 v=61
2739 Off ch=1 n=52 v=64
2755 On ch=1 n=50 v=6
2822 Off ch=1 n=50 v=64
3378 Off ch=1 n=48 v=64
3378 Meta TrkEnd
TrkEnd

je suppose que les valeurs à gauches correspondent au time code (??) ensuite biensure ch1 à on/off ,note n=x , et la velocité v=y .
Donc voilà comment faire ? pour séparer tout ce petit monde afin de l'envoyer sur la shield .
Merci
Louis

Salut,

Je te conseil de regarde du coté de miditones, c’est un utilitaire qui converti un fichier midi en une séquence de noteOn / noteOff / Delay :
http://code.google.com/p/miditones/
C’est beaucoup plus simple à utiliser qu’un dump texte d’événements midi :wink:

Sinon juste pour info :
183 On ch=1 n=53 v=62
<pointeurs temporel courant en 1/4 de note> <note on / note off> <channel=nn> <note=nn> <velocity=nn>

Bonjour et merci
c'est peut-etre idiot ,mais je n'arrive pas à faire fonctionner miditones 1.3 ainsi que 1.4 .

A+
Louis

OUIOUI:
c'est peut-etre idiot ,mais je n'arrive pas à faire fonctionner miditones 1.3 ainsi que 1.4 .

Comment ça ?

Ps: Miditones est un programme en ligne de commande :wink:
(Pour ouvrir une console sous windows : win + R)

Désolé ,mais ça ne fonctionne pas =(

OUIOUI:
Désolé ,mais ça ne fonctionne pas =(

Ok, mais qu'est ce qui ne fonctionne pas ?

Je ne suis pas devin, sans un minimum de détail je ne peut pas savoir d'ou vient le probléme :wink:

ça ne fonctionne pas en ligne de commande ,certainement que je m'y prend mal :*

OUIOUI:
ça ne fonctionne pas en ligne de commande ,certainement que je m'y prend mal :*

C'est quoi la commande que tu utile, et le résultat dans la console ?

j'ai fait plusieurs tentatives dont celle-ci
C:> miditonesV1.4 MIDI
miditonesV1.4' n'est pas reconnu en tant que commande interne
ou externe, un programme exécutable ou un fichier de commandes.

OUIOUI:
j'ai fait plusieurs tentatives dont celle-ci
C:> miditonesV1.4 MIDI
miditonesV1.4' n'est pas reconnu en tant que commande interne
ou externe, un programme exécutable ou un fichier de commandes.

Donc ... si je me réfère à ta commande, ton exécutable miditones se trouve dans C:, ou alors le dossier qui contient l'exécutable est présent dans la variable d'environnement PATH.
Vu l'erreur, je suppose que c'est ni l'un, ni l'autre :wink:

Il faut ce trouver dans le dossier contenant le .exe pour pouvoir exécuter une application en console :wink:
-> cd permet de ce déplacer dans les dossier :wink:
exemple: cd c:\users\skywodd\desktop -> me déplace dans mon dossier "bureau"

Oui bien sure ,quel boulet :blush:
les 2 (executable + fichier midi) étaient sur le bureau :roll_eyes:
Merci
il y a un moment que je ne suis plus sous XP
A+
Louis

OUIOUI:
Oui bien sure ,quel boulet :blush:
les 2 (executable + fichier midi) étaient sur le bureau :roll_eyes:
Merci
il y a un moment que je ne suis plus sous XP
A+
Louis

Pas grave, nobody is perfect :wink:

Donc avec le fichier MIDI je me retrouve avec ça :

// Playtune bytestream for file "MIDI.mid" created by MIDITONES V1.4 on Sun Feb 19 17:41:33 2012
byte PROGMEM score [] = {
// 
0,0, 0x90,0x35, 0,0, 0x91,0x3C, 0,0, 0x80, 0,0, 0x90,0x3B, 0,0, 0x81, 0,0, 0x91,0x39, 
0,0, 0x80, 0,0, 0x90,0x37, 0x92,0x35, 0,0, 0x81, 0,0, 0x80, 0,0, 0x90,0x37, 0,0, 
0x91,0x39, 0,0, 0x80, 0,0, 0x82, 0,0, 0x90,0x3C, 0,0, 0x81, 0,0, 0x91,0x40, 0,0, 
0x80, 0,0, 0x81, 0,0, 0x90,0x43, 0,0, 0x91,0x41, 0,0, 0x81, 0,0, 0x91,0x41, 0,0, 
0x80, 0,0, 0x90,0x40, 0,0, 0x81, 0,0, 0x91,0x3C, 0,0, 0x80, 0,0, 0x90,0x3E, 0,0, 
0x81, 0,0, 0x91,0x3C, 0,0, 0x80, 0,0, 0x90,0x3B, 0,0, 0x81, 0,0, 0x91,0x37, 0,0, 
0x80, 0,0, 0x90,0x3B, 0,0, 0x81, 0,0, 0x91,0x39, 0,0, 0x92,0x37, 0,0, 0x80, 0,0, 
0x81, 0,0, 0x90,0x34, 0,0, 0x91,0x35, 0,0, 0x82, 0,0, 0x92,0x39, 0,0, 0x93,0x37, 0,0, 
0x81, 0,0, 0x80, 0,0, 0x82, 0,0, 0x90,0x35, 0,0, 0x91,0x34, 0,0, 0x83, 0,0, 0x92,0x32, 
0,0, 0x81, 0,0, 0x80, 0,0, 0x90,0x35, 0,0, 0x91,0x34, 0,0, 0x82, 0,0, 0x80, 0,0, 
0x90,0x32, 0,0, 0x81, 0,0, 0x80, 0,0, 0x90,0x34, 0,0, 0x91,0x30, 0,0, 0x80, 0,0, 
0x90,0x32, 0,0, 0x80, 0,0, 0x81, 0xf0};
// This score contains 243 bytes, and 4 tone generators are used.

Qui est encore moins clair (pour moi) :grin:
Mais bon ,pour retrouver la note,la vélocité,le canal , au secours XD

OUIOUI:
Qui est encore moins clair (pour moi) :grin:

Pour toi oui, pour un micro-contrôleur par contre c’est beaucoup plus simple :wink:

OUIOUI:
Mais bon ,pour retrouver la note,la vélocité,le canal , au secours XD

Raa … :grin:

Dans l’énorme pavé rouge en page d’accueil de miditones :

  • ***** The score bytestream *****
  • The generated bytestream is a series of commands that turn notes on and off, and
  • start delays until the next note change. Here are the details, with numbers
  • shown in hexadecimal.
  • If the high-order bit of the byte is 1, then it is one of the following commands:
  • 9t nn Start playing note nn on tone generator t. Generators are numbered
  • starting with 0. The notes numbers are the MIDI numbers for the chromatic
  • scale, with decimal 60 being Middle C, and decimal 69 being Middle A (440 Hz).
  • 8t Stop playing the note on tone generator t.
  • F0 End of score: stop playing.
  • E0 End of score: start playing again from the beginning.
  • (Shown for completeness; MIDITONES won’t generate this.)
  • If the high-order bit of the byte is 0, it is a command to delay for a while until
  • the next note change… The other 7 bits and the 8 bits of the following byte are
  • interpreted as a 15-bit big-endian integer that is the number of milliseconds to
  • wait before processing the next command. For example,
  • 07 D0
  • would cause a delay of 0x07d0 = 2000 decimal millisconds, or 2 seconds. Any tones
  • that were playing before the delay command will continue to play.

Il suffit donc de faire un boucle parcourant tout le tableau et de lire les commandes.

for(unsigned int i = 0; i < tailleDuTableau; i++) {
  byte raw = score[i];
  switch(raw & 0xF0) {
    case 0x90: // note on
      noteOn(raw & 0xF, score[++i]);
    break;

    case 0x80: // note off
      noteOff(raw & 0xF);
    break;

    case 0xF0: // end of score
      // nothing
    break;

    default: // other
      if(raw & 128) // Delay
        delay((raw << 8) + score[++i]);
    break;
  }
}

// prototypes des fonctions midi (je les écrit pas c'est juste des Serial.print)
void noteOn(byte channel, byte note);
void noteOff(byte channel);

Pardonne moi ,mais mes neuronnes coincent un peu (plutot mon neuronne coince) :smiley:
De plus ,ça ne coincide pas avec ce que je veux faire ,du moins je pense.
Car sauvegarde du fichier(ou des fichiers) sur SD ,ensuite appel d'un fichier et lecture de celui-ci .
Je ne sais pas si l'explication est bien claire :blush:

A+

OUIOUI:
Pardonne moi ,mais mes neuronnes coincent un peu (plutot mon neuronne coince) :smiley:
De plus ,ça ne coincide pas avec ce que je veux faire ,du moins je pense.
Car sauvegarde du fichier(ou des fichiers) sur SD ,ensuite appel d'un fichier et lecture de celui-ci .
Je ne sais pas si l'explication est bien claire :blush:

T'inquiète j'ai bien compris, le fichier que te génère miditones est un .h par défaut, remplace .h par .bin dans ta ligne de commande et tu aura un fichier binaire :wink:

Sinon en repartant sur ton fichier texte, tu peut utiliser sscanf pour récupérer les différentes données que contient les lignes, mais ce sera trés lourd à mettre en place ...

Sinon tu peut carrément parser le fichier .mid comme je l'avais fait dans un précédent projet :

(Ps: j'ai laissé tomber ce projet à cause des nombreux bug :roll_eyes:)

Bonsoir à tous
Disons que je suis mal parti en fait ,je pense avoir brulé quelques étapes .
j’aurai du partir avec quelque chose de plus simple ,afin que je puisse comprendre (et certaines autres personnes aussi ).

Donc si tu me permet (et vous tous) :
Prendre cet exemple de programme .

/*
 MIDI note player
 
 This sketch shows how to use the serial transmit pin (pin 1) to send MIDI note data.
 If this circuit is connected to a MIDI synth, it will play 
 the notes F#-0 (0x1E) to F#-5 (0x5A) in sequence.

 
 The circuit:
 * digital in 1 connected to MIDI jack pin 5
 * MIDI jack pin 2 connected to ground
 * MIDI jack pin 4 connected to +5V through 220-ohm resistor
 Attach a MIDI cable to the jack, then to a MIDI synth, and play music.

 created 13 Jun 2006
 modified 30 Aug 2011
 by Tom Igoe 

 This example code is in the public domain.
 
 http://www.arduino.cc/en/Tutorial/MIDI
 
 */

void setup() {
  //  Set MIDI baud rate:
  Serial.begin(31250);
}

void loop() {
  // play notes from F#-0 (0x1E - 30 dec ) to F#-5 (0x5A  - 90 dec):
  for (int note = 30; note < 90; note+10) {
    //Note on channel 1 (0x90), some note value (note), middle velocity (0x45):
    noteOn(0x90, note, 0x45);
    delay(100);
    //Note on channel 1 (0x90), some note value (note), silent velocity (0x00):
    noteOn(0x90, note, 0x00);   
    delay(100);
  }
}

//  plays a MIDI note.  Doesn't check to see that
//  cmd is greater than 127, or that data values are  less than 127:
void noteOn(int cmd, int pitch, int velocity) {
  Serial.write(cmd);
  Serial.write(pitch);
  Serial.write(velocity);
}

ensuite faire un fichier de type texte (par exemple) avec une serie de valeurs (notes) sur SD
exemple : 30,40,50,60,70,80,90

ensuite en prenant cet exemple de programme pour SD ,mais en l’adaptant pour la MIDI-Shield ,lire le contenu du fichier note :

/*
  SD card read/write
 
 This example shows how to read and write data to and from an SD card file 	
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4
 
 created   Nov 2010
 by David A. Mellis
 updated 2 Dec 2010
 by Tom Igoe
 
 This example code is in the public domain.
 	 
 */
 
#include <SD.h>

File myFile;

void setup()
{
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
   pinMode(10, OUTPUT);
   
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);
  
  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
	// close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
  
  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");
    
    // read from the file until there's nothing else in it:
    while (myFile.available()) {
    	Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
  	// if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

void loop()
{
	// nothing happens after setup
}

P.S: je pense que je viens de capter comment faire en déposant ce post XD
ensuite on verra pour faire un fichier de type (comme j’ai déposé au début avec quelques modifs ) :wink: