【问题标题】:How to Convert TimeStamps to Ticks (PPQ) - Real Time Midi如何将时间戳转换为刻度 (PPQ) - 实时 Midi
【发布时间】: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


    【解决方案1】:

    如果时间戳以毫秒为单位,那么您可以将其转换为如下所示的刻度:

    long ticks = timestamp * bpm / (1000 * 60); 
    

    由于时间戳可能自 1970 年 1 月 1 日以来,您将获得一个较高的起始时间。因此,如果您想将您的第一个“时间”设为 0,您需要跟踪这是否是您第一次看到的事件。

    if (tickOffset == -1) { // Using -1 as not initialized
        tickOffset = ticks;
    }
    ticks = ticks - tickOffset;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多