Поставить на стоп с помощью кнопки
- Войдите на сайт для отправки комментариев
Пт, 17/12/2021 - 20:31
Привет привет мои друзья и товарищи!!! По несчастью или нет не могу быть уверена, но у меня встал вопрос! При нажатии на энкодер хочу чтобы ставилось звучание на паузу, а при повторном воспроизводилось снова. Получается сделать пока что только воспроизведение при удержании))
Жду Вашей помощи и активных обсуждений!
Моя безуспешная попытка:
void loop()
{
setMIDIBank (1);
int instrument = abs(encoder0Pos);
if(digitalRead(5)==LOW)
isPaused = false;
if (isPaused = false)
{
player.midiWriteData(0xC0, instrument, 127);
player.midiNoteOn(0, instrument, 127);
}
else
{
player.midiNoteOff(0, instrument, 127);
}
Serial.println(encoder0Pos);
Serial.println(digitalRead(5));
}
Моя успешная попытка, но это не то, чего я хочу((
void loop()
{
setMIDIBank (1);
int instrument = abs(encoder0Pos);
if(digitalRead(5)==LOW)
{
player.midiWriteData(0xC0, instrument, 127);
player.midiNoteOn(0, instrument, 127);
}
else
{
player.midiNoteOff(0, instrument, 127);
}
Serial.println(encoder0Pos);
Serial.println(digitalRead(5));
}
Для начала хочу убедиться: Вы понимаете, что в MIDI пауза совсем не такая как в WAV?
Ну и желательно формулировать вопрос по следующей схеме:
1. Чего хочется.
2. Что вместо этого получается.
3. Чем первое отличается от второго.
А то непонятно, чего именно Вы хотите, что Вас не устраивает.
В безуспешной попытке замените строку 6 на
я могу где то кинуть вам весь код чтобы посмотрели что не так?
Здесь и кидайте. Или он такой секретный?
#include <SPI.h> #include <Wire.h> #include <ENC.h> #include <MusicPlayer.h> #define encoder0PinA 4 #define encoder0PinB 3 int data_old; int isPaused; volatile long encoder0Pos; void setup() { pinMode(encoder0PinA, INPUT); pinMode(encoder0PinB, INPUT); pinMode(5,INPUT_PULLUP); // BUTTON digitalWrite(encoder0PinA, HIGH); digitalWrite(encoder0PinB, HIGH); attachInterrupt(0, encoderPinChangeA, CHANGE); attachInterrupt(1, encoderPinChangeB, CHANGE); encoder0Pos = 0; midiInit(); Serial.begin(9600); } void loop() { setMIDIBank (1); int instrument = abs(encoder0Pos); if(digitalRead(5)==LOW) isPaused = !isPaused; if (isPaused = false) { player.midiWriteData(0xC0, instrument, 127); player.midiNoteOn(0, instrument, 127); } else { player.midiNoteOff(0, instrument, 127); } Serial.println(encoder0Pos); Serial.println(digitalRead(5)); } void triggerNotes() { for (int note = 30; note <87; note++) { player.midiNoteOn(0, note, 127); delay (50); player.midiNoteOff(0, note, 127); delay (50); } } void middleC(){ setMIDIBank (1); for (int i=0;i<127;i++) { player.midiWriteData(0xC0, i, 0); player.midiNoteOn(0, 60, 127); delay (1000); player.midiNoteOff(0, 60, 127); } } void midiInit(){ player.beginInMidiFmt(); player.midiWriteData(0xB0, 0x07, 120); } void setMIDIBank(byte bank) { if (bank==1) player.midiWriteData(0xB0, 0, 0x00); else player.midiWriteData(0xB0, 0, 0x78); } void encoderPinChangeA() { if (digitalRead(encoder0PinA) == HIGH) { if (digitalRead(encoder0PinB) == LOW) { encoder0Pos = encoder0Pos + 1; if(abs(encoder0Pos)>127) { encoder0Pos=0; } } else { encoder0Pos = encoder0Pos - 1; if(abs(encoder0Pos)>127) { encoder0Pos=0; } } } else { if (digitalRead(encoder0PinB) == HIGH) { encoder0Pos = encoder0Pos + 1; if(abs(encoder0Pos)>127) { encoder0Pos=0; } } else { encoder0Pos = encoder0Pos - 1; if(abs(encoder0Pos)>127) { encoder0Pos=0; } } } } void encoderPinChangeB() { if (digitalRead(encoder0PinB) == HIGH) { if (digitalRead(encoder0PinA) == HIGH) { encoder0Pos = encoder0Pos + 1; if(abs(encoder0Pos)>127) { encoder0Pos=0; } if(abs(encoder0Pos)>127) { encoder0Pos=0; } } else { encoder0Pos = encoder0Pos - 1; if(abs(encoder0Pos)>127) { encoder0Pos=0; } } } else { if (digitalRead(encoder0PinA) == LOW) { encoder0Pos = encoder0Pos + 1; if(abs(encoder0Pos)>127) { encoder0Pos=0; } } else { encoder0Pos = encoder0Pos - 1; if(abs(encoder0Pos)>127) { encoder0Pos=0; } } } }в 11 строке
intisPaused = 1;И с кнопкой так не работают. Вам нужно ловить только момент нажатия, а не нажатое состояние вообще. Иначе состояние проигрывателя будет меняться со скоростью прохождения цикла loop. Ну и про дребезг контактов забывать не нужно
а как бы Вы сделали?
Вам нужно ловить только момент нажатия, а не нажатое состояние вообще.
2TC: Имеется в виду момент перехода из ненажатого состояния в нажатое.
А как это реализовать?
А как это реализовать?
выделить кнопку в отдельную процедуру, в процедуре отслеживаем не только нажатие но и отжатие, защиту от дребезга можно решить к примеру через delay(30) ну или воспользоваться готовым решением по обработке кнопки
А как это реализовать?
В точности так, как написано: отслеживаем наступление состояния, при котором вот только что было не нажато, а теперь - нажато.
А в общем случае - следует научиться правильно формулировать свои мысли по-русски. Правильная формулировка - она сама по себе является инструкцией к действию.
ну ты в своем стиле)) столько слов, а толку ноль))
а как бы Вы сделали?
https://github.com/VAleSh-Soft/shButton
#include <SPI.h> #include <Wire.h> #include <ENC.h> #include <MusicPlayer.h> #include "GyverButton.h" #define BTN_PIN 5 GButton butt1(BTN_PIN); #define encoder0PinA 4 #define encoder0PinB 3 int data_old; int isPaused = 1; volatile long encoder0Pos; void setup() { pinMode(encoder0PinA, INPUT); pinMode(encoder0PinB, INPUT); //pinMode(5,INPUT_PULLUP); // BUTTON digitalWrite(encoder0PinA, HIGH); digitalWrite(encoder0PinB, HIGH); attachInterrupt(0, encoderPinChangeA, CHANGE); attachInterrupt(1, encoderPinChangeB, CHANGE); encoder0Pos = 0; midiInit(); Serial.begin(9600); } void loop() { butt1.tick(); if (butt1.isSingle()) isPaused = !isPaused; setMIDIBank (1); int instrument = abs(encoder0Pos); if (isPaused = false) { player.midiWriteData(0xC0, instrument, 127); player.midiNoteOn(0, instrument, 127); } else { player.midiNoteOff(0, instrument, 127); } Serial.println(encoder0Pos); Serial.println(digitalRead(5)); }а как бы Вы сделали?
Зависит от ситуации. Иногда достаточно delay(x) после нажатия.)