#Projet en cours# Bidule 2.0, un peu plus lourd

Ici on parle code, configuration matériel, bibliothèques Arduino ou comment utiliser les modules e-licktronic...

#Projet en cours# Bidule 2.0, un peu plus lourd

Postby Bat » Sep 15th, '14, 17:02

Bonjour !

J'ai modifié le code que vous m'aviez passé il y a longtemps, et je reviens vers vous pour quelques petites questions et préoccupations, après un long temps d'absence prolongé du notamment à d'autres petites créations et recherches personnelles ( allez voir du côté de la Tchéquie pour avoir quelques infos supplémentaire, sachant que c'est grâce à vous que j'ai découvert cette micro-entreprise étant donné que vous donniez dans un des tuto le lien vers MOZZI : http://www.bastl-instruments.com/ ).

Enfin bref, voila, un nouveau projet, le Bidule 2, avec le code que vous m'aviez donné et que j'ai modifié un tant soit peu afin d'avoir plus de banques de plus de boutons :
Code: Select all
//****************************************************************
// Le Bidule 2.0
// 8 banques de 16 boutons chacune en 2x8
// 24 potentiomètres
//****************************************************************

#include <SRIO.h>
#include <PotMUX.h>

//librairies constructors
//PotMUX Pot;
//SRIO SR;

// DEBUG pour afficher sur le moniteur serie les valeurs envoyer en MIDI
#define DEBUG 0
//communication mode 0=serial  1=MIDI  2=USB
#define COMMUNICATION_MODE 1
//Midi channel
#define MIDI_CHANNEL 1
//Number of connected potentiometers
#define NUMPOT 24
//deini le nombre total de bouton
#define NBR_BUTTON 24
//defini le nombre de bouton en colonne qui controlent les clip d'ableton
#define BUTTON_COL  2
//defini le nombre de bouton en ligne
#define BUTTON_ROW  8
//defini le nombre de bank
#define NBR_BANK 8

//Pin number of the toggle button
byte button_toggle_Pin[]={
};

//Array of the momentary button pin organize to match with Ableton clip configuration
//chaque ligne correspond au numero des boutons dans la meme colonne
// dans ton cas comme les dilicktal sont a 90° les colonnes de boutons sont au nombre de 6 et 4 ligne
uint8_t button_momentary[BUTTON_COL][BUTTON_ROW]={
  {
    0,1,2,3,4,5,6,7                          }
  ,
  {
    8,9,10,11,12,13,14,15                }                     
};

//Variable du dernier bouton appuyer et de l'avant dernier. array du nombre de colonne car on ne veut allumer qu'une led par colonne
byte last_button_momentary[NBR_BANK][BUTTON_COL];
byte previous_button_momentary[NBR_BANK][BUTTON_COL]={
{255,255}   
,{255,255}
,{255,255}
,{255,255}
,{255,255}
,{255,255}
,{255,255}
,{255,255}
};//on initialise avec une valeur differente de celle des boutons



// we will track if a button is just pressed, or 'currently pressed'
byte pressed[NBR_BUTTON], just_pressed[NBR_BUTTON];

// Simple count to remember the number of push of the toggle button
byte count[sizeof(button_toggle_Pin)]={
};

//potentiometers variables
uint16_t old_Pot_Value[NUMPOT];
uint16_t pot_Value[NUMPOT];

//flag's mute button to be "ON" at start
boolean flag=1;

// variable de la bank selectionné
byte selected_bank=0;
byte old_selected_bank=0;

//Bank led, stock le numero des leds de chaque colonne qui est allumé
byte bank_led[NBR_BANK][BUTTON_COL]={
{255,255}   
,{255,255}
,{255,255}
,{255,255}
,{255,255}
,{255,255}
,{255,255}
,{255,255}
};

void setup()
{
  SR.Initialize();//initialize SRIO librairy
  Pot.Initialize();//initialize PotMUX librairy
  switch (COMMUNICATION_MODE){
  case 0:
    Serial.begin(9600);
    break;
  case 1:
    Serial.begin(31250);
    break;
  case 2:
    Serial.begin(115200);
  }

  //Led animation start

  SR.Led_All_Off();
  //on allumme la led de la bank selecitonne
  SR.Led_Pin_Write(20,1);
}


void loop()
{
  check_switches();      // when we check the switches we'll get the current state

  //Selection de la banque
  if(SR.Button_Pin_Read(16)==1){
    selected_bank=4;
    Bank_Led_Off();
    SR.Led_Pin_Write(16,1);
  }
 
  else if (SR.Button_Pin_Read(17)==1){
    selected_bank=5;
    Bank_Led_Off();
    SR.Led_Pin_Write(17,1);
  }
 
  else if (SR.Button_Pin_Read(18)==1){
    selected_bank=6;
    Bank_Led_Off();
    SR.Led_Pin_Write(18,1);
  }
 
  else if (SR.Button_Pin_Read(19)==1){
    selected_bank=7;
    Bank_Led_Off();
    SR.Led_Pin_Write(19,1);
  }
 
  else if (SR.Button_Pin_Read(20)==1){
    selected_bank=0;
    Bank_Led_Off();
    SR.Led_Pin_Write(20,1);
  }
  else if (SR.Button_Pin_Read(21)==1){
    selected_bank=1;
    Bank_Led_Off();
    SR.Led_Pin_Write(21,1);
  }
  else if (SR.Button_Pin_Read(22)==1){
    selected_bank=2;
    Bank_Led_Off();
    SR.Led_Pin_Write(22,1);
  }
  else if (SR.Button_Pin_Read(23)==1){
    selected_bank=3;
    Bank_Led_Off();
    SR.Led_Pin_Write(23,1);
  }
 

  for(byte i =0;i<BUTTON_COL;i++){
    for(byte j=0;j<BUTTON_ROW;j++){
      // button_momentary_state = SR.Button_Pin_Read(button_momentary[i][j]);
      if(just_pressed[button_momentary[i][j]]){
        last_button_momentary[selected_bank][i] = button_momentary[i][j];
        if(last_button_momentary[selected_bank][i] != previous_button_momentary[selected_bank][i]){
          SR.Led_Pin_Write(last_button_momentary[selected_bank][i],1);
          //on envoi le control change correspondant a la banque selectionné Le +1 est la pour ne pas multiplier par 0 sinon toutes les valeur
          //de la bank 0 vaudrai 0
          Send_CC (last_button_momentary[selected_bank][i] * (selected_bank+1),127);
          SR.Led_Pin_Write(previous_button_momentary[selected_bank][i],0);
          previous_button_momentary[selected_bank][i]=last_button_momentary[selected_bank][i];
          //on enregistre dans la bank la led qui s'est allummé dans la colonne
          bank_led[selected_bank][i]= last_button_momentary[selected_bank][i];
        }
        else{
          Send_CC (last_button_momentary[selected_bank][i]* (selected_bank+1),127);
        }
      }
    }
  }

  //si la banque selectionne a changer alors on met a jour les leds
  if (selected_bank != old_selected_bank){
    old_selected_bank=selected_bank;
    //on eteind toutes les led avant des les mettre a jours
    SR.Led_All_Off();
    for (int i=0; i<BUTTON_COL;i++){
      SR.Led_Pin_Write(bank_led[selected_bank][i],1);
    }
  }

  for (byte i=0; i<NUMPOT; i++){
    pot_Value[i] = Pot.Read(i)>>3;//convert 10bits to 7bits
    if (abs (pot_Value[i] - old_Pot_Value[i])>1){//value pot changed?
      int data = map(pot_Value[i],3,123,0,127);// map to right midi value 0,127 due to the bad ADC and bad power stability
      data=max(data,0);
      data = constrain(data,0,127);
      Send_CC (i+64,data);
      old_Pot_Value[i] = pot_Value[i];
    }
  }
}

//-------------------------Funtions----------------------------------------

//Function that scan state of each button (code from Adafruit tutoriel)
void check_switches()
{
  static byte previousstate[NBR_BUTTON];
  static byte currentstate[NBR_BUTTON];
  //Check switch en toggle Mode
  for (byte index = 0; index < NBR_BUTTON; index++){
    just_pressed[index] = 0;       // when we start, we clear out the "just" indicators
    currentstate[index] = SR.Button_Pin_Read(index); // read the button
    if (currentstate[index] == previousstate[index]){
      if ((pressed[index] == LOW) && (currentstate[index] == HIGH)){
        just_pressed[index] = 1;
      }
      pressed[index] = currentstate[index];  // remember, digital LOW means NOT pressed
    }
    previousstate[index] = currentstate[index];   // keep a states of the buttons
  }
}

void Send_CC(byte num_CC, byte value)
{
  if (DEBUG){
    Serial.print ("CC Nbr:");// "control change" message on selected MIDI_CHANNEL
    Serial.print (num_CC,DEC);
    Serial.print(" Value:");
    Serial.println (value,DEC);
  }
  else{

    Serial.write (176+MIDI_CHANNEL-1);// "control change" message on selected MIDI_CHANNEL
    Serial.write (num_CC);
    Serial.write (value);
  }
}

//fonction qui eteind toutes les led des banques
void Bank_Led_Off(){
SR.Led_Pin_Write(20,0);
  SR.Led_Pin_Write(16,0);
  SR.Led_Pin_Write(17,0);
  SR.Led_Pin_Write(18,0);
  SR.Led_Pin_Write(19,0);
  SR.Led_Pin_Write(21,0);
  SR.Led_Pin_Write(22,0);
  SR.Led_Pin_Write(23,0);
}


Le problème c'est que ça fait plein de commande CC et que le logiciel n'y comprend plus rien (ableton pour être plus précis). Il fait n'importe quoi étant donné que les commandes se chevauchent, on a plein de fois la même pour des boutons différents. L'idée serait donc de switcher sur un canal MIDI différent lorsqu'on arrive à certaines banques, afin d'être sûr que les commandes ne s'emmêlent pas.
Est-ce possible sans modifier grandement la structure du code ou pas ?
Je vais y réfléchir de mon côté.

Le second problème est l'instabilité des potentiomètres. J'ai eu très peur car les codes que j'utilisais depuis vos tutos ne donnaient aucun résultats. Les commandes étaient tellement instables que c'était impossible d'en enregistrer une seule sur le logiciel. Sur le moniteur série, ça donnait ça http://bazarambulant.tumblr.com/image/97572991764
des lignes et des lignes et des lignes sans fin.

La librairie SRIO m'a aussi posé problème. Le logiciel ne la reconnaissait pas, quoi que je fasse. J'ai réinstallé les librairies, changé le wiring shitf.c, modifié la ligne de code dans arduino.h etc... J'ai fini par réinstaller arduino, et ça fonctionne de nouveau.

Au final, avec le code cité au dessus, j'obtiens ce que je veux, à part un ou deux potard, qui de temps en temps devient fou et se met à faire n'importe quoi (il reste inerte jusqu'à ce que je le bouge de moitié, puis passe de 0 à 127 en un dixième de tour pour ne plus bouger, comme s'il était réglé avec très peu de précision ) . Il faut que je le re-map avec le bouton MIDI d'Ableton pour que ça marche de nouveau.

Pour résumer, y a-t-il un moyen de stabiliser les potentiomètres, si oui lequel, sinon est-ce que c'est du à des composants physiques (genre câble ou platine).

Et surtout, comment faire pour changer de canal selon la banque ?

Voila, j'espère que tout va bien de votre côté, que la Yocto marche bien (avec le lancement de l'Aira il y a peu ça a du être un peu chaud) et tout et tout !

