Talk guys, I'm new in this environment, I do not understand programming bullies, but I have a great desire to put together a MIDI controller.
I put the project in the protoboard with 09 potentiometers and 20 touch buttons, I downloaded a code from the net that works cool the buttons, but the potentiometers do not work at all, when I open the Hairless Midi and I turn the potentiometer it does not leave the 127, in the Maximum reaches 126 ....
The big question, would someone have a code that works to pass me ??? Would be for 12 potentiometers and more or less about 20 buttons ...
I am using the arduino Mega 2560, with the atmel 2560
My One Driver Link of pictures the posts wired: Microsoft OneDrive - Access files anywhere. Create docs with free Office Online.
Follow the Code
#include <MIDI.h>
MIDI_CREATE_DEFAULT_INSTANCE();
/////////////////////////////////////////////
const int NButtons = 3; // *coloque aqui o numero de entradas digitais utilizadas
const int button[NButtons] = {5, 6, 7}; // *neste array coloque na ordem desejada os pinos das portas digitais utilizadas
int buttonCState[NButtons] = {0}; // estado atual da porta digital
int buttonPState[NButtons] = {0}; // estado previo da porta digital
/////////////////////////////////////////////
const int NPots = 1; // *coloque aqui o numero de entradas analogicas utilizadas
const int pot[NPots] = {A0}; // *neste array coloque na ordem desejada os pinos das portas analogicas utilizadas
int potCState[NPots] = {0}; // estado atual da porta analogica
int potPState[NPots] = {0}; // estado previo da porta analogica
int potVar = 0; // variacao entre o valor do estado previo e o atual da porta analogica
/////////////////////////////////////////////
byte midiCh = 1; // *Canal midi a ser utilizado
byte note = 36; // *Nota mais grave que sera utilizada
byte cc = 1; // *CC mais baixo que sera utilizado
/////////////////////////////////////////////
int TIMEOUT = 300; //quantidade de tempo em que o potenciometro sera lido apos ultrapassar o varThreshold
int varThreshold = 4; //threshold para a variacao no sinal do potenciometro
boolean potMoving = true; // se o potenciometro esta se movendo
unsigned long pTime[NPots] = {0}; // tempo armazenado anteriormente
unsigned long timer[NPots] = {0}; // armazena o tempo que passou desde que o timer foi zerado
/////////////////////////////////////////////
void setup () {
//Start midi connection
MIDI.begin();
//Serial Connection
Serial.begin(115200);
//Initialize Digital Pins as inputs
for (int i=0; i<NButtons; i++){
pinMode(button*, INPUT_PULLUP);*
-
}*
// pinMode(button[3], INPUT); //pino 13 -
//Initialize Analog Pins as inputs*
-
for (int i=0; i<NPots; i++){*
_ pinMode(pot*, INPUT);_
_ }*_
}
void loop () {
* //Le todas as entradas digitais utilizadas*
* for (int i=0; i<NButtons; i++) {*
buttonCState = digitalRead(button*);*
* }*
// buttonCState[3] = !buttonCState[3]; // Inverte o valor do pino 13
* //Le o estado dos botoes e manda NoteOns para cada um que estiver ativo*
* for (int i=0; i<NButtons; i++) {*
if (buttonCState != buttonPState*) {*
_ if(buttonCState == LOW) {
MIDI.sendNoteOn(note+i, 127, midiCh); // envia NoteOn(nota, velocity, canal midi)
buttonPState = buttonCState*;*
* }
else {
MIDI.sendNoteOn(note+i, 0, midiCh);_
buttonPState _= buttonCState;
}
}*_
* }*
* ////////////////////////////////////////////////////////////////////////////////////////*
* for (int i=0; i<NPots; i++) { // le todas entradas analogicas utilizadas*
potCState = analogRead(pot*);*
* }*
_ /* para que seja feita apenas a leitura das portas analogicas quando elas sao utilizadas, sem perder resolucao,
* ´e preciso estabelecer um "threshold" (varThreshold), um valor minimo que as portas tenham que ser movimentadas*
* para que se comece a leitura. Apos isso cria-se uma especie de "portao", um portao que se abre e permite*
* que as porta analogicas sejam lidas sem interrupcao por determinado tempo (TIMEOUT). Quando o timer ´e menor que TIMEOUT*
* significa que o potenciometro foi mexido ha muito pouco tempo, o que significa que ele provavelmente ainda esta se movendo,
logo deve-se manter o "portao" aberto; caso o timer seja maior que TIMEOUT siginifica que ja faz um tempo que ele nao ´e movimentado,
logo o portao deve ser fechado. Para que essa logica aconteca deve-se zerar o timer (linhas 99 e 100) a cada vez que a porta analogica*
* variar mais que o varThreshold estabelecido.
/
for (int i=0; i<NPots; i++) {
potVar = abs(potCState - potPState*); // calcula a variacao da porta analogica*
* if (potVar >= varThreshold) { //sets a threshold for the variance in the pot state, if it varies more than x it sends the cc message*
pTime = millis(); // armazena o tempo previo
* }_
timer _= millis() - pTime; // reseta o timer*
if (timer < TIMEOUT) { // se o timer for menor que o tempo maximo permitido significa que o potenciometro ainda esta se movendo
* potMoving = true;
}
else {
potMoving = false;
}
if (potMoving == true) { // se o potenciometro ainda esta se movendo, mande o control change*
MIDI.sendControlChange(cc+i, map(potCState*, 0, 1023, 0, 127), midiCh); // envia Control Change (numero do CC, valor do CC, canal midi)_
potPState _= potCState; // armazena a leitura atual do potenciometro para comparar com a proxima*
* }
}*_
}