2016-02-21 2 views
0

Я работаю над проектом, где я программирую микроконтроллер для подсчета импульсов энкодера и соответственно увеличиваю/уменьшаю переменную. Это число изменит значение 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. Поэтому теоретически я могу сохранить только одно значение в энергонезависимой ОЗУ в качестве пресета, которое будет вызвано позже, и все соответствующие массивы будут соответствующим образом обновлены. Мне нужно иметь возможность подсчитывать номер с более высоким разрешением, чтобы у меня было больше «шагов» относительно значения midi.

Моим первым наклонением было бы сделать длинный список утверждений if;

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

Похоже, что это займет много времени, чтобы набрать это все из которых, не Im слишком беспокоит, поскольку я не могу просто написать код, чтобы написать код для меня. То, что меня беспокоит больше всего, пытается сделать что-то быстро. Быстрые изменения кодера означают, что midiValue может замедлить работу, если мой код не оптимизирован.

Моей другой идеей было бы манипулировать индексом массива, чтобы выбрать правильное значение, но похоже, что это будет очень медленно. Мне также нужно будет принимать только целое число midiValues, которое, как я понимаю, потребует модульного деления, а это еще один шаг.

Я действительно хотел бы несколько советов о том, в каком направлении я должен возглавить в.

ответ

0
7bitnumber = 16bitnumber >> 9; 
+0

awesome, спасибо за помощь! – APutz

+0

@ APutz: подумайте о принятии этого ответа, если он решит вашу проблему. Вы также можете проголосовать за него, нажав стрелку вверх. – Antoine

3

Ваш вопрос точно не указать тип 16BitNumber и midiValue но предполагая uint16_t и Ан uint8_t типы используются вы можете просто используйте оператор сдвига >>.

MidiValue= 16BitNumber >> 9; 

Действительно MidiValue является значение 7 наиболее значимых битов 16BitNumber.

Смежные вопросы