Электронная ударная установка (MIDI) на arduino - кто делал?

Мужик из полиуретана
Offline
Зарегистрирован: 12.09.2015

Кто-нибудь делал электронную ударку на ардуино?

Я так и не смог найти стабильно работающий serial-to-midi,

этот: http://www.spikenzielabs.com/SpikenzieLabs/Serial_MIDI.html

на одном компе вообще не включается, на втором включается и сразу зависает.

Другой serial-to-midi ( Hairless) вроде бы и работает, но выдает сразу несколько нот и с каким-то неадекватным велосити.

 

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

а что подразумевается под serial-to-midi?

MIDI - это по сути последовательный интерфейс с своеобразной аппаратной частью, подразумевающей гальваническую развязку.

Мужик из полиуретана
Offline
Зарегистрирован: 12.09.2015

andriano пишет:

а что подразумевается под serial-to-midi?

MIDI - это по сути последовательный интерфейс с своеобразной аппаратной частью, подразумевающей гальваническую развязку.

Имеется в виду программа\плагин, которая берет сигнал с ардуинки, преобразовывает его в midi-сигнал и отправляет на виртуальный midi-порт, вроде того же midi yoke, откуда его уже можно будет использовать с различными секвенсорами и VST-инструментами.

Sloper
Sloper аватар
Offline
Зарегистрирован: 30.03.2015
Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Мужик из полиуретана пишет:

Кто-нибудь делал электронную ударку на ардуино?

Я так и не смог найти стабильно работающий serial-to-midi,

этот: http://www.spikenzielabs.com/SpikenzieLabs/Serial_MIDI.html

на одном компе вообще не включается, на втором включается и сразу зависает.

Другой serial-to-midi ( Hairless) вроде бы и работает, но выдает сразу несколько нот и с каким-то неадекватным велосити.

Я делал. Хотел вам помочь - посмотрел свой проект, но у меня там целая куча этих драйверов, даже не вспомню, что именно рабочее, а что - нет. Но помню одно - геморрой. Даже не интересно было доделывать проект.
Сейчас я планирую сделать настоящий МИДИ-контроллер, перепрошив AT16u2 на Uno, или попробую Leonardo.

Мужик из полиуретана
Offline
Зарегистрирован: 12.09.2015

С hairless (http://projectgus.github.io/hairless-midiserial/) и вот этим кодом: 

001//  *****************************************************************************************************************
002//  *                                                                                                               *
003//  *                                         SpikenzieLabs.com                                                     *
004//  *                                                                                                               *
005//  *                                           Drum Kit - Kit                                                      *
006//  *                                                                                                               *
007//  *                                                                                                               *
008//  *****************************************************************************************************************
009//
010//  BY: MARK DEMERS Copywrite 20009
011//  April. 2009
012//  VERSION: 1.b
013//
014//  DESCRIPTION:
015//  Arduino analog input used to sense piezo drum hits then sent serialy to processing.
016// 
017//  Required - Hardware:
018//  1. Drum kit - kit (From SpikenzieLabs.com)
019//  2. Arduino
020//
021//  Required - Software:
022//  1. Serial MIDI converter
023//  2. Garage Band, Ableton Live etc ...
024//
025// LEGAL:
026// This code is provided as is. No guaranties or warranties are given in any form. It is your responsibilty to
027// determine this codes suitability for your application.
028 
029 
030 
031 
032//*******************************************************************************************************************
033// User settable variables         
034//*******************************************************************************************************************
035 
036unsigned char PadNote[6] = {52,16,66,63,40,65};         // MIDI notes from 0 to 127 (Mid C = 60)
037 
038int PadCutOff[6] = {600,600,600,600,600,600};           // Minimum Analog value to cause a drum hit
039 
040int MaxPlayTime[6] = {90,90,90,90,90,90};               // Cycles before a 2nd hit is allowed
041 
042#define  midichannel    0;                              // MIDI channel from 0 to 15 (+1 in "real world")
043 
044boolean VelocityFlag  = true;                           // Velocity ON (true) or OFF (false)
045 
046 
047 
048 
049 
050//*******************************************************************************************************************
051// Internal Use Variables          
052//*******************************************************************************************************************
053 
054boolean activePad[6] = {0,0,0,0,0,0};                   // Array of flags of pad currently playing
055int PinPlayTime[6] = {0,0,0,0,0,0};                     // Counter since pad started to play
056 
057unsigned char status;
058 
059int pin = 0;    
060int hitavg = 0;
061 
062//*******************************************************************************************************************
063// Setup           
064//*******************************************************************************************************************
065 
066void setup()
067{
068  Serial.begin(57600);                                  // connect to the serial port 115200
069}
070 
071//*******************************************************************************************************************
072// Main Program        
073//*******************************************************************************************************************
074 
075void loop()
076{
077  for(int pin=0; pin < 6; pin++)
078  {
079    hitavg = analogRead(pin);                              // read the input pin
080 
081    if((hitavg > PadCutOff[pin]))
082    {
083      if((activePad[pin] == false))
084      {
085        if(VelocityFlag == true)
086        {
087//          hitavg = 127 / ((1023 - PadCutOff[pin]) / (hitavg - PadCutOff[pin]));    // With full range (Too sensitive ?)
088          hitavg = (hitavg / 8) -1 ;                                                 // Upper range
089        }
090        else
091        {
092          hitavg = 127;
093        }
094 
095        MIDI_TX(144,PadNote[pin],hitavg);
096        PinPlayTime[pin] = 0;
097        activePad[pin] = true;
098      }
099      else
100      {
101        PinPlayTime[pin] = PinPlayTime[pin] + 1;
102      }
103    }
104    else if((activePad[pin] == true))
105    {
106      PinPlayTime[pin] = PinPlayTime[pin] + 1;
107       
108      if(PinPlayTime[pin] > MaxPlayTime[pin])
109      {
110        activePad[pin] = false;
111        MIDI_TX(128,PadNote[pin],127);
112      }
113    }
114  }
115}
116 
117 
118//*******************************************************************************************************************
119// Transmit MIDI Message           
120//*******************************************************************************************************************
121void MIDI_TX(unsigned char MESSAGE, unsigned char PITCH, unsigned char VELOCITY)
122{
123  status = MESSAGE + midichannel;
124  Serial.print(status);
125  Serial.print(PITCH);
126  Serial.print(VELOCITY);
127}

Вроде бы и работает, но выдает какие-то разные ноты рандомного велосити, иногда и по три сразу ( по одной или трем тарелкам, если вст-барабаны включить) и я не сильно понимаю как этот код работает вообще.

Родной serial-to-midi этого кода либо капризничает о версии явы, либо (после колдунства с установкой явы) запускается и виснет %)

 

 

