c++ - 使用 RtMidi 解压 Midi 时间码
问题描述
我一直在努力研究如何使用 RtMidi C++ 获取 Midi Timecode (MTC)。到目前为止,RtMdid 回调似乎只处理 uchar 所以我的猜测是它接收到多个消息以获得完整的 uint(32 位)时间码。我正在努力弄清楚如何重新组装数据。我的第一个问题是,甚至可以用 RtMidi 读取 MTC 还是我在这里打死马?
谢谢,
解决方案
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;
}
}
}
}
推荐阅读
- javascript - 根据该对象内部的值获取对象键
- redux - 如果一个返回对象而另一个返回对象的一个属性,我如何组合 2 个减速器?
- python - 如何在 Django 中从视图中设置初始表单字段值
- r - 如何提取下载链接并在 R 中下载文件?
- javascript - 引用已撤销的对象 URL
- javascript - 如何在上传之前获取文件名并在没有 fakepath 的情况下传递到另一个文本输入字段
- python-3.x - 创建一个条件 groupby().count 的 Pandas DataFrame Where Cells <>0 以创建频率
- python - 仅打印嵌套列表中的偶数
- xslt - 如何使用 Java EE 从 xsl 输出中读取媒体类型属性?
- node.js - Express-session 每次页面加载都会创建一个新会话