2017-10-01 5 views
1

Je m'excuse si c'est un doublon, mais rien que j'ai trouvé ici semble fonctionner. Je travaille sur un jeu pour Desktop et Android en Java en utilisant libGDX. J'ai ajouté le support MIDI en utilisant une interface dans mon module de base qui est implémentée dans les modules spécifiques à la plate-forme. Voici cette interface:libGDX Contrôle du volume MIDI sur le bureau

public interface Midi { 
    void setLooping(boolean looping); 
    void pause(); 
    void stop(); 
    void setPosition(int pos); 
    void dispose(); 
    long getPosition(); 
    boolean isLooping(); 
    void setVolume(float volume); 
    void onPause(); 
    void onResume(); 
} 

Et mes implémentations dans mes projets Desktop et Android chargent et lisent les fichiers midi parfaitement. Dans la version Android, je peux même régler le volume facilement. Cependant, je ne peux pas comprendre comment implémenter le volume sur le bureau. Je veux être en mesure de régler le volume de la piste à un flottant entre 0 et 1 de telle sorte que 0 est complètement silencieux, et 1 est le plus fort. Voici mon implémentation actuelle du joueur midi sur le bureau:

public class MidiPlayer implements Midi { 

    /** 
    * The sequencer to play the midi track. 
    */ 
    private Sequencer sequencer; 
    /** 
    * Whether or not the track is looping. 
    */ 
    private boolean looping; 

    public MidiPlayer(FileHandle fileHandle) { 
     try { 
      sequencer = MidiSystem.getSequencer(); 
      sequencer.open(); 
      sequencer.setSequence(fileHandle.read()); 
      sequencer.setMicrosecondPosition(0); 
      sequencer.setLoopStartPoint(0); 
      sequencer.setLoopEndPoint(-1); 
      looping = false; 
     } catch (MidiUnavailableException | InvalidMidiDataException | IOException e) { 
      Gdx.app.error(getClass().getName(), e.getMessage(), e); 
     } 
    } 

    @Override 
    public void play() { 
     sequencer.start(); 
    } 

    @Override 
    public void setLooping(boolean looping) { 
     this.looping = looping; 
     if(!looping) { 
      sequencer.setLoopCount(0); 
     } else { 
      sequencer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY); 
     } 

    } 

    @Override 
    public void pause() { 
     sequencer.stop(); 
    } 

    @Override 
    public void stop() { 
     sequencer.stop(); 
     sequencer.setMicrosecondPosition(0); 
    } 

    @Override 
    public void setPosition(int pos) { 
     sequencer.setMicrosecondPosition(pos); 
    } 

    @Override 
    public void dispose() { 
     sequencer.close(); 
    } 

    @Override 
    public long getPosition() { 
     return sequencer.getMicrosecondPosition(); 
    } 

    @Override 
    public boolean isLooping() { 
     return this.looping; 
    } 

    @Override 
    public void setVolume(float volume) { 
     //I have tried several things here and none have worked 
    } 

    @Override 
    public void onPause() { 
     //ANDROID ONLY 
    } 

    @Override 
    public void onResume() { 
     //ANDROID ONLY 
    } 
} 

J'ai essayé beaucoup de choses différentes, je l'ai essayé les solutions suivantes: http://www.java2s.com/Code/Java/Development-Class/SettingtheVolumeofPlayingMidiAudio.htm

What's the method to control volume in an MIDI sequencer?

How to control the MIDI channel's volume

Et aucun n'a travaillé.

+0

Comment gérez-vous le volume sur Android? Quel synthétiseur utilisez-vous sur le bureau? –

+0

@ CL.Comme pour le bureau, je suppose que je suis en train d'utiliser le synthétiseur du système comme décrit dans 'sequencer = MidiSystem.getSequencer();' sous Android, j'utilise la classe intégrée 'MediaPlayer' qui peut facilement régler le volume avec 'mediaPlayer.setVolume (volume, volume);' – JoseRivas1998

Répondre

0

L'envoi de vos propres messages de volume de canal n'est pas très utile si le fichier MIDI les possède déjà.

Vous pouvez essayer d'envoyer Master Volume messages, si ce synthétiseur les prend en charge.

Le synthétiseur Java n'a pas de contrôleur de volume séparé de son entrée MIDI. Si les messages MIDI ne fonctionnent pas, vous devez aller directement à l'appareil audio (et il n'y a pas de bon moyen de savoir lequel utilise le synthétiseur).