Table des matières

Désordre musigraphique

Description

Désordre Musigraphique est une installation visuelle et sonore qui propose une expérience de l'ordre et du désordre en musique et en graphisme.

Matériel

Code

Arduino (Exemple : SerialCallResponse)

int firstSensor = 0;    // first analog sensor
int secondSensor = 0;   // second analog sensor
int thirdSensor = 0;    // digital sensor
int inByte = 0;         // incoming serial byte

void setup()
{
  // start serial port at 9600 bps:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  pinMode(2, INPUT);   // digital sensor is on digital pin 2
  establishContact();  // send a byte to establish contact until receiver responds 
}

void loop()
{
  // if we get a valid byte, read analog ins:
  if (Serial.available() > 0) {
    // get incoming byte:
    inByte = Serial.read();
    // read first analog input, divide by 4 to make the range 0-255:
    firstSensor = analogRead(A0)/4;
    // delay 10ms to let the ADC recover:
    delay(10);
    // read second analog input, divide by 4 to make the range 0-255:
    secondSensor = analogRead(1)/4;
    // read  switch, map it to 0 or 255L
    thirdSensor = map(digitalRead(2), 0, 1, 0, 255);  
    // send sensor values:
    Serial.write(firstSensor);
    Serial.write(secondSensor);
    Serial.write(thirdSensor);               
  }
}

void establishContact() {
  while (Serial.available() <= 0) {
    Serial.print('A');   // send a capital A
    delay(300);
  }
}

Processing

//importer librairie
import processing.serial.*;

import arb.soundcipher.*;

//créer des instance de l'objet SoundCipher
SoundCipher sc = new SoundCipher(this);
SoundCipher sc2 = new SoundCipher(this);
SoundCipher sc3 = new SoundCipher(this);

//_______initialisation des variables
boolean crasse = false ;
boolean modu = false ;
//créer une liste qui correspond à une série de hauteur de note MIDI
float[] pitchSet = {57, 60, 60, 60, 62, 64, 67, 67, 69, 72, 72, 72, 74, 76, 79};
float setSize = pitchSet.length;
float keyRoot = 0;
float density = 0.8;

int bgcolor;			     // Background color
int fgcolor;			     // Fill color
Serial myPort;                       //  serial port
int[] serialInArray = new int[3];    // cases dans lequelle on met ce qui est reçu
int serialCount = 0;                 // compte du nombre de byte reçu
int xpos, ypos;	//coordonée de départ
boolean firstContact = false;        // Whether we've heard from the microcontroller
//definition des variables
float x;
float y;
float a=0;  //angle de départ
float b=0;  //angle de départ
float l=10; //largeur elipse de départ
float h=10; //hauteur elipse depart


void setup() {
    //fond
  size(1080, 700);
  background(250, 250, 250);
    colorMode(HSB); // mode couleur TSL (teinte,saturation,brillance)
   smooth();
   noStroke(); //sans contour

  frameRate(8);
  
  sc.instrument(11); // l'objet sc doit jouer l'instrument 11 (vibraphone)
 sc2.instrument(88);// l'objet sc1 doit jouer l'instrument 88 (fantasia)
  sc3.instrument(98);//l'objet sc2 doit jouer l'instrument 98 (crystal)




  // Print a list of the serial ports, for debugging purposes:
  printArray(Serial.list());

  // I know that the first port in the serial list on my mac
  // is always my  FTDI adaptor, so I open Serial.list()[0].
  // On Windows machines, this generally opens COM1.
  // Open whatever port is the one you're using.
  String portName = Serial.list()[0];
  myPort = new Serial(this, portName, 9600);
}

void draw() {
if (keyPressed == true){ //si touche clavier pressé
   crasse = true; //alors booléen crasse est vrai
   }
   
   if (mousePressed == true) { //si touche souris pressé
     
      sc3.playNote(xpos/2, random(90)+30, random(20)/10 + 0.2);//alors sc3 joue des notes indépendentes du pitchSet
          
          translate(width/2,height/2); //alors le centre du quadrilataire exécute 
rotate(b); //une rotation qui augmente de 0.4 à chaque nouveau frame de draw
float r=ypos*5; //définir une variable r incluant le potentiomètreY
fill(r,random(210),255); //colorer le quadrilataire en gérant la teinte grâce à r(potentiomètreY)
float f= random(xpos/10); //définir une variable r incluant le potentiomètreX
      quad(10,35,f,10*f,75,80,30*f,65);//forme du quadrilataire à 4 sommets dont certaine coordonnée son gérée par potentiomètreX 
      b+=0.4; // incrémentation de l'angle de rotation 
   }
//___________haronie________________
     
else {

  if ((random(1) < density) && (crasse==true)) { // si le booléen crasse et en position vraie
float[] pitches = {pitchSet[(int)ypos/100]+keyRoot-12, pitchSet[(int)random(setSize)]-12}; //définition d'une liste faisant varier la hauteur de note
//sc joue un ensemble de note dont la hauteur est définie par la liste pitchSet et la valeur du potentiomètreX
  sc.playNote(pitchSet[(int)xpos/100]+keyRoot, random(90)+30, random(20)/10 + 0.2); // la fonction playnote(double pitch, double dynamic, double duration)
  
  sc2.playChord(pitches, random(50)+30, 4.0); // sc2 joue des accord en fonction de la liste pitches qui est dépendante de la liste pitchSet

  }

  
//frameRate(50);//cadence du draw
if(crasse == true) { //si le booleen crasse est en position vraie
translate(width/2,height/2);//alors effectuer une traslation du centre du cercle
rotate(a);//effectuer une rotation don l'angle s'incrémentera de 0.1 à chaque rafraîchissement du draw
  
   float r=ypos;
   if (r<30){ //taille supèrieure limite
r = 50;
   }
      fill(r,random(210),random(200)); //colorer le cercle en fonction du potentiomètre ypos
float taille = xpos ; //définir une variable taille qui est commandé par le potentionmètre X
/*if (taille > 350){ //taille supèrieure limite
taille = 350;
}
if (taille < 50){ //taille infèrieure limite
taille = 50;
}*/
ellipse(300, 0, taille, taille);// définir la taille et la position du cercle

//incrémentation angle de rotation
a+=0.1;
}
}

}
void serialEvent(Serial myPort) {
  // read a byte from the serial port:
  int inByte = myPort.read();
  // if this is the first byte received, and it's an A,
  // clear the serial buffer and note that you've
  // had first contact from the microcontroller. 
  // Otherwise, add the incoming byte to the array:
  if (firstContact == false) {
    if (inByte == 'A') { 
      myPort.clear();          // clear the serial port buffer
      firstContact = true;     // you've had first contact from the microcontroller
      myPort.write('A');       // ask for more
    } 
  } 
  else {
    // Add the latest byte from the serial port to array:
    serialInArray[serialCount] = inByte;
    serialCount++;

    // If we have 3 bytes:
    if (serialCount > 2 ) {
      xpos = serialInArray[0];
      ypos = serialInArray[1];
      fgcolor = serialInArray[2];

      // print the values (for debugging purposes only):
      println(xpos + "\t" + ypos + "\t" + fgcolor);

      // Send a capital A to request new sensor readings:
      myPort.write('A');
      // Reset serialCount:
      serialCount = 0;
    }
  }
}

présentation visuelle du code

slide présentation

problèmes rencontrés

Photos

(bientôt)

Schémas

montage arduino potentiomètres

montage arduino capteurs flexions

Intention

Recherches

Liens/Références

http://www.nathangauthier.com/projets-typography/ornithologie


TR: des images, des images…