繁体   English   中英

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

[英](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 )分为两部分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));

(另请参见函数var_value()arecordmidi.c )。

如果使用无符号整数,则只需正常进行计算即可。

从...开始

 value = 960 ;

要将最终输出转换为14位,请执行

  value &= 0x3FFF ;

要在前面添加二进制文件10

  value |= 0x8000 ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM