DIY MIDI USB CONTROLEUR Project Arduino Uno Besoin d'aide
- 76 réponses
- 10 participants
- 13 094 vues
- 10 followers
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
Sujet de la discussion Posté le 24/01/2019 à 13:39:48DIY MIDI USB CONTROLEUR Project Arduino Uno Besoin d'aide
Bonjour a tous
Mon projet est de réaliser un contrôleur MIDI
uniquement dans le but de commander des paramètres de mon logiciel mao et autres Vst
6 Potentiometres ( 10kohm )
8 boutons
je peux programmer via le logiciel Arduino ,la carte est bien reconnu par le port USB ,et je peux également flasher le contrôleur USB ATMEGA16U2 via le logiciel FLIP afin de pouvoir transmettre les Données Midi via L'usb manipulation que se fait sans problème
https://dartmobo.com/midi-over-usb/
Ci joint voici les programmes ainsi que les projets dont je me suis inspiré
https://www.hackster.io/etiennedesportes/ableton-live-midi-controller-9182b3
Les boutons fonctionnent le mappage se fait correctement dans mon logiciel Mao
Mais les potentiomètres ne fonctionnent pas
Leur course est différente
Leur mappage en midi est impossible car selon la position des potentiomètres la diode TX clignote en permanence
Même si je réussie a mapper un ou 2 potentiomètres le mappage des autres est impossible
Car des que je touche un autre potentiomètre la diode TX clignote donc le mappage est aléatoire
J'ai également testé avant avec ce programme
https://www.instructables.com/id/Easy-3-Pot-Potentiometer-Arduino-Uno-Effects-Midi-/
et le logiciel Hailess Midi et loopBe1
Les 3 potentiomètres (2k2ohm) fonctionnaient
Mon schéma de câblage
Est ce que Le problème vient du code ou bien est ce que mon câblage au niveau des potentiomètres n'est pas bon ?
Sur D'autres projets similaires comme celui ci
https://www.instructables.com/id/Custom-Arduino-MIDI-Controller/
il est conseillé de mettre des condensateurs de 100nf entre le masse et la commande ainsi qu'entre le + et la masse de chaque potentiomètres dans le but d’éliminer les bruits
je vous remercie par avance pour votre aide
Le code principale
La bibliothèque Midi.h
Mon projet est de réaliser un contrôleur MIDI
uniquement dans le but de commander des paramètres de mon logiciel mao et autres Vst
6 Potentiometres ( 10kohm )
8 boutons
je peux programmer via le logiciel Arduino ,la carte est bien reconnu par le port USB ,et je peux également flasher le contrôleur USB ATMEGA16U2 via le logiciel FLIP afin de pouvoir transmettre les Données Midi via L'usb manipulation que se fait sans problème
https://dartmobo.com/midi-over-usb/
Ci joint voici les programmes ainsi que les projets dont je me suis inspiré
https://www.hackster.io/etiennedesportes/ableton-live-midi-controller-9182b3
Les boutons fonctionnent le mappage se fait correctement dans mon logiciel Mao
Mais les potentiomètres ne fonctionnent pas
Leur course est différente
Leur mappage en midi est impossible car selon la position des potentiomètres la diode TX clignote en permanence
Même si je réussie a mapper un ou 2 potentiomètres le mappage des autres est impossible
Car des que je touche un autre potentiomètre la diode TX clignote donc le mappage est aléatoire
J'ai également testé avant avec ce programme
https://www.instructables.com/id/Easy-3-Pot-Potentiometer-Arduino-Uno-Effects-Midi-/
et le logiciel Hailess Midi et loopBe1
Les 3 potentiomètres (2k2ohm) fonctionnaient
Mon schéma de câblage
Est ce que Le problème vient du code ou bien est ce que mon câblage au niveau des potentiomètres n'est pas bon ?
Sur D'autres projets similaires comme celui ci
https://www.instructables.com/id/Custom-Arduino-MIDI-Controller/
il est conseillé de mettre des condensateurs de 100nf entre le masse et la commande ainsi qu'entre le + et la masse de chaque potentiomètres dans le but d’éliminer les bruits
je vous remercie par avance pour votre aide
Le code principale
Spoiler - Cliquer ici pour lire la suite
#include <MIDI.h> // INlcude MIDI library
const int buttonPin = 2; // the number of the Button pin
const int buttonPin2 = 3;
const int buttonPin3 = 4;
const int buttonPin4 = 5;
const int buttonPin5 = 6;
const int buttonPin6 = 7;
const int buttonPin7 = 8;
const int buttonPin8 = 9;
// the number of the pushbutton pin
const int ledPin = 11; // the number of the LED pin
const int ledPin2 = 12;
const int ledPin3 = 13;
const int ledPin4 = 14;
const int ledPin5 = 15;
const int ledPin6 = 16;
const int ledPin7 = 17;
const int ledPin8 = 18;
// variables will change:
boolean currentState = LOW;//stroage for current button state
boolean lastState = LOW;//storage for last button state
boolean currentState2 = LOW;
boolean lastState2 = LOW;
boolean currentState3 = LOW;
boolean lastState3 = LOW;
boolean currentState4 = LOW;
boolean lastState4 = LOW;
boolean currentState5 = LOW;
boolean lastState5 = LOW;
boolean currentState6 = LOW;
boolean lastState6 = LOW;
boolean currentState7 = LOW;
boolean lastState7 = LOW;
boolean currentState8 = LOW;
boolean lastState8 = LOW;
void setup() {
Serial.begin(31250); // default midi speed rate
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin2, OUTPUT);
pinMode(buttonPin2, INPUT_PULLUP);
pinMode(ledPin3, OUTPUT);
pinMode(buttonPin3,INPUT_PULLUP);
pinMode(ledPin4, OUTPUT);
pinMode(buttonPin4, INPUT_PULLUP);
pinMode(ledPin5, OUTPUT);
pinMode(buttonPin5, INPUT_PULLUP);
pinMode(ledPin6, OUTPUT);
pinMode(buttonPin6, INPUT_PULLUP);
pinMode(ledPin7, OUTPUT);
pinMode(buttonPin7,INPUT_PULLUP);
pinMode(ledPin8, OUTPUT);
pinMode(buttonPin8, INPUT_PULLUP);
MIDI.begin();
}
static int iAn0Val, iAn1Val, iAn2Val, iAn3Val, iAn4Val, iAn5Val;
void loop(){
// read the state of the pushbutton value:
currentState = digitalRead(buttonPin);
// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (currentState == LOW && lastState == HIGH) {
digitalWrite(ledPin,HIGH);
MIDI.sendNoteOff(42,0,1);
// turn LED off
}
else if (currentState == HIGH && lastState == LOW) {
digitalWrite(ledPin, LOW);
MIDI.sendNoteOn(42,127,1);
// turn LED on
delay(20);
MIDI.sendNoteOff(42,0,1);
// turn LED off
}
lastState = currentState;
currentState2 = digitalRead(buttonPin2);
if (currentState2 == LOW && lastState2 == HIGH) {
digitalWrite(ledPin2,HIGH);
MIDI.sendNoteOff(39,0,1);
}
else if (currentState2 == HIGH && lastState2 == LOW) {
digitalWrite(ledPin2, LOW);
MIDI.sendNoteOn(39,127,1);
delay(20);
MIDI.sendNoteOff(39,0,1);
}
lastState2 = currentState2;
currentState3 = digitalRead(buttonPin3);
if (currentState3 == LOW && lastState3 == HIGH) {
digitalWrite(ledPin3,HIGH);
MIDI.sendNoteOff(40,0,1);
}
else if (currentState3 == HIGH && lastState3 == LOW) {
digitalWrite(ledPin3, LOW);
MIDI.sendNoteOn(40,127,1);
delay(20);
MIDI.sendNoteOff(40,0,1);
}
lastState3 = currentState3;
currentState4 = digitalRead(buttonPin4);
if (currentState4 == LOW && lastState4 == HIGH) {
digitalWrite(ledPin4,HIGH);
MIDI.sendNoteOff(41,0,1);
}
else if (currentState4 == HIGH && lastState4 == LOW) {
digitalWrite(ledPin4, LOW);
MIDI.sendNoteOn(41,127,1);
delay(20);
MIDI.sendNoteOff(41,0,1);
}
lastState4 = currentState4;
currentState5 = digitalRead(buttonPin5);
if (currentState5 == LOW && lastState5 == HIGH) {
digitalWrite(ledPin5,HIGH);
MIDI.sendNoteOff(38,0,1);
}
else if (currentState5 == HIGH && lastState5 == LOW) {
digitalWrite(ledPin5, LOW);
MIDI.sendNoteOn(38,127,1);
delay(20);
MIDI.sendNoteOff(38,0,1);
}
lastState5 = currentState5;
currentState6 = digitalRead(buttonPin6);
if (currentState6 == LOW && lastState6 == HIGH) {
digitalWrite(ledPin6,HIGH);
MIDI.sendNoteOff(43,0,1);
}
else if (currentState6 == HIGH && lastState6 == LOW) {
digitalWrite(ledPin6, LOW);
MIDI.sendNoteOn(43,127,1);
delay(20);
MIDI.sendNoteOff(43,0,1);
}
lastState6 = currentState6;
currentState7 = digitalRead(buttonPin7);
if (currentState7 == LOW && lastState7 == HIGH) {
digitalWrite(ledPin7,HIGH);
MIDI.sendNoteOff(37,0,1);
}
else if (currentState7 == HIGH && lastState7 == LOW) {
digitalWrite(ledPin7, LOW);
MIDI.sendNoteOn(37,127,1);
delay(20);
MIDI.sendNoteOff(37,0,1);
}
lastState7 = currentState7;
currentState8 = digitalRead(buttonPin8);
if (currentState8 == LOW && lastState8 == HIGH) {
digitalWrite(ledPin8,HIGH);
MIDI.sendNoteOff(44,0,1);
}
else if (currentState8 == HIGH && lastState8 == LOW) {
digitalWrite(ledPin8, LOW);
MIDI.sendNoteOn(44,127,1);
delay(20);
MIDI.sendNoteOff(44,0,1);
}
lastState8 = currentState8;
static int iAn0ValPrev;
iAn0ValPrev = iAn0Val; // previous value
iAn0Val = analogRead(A0)/8; // Divide by 8 to get range of 0-127 for midi
analogPinMidiTX(1,iAn0Val,iAn0ValPrev); //TX value
static int iAn1ValPrev;
iAn1ValPrev = iAn1Val;
iAn1Val = analogRead(A1)/8;
analogPinMidiTX(2,iAn1Val,iAn1ValPrev);
static int iAn2ValPrev;
iAn2ValPrev = iAn2Val;
iAn2Val = analogRead(A2)/8;
analogPinMidiTX(3,iAn2Val,iAn2ValPrev);
static int iAn3ValPrev;
iAn3ValPrev = iAn3Val;
iAn3Val = analogRead(A3)/8;
analogPinMidiTX(4,iAn3Val,iAn3ValPrev);
static int iAn4ValPrev;
iAn4ValPrev = iAn4Val;
iAn4Val = analogRead(A4)/8;
analogPinMidiTX(5,iAn4Val,iAn4ValPrev);
static int iAn5ValPrev;
iAn5ValPrev = iAn5Val;
iAn5Val = analogRead(A5)/8;
analogPinMidiTX(6,iAn5Val,iAn5ValPrev);
}
void analogPinMidiTX(int iChan, int iVal, int iValPrev)
{
// TX Value only if it has changed
if(iValPrev != iVal)
{
MidiTX(176,iChan,iVal); // 176 = CC command, 1 = Which Control, val = value read from Potentionmeter
}
}
void MidiTX(unsigned char MESSAGE, unsigned char CONTROL, unsigned char VALUE) //Valeur en Midi Command
{
Serial.write(MESSAGE);
Serial.write(CONTROL);
Serial.write(VALUE);
}
const int buttonPin = 2; // the number of the Button pin
const int buttonPin2 = 3;
const int buttonPin3 = 4;
const int buttonPin4 = 5;
const int buttonPin5 = 6;
const int buttonPin6 = 7;
const int buttonPin7 = 8;
const int buttonPin8 = 9;
// the number of the pushbutton pin
const int ledPin = 11; // the number of the LED pin
const int ledPin2 = 12;
const int ledPin3 = 13;
const int ledPin4 = 14;
const int ledPin5 = 15;
const int ledPin6 = 16;
const int ledPin7 = 17;
const int ledPin8 = 18;
// variables will change:
boolean currentState = LOW;//stroage for current button state
boolean lastState = LOW;//storage for last button state
boolean currentState2 = LOW;
boolean lastState2 = LOW;
boolean currentState3 = LOW;
boolean lastState3 = LOW;
boolean currentState4 = LOW;
boolean lastState4 = LOW;
boolean currentState5 = LOW;
boolean lastState5 = LOW;
boolean currentState6 = LOW;
boolean lastState6 = LOW;
boolean currentState7 = LOW;
boolean lastState7 = LOW;
boolean currentState8 = LOW;
boolean lastState8 = LOW;
void setup() {
Serial.begin(31250); // default midi speed rate
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin2, OUTPUT);
pinMode(buttonPin2, INPUT_PULLUP);
pinMode(ledPin3, OUTPUT);
pinMode(buttonPin3,INPUT_PULLUP);
pinMode(ledPin4, OUTPUT);
pinMode(buttonPin4, INPUT_PULLUP);
pinMode(ledPin5, OUTPUT);
pinMode(buttonPin5, INPUT_PULLUP);
pinMode(ledPin6, OUTPUT);
pinMode(buttonPin6, INPUT_PULLUP);
pinMode(ledPin7, OUTPUT);
pinMode(buttonPin7,INPUT_PULLUP);
pinMode(ledPin8, OUTPUT);
pinMode(buttonPin8, INPUT_PULLUP);
MIDI.begin();
}
static int iAn0Val, iAn1Val, iAn2Val, iAn3Val, iAn4Val, iAn5Val;
void loop(){
// read the state of the pushbutton value:
currentState = digitalRead(buttonPin);
// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (currentState == LOW && lastState == HIGH) {
digitalWrite(ledPin,HIGH);
MIDI.sendNoteOff(42,0,1);
// turn LED off
}
else if (currentState == HIGH && lastState == LOW) {
digitalWrite(ledPin, LOW);
MIDI.sendNoteOn(42,127,1);
// turn LED on
delay(20);
MIDI.sendNoteOff(42,0,1);
// turn LED off
}
lastState = currentState;
currentState2 = digitalRead(buttonPin2);
if (currentState2 == LOW && lastState2 == HIGH) {
digitalWrite(ledPin2,HIGH);
MIDI.sendNoteOff(39,0,1);
}
else if (currentState2 == HIGH && lastState2 == LOW) {
digitalWrite(ledPin2, LOW);
MIDI.sendNoteOn(39,127,1);
delay(20);
MIDI.sendNoteOff(39,0,1);
}
lastState2 = currentState2;
currentState3 = digitalRead(buttonPin3);
if (currentState3 == LOW && lastState3 == HIGH) {
digitalWrite(ledPin3,HIGH);
MIDI.sendNoteOff(40,0,1);
}
else if (currentState3 == HIGH && lastState3 == LOW) {
digitalWrite(ledPin3, LOW);
MIDI.sendNoteOn(40,127,1);
delay(20);
MIDI.sendNoteOff(40,0,1);
}
lastState3 = currentState3;
currentState4 = digitalRead(buttonPin4);
if (currentState4 == LOW && lastState4 == HIGH) {
digitalWrite(ledPin4,HIGH);
MIDI.sendNoteOff(41,0,1);
}
else if (currentState4 == HIGH && lastState4 == LOW) {
digitalWrite(ledPin4, LOW);
MIDI.sendNoteOn(41,127,1);
delay(20);
MIDI.sendNoteOff(41,0,1);
}
lastState4 = currentState4;
currentState5 = digitalRead(buttonPin5);
if (currentState5 == LOW && lastState5 == HIGH) {
digitalWrite(ledPin5,HIGH);
MIDI.sendNoteOff(38,0,1);
}
else if (currentState5 == HIGH && lastState5 == LOW) {
digitalWrite(ledPin5, LOW);
MIDI.sendNoteOn(38,127,1);
delay(20);
MIDI.sendNoteOff(38,0,1);
}
lastState5 = currentState5;
currentState6 = digitalRead(buttonPin6);
if (currentState6 == LOW && lastState6 == HIGH) {
digitalWrite(ledPin6,HIGH);
MIDI.sendNoteOff(43,0,1);
}
else if (currentState6 == HIGH && lastState6 == LOW) {
digitalWrite(ledPin6, LOW);
MIDI.sendNoteOn(43,127,1);
delay(20);
MIDI.sendNoteOff(43,0,1);
}
lastState6 = currentState6;
currentState7 = digitalRead(buttonPin7);
if (currentState7 == LOW && lastState7 == HIGH) {
digitalWrite(ledPin7,HIGH);
MIDI.sendNoteOff(37,0,1);
}
else if (currentState7 == HIGH && lastState7 == LOW) {
digitalWrite(ledPin7, LOW);
MIDI.sendNoteOn(37,127,1);
delay(20);
MIDI.sendNoteOff(37,0,1);
}
lastState7 = currentState7;
currentState8 = digitalRead(buttonPin8);
if (currentState8 == LOW && lastState8 == HIGH) {
digitalWrite(ledPin8,HIGH);
MIDI.sendNoteOff(44,0,1);
}
else if (currentState8 == HIGH && lastState8 == LOW) {
digitalWrite(ledPin8, LOW);
MIDI.sendNoteOn(44,127,1);
delay(20);
MIDI.sendNoteOff(44,0,1);
}
lastState8 = currentState8;
static int iAn0ValPrev;
iAn0ValPrev = iAn0Val; // previous value
iAn0Val = analogRead(A0)/8; // Divide by 8 to get range of 0-127 for midi
analogPinMidiTX(1,iAn0Val,iAn0ValPrev); //TX value
static int iAn1ValPrev;
iAn1ValPrev = iAn1Val;
iAn1Val = analogRead(A1)/8;
analogPinMidiTX(2,iAn1Val,iAn1ValPrev);
static int iAn2ValPrev;
iAn2ValPrev = iAn2Val;
iAn2Val = analogRead(A2)/8;
analogPinMidiTX(3,iAn2Val,iAn2ValPrev);
static int iAn3ValPrev;
iAn3ValPrev = iAn3Val;
iAn3Val = analogRead(A3)/8;
analogPinMidiTX(4,iAn3Val,iAn3ValPrev);
static int iAn4ValPrev;
iAn4ValPrev = iAn4Val;
iAn4Val = analogRead(A4)/8;
analogPinMidiTX(5,iAn4Val,iAn4ValPrev);
static int iAn5ValPrev;
iAn5ValPrev = iAn5Val;
iAn5Val = analogRead(A5)/8;
analogPinMidiTX(6,iAn5Val,iAn5ValPrev);
}
void analogPinMidiTX(int iChan, int iVal, int iValPrev)
{
// TX Value only if it has changed
if(iValPrev != iVal)
{
MidiTX(176,iChan,iVal); // 176 = CC command, 1 = Which Control, val = value read from Potentionmeter
}
}
void MidiTX(unsigned char MESSAGE, unsigned char CONTROL, unsigned char VALUE) //Valeur en Midi Command
{
Serial.write(MESSAGE);
Serial.write(CONTROL);
Serial.write(VALUE);
}
La bibliothèque Midi.h
Spoiler - Cliquer ici pour lire la suite
#include <MIDI.h>
/*
Basic I/O MIDI tutorial
by Franky
28/07/2009
*/
#define LED 13 // LED pin on Arduino board
void setup() {
pinMode(LED, OUTPUT);
MIDI.begin(4); // Launch MIDI with default options
// input channel is set to 4
}
void loop() {
if (MIDI.read()) {
digitalWrite(LED,HIGH); // Blink the LED
MIDI.sendNoteOn(42,127,1); // Send a Note (pitch 42, velo 127 on channel 1)
delay(1000); // Wait for a second
MIDI.sendNoteOff(42,0,1); // Stop the note
digitalWrite(LED,LOW);
}
}
/*
Basic I/O MIDI tutorial
by Franky
28/07/2009
*/
#define LED 13 // LED pin on Arduino board
void setup() {
pinMode(LED, OUTPUT);
MIDI.begin(4); // Launch MIDI with default options
// input channel is set to 4
}
void loop() {
if (MIDI.read()) {
digitalWrite(LED,HIGH); // Blink the LED
MIDI.sendNoteOn(42,127,1); // Send a Note (pitch 42, velo 127 on channel 1)
delay(1000); // Wait for a second
MIDI.sendNoteOff(42,0,1); // Stop the note
digitalWrite(LED,LOW);
}
}
Spoiler - Cliquer ici pour lire la suite
#include <MIDI.h>
// This function will be automatically called when a NoteOn is received.
// It must be a void-returning function with the correct parameters,
// see documentation here:
// http://arduinomidilib.sourceforge.net/class_m_i_d_i___class.html
void HandleNoteOn(byte channel, byte pitch, byte velocity) {
// Do whatever you want when you receive a Note On.
if (velocity == 0) {
// This acts like a NoteOff.
}
// This function will be automatically called when a NoteOn is received.
// It must be a void-returning function with the correct parameters,
// see documentation here:
// http://arduinomidilib.sourceforge.net/class_m_i_d_i___class.html
void HandleNoteOn(byte channel, byte pitch, byte velocity) {
// Do whatever you want when you receive a Note On.
if (velocity == 0) {
// This acts like a NoteOff.
}
Spoiler - Cliquer ici pour lire la suite
#include <MIDI.h>
/*
MIDI Input tutorial
by Franky
28/07/2009
NOTE: for easier MIDI input reading,
take a look a the Callbacks example.
*/
#define LED 13 // LED pin on Arduino board
void BlinkLed(byte num) { // Basic blink function
for (byte i=0;i<num;i++) {
digitalWrite(LED,HIGH);
delay(50);
digitalWrite(LED,LOW);
delay(50);
}
}
void setup() {
pinMode(LED, OUTPUT);
MIDI.begin(); // Launch MIDI with default options
// (input channel is default set to 1)
}
void loop() {
if (MIDI.read()) { // Is there a MIDI message incoming ?
switch(MIDI.getType()) { // Get the type of the message we caught
case ProgramChange: // If it is a Program Change
BlinkLed(MIDI.getData1()); // Blink the LED a number of times
// correponding to the program number
// (0 to 127, it can last a while..)
break;
// See the online reference for other message types
default:
break;
}
}
}
/*
MIDI Input tutorial
by Franky
28/07/2009
NOTE: for easier MIDI input reading,
take a look a the Callbacks example.
*/
#define LED 13 // LED pin on Arduino board
void BlinkLed(byte num) { // Basic blink function
for (byte i=0;i<num;i++) {
digitalWrite(LED,HIGH);
delay(50);
digitalWrite(LED,LOW);
delay(50);
}
}
void setup() {
pinMode(LED, OUTPUT);
MIDI.begin(); // Launch MIDI with default options
// (input channel is default set to 1)
}
void loop() {
if (MIDI.read()) { // Is there a MIDI message incoming ?
switch(MIDI.getType()) { // Get the type of the message we caught
case ProgramChange: // If it is a Program Change
BlinkLed(MIDI.getData1()); // Blink the LED a number of times
// correponding to the program number
// (0 to 127, it can last a while..)
break;
// See the online reference for other message types
default:
break;
}
}
}
static volatile
1793
AFicionado·a
Membre depuis 7 ans
31 Posté le 02/02/2019 à 13:58:29
Citation de King :
Citation de aaB :Ah, mais tout ce que j'ai dit c'est que dans l'extrait suivant (post 9):
pot_0 = analogRead (A0); // lecture de l'entrée analogique en 10bits
if ( abs( pot_0 - old_pot_0) > 3) { // si la valeur absolue de la différence est supérieure à 3
old_pot_0 = pot_0;
pot_0 = pot_0 >> 3; // la valeur est encodée en 7 bits ( >> 3 équivaut à une division par 2^3 = 8 )
midiOut.sendControlChange( cc0 , pot_0, midi_Ch );
}
La comparaison ne sert a rien, vu que le seuil avant division est plus faible que la résolution après division, et ne garantit pas qu'on ne va pas envoyer deux fois de suite un CC identique.
Bah oui et non. Oui il peut envoyer deux fois la même valeur quand le potentiomètre est en mouvement mais pas au repos.
Suis les embranchements du code:
- si le delta avant division est strictement supérieur a 3, alors on divise par 8 et on génère un CC
- donc, si le delta fait partie de la liste [0, 1, 2, 3], la condition est fausse et lorsque le delta appartient a la liste [4, 5, 6, 7], la condition est vraie
- la perte de précision due a la division est de 3 LSB, cela correspond a la liste [0, 1, 2, 3, 4, 5, 6, 7]
- cela correspond aussi a la précision worst case de l'ADC qui est de 2 ou 3 LSB
- dans le cas ou le delta appartient a [4, 5, 6, 7] un CC sera généré mais la valeur après division elle-même ne changera pas
- le code ne garantit donc pas l'impossibilité d'envoyer deux fois de suite le même CC lorsque le potentiomètre bouge (même si peu probable) et pourrait inonder le bus si le bruit est supérieur a 2 LSB (ce qui est possible si la precision de l'ADC est de 3 LSB).
Je te l'accorde, le cas est peu probable et je suis certain qu'en pratique, cela a résolu ton problème.
Resistance is not futile... it's voltage divided by current
[ Dernière édition du message le 02/02/2019 à 14:00:34 ]
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
32 Posté le 04/02/2019 à 12:08:36
Citation :
Hormi l'aspect "bruit" sur tes entrées qui est une chose à considérer, il y a d'autres problèmes dans le code.
Citation :
d'abord on s'assure de la validité des données entrantes (traitement contre le bruit)
Les valeurs varient très rapidement de +1 -1 voir pas du tout sur certaine entrées
Les valeurs restent stables lorsque j’arrête de toucher les potentiomètres
Je test avec un autre code et 3 potentiomètres qui utilise la division par 8
https://www.instructables.com/id/Easy-3-Pot-Potentiometer-Arduino-Uno-Effects-Midi-/
int val = 0; //Our initial pot values. We need one for the first value and a second to test if there has been a change made. This needs to be done for all 3 pots.
int lastVal = 0;
int val2 = 0;
int lastVal2 = 0;
int val3 = 0;
int lastVal3 = 0;
void setup()
{
Serial.begin(9600); // Set the speed of the midi port to the same as we will be using in the Hairless Midi software
}
void loop()
{
val = analogRead(0)/8; // Divide by 8 to get range of 0-127 for midi
if (val != lastVal) // If the value does not = the last value the following command is made. This is because the pot has been turned. Otherwise the pot remains the same and no midi message is output.
{
MIDImessage(176,1,val);} // 176 = CC command (channel 1 control change), 1 = Which Control, val = value read from Potentionmeter 1 NOTE THIS SAYS VAL not VA1 (lowercase of course)
lastVal = val;
val2 = analogRead(1)/8; // Divide by 8 to get range of 0-127 for midi
if (val2 != lastVal2)
{
MIDImessage(176,2,val2);} // 176 = CC command, 2 = Which Control, val = value read from Potentionmeter 2
lastVal2 = val2;
val3 = analogRead(2)/8; // Divide by 8 to get range of 0-127 for midi
if (val3 != lastVal3)
{
MIDImessage(176,3,val3);} // 176 = CC command, 3 = Which Control, val = value read from Potentionmeter 3
lastVal3 = val3;
delay(10); //here we add a short delay to help prevent slight fluctuations, knocks on the pots etc. Adding this helped to prevent my pots from jumpin up or down a value when slightly touched or knocked.
}
void MIDImessage(byte command, byte data1, byte data2) //pass values out through standard Midi Command
{
Serial.write(command);
Serial.write(data1);
Serial.write(data2);
}
On voit bien que des qu'il y a la moindre variation de valeur qui est détecté au niveau d'une des entrées analogique une donnée (TX) est envoyé
Si je tourne un potentiomètre et qu'il s’arrête sur un valeur qui varie une donnée est envoyé
D’où des variations de valeurs sur un potentiomètre qui a été précédemment assigné à une fonction midi
static volatile
1793
AFicionado·a
Membre depuis 7 ans
33 Posté le 04/02/2019 à 14:11:07
Tu as mesuré la variation de tension entre le commun de l'ADC et le curseur des potentiomètres, au min, au max, et quelques points le long de la course?
Comment est configuré l'ADC?
Tu utilises toujours le même schéma que publié au post 1?
Comment est configuré l'ADC?
Tu utilises toujours le même schéma que publié au post 1?
Resistance is not futile... it's voltage divided by current
[ Dernière édition du message le 04/02/2019 à 14:12:02 ]
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
34 Posté le 04/02/2019 à 14:27:10
J'ai modifié le code avec la methode de King C
(Après m’être plongé dedans )
Les valeurs qui sont prises en comptes sur les entres analogiques sont celles admis dans les tolérances annoncées
L'affectation des potentiomètres en midi dans le DAW ce fait sans problèmes
la course de chaque potentiomètre est propre et identique
Plus aucun saut de valeur aléatoire lorsqu'un potentiomètre en affecté à un paramètre Midi
Mes tests ce font pour le moment avec LoopMidi et Hairless Midi
(Après m’être plongé dedans )
Les valeurs qui sont prises en comptes sur les entres analogiques sont celles admis dans les tolérances annoncées
L'affectation des potentiomètres en midi dans le DAW ce fait sans problèmes
la course de chaque potentiomètre est propre et identique
Plus aucun saut de valeur aléatoire lorsqu'un potentiomètre en affecté à un paramètre Midi
Mes tests ce font pour le moment avec LoopMidi et Hairless Midi
int val = 0; //Our initial pot values. We need one for the first value and a second to test if there has been a change made. This needs to be done for all 3 pots.
int lastVal = 0;
int val2 = 0;
int lastVal2 = 0;
int val3 = 0;
int lastVal3 = 0;
int val4 = 0;
int lastVal4 = 0;
int val5 = 0;
int lastVal5 = 0;
int val6 = 0;
int lastVal6 = 0;
void setup()
{
Serial.begin(9600); // Set the speed of the midi port to the same as we will be using in the Hairless Midi software
}
void loop()
{
//Pot 01
val = analogRead(0); //
if (abs (val - lastVal) > 3 ) // If the value does not = the last value the following command is made. This is because the pot has been turned. Otherwise the pot remains the same and no midi message is output.
{
lastVal = val;
val = val >> 3 ;
MIDImessage(176,1,val);
} // 176 = CC command (channel 1 control change), 1 = Which Control, val = value read from Potentionmeter 1 NOTE THIS SAYS VAL not VA1 (lowercase of course)
//Pot 02
val2 = analogRead(1); //
if (abs (val2 - lastVal2) > 3 ) // If the value does not = the last value the following command is made. This is because the pot has been turned. Otherwise the pot remains the same and no midi message is output.
{
lastVal2 = val2;
val2 = val2 >> 3 ;
MIDImessage(176,2,val2);
}
//Pot 03
val3 = analogRead(2); //
if (abs (val3 - lastVal3) > 3 ) // If the value does not = the last value the following command is made. This is because the pot has been turned. Otherwise the pot remains the same and no midi message is output.
{
lastVal3 = val3 ;
val3 = val3 >> 3 ;
MIDImessage(176,3,val3);
}
//Pot 04
val4 = analogRead(3); //
if (abs (val4 - lastVal4) > 3 ) // If the value does not = the last value the following command is made. This is because the pot has been turned. Otherwise the pot remains the same and no midi message is output.
{
lastVal4 = val4;
val4 = val4 >> 3 ;
MIDImessage(176,4,val4);
} // 176 = CC command (channel 1 control change), 1 = Which Control, val = value read from Potentionmeter 1 NOTE THIS SAYS VAL not VA1 (lowercase of course)
//Pot 05
val5 = analogRead(4); //
if (abs (val5 - lastVal5) > 3 ) // If the value does not = the last value the following command is made. This is because the pot has been turned. Otherwise the pot remains the same and no midi message is output.
{
lastVal5 = val5;
val5 = val5 >> 3 ;
MIDImessage(176,5,val5);
}
//Pot 06
val6 = analogRead(5); //
if (abs (val6 - lastVal6) > 3 ) // If the value does not = the last value the following command is made. This is because the pot has been turned. Otherwise the pot remains the same and no midi message is output.
{
lastVal6 = val6 ;
val6 = val6 >> 3 ;
MIDImessage(176,6,val6);
}
delay(10); //here we add a short delay to help prevent slight fluctuations, knocks on the pots etc. Adding this helped to prevent my pots from jumpin up or down a value when slightly touched or knocked.
}
void MIDImessage(byte command, byte data1, byte data2) //pass values out through standard Midi Command
{
Serial.write(command);
Serial.write(data1);
Serial.write(data2);
}
[ Dernière édition du message le 06/02/2019 à 16:44:22 ]
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
35 Posté le 19/02/2019 à 22:14:15
J'ai modifié le programme du projet d'origine avec la Méthode de Seuil de King C
Rappelons également que mon interface doit fonctionner en usb et etre Plug & Play
https://dartmobo.com/midi-over-usb/
https://www.hackster.io/etiennedesportes/ableton-live-midi-controller-9182b3
Le programme inclus les 8 Boutons allumés en permanence et servant de commande Midi on/off
J'ai maintenant un autre problème
Dans mon Daw l'affectation deS 6 Potentiomètres se fait sans aucun probleme
Cependant je n'ai que le potentiomètres de la dernière sortie analogique A5 qui fonctionne correctement
sa course est la même que celle testé avec le précédent programme de test et sa valeur varie bien du min jusqu'au maxi (j'ai changer de potentiomètre et c'est toujours sur la sortie A5 que ca fonctionne correctement)
Pour les autres la course n'est pas bonne elle est très rapide
le variation s'effectue d'un seul coup lorsque le potentiomètre et presque à la moitié et je ne pars jamais de 0 lorsque je suis a minimum.
J'ai donc supprimer les boutons dans le programme et refait le test
la les 6 Potentiometres Fonctionnent correctement (affectation et course)
serait il possible que les paramètres Midi (CC et channel) des boutons présents dans le programme interfèrent sur le fonctionnement des Potentiomètres?
Ou bien la partie programme des boutons est aussi incorrectes ?
Rappelons également que mon interface doit fonctionner en usb et etre Plug & Play
https://dartmobo.com/midi-over-usb/
https://www.hackster.io/etiennedesportes/ableton-live-midi-controller-9182b3
#include <MIDI.h> // INlcude MIDI library
MIDI_CREATE_DEFAULT_INSTANCE();
#include <midi_Defs.h>
#include <midi_Message.h>
#include <midi_Namespace.h>
#include <midi_Settings.h>
const int buttonPin = 2; // the number of the Button pin
const int buttonPin2 = 3;
const int buttonPin3 = 4;
const int buttonPin4 = 5;
const int buttonPin5 = 6;
const int buttonPin6 = 7;
const int buttonPin7 = 8;
const int buttonPin8 = 9;
// the number of the pushbutton pin
const int ledPin = 11; // the number of the LED pin
const int ledPin2 = 12;
const int ledPin3 = 13;
const int ledPin4 = 14;
const int ledPin5 = 15;
const int ledPin6 = 16;
const int ledPin7 = 17;
const int ledPin8 = 18;
// variables will change:
boolean currentState = LOW;//stroage for current button state
boolean lastState = LOW;//storage for last button state
boolean currentState2 = LOW;
boolean lastState2 = LOW;
boolean currentState3 = LOW;
boolean lastState3 = LOW;
boolean currentState4 = LOW;
boolean lastState4 = LOW;
boolean currentState5 = LOW;
boolean lastState5 = LOW;
boolean currentState6 = LOW;
boolean lastState6 = LOW;
boolean currentState7 = LOW;
boolean lastState7 = LOW;
boolean currentState8 = LOW;
boolean lastState8 = LOW;
void setup() {
Serial.begin(9600); // default midi speed rate
/pinMode(ledPin, OUTPUT); // initialize the LED pin as an output:
pinMode(buttonPin, INPUT_PULLUP); // initialize the pushbutton pin as an input:
pinMode(ledPin2, OUTPUT);
pinMode(buttonPin2, INPUT_PULLUP);
pinMode(ledPin3, OUTPUT);
pinMode(buttonPin3,INPUT_PULLUP);
pinMode(ledPin4, OUTPUT);
pinMode(buttonPin4, INPUT_PULLUP);
pinMode(ledPin5, OUTPUT);
pinMode(buttonPin5, INPUT_PULLUP);
pinMode(ledPin6, OUTPUT);
pinMode(buttonPin6, INPUT_PULLUP);
pinMode(ledPin7, OUTPUT);
pinMode(buttonPin7,INPUT_PULLUP);
pinMode(ledPin8, OUTPUT);
pinMode(buttonPin8, INPUT_PULLUP);
MIDI.begin();
}
static int iAn0Val, iAn1Val, iAn2Val, iAn3Val, iAn4Val, iAn5Val;
void loop()
{
read the state of the pushbutton value:
currentState = digitalRead(buttonPin);
// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (currentState == LOW && lastState == HIGH)
{
digitalWrite(ledPin,HIGH);
MIDI.sendNoteOff(42,0,1);// turn LED off
}
else if (currentState == HIGH && lastState == LOW) {
digitalWrite(ledPin, LOW);
MIDI.sendNoteOn(42,127,1);// turn LED on
delay(20);
MIDI.sendNoteOff(42,0,1); // turn LED off
}
lastState = currentState;
currentState2 = digitalRead(buttonPin2);
if (currentState2 == LOW && lastState2 == HIGH)
{
digitalWrite(ledPin2,HIGH);
MIDI.sendNoteOff(39,0,1);
}
else if (currentState2 == HIGH && lastState2 == LOW)
{
digitalWrite(ledPin2, LOW);
MIDI.sendNoteOn(39,127,1);
delay(20);
MIDI.sendNoteOff(39,0,1);
}
lastState2 = currentState2;
currentState3 = digitalRead(buttonPin3);
if (currentState3 == LOW && lastState3 == HIGH)
{
digitalWrite(ledPin3,HIGH);
MIDI.sendNoteOff(40,0,1);
}
else if (currentState3 == HIGH && lastState3 == LOW)
{
digitalWrite(ledPin3, LOW);
MIDI.sendNoteOn(40,127,1);
delay(20);
MIDI.sendNoteOff(40,0,1);
}
lastState3 = currentState3;
currentState4 = digitalRead(buttonPin4);
if (currentState4 == LOW && lastState4 == HIGH)
{
digitalWrite(ledPin4,HIGH);
MIDI.sendNoteOff(41,0,1);
}
else if (currentState4 == HIGH && lastState4 == LOW)
{
digitalWrite(ledPin4, LOW);
MIDI.sendNoteOn(41,127,1);
delay(20);
MIDI.sendNoteOff(41,0,1);
}
lastState4 = currentState4;
currentState5 = digitalRead(buttonPin5);
if (currentState5 == LOW && lastState5 == HIGH)
{
digitalWrite(ledPin5,HIGH);
MIDI.sendNoteOff(38,0,1);
}
else if (currentState5 == HIGH && lastState5 == LOW)
{
digitalWrite(ledPin5, LOW);
MIDI.sendNoteOn(38,127,1);
delay(20);
MIDI.sendNoteOff(38,0,1);
}
lastState5 = currentState5;
currentState6 = digitalRead(buttonPin6);
if (currentState6 == LOW && lastState6 == HIGH)
{
digitalWrite(ledPin6,HIGH);
MIDI.sendNoteOff(43,0,1);
}
else if (currentState6 == HIGH && lastState6 == LOW)
{
digitalWrite(ledPin6, LOW);
MIDI.sendNoteOn(43,127,1);
delay(20);
MIDI.sendNoteOff(43,0,1);
}
lastState6 = currentState6;
currentState7 = digitalRead(buttonPin7);
if (currentState7 == LOW && lastState7 == HIGH)
{
digitalWrite(ledPin7,HIGH);
MIDI.sendNoteOff(37,0,1);
}
else if (currentState7 == HIGH && lastState7 == LOW)
{
digitalWrite(ledPin7, LOW);
MIDI.sendNoteOn(37,127,1);
delay(20);
MIDI.sendNoteOff(37,0,1);
}
lastState7 = currentState7;
currentState8 = digitalRead(buttonPin8);
if (currentState8 == LOW && lastState8 == HIGH)
{
digitalWrite(ledPin8,HIGH);
MIDI.sendNoteOff(44,0,1);
}
else if (currentState8 == HIGH && lastState8 == LOW)
{
digitalWrite(ledPin8, LOW);
MIDI.sendNoteOn(44,127,1);
delay(20);
MIDI.sendNoteOff(44,0,1);
}
lastState8 = currentState8;
*/
//Pot 01
static int iAn0ValPrev;
iAn0ValPrev = 0 ;
iAn0ValPrev = iAn0Val ; // previous value
iAn0Val = analogRead(A0); // Divide by 8 to get range of 0-127 for midi
if (abs (iAn0Val - iAn0ValPrev)>3)
analogPinMidiTX(1,iAn0Val,iAn0ValPrev); //TX value
delay(10);
//Pot 02
static int iAn1ValPrev;
iAn1ValPrev = 0 ;
iAn1ValPrev = iAn1Val;
iAn1Val = analogRead(A1);
if (abs (iAn1Val - iAn1ValPrev)>3)
analogPinMidiTX(2,iAn1Val,iAn1ValPrev);
delay(10);
//Pot 03
static int iAn2ValPrev;
iAn2ValPrev = 0 ;
iAn2ValPrev = iAn2Val;
iAn2Val = analogRead(A2);
if (abs (iAn2Val - iAn2ValPrev)>3)
analogPinMidiTX(3,iAn2Val,iAn2ValPrev);
delay(10);
//Pot 04
static int iAn3ValPrev;
iAn3ValPrev = 0;
iAn3ValPrev = iAn3Val;
iAn3Val = analogRead(A3);
if (abs (iAn3Val - iAn3ValPrev)>3)
analogPinMidiTX(4,iAn3Val,iAn3ValPrev);
delay(10);
//Pot 05
static int iAn4ValPrev;
iAn4ValPrev = 0;
iAn4ValPrev = iAn4Val;
iAn4Val = analogRead(A4);
if (abs (iAn4Val - iAn4ValPrev)>3)
analogPinMidiTX(5,iAn4Val,iAn4ValPrev);
delay(10);
//Pot 06
static int iAn5ValPrev;
iAn5ValPrev = 0;
iAn5ValPrev = iAn5Val;
iAn5Val = analogRead(A5);
if (abs (iAn5Val - iAn5ValPrev)>3)
analogPinMidiTX(6,iAn5Val,iAn5ValPrev);
delay(10); //here we add a short delay to help prevent slight fluctuations, knocks on the pots etc. Adding this helped to prevent my pots from jumpin up or down a value when slightly touched or knocked.
}
void analogPinMidiTX(int iChan, int iVal, int iValPrev)
{
// TX Value only if it has changed
if(iValPrev != iVal)
{
iValPrev != iVal ;
iVal = iVal >> 3 ;
MidiTX(176,iChan,iVal); // 176 = CC command, 1 = Which Control, val = value read from Potentionmeter
}
}
void MidiTX(unsigned char MESSAGE, unsigned char CONTROL, unsigned char VALUE) //Valeur en Midi Command
{
Serial.write(MESSAGE);
Serial.write(CONTROL);
Serial.write(VALUE);
}
Le programme inclus les 8 Boutons allumés en permanence et servant de commande Midi on/off
J'ai maintenant un autre problème
Dans mon Daw l'affectation deS 6 Potentiomètres se fait sans aucun probleme
Cependant je n'ai que le potentiomètres de la dernière sortie analogique A5 qui fonctionne correctement
sa course est la même que celle testé avec le précédent programme de test et sa valeur varie bien du min jusqu'au maxi (j'ai changer de potentiomètre et c'est toujours sur la sortie A5 que ca fonctionne correctement)
Pour les autres la course n'est pas bonne elle est très rapide
le variation s'effectue d'un seul coup lorsque le potentiomètre et presque à la moitié et je ne pars jamais de 0 lorsque je suis a minimum.
J'ai donc supprimer les boutons dans le programme et refait le test
la les 6 Potentiometres Fonctionnent correctement (affectation et course)
serait il possible que les paramètres Midi (CC et channel) des boutons présents dans le programme interfèrent sur le fonctionnement des Potentiomètres?
Ou bien la partie programme des boutons est aussi incorrectes ?
static volatile
1793
AFicionado·a
Membre depuis 7 ans
36 Posté le 20/02/2019 à 13:52:05
C'est un copy/paste? La ligne 49 dans la fonction setup() commence par un seul '/'. La ligne est-elle censée être commentée?
Le premier truc que ton code m'inspire, c'est que tu fais beaucoup de polling avec beaucoup de busy wait ( `delay()`).
Tu pourrais par exemple utiliser les interruptions sur changement d'état des GPIO pour tes boutons.
Tu fais du debouncing en hardware avec une capa? Si non, il faudra probablement le faire en software.
Pour scanner tes potards, tu pourrais programmer un timer a une période donnée et à chaque interruption du comparateur de sortie scanner tous les potard en une traite.
Le premier truc que ton code m'inspire, c'est que tu fais beaucoup de polling avec beaucoup de busy wait ( `delay()`).
Tu pourrais par exemple utiliser les interruptions sur changement d'état des GPIO pour tes boutons.
Tu fais du debouncing en hardware avec une capa? Si non, il faudra probablement le faire en software.
Pour scanner tes potards, tu pourrais programmer un timer a une période donnée et à chaque interruption du comparateur de sortie scanner tous les potard en une traite.
Spoiler - Cliquer ici pour lire la suite
D'un point de vue plus pratique/esthétique, ce serait probablement plus lisible si tu employais des tableaux pour tes variables d'état, ça faciliterait aussi le fait d'employer des boucles pour scanner, par exemple, tous les potards d'un coup.
C'est juste un exemple, pas une obligation (loin de là!), mais c'est en général une bonne idée de factoriser ainsi lorsque tu te retrouves à répéter le même code plusieurs fois de suite.
C'est plus facile à lire, et surtout à modifier.
typedef struct pot_val_t {
int chnl;
int analog_in; /* assuming `A0` and such are `int` */
int prev; /* if filtering ADC data, `prev` and `curr` would be replaced by an array of `int` */
int curr;
} pot_val_t;
pot_val_t pots[8] = {
{.chnl = 1, .analog_in = A0},
{.chnl = 2, .analog_in = A1},
{.chnl = 3, .analog_in = A2},
{.chnl = 4, .analog_in = A3},
{.chnl = 5, .analog_in = A4},
{.chnl = 6, .analog_in = A5},
{.chnl = 7, .analog_in = A6},
{.chnl = 8, .analog_in = A7},
};
/* example `for ()` loop for pot scanning */
void scan_pots(pot_val_t *pots)
{
pot_val_t *p;
int i;
for (i = 0; i < 8; i++) {
p = &(pots[i]);
p->prev = p->curr;
p->curr = analogRead(p->analog_in);
}
}
/* example `for ()` loop for pot data */
void send_pot_data(pot_val_t *pots)
{
pot_val_t *p;
int i;
for (i = 0; i < 8; i++) {
p = &(pots[i]);
if (abs(p->curr - p->prev) > 3) {
analogPinMidiTx(p->chnl, p->curr, p->prev);
}
}
}
/*
* one would call `scan_pots(pots);` in a TIMER interrupt handler and raise a flag.
* in `main()`, one would poll the flag, if raised call `send_pot_data(pots);` and clear the flag
*/
C'est juste un exemple, pas une obligation (loin de là!), mais c'est en général une bonne idée de factoriser ainsi lorsque tu te retrouves à répéter le même code plusieurs fois de suite.
C'est plus facile à lire, et surtout à modifier.
Resistance is not futile... it's voltage divided by current
[ Dernière édition du message le 20/02/2019 à 14:50:49 ]
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
37 Posté le 20/02/2019 à 15:47:16
Merci pour ton conseil aab il faudra que je me penche sur ta methode
Oui le / est effectivement une ligne de commentaire ou pour une non prise en compte de ligne de code
J'ai effectué un test en supprimant les bontons 1 par 1 du code
Les potentiometres commencent a mal fonctionner a partir de l'ajout de 4ieme bouton dans le code
Le potentiometre 1 fonctionne mal
Avec les 3 premiers boutons dans le code les 6 potentiometres sont ok
Oui le / est effectivement une ligne de commentaire ou pour une non prise en compte de ligne de code
J'ai effectué un test en supprimant les bontons 1 par 1 du code
Les potentiometres commencent a mal fonctionner a partir de l'ajout de 4ieme bouton dans le code
Le potentiometre 1 fonctionne mal
Avec les 3 premiers boutons dans le code les 6 potentiometres sont ok
static volatile
1793
AFicionado·a
Membre depuis 7 ans
38 Posté le 20/02/2019 à 15:54:04
Citation de Mat :
Oui le / est effectivement une ligne de commentaire ou pour une non prise en compte de ligne de code
Dans ce cas, il te manque un '/', je ne vois pas comment ça compilerait en l'état (c'est pour ça que je préfère le "/* comment */).
Resistance is not futile... it's voltage divided by current
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
39 Posté le 27/02/2019 à 22:41:51
J'ai trouver un autre programme pour les boutons et je l'ai adapté et inséré dans mon programme
Tout fonctionne parfaitement
les 8 boutons ainsi que les 6 Potentiomètres s'assignent très bien dans le daw comme une interface Midi Usb Plug & Play
La course des potentiomètres est vraiment très agréable une fois les boutons rotatifs mis en place
Les boutons fonctionnent également comme Note Midi
Je pense qu'on peut egalement modifier les programmes pour les potentiometres pour le rendre plus "light"
Dans tous les cas merci aux membres actifs de ce thread qui m'ont donné un gros coup de pouce.
Tout fonctionne parfaitement
les 8 boutons ainsi que les 6 Potentiomètres s'assignent très bien dans le daw comme une interface Midi Usb Plug & Play
La course des potentiomètres est vraiment très agréable une fois les boutons rotatifs mis en place
Les boutons fonctionnent également comme Note Midi
Je pense qu'on peut egalement modifier les programmes pour les potentiometres pour le rendre plus "light"
Dans tous les cas merci aux membres actifs de ce thread qui m'ont donné un gros coup de pouce.
#include <MIDI.h> // INlcude MIDI library
int mem[] = { 0, 0, 0, 0, 0, 0, 0 ,0};
void setup()
{
Serial.begin(9600); // default midi speed rate
// initialize the LED pin as an output:
pinMode(2, INPUT_PULLUP); // initialize the pushbutton pin as an input:
pinMode(3, INPUT_PULLUP);
pinMode(4,INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
pinMode(6,INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
pinMode(9, INPUT_PULLUP);
MIDI.begin();
}
static int iAn0Val, iAn1Val, iAn2Val, iAn3Val, iAn4Val, iAn5Val;
void loop()
{
{
int sensorVal[] =
{
!digitalRead(2), !digitalRead(3),
!digitalRead(4), !digitalRead(5),
!digitalRead(6), !digitalRead(7),
!digitalRead(8), !digitalRead(9),
};
for (int j = 0; j < 8; j++)
{
if (sensorVal [j] != mem [j])
{
mem [j] = sensorVal [j];
if (mem[j])
{
MIDI.sendNoteOn(j + 48, 64, 1);
}
else
{
MIDI.sendNoteOff(j + 48, 64, 1);
}
}
}
}
//Pot 01
static int iAn0ValPrev;
iAn0ValPrev = 0 ;
iAn0ValPrev = iAn0Val ; // previous value
iAn0Val = analogRead(A0); // Divide by 8 to get range of 0-127 for midi
if (abs (iAn0Val - iAn0ValPrev)>3)
analogPinMidiTX(1,iAn0Val,iAn0ValPrev); //TX value
delay(10);
//Pot 02
static int iAn1ValPrev;
iAn1ValPrev = 0 ;
iAn1ValPrev = iAn1Val;
iAn1Val = analogRead(A1);
if (abs (iAn1Val - iAn1ValPrev)>3)
analogPinMidiTX(2,iAn1Val,iAn1ValPrev);
delay(10);
//Pot 03
static int iAn2ValPrev;
iAn2ValPrev = 0 ;
iAn2ValPrev = iAn2Val;
iAn2Val = analogRead(A2);
if (abs (iAn2Val - iAn2ValPrev)>3)
analogPinMidiTX(3,iAn2Val,iAn2ValPrev);
delay(10);
//Pot 04
static int iAn3ValPrev;
iAn3ValPrev = 0;
iAn3ValPrev = iAn3Val;
iAn3Val = analogRead(A3);
if (abs (iAn3Val - iAn3ValPrev)>3)
analogPinMidiTX(4,iAn3Val,iAn3ValPrev);
delay(10);
//Pot 05
static int iAn4ValPrev;
iAn4ValPrev = 0 ;
iAn4ValPrev = iAn4Val;
iAn4Val = analogRead(A4);
if (abs (iAn4Val - iAn4ValPrev)>3)
analogPinMidiTX(5,iAn4Val,iAn4ValPrev);
delay(10);
//Pot 06
static int iAn5ValPrev;
iAn5ValPrev = 0;
iAn5ValPrev = iAn5Val;
iAn5Val = analogRead(A5);
if (abs (iAn5Val - iAn5ValPrev)>3)
analogPinMidiTX(6,iAn5Val,iAn5ValPrev);
delay(10); //here we add a short delay to help prevent slight fluctuations, knocks on the pots etc. Adding this helped to prevent my pots from jumpin up or down a value when slightly touched or knocked.
}
void analogPinMidiTX(int iChan, int iVal, int iValPrev)
{
// TX Value only if it has changed
if(iValPrev != iVal)
{
iValPrev != iVal ;
iVal = iVal >> 3 ;
MidiTX(176,iChan,iVal); // 176 = CC command, 1 = Which Control, val = value read from Potentionmeter
}
}
void MidiTX(unsigned char MESSAGE, unsigned char CONTROL, unsigned char VALUE) //Valeur en Midi Command
{
Serial.write(MESSAGE);
Serial.write(CONTROL);
Serial.write(VALUE);
}
[ Dernière édition du message le 28/02/2019 à 09:09:39 ]
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
40 Posté le 12/03/2019 à 10:28:52
J'ai effectuer les test avec le logiciel Bitwig
les potentiomètres et les boutons fonctionnent (interrupteur on/off)
Par contre avec le logiciel Studio One 4 les boutons ne fonctionnent pas en mode interrupteur on/off comme sur Bitwig
Ils n’apparaissent pas lorsque je paramètre l'interface midi
En paramétrant l'interface comme Clavier Midi les boutons sont reconnus uniquement comme des notes ,qui en plus restent actives.
Une idée ?
Lorsque j’appuie sur un bouton la commande note on / note off est envoyé en même temps
il faudrait modifier le programme pour que les interrupteurs fonctionnent non pas comme une note mais comme un changement d’état 0 > 127
[ Dernière édition du message le 12/03/2019 à 10:43:09 ]
- < Liste des sujets
- Charte