Fonction d'incrémentation de valeur

gribouillex Messages postés 172 Date d'inscription lundi 10 octobre 2005 Statut Membre Dernière intervention 16 mai 2011 - 3 mai 2011 à 11:43
biolo24fr Messages postés 87 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 28 mai 2013 - 3 mai 2011 à 15:49
Bonjour

Je cherche à écrire une fonction mais malgré mes tentatives, je n’arrive pas à faire quelque chose de propre (précisons que je suis un éternel débutant).

Je suis en train d’adapter un lecteur MIDI avec DirectX.
Pendant l’exécution du midifile, un Timer réglé à la milliseconde se met en route (j’utilise RSTimer, car plus précis à +/- 10ms).

Dans ce timer, j’ai besoin de savoir où j’en suis dans l’exécution du morceau en mettant (dans un premier temps en debug) :
(Dim dmState As DirectMusicSegmentState)

debug.print dmState.Getseek

Cette commande me fait bien parvenir des valeurs toutes les millisecondes mais elle revient en moyenne une centaine de fois identique avant de changer.
Illustration :

6314
6314
6314
6314
6314 (etc environ 100 fois à +/- 10 près)
6410
6410
6410
6410
6410 (etc environ 100 fois à +/- 10 près)
6512
6512
6512
6512


Voici mon but :
J’aimerais obtenir la valeur la plus précise possible à chaque interrogation dans le timer, par exemple en compensant la centaine de valeurs manquantes en incrémentant au travers d’une fonction. Une fonction qui ferait ça :

Tant que la valeur Getseek ne change pas, on renvoie valeur = valeur + 1
Dès qu’elle change on refait la boucle.
Je devrais donc être précis à +/- 10 ms, ce qui me convient tout à fait.

Voici mon problème :
Je ne sais pas du tout comment écrire cette fonction pour qu’elle soit « propre ».
Que dois-je mettre dans le timer ? Comment écrire la fonction ?

En vous remerciant pour votre aide.
Gribouille

3 réponses

biolo24fr Messages postés 87 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 28 mai 2013 1
3 mai 2011 à 14:10
Salut,

Tu initialises 2 valeur à 0 pour le démarrage (i et valeur)
dans le RsTimer1.Timer() tu testes si Valeur<> segstate.GetSeek si oui alors i=0

si non alors i=i+1

et valeur prend segstate.GetSeek

comme ça i prend 1,2,3,4,5 etc... tant que segstate.GetSeek ne change pas et reviens à 0 quand sa valeur change

ce qui se traduit par :


Private Sub RSTimer1_Timer()

If Valeur <> segstate.GetSeek Then
    i = 0
Else
    i = i + 1
End If
Valeur = segstate.GetSeek
end sub



Voilà j'espère avoir répondu à ta question...
-----------------------------------------------------------------------------------------------------------
De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent.
0
gribouillex Messages postés 172 Date d'inscription lundi 10 octobre 2005 Statut Membre Dernière intervention 16 mai 2011
3 mai 2011 à 14:44
merci biolo24fr,

j'étais pas loin, mais là on peut dire que c'est un codage clair et propre.

j'ai réjouté par moi-même une dernière ligne :
now = segstate.GetSeek + i
pour obtenir une valeur incrémentale à chaque milliseconde.

merci encore !!!
0
biolo24fr Messages postés 87 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 28 mai 2013 1
3 mai 2011 à 15:49
content que ça t'ai aidé...

-----------------------------------------------------------------------------------------------------------
De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent.
0
Rejoignez-nous