Я нахожусь в процессе сборки драм-машины и хочу иметь два 16-битных массива, определяющих состояние машины.Один массив "current_led", который имеет 1, установленный в индексе, соответствующем текущей 16-ой ноте, которую играют.
Когда пользователь программирует звук для воспроизведения, например, на шагах 1 и 4, я хочу, чтобы один 16-битный массив selected_steps имел 1, установленный в индексах 0 и 3.
Поэтому я хочу, чтобы на каждом шаге обновления, определяемом числом ударов в минуту, «current_led» сдвигал бит, но «selected_steps» был статическим.
Мне нужен конечный массив «led_array», который строится из
led_array = XOR(selected_steps,current_led)
Это так, что я могу использовать сдвиговый регистр для подсветки правильных светодиодов при каждом шаге обновления.
Но так как у меня есть некоторые проблемы с определением и работой с битами и массивами в CI, я не понимаю, как правильно инициализировать массивы и работать с ними.
Что бы я хотел, что-то вроде
int current_led[16];
int selected_steps[16];
int led_array[16];
//Function is called every 0.5 s if BPM 120.
void step(void) {
step_number = step_number < 15 ? step_number +1 : 0;
}
Я использую 2 сдвиговых регистра PISO для передачи ввода с 16 кнопок на мой микроконтроллер.У меня постоянный высокий нагрузочный вывод Parallell, так что всякий раз, когда пользователь нажимает кнопку, соответствующий вывод на регистре сдвига устанавливается на 1. Поэтому я читаю каждые 16 контактов каждый раз, чтобы увидеть, нажал ли пользователь какой-либокнопки.
//Check which steps are selected by the user. This function is called every 1 ms
void scan_buttons() {
for (int j = 0; j<16 ; j++) {
if (PIND & 0b01000000){
selected_steps[j] = 1;
} else {
selected_steps[j] = 0;
}
void update_led(void) {
current_led = (1 << step_number);
led_array = current_led^selected_steps;
for (int j = 15; j>=0 ; j--) {
if (led_array[j] == 1) {
do something...
} else {
do something else...
}
}
}
Итак, для ясности, вот пример того, как светодиоды должны представлять это состояние.Если BPM установлен на 120, и у нас есть 16 шагов (4 удара), шаг должен увеличиваться каждые 60 / BPM секунд (0,5 секунды).Текущий шаг обозначен ярким светодиодом.Я также указываю пользователю, на каком этапе он / она запрограммировал звук, постоянно включая светодиод на этом текущем шаге.
Шаг 1: step_number = 0
LED: [1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
Шаг2: step_number = 1
LED: [0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
Шаг 3: step_number = 2, selected_step [7] = 1, selected_step [11] = 1,
(пользователь выбрал ввод звука нашаги 8 и 12 нажатием кнопок 8 и 12)
LED: [0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0]
Шаг 4: номер_шага = 3, выбранный_шаг [7] = 1, выбранный_шаг [11] = 1,
(у пользователя естьне нажимал ни одной кнопки с момента последнего шага)
LED: [0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0]
Но я не понимаю, как объявлять массивы и писать правильный код для правильной установки битов и выполнения операций XOR.