[英](C++) Integer on a specific number of bits (MIDI File)
音乐的midi规范允许将持续时间编码为整数值(代表刻度)。 例如,我的增量时间为960。二进制值960为1111000000。问题是midi范数不会对16位数字进行编码。 它在14位上进行编码,然后在前2位上加10以创建另一个16位值,1表示后面有一个字节,0表示最后一个字节。 我的问题是:如何轻松地将960计算为以14位编码的二进制值? 干杯
您可以在结构中指定任意数量的位作为长度,如下所示:
struct customInt {
unsigned int n:14; // 14-bit long unsigned integer type
};
或者,您可以制作自己的函数来处理这类特定的计算/值。
在组成增量时间的字节中,最高有效位指定是否跟随另一个具有更多位的字节。 这意味着将14位值(如00001111000000
)分为两部分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));
(另请参见函数var_value()
中arecordmidi.c )。
如果使用无符号整数,则只需正常进行计算即可。
从...开始
value = 960 ;
要将最终输出转换为14位,请执行
value &= 0x3FFF ;
要在前面添加二进制文件10
value |= 0x8000 ;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.