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

标签 c++ binary midi

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

最佳答案

在构成增量时间的字节中,最高有效位指定后面是否有另一个具有更多位的字节。 这意味着像 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()。)

关于c++ - (C++) 特定位数的整数(MIDI 文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26223862/

相关文章:

javascript - 清除 MIDI 输出缓冲区

c++ - 如果发生 midi 速度变化,它会改变所有剩余的速度变化时间吗?

c++ - C 是否对声明的变量大小有 64k 的限制?

java - 从十六进制转换为二进制,反之亦然。艰难的道路

c++ - 递归和返回 boolean 值

python - 将 python 3 中的大列表保存到二进制文件

android - AudioTrack 可以播放 MIDI 文件吗?

c++ - MPI:进程 0 执行其代码两次

c++ - 存储和调用具有未知参数的成员函数

c++ - 无法在 Ubuntu 的 QtCreator 中将 glfw 与 CMake 链接