Bonne lecture, bonne soirée ou semaine !
Bat
 
Posts: 18
Joined: Oct 26th, '13, 22:44

Re: #Projet en cours# Bidule 2.0, un peu plus lourd

Postby e-licktronic » Sep 16th, '14, 21:34

Salut Bat,

Première réponse:
Je n ai pas testé le code mais cela doit être possible sans trop de difficulté pour faite correspondre une page de paramètre CC a un canal Midi. Regarde la code. Je ne l ai pas testé mais dans ce code quand tu changes de banque cela change le canal MIDI d envoi des CC.
Code: Select all
//****************************************************************
// Le Bidule 2.0
// 8 banques de 16 boutons chacune en 2x8
// 24 potentiomètres
//****************************************************************

#include <SRIO.h>
#include <PotMUX.h>

//librairies constructors
//PotMUX Pot;
//SRIO SR;

// DEBUG pour afficher sur le moniteur serie les valeurs envoyer en MIDI
#define DEBUG 0
//communication mode 0=serial  1=MIDI  2=USB
#define COMMUNICATION_MODE 1
//Midi channel
//#define MIDI_CHANNEL 1
//Number of connected potentiometers
#define NUMPOT 24
//deini le nombre total de bouton
#define NBR_BUTTON 24
//defini le nombre de bouton en colonne qui controlent les clip d'ableton
#define BUTTON_COL  2
//defini le nombre de bouton en ligne
#define BUTTON_ROW  8
//defini le nombre de bank
#define NBR_BANK 8

