Как совместить два скетча электробарабанов

Тема в разделе "Arduino & Shields", создана пользователем Ilja_Golenev, 13 май 2021.

  1. Ilja_Golenev

    Ilja_Golenev Нуб

    Два скетча. По отдельности работают. Собираю электробарабаны. пользуюсь loopMIDI, Haireles-MIDI, Addictive Drums 2
    Что делает первый:
    Увеличивает количество аналоговых входов, к которым подключены пьезоэлементы, с помощью мультиплексора CD4051.
    Взят был из этой темы
    Схема подключения вот

    Что делает второй:
    отправляет данные о состоянии педали хайхета- в каком она положении. реализовано на потенциометре.
    А этот взят из этой темы

    Как/куда надо вставить второй скетч в первый? И как туда добавить еще кнопки, которые будут отвечать за глушение тарелок.(Рабочий скетч с кнопками есть на первой странице темы что по первой ссылке)

    А еще буду оочень благодарен, если первый скетч кто-то перепишет под 6 мультиплексоров, а не под два как в оригинале.

    Первый скетч:
    Код (C++):
    unsigned char PadNote[16] = {47,18,32,38,43,13,45,17,21,36,0,44,0,19,0,21};    
    unsigned char status;
    int PadCutOff[16] = {100,100,100,200,100,100,100,100,100,350,100,350,100,100,100,100};
    int MaxPlayTime[16] = {25,25,25,25,25,25,25,25,25,40,25,40,25,25,25,25};    
    #define  midichannel 0;            
    boolean activePad[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};  
    int PinPlayTime[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};        
    boolean VelocityFlag  = true;        
    int analogPin[2] = {A0,A1};
    int pin = 0;
    int hitavg = 0;
    int pad = 0;
    int r0 = 0;
    int r1 = 0;
    int r2 = 0;
    int count = 0;
    int multiplex1[8];
    int multiplex2[8];

    void setup()
    {
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(4, OUTPUT);
    Serial.begin(115200);                                                            
    }

    void loop(){
    readSensors(0);
    readSensors(1);
    checkSensors(0);
    checkSensors(1);
    }
    void readSensors (int analogPin) {
    for(count=0; count <= 7; count++)
    {
    r2 = bitRead(count,0);
    r1 = bitRead(count,1);
    r0 = bitRead(count,2);
    digitalWrite(2, r0);
    digitalWrite(3, r1);
    digitalWrite(4, r2);
    if(analogPin==0) {
    multiplex1[count] = analogRead(analogPin);
    }
    else if(analogPin==1) {
    multiplex2[count] = analogRead(analogPin);
      }
      }
    }

    void checkSensors (int analogPin) {
    for(int pin=0; pin <=7; pin++) {
    if(analogPin==0) {
    hitavg = multiplex1[pin];
    pad=pin;
    }
    else if(analogPin==1) {
    hitavg = multiplex2[pin];
    pad=pin+8;
      }

    if((hitavg > PadCutOff[pad])) {
    if((activePad[pad] == false)) {
    if(VelocityFlag == false) {
      hitavg = (hitavg / 8) -1;
    }
    else {
    hitavg = 127;
    }
    MIDI_TX(144,PadNote[pad],hitavg);
    PinPlayTime[pad] = 0;
    activePad[pad] = true;
    }
    else {
    PinPlayTime[pad] = PinPlayTime[pad] + 1;
      }
    }
    else if((activePad[pad] == true)) {
    PinPlayTime[pad] = PinPlayTime[pad] + 1;
    if(PinPlayTime[pad] > MaxPlayTime[pad]) {
    activePad[pad] = false;
    MIDI_TX(128,PadNote[pad],0);
    }
    }
    }
    }

    void MIDI_TX(unsigned char MESSAGE, unsigned char PITCH, unsigned char VELOCITY) {
    status = MESSAGE + midichannel;
    Serial.write(status);
    Serial.write(PITCH);
    Serial.write(VELOCITY);
    }
    Второй скетч:
    Код (C++):
    int val = 0;
    void setup() {
      Serial.begin(115200);
    }
    void loop(){
    val = analogRead(0) / 8;
      Serial.write(185);
      Serial.write(4);
      Serial.write(val);
    //в этом месте был дилей на 5милсек, но как писали он вроде не важен
    }
     
     
    Последнее редактирование: 13 май 2021
  2. vvr

    vvr Инженерище

    у вас серьёзные хотелки.
    шанс на выполнение только в разделе "закажу"
     
    parovoZZ нравится это.
  3. Airbus

    Airbus Радиохулиган Модератор

    Рискну попробовать.Вставил всё вроде проверил.Смотрите.Проверяйте на железе
    Код (Text):
    unsigned char PadNote[16] = {47,18,32,38,43,13,45,17,21,36,0,44,0,19,0,21};  
    unsigned char status;
    int PadCutOff[16] = {100,100,100,200,100,100,100,100,100,350,100,350,100,100,100,100};
    int MaxPlayTime[16] = {25,25,25,25,25,25,25,25,25,40,25,40,25,25,25,25};  
    #define  midichannel 0;          
    boolean activePad[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    int PinPlayTime[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};      
    boolean VelocityFlag  = true;      
    int analogPin[2] = {A0,A1};
    int val = 0;
    int pin = 0;
    int hitavg = 0;
    int pad = 0;
    int r0 = 0;
    int r1 = 0;
    int r2 = 0;
    int count = 0;
    int multiplex1[8];
    int multiplex2[8];

    void setup()
    {
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(4, OUTPUT);
    Serial.begin(115200);                                                          
    }

    void loop(){
    readSensors(0);
    readSensors(1);
    checkSensors(0);
    checkSensors(1);
    val = analogRead(0) / 8;
      Serial.write(185);
      Serial.write(4);
      Serial.write(val);
    //в этом месте был дилей на 5милсек, но как писали он вроде не важен
    }
    void readSensors (int analogPin) {
    for(count=0; count <= 7; count++)
    {
    r2 = bitRead(count,0);
    r1 = bitRead(count,1);
    r0 = bitRead(count,2);
    digitalWrite(2, r0);
    digitalWrite(3, r1);
    digitalWrite(4, r2);
    if(analogPin==0) {
    multiplex1[count] = analogRead(analogPin);
    }
    else if(analogPin==1) {
    multiplex2[count] = analogRead(analogPin);
      }
      }
    }

    void checkSensors (int analogPin) {
    for(int pin=0; pin <=7; pin++) {
    if(analogPin==0) {
    hitavg = multiplex1[pin];
    pad=pin;
    }
    else if(analogPin==1) {
    hitavg = multiplex2[pin];
    pad=pin+8;
      }

    if((hitavg > PadCutOff[pad])) {
    if((activePad[pad] == false)) {
    if(VelocityFlag == false) {
      hitavg = (hitavg / 8) -1;
    }
    else {
    hitavg = 127;
    }
    MIDI_TX(144,PadNote[pad],hitavg);
    PinPlayTime[pad] = 0;
    activePad[pad] = true;
    }
    else {
    PinPlayTime[pad] = PinPlayTime[pad] + 1;
      }
    }
    else if((activePad[pad] == true)) {
    PinPlayTime[pad] = PinPlayTime[pad] + 1;
    if(PinPlayTime[pad] > MaxPlayTime[pad]) {
    activePad[pad] = false;
    MIDI_TX(128,PadNote[pad],0);
    }
    }
    }
    }

    void MIDI_TX(unsigned char MESSAGE, unsigned char PITCH, unsigned char VELOCITY) {
    status = MESSAGE + midichannel;
    Serial.write(status);
    Serial.write(PITCH);
    Serial.write(VELOCITY);
    }
     
  4. Ilja_Golenev

    Ilja_Golenev Нуб

     
  5. Ilja_Golenev

    Ilja_Golenev Нуб

    Проверил. Вроде как потенциометр начал реагировать, только вот из-за того, что у меня не хватает пока пьез, ноты некоторые сами срабатывают. И до конца убедиться не могу. И, кажется, за педаль отвечает нота бас бочки. То есть я бью по пьезке, звучит нота, и ползунок педали срабатывает. Этот полезное что-то тянет вниз
     
    Последнее редактирование: 15 май 2021
  6. Airbus

    Airbus Радиохулиган Модератор

    Если бы еще знать логику работы Вашего устройства то можно было бы что нибудь поправить
     
  7. Ilja_Golenev

    Ilja_Golenev Нуб

    У меня Ардуино нано, только от чип и дип, бузина v.2; два
    Мультиплексора CD4051, пьезоэлементы которые снимают сам удар силу его и т.д., кнопки обычные к которым прикреплена нота глушения, потенциометр в роли педали хайхета, ну и резисторы(кто-то к поездкам еще диоды вешает).
    Принцип такой:
    Я использую для передачи всей информации loopMIDI, Haireles-MIDI, Addictive Drums 2, и все через usb.

    Пьезоэлемент регистрирует удар, его силу/громкость и посылает соответствующую ноту(благо в адиктив драмс 2 можно их менять). Кнопки глушат. Потенциометр дает понять в каком положении педаль.

    С двумя мультиплексора получается если все распределять:
    16 пьезо на мультксере
    5 пьезо на прямую
    1 потенциометр прямую для хайхета
    6 кнопок на прямую
     
  8. Airbus

    Airbus Радиохулиган Модератор

    Ничего не понял—но интересно. Это электроударник?
     
  9. Ilja_Golenev

    Ilja_Golenev Нуб

    ... Ну можно наверное и так сказать. Только это не робот.
    Вот тип того https://youtube.com/playlist?list=PLWk_qIO8ZTF21P4HerRtDSs7kUBV98p-G