Player Midi Autonome

Salut tout le monde ^^

Après une question toute bête de PapyDuino qui demandait comment upgrader l'ATmega168 de son lecteur midi pour un ATmega328 cela m'as donné l'idée de faire un lecteur dans le même genre sous arduino.

Le code est en pièce jointe, pour le moment j'ai un soucis j'utilise un delay (100) pour espacer les notes, il faudrait que j'utilise le delta-time à la place !
Problème le delta-time est en 1/4 de note donc pour faire un delay je vois pas trop, des idée ?

Le plus gros du code est fait je pense (à voir quand même ^^")

Niveau hardware:
Lcd 2x16, Carte SD, câble midi (pour le moment je ne gère aucun des boutons prévue pour la suite play/stop/...), carte arduino.

Edit: Je ne gère pas non plus les meta-events, c'est aussi un problème, ça décale tout les byte par la suite ...
ça devrait pas être trop compliqué à mettre en place (enfin j'espère :~)

Edit2: J'ai trouvé ce site: Variable Length Values mais c'est toujours pareil il faudrait que je convertisse le delta-time en ms ...
Je suppose que cela est liée au tempo mais j'ai trouvé aucune commande qui parle du tempo ...

Tient histoire de changer je vais avoir l'air c*n ^^""

Meta event: 0x51 (01010001)
Data: 03 tttttt
Set tempo, tttttt: microseconds/quarter note

Problème ce meta-events n'ai jamais appeler dans mon .mid de test ...

Quelqu'un si connait en musique/midi ? :*

De souvenir, mais à vérifier, la définition du tempo se fait de cette manière :
Meta Event 0xFF -> Type 0x51 -> Length 3 -> Microseconds/Quarter-Note 0~8355711
C'est peut-être cela que tu reçois ?

Chapeau bas !!
Je râle, j'ai 40 ans de trop, et mes neurones ne vont plus assez vite pour les nouvelles technologies.
Je vais me procurer un 328 et essayer ce que çà donne; je suis impatient, et curieux de voir la suite.
Avec la motivation que tu as, je suis sur que tu vas nous faire un super truc.
Pour blaguer, si tu aimes les défis, j' ai sujets de projets dans mes cartons, pour Arduino bien sur.
Encore bravo, même s' il reste à fignoler des trucs, en 12 heures, c'est top classe !
A+
PapyDuino

Re
J' ai trouvé çà; si çà peut t' aider. Encore de l' anglais ! il va falloir que je m' y mette.

http://ruinwesen.com/mididuino

A+
PapyDuino

ekaki:
De souvenir, mais à vérifier, la définition du tempo se fait de cette manière :
Meta Event 0xFF -> Type 0x51 -> Length 3 -> Microseconds/Quarter-Note 0~8355711
C'est peut-être cela que tu reçois ?

J'ai une trame dans le genre (que j'ai pas géré est qui à bugger le prog) mais elle est arriver qu'au ~20eme event, c'est la commande pour gérer le tempo en us j'ai plus aucun doute la dessus mais je pense qu'il doit y avoir un tempo par défaut et que cette meta change ce tempo quand il n'est plus bon ?
sinon dans le principe:
meta 0x51 -> récup des data (3 bytes) -> data -> (double)tempo
DelayMicroseconds(delta * tempo);

PapyDuino:
Re
J' ai trouvé çà; si çà peut t' aider. Encore de l' anglais ! il va falloir que je m' y mette.

http://ruinwesen.com/mididuino

Pas mal je vais regarder ! ça gére le delta je vais regarder leur méthode.

PapyDuino:
Je vais me procurer un 328 et essayer ce que çà donne; je suis impatient, et curieux de voir la suite.
Avec la motivation que tu as, je suis sur que tu vas nous faire un super truc.

J'ai fait en sorte que ce soit compatible sans modification avec ton kit :wink:
Et plus généralement compatible avec n'importe quel hardware via le PinMapping.

PapyDuino:
Pour blaguer, si tu aimes les défis, j' ai sujets de projets dans mes cartons, pour Arduino bien sur.

J'adore les défi :smiley: je sens qu'on va bien s'entendre XD

Je vais tenter de géré toute les meta (quitte à faire des fonctions ne retournant rien sur certaine commandes) je suis sur que le probléme vient du fait que tout est décalé si je ne gère pas un seul des events.

Re
J'ai été ce matin chercher du matos à Toulouse chez
http://shop.snootlab.com/
Sympa, ils ont ouvert la boutique pour moi ! si si !
Est-ce que je peux faire un essai avec le code que tu m' as donné, et en implantant ensuite le 328 sur ma carte pseudo Mr Midi 2 , même si tout n'est pas OK ?
A+
PapyDuino

PapyDuino:
J'ai été ce matin chercher du matos à Toulouse chez
http://shop.snootlab.com/
Sympa, ils ont ouvert la boutique pour moi ! si si !

:astonished:

PapyDuino:
Est-ce que je peux faire un essai avec le code que tu m' as donné, et en implantant ensuite le 328 sur ma carte pseudo Mr Midi 2 , même si tout n'est pas OK ?

J'ai tous fait pour que tu puisse prendre l'atmega328 d'une carte arduino déjà programmer et le mettre comme ça dans ton kit :wink:

Hello tout le monde !

Bon j'ai un soucis ! Et un gros !
J'ai implanter la gestion des meta et des bouton STOP et PAUSE (enfin préparé j'ai pas mis les boutons encore ;))

