[RISOLTO] problema byte

Salve, sto realizzando un dj controller … ora ho i componenti sulla breadboard…

tramite il midi ricevo un attenzione in aspettato che non riesco ad copiare il messaggio.

Vi posto il codice è l’immagine.

#include <MIDI.h>
#include <midi_Defs.h>
#include <midi_Message.h>
#include <midi_Namespace.h>
#include <midi_Settings.h>

const int buttonOne = 4; // assign button pin to variable
const int buttonTwo = 7; // assign button pin to variable
const int buttonTre = 2; // assign button pin to variable
const int knobPin = A5;
const int channel = 1;

float detectedValue;
int midiValue = 0;
int oldMidiValue = 0; // used to track changes to the midi value

MIDI_CREATE_INSTANCE(HardwareSerial, Serial, midiOut); // create a MIDI object called midiOut

void setup() {
  pinMode(buttonOne, INPUT); // setup button as input
  pinMode(buttonTwo, INPUT); // setup button as input
  pinMode(buttonTre, INPUT);
  Serial.begin(115200); // setup MIDI output
}

void loop() {

  detectedValue = 0.9 * detectedValue + 0.1 * analogRead(knobPin);
  midiValue = map(detectedValue, 0, 1023, 0, 127);
  if (midiValue != oldMidiValue) {
    midiOut.sendControlChange(20, midiValue, channel);
    oldMidiValue = midiValue;
  }


  if (digitalRead(buttonOne) == HIGH) { // check button state
    delay(10); // software de-bounce
    if (digitalRead(buttonOne) == HIGH) { // check button state again
      midiOut.sendControlChange(56, 127, 1); // send a MIDI CC -- 56 = note, 127 = velocity, 1 = channel
      delay(250);
    }
  }

  if (digitalRead(buttonTwo) == HIGH) { // check button state
    delay(10); // software de-bounce
    if (digitalRead(buttonTwo) == HIGH) { // check button state again
      midiOut.sendControlChange(42, 127, 1); // send a MIDI CC -- 42 = note, 127 = velocity, 1 = channel
      delay(250);
    }
  }
  if (digitalRead(buttonTre) == HIGH) {
    delay(10);
    if (digitalRead(buttonTre) == HIGH)
    {
      midiOut.sendControlChange(43, 127, 1);
      delay(250);
    }
  }
}

Mi sapete dire che problema è?.

Grazie mille e buona serata.

gigetto1982: tramite il midi ricevo un attenzione in aspettato che non riesco ad copiare il messaggio.

Puoi tradurre o esplicitare meglio??

Ciao,ùP.

Puoi catturare anche il resto del messaggio (scrollando la finestra a destra)? In fondo c'è anche un codice.

Oppure, meglio, digita direttamente il messaggio (riportandolo qui esattamente come lo leggi) tanto non è che sia così lungo, dai, un poco di sforzo e si può fare... ;)

pgiagno: Puoi tradurre o esplicitare meglio??

Anche io ero perplesso, ma se vedi l'immagine allegata si capisce (traduco: "tramite MIDI ricevo un warning inaspettato che non riesco a capire") ;)

Nel frattempo dando un'occhiata più in dettaglio, per prima cosa ti consiglio di impostare "byte" per i parametri del sendcontrolChange() ossia:

...
const byte channel = 1;
...
byte midiValue = 0;
byte oldMidiValue = 0; // used to track changes to the midi value
...

Poi non ho ben capito questa parte:

  detectedValue = 0.9 * detectedValue + 0.1 * analogRead(knobPin);
  midiValue = map(detectedValue, 0, 1023, 0, 127);

Per prima cosa devi sapere che la map() non assicura che il valore restituito rientri nel range specificato (in questo caso tra 0 e 127) se il valore di ingresso per qualche ragione sforasse i suoi limiti (ossia minore di 0 o maggiore di 1023). Lo leggi anche nel reference:

"Does not constrain values to within the range, because out-of-range values are sometimes intended and useful. The constrain() function may be used either before or after this function, if limits to the ranges are desired."

Questa è l'implementazione:

long map(long x, long in_min, long in_max, long out_min, long out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

Però puoi usare la funzione constrain() per essere certo di rispettare i limiti.

Inoltre la map() da definizione gestisce valori interi:

"The map() function uses integer math so will not generate fractions, when the math might indicate that it should do so. Fractional remainders are truncated, and are not rounded or averaged."

Per sicurezza ti conviene convertire la "detectedValue" in long (mantenendo il calcolo in float).

Infine devi considerare che il loop() viene eseguito migliaia di volte al secondo, per cui quella formula (che immagino ti serva per "addolcire" la variazione del parametro letto dal knob) di fatto converge molto rapidamente al valore di digitalRead(), forse dovresti usare un metodo o formula diversa, o quantomeno limitare il numero di aggiornamenti attendendo un certo tempo prima di una nuova lettura (es. 10 al secondo credo siano più che sufficienti). Tra l'altro eviterei del tutto quei delay() perché quando si azionano i pulsanti non puoi fare altro per 250 millisecondi ossia massimo 4 al secondo (cosa che rallenta anche la lettura analogica del knob), dovresti convertire tutto gestendo gli eventi con millis().

Insomma, spiega meglio cosa intendi ottenere con quell'algoritmo, e vediamo come sistemarlo.

Ad esempio puoi iniziare da una cosa del tipo:

...
unsigned long detectedValue = 0;
...
const byte channel = 1;
...
byte midiValue = 0;
byte oldMidiValue = 0; // used to track changes to the midi value
...
unsigned long prevMillis = 0;
void loop() {
  if ( millis() - prevMillis > 100 ) // millisecondi tra eventi di lettura
  {
    detectedValue = 0.9 * detectedValue + 0.1 * analogRead(knobPin);
    detectedValue = constrain(detectedValue, 0, 1023);
    midiValue = map(detectedValue, 0, 1023, 0, 127);
    if (midiValue != oldMidiValue) {
      midiOut.sendControlChange(20, midiValue, channel);
      oldMidiValue = midiValue;
    }
    prevMillis = millis();
  }
...

ok, visto tutto quello che mi avete detto… ma mi sa prima studio e poi mi metto ad fare i progetti.

vi ringrazio molto per la spiegazione quando avrò possibilità faccio le prove.

Io ho fatto solo copia/incolla su codice online, che ora non ricordo più dov’è.

grazie mille e buona settimana.

ok, ho avuto tempo .. ho inserito il tuo codice e ha funzionato.

grazie mille e buona giornata.

@gigetto, se hai voglia, modifica il tuo primo post, e nel titolo aggiungi [RISOLTO] così sappiamo che il thread è risolutivo. Grazie :)