首页 > 解决方案 > 使用 RtMidi 解压 Midi 时间码

问题描述

我一直在努力研究如何使用 RtMidi C++ 获取 Midi Timecode (MTC)。到目前为止,RtMdid 回调似乎只处理 uchar 所以我的猜测是它接收到多个消息以获得完整的 uint(32 位)时间码。我正在努力弄清楚如何重新组装数据。我的第一个问题是,甚至可以用 RtMidi 读取 MTC 还是我在这里打死马?

谢谢,

标签: c++midi

解决方案


Quater-frames 是,但我不确定。这是一个工作示例:

void ZMidiIn::UpdatePort(double in_deltaTime, std::vector<UChar> *in_message, void *in_userData)
{
    UInt l_size = (UInt)in_message->size();

    if (l_size == 0)
    {
        return;
    }

    for (UInt i = 0; i < l_size; ++i)
    {
        UChar l_byte = in_message->at(i);

        switch (l_byte)
        {
        case 0xf1: /// Midi Time Code (MTC)
        {
            ZTimecode &l_timecode = zMidi->GetTimeCode();
            l_byte = in_message->at(++i); /// Get next byte.

            Int l_type = (l_byte >> 4) & 0xf;
            Int l_val = (l_byte & 0xf);

            switch (l_type)
            {
            case 0:
            {
                l_timecode.SetFrameTens(l_val);
                break;
            }
            case 1:
            {
                l_timecode.SetFrameUnits(l_timecode.GetFrameTens() + (l_val * 16));
                break;
            }
            case 2:
            {
                l_timecode.SetSecondTens(l_val);
                break;
            }
            case 3:
            {
                l_timecode.SetSecondUnits(l_timecode.GetSecondTens() + (l_val * 16));
                break;
            }
            case 4:
            {
                l_timecode.SetMinuteTens(l_val);
                break;
            }
            case 5:
            {
                l_timecode.SetMinuteUnits(l_timecode.GetMinuteTens() + (l_val * 16));
                break;
            }
            case 6:
            {
                l_timecode.SetHourTens(l_val & 31);
                break;
            }
            case 7:
            {
                l_timecode.SetHourUnits(l_timecode.GetHourTens() + ((l_val * 16) & 31));
                break;
            }
            }
            break;
        }
        }
    }
}

推荐阅读