Problème le delay semble complétement foirer ! Je passe 1min 30sec de musique en 5 secondes !

Bizarrement un delayMicroseconds(tempo * delta) me semblé l'idéal vu que le tempo est en us par (1/4 de note) et delta en (1/4 de note) !

Avec delayMicroseconds en 5 secondes toute le .mid est lu direct, avec delay(xx) qui devrait être 1000 fois plus lent c'est encore plus rapide et même en multipliant par 1000 c'est toujours aussi rapide =(

Je joint la version actuelle de mon code, il marche niquel pour ce qui est de la gestion de tout le reste ^^ juste ce problème de timing !

Re
J'ai essayé de charger la 1ère version, j'ai les commentaires:

Binary sketch size: 17802 bytes (of a 126976 byte maximum)
avrdude: stk500_getsync(): not in sync: resp=0x30
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51

Avec la version actuelle, j'ai:

‘MsTimer2’ has not been declared
SkyMidiPlayer.cpp:57:22: error: MsTimer2.h: No such file or directory
SkyMidiPlayer.cpp: In function 'void setup()':
SkyMidiPlayer:92: error: 'MsTimer2' has not been declared
SkyMidiPlayer:93: error: 'MsTimer2' has not been declared
SkyMidiPlayer.cpp: In function 'void buttonPlay()':
HandleButton:28: error: 'flagInPlay' was not declared in this scope

M' y suis-je mal pris ?
A+
PapyDuino

PapyDuino:

Binary sketch size: 17802 bytes (of a 126976 byte maximum)
avrdude: stk500_getsync(): not in sync: resp=0x30
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51

Redémarre l'ide, débranche puis rebranche l'arduino est relance l'ide :wink:

PapyDuino:
‘MsTimer2’ has not been declared
SkyMidiPlayer.cpp:57:22: error: MsTimer2.h: No such file or directory
SkyMidiPlayer.cpp: In function 'void setup()':
SkyMidiPlayer:92: error: 'MsTimer2' has not been declared
SkyMidiPlayer:93: error: 'MsTimer2' has not been declared
SkyMidiPlayer.cpp: In function 'void buttonPlay()':
HandleButton:28: error: 'flagInPlay' was not declared in this scope

Il te faut la librairie MsTimer2
http://www.arduino.cc/playground/Main/MsTimer2
Télécharge le zip et dezip le dans le dossier ..\blablabla\libraries
blablabla etant le dossier contenant l'executable arduino :wink:

@PapyDuino: l'erreur "flagInPlay not declared in this scope" vient d'une petite erreur de ma part :blush:

Dernière version:
Tout les boutons ont leur flags pour la gestion par interruptions,
Le calcul du delay a été modifié mais toujours aussi buggé T_T,
Gestion des sysex event et de plusieurs meta système qui étaient passé à la trappe,
Affichage des byte restant en lecture sur le lcd, refresh à une image par seconde -> on vois bien le bug du timing ! 28xxx, bad command, 25xxx, BOOM! 0

Si quelqu'un voit d'où peut venir l'erreur c'est très frustrant, même en y étant passant tout l'aprem j'ai pas trouvé T_T (je suis sur que c'est tout c*n en plus !)

@PapyDuino: pour le coup j'ai intégré MsTimer2 dans le zip tu n'aura pas à l'installer :wink:

Re
Pour le premier, j'avais tout bêtement choisi la mauvaise "board"

Pour le second, l'erreur devient:

‘flagInPlay’ was not declared in this scope
SkyMidiPlayer.cpp: In function 'void buttonPlay()':
HandleButton:28: error: 'flagInPlay' was not declared in this scope

A+
PapyDuino

PapyDuino:
Pour le second, l'erreur devient:

‘flagInPlay’ was not declared in this scope
SkyMidiPlayer.cpp: In function 'void buttonPlay()':
HandleButton:28: error: 'flagInPlay' was not declared in this scope

Regarde mon post au dessus j'ai encore fait une modif ^^"" réglant cette petite erreur et d'autres trucs :wink:

J'entrevois de gros problème à l'horizon !
Depuis le debut je travail depuis ces deux doc:
http://faydoc.tripod.com/formats/mid.htm
http://www.omega-art.com/midi/mfiles.html

Mais je viens de découvrir un truc pas cool du tout, les "running status" et j'ai aucune doc dessus !
Il semblerai qu'il puisse y avoir des events < 0x80 mais lequel ? J'ai pas trouvé.
Je pense que aussi j'ai oublier certaine meta et ça pourrai expliquer (en parti) le bug du timing.
Si un events est pas géré et qu'il fait plus d'un byte, tout les autres sont décalé et hop bonjours la galère ...

Personne pour regarder mon code et m'aider :sweat_smile: ?

Re
MsTimer2 n'est pas content !

MsTimer2.cpp:31:22: error: MsTimer2.h: No such file or directory
MsTimer2.cpp:32: error: 'MsTimer2' has not been declared
MsTimer2.cpp:33: error: 'MsTimer2' has not been declared
MsTimer2.cpp:34: error: 'MsTimer2' has not been declared
MsTimer2.cpp:35: error: 'MsTimer2' has not been declared
MsTimer2.cpp:36: error: 'MsTimer2' has not been declared
MsTimer2.cpp:38: error: 'MsTimer2' has not been declared
MsTimer2.cpp: In function 'void set(long unsigned int, void (*)())':
MsTimer2.cpp:42: error: 'TIMSK2' was not declared in this scope
MsTimer2.cpp:42: error: 'TOIE2' was not declared in this scope
MsTimer2.cpp:43: error: 'TCCR2A' was not declared in this scope
MsTimer2.cpp:43: error: 'WGM21' was not declared in this scope
MsTimer2.cpp:43: error: 'WGM20' was not declared in this scope
MsTimer2.cpp:44: error: 'TCCR2B' was not declared in this scope
MsTimer2.cpp:44: error: 'WGM22' was not declared in this scope
MsTimer2.cpp:45: error: 'ASSR' was not declared in this scope
MsTimer2.cpp:45: error: 'AS2' was not declared in this scope
MsTimer2.cpp:46: error: 'OCIE2A' was not declared in this scope
MsTimer2.cpp:49: error: 'CS22' was not declared in this scope
MsTimer2.cpp:50: error: 'CS21' was not declared in this scope
MsTimer2.cpp:50: error: 'CS20' was not declared in this scope
MsTimer2.cpp:53: error: 'CS21' was not declared in this scope
MsTimer2.cpp:54: error: 'CS22' was not declared in this scope
MsTimer2.cpp:54: error: 'CS20' was not declared in this scope
MsTimer2.cpp:57: error: 'CS22' was not declared in this scope
MsTimer2.cpp:57: error: 'CS20' was not declared in this scope
MsTimer2.cpp:58: error: 'CS21' was not declared in this scope
MsTimer2.cpp: At global scope:
MsTimer2.cpp:110: error: 'MsTimer2' has not been declared
MsTimer2.cpp: In function 'void start()':
MsTimer2.cpp:114: error: 'TCNT2' was not declared in this scope
MsTimer2.cpp:115: error: 'TIMSK2' was not declared in this scope
MsTimer2.cpp:115: error: 'TOIE2' was not declared in this scope
MsTimer2.cpp: At global scope:
MsTimer2.cpp:125: error: 'MsTimer2' has not been declared
MsTimer2.cpp: In function 'void stop()':
MsTimer2.cpp:127: error: 'TIMSK2' was not declared in this scope
MsTimer2.cpp:127: error: 'TOIE2' was not declared in this scope
MsTimer2.cpp: At global scope:
MsTimer2.cpp:135: error: 'MsTimer2' has not been declared
MsTimer2.cpp:146: error: expected constructor, destructor, or type conversion before '(' token

A+
PapyDuino

Dans MsTimer2.h
remplace #include <MsTimer2.h>
par #include "MsTimer2.h"

Bon sinon j'ai avancé un (tout) petit peu !
Tout mes problèmes viennent d'une mauvaise gestion des méta et des sysex !
Je joint le .mid de test et ça version décomposé en csv.

Pour le parsing du header aucun problème delta/tick = 960 c'est ok !
Mais tempo devrait être de 365854 (soit 365ms pour 1/4 de note) mais la meta qui lui est associé n'est jamais parser par mon prog !
Je suspect lourdement les "sequencer_specific" sur la track 0 de foutre le bordel !

Il faudrait que j'arrive à géré TOUTE les meta correctement pour ne pas me retrouver avec un offset qui décale tout après. Des idées pour régler ce problème ?
Des courageux pour m'aider :slight_smile: ?

test.csv (68.8 KB)

test.mid (9.24 KB)

Bonjour skywodd
On reprend
Je n'ai pas trouvé #include <MsTimer2.h>
dans MsTimer2.h alors j'ai fouillé, et je l'ai trouvé dans MsTimer.ccp
J'ai fait la correction, et le chargement se fait sans erreur
Je vais le tester sur mon kit
Par contre, le fichier .csv ressemble à je que j'obtiens avec mon séquenceur Anvil Studio
J'ai fait des copies d' écran, je te les joins à tout hazard
a+
PapyDuino

Copie d'écran 2.doc (94.5 KB)

Il manque la copie d' écran 1; je n'ai pas fait: (more attachments)
A+
PapyDuino

Copie d'écran 1.doc (67 KB)

PapyDuino:
Je n'ai pas trouvé #include <MsTimer2.h>
dans MsTimer2.h alors j'ai fouillé, et je l'ai trouvé dans MsTimer.ccp

Oups désolé oui c'était dans le .cpp désolé :blush:

J'ai utiliser midi2csv pour décomposé le .mid mais avec un éditeur hexa et tes capture d'écran je me rend compte que les "sequencer_specific" du csv contiennent une date et le nom du piano.
Je pense que c'est là le problème en plus le .mid contient deux track je vais reprendre mon prog pour voir au pourquoi certaine meta sont pas prise en compte.