//Pin number of the toggle button
byte button_toggle_Pin[]={
};

//Array of the momentary button pin organize to match with Ableton clip configuration
//chaque ligne correspond au numero des boutons dans la meme colonne
// dans ton cas comme les dilicktal sont a 90° les colonnes de boutons sont au nombre de 6 et 4 ligne
uint8_t button_momentary[BUTTON_COL][BUTTON_ROW]={
  {
    0,1,2,3,4,5,6,7                              }
  ,
  {
    8,9,10,11,12,13,14,15                    }                     
};

//Variable du dernier bouton appuyer et de l'avant dernier. array du nombre de colonne car on ne veut allumer qu'une led par colonne
byte last_button_momentary[NBR_BANK][BUTTON_COL];
byte previous_button_momentary[NBR_BANK][BUTTON_COL]={
  {
    255,255    }   
  ,{
    255,255    }
  ,{
    255,255    }
  ,{
    255,255    }
  ,{
    255,255    }
  ,{
    255,255    }
  ,{
    255,255    }
  ,{
    255,255    }
};//on initialise avec une valeur differente de celle des boutons

//variable du canal midi
byte midi_channel;

// we will track if a button is just pressed, or 'currently pressed'
byte pressed[NBR_BUTTON], just_pressed[NBR_BUTTON];

