Электронная ударная установка (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/) и вот этим кодом:
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
036
unsigned
char
PadNote[6] = {52,16,66,63,40,65};
// MIDI notes from 0 to 127 (Mid C = 60)
037
038
int
PadCutOff[6] = {600,600,600,600,600,600};
// Minimum Analog value to cause a drum hit
039
040
int
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
044
boolean VelocityFlag =
true
;
// Velocity ON (true) or OFF (false)
045
046
047
048
049
050
//*******************************************************************************************************************
051
// Internal Use Variables
052
//*******************************************************************************************************************
053
054
boolean activePad[6] = {0,0,0,0,0,0};
// Array of flags of pad currently playing
055
int
PinPlayTime[6] = {0,0,0,0,0,0};
// Counter since pad started to play
056
057
unsigned
char
status;
058
059
int
pin = 0;
060
int
hitavg = 0;
061
062
//*******************************************************************************************************************
063
// Setup
064
//*******************************************************************************************************************
065
066
void
setup
()
067
{
068
Serial
.begin(57600);
// connect to the serial port 115200
069
}
070
071
//*******************************************************************************************************************
072
// Main Program
073
//*******************************************************************************************************************
074
075
void
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
//*******************************************************************************************************************
121
void
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 этого кода либо капризничает о версии явы, либо (после колдунства с установкой явы) запускается и виснет %)
Разобрался.
Стабильно работает с s2midiv101, а он видит только LoopBe Internal Midi.
Проверил вот на таком тестовом скетче:
01
void
setup
(){
02
Serial
.begin(36000);
03
04
}
05
06
const
int
numSnareReadings = 5;
07
int
velocity;
08
int
hitavg;
09
int
snareReadings[numSnareReadings];
10
int
snareIndex = 0;
11
int
snareTotal = 0;
12
int
snareAverage = 0;
13
int
currentSnareState;
14
int
switchSnareState = 0;
15
16
long
previousMillis1 = 0;
17
long
previousMillis2 = 0;
18
long
previousMillis3 = 0;
19
long
previousMillis4 = 0;
20
21
long
interval1 = 100;
22
long
interval2 = 100;
23
long
interval3 = 100;
24
long
interval4 = 100;
25
26
void
noteOn(
byte
channel,
byte
note,
byte
velocity)
27
{
28
midiMsg(channel+0x90, note, velocity);
29
}
30
31
32
void
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
42
velocity = map(hitavg, 0, 1023, 1, 127);
43
hitavg = analogRead(A0);
44
unsigned
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
}
Здравствуйте! Скажите пожалуйста, в итоге заработало то что вы делали, барабанная установка??
И ваш последний скетч он работает?
Тоже интересует, оба варианта. С Atmega16u2 любопытно, есть ли скетч или всё в hex запихали, и не переделать?