Besoin d'aide... Arduino pour piloter Midi

Bonjour à tous, je débute avec ma carte Arduino, donc je voudrai savoir si certains d'entre vous seraient en mesure de me fournir quelques tuyaux pour mon premier projet.
Mon but ultime: Faire augmenter un niveau sonore en fonction d'une baisse de luminosité détectée par un capteur LDR.
J'ai donc acheté une Arduino Duemilanove ainsi que des capteurs LDR lumière/tension.
J'aimerai donc capter le signal lumineux, et faire qu'une variable passe de 0 à 127 si la luminosité passe en dessous de 50%.
Cette variable serait transformée en signal midi pour être reçue par le logiciel fruity loops afin d'augmenter le volume au maximum (127) lorsque la luminosité est faible, et repasser à un volume muet (0) lorsque la luminosité est élevée.
J'espère que mes explications sont assez claires.
Pour l'acheminement du signal midi vers fruity loops je compte me renseigner sur d'autres forums bien entendu. Mais j'aurais vraiment besoin de votre aide en ce qui concerne le traitement dans le logiciel arduino.
Je vous remercie d'avance pour toute info susceptible de me faire avancer...

firmata permet d envoyer du sysex

Merci pour ta réponse Karistouf!
Mais j'ai finalement trouvé un programme qui permet de transformer le signal d'entrée analogique en midi: S2Midi
J'ai donc réussi à faire passer le signal et même à le recevoir dans fruity loops, maintenant le problème est que le signal que je reçois n'a rien à voir avec ce que je demande.
Le code que j'utilise est celui ci:

//This program reads up to 4 analog sensors / potentiometers ans converts the data to Midi-Controller messages
// define Switchpin:
#define switchPin 10
// define LED:
#define LEDpin 13

// Variables

// define variables for the controller data
int AnalogValue[4] = {0,0,0,0};

// define the "lastValue" variables
int lastAnalogValue[4] = {0,0,0,0};

// select the midi Controller Number for each input
int midiCCselect[4] = {1,2,3,4};

// select threshold for each analog input
int thresh[4] = {1,1,1,1};

// select number of desired analog inputs (max 6)
int input_no = 4;

void setup() {
// set the states of the I/O pins:
pinMode(switchPin, INPUT);
pinMode(LEDpin, OUTPUT);
// Set MIDI baud rate:
Serial.begin(31250);

}

// main program loop
void loop() {

for(int i=0;i<input_no;i++){

AnalogValue = (analogRead(i))/8; // read the value from the analog input and divide by 8 for range 0-127

  • // check if value is greater than defined threshold (good for resistive touchpads etc)*
    if ( AnalogValue >thresh ) {
    * // check if analog input has changed*
    if ( AnalogValue != lastAnalogValue ) {
    * //send control change on cc#i*
    midiCC(0xB0, midiCCselect_, AnalogValue*);
    // update lastAnalogValue variable*

    lastAnalogValue = AnalogValue*;*
    * //End if*
    * }
    //End if*

    * }*_

//End for
}
//End Loop
}
// This function sends a Midi CC.
void midiCC(char CC_data, char c_num, char c_val){
Serial.print(CC_data, BYTE);
Serial.print(c_num, BYTE);
Serial.print(c_val, BYTE);
}
Je pensais que cela conviendrai à merveille sachant que j'ai branché 4 capteurs LDR sur mes entrées analogiques, voici les capteurs en question:
*http://fr.farnell.com/taos/tsl257-lf/capteur-lumiere-tension/dp/1226886*_
Maintenant mon problème est que lorsque je reçoit le signal dans fruity loops cela me produit tout plein d'actions indésirables comme déclencher des notes midi. En gros ça agit mais pas de la manière dont je veux (moins de lumière = augmenter un potard de volume dans fruity loops).
Je me demande si le problème ne viendrai pas plutôt d'une certaine config car lorsque j'ouvre le Serial Monitor je ne vois pas des chiffres mais des lignes de (ÀÀÃÀÿþ) enfin plein de symboles bizarres quoi.
Please Help me!!!!!!!_

Tu n'aurais pas inversé le signal MIDI par hazard ??

Non je ne pense pas, que veux tu dire par inverser le signal midi?
Est ce que ça cloche à un certain niveau du programme ou ça viendrai plutôt de mes configurations?

hello le souci que tu as est que celà n emet pas vers un port midi mais vers le port série.
cela te convertis les donnees dans le format midi 0 - 127 et dans le bit identifiant du message. qui est à verifier d ailleurs.

tu as donc besoin d un programme tiers qui ouvre qui communique vers un port midi genre midi yoke, que tu recupereras dans ton soft

regardes eventuellement si GlovePie lit le port série, auquel cas tu pourras vraiment rerouter les signaux en midi.

J'utilise déja MidiYoke. Et je me sert de S2Midi pour réceptionner les données analogiques de l'arduino, les envoyer vers le port Outpout MidiYoke 1, ensuite sur fruity loops j'ai bien activé Input from Midi Yoke 1. Après ça il semblerait que les données arrivent bien jusqu'à fruity loops car si je sollicite les capteurs cela agit sur le logiciel de musique. Le problème est qu'au lieu de modifier seulement une valeur CC de 0 à 127 sur un channel ça me joue plein de notes midi et bouge à peine le potard qui devrait être contrôlé. En gros, pour solliciter le capteur je dois mettre ma main dessus pour cacher complètement la lumière sinon rien, et puis quand le capteur est enfin sollicité ça me marque dans S2Midi plein de signaux du genre:
Channel: 2 CC: 5 Value: 67
Channel: 9 Note: F3 Velocity: 127
Channel: 2 CC: 127 Value: 96
Channel: 15 Note: G10 Velocity: 67
Channel: 9 Note: A8 Velocity: 127
Channel: 9 Note: G#8 Velocity: 127
Channel: 9 Note: D#9 Velocity: 127
Channel: 14 Note: F0 Velocity: 71

