Pourquoi java midi synthé sur mac arrêter de jouer des notes


J'essaie de faire une application simple qui lit à partir d'un port midi (matériel) et transmet les événements au synthé logiciel. Il fonctionne la plupart du temps, sauf que le synthé doux arrêter de jouer de temps en temps. Je peux voir les messages midi transmis dans les journaux, je peux tracer dans le débogage et voir que l'événement atteindre le code natif dans le récepteur de synthé, mais pour une raison quelconque, le synthé ne joue pas la note. Si vous attendez puis le son jouer à nouveau, puis arrêter, puis jouer à nouveau...

Voici un application de démonstration qui montre le problème. Si vous maintenez le bouton Entrée enfoncé dans la console, vous entendrez une note à plusieurs reprises. Après un certain temps (probablement moins d'une minute), le son s'arrête (événement si vous maintenez le bouton enfoncé), et puis il va revenir.

import java.io.BufferedReader;
import java.io.InputStreamReader;

import javax.sound.midi.MidiSystem;
import javax.sound.midi.Synthesizer;

public class TestMidi2 {

    public static void main( String[] args ) throws Exception {
        Synthesizer synth = MidiSystem.getSynthesizer();
        synth.open();

        BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) );
        boolean on = true;
        while ( in.readLine() != null ) {
            if ( on ) {
                synth.getChannels()[0].noteOn( 45, 127 );
            } else {
                synth.getChannels()[0].noteOff( 45 );
            }
            on = !on;
        }
    }

}

Je suis sur macOS X lion si cela fait une différence (ce que je suppose).

Une idée? Solution de contournement? Je voudrais essayer d'autres logiciels synthé, mais n'a pas pu trouver. Je suis également prêt à essayer le matériel midi synthé aussi longtemps qu'ils le peuvent jouez du piano, de la flûte et de la guitare de base (je n'ai besoin de rien de pro, juste un son décent).

Merci!

Author: Manuel Darveau, 2011-10-13

2 answers

C'est un problème de Lion. Je développe un outil qui envoie MIDI à différents ports et testé sur de nombreuses plates-formes. Java Sound Synthesiser fonctionne bien pour toutes les versions d'OS X, sauf Lion. Là, il semble que le tampon du synthétiseur déborde. Après quelques notes, il cesse de jouer, si j'envoie un coup de poing de notes, il recommence à travailler et s'arrête à nouveau,..

Cependant, malheureusement, le synthétiseur sonore Java est une vieille chose où il semble que personne ne le supporte plus.

Quelqu'un sait-il autres possibilités de jouer des sons MIDI via Java sauf l'envoyer à un séquenceur tiers? Ce serait bien s'il y aurait quelque chose comme juste une autre bibliothèque General MIDI.

Merci et greez!

 2
Author: pianissimo, 2011-11-11 21:42:41

Votre problème n'est pas avec le midi, c'est avec ceci:

while ( in.readLine() != null )

Vous maintenez la touche entrée enfoncée, ce qui permet à la boucle de s'exécuter très rapidement plusieurs fois. Votre code va activer et désactiver la note aussi vite que le tampon d'entrée peut prendre en données, et il serason continu, mais je parie que si vous lisiez les signaux midi, vous en auriez des centaines en quelques secondes. Votre son s'arrête probablement parce que le synthé ne peut pas faire face à l'immense quantité de données midi que vous le nourrissez.

Essayez d'appuyer une fois sur Entrée et voyez si cela maintient une note continue.

Je chercherais une meilleure façon de lire les clés dans votre programme. Voir cette question SO pour une méthode possible pour le faire.

 0
Author: Nate, 2017-05-23 12:29:50