我即将为一个学校项目制作一个小程序,该程序应该识别通过 MIDI 钢琴输入演奏的和弦(这只是其中的一部分)。
到目前为止,我已经到了每次按下和每次释放 MIDI 键盘上的一个键时,我都会得到一个类的对象ShortMessage
。
我的问题:我如何确定按键是否被按下或释放?在每种情况下,按下并释放,静态变量NOTE_OFF
包含值 128,变量NOTE_ON
包含值 144。
我不明白这应该如何告诉我该键是否已被按下或释放。任何想法?我错过了一个基本的东西吗?
提前致谢。
NOTE_ON
并且NOTE_OFF
只是常数;您将消息的实际命令值 ( getCommand()
) 与它们进行比较。
请注意,速度 ( getData2()
) 为零的音符打开消息必须被解释为音符关闭消息。
我有同样的“问题”并尝试了亚伦评论中的建议:
状态字段(可通过从 MidiMessage 继承的 getStatus() 方法访问)不是可能包含 NOTE_ON / NOTE_OFF 的字段吗?我很确定它是,但无法测试它。
它工作得很好!谢谢海报和亚伦!
if( sm.getStatus() == sm.NOTE_ON )
{
piano-key-down.
}
您可能希望将JFugue库用于您的应用程序。
// You'll need some try/catches around this block. This is traditional Java Midi code.
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
MidiDevice device = MidiSystem.getMidiDevice(infos[0]); // You'll have to get the right device for your MIDI controller.
// Here comes the JFugue code
MusicTransmitterToParserListener m = new MusicTransmitterToParserListener(device);
m.addParserListener(new ChordParserListener());
// Choose either this option:
m.startListening();
...do stuff...
m.stopListening();
// Or choose this option:
m.listenForMillis(5000); // Listen for 5000 milliseconds (5 seconds)
public ChordParserListener extends ParserListenerAdapter {
List<Note> notes = new ArrayList<Note>;
@Override public void onNotePressed(Note note) {
notes.add(note);
// Go through your list and see if you have a chord
}
@Override public void onNoteReleased(Note note) {
// Remove the note from the list, might not be as easy as notes.remove(note)
}
}
JFugue 还有一个Chord类,您可能会觉得它很有用——尤其是返回一个给定音符数组的 Chord 的方法……它被称为Chord.fromNotes(Note[] notes)
——除非它消除了您希望解决的挑战。