无法使用java.midi.sequencer播放声音

无法使用java.midi.sequencer播放声音,java,javax.sound.midi,Java,Javax.sound.midi,我有下面的代码,其中我创建了一个Sequencer,给它一个序列,给序列一个新的曲目,将MidiEvents写入该曲目,然后在调用Sequencer.start()时尝试播放该序列。我做错了什么 public static void main(String args[]) { try { Sequencer sequencer = MidiSystem.getSequencer(); sequencer.setTempoInBPM(96); sequ

我有下面的代码,其中我创建了一个Sequencer,给它一个序列,给序列一个新的曲目,将MidiEvents写入该曲目,然后在调用Sequencer.start()时尝试播放该序列。我做错了什么

public static void main(String args[]) {
    try {

      Sequencer sequencer = MidiSystem.getSequencer();
      sequencer.setTempoInBPM(96);
      sequencer.setTickPosition(0);

      Sequence seq = new Sequence(Sequence.PPQ, 5);

      sequencer.setSequence(seq);

      sequencer.open();

      Track mainTrack = seq.createTrack();
      sequencer.recordEnable(mainTrack, 0);
      sequencer.startRecording();

      ShortMessage msg = new ShortMessage();
      ShortMessage msg2 = new ShortMessage();
      msg.setMessage(ShortMessage.NOTE_ON, 0, 60, 100);
      msg2.setMessage(ShortMessage.NOTE_OFF, 0, 60, 100);
      mainTrack.add(new MidiEvent(msg, 0));s
      mainTrack.add(new MidiEvent(msg2, 400));

      Thread.sleep(5000);

      sequencer.stopRecording();

      sequencer.start();

      Thread.sleep(5000);

      sequencer.close();

    } catch (MidiUnavailableException | InvalidMidiDataException | 
      InterruptedException e) {
      System.err.println(e.getMessage());
    }
}
  • 您不需要录制,因为您明确定义了要播放的序列
  • 您应该首先创建带有轨迹和事件的序列。然后将此序列添加到sequencer并启动sequencer
  • 此外:要听到任何声音,你需要一个合成器并将其连接到音序器上

  • public static void main(String args[]) {
    try {
    
      Sequencer sequencer = MidiSystem.getSequencer();
      sequencer.setTempoInBPM(96);
      sequencer.setTickPosition(0);
    
      Sequence seq = new Sequence(Sequence.PPQ, 5);
    
      // sequencer.setSequence(seq);
    
      sequencer.open();
    
      Track mainTrack = seq.createTrack();
      // sequencer.recordEnable(mainTrack, 0);
      // sequencer.startRecording();
    
      ShortMessage msg = new ShortMessage();
      ShortMessage msg2 = new ShortMessage();
      msg.setMessage(ShortMessage.NOTE_ON, 0, 60, 100);
      msg2.setMessage(ShortMessage.NOTE_OFF, 0, 60, 100);
      mainTrack.add(new MidiEvent(msg, 0));
      mainTrack.add(new MidiEvent(msg2, 4000));
    
      // Thread.sleep(5000);
      // sequencer.stopRecording();
    
      sequencer.setSequence(seq);
    
      Synthesizer synth = MidiSystem.getSynthesizer();
      sequencer.getTransmitter().setReceiver(synth.getReceiver());
      synth.open();
    
      sequencer.start();
    
      Thread.sleep(5000);
      sequencer.close();
    
    } catch (MidiUnavailableException | InvalidMidiDataException | InterruptedException e) {
      System.err.println(e.getMessage());
    }
    }