我正在尝试运行从 javax.sound.midi
包导入类的代码,但没有任何效果。代码已经编译运行成功,但是没有声音。
我已经下载了 Java 的音库,并将它放在 audio
文件夹中,但它仍然无法正常工作。
Macbook Pro 2010 年中期
Mac OS X High Sierra
2019-04-16 的 Java 版本 12.0.1
Java(TM) SE Runtime Environment (build 12.0.1+12)
Java HotSpot(TM) 64-Bit Server VM (build 12.0.1+12, mixed mode, sharing)
import javax.sound.midi.*;
public class MiniMiniMusicApp {
public static void main(String[] args) {
MiniMiniMusicApp mini = new MiniMiniMusicApp();
mini.play();
}
public void play() {
try {
Sequencer player = MidiSystem.getSequencer();
player.open();
Sequence seq = new Sequence(Sequence.PPQ, 4);
Track track = seq.createTrack();
ShortMessage a = new ShortMessage();
a.setMessage(128, 1, 44, 100);
MidiEvent noteOn = new MidiEvent(a, 1);
track.add(noteOn);
ShortMessage b = new ShortMessage();
b.setMessage(128, 1, 44, 100);
MidiEvent noteOff = new MidiEvent(b, 16);
track.add(noteOff);
player.setSequence(seq);
player.start();
} catch (Exception ex) {ex.printStackTrace();}
}
}
最佳答案
问题是您对 a
和 b
使用命令 128。基于ShortMessage命令 128 是音符关闭事件。
- 144 Activity 注意事项
- 128 Note Off 事件
- 192 用于更改默认仪器等的程序更改
- 176 发送事件的控制更改
- 224 弯音
例如,将 a.setMessage(128, 1, 44, 100);
更改为 a.setMessage(ShortMessage.NOTE_ON, 1, 44, 100);
你会听到声音。
public static void play() {
try {
Sequencer player = MidiSystem.getSequencer();
player.open();
Sequence seq = new Sequence(Sequence.PPQ, 4);
Track track = seq.createTrack();
ShortMessage a = new ShortMessage();
a.setMessage(ShortMessage.NOTE_ON, 1, 44, 100);
MidiEvent noteOn = new MidiEvent(a, 5);
track.add(noteOn);
ShortMessage b = new ShortMessage();
b.setMessage(ShortMessage.NOTE_OFF, 1, 44, 100);
MidiEvent noteOff = new MidiEvent(b, 16);
track.add(noteOff);
player.setSequence(seq);
player.start();
} catch (Exception ex) {
ex.printStackTrace();
}
}
关于Javax.sound.midi 学习代码不适用于 MacOS X,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57580291/