Android javax midi音序器未播放mid文件

Android javax midi音序器未播放mid文件,java,android,audio,midi,Java,Android,Audio,Midi,嗨,我在Android上使用javax midi库,它可以很好地处理midi消息,但当我打开并尝试播放midi文件时,它不会执行任何声音。我已经验证了所有这些步骤: 处理midi文件时没有异常 之前我用winamp和DAW播放midi文件 我已将soundbank.gm放在目录C:\Program Files\Java\jdk1.7.0_45\lib\audio和C:\Program Files(x86)\Java\jre1.8.0_66\lib\audio中 我已经在MediaPlayer类

嗨,我在Android上使用javax midi库,它可以很好地处理midi消息,但当我打开并尝试播放midi文件时,它不会执行任何声音。我已经验证了所有这些步骤:

  • 处理midi文件时没有异常
  • 之前我用winamp和DAW播放midi文件
  • 我已将soundbank.gm放在目录C:\Program Files\Java\jdk1.7.0_45\lib\audio和C:\Program Files(x86)\Java\jre1.8.0_66\lib\audio中
  • 我已经在MediaPlayer类中成功地使用了它
  • 我的代码:

    private Sequencer playMidiFile()
    {
     try {
        Sequencer mSeqr = MidiSystem.getSequencer();
    
        InputStream in = getAssets().open(MIDI_FILE);
        Sequence mSeq = MidiSystem.getSequence(in);
    
        mSeqr.open();
        mSeqr.setSequence(mSeq);
        mSeqr.start(); //it is supposed this execution will perform the play of the file
    
        return mSeqr;
      } catch (MidiUnavailableException e) {
        e.printStackTrace();
      } catch (InvalidMidiDataException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
    
      return null;
    }
    

我该怎么做才能听到什么?谢谢

从java端,您必须连接到合成器,以便执行以下操作-如果您的音序器被占用或无法获得默认值,则应检查系统中所有其他可用的音序器。有关更多信息,请查看oracle的教程

static void play(Sequence sequence)
    throws MidiUnavailableException, InvalidMidiDataException, IOException
{
      Sequencer sequencer=MidiSystem.getSequencer( );
        sequencer.open();
        Synthesizer synthesizer = MidiSystem.getSynthesizer();
        synthesizer.open();
        sequencer.getTransmitter().setReceiver(synthesizer.getReceiver( ));
        sequencer.setSequence(sequence);
        sequencer.addMetaEventListener(new MetaEventListener( ) {
                public void meta(MetaMessage m) {
                    if (m.getType( ) == END_OF_TRACK) {
                      System.out.println("end of track");
                      return;
                    }
                }
            });
        sequencer.start( );

}