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