Поставить на стоп с помощью кнопки

Wohsjs
Offline
Зарегистрирован: 11.10.2021

Привет привет мои друзья и товарищи!!! По несчастью или нет не могу быть уверена, но у меня встал вопрос! При нажатии на энкодер хочу чтобы ставилось звучание на паузу, а при повторном воспроизводилось снова. Получается сделать пока что только воспроизведение при удержании))

Жду Вашей помощи и активных обсуждений!

 

Моя безуспешная попытка:


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));
}

 

 

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

Для начала хочу убедиться: Вы понимаете, что в MIDI пауза совсем не такая как в WAV?

Ну и желательно формулировать вопрос по следующей схеме:

1. Чего хочется.

2. Что вместо этого получается.

3. Чем первое отличается от второго.

А то непонятно, чего именно Вы хотите, что Вас не устраивает.

v258
Онлайн
Зарегистрирован: 25.05.2020

В безуспешной попытке замените строку 6 на

isPaused = !isPaused;

 

Wohsjs
Offline
Зарегистрирован: 11.10.2021

я могу где то кинуть вам весь код чтобы посмотрели что не так?

v258
Онлайн
Зарегистрирован: 25.05.2020

Здесь и кидайте. Или он такой секретный?

Wohsjs
Offline
Зарегистрирован: 11.10.2021
#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;       
      }       
    }
  }
}

 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

в 11 строке int isPaused = 1;

v258
Онлайн
Зарегистрирован: 25.05.2020

И с кнопкой так не работают. Вам нужно ловить только момент нажатия, а не нажатое состояние вообще. Иначе состояние проигрывателя будет меняться со скоростью прохождения цикла loop. Ну и про дребезг контактов забывать не нужно

Wohsjs
Offline
Зарегистрирован: 11.10.2021

а как бы Вы сделали?

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

v258 пишет:

Вам нужно ловить только момент нажатия, а не нажатое состояние вообще.

2TC: Имеется в виду момент перехода из ненажатого состояния в нажатое.

Wohsjs
Offline
Зарегистрирован: 11.10.2021

А как это реализовать?

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Wohsjs пишет:

А как это реализовать?

выделить кнопку в отдельную процедуру, в процедуре отслеживаем не только нажатие но и отжатие, защиту от дребезга можно решить к примеру через delay(30) ну или воспользоваться готовым решением по обработке кнопки

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

Wohsjs пишет:

А как это реализовать?

В точности так, как написано: отслеживаем наступление состояния, при котором вот только что было не нажато, а теперь - нажато.

А в общем случае - следует научиться правильно формулировать свои мысли по-русски. Правильная формулировка - она сама по себе является инструкцией к действию.

Wohsjs
Offline
Зарегистрирован: 11.10.2021

ну ты в своем стиле)) столько слов, а толку ноль))

v258
Онлайн
Зарегистрирован: 25.05.2020

Wohsjs пишет:

а как бы Вы сделали?


https://github.com/VAleSh-Soft/shButton

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016
#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));
}

 

Green
Offline
Зарегистрирован: 01.10.2015

Wohsjs пишет:

а как бы Вы сделали?


Зависит от ситуации. Иногда достаточно delay(x) после нажатия.)