Bonjour !
Je suis en train de développer un logiciel qui contiendra entre autre un métronome (sans visuel, et avec un son en midi)
J'ai des problèmes de précision avec ce métronome (qui devient vraiment gênant si le tempo est trop élevé).
Dans le philosophie du truc, j'ai utilisé un timer, déclenché à chaque fois que le métronome doit faire un tic (dans les tempo très élevés, ça peut aller 5-6 fois par seconde).
Dans la pratique, ça fonctionne, mais n'est pas précis, et ça s'entend...
Dans la javadoc de la classe Timer (scheduleAtFixedRate), il est précisé :
Bref, je n'ai pas la garantie que la précision sera au rendez vous, en partie à cause du garbage collector!Citation:
In fixed-rate execution, each execution is scheduled relative to the scheduled execution time of the initial execution. If an execution is delayed for any reason (such as garbage collection or other background activity), two or more executions will occur in rapid succession to "catch up." In the long run, the frequency of execution will be exactly the reciprocal of the specified period (assuming the system clock underlying Object.wait(long) is accurate).
Fixed-rate execution is appropriate for recurring activities that are sensitive to absolute time, such as ringing a chime every hour on the hour, or running scheduled maintenance every day at a particular time. It is also appropriate for recurring activities where the total time to perform a fixed number of executions is important, such as a countdown timer that ticks once every second for ten seconds. Finally, fixed-rate execution is appropriate for scheduling multiple repeating timer tasks that must remain synchronized with respect to one another.
J'ai d'abord pensé à désactiver le gc dès qu'on lance le métronome (et le réactiver dès qu'on arrête le métronome) mais ce n'est visiblement pas possible en java...
Pour la lecture midi, j'utilise :
(Je n'ai plus code exact dans la tête, mais c'est un truc de ce gout là)Code:
1
2
3
4 channel.noteOn(note, velocity); sleep(100); channel.noteOff();
Au final, j'ignore si la non précision vient de la classe timer, de l'utilisation de notes midi isolée qui n'est pas précise ??
Si vous connaissez une façon en java d'effectuer un traitement régulièrement de façon très précise, ou si vous connaissez quelques "best practice" sur l'utilisation de l'API midi qu'on trouve en standard dans java, je suis preneur !
Peut être vaudrait il mieux faire la couche la plus basse (toute la partie devant être parfaitement synchro) en C++ et faire communiquer les 2 applications pour résoudre ce problème?
Merci !