Электронная ударная установка (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/) и вот этим кодом: 

//  *****************************************************************************************************************
//  *                                                                                                               *
//  *                                         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 этого кода либо капризничает о версии явы, либо (после колдунства с установкой явы) запускается и виснет %)

 

 

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

Разобрался.

Стабильно работает с 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);
       }
} 

 

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

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

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

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

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