Go Down

Topic: Player Midi Autonome (Read 8592 times) previous topic - next topic

skywodd

Jun 24, 2011, 10:37 pm Last Edit: Jul 04, 2011, 10:55 pm by skywodd Reason: 1
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: http://253.ccarh.org/handout/vlv/ 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 ...
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

skywodd

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

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 ? :*
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

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 ?

PapyDuino

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

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

skywodd


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);


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.


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 ;)
Et plus généralement compatible avec n'importe quel hardware via le PinMapping.


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 :D 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.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

PapyDuino

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

skywodd


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

:smiley-eek:


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 ;)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

skywodd

#8
Jun 25, 2011, 08:12 pm Last Edit: Jul 04, 2011, 10:55 pm by skywodd Reason: 1
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 !
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

PapyDuino

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




skywodd


>>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 ;)


'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 ;)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

skywodd

#11
Jun 25, 2011, 09:07 pm Last Edit: Jul 04, 2011, 10:55 pm by skywodd Reason: 1
@PapyDuino: l'erreur "flagInPlay not declared in this scope" vient d'une petite erreur de ma part  :smiley-red:

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 ;)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

PapyDuino

#12
Jun 25, 2011, 09:16 pm Last Edit: Jun 26, 2011, 07:14 am by Jean-François Reason: 1
Re
Pour le premier, j'avais tout bêtement choisi la mauvaise "board"

Pour le second, l'erreur devient:

Code: [Select]
'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


skywodd


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 ;)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

skywodd

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 :smiley-sweat: ?
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Go Up