音乐的midi规范允许将delta持续时间编码为整数值(表示滴答)。 例如,我的增量时间为960。 二进制值960是1111000000。 问题是,midi规范不能对16位的数字进行编码。 它将其编码为14位,然后在2个第一位添加10以创建另一个16位值,1表示存在后续字节,0表示它是最后一个字节。 我的问题是:如何轻松计算960作为14位编码的二进制值? 干杯
答案 0 :(得分:1)
您可以在结构中指定任意数量的位作为长度,如下所示:
struct customInt {
unsigned int n:14; // 14-bit long unsigned integer type
};
或者您可以创建自己的函数来处理这些特定的计算/值。
答案 1 :(得分:1)
在组成增量时间的字节中,最高有效位指定是否跟随另一个具有更多位的字节。
这意味着像00001111000000
这样的14位值被分为0000111
和1000000
两部分,编码如下:
1 0000111 0 1000000
^ ^ ^ lower 7 bits
| | \
| \ last byte
\ upper 7 bits
more bytes follow
在C中,14位值可以这样编码:
int value = 960;
write_byte(0x80 | ((value >> 7) & 0x7f));
write_byte(0x00 | ((value >> 0) & 0x7f));
(另请参阅arecordmidi.c中的var_value()
功能。)
答案 2 :(得分:0)
如果使用无符号整数,只需正常进行计算即可。
从
开始 value = 960 ;
要将最终输出转换为14位,请执行
value &= 0x3FFF ;
将二进制10添加到前面
value |= 0x8000 ;