// Simple count to remember the number of push of the toggle button
byte count[sizeof(button_toggle_Pin)]={
};

//potentiometers variables
uint16_t old_Pot_Value[NUMPOT];
uint16_t pot_Value[NUMPOT];

//flag's mute button to be "ON" at start
boolean flag=1;

// variable de la bank selectionné
byte selected_bank=0;
byte old_selected_bank=0;

//Bank led, stock le numero des leds de chaque colonne qui est allumé
byte bank_led[NBR_BANK][BUTTON_COL]={
  {
    255,255    }   
  ,{
    255,255    }
  ,{
    255,255    }
  ,{
    255,255    }
  ,{
    255,255    }
  ,{
    255,255    }
  ,{
    255,255    }
  ,{
    255,255    }
};

void setup()
{
  SR.Initialize();//initialize SRIO librairy
  Pot.Initialize();//initialize PotMUX librairy
  switch (COMMUNICATION_MODE){
  case 0:
    Serial.begin(9600);
    break;
  case 1:
    Serial.begin(31250);
    break;
  case 2:
    Serial.begin(115200);
  }

  midi_channel = selected_bank;
  //Led animation start
  SR.Led_All_Off();
  //on allumme la led de la bank selecitonne
  SR.Led_SR_Write(3,1<<selected_bank);
}


void loop()
{
  check_switches();      // when we check the switches we'll get the current state

  if(SR.Button_SR_Read(3)>0){ // est ce qu un bouton est appuyer sur la platine dilicktal 3
    byte data = SR.Button_SR_Read(3);// on lit les boutons
    for(byte i=0; i<8;i++){
      if(bitRead(data,i)){// on teste les bits a 1
        selected_bank= midi_channel=i;// enregistre la bank et le canal midi correspondant
        Bank_Led_Off();
        SR.Led_SR_Write(3,1<<selected_bank);// on update les led en fonction de la banque selectionne
        break;
      }
    }
  }

  for(byte i =0;i<BUTTON_COL;i++){
    for(byte j=0;j<BUTTON_ROW;j++){
      // button_momentary_state = SR.Button_Pin_Read(button_momentary[i][j]);
      if(just_pressed[button_momentary[i][j]]){
        last_button_momentary[selected_bank][i] = button_momentary[i][j];
        if(last_button_momentary[selected_bank][i] != previous_button_momentary[selected_bank][i]){
          SR.Led_Pin_Write(last_button_momentary[selected_bank][i],1);
          SR.Led_Pin_Write(previous_button_momentary[selected_bank][i],0);
          previous_button_momentary[selected_bank][i]=last_button_momentary[selected_bank][i];
          //on enregistre dans la bank la led qui s'est allummé dans la colonne
          bank_led[selected_bank][i]= last_button_momentary[selected_bank][i];
        }     
        Send_CC (last_button_momentary[selected_bank][i] ,127);
      }
    }
  }

  //si la banque selectionne a changer alors on met a jour les leds
  if (selected_bank != old_selected_bank){
    old_selected_bank=selected_bank;
    //on eteind toutes les led avant des les mettre a jours
    SR.Led_All_Off();
    for (int i=0; i<BUTTON_COL;i++){
      SR.Led_Pin_Write(bank_led[selected_bank][i],1);
    }
  }

  for (byte i=0; i<NUMPOT; i++){
    pot_Value[i] = Pot.Read(i)>>3;//convert 10bits to 7bits
    if (abs (pot_Value[i] - old_Pot_Value[i])>1){//value pot changed?
      int data = map(pot_Value[i],3,123,0,127);// map to right midi value 0,127 due to the bad ADC and bad power stability
      data=max(data,0);
      data = constrain(data,0,127);
      Send_CC (i+64,data);
      old_Pot_Value[i] = pot_Value[i];
    }
  }
}

