Gestire array per usare registri a scorrimento 74HC595

Ciao a tutti.
Questo è il primo post che faccio quindi non so se la categoria è giusta.
Sto costruendo una tastiera che, con input MIDI seriale (non USB) riproduce le note con degli attuatori elettromeccanici. Per poterli utilizzare ho usato dei registri a scorrimento 74HC595 e un Arduino nano.
La mia idea era quella di modificare un array da 37 bit in base alle note ricevute e poi dividere questo array in altri 5 array e inviarli ai registri a scorrimento.
Per modificare quello da 37 bit ho usato un puntatore, ma la parte di conversione per spedire tutto ai 74HC595 non funziona.
Come potrei risolvere? (Anche in un modo completamente diverso da questo)
Grazie

Ecco il programma;

#include "ShiftRegister.cpp"
#include <MIDI.h>  //Aggiunta libreria MIDI
MIDI_CREATE_DEFAULT_INSTANCE(); //Crea un'istanza della libreria con parametri standard (nome, porta seriale e impostazioni)

//pin registri a scorrimento
const int shift_datapin = 9;
const int shift_clockpin = 10;
const int shift_latchpin = 11;
bool shiftnote[37]={0}; //Array da inviare ai registri a scorrimento
ShiftRegister<5> tastiera(shift_datapin, shift_clockpin, shift_latchpin); //Dichiarazione oggetto  "tastiera", con 5 registri a scorrimento
uint8_t pinValues[5] = {0, 0, 0, 0, 0};
bool *ptr = shiftnote; //Dichiarazione puntatore
const int h=36; //Modifica ottava (Inserire solo multipli di 12)

void setup() {
  MIDI.begin(MIDI_CHANNEL_OMNI); // Inizializza libreria MIDI: ascoltare su tutti i canali
  MIDI.setHandleNoteOn(MyHandleNoteOn); //Stabilisce alla libreria Midi quale funzione chiamare quando viene ricevuto un comando NOTE_ON.
  MIDI.setHandleNoteOff(MyHandleNoteOff); //Stabilisce alla libreria Midi quale funzione chiamare quando viene ricevuto un comando NOTE_OFF.
}

void loop() {
  MIDI.read(); //Controlla se sono stati ricevuti dati Midi
 
  for(int n=0; n<38; n++)
  {
    if(n<8 && shiftnote[n]>0)
      pinValues[0]|=(1<<(n));
    if(n>=8 && n<16 && shiftnote[n]>0)
      pinValues[1]|=(1<<(n-8));
    if(n>=16 && n<24 && shiftnote[n]>0)
      pinValues[2]|=(1<<(n-16));
    if(n>=24 && n<32 && shiftnote[n]>0)
      pinValues[3]|=(1<<(n-24));
    if(n>=32 && n<40 && shiftnote[n]>0)
      pinValues[4]|=(1<<(n-32));

      if(n<8 && shiftnote[n]==0)
      pinValues[0]|=(0<<(n));
    if(n>=8 && n<16 && shiftnote[n]==0)
      pinValues[1]|=(0<<(n-8));
    if(n>=16 && n<24 && shiftnote[n]==0)
      pinValues[2]|=(0<<(n-16));
    if(n>=24 && n<32 && shiftnote[n]==0)
      pinValues[3]|=(0<<(n-24));
    if(n>=32 && n<40 && shiftnote[n]==0)
      pinValues[4]|=(0<<(n-32));
  }
}

void MyHandleNoteOn(byte command, byte note, byte velocity) {
for(int i=0; i<38; i++)
{
  if(note == i+h){
    if(velocity>0)
    *(ptr+i)=1;
    else
    *(ptr+i)=0;
  }
  }
}

void MyHandleNoteOff(byte command, byte note, byte velocity) {
  for(int i=0; i<38; i++)
{
  if(note == i+h)  //||(velocity == 0)
  *(ptr+i)=0;
  }
}

Buongiorno,

:warning: prima di tutto ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato, dopo di che ...

... essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il succitato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nel rispetto del suddetto regolamento nessuno ti risponderà (eventuali risposte verrebbero temporaneamente nascoste), quindi ti consiglio di farla al più presto. :wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.