将数组扩展为midi

时间:2016-02-21 17:09:41

标签: c++ arrays midi

我正在开发一个项目,我正在编程一个微控制器来计算编码器的脉冲并相应地增加/减少一个变量。该数字将改变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,据我所知,这需要模数除法,这是另一步。

我真的想就我应该采取的方向提出一些建议。

2 个答案:

答案 0 :(得分:3)

您的问题并未准确说明16BitNumbermidiValue的类型,但假设使用了uint16_tuint8_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));
    },
});