Электронная ударная установка (MIDI) на arduino - кто делал?
- Войдите на сайт для отправки комментариев
Чт, 29/10/2015 - 10:11
Кто-нибудь делал электронную ударку на ардуино?
Я так и не смог найти стабильно работающий serial-to-midi,
этот: http://www.spikenzielabs.com/SpikenzieLabs/Serial_MIDI.html
на одном компе вообще не включается, на втором включается и сразу зависает.
Другой serial-to-midi ( Hairless) вроде бы и работает, но выдает сразу несколько нот и с каким-то неадекватным велосити.
а что подразумевается под serial-to-midi?
MIDI - это по сути последовательный интерфейс с своеобразной аппаратной частью, подразумевающей гальваническую развязку.
а что подразумевается под serial-to-midi?
MIDI - это по сути последовательный интерфейс с своеобразной аппаратной частью, подразумевающей гальваническую развязку.
Имеется в виду программа\плагин, которая берет сигнал с ардуинки, преобразовывает его в midi-сигнал и отправляет на виртуальный midi-порт, вроде того же midi yoke, откуда его уже можно будет использовать с различными секвенсорами и VST-инструментами.
Оно?
http://www.pighixxx.com/test/portfolio-items/midi-interface/?portfolioID...
Кто-нибудь делал электронную ударку на ардуино?
Я так и не смог найти стабильно работающий serial-to-midi,
этот: http://www.spikenzielabs.com/SpikenzieLabs/Serial_MIDI.html
на одном компе вообще не включается, на втором включается и сразу зависает.
Другой serial-to-midi ( Hairless) вроде бы и работает, но выдает сразу несколько нот и с каким-то неадекватным велосити.
Я делал. Хотел вам помочь - посмотрел свой проект, но у меня там целая куча этих драйверов, даже не вспомню, что именно рабочее, а что - нет. Но помню одно - геморрой. Даже не интересно было доделывать проект.
Сейчас я планирую сделать настоящий МИДИ-контроллер, перепрошив AT16u2 на Uno, или попробую Leonardo.
С hairless (http://projectgus.github.io/hairless-midiserial/) и вот этим кодом:
// ***************************************************************************************************************** // * * // * SpikenzieLabs.com * // * * // * Drum Kit - Kit * // * * // * * // ***************************************************************************************************************** // // BY: MARK DEMERS Copywrite 20009 // April. 2009 // VERSION: 1.b // // DESCRIPTION: // Arduino analog input used to sense piezo drum hits then sent serialy to processing. // // Required - Hardware: // 1. Drum kit - kit (From SpikenzieLabs.com) // 2. Arduino // // Required - Software: // 1. Serial MIDI converter // 2. Garage Band, Ableton Live etc ... // // LEGAL: // This code is provided as is. No guaranties or warranties are given in any form. It is your responsibilty to // determine this codes suitability for your application. //******************************************************************************************************************* // User settable variables //******************************************************************************************************************* unsigned char PadNote[6] = {52,16,66,63,40,65}; // MIDI notes from 0 to 127 (Mid C = 60) int PadCutOff[6] = {600,600,600,600,600,600}; // Minimum Analog value to cause a drum hit int MaxPlayTime[6] = {90,90,90,90,90,90}; // Cycles before a 2nd hit is allowed #define midichannel 0; // MIDI channel from 0 to 15 (+1 in "real world") boolean VelocityFlag = true; // Velocity ON (true) or OFF (false) //******************************************************************************************************************* // Internal Use Variables //******************************************************************************************************************* boolean activePad[6] = {0,0,0,0,0,0}; // Array of flags of pad currently playing int PinPlayTime[6] = {0,0,0,0,0,0}; // Counter since pad started to play unsigned char status; int pin = 0; int hitavg = 0; //******************************************************************************************************************* // Setup //******************************************************************************************************************* void setup() { Serial.begin(57600); // connect to the serial port 115200 } //******************************************************************************************************************* // Main Program //******************************************************************************************************************* void loop() { for(int pin=0; pin < 6; pin++) { hitavg = analogRead(pin); // read the input pin if((hitavg > PadCutOff[pin])) { if((activePad[pin] == false)) { if(VelocityFlag == true) { // hitavg = 127 / ((1023 - PadCutOff[pin]) / (hitavg - PadCutOff[pin])); // With full range (Too sensitive ?) hitavg = (hitavg / 8) -1 ; // Upper range } else { hitavg = 127; } MIDI_TX(144,PadNote[pin],hitavg); PinPlayTime[pin] = 0; activePad[pin] = true; } else { PinPlayTime[pin] = PinPlayTime[pin] + 1; } } else if((activePad[pin] == true)) { PinPlayTime[pin] = PinPlayTime[pin] + 1; if(PinPlayTime[pin] > MaxPlayTime[pin]) { activePad[pin] = false; MIDI_TX(128,PadNote[pin],127); } } } } //******************************************************************************************************************* // Transmit MIDI Message //******************************************************************************************************************* void MIDI_TX(unsigned char MESSAGE, unsigned char PITCH, unsigned char VELOCITY) { status = MESSAGE + midichannel; Serial.print(status); Serial.print(PITCH); Serial.print(VELOCITY); }Вроде бы и работает, но выдает какие-то разные ноты рандомного велосити, иногда и по три сразу ( по одной или трем тарелкам, если вст-барабаны включить) и я не сильно понимаю как этот код работает вообще.
Родной serial-to-midi этого кода либо капризничает о версии явы, либо (после колдунства с установкой явы) запускается и виснет %)
Разобрался.
Стабильно работает с s2midiv101, а он видит только LoopBe Internal Midi.
Проверил вот на таком тестовом скетче:
void setup(){ Serial.begin(36000); } const int numSnareReadings = 5; int velocity; int hitavg; int snareReadings[numSnareReadings]; int snareIndex = 0; int snareTotal = 0; int snareAverage = 0; int currentSnareState; int switchSnareState = 0; long previousMillis1 = 0; long previousMillis2 = 0; long previousMillis3 = 0; long previousMillis4 = 0; long interval1 = 100; long interval2 = 100; long interval3 = 100; long interval4 = 100; void noteOn(byte channel, byte note, byte velocity) { midiMsg(channel+0x90, note, velocity); } void midiMsg(byte cmd, byte data1, byte data2) {Serial.write(cmd); Serial.write(data1); Serial.write(data2); } void loop() { velocity = map(hitavg, 0, 1023, 1, 127); hitavg = analogRead(A0); unsigned long currentMillis = millis(); snareAverage = snareTotal / numSnareReadings; snareTotal = snareTotal - snareReadings[snareIndex]; snareReadings[snareIndex] = analogRead(A0); snareTotal = snareTotal + snareReadings[snareIndex]; snareIndex = snareIndex + 1; if(snareIndex >= numSnareReadings) snareIndex = 0; snareAverage = snareTotal / numSnareReadings; currentSnareState = snareAverage; if( currentSnareState > 500 && (currentMillis - previousMillis1) > interval1) { previousMillis1 = currentMillis; noteOn(9, 38, velocity); } }Здравствуйте! Скажите пожалуйста, в итоге заработало то что вы делали, барабанная установка??
И ваш последний скетч он работает?
Тоже интересует, оба варианта. С Atmega16u2 любопытно, есть ли скетч или всё в hex запихали, и не переделать?