Author Topic: [H.S] T'arrives pas à lâcher ton fer a souder ? Montre nous ce que tu fais !  (Read 124991 times)

Offline Wapata

  • Hero Member
  • *****
  • Posts: 909
  • Bonus Pute: 8
Une flûte automatisée. Pouvant jouer des partitions MIDI.

Ou comment passer de ça:


à ça:


J'ai beaucoup avancé, j'ai aussi un petit peut reculé suite à la perte de mon script Arduino, mais pour le moment, avec le code en fin de post, j'arrive à ce résultat:
Flûte MIDI Tests relais

La partie que j'ai perdu, c'est qu'avec le "prototype du prototype" avec LEDS, tout ne s'enclenchait pas en même temps. Je crois que j'avais fait du ElseIf, mais je ne sais plus trop, il faut que je remette les mains dans le cambouis.

Le code me plait assez bien comme ça, niveau fonctionalités, il faut que je trouve comment empécher la polyphonie, car si deux notes différents se mettent sur ON, le passage de l'une d'elle sur OFF désactive les sorties communes. Il faut aussi que je réalise un MIDI TRHU. J'ai gardé quelques sorties PWM dans l'éventualité où j'arrive au stade "gestion de la vélocité".


Le code:
Spoiler: ShowHide

Code: [Select]
/*Midi to relay // Wapata 02.2012
 *Based on: Midi In Basic  0.2 // kuki 8.2007
 *
 * -----------------
 * listen for midi serial data, and active outputs for individual notes

 IMPORTANT:
 your arduino might not start if it receives data directly after a reset, because the bootloader thinks you want to uplad a new progam.
 you might need to unplug the midi-hardware RX pin until the board is running your program. that is when that statusLed turns on.

#####################################################################################################################################################
SOMETHING ABOUT MIDI MESSAGES
 midi messages start with one status byte followed by 1 _or_ 2 data bytes, depending on the command

 example midi message: 144-60-100
   the status byte "144" tells us what to do. "144" means "note on".
   in this case the second bytes tells us which note to play (60=middle C)
   the third byte is the velocity for that note (that is how powerful the note was struck= 100)
 
 example midi message: 128-36
   this message is a "note off" message (status byte = 128). it is followed by the note (data byte = 36)
   since "note off" messages don't need a velocity value (it's just OFF) there will be no third byte in this case
   NOTE: some midi keyboards will never send a "note off" message, but rather a "note on with zero velocity"
 
 do a web search for midi messages to learn more about aftertouch, poly-pressure, midi time code, midi clock and more interesting things.
 
 have to talk about how midi message realy is.
#####################################################################################################################################################

HARDWARE NOTE:
The Midi Socket is connected to arduino RX through an opto-isolator to invert the midi signal and seperate the circuits of individual instruments.
connect outputs to pin2-pin9 pinA0-pinA5 on your arduino.

####################################################################################################################################################


 */

//variables setup

byte incomingByte;
byte note;
byte velocity;


int statusLed = 13;   // select the pin for the LED

int action=2; //0 =note off ; 1=note on ; 2= nada


//setup: declaring iputs and outputs and begin serial
void setup() {
  pinMode(statusLed,OUTPUT);   // declare the LED's pin as output
  pinMode(2,OUTPUT); //R1
  pinMode(3,OUTPUT); //R2
  pinMode(4,OUTPUT); //R3
  pinMode(5,OUTPUT); //R4
  pinMode(6,OUTPUT); //R5
  pinMode(7,OUTPUT); //R6
  pinMode(8,OUTPUT); //R7
  pinMode(9,OUTPUT); //R8
  pinMode(A0,OUTPUT); //R9
  pinMode(A1,OUTPUT); //R10
  pinMode(A2,OUTPUT); //R11
  pinMode(A3,OUTPUT); //R12
  pinMode(A4,OUTPUT); //R13 air 1
  pinMode(A5,OUTPUT); //R14 air 2
 
  //start serial with midi baudrate 31250 or 38400 for debugging
  Serial.begin(31250);       
  digitalWrite(statusLed,HIGH); 
}

//loop: wait for serial data, and interpret the message
void loop () {
  if (Serial.available() > 0) {
    // read the incoming byte:
    incomingByte = Serial.read();

    // wait for as status-byte, channel 1, note on or off
    if (incomingByte== 144){ // note on message starting starting
      action=1;
    }else if (incomingByte== 128){ // note off message starting
      action=0;
    }else if (incomingByte== 208){ // aftertouch message starting
       //not implemented yet
    }else if (incomingByte== 160){ // polypressure message starting
       //not implemented yet
    }else if ( (action==0)&&(note==0) ){ // if we received a "note off", we wait for which note (databyte)
      note=incomingByte;
      playNote(note, 0);
      note=0;
      velocity=0;
      action=2;
    }else if ( (action==1)&&(note==0) ){ // if we received a "note on", we wait for the note (databyte)
      note=incomingByte;
    }else if ( (action==1)&&(note!=0) ){ // ...and then the velocity
      velocity=incomingByte;
      playNote(note, velocity);
      note=0;
      velocity=0;
      action=0;
    }else{
      //nada
    }
  }
}

void blink(){
  digitalWrite(statusLed, HIGH);
  delay(100);
  digitalWrite(statusLed, LOW);
  delay(100);
}


void playNote(byte note, byte velocity){
  int value=LOW;
  if (velocity >10){
      value=HIGH;
  }else{
   value=LOW;
  }

if(note= 72){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  //digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  digitalWrite(5, value);
  digitalWrite(6, value);
  digitalWrite(7, value);
  digitalWrite(8, value);
  digitalWrite(9, value);
  digitalWrite(A1, value);
  digitalWrite(A0, value);
  digitalWrite(A3, value);
  digitalWrite(A2, value);
}

if(note= 73){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  //digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  digitalWrite(5, value);
  digitalWrite(6, value);
  digitalWrite(7, value);
  digitalWrite(8, value);
  digitalWrite(9, value);
  digitalWrite(A1, value);
  digitalWrite(A0, value);
  digitalWrite(A3, value);
  //digitalWrite(A2, value);
}

if(note= 74){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  //digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  digitalWrite(5, value);
  digitalWrite(6, value);
  digitalWrite(7, value);
  digitalWrite(8, value);
  digitalWrite(9, value);
  digitalWrite(A1, value);
  digitalWrite(A0, value);
  //digitalWrite(A3, value);
  //digitalWrite(A2, value);
}

if(note= 75){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  //digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  digitalWrite(5, value);
  digitalWrite(6, value);
  digitalWrite(7, value);
  digitalWrite(8, value);
  digitalWrite(9, value);
  digitalWrite(A1, value);
  //digitalWrite(A0, value);
  //digitalWrite(A3, value);
  //digitalWrite(A2, value);
}

if(note= 76){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  //digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  digitalWrite(5, value);
  digitalWrite(6, value);
  digitalWrite(7, value);
  digitalWrite(8, value);
  digitalWrite(9, value);
  //digitalWrite(A1, value);
  //digitalWrite(A0, value);
  //digitalWrite(A3, value);
  //digitalWrite(A2, value);
}

if(note= 77){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  //digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  digitalWrite(5, value);
  digitalWrite(6, value);
  digitalWrite(7, value);
  digitalWrite(8, value);
  //digitalWrite(9, value);
  //digitalWrite(A1, value);
  //digitalWrite(A0, value);
  //digitalWrite(A3, value);
  //digitalWrite(A2, value);
}

if(note= 78){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  //digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  digitalWrite(5, value);
  digitalWrite(6, value);
  digitalWrite(7, value);
  //digitalWrite(8, value);
  digitalWrite(9, value);
  digitalWrite(A1, value);
  digitalWrite(A0, value);
  digitalWrite(A3, value); //OPTION
  digitalWrite(A2, value); //OPTION
}

if(note= 79){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  //digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  digitalWrite(5, value);
  digitalWrite(6, value);
  digitalWrite(7, value);
  //digitalWrite(8, value);
  //digitalWrite(9, value);
  //digitalWrite(A1, value);
  //digitalWrite(A0, value);
  //digitalWrite(A3, value);
  //digitalWrite(A2, value);
}

if(note= 80){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  //digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  digitalWrite(5, value);
  digitalWrite(6, value);
  //digitalWrite(7, value);
  digitalWrite(8, value);
  digitalWrite(9, value);
  digitalWrite(A1, value);
  //digitalWrite(A0, value);
  //digitalWrite(A3, value);
  //digitalWrite(A2, value);
}

if(note= 81){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  //digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  digitalWrite(5, value);
  digitalWrite(6, value);
  //digitalWrite(7, value);
  //digitalWrite(8, value);
  //digitalWrite(9, value);
  //digitalWrite(A1, value);
  //digitalWrite(A0, value);
  //digitalWrite(A3, value);
  //digitalWrite(A2, value);
}

if(note= 82){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  //digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  //digitalWrite(5, value);
  //digitalWrite(6, value);
  digitalWrite(7, value);
  digitalWrite(8, value);
  //digitalWrite(9, value);
  //digitalWrite(A1, value);
  //digitalWrite(A0, value);
  //digitalWrite(A3, value);
  //digitalWrite(A2, value);
}

if(note= 83){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  //digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  //digitalWrite(5, value);
  //digitalWrite(6, value);
  //digitalWrite(7, value);
  //digitalWrite(8, value);
  //digitalWrite(9, value);
  //digitalWrite(A1, value);
  //digitalWrite(A0, value);
  //digitalWrite(A3, value);
  //digitalWrite(A2, value);
}

if(note= 84){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  //digitalWrite(2, value);
  //digitalWrite(3, value);
  //digitalWrite(4, value);
  digitalWrite(5, value);
  digitalWrite(6, value);
  //digitalWrite(7, value);
  //digitalWrite(8, value);
  //digitalWrite(9, value);
  //digitalWrite(A1, value);
  //digitalWrite(A0, value);
  //digitalWrite(A3, value);
  //digitalWrite(A2, value);
}

if(note= 85){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  digitalWrite(2, value);
  digitalWrite(3, value);
  digitalWrite(4, value);
  digitalWrite(5, value);
  digitalWrite(6, value);
  //digitalWrite(7, value);
  //digitalWrite(8, value);
  //digitalWrite(9, value);
  //digitalWrite(A1, value);
  //digitalWrite(A0, value);
  //digitalWrite(A3, value);
  //digitalWrite(A2, value);
}

if(note= 86){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  digitalWrite(2, value);
  digitalWrite(3, value);
  //digitalWrite(4, value);
  digitalWrite(5, value);
  digitalWrite(6, value);
  //digitalWrite(7, value);
  //digitalWrite(8, value);
  //digitalWrite(9, value);
  //digitalWrite(A1, value);
  //digitalWrite(A0, value);
  //digitalWrite(A3, value);
  //digitalWrite(A2, value);
}

if(note= 87){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  digitalWrite(2, value);
  digitalWrite(3, value);
  //digitalWrite(4, value);
  digitalWrite(5, value);
  digitalWrite(6, value);
  digitalWrite(7, value);
  digitalWrite(8, value);
  digitalWrite(9, value);
  digitalWrite(A1, value);
  digitalWrite(A0, value);
  //digitalWrite(A3, value);
  //digitalWrite(A2, value);
}

if(note= 88){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  digitalWrite(5, value);
  digitalWrite(6, value);
  digitalWrite(7, value);
  digitalWrite(8, value);
  digitalWrite(9, value);
  //digitalWrite(A1, value);
  //digitalWrite(A0, value);
  //digitalWrite(A3, value);
  //digitalWrite(A2, value);
}

if(note= 89){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  digitalWrite(5, value);
  digitalWrite(6, value);
  digitalWrite(7, value);
  digitalWrite(8, value);
  //digitalWrite(9, value);
  //digitalWrite(A1, value);
  //digitalWrite(A0, value);
  //digitalWrite(A3, value);
  //digitalWrite(A2, value);
}

if(note= 90){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  digitalWrite(5, value);
  digitalWrite(6, value);
  digitalWrite(7, value);
  //digitalWrite(8, value);
  digitalWrite(9, value);
  //digitalWrite(A1, value);
  //digitalWrite(A0, value);
  digitalWrite(A3, value);
  digitalWrite(A2, value);
}

if(note= 91){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  digitalWrite(5, value);
  digitalWrite(6, value);
  digitalWrite(7, value);
  //digitalWrite(8, value);
  //digitalWrite(9, value);
  //digitalWrite(A1, value);
  //digitalWrite(A0, value);
  //digitalWrite(A3, value);
  //digitalWrite(A2, value);
}

if(note= 92){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  digitalWrite(5, value);
  digitalWrite(6, value);
  digitalWrite(7, value);
  //digitalWrite(8, value);
  digitalWrite(9, value);
  digitalWrite(A1, value);
  digitalWrite(A0, value);
  digitalWrite(A3, value);
  digitalWrite(A2, value);
}

if(note= 93){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  digitalWrite(5, value);
  digitalWrite(6, value);
  //digitalWrite(7, value);
  //digitalWrite(8, value);
  //digitalWrite(9, value);
  //digitalWrite(A1, value);
  //digitalWrite(A0, value);
  //digitalWrite(A3, value);
  //digitalWrite(A2, value);
}

if(note= 94){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  digitalWrite(5, value);
  digitalWrite(6, value);
  //digitalWrite(7, value);
  digitalWrite(8, value);
  digitalWrite(9, value);
  digitalWrite(A1, value);
  digitalWrite(A0, value);
  //digitalWrite(A3, value);
  //digitalWrite(A2, value);
}

if(note= 95){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  digitalWrite(5, value);
  digitalWrite(6, value);
  //digitalWrite(7, value);
  digitalWrite(8, value);
  digitalWrite(9, value);
  //digitalWrite(A1, value);
  //digitalWrite(A0, value);
  //digitalWrite(A3, value);
  //digitalWrite(A2, value);
}

if(note= 96){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  //digitalWrite(5, value);
  //digitalWrite(6, value);
  //digitalWrite(7, value);
  digitalWrite(8, value);
  digitalWrite(9, value);
  //digitalWrite(A1, value);
  //digitalWrite(A0, value);
  //digitalWrite(A3, value);
  //digitalWrite(A2, value);
}

if(note= 97){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  //digitalWrite(5, value);
  digitalWrite(6, value);
  digitalWrite(7, value);
  digitalWrite(8, value);
  //digitalWrite(9, value);
  digitalWrite(A1, value);
  digitalWrite(A0, value);
  digitalWrite(A3, value);
  digitalWrite(A2, value);
}

if(note= 98){
  digitalWrite(A4, value);
  digitalWrite(A5, value);
  digitalWrite(2, value);
  //digitalWrite(3, value);
  digitalWrite(4, value);
  //digitalWrite(5, value);
  //digitalWrite(6, value);
  digitalWrite(7, value);
  digitalWrite(8, value);
  //digitalWrite(9, value);
  digitalWrite(A1, value);
  digitalWrite(A0, value);
  digitalWrite(A3, value);
  //digitalWrite(A2, value);
}


 /*since we don't want to "play" all notes we wait for a note between 36 & 44
 if(note>=36 && note<44){
   byte myPin=note-34; // to get a pinnumber between 2 and 9
   digitalWrite(myPin, value);*/
 }

Offline Wapata

  • Hero Member
  • *****
  • Posts: 909
  • Bonus Pute: 8
J'ai trouvé le problème que j'avais sur mon code, j'avais mis des = à la place des ==. Et ça marche carrément moins bien.
Mes bobines sont des 8ohms et fonctionnement en 12 volts. Ce qui leur donne une conso de 0.150A si mes calculs sont justes.
J'utilise une alimentation AT pour mon montage, et bien qu'elle dit pouvoir offrir 8A sur la ligne 12V, le ventilateur se stop à chaque activation de relais. Je n'avais jamais eu un comportement comme celui ci auparavant... Il va falloir que je surveille ça.

En attendant les réglage mécaniques et l'arrivée d'air, voici le fonctionnement:

Offline pixelk

  • Newbie
  • *
  • Posts: 17
  • Bonus Pute: 0
  • Gni !
Intéressant, vivement la soufflerie ! Les bobines sont un peu bruyantes par contre.
Tu peux avantageusement remplacer les digitalwrite multiple par un PORT (explication en anglais ici : http://tronixstuff.wordpress.com/2011/10/22/tutorial-arduino-port-manipulation/ )

Offline Wapata

  • Hero Member
  • *****
  • Posts: 909
  • Bonus Pute: 8
Pour les bobines, j'ai décidé que si je travaillais suffisamment sur Sketchup pour mener à terme quelques projets, je m'offrais une imprimante 3D pour les réaliser. Et cette flûte passerait de prototype à réalisation plus belle, et plus fiable. J'aurais l'occasion de trouver des moyens d'étouffer le bruit entre temps.

Merci pour ton lien, mais mon dieu que c'est compliqué !!!
Je n'utilise pas un dixième de la mémoire de l'arduino, cela vaut il le coup que je me plonge dans les PORT même si je pige rien à la première lecture ?

Offline Sheika

  • Full Member
  • ***
  • Posts: 199
  • Bonus Pute: 0
  • Si je t'über quand je recule, comment veux-tu ?
C'est totalement con.

J'adore.

Edit : Juste pour le fun j'aimerai bien voir ce que donne la balade du poisson rêve comme ça.

Offline High_Cobra

  • Hero Member
  • *****
  • Posts: 1 285
  • Bonus Pute: 13
    • Gamoover.net
Je pense en effet qu'il y a moyen de vachement simplifier le code avec un petit tableau contenant chaque note...

Faudrait qu'on en cause à l'occaz...

Offline Viewtifulink

  • Snack of Quality
  • Hero Member
  • *****
  • Posts: 1 592
  • Bonus Pute: 71
  • Oui mais, si on danse ?
    • Random Quest
Déjà, un switch(note) serait plus agréable à la vue :P

Offline Wapata

  • Hero Member
  • *****
  • Posts: 909
  • Bonus Pute: 8
Il y a quand même vachement de combinaisons sur une flûte, il faut bien les indiquer qqpart non ?



Et les numéros de 72 à 98 sont, les notes.

Offline dahzz

  • Jr. Member
  • **
  • Posts: 83
  • Bonus Pute: 0
Owi ! Magique ! BP !

Offline Wapata

  • Hero Member
  • *****
  • Posts: 909
  • Bonus Pute: 8
Un cousin m'a demandé de l'aide...
Alors voila:
















Offline averell

  • Snack of Quality
  • Hero Member
  • *****
  • Posts: 3 476
  • Bonus Pute: 177
  • Et de Gaulle en 40, il chargeait sa barre ?
Quel bordel, c'est effrayant. J'aime beaucoup le dernier chiffre de chaque score qui est un unique zéro inamovible. On s'en doute un peu mais de ne voir que 4 roues, je trouve ça amusant  :)

Offline Wapata

  • Hero Member
  • *****
  • Posts: 909
  • Bonus Pute: 8
C'est carrément plus classe de faire 50 points plutôt que 5 en effet. Les espagnols eux, on trois zéros supplémentaires.
Il sont forts ces espagnols.

Offline Overture1928

  • Hero Member
  • *****
  • Posts: 1 312
  • Bonus Pute: 43
  • ^_^'
Juste un mot pour partager ma joie: deux écrans PC réparés après avoir changé 3 condos dans chaque, youpi.
A moi deux Iolair MB24W pour que dalle! (écrans 24 pouces, 16/10 1920x1200, dalles MVA) :D

Offline Fork Bomb

  • Sr. Member
  • ****
  • Posts: 363
  • Bonus Pute: -8
  • Ceci n’est pas un point d’interrogation
    • [ChezWam]
Juste un mot pour partager ma joie: deux écrans PC réparés après avoir changé 3 condos dans chaque, youpi.
A moi deux Iolair MB24W pour que dalle! (écrans 24 pouces, 16/10 1920x1200, dalles MVA) :D
Que dalle… Genre trouvés en déchetterie/à la poubelle ?

Offline Overture1928

  • Hero Member
  • *****
  • Posts: 1 312
  • Bonus Pute: 43
  • ^_^'
Genre mon frère qui les a pris au boulot après qu'ils aient rendu l'âme!