【发布时间】:2014-06-18 23:22:55
【问题描述】:
我目前正在使用实现 Receiver 的类从我的 MIDI 键盘实时读取 MIDI 消息,并输出播放的音符。
当我按下笔记时,我收到的唯一信息是 MidiMessage 和时间戳。
我正在尝试将音符绘制为实际的钢琴乐谱,目前用户必须预先设置 bpm。
因此,如果我知道速度是 120bpm(例如),我如何使用时间戳来确定按下的音符的长度?
我假设我是否可以将时间戳转换为刻度 (ppq),然后我可以使用它来计算时间。
非常感谢任何帮助。下面是我的 Receiver 类中的“发送”方法。
'firstStamp' 和 'secondStamp' 变量只是用来输出音符的长度。我在释放音符时记下时间戳,并在按下音符时减去时间戳。
@Override
public void send(MidiMessage message, long timeStamp) {
String strMessage = null;
if (firstStamp == 0) {
firstStamp = timeStamp;
secondStamp = timeStamp;
}
firstStamp = secondStamp;
secondStamp = timeStamp;
stampDif = (secondStamp - firstStamp);
if (message instanceof ShortMessage) {
strMessage = decodeMessage((ShortMessage) message, timeStamp);
} else if (message instanceof MetaMessage) {
strMessage = decodeMessage((MetaMessage) message);
} else if (message instanceof SysexMessage) {
strMessage = decodeMessage((SysexMessage) message);
} else {
strMessage = "other message" + message.getStatus();
}
r_out.println("Timestamp: " + timeStamp + " " + strMessage);
r_printStream.println("Timestamp: " + timeStamp + " " + strMessage);
}
【问题讨论】:
标签: java timestamp real-time midi