Metronome suivant le tempo des fichiers MIDI

gribouillex Messages postés 172 Date d'inscription lundi 10 octobre 2005 Statut Membre Dernière intervention 16 mai 2011 - 25 janv. 2007 à 12:09
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 - 25 janv. 2007 à 16:48
Bonjour

J'ai un programme qui lit de fichiers midi avec DirectX. Comment dois-je faire pour q'un métronome suive précisément le tempo du fichier midi ? ( même lorsqu'il change)
Actuellement, j'utilise cette solution qui n'est pas bonne car l'information arrive en décalé de qqs millisecondes par rapport au tempo du fichier MIDI...

Ci joint un extrait :

Dim dmPerf As DirectMusicPerformance
Dim msg As DMUS_NOTIFICATION_PMSG
Dim metronome As DMUS_NOTE_PMSG

Private Sub timer1_Timer()
If dmPerf.GetNotificationPMSG(msg) Then
    metronome.midiValue = 77 ' metronome click
    metronome.mtDuration = 150
    metronome.flags = DMUS_NOTEF_NOTEON
    metronome.velocity = 127
    Call dmPerf.SendNotePMSG(0, DMUS_PMSGF_REFTIME, 9, metronome)
end if
end sub

7 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
25 janv. 2007 à 13:42
Celà s'appelle généralement du "Time-Stretching".
Je ne crois malheureusement pas que tu puisses éviter ce léger décalage, surtout si tu modifies le tempo en cours de route.
Cet inconvénient n'est en général pas gênant pour un candidat compositeur faisant des essais à l'ordinnateur.
Un tempo  n'est en effet jamais normalement modifié sans passer par une pause, un silence, etc... préalablement.
Même sans ordinnateur (avec un instrument, donc) il faudrait être un super-hyper virtuose pour éviter ce décalage (raisons d'aptitudes physiques...)
Reste que tout celà dépend bien évidemment de ta façon d'envisager et mettre en oeuvre le passage d'un tempo à l'autre.
0
gribouillex Messages postés 172 Date d'inscription lundi 10 octobre 2005 Statut Membre Dernière intervention 16 mai 2011
25 janv. 2007 à 14:38
Pourtant le midifile qui est joué a bien un "tempo", par exemple 120 à la noire, que l'on doit bien par un moyen où un autre pouvoir récupérer de façon précise, non ?

Je suis assez novice en la matière, mais j'ai pu remarquer sur divers programmes de lecture de fichiers MIDI avec DirectMusic que la récupération du battement se faisait de cette manière (dans un timer par exemple) :

If dmPerf.GetNotificationPMSG(msg) Then
        beat = msg.lField1 + 1
        measure = msg.lField2 + 1
End If

Et malgré ça, ce battement n'est pas vraiment nickel, il tombe toujours un peu à côté...
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
25 janv. 2007 à 14:58
NON,  la différence entre une croche, une noire etc... et le tempo sont des choses très différentes
1) Ne confonds surtout pas la longueur de jeu d'une note avec le tempo !
2) tu pourrais paramétrer cette longueur de jeu proportionnellement au type (croche, blanche, etc...) mais n'éviterais pas pour autant le décalage résultant de la nécessité, pour l'ordinnateur, d'appliquer ce calcul proportionnel et donc de le recommencer (alors qu'il était fixé (et donc pas à recalculer) pour un tempo donné !)
Il est clair qu'à chaque modification du tempo, il va bien falloir recalculer ces variables (une seule fois jusqu'à la prochaine variation de tempo). Et le décalage correspond donc à ce temps de calcul ... et interviendra donc à chaque modification du tempo (pas entre 2 tempos mais à chaque modification).!
Est-ce si difficile à comprendre ?

PS : tu connais un batteur capable de faire ce que tu dis sans décalage et sans une infime interruption ? (ou au moins une transition ?)....
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
25 janv. 2007 à 15:12
Par analogie :
Sur un métronome traditionnel :
1) il te faudrait compter avec le temps du déplacement du curseur (aussi rapide sois-tu)
2) il te faudrait en plus compter avec l'inertie du balancier
avant qu'il ne trouve sa nouvelle cadence exacte
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gribouillex Messages postés 172 Date d'inscription lundi 10 octobre 2005 Statut Membre Dernière intervention 16 mai 2011
25 janv. 2007 à 15:15
merci pour tes précisions jmfmarques. Je suis musicien pro et je connais bien la musique... je ne pense donc pas me tromper en parlant de battements et de tempo à la noire... Cela étant, pour la transposition en informatique, j'ai certainement encore des lacunes...
Je pense que nous ne nous comprenons pas, j'ai du mal me faire comprendre...

Réexposons le problème :
Un fichier MIDI comportant le même tempo du début à la fin (on va faire simple), 120 battements par minutes à la noire.
On récupère cette valeur assez facilement, là n'est pas le problème.
Maintenant j'aimerais que pendant la lecture dudit fichier, un métronome (mis en forme dans mon exemple par un envoi du son "metronome click" sur la piste 10 dédiée aux drumsets GM) soit joué au même rhytme que le fichier écouté.

J'imagine que la problème vient du fait que j'utilise directX pour la lecture, mais j'aimerais savoir si il y a moyen de faire ça, simplement....


Et je ne parle pas de batteur ici, mais uniquement d'informatique..! Normalement il ne devrait pas y avoir plus précis, justement. C'est pour ça que certains séquenceurs ajoutent une option "humanize" pour éviter toute cette précision si robotique !


 
0
gribouillex Messages postés 172 Date d'inscription lundi 10 octobre 2005 Statut Membre Dernière intervention 16 mai 2011
25 janv. 2007 à 15:22
Prenons l'exemple d'un séquenceur logiciel comme Cakewalk, même la plus vieille version permet découter un midifile chargé le système et lorsqu'on le souhaite enregistrer une nouvelle piste, l'option metronome peut être démarrée. Et celui-ci suit d'un bout à l'autre le morceau impeccablement...

Franchement dites-moi si je suis complètement à côté de la plaque parceque ça ne me semble pas si compliqué que ça à mon sens ? Ca me surprendrait vraiment qu'on soit incapable de réaliser un petit programme comme ça (quand on a les connaissances, hein...)
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
25 janv. 2007 à 16:48
Je crois t'avoir répondu ...
Ce temps de réaction est inévitable pour les raisons que je t'ai indiquées, alors même que tu ajouterais les battements à l'inétrieur même de ton fichier midi (sur une piste dédiée), si tu modifies le tempo, cette modification entraînant un recalcul de la durée de jeu de chaque type de note.

Tu me parles maintenant de synchroniser un métronome externe avec le jeu d'un fichier Midi, ce qui est encore autre chose ...

Il faut que tu saches ceci : cette synchronisation, même entre 2 pistes du même fichier, ne peut être parfaite. Tu peux par contre (et c'est ce que font certains logiciels du commerce) "trichoter" un peu pour y parvenir. Ce "trichotement" corrige en général le décalage en faisant démarrer plus tôt ici et plus tard là .

Tu dis être musicien et je te crois.

Observe ce que fait un chef d'orchestre, comment il s'y prend... et les musiciens qui lui obéissent. Leurs réflexes sont bien évidemment sollicités (et leurs temps de réflexe avec). Le chef d'orchestre le sait bien et corrige ses propres gestes en conséquence.

Mais on s'écarte du sujet : ta question était : "comment éviter ce décalage" et ma réponse est "l'éviter, non à ma connaissance, le corriger, oui, selon ce que je fais (hé oui) et ce que je lis ici et là que les autres font.."
Voilà.
Amitiés
0
Rejoignez-nous