将数组缩放到 midi



我正在做一个项目,我正在对微控制器进行编程,以计算编码器的脉冲并相应地增加/减少变量。此数字将更改 16 位数模转换器的值。因此,编码器需要在 0 - 65535 的范围内计数。

我遇到的问题是,如何缩放另一个(较低位、midi 值、0-127)数字以遵循上述编码器的值,以便两个数字范围同时从 0 开始,并分别以最高值结束。

所以当 16 位数 = 0 时,中间值 = 0

或者当 16 位数 = 1023 时,中间值 = 1

或者当 16 位数 = 1024 时,中间值 = 2

当 16 位数字 = 65535 时,中间值 = 127

等。

因此,midiValue 的每个增量都需要 16 位数字的 512 增量。

我希望能够传递一个数字(16BitNumber)的函数,并具有符合midi值的比例。所以理论上我只能在非易失性 RAM 中存储一个值作为预设,以便稍后调用,并且所有相关数组都会相应地更新。我需要能够使用更高分辨率的数字进行计数,以便相对于 midi 值我可以有更多的"步长"。

我的第一个倾向是列出一长串 if 语句;

if ( 16BitNumber >= 1024 && 16BitNumber <1536) {
     midiValue = 3;
}

似乎需要很长时间才能全部输入出来,我不太担心,因为我不能只写一些代码来为我写一些代码。我最关心的是尝试做一些快速的事情。快速编码器更改意味着如果我的代码未优化,midiValue 可能会跟上进度较慢。

我的另一个想法是操纵数组的索引以选择正确的值,但这似乎会很慢。我也只需要接受整数midiValues,据我所知,这需要模除法,这是又一步。

真的很想得到一些关于我应该朝哪个方向前进的建议。

您的问题并没有完全说明16BitNumbermidiValue的类型,但假设使用了uint16_tuint8_t类型,您可以简单地使用移位运算符>>

MidiValue= 16BitNumber >> 9; 

事实上,MidiValue16BitNumber的 7 个最高有效位的值。

7bitnumber = 16bitnumber >> 9;

最新更新