Мужик из полиуретана
Offline
Зарегистрирован: 12.09.2015

Разобрался.

Стабильно работает с s2midiv101, а он видит только LoopBe Internal Midi.

Проверил вот на таком тестовом скетче:

01void setup(){
02Serial.begin(36000); 
03   
04  }
05 
06const int numSnareReadings = 5;
07int velocity;
08int hitavg;
09int snareReadings[numSnareReadings];
10int snareIndex = 0;
11int snareTotal = 0;
12int snareAverage = 0;
13int currentSnareState;
14int switchSnareState = 0;
15  
16long previousMillis1 = 0;
17long previousMillis2 = 0;
18long previousMillis3 = 0;
19long previousMillis4 = 0;
20  
21long interval1 = 100;
22long interval2 = 100;
23long interval3 = 100;
24long interval4 = 100;
25 
26void noteOn(byte channel, byte note, byte velocity)
27{
28   midiMsg(channel+0x90, note, velocity);
29}
30 
31 
32void midiMsg(byte cmd, byte data1, byte data2)
33  {Serial.write(cmd);
34  
35  Serial.write(data1);
36  Serial.write(data2);
37  
38   
39  void loop()
40{
41 
42velocity = map(hitavg, 0, 1023, 1, 127);
43hitavg = analogRead(A0);
44unsigned long currentMillis = millis();
45 
46  snareAverage = snareTotal / numSnareReadings;
47  snareTotal = snareTotal - snareReadings[snareIndex];
48  snareReadings[snareIndex] = analogRead(A0);
49  snareTotal = snareTotal + snareReadings[snareIndex];
50  snareIndex = snareIndex + 1;
51   
52  if(snareIndex >= numSnareReadings)
53    snareIndex = 0;
54     
55    snareAverage = snareTotal / numSnareReadings;
56    
57   currentSnareState = snareAverage;
58     if( currentSnareState > 500 && (currentMillis - previousMillis1) > interval1)
59       {
60         
61         previousMillis1 = currentMillis;
62         noteOn(9, 38, velocity);
63       }
64}

 

Motrosoff
Offline
Зарегистрирован: 24.12.2015

Здравствуйте! Скажите пожалуйста, в итоге заработало то что вы делали, барабанная установка??
И ваш последний скетч он работает?

std
Offline
Зарегистрирован: 05.01.2012

Gippopotam пишет:
планирую сделать настоящий МИДИ-контроллер, перепрошив AT16u2 на Uno, или попробую Leonardo

Тоже интересует, оба варианта. С Atmega16u2 любопытно, есть ли скетч или всё в hex запихали, и не переделать?