0

我有以下代码,我在其中创建了一个 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());
    }
}
4

1 回答 1

0
  1. 您不需要录制,因为您明确定义了要播放的序列。
  2. 您应该首先创建包含轨道和事件的序列。然后将此序列添加到音序器并启动音序器。
  3. 此外:要听到任何声音,您需要一个合成器并将其连接到音序器。

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());
}
}
于 2017-12-30T21:45:00.803 回答