我正在将MIDI消息发送到带有LCD屏幕的专有转盘。普通软件通过MIDI SysEx发送更新,以在LCD上显示当前速度。在MKL25Z128VLK4,Cortex-M0 + / ARMv6-M设备上正在接收MIDI。 (我仔细检查了所用芯片的类型后确实拆开了固件.bin,但结果是约3万行汇编)LCD型号无需拆焊就无法访问
此时,我可以成功更新屏幕,但是我无法从给定的数字中找出模式,希望其他人对此有经验。
到目前为止,这是我发现的内容:
设置单个字节到9-126之间的任何值都会导致00.0
  BPM   B1    B2    B3    B4
 00.0   0     0     0     0
 00.0   0     0     0     1
 00.0   0     0     0     2
 00.0   0     0     0     3
 00.0   0     0     0     4
 00.0   0     0     0     5
 00.0   0     0     0     6
 00.0   0     0     0     7
 00.0   0     0     0     8
 00.0   0     0     0    16
 00.0   0     0     0    32
 00.0   0     0     0    64
 00.1   0     0     0   127
 00.1   0     0     1     0
 00.3   0     0     2     0
 00.4   0     0     3     0
 00.6   0     0     4     0
 00.8   0     0     5     0
 00.9   0     0     6     0
 01.1   0     0     7     0
 01.2   0     0     8     0
 00.0   0     0    16     0
 00.0   0     0    32     0
 00.0   0     0    64     0
 02.4   0     0   127     0
 02.5   0     1     0     0
 05.1   0     2     0     0
 07.6   0     3     0     0
 10.2   0     4     0     0
 12.8   0     5     0     0
 16.3   0     6     0     0
 17.9   0     7     0     0
 20.4   0     8     0     0
 00.0   0    16     0     0
 00.0   0    32     0     0
 00.0   0    64     0     0
 38.4   0   127     0     0
 40.9   1     0     0     0
 81.9   2     0     0     0
122.8   3     0     0     0
163.8   4     0     0     0
204.8   5     0     0     0
245.7   6     0     0     0
286.7   7     0     0     0
327.6   8     0     0     0
 00.0  16     0     0     0
 00.0  32     0     0     0
 00.0  64     0     0     0
614.4 127     0     0     0

打开多个字节会将它们与有时奇怪的结果加在一起
 40.9   1     0     0     0
 00.1   0     0     1     0
 41.1   1     0     1     0

 81.9   2     0     0     0
 00.1   0     0     1     0
 82.0   2     0     1     0


我想知道是否存在一些浮点数或按位我只是不精通数学,如果是这样,那么用于计算的实数和数据类型是什么?我觉得了解这一点对于解决此问题至关重要,而无需庞大的查找表或对其进行破坏,也无需编写自己的控制器

评论

转盘的品牌和型号是什么?

您的字节值表根本不清楚。也许只是为每个显示值写出完整的字节序列?

@Bavi_H Reloop RP-8000(mk1和mk2)

@IgorSkochinsky我为此感到苦恼,因为Stack不支持表。没错,完整的字节序列更加清晰。为了清楚起见,我已经更新了帖子,并添加了许多数据点。谢谢

在仅将一个字节设置为非零值的测试过程中,是否确定将特定字节设置为从9到126的值会导致速度为零? 15会产生与127相同的速度吗? (我怀疑速度值会以16个值的周期重复,这意味着字节值0-15、16-31、32-47、48-63、64-79、80-95、96-111和112-127产生同样的节奏。)

#1 楼

二进制

MIDI数据字节为7位,这意味着它们可以具有从0到127的十进制值。

以7位二进制数表示:


右边的位代表十进制值1。
左边的下一位代表十进制值2。
左边的下一位代表十进制值4, 8、16、32和64。

可以用7位来表示从0到127的十进制值,其中每个位都是0或1。

binary   decimal
0000001  1 = 1
0000010  2 = 2
0000011  3 = 2 + 1
0000100  4 = 4
0000101  5 = 4 + 1
0000110  6 = 4 + 2
0000111  7 = 4 + 2 + 1
0001000  8 = 8
0001001  9 = 8 + 1
...
1111111  127 = 64 + 32 + 16 + 8 + 4 + 2 + 1


模式

从您描述的结果来看,我怀疑转盘仅关心每个字节中的最低4位。换句话说,只有十进制值为1、2、4和8的位才会对速度显示产生影响。这意味着只有0到15的字节值才有用。

