#Objet fini# Le bidule, premier né timide

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

Re: #Objet fini# Le bidule, premier né timide

Postby Bat » Apr 8th, '14, 15:43

Merci beaucoup pour toute cette orgie de variables et de lignes de commandes!

C'est là que je vois que sur la structure j'étais pas loin, mais sur le corps même du code il me reste beaucoup de choses à apprendre. Au niveau des termes à définir par exemple, mais aussi des variables à annoncer... et je n'ai toujours pas compris à quoi faisait référence le "flag", je cherche sur bien des forums, mais les réponses sont en anglais, et bien que je comprenne assez bien cette langue, je ne m'y connais pas encore suffisamment bien en programmation pour décoder les termes employés.

Le coup de la multiplication aussi ça m'a impressionné, je me creusais la tête pour appeler un numéro contenu dans une variable crée spécialement pour... alors que quelques calculs tout simples suffisaient grandement. Ce code est superbe ! C'est un très bonne leçon !
Je n'ai pas les platines sous la main, mais dès que je rentre chez moi je les teste!
Merci encore pour l'aide, je vais voir ce qu'il en est et essayer de le modifier encore, en ajoutant des animations lors de la sélection d'une banque par exemple !
Bat
 
Posts: 18
Joined: Oct 26th, '13, 22:44

Re: #Objet fini# Le bidule, premier né timide

Postby Bat » Apr 15th, '14, 19:00

Bonjour !
J'ai enfin pu tester votre code avec fébrilité, et il est super !
J'ai essayé de le modifier un peu, afin de pouvoir contrôler une matrice de plus de boutons par banque, comme pour ablikton, où on peut en contrôler jusqu'à 8. C'est pile ce qu'il me faudrait pour le projet que je mène en ce moment. Du coup j'ai modifié le code, le nombre de colonnes et de Row, ainsi que les arrays pour les boutons, les leds, et l'ordre dans le tableau, mais ça ne marche pas.
Je me demande s'il ne faudrait pas prendre carrément le comptage par platine et non par boutons, je vais essayer ça dans la semaine.
J'ai du mal avec les colonnes et les rows, mais je vais voir si je peux y comprendre quelque chose.
Merci beaucoup pour votre aide en tous les cas !
:D
Baptiste

EDIT :

Je crois que j'ai réussi !!!!

J'ai un peu bidouillé, et je suis trop fatigué pour tester maintenant sur le logiciel, mais je crois que j'ai réussis !

voici le code modifié, merci beaucoup pour toute votre aide, si ça marche c'est exactement ce qu'il me faut pour mon projet !
Voici le code (j'ai changé l'ordre des boutons et le numéro des colones et des row ainsi que des banques):
Code: Select all
//****************************************************************
// Ablickton
// Midi controler for Ableton Live:
//
//-8 tracks controller with volume and send A
//-8 Mutes Buttons
//-7 buttons to controlle clips on each track
//
//****************************************************************

#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 0
//Midi channel
#define MIDI_CHANNEL 1
//Number of connected potentiometers
#define NUMPOT 0
//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);
}
Bat
 
Posts: 18
Joined: Oct 26th, '13, 22:44

Previous

Return to E-licktronic rencontre Arduino

Who is online

Users browsing this forum: No registered users and 1 guest

cron