Et dans le serial moniteur du logiciel arduino il n'y a pas des chiffres mais plein de symboles bizarres. Ce n'est qu'un exemple de ce qui apparait lorsque je cache le capteur de la lumière, pourtant, le code que j'ai utilisé et trouvé sur le forum arduino anglais est bien censé permettre de contôler 4 channels midi à partir de 4 entrées analogiques.

Je commence à m'inquiéter car c'est le seul problème qui fait foirer tout mon projet, que je dois d'ailleurs présenter lundi absolument (ce qui va déterminer mon passage en MasterPro, et ou je suis étudiant et un peu à la bourre comme vous pouvez voire)
Je vous remercie donc infiniment pour toute aide que vous pourrez m'apporter afin de résoudre ce problème.

C'est bon j'ai réussi!!! A force de faire des essais j'ai trouvé la solution tout seul j'ai eu de la chance. Merci quand même à vous qui vous êtes penchés sur la question pour m'aider, c'est bien gentil.
Donc voila si jamais ça peut vous servir, si vous désirez créer un contrôleur midi à partir de capteurs LDR (photorésistances), je vais vous expliquer comment j'ai réglé mon problème. En fait c'était vraiment simple mais il fallait le trouver, dans mon cas il suffisait juste de définir le Baud Rate à 36000 dans le code et aussi dans le logiciel S2Midi. J'ai aussi rajouté un delay à la fin du code d'envoi du message midi sinon le signal était trop rapide et ça foutait le bordel.
Voici donc le code final:

// by Tubedogg 12/2006; fabian at tubedogg.de

//This program reads up to 6 analog sensors / potentiometers ans converts the data to Midi-Controller messages
// define Switchpin:
#define switchPin 10
//  define LED:
#define LEDpin 13

// Variables

// define variables for the controller data
int AnalogValue[4] = {0,0,0,0};    

// define the "lastValue" variables
int lastAnalogValue[4] = {0,0,0,0};
 
// select the midi Controller Number for each input
int midiCCselect[4] = {1,2,3,4};

// select threshold for each analog input  
int thresh[4] = {1,1,1,1};  

// select number of desired analog inputs (max 6)
int input_no = 4;

void setup() {
 //  set the states of the I/O pins:
 pinMode(switchPin, INPUT);
 pinMode(LEDpin, OUTPUT);
 //  Set MIDI baud rate:
 Serial.begin(36000);

}

// main program loop
void loop() {

for(int i=0;i<input_no;i++){

         AnalogValue[i] = (analogRead(i))/8;    // read the value from the analog input and divide by 8 for range 0-127
     // check if value is greater than defined threshold (good for resistive touchpads etc)
     if ( AnalogValue [i]>thresh[i] ) {
           // check if analog input has changed
           if ( AnalogValue[i] != lastAnalogValue[i] ) {

           //send control change on cc#i
           midiCC(0xB0, midiCCselect[i], AnalogValue[i]);
           // update lastAnalogValue variable
           lastAnalogValue[i] = AnalogValue[i];

           //End if
           }
       //End if
     }
   
 
//End for
}


//End Loop
}



// This function sends a Midi CC.
void midiCC(char CC_data, char c_num, char c_val){
 Serial.print(CC_data, BYTE);
 Serial.print(c_num, BYTE);
 Serial.print(c_val, BYTE);
delay (100);
}

Un grand merci à TubeDogg pour ce code!

Par contre je tiens à préciser que j'ai rencontré un autre problème par rapport à la sensibilité des capteurs. C'est à dire que le signal ne changeait pas si je faisait de l'ombre sur le capteur, il fallait beaucoup plus d'obscurité pour que la valeur commence à diminuer. En gros ces capteurs là fonctionnent correctement et de manière précise dans un environnement sombre, mais par contre ne captent plus les différences de luminosité au delà d'une certaine puissance d'éclairage. Dans mon cas, je cherchais à réaliser une installation pour faire un système d'ombres chinoises sonores, donc quand l'ombre passe à un certain endroit, le capteur déclenche un son dans fruity loops. Le problème était que l'ombre n'était pas assez importante pour faire diminuer la valeur qui restait à 127.

Bien sur je me suis dit sur le coup que tout était foutu ou alors il fallait que je recommande des capteurs différents etc. Mais finalement, voici une solution très bête mais efficace: enrober les capteurs de papier, enrouler sur plusieurs épaisseurs si nécessaire, et le tour est joué. Plus il y a d'éclairage ambiant plus il faudra d'épaisseur de papier pour compenser. Ensuite il suffit de faire une petite ombre sur le capteur empaqueté pour que la valeur descente comme il se doit.

Voila, j'espère que ces infos pourront être utiles à d'autres un jour ou l'autre. Sachant qu'il est possible avec ce programme d'imaginer et de créer toute sorte de contrôleurs midi plus incroyables les uns que les autres. Cela ouvre bien de nouvelles possibilité pour contrôler les logiciels de musiques et inventer de nouveaux instruments midi. Arduino le permet, et pour une modeste somme, profitons en!!!

tu peux mettre une resistance pour faire tomber la reponse de la cellule. meme si tu veux mettre une resistance varibale me semble plus adaptée.

comment routes-tu la sortie port serie vers midiyoke 1 ?

Je pense que c'est fait à travers s2midi.

S2midi ne voulant pas fonctionner chez moi, j'ai trouvé un autre soft qui fait la même chose.
http://www.spikenzielabs.com/SpikenzieLabs/Serial_MIDI.html
:wink: