我正在开发一个项目,我正在编程一个微控制器来计算编码器的脉冲并相应地增加/减少一个变量。该数字将改变16位数模转换器的值。因此编码器需要从0到65535的范围内计数。
我遇到的问题是如何缩放另一个(较低位,midi值,0-127)数字以跟随上面编码器的值,以便两个数字范围同时从0开始,并结束分别是他们的最高价值。
所以当16BitNumber = 0时,midiValue = 0
或当16BitNumber = 1023时,midiValue = 1
或当16BitNumber = 1024时,midiValue = 2
当16BitNumber = 65535时,midiValue = 127
等
所以midiValue的每个增量都需要增加512的16BitNumber。
我希望能够传递一个函数一个数字(16BitNumber)并且具有midi值。因此理论上我只能在非易失性RAM中存储一个值作为稍后要调用的预设,并且所有相关数组都将相应地更新。我需要能够计算出更高分辨率的数字,这样我才能有更多的步骤"相对于midi值。
我的第一个倾向是制作一长串if语句;
if ( 16BitNumber >= 1024 && 16BitNumber <1536) {
midiValue = 3;
}
似乎需要花费很长时间才能完全输入,我不太担心,因为我不能写一些代码来为我编写一些代码。我最关心的是尝试做一些快速的事情。快速编码器更改意味着如果我的代码未经优化,midiValue可能会很慢。
我的另一个想法是操纵数组的索引来选择正确的值,但这似乎很慢。我还需要只接受整数midiValues,据我所知,这需要模数除法,这是另一步。
我真的想就我应该采取的方向提出一些建议。
答案 0 :(得分:3)
您的问题并未准确说明16BitNumber
和midiValue
的类型,但假设使用了uint16_t
和uint8_t
类型,您只需使用移位运算符{{ 1}}。
>>
确实MidiValue= 16BitNumber >> 9;
是MidiValue
的7个最重要位的值。
答案 1 :(得分:0)
var pre = $('<pre>').css('display','inline-block')
.css('word-break','break-all')
.appendTo('body').css('visibility','hidden');
function initPre(textarea){
pre.text(textarea.text())
.width(textarea.width())
.css('font',textarea.css('font'));
}
$('textarea').on({
input: function(){
var text = $(this).val();
pre.text(text);
$(this).height(text ? pre.height() : '1.1em');
},
focus: function(){
initPre($(this));
},
});