//-------------------------Funtions----------------------------------------

//Function that scan state of each button (code from Adafruit tutoriel)
void check_switches()
{
  static byte previousstate[NBR_BUTTON];
  static byte currentstate[NBR_BUTTON];
  //Check switch en toggle Mode
  for (byte index = 0; index < NBR_BUTTON; index++){
    just_pressed[index] = 0;       // when we start, we clear out the "just" indicators
    currentstate[index] = SR.Button_Pin_Read(index); // read the button
    if (currentstate[index] == previousstate[index]){
      if ((pressed[index] == LOW) && (currentstate[index] == HIGH)){
        just_pressed[index] = 1;
      }
      pressed[index] = currentstate[index];  // remember, digital LOW means NOT pressed
    }
    previousstate[index] = currentstate[index];   // keep a states of the buttons
  }
}

void Send_CC(byte num_CC, byte value)
{
  if (DEBUG){
    Serial.print ("CC Nbr:");// "control change" message on selected MIDI_CHANNEL
    Serial.print (num_CC,DEC);
    Serial.print(" Value:");
    Serial.println (value,DEC);
  }
  else{

    Serial.write (176 + midi_channel);// "control change" message on selected MIDI_CHANNEL
    Serial.write (num_CC);
    Serial.write (value);
  }
}

//fonction qui eteind toutes les led des banques
void Bank_Led_Off(){
  SR.Led_SR_Write(3,0);
}



Bat wrote:Le second problème est l'instabilité des potentiomètres.

Il y a plusieurs manières de stabiliser la lecture des potentiomètres pour moi ce sera celle-ci:
 // déclaration de la variable
float stableValue;

// dans la loop() ou une boucle for
stableValue = 0.9 * stableValue + 0.1 * Pot.Read(0);


Bat wrote:La librairie SRIO m'a aussi posé problème. Le logiciel ne la reconnaissait pas, quoi que je fasse. J'ai réinstallé les librairies, changé le wiring shitf.c, modifié la ligne de code dans arduino.h etc... J'ai fini par réinstaller arduino, et ça fonctionne de nouveau.

Pour la librairie SRIO tu n as plus besoin de changer quoi que ce soit dans l IDE d Arduino.
Remet le fichier d origine wiring shitf.c, remet aussi arduino.h a l état original et utilise cette version de la librairie SRIO.

Il ne te reste plus qu´a stabilisé la fonction Pot.Read et checker deux trois fonction dans le code qui me semble pas très juste. A toi de tester tous cela.

e-licktronic
Best regards,
e-licktronic
User avatar
e-licktronic
Site Admin
 
Posts: 578
Joined: Feb 16th, '11, 13:36

Re: #Projet en cours# Bidule 2.0, un peu plus lourd

Postby Bat » Sep 17th, '14, 09:24

Salut !
Le code ne marche hélas pas, mais la variable float stableValue a l'air de faire ses preuves, vu que je n'ai plus d'étranges paramètres fantômes qui se déplacent sans prévenir sur Ableton (pour l'instant.... -_-). En gros les banques ne s'allument même plus, et ne fonctionnent plus

Edit de dernière minute, j'ai repris les tutos que vous avez mis sur votre site, et après moulte réflexion, j'ai pondu ces quelques modifications sur mon code d'origine :

Code: Select all
//****************************************************************
// Le Bidule 2.0
// 8 banques de 16 boutons chacune en 2x8
// 24 potentiomètres
//****************************************************************

#include <SRIO.h>
#include <PotMUX.h>

//librairies constructors
//PotMUX Pot;
//SRIO SR;

// DEBUG pour afficher sur le moniteur serie les valeurs envoyer en MIDI
#define DEBUG 0
//communication mode 0=serial  1=MIDI  2=USB
#define COMMUNICATION_MODE 1
//Midi channel
#define MIDI_CHANNEL 1
//Number of connected potentiometers
#define NUMPOT 24
//deini le nombre total de bouton
#define NBR_BUTTON 24
//defini le nombre de bouton en colonne qui controlent les clip d'ableton
#define BUTTON_COL  2
//defini le nombre de bouton en ligne
#define BUTTON_ROW  8
//defini le nombre de bank
#define NBR_BANK 8

