Задержка Arduino MIDI-USB
- Войдите на сайт для отправки комментариев
Вс, 16/10/2016 - 00:12
Доброго времени суток всем! Собрал миди контроллер на Arduino Mega 2560 (ATmega8U2). Перепрошил с помощью Flip в arduino_midi. При подключении к компьютеру ведёт себя как любой "plug and play" миди контроллер. Сам находит и устанавливает драйвера. Но по сравнению с другими миди контроллерами имеет ощутимую задержку при нажатии кнопок, примерно в пол секунды. Сначала думал проблема в Windows, но оказалось в OS X та же беда. Но так как я новичок в программировании, думаю что проблема может быть в скетче. Окиньте взглядом, ткните носом пожалуйста.
#include <MIDI.h> MIDI_CREATE_DEFAULT_INSTANCE (); #include <LCD5110_Graph.h> LCD5110 lcd(8,9,10,12,11); extern uint8_t one[]; extern uint8_t two[]; extern uint8_t three[]; extern uint8_t four[]; extern uint8_t five[]; extern uint8_t six[]; extern uint8_t seven[]; extern uint8_t eight[]; extern uint8_t rec[]; extern uint8_t empty[]; extern uint8_t play[]; extern uint8_t sol[]; extern uint8_t all[]; extern uint8_t dub[]; extern uint8_t mut[]; extern uint8_t rst[]; extern uint8_t rev[]; #define encoder0PinA 2 #define encoder0PinB 3 #define note_C 0x3C // C4 #define note_D 0x3E // D4 #define note_E 0x40 // E4 Под вопросом #define note_F 0x41 // F4 #define note_G 0x43 // G4 #define note_A 0x45 // Исключён #define note_B 0x47 // B4 #define note_C2 0x48 #define note_D2 0x50 #define note_E2 0x52 #define note_F2 0x53 #define note_G2 0x55 volatile int encoder0Pos = 0; static boolean rotating=false; #define switch_C 4 // Prev #define switch_D 5 // Next #define switch_E 6 // Под вопросом #define switch_F 7 // rec #define switch_G 22 //play #define switch_A 32 // Исключён #define switch_B 23 //all #define switch_C2 24 //sol #define switch_D2 25 //dub #define switch_E2 26 //mut #define switch_F2 27 //rst #define switch_G2 29 //rev int regim=1; int regim2=1; int regim3=1; int regim4=1; int regim5=1; int regim6=1; int regim7=1; int regim8=1; int regim9=1; int regim10=1; int flag=0; int flag2 = 0; int flag3 = 0; int flag4 = 0; int flag5 = 0; int flag6 = 0; int flag7 = 0; int flag8 = 0; int flag9 = 0; int flag10 = 0; int buttonState_C = 0; int buttonState_D = 0; int buttonState_E = 0; int buttonState_F = 0; int buttonState_G = 0; int buttonState_A = 0; int buttonState_B = 0; int buttonState_C2 = 0; int buttonState_D2 = 0; int buttonState_E2 = 0; int buttonState_F2 = 0; int buttonState_G2 = 0; int note_C_send_off = false; int note_C_send_on = false; int note_D_send_off = false; int note_D_send_on = false; int note_E_send_off = false; int note_E_send_on = false; int note_F_send_off = false; int note_F_send_on = false; int note_G_send_off = false; int note_G_send_on = false; int note_A_send_off = false; int note_A_send_on = false; int note_B_send_off = false; int note_B_send_on = false; int note_C2_send_off = false; int note_C2_send_on = false; int note_D2_send_off = false; int note_D2_send_on = false; int note_E2_send_off = false; int note_E2_send_on = false; int note_F2_send_off = false; int note_F2_send_on = false; int note_G2_send_off = false; int note_G2_send_on = false; //byte MSB; //unsigned int LSB; void setup() { pinMode(switch_C, INPUT); pinMode(switch_D, INPUT); pinMode(switch_E, INPUT); pinMode(switch_F, INPUT); pinMode(switch_G, INPUT); pinMode(switch_A, INPUT); pinMode(switch_B, INPUT); pinMode(switch_C2, INPUT); pinMode(switch_D2, INPUT); pinMode(switch_E2, INPUT); pinMode(switch_F2, INPUT); pinMode(switch_G2, INPUT); pinMode(encoder0PinA, INPUT); digitalWrite(encoder0PinA, HIGH); pinMode(encoder0PinB, INPUT); digitalWrite(encoder0PinB, HIGH); attachInterrupt(0, rotEncoder, CHANGE); lcd.InitLCD(); Serial.begin(31250); } void rotEncoder(){ rotating=true; } void loop() { buttonState_C = digitalRead(switch_C); buttonState_D = digitalRead(switch_D); buttonState_E = digitalRead(switch_E); buttonState_F = digitalRead(switch_F); buttonState_G = digitalRead(switch_G); buttonState_A = digitalRead(switch_A); buttonState_B = digitalRead(switch_B); buttonState_C2 = digitalRead(switch_C2); buttonState_D2 = digitalRead(switch_D2); buttonState_E2 = digitalRead(switch_E2); buttonState_F2 = digitalRead(switch_F2); buttonState_G2 = digitalRead(switch_G2); if (digitalRead(switch_C)==HIGH&&flag==0) { regim++; flag=1; if(regim>8) { regim=1; } } if(digitalRead(switch_C)==LOW&&flag==1) { flag=0; } if(regim==1) { lcd.drawBitmap(42,0,one,42,48); lcd.update(); } if(regim==2) { lcd.drawBitmap(42,0,two,42,48); lcd.update(); } if(regim==3) { lcd.drawBitmap(42,0,three,42,48); lcd.update(); } if(regim==4) { lcd.drawBitmap(42,0,four,42,48); lcd.update(); } if(regim==5) { lcd.drawBitmap(42,0,five,42,48); lcd.update(); } if(regim==6) { lcd.drawBitmap(42,0,six,42,48); lcd.update(); } if(regim==7) { lcd.drawBitmap(42,0,seven,42,48); lcd.update(); } if(regim==8) { lcd.drawBitmap(42,0,eight,42,48); lcd.update(); } if(digitalRead(switch_D)==HIGH&&flag2==0) { regim--; flag2=1; if(regim<1) { regim=8; } } if(digitalRead(switch_D)==LOW&&flag2==1) { flag2=0; } if (digitalRead(switch_F)==HIGH&&flag3==0) { regim3++; flag3=1; if(regim3>2) { regim3=1; } } if (digitalRead(switch_F)==LOW&&flag3==1) { flag3=0; } if(regim3==1) { lcd.drawBitmap(0,0,empty,42,48); } if(regim3==2) { lcd.drawBitmap(0,16,rec,42,16); } if (digitalRead(switch_G)==HIGH&&flag4==0) { regim4++; flag4=1; if(regim4>2) { regim4=1; } } if (digitalRead(switch_G)==LOW&&flag4==1) { flag4=0; } if(regim4==1) { } if(regim4==2) { lcd.drawBitmap(0,16,play,42,16); } if (digitalRead(switch_B)==HIGH&&flag5==0) { regim5++; flag5=1; if(regim5>2) { regim5=1; } } if (digitalRead(switch_B)==LOW&&flag5==1) { flag5=0; } if(regim5==1) { } if(regim5==2) { lcd.drawBitmap(0,0,all,42,16); } if (digitalRead(switch_C2)==HIGH&&flag6==0) { regim6++; flag6=1; if(regim6>2) { regim6=1; } } if (digitalRead(switch_C2)==LOW&&flag6==1) { flag6=0; } if(regim6==1) { } if(regim6==2) { lcd.drawBitmap(0,16,sol,42,16); lcd.update(); } if (digitalRead(switch_D2)==HIGH&&flag7==0) { regim7++; flag7=1; if(regim7>2) { regim7=1; } } if (digitalRead(switch_D2)==LOW&&flag7==1) { flag7=0; } if(regim7==1) { } if(regim7==2) { lcd.drawBitmap(0,16,dub,42,16); lcd.update(); } if (digitalRead(switch_E2)==HIGH&&flag8==0) { regim8++; flag8=1; if(regim8>2) { regim8=1; } } if (digitalRead(switch_E2)==LOW&&flag8==1) { flag8=0; } if(regim8==1) { } if(regim8==2) { lcd.drawBitmap(0,32,mut,42,16); } if (digitalRead(switch_F2)==HIGH&&flag9==0) { lcd.drawBitmap(0,16,rst,42,16); lcd.update(); } if (digitalRead(switch_G2)==HIGH&&flag10==0) { regim10++; flag10=1; if(regim10>2) { regim10=1; } } if (digitalRead(switch_G2)==LOW&&flag10==1) { flag10=0; } if(regim10==1) { } if(regim10==2) { lcd.drawBitmap(0,16,rev,42,16); lcd.update(); } while(rotating) { delay(2); if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB)) { encoder0Pos = encoder0Pos + 5; //encoder0Pos++; if(encoder0Pos > 127) encoder0Pos = 127; } else { encoder0Pos = encoder0Pos - 5; //encoder0Pos--; if(encoder0Pos < 0) encoder0Pos = 0; } Serial.println(encoder0Pos,DEC); //MSB = encoder0Pos >> 8; // Старший байт //LSB = encoder0Pos & 0xFF; // Младший байт //Serial.println(MSB,BIN); //Serial.println(LSB,BIN); noteOn(0xB0, 0x01, encoder0Pos); // Modulation Wheel Controller //noteOn(0xE0, MSB, LSB); // Pitch Bend rotating=false; // Reset the flag back to false //Serial.println(encoder0Pos); } // Нота C if (buttonState_C == HIGH && note_C_send_on == false) // Нажатие клавиши { noteOn(0x91, note_C, 0x7F); note_C_send_on = true; // Команда Note On послана note_C_send_off = false; // Команда Note Off не послана } else if (buttonState_C == LOW && note_C_send_off == false) // Если клавишу отпустили { noteOn(0x91, note_C, 0x00); note_C_send_on = false; note_C_send_off = true; encoder0Pos = 0; // Возвращаем позицию колеса в ноль } // Нота D if (buttonState_D == HIGH && note_D_send_on == false) { noteOn(0x91, note_D, 0x7F); note_D_send_on = true; note_D_send_off = false; } else if (buttonState_D == LOW && note_D_send_off == false) { noteOn(0x91, note_D, 0x00); note_D_send_on = false; note_D_send_off = true; encoder0Pos = 0; } // Нота E if (buttonState_E == HIGH && note_E_send_on == false) { noteOn(0x91, note_E, 0x7F); note_E_send_on = true; note_E_send_off = false; } else if (buttonState_E == LOW && note_E_send_off == false) { noteOn(0x91, note_E, 0x00); note_E_send_on = false; note_E_send_off = true; encoder0Pos = 0; } // Нота F if (buttonState_F == HIGH && note_F_send_on == false) { noteOn(0x91, note_F, 0x7F); note_F_send_on = true; note_F_send_off = false; } else if (buttonState_F == LOW && note_F_send_off == false) { noteOn(0x91, note_F, 0x00); note_F_send_on = false; note_F_send_off = true; encoder0Pos = 0; } // Нота G if (buttonState_G == HIGH && note_G_send_on == false) { noteOn(0x91, note_G, 0x7F); note_G_send_on = true; note_G_send_off = false; } else if (buttonState_G == LOW && note_G_send_off == false) { noteOn(0x91, note_G, 0x00); note_G_send_on = false; note_G_send_off = true; encoder0Pos = 0; } // Нота A if (buttonState_A == HIGH && note_A_send_on == false) { noteOn(0x91, note_A, 0x00); note_A_send_on = true; note_A_send_off = false; } else if (buttonState_A == LOW && note_A_send_off == false) { noteOn(0x91, note_A, 0x00); note_A_send_on = false; note_A_send_off = true; encoder0Pos = 0; } // Нота B if (buttonState_B == HIGH && note_B_send_on == false) { noteOn(0x91, note_B, 0x7F); note_B_send_on = true; note_B_send_off = false; } else if (buttonState_B == LOW && note_B_send_off == false) { noteOn(0x91, note_B, 0x00); note_B_send_on = false; note_B_send_off = true; encoder0Pos = 0; } if (buttonState_C2 == HIGH && note_C2_send_on == false) // Нажатие клавиши { noteOn(0x91, note_C2, 0x7F); note_C2_send_on = true; // Команда Note On послана note_C2_send_off = false; // Команда Note Off не послана } else if (buttonState_C2 == LOW && note_C2_send_off == false) // Если клавишу отпустили { noteOn(0x91, note_C2, 0x00); note_C2_send_on = false; note_C2_send_off = true; encoder0Pos = 0; // Возвращаем позицию колеса в ноль } if (buttonState_D2 == HIGH && note_D2_send_on == false) // Нажатие клавиши { noteOn(0x91, note_D2, 0x7F); note_D2_send_on = true; // Команда Note On послана note_D2_send_off = false; // Команда Note Off не послана } else if (buttonState_D2 == LOW && note_D2_send_off == false) // Если клавишу отпустили { noteOn(0x91, note_D2, 0x00); note_D2_send_on = false; note_D2_send_off = true; encoder0Pos = 0; // Возвращаем позицию колеса в ноль } if (buttonState_E2 == HIGH && note_E2_send_on == false) // Нажатие клавиши { noteOn(0x91, note_E2, 0x7F); note_E2_send_on = true; // Команда Note On послана note_E2_send_off = false; // Команда Note Off не послана } else if (buttonState_E2 == LOW && note_E2_send_off == false) // Если клавишу отпустили { noteOn(0x91, note_E2, 0x00); note_E2_send_on = false; note_E2_send_off = true; encoder0Pos = 0; // Возвращаем позицию колеса в ноль } if (buttonState_F2 == HIGH && note_F2_send_on == false) // Нажатие клавиши { noteOn(0x91, note_F2, 0x7F); note_F2_send_on = true; // Команда Note On послана note_F2_send_off = false; // Команда Note Off не послана } else if (buttonState_F2 == LOW && note_F2_send_off == false) // Если клавишу отпустили { noteOn(0x91, note_F2, 0x00); note_F2_send_on = false; note_F2_send_off = true; encoder0Pos = 0; // Возвращаем позицию колеса в ноль } if (buttonState_G2 == HIGH && note_G2_send_on == false) // Нажатие клавиши { noteOn(0x91, note_G2, 0x7F); note_G2_send_on = true; // Команда Note On послана note_G2_send_off = false; // Команда Note Off не послана } else if (buttonState_G2 == LOW && note_G2_send_off == false) // Если клавишу отпустили { noteOn(0x91, note_G2, 0x00); note_G2_send_on = false; note_G2_send_off = true; encoder0Pos = 0; // Возвращаем позицию колеса в ноль } } void noteOn(int cmd, int pitch, int velocity) { Serial.write(cmd); Serial.write(pitch); Serial.write(velocity); }как решили ваш вопрос?
Я думаю задержка из за того что постоянно ОБНОВЛяЕТСЯ излбражение на экранчике. Отключите его и проверьте.
И еще я бы отключил Serial вообще с его какой-то непонятной скоростью. Он тоже может тормозить программу.
Да, похоже, задержка из-за экрана. А что касается Serial, так это родная скорость для MIDI-порта. Как бы ради него все это и затевалось.