0

我即将为一个学校项目制作一个小程序,该程序应该识别通过 MIDI 钢琴输入演奏的和弦(这只是其中的一部分)。

到目前为止,我已经到了每次按下和每次释放 MIDI 键盘上的一个键时,我都会得到一个类的对象ShortMessage

我的问题:我如何确定按键是否被按下或释放?在每种情况下,按下并释放,静态变量NOTE_OFF包含值 128,变量NOTE_ON包含值 144。

我不明白这应该如何告诉我该键是否已被按下或释放。任何想法?我错过了一个基本的东西吗?

提前致谢。

4

3 回答 3

1

NOTE_ON并且NOTE_OFF只是常数;您将消息的实际命令值 ( getCommand()) 与它们进行比较。

请注意,速度 ( getData2()) 为零的音符打开消息必须被解释为音符关闭消息。

于 2016-06-20T21:13:58.623 回答
0

我有同样的“问题”并尝试了亚伦评论中的建议:

状态字段(可通过从 MidiMessage 继承的 getStatus() 方法访问)不是可能包含 NOTE_ON / NOTE_OFF 的字段吗?我很确定它是,但无法测试它。

它工作得很好!谢谢海报和亚伦!

if( sm.getStatus() == sm.NOTE_ON )
{
   piano-key-down.
}
于 2020-02-28T19:24:01.703 回答
0

您可能希望将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)——除非它消除了您希望解决的挑战。

于 2016-10-14T21:28:52.060 回答