//Pin number of the toggle button
byte button_toggle_Pin[]={
};

//Array of the momentary button pin organize to match with Ableton clip configuration
//chaque ligne correspond au numero des boutons dans la meme colonne
// dans ton cas comme les dilicktal sont a 90° les colonnes de boutons sont au nombre de 6 et 4 ligne
uint8_t button_momentary[BUTTON_COL][BUTTON_ROW]={
  {
    0,1,2,3,4,5,6,7                          }
  ,
  {
    8,9,10,11,12,13,14,15                }                     
};

//Variable du dernier bouton appuyer et de l'avant dernier. array du nombre de colonne car on ne veut allumer qu'une led par colonne
byte last_button_momentary[NBR_BANK][BUTTON_COL];
byte previous_button_momentary[NBR_BANK][BUTTON_COL]={
{255,255}   
,{255,255}
,{255,255}
,{255,255}
,{255,255}
,{255,255}
,{255,255}
,{255,255}
};//on initialise avec une valeur differente de celle des boutons



// we will track if a button is just pressed, or 'currently pressed'
byte pressed[NBR_BUTTON], just_pressed[NBR_BUTTON];

// Simple count to remember the number of push of the toggle button
byte count[sizeof(button_toggle_Pin)]={
};

//potentiometers variables
uint16_t old_Pot_Value[NUMPOT];
uint16_t pot_Value[NUMPOT];

//Variabl de stabilisation des potentiomètres
float stableValue;

//flag's mute button to be "ON" at start
boolean flag=1;

// variable de la bank selectionné
byte selected_bank=0;
byte old_selected_bank=0;

//variable du canal midi
byte midi_channel;

//Bank led, stock le numero des leds de chaque colonne qui est allumé
byte bank_led[NBR_BANK][BUTTON_COL]={
{255,255}   
,{255,255}
,{255,255}
,{255,255}
,{255,255}
,{255,255}
,{255,255}
,{255,255}
};

void setup()
{
  SR.Initialize();//initialize SRIO librairy
  Pot.Initialize();//initialize PotMUX librairy
  switch (COMMUNICATION_MODE){
  case 0:
    Serial.begin(9600);
    break;
  case 1:
    Serial.begin(31250);
    break;
  case 2:
    Serial.begin(115200);
  }

  //Led animation start
// On lie le channel midi avec la banque sélectionnée
midi_channel = selected_bank;
  //Led animation start

  SR.Led_Pin_Write(16,1);
  delay(100);
  SR.Led_Pin_Write(16,0);
  SR.Led_Pin_Write(17,1);
  delay(100);
  SR.Led_Pin_Write(17,0);
  SR.Led_Pin_Write(18,1);
  delay(100);
  SR.Led_Pin_Write(18,0);
  SR.Led_Pin_Write(19,1);
  delay(100);
  SR.Led_Pin_Write(19,0);
  SR.Led_Pin_Write(20,1);
  delay(100);
  SR.Led_Pin_Write(20,0);
  SR.Led_Pin_Write(21,1);
  delay(100);
  SR.Led_Pin_Write(21,0);
  SR.Led_Pin_Write(22,1);
  delay(100);
  SR.Led_Pin_Write(22,0);
  SR.Led_Pin_Write(23,1);
  delay(100);
  SR.Led_Pin_Write(23,0);
  SR.Led_All_Off();
  //on allumme la led de la bank selecitonne
  SR.Led_Pin_Write(20,1);
}


void loop()
{
  check_switches();      // when we check the switches we'll get the current state

  //Selection de la banque
  if(SR.Button_Pin_Read(16)==1){
    selected_bank=4;
    Bank_Led_Off();
    SR.Led_Pin_Write(16,1);
  }
 
  else if (SR.Button_Pin_Read(17)==1){
    selected_bank=5;
    Bank_Led_Off();
    SR.Led_Pin_Write(17,1);
  }
 
  else if (SR.Button_Pin_Read(18)==1){
    selected_bank=6;
    Bank_Led_Off();
    SR.Led_Pin_Write(18,1);
  }
 
  else if (SR.Button_Pin_Read(19)==1){
    selected_bank=7;
    Bank_Led_Off();
    SR.Led_Pin_Write(19,1);
  }
 
  else if (SR.Button_Pin_Read(20)==1){
    selected_bank=0;
    Bank_Led_Off();
    SR.Led_Pin_Write(20,1);
  }
  else if (SR.Button_Pin_Read(21)==1){
    selected_bank=1;
    Bank_Led_Off();
    SR.Led_Pin_Write(21,1);
  }
  else if (SR.Button_Pin_Read(22)==1){
    selected_bank=2;
    Bank_Led_Off();
    SR.Led_Pin_Write(22,1);
  }
  else if (SR.Button_Pin_Read(23)==1){
    selected_bank=3;
    Bank_Led_Off();
    SR.Led_Pin_Write(23,1);
  }
 

  for(byte i =0;i<BUTTON_COL;i++){
    for(byte j=0;j<BUTTON_ROW;j++){
      // button_momentary_state = SR.Button_Pin_Read(button_momentary[i][j]);
      if(just_pressed[button_momentary[i][j]]){
        last_button_momentary[selected_bank][i] = button_momentary[i][j];
        if(last_button_momentary[selected_bank][i] != previous_button_momentary[selected_bank][i]){
          SR.Led_Pin_Write(last_button_momentary[selected_bank][i],1);
          //on envoi le control change correspondant a la banque selectionné Le +1 est la pour ne pas multiplier par 0 sinon toutes les valeur
          //de la bank 0 vaudrai 0
          Send_CC (last_button_momentary[selected_bank][i] * (selected_bank+1),127);
          SR.Led_Pin_Write(previous_button_momentary[selected_bank][i],0);
          previous_button_momentary[selected_bank][i]=last_button_momentary[selected_bank][i];
          //on enregistre dans la bank la led qui s'est allummé dans la colonne
          bank_led[selected_bank][i]= last_button_momentary[selected_bank][i];
        }
        else{
          Send_CC (last_button_momentary[selected_bank][i]* (selected_bank+1),127);
        }
      }
    }
  }

  //si la banque selectionne a changer alors on met a jour les leds
  if (selected_bank != old_selected_bank){
    old_selected_bank=selected_bank;
    //on eteind toutes les led avant des les mettre a jours
    SR.Led_All_Off();
    for (int i=0; i<BUTTON_COL;i++){
      SR.Led_Pin_Write(bank_led[selected_bank][i],1);
    }
  }

  for (byte i=0; i<NUMPOT; i++){
    pot_Value[i] = Pot.Read(i)>>3;//convert 10bits to 7bits
    if (abs (pot_Value[i] - old_Pot_Value[i])>1){//value pot changed?
      int data = map(pot_Value[i],3,123,0,127);// map to right midi value 0,127 due to the bad ADC and bad power stability
      stableValue = 0.9* stableValue +0.1*Pot.Read(0);
      data=max(data,0);
      data = constrain(data,0,127);
      Send_CC (i+64,data);
      old_Pot_Value[i] = pot_Value[i];
    }
  }
}

//-------------------------Funtions----------------------------------------

//Function that scan state of each button (code from Adafruit tutoriel)
void check_switches()
{
  static byte previousstate[NBR_BUTTON];
  static byte currentstate[NBR_BUTTON];
  //Check switch en toggle Mode
  for (byte index = 0; index < NBR_BUTTON; index++){
    just_pressed[index] = 0;       // when we start, we clear out the "just" indicators
    currentstate[index] = SR.Button_Pin_Read(index); // read the button
    if (currentstate[index] == previousstate[index]){
      if ((pressed[index] == LOW) && (currentstate[index] == HIGH)){
        just_pressed[index] = 1;
      }
      pressed[index] = currentstate[index];  // remember, digital LOW means NOT pressed
    }
    previousstate[index] = currentstate[index];   // keep a states of the buttons
  }
}

void Send_CC(byte num_CC, byte value)
{
  if (DEBUG){
    Serial.print ("CC Nbr:");// "control change" message on selected MIDI_CHANNEL
    Serial.print (num_CC,DEC);
    Serial.print(" Value:");
    Serial.println (value,DEC);
  }
  else{

    Serial.write (0xB0 + selected_bank);// "control change" message on selected MIDI_CHANNEL
    Serial.write (num_CC);
    Serial.write (value);
  }
}

//fonction qui eteind toutes les led des banques
void Bank_Led_Off(){
SR.Led_Pin_Write(20,0);
  SR.Led_Pin_Write(16,0);
  SR.Led_Pin_Write(17,0);
  SR.Led_Pin_Write(18,0);
  SR.Led_Pin_Write(19,0);
  SR.Led_Pin_Write(21,0);
  SR.Led_Pin_Write(22,0);
  SR.Led_Pin_Write(23,0);
}


