Задержка Arduino MIDI-USB

Van
Van аватар
Offline
Зарегистрирован: 04.10.2016

Доброго времени суток всем! Собрал миди контроллер на Arduino Mega 2560 (ATmega8U2). Перепрошил с помощью Flip в arduino_midi. При подключении к компьютеру ведёт себя как любой "plug and play" миди контроллер. Сам находит и устанавливает драйвера. Но по сравнению с другими миди контроллерами имеет ощутимую задержку при нажатии кнопок, примерно в пол секунды. Сначала думал проблема в Windows, но оказалось в OS X та же беда. Но так как я новичок в программировании, думаю что проблема может быть в скетче. Окиньте взглядом, ткните носом пожалуйста.

Van
Van аватар
Offline
Зарегистрирован: 04.10.2016
#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);
   
}

 

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

как решили ваш вопрос?  

Densl
Offline
Зарегистрирован: 28.11.2018

Я думаю задержка из за того что постоянно ОБНОВЛяЕТСЯ излбражение на экранчике. Отключите его и проверьте.

И еще я бы отключил Serial вообще с его какой-то непонятной скоростью. Он тоже может тормозить программу.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Да, похоже, задержка из-за экрана. А что касается Serial, так это родная скорость для MIDI-порта. Как бы ради него все это и затевалось.