2017-10-01 3 views
1

これが重複している場合はお詫びしますが、私がここで見つけたものは何も動作していないようです。私はlibGDXを使ってJavaでデスクトップとAndroidのゲームに取り組んでいます。プラットフォーム固有のモジュールで実装されているコアモジュールのインターフェイスを使用してMIDIサポートを追加しました。そのインターフェイスは次のとおりです。デスクトップ上のlibGDXミディボリュームコントロール

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(); 
} 

私のデスクトップとAndroidプロジェクトの実装では、midiファイルが完全に読み込まれて再生されます。 Android版では、ボリュームを簡単に設定することもできます。しかし、私はデスクトップにボリュームを実装する方法を理解することはできません。私は、トラックの音量を0と1の間のフロートに設定して、0が完全に静かで、1が最も大きな音量になるようにしたいと考えています。私は、次の解決方法を試してみましたが、多くの異なるものを試してみました

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 
    } 
} 

:ここでは、デスクトップ上のMIDIプレイヤーの私の現在の実装である 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

そして、誰も働いていない。

+0

Androidでボリュームをどのように扱いますか?どのシンセサイザーをデスクトップで使用していますか? –

+0

@ CL.デスクトップでは、私は 'sequencer = MidiSystem.getSequencer();'で説明したシステムシンセサイザーを使用していると仮定していますが、Androidでは簡単に組み込み可能な 'MediaPlayer'クラスを使用しています。 'mediaPlayer.setVolume(volume、volume); 'でボリュームを設定します。 – JoseRivas1998

答えて

0

独自のチャンネルボリュームメッセージを送信することは、MIDIファイルに既に存在する場合はあまり役に立ちません。

Master Volume messages(シンセサイザでサポートされている場合)を送信できます。

Javaシンセサイザには、MIDI入力とは別のボリュームコントローラがありません。 MIDIメッセージが機能しない場合は、オーディオデバイスに直接移動する必要があります(そして、シンセサイザがどちらを使用しているかを知る良い方法はありません)。

関連する問題