简体   繁体   English

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

[英]Unable to play sound with java.midi.sequencer

I have the following code, where I create a Sequencer, give it a Sequence, give the Sequence a new Track, write MidiEvents to the Track, and then try to play the Sequence when I call sequencer.start(). 我有以下代码,在其中创建一个Sequencer,给它一个Sequence,给Sequence一个新的Track,将MidiEvents写入Track,然后在我调用sequencer.start()时尝试播放S​​equence。 What am I doing wrong? 我究竟做错了什么?

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());
    }
}
  1. You don't need to record, because you explicitly define the sequence you want to play. 您无需录制,因为您明确定义了要播放的音序。
  2. You should first create the sequence with the track and the events. 您应该首先使用轨道和事件创建序列。 Then add this sequence to the sequencer and start the sequencer. 然后将此序列添加到音序器中并启动音序器。
  3. Furthermore: To hear anything you need a synthesizer and attach it to the 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());
}
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM