IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Métronome précis en Java


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut Métronome précis en Java
    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é :

    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.
    Bref, je n'ai pas la garantie que la précision sera au rendez vous, en partie à cause du garbage collector!

    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    channel.noteOn(note, velocity);
    sleep(100);
    channel.noteOff();
    (Je n'ai plus code exact dans la tête, mais c'est un truc de ce gout là)

    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 !

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    je ne suis pas expert dans JMF, mais normalement, avec du midi, vous pouvez lui passer plus que la prochaine note. Vous pouvez lui passer par exemple, les 15 prochaines secondes de "musique". et JMF devrait se charger de bufferiser. A vous, en suite, toutes les 5 secondes, de rajouter dans le buffer 5 secondes de données.
    Bref, il me semble que vous ne devez pas chercher à controler le lecteur, mais juste à lui donner une partition de "ticks" à jouer.

    edit: regardez du coté de Sequencer.setSequence()

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut
    Merci pour ta réponse, je viens d'aller faire un tour dans la javadoc, deux versions de cette méthode existent :

    setSequence

    public void setSequence(Sequence sequence)
    throws InvalidMidiDataException
    Sets the current sequence on which the sequencer operates.
    Parameters:
    sequence - the sequence to be loaded.
    Throws:
    InvalidMidiDataException - if the sequence contains invalid MIDI data, or is not supported.
    setSequence

    public void setSequence(InputStream stream)
    throws IOException,
    InvalidMidiDataException
    Sets the current sequence on which the sequencer operates. The stream must point to MIDI file data.
    Parameters:
    stream - stream containing MIDI file data.
    Throws:
    IOException - if an I/O exception occurs during reading of the stream.
    InvalidMidiDataException - if invalid data is encountered in the stream, or the stream is not supported.
    Dans la première, ce qui me fait peur, c'est le paramètre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sequence - the sequence to be loaded.
    ça me laisse penser que la séquence est chargée à l'appel de la méthode, mais que d'éventuels ajout de notes en cours de route sur cette séquence ne seront pas pris en compte sans "reloader" la séquence

    Pour la seconde j'ai du mal à voir comment modifier le contenu pointé par l'inputStream une fois la lecture de l'InputStream démarrée !

    Je testerai ces méthodes quand j'aurai un peu de temps à y passer, mais je fleure qu'elles sont plus conçues pour lire une séquence complète que pour lire un séquence pouvant évoluer au cours le la lecture. Remarque ça peut très bien être une solution de faire une séquence de métronome de 5 secondes, et de demander une lecture en boucle de cette séquence (ça doit être possible ça).

    Mon but serait à la fin d'arriver à lire des séquences midi créées par l'utilisateur (à la guitar pro un peu pour ceux qui connaissent), et donc la séquence peut très bien être entièrement créée avant de débuter la lecture (au moment où l'utilisateur demande la lecture).

    à voir! reste à trouver comment faire pour que les deux pistes (métronome et séquence créée par l'utilisateur) se lisent de façon synchronisées (ça serait bien ^^) mais j'ai vu qu'il y avait un système de tick qui doit servir à ça !

    Merci encore !

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ou créer une séquence de 24h puis l'interrompre quand l'utilisateur le demande?

  5. #5
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Pour faire du MIDI en Java, et plus particulièrement pour ton problème de métronome (séquence qui se répète), je te conseille la librairie JFugue : http://www.jfugue.org/ ou http://code.google.com/p/jfugue/

    C'est un projet vivant et sympathique... alors que JMF commence à devenir poussiéreux (mais JFugue ne fait que du midi, donc tout dépend de tes besoins...) !
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut
    Merci j'ai rapidement regardé sur le site de cette API, ça semble correspondre à mon besoin !
    Je n'ai pas trop de temps ces temps ci mais je regarderai plus en détail dès que je pourrai me replonger dans ce projet !

    Merci encore

    Alex

Discussions similaires

  1. Lissage précis en java
    Par pitchoune62 dans le forum 2D
    Réponses: 4
    Dernier message: 26/05/2008, 09h11
  2. le Java est la continuité du C++ ???
    Par Vincent PETIT dans le forum Débats sur le développement - Le Best Of
    Réponses: 33
    Dernier message: 25/08/2005, 20h17
  3. directx et java?? possible??
    Par jiraiya dans le forum DirectX
    Réponses: 3
    Dernier message: 09/07/2002, 19h55
  4. webcam : lire sur un port usb en c/c++ ou java. sous win. ?
    Par flo007 dans le forum Choisir un environnement de développement
    Réponses: 2
    Dernier message: 24/05/2002, 23h24
  5. Service de nommage java C++
    Par Anonymous dans le forum CORBA
    Réponses: 3
    Dernier message: 15/04/2002, 12h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo