Ардуино миди барабаны midi drums
- Войдите на сайт для отправки комментариев
Пт, 23/03/2018 - 21:26
Здравствуйте всем. Прошу помощи в таком деле. Есть три китайских ардуинки. Две нано и одна уно. При заливке скетча tx начинает по бешеному мигать тоесть как я понимаю поссылы идут от фонаря. Скетчи прилогаю, грешу на ch340 может надо оригинал купить и поэтому трабл. Пробовал порог чуствительности срабатывания повысить но ничего не меняется.Срабатывают куча нот как с подключенными пьезами так и без них. проблемма у всех ардуинок одна и таже. Скетчь разные пробовал, одно и тоже. Я нуб так что если поможете буду благодарен. Спасибо
// Автор кода: Christian D'Aquino
// Версия: 20150109
// Редактор: Rodrigo Amaral
// Перевод на Русский: CheapDrums
// НЕОБХОДИМО УСТАНОВИТЬ СКОРОСТЬ СОМ ПОРТА НА 115200
//---------------------------- ННАСТРОЙКИ ------------------------------------------------------------------------------------------------------------------------------------------//
// ФОРМА ВВОДА ЗНАЧЕНИЙ, ВВОДИМ ЗНАЧЕНИЯ ВСЕХ 16ТИ ПИНОВ В СКОБКАХ ЧЕРЕЗ ЗАПЯТУЮ, ПРИМЕР ={A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15};
/*
|HAT CONTROL
|A0 |HI-HAT
| |A1 |KICK
| | |A2 |SNARE
| | | |A3 |RACK TOM 1 (1)
| | | | |A4 |RACK TOM 2 (2)
| | | | | |A5 |RACK TOM 3 (3)
| | | | | | |A6 |FLOOR TOM 1 (4)
| | | | | | | |A7 |RIDE 2
| | | | | | | | |A8 |RIDE 2 BELL
| | | | | | | | | |A9 |SYMBAL 3
| | | | | | | | | | |A10 |SYMBAL 4
| | | | | | | | | | | |A11 |CHINA 1
| | | | | | | | | | | | |A12 |CHINA 2
| | | | | | | | | | | | | |A13 |SPLASH
| | | | | | | | | | | | | | |A14 |SPOCK
| | | | | | | | | | | | | | | |A15
*/
byte SensorType[16] ={144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 128 }; // ТИП СЭНСОРА; 144 = ПЬЕЗА, 176 = КОНТРОЛЛЕР ХЭТА НА TCRT5000, 128 = ПУСТО
byte PadNote[16] ={44, 60, 36, 38, 48, 47, 45, 43, 108, 109, 30, 31, 27, 52, 55, 29 }; // НОТА ПРИВЯЗАННАЯ К ПИНУ (АКТУАЛЬНО ДЛЯ SUPERIOR DRUMMER 2 / THE METAL FOUNDRY, В ДРУГИХ ПЛАГИНАХ / БИБЛИОТЕКАХ МОЖЕТ ОТЛИЧАТЬСЯ)
int thresholdMin[16] ={800 ,800, 800 ,800 ,800 ,800 ,800 ,800 ,800 ,800 ,800 ,800 ,800 ,800 ,800 ,800 }; // НИЖНИЙ ПОРОГ ЧУВСТВИТЕЛЬНОСТИ (так же срезается нижний порог передаваемого по миди значения velocity, компенсиривать можно во вкладке utility)
int thresholdMax[16] ={1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023}; // ВЕРХНИЙ ПОРОГ ЧУВСТВИТЕЛЬНОСТИ
int sensorScantime[16]={10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 }; // ЧАСТОА ОПРОСА ДАТЧИКОВ
int sensorMasktime[16]={10, 60, 60, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40 }; // ДЛИТЕЛЬНОСТЬ ИГНОРИРОВАНИЯ ДАТЧИКА ПОСЛЕ ПЛУЧЕНИЯ С НЕГО СИГНАЛА
#define READPIN 8 // КОЛЛИЧЕСТВО ЗАДЕЙСТВОВАННЫХ АНАЛОГОВЫХ ПИНОВ ДЛЯ ВВОДА (1й пин = A0, 2й пин = A1 и так далее)
//------------------------------ Глушения тарелок ---------------------------------------//
// Ноты глушения //
#define choke1 94
#define choke2 95
#define choke3 106
#define chokeRide 118
// Доп цифровые входы //
#define Aux1 47
#define Aux2 47
#define Aux3 47
#define Aux4 47
#define Aux5 47
#define Aux6 47
#define Aux7 47
// !!! ДАЛЕЕ ИДЕТ КОД ПРОГРАММЫ, ИЗМЕНЕНИЯ ВНОСИТЬ ТОЛЬКО ОПЫТНЫМ ПОЛЬЗОВАТЕЛЯМ !!! //
//Определение цифровых пинов глушилок
#define Choke1_Pin 51
#define Choke2_Pin 49
#define Choke3_Pin 47
#define ChokeRide_Pin 53
//Определение доп. цифровых пинов
#define Aux1_Pin 33
#define Aux2_Pin 35
#define Aux3_Pin 37
#define Aux4_Pin 39
#define Aux5_Pin 41
#define Aux6_Pin 43
#define Aux7_Pin 45
//Состояние цифровых пинов
int Choke1_State = LOW;
int Choke2_State = LOW;
int Choke3_State = LOW;
int ChokeRide_State = LOW;
int Aux1_State = LOW;
int Aux2_State = LOW;
int Aux3_State = LOW;
int Aux4_State = LOW;
int Aux5_State = LOW;
int Aux6_State = LOW;
int Aux7_State = LOW;
int currentSwitchState = LOW;
// установка и сброс битов регистра
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
#define midichannel 0
int readSensor = 0;
int led = 13;
unsigned long previousMillis[16];
unsigned long currentMillis[16];
unsigned int sensorReads[10];
int readNumber[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
boolean playNote[16] ={true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true};
int pin = 0;
void setup()
{
Serial.begin(115200);
pinMode(Choke1_Pin, INPUT);
pinMode(Choke2_Pin, INPUT);
pinMode(Choke3_Pin, INPUT);
pinMode(ChokeRide_Pin, INPUT);
pinMode(Aux1_Pin, INPUT);
pinMode(Aux2_Pin, INPUT);
pinMode(Aux3_Pin, INPUT);
pinMode(Aux4_Pin, INPUT);
pinMode(Aux5_Pin, INPUT);
pinMode(Aux6_Pin, INPUT);
pinMode(Aux7_Pin, INPUT);
digitalWrite(Choke1_Pin, HIGH); // необходимо подтягивающее сопротивление
digitalWrite(Choke2_Pin, HIGH); // необходимо подтягивающее сопротивление
digitalWrite(Choke3_Pin, HIGH); // необходимо подтягивающее сопротивление
digitalWrite(ChokeRide_Pin, HIGH); // необходимо подтягивающее сопротивление
digitalWrite(Aux1_Pin, HIGH); // необходимо подтягивающее сопротивление
digitalWrite(Aux2_Pin, HIGH); // необходимо подтягивающее сопротивление
digitalWrite(Aux3_Pin, HIGH); // необходимо подтягивающее сопротивление
digitalWrite(Aux4_Pin, HIGH); // необходимо подтягивающее сопротивление
digitalWrite(Aux5_Pin, HIGH); // необходимо подтягивающее сопротивление
digitalWrite(Aux6_Pin, HIGH); // необходимо подтягивающее сопротивление
digitalWrite(Aux7_Pin, HIGH); // необходимо подтягивающее сопротивление
pinMode(led, OUTPUT);
while (!Serial) {
; // ждать последовательный порт для подключения, (только для Arduino Leonardo)
}
// установить делитель на 8
cbi(ADCSRA,ADPS2);
sbi(ADCSRA,ADPS1);
sbi(ADCSRA,ADPS0);
Serial.flush();
}
void loop()
// ------------------------------------ ЦИФРОВЫЕ ВХОДЫ ----------------------------------- //
// ГЛУШИЛКА 01
{
currentSwitchState = digitalRead(Choke1_Pin);
if( currentSwitchState == LOW && Choke1_State == HIGH ) // push
MIDI_TX(144, choke1, 127);
if( currentSwitchState == HIGH && Choke1_State == LOW ) // release
MIDI_TX(128, choke1, 127);
Choke1_State = currentSwitchState;
// ГЛУШИЛКА 02
{
currentSwitchState = digitalRead(Choke2_Pin);
if( currentSwitchState == LOW && Choke2_State == HIGH ) // push
MIDI_TX(144, choke2, 127);
if( currentSwitchState == HIGH && Choke2_State == LOW ) // release
MIDI_TX(128, choke2, 127);
Choke2_State = currentSwitchState;
// ГЛУШИЛКА 03
{
currentSwitchState = digitalRead(Choke3_Pin);
if( currentSwitchState == LOW && Choke3_State == HIGH ) // push
MIDI_TX(144, choke3, 127);
if( currentSwitchState == HIGH && Choke3_State == LOW ) // release
MIDI_TX(128, choke3, 127);
Choke3_State = currentSwitchState;
// ГЛУШИЛКА РАЙДА
{
currentSwitchState = digitalRead(ChokeRide_Pin);
if( currentSwitchState == LOW && ChokeRide_State == HIGH ) // push
MIDI_TX(144, chokeRide, 127);
if( currentSwitchState == HIGH && ChokeRide_State == LOW ) // release
MIDI_TX(128, chokeRide, 127);
ChokeRide_State = currentSwitchState;
// AUX 1
{
currentSwitchState = digitalRead(Aux1_Pin);
if( currentSwitchState == LOW && Aux1_State == HIGH ) // push
MIDI_TX(144, Aux1, 127);
if( currentSwitchState == HIGH && Aux1_State == LOW ) // release
MIDI_TX(128, Aux1, 127);
Aux1_State = currentSwitchState;
// AUX 2
{
currentSwitchState = digitalRead(Aux2_Pin);
if( currentSwitchState == LOW && Aux2_State == HIGH ) // push
MIDI_TX(144, Aux2, 127);
if( currentSwitchState == HIGH && Aux2_State == LOW ) // release
MIDI_TX(128, Aux2, 127);
Aux2_State = currentSwitchState;
// AUX 3
{
currentSwitchState = digitalRead(Aux3_Pin);
if( currentSwitchState == LOW && Aux3_State == HIGH ) // push
MIDI_TX(144, Aux3, 127);
if( currentSwitchState == HIGH && Aux3_State == LOW ) // release
MIDI_TX(128, Aux3, 127);
Aux3_State = currentSwitchState;
// AUX 4
{
currentSwitchState = digitalRead(Aux4_Pin);
if( currentSwitchState == LOW && Aux4_State == HIGH ) // push
MIDI_TX(144, Aux4, 127);
if( currentSwitchState == HIGH && Aux4_State == LOW ) // release
MIDI_TX(128, Aux4, 127);
Aux4_State = currentSwitchState;
// AUX 5
{
currentSwitchState = digitalRead(Aux5_Pin);
if( currentSwitchState == LOW && Aux5_State == HIGH ) // push
MIDI_TX(144, Aux5, 127);
if( currentSwitchState == HIGH && Aux5_State == LOW ) // release
MIDI_TX(128, Aux5, 127);
Aux5_State = currentSwitchState;
// AUX 6
{
currentSwitchState = digitalRead(Aux6_Pin);
if( currentSwitchState == LOW && Aux6_State == HIGH ) // push
MIDI_TX(144, Aux6, 127);
if( currentSwitchState == HIGH && Aux6_State == LOW ) // release
MIDI_TX(128, Aux6, 127);
Aux6_State = currentSwitchState;
// AUX 7
{
currentSwitchState = digitalRead(Aux7_Pin);
if( currentSwitchState == LOW && Aux7_State == HIGH ) // push
MIDI_TX(144, Aux7, 127);
if( currentSwitchState == HIGH && Aux7_State == LOW ) // release
MIDI_TX(128, Aux7, 127);
Aux7_State = currentSwitchState;
//------------------------------------- АНАЛОГОВЫЕ ВХОДЫ -----------------------------------------------//
for(pin = 0; pin < READPIN; pin++)
{
readSensor = analogRead(pin);
if((SensorType[pin] != 128) && (readSensor > thresholdMin[pin]) && ((currentMillis[pin] - previousMillis[pin]) <= sensorMasktime[pin]))
{
currentMillis[pin] = millis();
if (readNumber[pin] < sensorScantime[pin])
{
if (readSensor > sensorReads[pin])
{
sensorReads[pin] = readSensor;
}
readNumber[pin]++;
} else if (playNote[pin] == true)
{
playNote[pin] = false;
int velocity = normalizeSensor(sensorReads[pin], pin);
MIDI_TX(SensorType[pin], PadNote[pin], velocity);
digitalWrite(led, HIGH);
digitalWrite(led, LOW);
}
} else if ((currentMillis[pin] - previousMillis[pin]) > sensorMasktime[pin])
{
playNote[pin] = true;
readNumber[pin] = 0;
sensorReads[pin] = 0;
previousMillis[pin] = currentMillis[pin];
}
}
// =======================================================================================================================================================//
}
}
}
}
}
}
}
}
}
}
}
Вы этот код откуда-то списали, даже не разобравшись, от какого он контроллера. Судя по номерам пинов в Сетапе (см ниже) - на Нано и Уно он работать не будет. Может это Мега, а может и вовсе не ардуина...
Интересно, как вы вообще могли что-то подключить в ардуине при таких номерах пинов?! Или просто тыкали провода в первый попавшийся контакт?
вы правы скетч от мега. на нано я его просто залил и нчего не подключал а на уно все ноты подряд шли. вот это код от нано но результат одинаковый
у вас используются аналоговые порты без подтяжки - если к ним ничего не подключено, с них постоянно будет идти мусор. Это совершенно нормальное поведение, китайскость ардуины тут не причем, на оригинале будет то же самое.
Сконфигурируйте порты с внутренней подтяжкой либо подключите к ним внешнюю подтяжку резистором 20-50к к земле или к питанию.
тоесть подключить пьезу паралельно 1мом? я уже делал на уно. Ничего не происходит. Может увеличить сопротивление резистора?
вот как я подключил пьезы
тоесть подключить пьезу паралельно 1мом? я уже делал на уно. Ничего не происходит. Может увеличить сопротивление резистора?
скорее уменьшить
понял попробую отпишусь спасибо огромное за помощь
понял попробую отпишусь спасибо огромное за помощь
сорри, перепутал пьезы с кнопками. Попробуйте в своем варианте уменьшить резистор до 50к
хорошо спасибо
проблема была в том что нужно выставить в прошивке столько пьез сколько подлючаем и тогда не будет шумов. Долго что-то я с этим морочился. Спасибо большое может кому-то пригодится мой опыт. Еще при подключении, чтобы ноты не залипали нужно выставить в vst программе долько входное сообщение с миди а на выходе ничего не ставим. Все гладко идет. Еще раз спасибо.Это мой первый проект на ардуино. До этого ремонтировал усилки блоки питания и так по мелочам.....да кстати использую hairless midi которая посылает сообщения на loop be это виртуальный миди интерфеис а уже в kontakt5 настраиваем входное подключение с loop be и миди канал. Для наглядности происходящего использовал midi ox она показывает все и ноты и канал миди сообщении.
Вышла новая каша. Вместо одной ноты проигрываются две . Есть даже ноты которые не задействованы в коде. Что может быть?