Два скетча. По отдельности работают. Собираю электробарабаны. пользуюсь 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милсек, но как писали он вроде не важен }
Рискну попробовать.Вставил всё вроде проверил.Смотрите.Проверяйте на железе Код (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); }
Проверил. Вроде как потенциометр начал реагировать, только вот из-за того, что у меня не хватает пока пьез, ноты некоторые сами срабатывают. И до конца убедиться не могу. И, кажется, за педаль отвечает нота бас бочки. То есть я бью по пьезке, звучит нота, и ползунок педали срабатывает. Этот полезное что-то тянет вниз
У меня Ардуино нано, только от чип и дип, бузина v.2; два Мультиплексора CD4051, пьезоэлементы которые снимают сам удар силу его и т.д., кнопки обычные к которым прикреплена нота глушения, потенциометр в роли педали хайхета, ну и резисторы(кто-то к поездкам еще диоды вешает). Принцип такой: Я использую для передачи всей информации loopMIDI, Haireles-MIDI, Addictive Drums 2, и все через usb. Пьезоэлемент регистрирует удар, его силу/громкость и посылает соответствующую ноту(благо в адиктив драмс 2 можно их менять). Кнопки глушат. Потенциометр дает понять в каком положении педаль. С двумя мультиплексора получается если все распределять: 16 пьезо на мультксере 5 пьезо на прямую 1 потенциометр прямую для хайхета 6 кнопок на прямую
... Ну можно наверное и так сказать. Только это не робот. Вот тип того https://youtube.com/playlist?list=PLWk_qIO8ZTF21P4HerRtDSs7kUBV98p-G