Добавить в существующий код разем midi in 500

denia85
Offline
Зарегистрирован: 18.11.2019

Добрый день
Есть основной код и пример кода для добавления разъема. Отдельно этот код работает. Но объединить самому оба кода не получилось.
Вот код midi in

#include // Add Midi Library

#define LED 13 // Arduino Board LED is on Pin 13

//Create an instance of the library with default name, serial port and settings
MIDI_CREATE_DEFAULT_INSTANCE();

void setup() {
pinMode (LED, OUTPUT); // Set Arduino board pin 13 to output
MIDI.begin(MIDI_CHANNEL_OMNI); // Initialize the Midi Library.
// OMNI sets it to listen to all channels.. MIDI.begin(2) would set it
// to respond to notes on channel 2 only.
MIDI.setHandleNoteOn(MyHandleNoteOn); // This is important!! This command
// tells the Midi Library which function you want to call when a NOTE ON command
// is received. In this case it's "MyHandleNoteOn".
MIDI.setHandleNoteOff(MyHandleNoteOff); // This command tells the Midi Library
// to call "MyHandleNoteOff" when a NOTE OFF command is received.
}

void loop() { // Main loop
MIDI.read(); // Continuously check if Midi data has been received.
}

// MyHandleNoteON is the function that will be called by the Midi Library
// when a MIDI NOTE ON message is received.
// It will be passed bytes for Channel, Pitch, and Velocity
void MyHandleNoteOn(byte channel, byte pitch, byte velocity) {
digitalWrite(LED,HIGH); //Turn LED on
}

// MyHandleNoteOFF is the function that will be called by the Midi Library
// when a MIDI NOTE OFF message is received.
// * A NOTE ON message with Velocity = 0 will be treated as a NOTE OFF message *
// It will be passed bytes for Channel, Pitch, and Velocity
void MyHandleNoteOff(byte channel, byte pitch, byte velocity) {
digitalWrite(LED,LOW); //Turn LED off
}

А вот код основной

void setup() {
pinMode(LED_CHANNEL_0, OUTPUT);
pinMode(LED_CHANNEL_1, OUTPUT);
pinMode(LED_CHANNEL_2, OUTPUT);
pinMode(LED_CHANNEL_3, OUTPUT);
pinMode(LED_CHANNEL_4, OUTPUT);
pinMode(LED_CHANNEL_5, OUTPUT);

// Инициализация последовательного порта и установка скорости MIDI (31250 бод):
#ifdef DEBUG_PRESSURE
Serial.begin(57600);
#else
Serial.begin(31250);
#endif

void loop() {
// ОБРАБОТКА ДАТЧИКА ДАВЛЕНИЯ
// Считать сырое (необработанное) значение датчика давления и вычесть из него среднее значение
//press_raw_value = analogRead(6) - press_center_value;
// Значение должно быть положительным. А также отфильтровать его.
//press_out_value = PRESS_FILTER*((float)(abs(press_raw_value))) + ((float)1.0-PRESS_FILTER)*(float)press_out_value;
// "Мёртвая зона" ниже которой выход датчика считается нулём.
//if (press_out_value < PRESS_MIN_VALUE) press_out_value = 0; else press_out_value -= PRESS_MIN_VALUE;
// Ограничить значение. Оно должно быть не более максимального.
//if (press_out_value > PRESS_MAX_VALUE) press_out_value = PRESS_MAX_VALUE;
// Если значение датчика поменялось, послать команду изменения громкости.
// if (press_out_value != press_prev_value)
// {
//#ifdef DEBUG_PRESSURE
// // Вывести в порт значнеие с датчика
// Serial.println(press_out_value ,DEC);
//#else
// // Для всех каналов
// for (int channel=0; channel // {
// // Вычислить громкость канала из заданной громкости и выхода датчика давления.
// // В зависимости от выхода датчика давления громкость будет изменяться от нуля до текущей заданной громкости канала.
// int volume = (((long int)(md_data.md_channel_volume[channel]) * press_out_value / PRESS_MAX_VALUE));
// // 0xB0 MIDI_CONTROL_CHANGE
// // 0x07 MIDI_CONTROL_CHANNEL_VOLUME
// if ((md_data.md_pressure == 1) && (md_pressure_lock == 0)) // Если датчик включен и не заблокирован кнопкой "Режим"
// Command3(0xB0 | channel, 0x07,volume);
// }
//#endif
// }
// ОБРАБОТКА КНОПОК
data[i] = 0;
// Включить линию датчиков Холла в соответствии со значением счётчика.
// С каждым циклом выбираем одну из линий.
// Если нужно добавить ещё линию, то добавьте ещё одну строку ниже:
if (0 == i) PORTB |= (1 << L0_PB2); // Включен L0
if (1 == i) PORTB |= (1 << L1_PB4); // Включен L1
if (2 == i) PORTB |= (1 << L2_PB3); // Включен L2
if (3 == i) PORTB |= (1 << L3_PB0); // Включен L3
if (4 == i) PORTB |= (1 << L4_PB5); // Включен L4
if (5 == i) PORTD |= (1 << L5_PD4); // Включен L5
if (6 == i) PORTD |= (1 << L6_PD5); // Включен L6
if (7 == i) PORTD |= (1 << L7_PD2); // Включен L7
if (8 == i) PORTD |= (1 << L8_PD3); // Включен L8
if (9 == i) PORTB |= (1 << L9_PB1); // Включен L9
if (10 == i) PORTL |= (1 << L10_PL0); // Включен L10
if (11 == i) PORTL |= (1 << L11_PL1); // Включен L11
if (12 == i) PORTL |= (1 << L12_PL2); // Включен L12
if (13 == i) PORTL |= (1 << L13_PL3); // Включен L13
if (14 == i) PORTL |= (1 << L14_PL4); // Включен L14
if (15 == i) PORTL |= (1 << L15_PL5); // Включен L15
if (16 == i) PORTL |= (1 << L16_PL6); // Включен L16
if (17 == i) PORTL |= (1 << L17_PL7); // Включен L17
// Задержка на 2000 счётов
for (volatile int a = 0; a < 2000; a++);

// Собрать один байт данных из линий D0 - D7
data[i] |= PINC & ((1 << D0_PC0) | (1 << D1_PC1) | (1 << D2_PC2) | (1 << D3_PC3) | (1 << D4_PC4) | (1 << D5_PC5));
data[i] |= PIND & ((1 << D6_PD6) | (1 << D7_PD7));

// Если предыдущее состояние кнопок не равно текущему. То есть что-то стало нажато или отпущено.
//if (datap[i] != data[i])
{
// Перебрать все 8 бит данных data
for (j = 0; j < 8; j++)
{
// Если кнопка была отжата
if (( data[i] & (1 << j)) && (~datap[i] & (1 << j)))
{
// Взять из таблицы дополнительную функцию кнопки
char current_func = func[i][j];
// Если функция кнопки - "Режим", то разрешить дополнительные функции кнопок и запретить звучание
if ((current_func == _MD)) {
md_active = 0;
md_pressure_lock = 0; // Разблокировать датчик давления
for (int cnt = 0; cnt < MD_MAX_CHANNEL; cnt++) // На всех каналах
{
Command3 ((0xB0 | cnt), 0x7B, 0); // Отключить звучание
Command3 ((0xB0 | cnt), 0x07, md_data.md_channel_volume[cnt]); // задать громкость всем каналам
}
}

// Если функция кнопки - "Канал 0" .. "Канал 5", то выставить флаг нажатия
if ((current_func == _C0)) {
c0_active = 0;
//show_channel_number(LED_0, LED_OFF);
}
if ((current_func == _C1)) {
c1_active = 0;
//show_channel_number(LED_1, LED_OFF);
}
if ((current_func == _C2)) {
c2_active = 0;
//show_channel_number(LED_2, LED_OFF);
}
if ((current_func == _C3)) {
c3_active = 0;
//show_channel_number(LED_3, LED_OFF);
}
if ((current_func == _C4)) {
c4_active = 0;
//show_channel_number(LED_4, LED_OFF);
}
if ((current_func == _C5)) {
c5_active = 0;
//show_channel_number(LED_5, LED_OFF);
}

// Дополнительные функции обрабатываются только при нажатой кнопке "Режим"
if (md_active == 1)
{
char register_changed = 0;
if (current_func == _R0) // Отжата кнопка "Регистр 0", прочитать регистр 0
{
md_offset = 0;
register_changed = 1;
}
if (current_func == _R1) // Отжата кнопка "Регистр 1", прочитать регистр 1
{
md_offset = MD_SIZE * 1;
register_changed = 1;
}
if (current_func == _R2) // Отжата кнопка "Регистр 2", прочитать регистр 2
{
md_offset = MD_SIZE * 2;
register_changed = 1;
}
if (current_func == _R3) // Отжата кнопка "Регистр 3", прочитать регистр 3
{
md_offset = MD_SIZE * 3;
register_changed = 1;
}
if (current_func == _R4) // Отжата кнопка "Регистр 4", прочитать регистр 4
{
md_offset = MD_SIZE * 4;
register_changed = 1;
}
if (current_func == _R5) // Отжата кнопка "Регистр 5", прочитать регистр 5
{
md_offset = MD_SIZE * 5;
register_changed = 1;
}
if (current_func == _R6) // Отжата кнопка "Регистр 6", прочитать регистр 6
{
md_offset = MD_SIZE * 6;
register_changed = 1;
}
if (current_func == _R7) // Отжата кнопка "Регистр 7", прочитать регистр 7
{
md_offset = MD_SIZE * 7;
register_changed = 1;
}
// Отжата одна из кнопок плюс/минус
if ((current_func == _PI) || (current_func == _MI) || (current_func == _PV) || (current_func == _MV) ||
(current_func == _C0) || (current_func == _C1) || (current_func == _C2) ||
(current_func == _C3) || (current_func == _C4) || (current_func == _C5) || (current_func == _EP))
{
for (int cnt = 0; cnt < MD_MAX_CHANNEL; cnt++) // На всех каналах
Command3 ((0xB0 | cnt), 0x7B, 0); // Отключить звучание
}

// Применить изменения, если они были
if (register_changed == 1)
{
// Отменить таймер сохранения
md_delay_ok = md_delay;
// Прочитать конфигурацию
for (int cnt = 0; cnt < MD_MAX_CHANNEL; cnt++)
{
md_data.md_channel_instrument[cnt] = EEPROM.read(cnt + md_offset);
}
for (int cnt = 0; cnt < MD_MAX_CHANNEL; cnt++)
{
md_data.md_channel_volume[cnt] = EEPROM.read(MD_MAX_CHANNEL + cnt + md_offset);
}
md_data.md_pressure = EEPROM.read(MD_MAX_CHANNEL + MD_MAX_CHANNEL + MD_MAX_CHANNEL + md_offset);

// Для всех каналов задать инструмент и громкость
for (int cnt = 0; cnt < MD_MAX_CHANNEL; cnt++)
{
// Если после чтения значения вышли за пределы - исправить
if (md_data.md_channel_instrument[cnt] > MD_MAX_INSTRUMENT) md_data.md_channel_instrument[cnt] = 0;
if (md_data.md_channel_volume[cnt] > MD_MAX_VOLUME) md_data.md_channel_volume[cnt] = 64;
// Задать параметры
Command2 ((0xC0 | cnt), md_data.md_channel_instrument[cnt]);
for (char a = 0; a < 100; a++);
Command3 ((0xB0 | cnt), 0x07, md_data.md_channel_volume[cnt]);
for (char a = 0; a < 100; a++);
}
}
}

md_chan_h = (chan[i][j] >> 4) & 0x0F; // Взять из таблицы номер старшего канала для текущей кнопки
md_chan_l = (chan[i][j] ) & 0x0F; // Взять из таблицы номер младшего канала для текущей кнопки

// Если кнопка звуковая и дополнительные функции не активны, то то прекратить звучание ноты (из таблицы соответствия нот кнопкам)
if ((notes[i][j] != NNN) && (md_active == 0))
{
if (md_chan_h == md_chan_l)
{
noteOn(0x80 | md_chan_h, notes[i][j], 0x00);
}
else
{
noteOn(0x80 | md_chan_h, notes[i][j], 0x00);
noteOn(0x80 | md_chan_l, notes[i][j], 0x00);
}
}
}
// Если кнопка была нажата
if ((~data[i] & (1 << j)) && ( datap[i] & (1 << j)))
{
// Взять из таблицы дополнительную функцию кнопки
char current_func = func[i][j];
// Если функция кнопки - "Режим", то разрешить дополнительные функции кнопок и прекратить звучание
if ((current_func == _MD)) {
md_active = 1; // Разрешить дополнительные функции
md_pressure_lock = 1; // Заблокировать датчик давления
for (int cnt = 0; cnt < MD_MAX_CHANNEL; cnt++) // На всех каналах
{
Command3 ((0xB0 | cnt), 0x7B, 0); // Отключить звучание
Command3 ((0xB0 | cnt), 0x07, md_data.md_channel_volume[cnt]); // задать громкость всем каналам
display.clearDisplay();
print_oled(rezhim_str, 3, 13, 8); //string, size text, x, y
change_volume_bar1(md_data.md_channel_volume[md_current_channel]);
}
}
// Дополнительные функции обрабатываются только при нажатой кнопке "Режим"
if (md_active == 1)
{
if (current_func == _PS) // Нажата кнопка - "Датчик давления"
{
if (md_data.md_pressure == 1) // если был включен, то выключтить
md_data.md_pressure = 0;
else // если был выключен, то включить
{
//press_center_value = analogRead(6);
md_data.md_pressure = 1;
for (int cnt = 0; cnt < MD_MAX_CHANNEL; cnt++) // На всех каналах
Command3 ((0xB0 | cnt), 0x07, 0); // задать нулевую громкость всем каналам
}
}
// Нажата кнопка "Канал 0", выбрать канал 0
if (current_func == _C0) {
md_current_channel = CHANNEL0; c0_active = 1; md_current_effect = MD_EFFECT_NO;
Command2 ((0xC0 | md_current_channel), md_data.md_channel_instrument[md_current_channel]);
noteOn(0x90 | md_current_channel, MD_DEFAULT_NOTE, 127);
print_oled_instrument_number(md_data.md_channel_instrument[md_current_channel]+1);
all_led_off();
change_led_channel_or_register(LED_CHANNEL_0, LED_ON);
}
// Нажата кнопка "Канал 1", выбрать канал 1
if (current_func == _C1) {
md_current_channel = CHANNEL1; c1_active = 1; md_current_effect = MD_EFFECT_NO;
Command2 ((0xC0 | md_current_channel), md_data.md_channel_instrument[md_current_channel]);
noteOn(0x90 | md_current_channel, MD_DEFAULT_NOTE, 127);
print_oled_instrument_number(md_data.md_channel_instrument[md_current_channel]+1);
all_led_off();
change_led_channel_or_register(LED_CHANNEL_1, LED_ON);
//show_channel_number(LED_1, LED_ON);
}
// Нажата кнопка "Канал 2", выбрать канал 2
if (current_func == _C2) {
md_current_channel = CHANNEL2; c2_active = 1; md_current_effect = MD_EFFECT_NO;
Command2 ((0xC0 | md_current_channel), md_data.md_channel_instrument[md_current_channel]);
noteOn(0x90 | md_current_channel, MD_DEFAULT_NOTE, 127);
print_oled_instrument_number(md_data.md_channel_instrument[md_current_channel]+1);all_led_off();
change_led_channel_or_register(LED_CHANNEL_2, LED_ON);
//show_channel_number(LED_2, LED_ON);
}
// Нажата кнопка "Канал 3", выбрать канал 3
if (current_func == _C3) {
md_current_channel = CHANNEL3; c3_active = 1; md_current_effect = MD_EFFECT_NO;
Command2 ((0xC0 | md_current_channel), md_data.md_channel_instrument[md_current_channel]);
noteOn(0x90 | md_current_channel, MD_DEFAULT_NOTE, 127);
print_oled_instrument_number(md_data.md_channel_instrument[md_current_channel]+1);
all_led_off();
change_led_channel_or_register(LED_CHANNEL_3, LED_ON);
//show_channel_number(LED_3, LED_ON);
}
// Нажата кнопка "Канал 4", выбрать канал 4
if (current_func == _C4) {
md_current_channel = CHANNEL4; c4_active = 1; md_current_effect = MD_EFFECT_NO;
Command2 ((0xC0 | md_current_channel), md_data.md_channel_instrument[md_current_channel]);
noteOn(0x90 | md_current_channel, MD_DEFAULT_NOTE, 127);
print_oled_instrument_number(md_data.md_channel_instrument[md_current_channel]+1);
all_led_off();
change_led_channel_or_register(LED_CHANNEL_4, LED_ON);
//show_channel_number(LED_4, LED_ON);
}
// Нажата кнопка "Канал 5", выбрать канал 5
if (current_func == _C5) {
md_current_channel = CHANNEL5; c5_active = 1; md_current_effect = MD_EFFECT_NO;
Command2 ((0xC0 | md_current_channel), md_data.md_channel_instrument[md_current_channel]);
noteOn(0x90 | md_current_channel, MD_DEFAULT_NOTE, 127);
print_oled_instrument_number(md_data.md_channel_instrument[md_current_channel]+1);
all_led_off();
change_led_channel_or_register(LED_CHANNEL_5, LED_ON);
//show_channel_number(LED_5, LED_ON);
}
// Нажата кнопка "Эффект Pitch"
if (current_func == _EP) {
md_current_effect = MD_EFFECT_PITCH;
Command3 ((0xE0 | md_current_channel), 0, md_data.md_pitch[md_current_channel]);
noteOn(0x90 | md_current_channel, MD_DEFAULT_NOTE, 127);
}
// Нажата кнопка "Плюс", задать следующий инструмент и подать команду о его смене для текущего канала
if (current_func == _PI)
{
if (md_current_effect == MD_EFFECT_NO)
{
if (md_data.md_channel_instrument[md_current_channel] < MD_MAX_INSTRUMENT) // Проверка максимального значения
{
md_data.md_channel_instrument[md_current_channel]++; // Прибавить 1 к инструменту
Command2 ((0xC0 | md_current_channel), md_data.md_channel_instrument[md_current_channel]); // Сменить инструмент
print_oled_instrument_number(md_data.md_channel_instrument[md_current_channel]+1);
}
}
if (md_current_effect == MD_EFFECT_PITCH)
{
if (md_data.md_pitch[md_current_channel] < MD_MAX_INSTRUMENT) // Проверка максимального значения
{
md_data.md_pitch[md_current_channel]++; // Прибавить 1
Command3 ((0xE0 | md_current_channel), 0, md_data.md_pitch[md_current_channel]); // Сменить pitch
}
}
noteOn(0x90 | md_current_channel, MD_DEFAULT_NOTE, 127); // Начать звучание
}
// Нажата кнопка "Минус", задать предыдущий инструмент и подать команду о его смене для текущего канала
if (current_func == _MI)
{
if (md_current_effect == MD_EFFECT_NO)
{
if (md_data.md_channel_instrument[md_current_channel] > 0) // Проверка минимального значения
{
md_data.md_channel_instrument[md_current_channel]--; // Вычесть 1 из инструмента
Command2 ((0xC0 | md_current_channel), md_data.md_channel_instrument[md_current_channel]); // Сменить
print_oled_instrument_number(md_data.md_channel_instrument[md_current_channel]+1);
}
if (md_data.md_channel_instrument[md_current_channel] == 0) {
print_oled_instrument_number(md_data.md_channel_instrument[md_current_channel]+1);
}
}
if (md_current_effect == MD_EFFECT_PITCH)
{
if (md_data.md_pitch[md_current_channel] > 0) // Проверка минимального значения
{
md_data.md_pitch[md_current_channel]--; // Вычесть 1
Command3 ((0xE0 | md_current_channel), 0, md_data.md_pitch[md_current_channel]); // Сменить pitch
}
}
noteOn(0x90 | md_current_channel, MD_DEFAULT_NOTE, 127); // Начать звучание установленным инструментом
}
// Нажата кнопка "Плюс громкость", увеличить громкость на 1 и подать команду о смене громкости для текущего канала
if (current_func == _PV)
{
if (md_data.md_channel_volume[md_current_channel] < MD_MAX_VOLUME) // Проверка максимального значения
{
md_data.md_channel_volume[md_current_channel]++; // Прибавить 1 к громкости
Command3 ((0xB0 | md_current_channel), 0x07, md_data.md_channel_volume[md_current_channel]); // Сменить громкость

display.clearDisplay();
print_oled(volume_str, 2, 13, 8); //string, size text, x, y
change_volume_bar(md_data.md_channel_volume[md_current_channel]);
}
noteOn(0x90 | md_current_channel, MD_DEFAULT_NOTE, 127); // Начать звучание установленным инструментом
}
// Нажата кнопка "Минус громкость", уменьшить громкость на 1 и подать команду о смене громкости для текущего канала
if (current_func == _MV)
{
if (md_data.md_channel_volume[md_current_channel] > 0) // Проверка минимального значения
{
md_data.md_channel_volume[md_current_channel]--; // Убавить 1 из громкости
Command3 ((0xB0 | md_current_channel), 0x07, md_data.md_channel_volume[md_current_channel]); // Сменить громкость

display.clearDisplay();
print_oled(volume_str, 2, 13, 8); //string, size text, x, y
change_volume_bar(md_data.md_channel_volume[md_current_channel]);
}
noteOn(0x90 | md_current_channel, MD_DEFAULT_NOTE, 127); // Начать звучание установленным инструментом
}
char register_changed = 0;
// Нажата одна из кнопок регистров. Запомнить номер регистра.
if (current_func == _R0) // Нажата кнопка "Регистр 0"
{
md_offset = MD_SIZE * 0;
register_changed = 1;
display.clearDisplay();
print_oled(registr0_str, 3, 2, 8); //string, size text, x, y
change_volume_bar1(md_data.md_channel_volume[md_current_channel]);
}
if (current_func == _R1) // Нажата кнопка "Регистр 1"
{
md_offset = MD_SIZE * 1;
register_changed = 1;
display.clearDisplay();
print_oled(registr1_str, 3, 2, 8); //string, size text, x, y
change_volume_bar1(md_data.md_channel_volume[md_current_channel]);
}
if (current_func == _R2) // Нажата кнопка "Регистр 2"
{
md_offset = MD_SIZE * 2;
register_changed = 1;
display.clearDisplay();
print_oled(registr2_str, 3, 2, 8); //string, size text, x, y
change_volume_bar1(md_data.md_channel_volume[md_current_channel]);
}
if (current_func == _R3) // Нажата кнопка "Регистр 3"
{
md_offset = MD_SIZE * 3;
register_changed = 1;
display.clearDisplay();
print_oled(registr3_str, 3, 2, 8); //string, size text, x, y
change_volume_bar1(md_data.md_channel_volume[md_current_channel]);
}
if (current_func == _R4) // Нажата кнопка "Регистр 4"
{
md_offset = MD_SIZE * 4;
register_changed = 1;
display.clearDisplay();
print_oled(registr4_str, 3, 2, 8); //string, size text, x, y
change_volume_bar1(md_data.md_channel_volume[md_current_channel]);
}
if (current_func == _R5) // Нажата кнопка "Регистр 5"
{
md_offset = MD_SIZE * 5;
register_changed = 1;
display.clearDisplay();
print_oled(registr5_str, 3, 2, 8); //string, size text, x, y
change_volume_bar1(md_data.md_channel_volume[md_current_channel]);
}
if (current_func == _R6) // Нажата кнопка "Регистр 6"
{
md_offset = MD_SIZE * 6;
register_changed = 1;
display.clearDisplay();
print_oled(registr6_str, 3, 2, 8); //string, size text, x, y
change_volume_bar1(md_data.md_channel_volume[md_current_channel]);
}
if (current_func == _R7) // Нажата кнопка "Регистр 7"
{
md_offset = MD_SIZE * 7;
register_changed = 1;
display.clearDisplay();
print_oled(registr6_str, 3, 2, 8); //string, size text, x, y
change_volume_bar1(md_data.md_channel_volume[md_current_channel]);
}

// Сохранить изменения, если они были, а также если нажаты все три кнопки канала одновременно
if ((register_changed == 1) && (c0_active == 1))// && (c1_active == 1) && (c2_active == 1))
{
// Записать
for (int cnt = 0; cnt < MD_MAX_CHANNEL; cnt++)
{
EEPROM.write(cnt + md_offset, md_data.md_channel_instrument[cnt]);
}
for (int cnt = 0; cnt < MD_MAX_CHANNEL; cnt++)
{
EEPROM.write(MD_MAX_CHANNEL + cnt + md_offset, md_data.md_channel_volume[cnt]);
}
EEPROM.write(MD_MAX_CHANNEL + MD_MAX_CHANNEL + MD_MAX_CHANNEL + md_offset, md_data.md_pressure);

// Для всех каналов задать инструмент и громкость
for (int cnt = 0; cnt < MD_MAX_CHANNEL; cnt++)
{
// Если после чтения значения вышли за пределы - исправить
if (md_data.md_channel_instrument[cnt] > MD_MAX_INSTRUMENT) md_data.md_channel_instrument[cnt] = 0;
if (md_data.md_channel_volume[cnt] > MD_MAX_VOLUME) md_data.md_channel_volume[cnt] = 64;
// Задать параметры
Command2 ((0xC0 | cnt), md_data.md_channel_instrument[cnt]);
for (char a = 0; a < 100; a++);
Command3 ((0xB0 | cnt), 0x07, md_data.md_channel_volume[cnt]);
for (char a = 0; a < 100; a++);
}
}
}

md_chan_h = (chan[i][j] >> 4) & 0x0F; // Взять из таблицы номер старшего канала для текущей кнопки
md_chan_l = (chan[i][j] ) & 0x0F; // Взять из таблицы номер младшего канала для текущей кнопки

// Если кнопка звуковая и дополнительные функции не активны, то начать звучание ноты (из таблицы соответствия нот кнопкам)
if ((notes[i][j] != NNN) && (md_active == 0))
{
if (md_chan_h == md_chan_l)
{
if (md_data.md_channel_volume[md_chan_h] > 0) noteOn(0x90 | md_chan_h, notes[i][j], 127);
}
else
{
if (md_data.md_channel_volume[md_chan_h] > 0) noteOn(0x90 | md_chan_h, notes[i][j], 127);
if (md_data.md_channel_volume[md_chan_l] > 0) noteOn(0x90 | md_chan_l, notes[i][j], 127);
}
}
}
// Если кнопка постоянно отжата, предотвращение залипания кнопки "Режим"
if ((data[i] & (1 << j)))
{
if (func[i][j] == _MD) {
md_active = 0;
all_led_off();
display.clearDisplay();
print_oled(active0_str, 2, 13, 8); //string, size text, x, y
change_volume_bar1(md_data.md_channel_volume[md_current_channel]);
}
if (func[i][j] == _C0) {
c0_active = 0;
//show_channel_number(LED_0, LED_OFF);
}
if (func[i][j] == _C1) {
c1_active = 0;
//show_channel_number(LED_1, LED_OFF);
}
if (func[i][j] == _C2) {
c2_active = 0;
//show_channel_number(LED_2, LED_OFF);
}
if (func[i][j] == _C3) {
c3_active = 0;
//show_channel_number(LED_3, LED_OFF);
}
if (func[i][j] == _C4) {
c4_active = 0;
//show_channel_number(LED_4, LED_OFF);
}
if (func[i][j] == _C5) {
c5_active = 0;
//show_channel_number(LED_5, LED_OFF);
}
}
}
}
// Обносить предыдущее значение
datap[i] = data[i];
// Отключить линию датчиков Холла
// Если нужно добавить ещё линию, то добавьте ещё одну строку ниже:
if (0 == i) PORTB &= ~(1 << L0_PB2); // Выключен L0
if (1 == i) PORTB &= ~(1 << L1_PB4); // Выключен L1
if (2 == i) PORTB &= ~(1 << L2_PB3); // Выключен L2
if (3 == i) PORTB &= ~(1 << L3_PB0); // Выключен L3
if (4 == i) PORTB &= ~(1 << L4_PB5); // Выключен L4
if (5 == i) PORTD &= ~(1 << L5_PD4); // Выключен L5
if (6 == i) PORTD &= ~(1 << L6_PD5); // Выключен L6
if (7 == i) PORTD &= ~(1 << L7_PD2); // Выключен L7
if (8 == i) PORTD &= ~(1 << L8_PD3); // Выключен L8
if (9 == i) PORTB &= ~(1 << L9_PB1); // Выключен L9
if (10 == i) PORTL &= ~(1 << L10_PL0); // Включен L10
if (11 == i) PORTL &= ~(1 << L11_PL1); // Включен L11
if (12 == i) PORTL &= ~(1 << L12_PL2); // Включен L12
if (13 == i) PORTL &= ~(1 << L13_PL3); // Включен L13
if (14 == i) PORTL &= ~(1 << L14_PL4); // Включен L14
if (15 == i) PORTL &= ~(1 << L15_PL5); // Включен L15
if (16 == i) PORTL &= ~(1 << L16_PL6); // Включен L16
if (17 == i) PORTL &= ~(1 << L17_PL7); // Включен L17
// Следующее значение линии L
i++;
// Если дошли до крайней линии, то начать с нулевой.
// Если нужно сделать количество линий больше чем L9, то нужно увеличить это значение.
if (i > 17) i = 0;
}

// plays a MIDI note. Doesn't check to see that
// cmd is greater than 127, or that data values are less than 127:
// Функция проигрывающая ноту
void noteOn(int cmd, int pitch, int velocity) {
#ifndef DEBUG_PRESSURE
Serial.write(cmd);
Serial.write(pitch);
Serial.write(velocity);
#endif
}

// Передать команду MIDI из двух байт.
void Command2 (char byte1, char byte2)
{
#ifndef DEBUG_PRESSURE
Serial.write(byte1);
Serial.write(byte2);
for (volatile unsigned int a = 0; a < 50; a++);
#endif
}

// Передать команду MIDI из трёх байт.
void Command3 (char byte1, char byte2, char byte3)
{
#ifndef DEBUG_PRESSURE
Serial.write(byte1);
Serial.write(byte2);
Serial.write(byte3);
for (volatile unsigned int a = 0; a < 50; a++);
#endif
}

void show_channel_number(byte number, bool state) {
//digitalWrite(number, state);
}

void print_oled_instrument_number(char number) {
display.clearDisplay();
print_oled(String(int(number)), 7, 2, 7); //string, size text, x, y
display.display();
}

void print_oled(String str, byte text_size, int x, int y) {//string, size text, x, y
display.setTextSize(text_size); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.setCursor(x, y); // Start at x,y
display.cp437(true); // Use full 256 char 'Code Page 437' font

display.print(str);

//display.display();
}

void draw_volume_bar(void) {
for (int16_t i = 0; i < 3; i += 2) {
display.fillRoundRect(
i,
i + 28,
display.width() - 2 * i,
display.height() / 2 - 2 * i,
display.height() / 4,
SSD1306_INVERSE // The INVERSE color is used so round-rects alternate white/black
);
//display.display();
}
}

bool change_volume_bar(byte volume_percent) {

if (volume_percent < 1 and volume_percent > 100) {
return false;
}

display.drawCircle(
(volume_percent * 0.8 / 100.0 + 0.2) * (display.width() - 2 * 3) - 10,
display.height() * 2 / 3 + 2,
13,
SSD1306_BLACK
);

display.fillRoundRect(
3,
3 + 28,
(volume_percent * 0.8 / 100.0 + 0.2) * (display.width() - 2 * 3),
display.height() / 2 - 2 * 3,
display.height() / 4,
SSD1306_WHITE
);

draw_volume_bar();

display.display();
return true;
}
/***************************************************************************/
void draw_volume_bar1(void) {
for (int16_t i = 0; i < 3; i += 2) {
display.fillRoundRect(
i,
i + 80,
display.width() - 2 * i,
display.height() / 2 - 2 * i,
display.height() / 4,
SSD1306_INVERSE // The INVERSE color is used so round-rects alternate white/black
);
//display.display();
}
}

bool change_volume_bar1(byte volume_percent) {

if (volume_percent < 1 and volume_percent > 100) {
return false;
}

display.drawCircle(
(volume_percent * 0.8 / 100.0 + 0.2) * (display.width() - 2 * 3) - 10,
display.height() * 2 / 3 + 2,
13,
SSD1306_BLACK
);

display.fillRoundRect(
3,
3 + 80,
(volume_percent * 0.8 / 100.0 + 0.2) * (display.width() - 2 * 3),
display.height() / 2 - 2 * 3,
display.height() / 4,
SSD1306_WHITE
);

draw_volume_bar1();

display.display();
return true;
}

void change_led_channel_or_register(byte number, bool state) {
digitalWrite(number, state);
}

void all_led_off() {
for (byte pin = LED_CHANNEL_0; pin <= LED_CHANNEL_5; pin++) {
change_led_channel_or_register(pin, LED_OFF);
}
}

inspiritus
Offline
Зарегистрирован: 17.12.2012

Уважаемый, а не пошли бы Вы почитать правила создания топиков в этом форуме?

http://arduino.ru/forum/obshchii/sozdanie-temy