我怀疑转盘使用以下模式:

B1  B2  B3  B4  tempo  display
 0   0   0   0   .00     .0
 0   0   0   1   .01      "
 0   0   0   2   .02      "
 0   0   0   3   .03      "
 0   0   0   4   .04      "
 0   0   0   5   .05      "
 0   0   0   6   .06      "
 0   0   0   7   .07      "
 0   0   0   8   .08      "
 0   0   0   9   .09      "
 0   0   0  10   .10     .1
 0   0   0  11   .11      "
 0   0   0  12   .12      "
 0   0   0  13   .13      "
 0   0   0  14   .14      "
 0   0   0  15   .15      "
 0   0   1   0   .16      "
 0   0   1   1   .17      "
 0   0   1   2   .18      "
 0   0   1   3   .19      "
 0   0   1   4   .20     .2
...


字节值代表速度值以.01单位表示,但是当转盘显示速度时,它将隐藏最后一位数字。

此隐藏数字说明了为什么打开多个字节并不总是产生由显示的速度总和单个字节值。

B1  B2  B3  B4  tempo  display
 1   0   0   0  40.96   40.9
 0   0   1   0    .16     .1
 1   0   1   0  41.12   41.1


按位数学运算

当仅使用某些位时,按位数学运算确实有用。

例如,下面的一些Javascript将速度转换为所需的字节值:

t = 123.4;

v = 100 * t;

b1 = (v >> 12) & 15;
b2 = (v >> 8) & 15;
b3 = (v >> 4) & 15;
b4 = v & 15;

console.log(b1, b2, b3, b4);


x & 15是按位AND,在这种情况下,仅保留最低的四位。

x >> 4是右移,在这种情况下,将值右移4位,这将丢弃最低的四位。这与除以16并丢弃余数具有相同的效果。

以下是一些将字节值转换为显示的速度的Javascript:

b1 = 3;
b2 = 0;
b3 = 3;
b4 = 4;

b1 = b1 & 15;
b2 = b2 & 15;
b3 = b3 & 15;
b4 = b4 & 15;

v = 16*16*16*b1 + 16*16*b2 + 16*b3 + b4;

t = parseInt(v / 10) / 10;

console.log(t);


在您的Web浏览器中,您可以转到about:blank,然后按F12并进入Console来输入这些小的Javascript计算。 (为了安全起见,在地址栏中输入about:blank,如果您不理解,请不要运行陌生人的代码。)

评论


“我建议分别打开每个位,然后查看显示的速度值。”对不起,如果我不清楚,我肯定会这样做。例如,字节3:0在显示屏上显示为0。 1是2.5、2是5.1、3是7.6、4是10.2、5是10.2、6是12.8。因此,似乎值是2.5,显示的速度是字节* 2.5...。由于有些奇怪的舍入错误,我无法弄清楚我忘记了分割字节的事情,我之前不得不处理过。臀部完全疼痛

–监狱
20年5月30日在9:18

我懂了。我不知道可以解释您结果的特殊模式。如果您想自己寻找一种模式,如果您已写下所有值,我会尝试其他想法:尝试绘制图形,尝试计算从一种速度到另一种速度的差异,并在差异中寻找模式,尝试计算从一个速度到另一速度的倍增因子,并在倍增因子中寻找模式。如果您需要帮助来寻找模式,那么数据字节值为8、16、32和64时会怎样? (甚至,您收集的所有数据值和结果速度是多少?)

– Bavi_H
20年5月30日在10:57

我今天还收集了一些要点,并对帖子进行了重新格式化和更新。 9-126处的任何内容都显示00.0,这使创建表变得不那么艰巨了。大笑127很特别,我对此没有任何解释

–监狱
20 May 30 '21:19



@chason感谢您的更新。我认为在您的注释对字节3(您现在称为字节2)说完之后,我提出的模式是错误的,值4导致速度10.2,而值5也导致速度10.2。但是,现在更新的问题显示的是字节2,值4导致速度10.2,值5导致速度12.8。所以我怀疑我的模式毕竟是正确的。我已经编辑了答案,希望可以更好地解释我所看到的模式。

– Bavi_H
20-05-31在8:56

“您现在将其称为字节2”大声。太糟糕了,我无法编辑帖子的标题。隐藏的数字解释了很多,我应该想到这一点。好决定。感谢您帮助我完成工作并提供了如此详细的答案。如果没有您的帮助,我不会成功的。

–监狱
20年6月1日,0:18