(C ++)特定位数的整数(MIDI文件)

时间:2014-10-06 19:55:19

标签: c++ binary midi

音乐的midi规范允许将delta持续时间编码为整数值(表示滴答)。 例如,我的增量时间为960。 二进制值960是1111000000。 问题是,midi规范不能对16位的数字进行编码。 它将其编码为14位,然后在2个第一位添加10以创建另一个16位值,1表示存在后续字节,0表示它是最后一个字节。 我的问题是:如何轻松计算960作为14位编码的二进制值? 干杯

3 个答案:

答案 0 :(得分:1)

您可以在结构中指定任意数量的位作为长度,如下所示:

struct customInt {
    unsigned int n:14; // 14-bit long unsigned integer type
};

或者您可以创建自己的函数来处理这些特定的计算/值。

答案 1 :(得分:1)

在组成增量时间的字节中,最高有效位指定是否跟随另一个具有更多位的字节。 这意味着像00001111000000这样的14位值被分为00001111000000两部分,编码如下:

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 ;