en réalité quasiment rien de change, si ce n'est que qu'au lieu de mettre dans
void Send_CC (Byte num_CC, byte value)

Serial.write (176 + midi_channel);

je mets

Serial.write (0xB0 + selected_bank);

normalement ça marche, je l'ai juste un peu testé, et je suis tellement excité que je vais aller prendre une douche froide avant de pousser mes expérimentations.

Le reste du code doit effectivement être un peu épuré j'imagine, j'ai glissé tellement d'autres variables inutiles dedans avant d'avoir ce résultat qu'il faudrait le revoir, mais j'ai plus trop la tête à ça s'il fonctionne correctement.
Voulez-vous que je vous envoie des photos de la bête, ou une vidéo, si cela fonctionne toujours après le crashtest que je vais lui faire passer ? Ce serait un projet à mettre dans votre rubrique "Projet" du site, c'est quand même vous qui en êtes l'instigateur principal ^^

EDIT

Il y a eu quelque chose d’inattendu avec le bidouillage que j'ai effectué : Les paramètres MIDI changent aussi pour les potentiomètres, ce qui fait que je me retrouve non pas avec une matrice de 24 pot, mais 24x8 banque, soit 192 pot. Je ne sais pas si toutes les banques fonctionnent correctement, mais 4 banque me suffisent largement pour faire tourner ma version d'Ableton !
Il ne me reste plus qu'à monter complètement la machine dans sa boite et je vous envoie les photos.
Bat
 
Posts: 18
Joined: Oct 26th, '13, 22:44

Re: #Projet en cours# Bidule 2.0, un peu plus lourd

Postby e-licktronic » Sep 18th, '14, 11:20

Bonjour Bat,

Je suis heureux que ton code fonctionne, mais tu n a pas utiliser la fonction de stabilisation des valeurs de potentiomètres?
Effectivement si la variable bank est associé a la variable midi channel tu auras 8 banques de tous tes contrôleurs, potentiomètre inclus.

Quelques photos et une démo serai les bien venu ;)
Je pense épurer un peu le code quand je le testerai

Un petit exercice pour toi:

Au début de ton code tu a fais une animation des leds de la 3e platine Dilicktal (pin led de 17 a 23) en utilisant exclusivement la fonction Led_Pin_Write() , essaie de créer la meme animation avec ce coup ci la fonction Led_SR_Write() , une loop for{} et un décalage de bit << .
Tes leds peuvent être représente par un nombre binaire b00000001 que l on appelle octet ou byte en anglais. Si tu decales le premier bit d une position cela revient a décaler d une position la led allumée
Exemple: b00000001 = 1 = première led allumée
b00000001 << 1 = b00000010 = 2 = deuxième led allumée
b00000001 << 2 = b00000100 = 4 = troisième led allumée
b00000001 << 3 = b00001000 = 8 = quatrième led allumée
Etc....
Je pense qu avec toutes ces indications il ne devrai pas y avoir de problème pour que tu simplifies ton code et cela te simplifiera grandement l écriture de tes codes :geek:

Cordialement,
e-licktronic
Best regards,
e-licktronic
User avatar
e-licktronic
Site Admin
 
Posts: 578
Joined: Feb 16th, '11, 13:36

Re: #Projet en cours# Bidule 2.0, un peu plus lourd

Postby Bat » Sep 21st, '14, 08:32

e-licktronic wrote:Je suis heureux que ton code fonctionne, mais tu n a pas utiliser la fonction de stabilisation des valeurs de potentiomètres?


A mince, je pensais avoir déclaré la variable et avoir placé :
stableValue = 0.9 * stableValue + 0.1 * Pot.Read(0);
correctement. Attendez, ne dites rien je vais trouver comment l'utiliser correctement !

Pour le code avec Led_SR_Write, je m'y mets aussi.

Pour ce qui est des photos et vidéos, voici déjà l’aperçu de la boite (un capot devrait recouvrir les potards pour ne laisser dépasse que le nécessaire, mais j'arrive jamais à bien percer les trous, je me goure tout le temps) : http://bazarambulant.tumblr.com/
Bat
 
Posts: 18
Joined: Oct 26th, '13, 22:44


Return to E-licktronic rencontre Arduino

Who is online

Users browsing this forum: No registered users and 1 guest

cron