Лазил я по просторам инета и нашёл несколько занимательных статей на тему Arduino-MIDI и это меня заинтересовало после просмотра видео на этой страничке
http://todbot.com/blog....arduino Это ударная установка на базе ардуино в качестве датчиков пьезокерамические излучатели все это чудо гонит сигнал на миди вход которого у меня нету и в этом вся беда полазив по нету нашёл описание протокола это обычный последовательный протокол разница в том что скорость должна быть скорости 31250 бит / с. Шлём по три байта в формате команда-даные1-даные2 Подшаманил драйвер фтдишнего преобразователя ардуины теперь есть возможность выбирать эту скорость хочу слать данные на ком порт а стой стороны забирать вот в раздумьях как мне это все довести до ума у меня моя дуинна что то не фига не шлёт в порт.
Перевёл как смог статью
Аппаратные средства
Оборудование контролер Arduino, разъем MIDI, несколько кнопок, и два пьезокерамических излучателя подключаются к нему. Всё это работает от батарейки 9V типа крона. Схема подключения внешних цепей к контролеру:
Примечание: в зависимости от того, какой разъем MIDI вы используете (гнездо или штекер на кабеле), вам может потребоваться поменять местами провода MIDI, контакты 4 и 5. Пьезокерамический излучатель подключается через резистор 1мОм для того чтобы снизить напряжение вырабатываемое пьезокерамическим излучателем при ударе по нему. Стабилитрон на напряжение стабилизации 5,1V необходим чтобы предохранить входы контролера от большого напряжения. Arduino код В коде есть несколько уловок, которые надо объяснить. Первая в том, что для создания интерфейса MIDI, все, что вам действительно нужно, так это возможность передавать по последовательному интерфейсу данные на скорости 31250 бит / с. Это легко сделать при помощи " Serial.begin(31250) ".Как только это будет сделано, полное 3-байтовое MIDI- сообщение может быть отправлено при помощи трёх команд " Serial.print(val,BYTE) ". Следующий сложный момент в том, что переключатели на схеме, не нужно подтягивать к логическим уровням нагрузочными резисторами. Это потому, что включены внутренние подтягивающие резисторы AVR микроконтроллера с помощью функции " digitalWrite(pin,HIGH) ". Может показаться нелогичным использовать функцию digitalWrite() для этого, но это как раз очень хорошо работает для AVR. Преимущество в том, что вам больше не нужен подтягивающий резистор к +5 V. В результате меньше усилий по монтажу лишних проводов и компонентов. Последний прием измеряет силу удара на пьезокерамическом излучателе. Если ударить по пьезокерамическому излучателю он начинает вырабатывать напряжение которое имеет колебания похожие на те которые выдает колокол (постепенно затухающие). Эти колебания имеют вид показанный ниже:
Измеряя время, которое требуется для того чтобы колебания пересекли установленный порог, вы можете получить представление о силе удара. В коде это представлено в виде чтения аналогового значение и контроля перехода через порог. Если значение перешло через порог, ждем пока оно снова опустится ниже порога, и подсчитаем время необходимое для этого. Раньше я использовал для ввода операционники чтобы преобразовать аналоговый сигнал в цифровой (что делать порога в области аналоговой), а затем использовать прерывания, чтобы получить очень точные интервалы времени. код /* * MIDI Drum Kit * ------------- * Convert Arduino to a MIDI controller using various inputs and * the serial port as a MIDI output. * * This sketch is set up to send General MIDI (GM) drum notes * on MIDI channel 1, but it can be easily reconfigured for other * notes and channels * * It uses switch inputs to send MIDI notes of a fixed velocity with * note on time determined by duration of keypress and it uses * piezo buzzer elements as inputs to send MIDI notes of a varying velocity * & duration, depending on forced of impulse imparted to piezo sensor. * * To send MIDI, attach a MIDI out jack (female DIN-5) to Arduino. * DIN-5 pinout is: _____ * pin 2 - Gnd / \ * pin 4 - 220 ohm resistor to +5V | 3 1 | MIDI jack * pin 5 - Arduino D1 (TX) | 5 4 | * all other pins - unconnected \__2__/ * On my midi jack, the color of the wires for the pins are: * 3 = n/c * 5 = black (blue) * 2 = red (red) * 4 = orange (yellow) * 1 = brown * * Based off of Tom Igoe's work at: * http://itp.nyu.edu/physcomp/Labs/MIDIOutput * * Created 25 October 2006 * copyleft 2006 Tod E. Kurt * http://todbot.com/ * * Updates: * - 2 May 2009 - fixed noteOn() and noteOff() * */
// what midi channel we're sending on // ranges from 0-15 #define drumchan 1
// define the pins we use #define switchAPin 7 #define switchBPin 6 #define switchCPin 5 #define piezoAPin 0 #define piezoBPin 1 #define ledPin 13 // for midi out status
// analog threshold for piezo sensing #define PIEZOTHRESHOLD 100
int switchAState = LOW; int switchBState = LOW; int switchCState = LOW; int currentSwitchState = LOW;
int val,t;
void setup() { pinMode(switchAPin, INPUT); pinMode(switchBPin, INPUT); pinMode(switchCPin, INPUT); digitalWrite(switchAPin, HIGH); // turn on internal pullup digitalWrite(switchBPin, HIGH); // turn on internal pullup digitalWrite(switchCPin, HIGH); // turn on internal pullup
pinMode(ledPin, OUTPUT); Serial.begin(31250); // set MIDI baud rate }
// deal with first piezo, this is kind of a hack val = analogRead(piezoAPin); if( val >= PIEZOTHRESHOLD ) { t=0; while(analogRead(piezoAPin) >= PIEZOTHRESHOLD/2) { t++; } noteOn(drumchan,note_hihatopen, t*2); delay(t); noteOff(drumchan,note_hihatopen,0); }
// deal with second piezos, this is kind of a hack val = analogRead(piezoBPin); if( val >= PIEZOTHRESHOLD ) { t=0; while(analogRead(piezoBPin) >= PIEZOTHRESHOLD/2) { t++; } noteOn(drumchan,note_crash, t*2); delay(t); noteOff(drumchan,note_crash,0); } }
// Send a MIDI note-on message. Like pressing a piano key // channel ranges from 0-15 void noteOn(byte channel, byte note, byte velocity) { midiMsg( (0x90 | channel), note, velocity); }
// Send a MIDI note-off message. Like releasing a piano key void noteOff(byte channel, byte note, byte velocity) { midiMsg( (0x80 | channel), note, velocity); }
// Send a general MIDI message void midiMsg(byte cmd, byte data1, byte data2) { digitalWrite(ledPin,HIGH); // indicate we're sending MIDI data Serial.print(cmd, BYTE); Serial.print(data1, BYTE); Serial.print(data2, BYTE); digitalWrite(ledPin,LOW); } Дополнительная информация на форуме: http://rln.nnov.ru/forum/viewtopic.php?t=238