Vos actions : Créer un document, voir la page générale.

Cultures numériques

Cours de Bachelor 1

Lire les données binaires d’un fichier

Ce script se nourrit de n’importe quel fichier dont il lit les données binaires octet par octet. Il produit sur cette base une onde, que l’on peut moduler en se basant sur tous les paramètres disponibles des oscilloscopes (ici dans la librairie minim).

Si on lit un fichier .txt, on retrouvera dans les données binaires les lettres (avec des artefacts dès que les caractères sont accentués).

Le résultat de la lecture des octets est un chiffre en 0 et 255. On le transformer en longueur d’onde, ou en note, ou autre chose, à partir de là.

Le code peut être directement copié-collé dans Processing, mais il faut donner un fichier à lire pour le script - dans la ligne 2 de ce code - ou il signalera une erreur... Ne pas oublier non plus de charger la librairie minim.

// mettre le nom du texte dans la ligne qui suit
String source="texte.txt"; // un texte

byte b[];
int a;
int parcoureur=0;
int vitesse = 100; // la vitesse entre deux beat en millieme de secondes

int trigger;

// import everything necessary to make sound.
import ddf.minim.*;
import ddf.minim.ugens.*;

// create all of the variables that will need to be accessed in
// more than one methods (setup(), draw(), stop()).
Minim minim;
AudioOutput out;

Oscil   wave;
Midi2Hz midi;

// setup is run once at the beginning
void setup() {
 size(512, 400);

// charger le fichier
 b = loadBytes(source);

 // initialize the minim and out objects
 minim = new Minim(this);
 out   = minim.getLineOut();

 // the frequency argument is not actually important here
 // because we will be patching in Midi2Hz
 // wave = new Oscil( 300, 0.6f, Waves.TRIANGLE );
 // wave = new Oscil( 300, 0.6f, Waves.SQUARE );
 wave = new Oscil( 300, 0.6f, Waves.SINE );
 //wave = new Oscil( 300, 0.6f, Waves.SAW );
 // make our midi converter
 midi = new Midi2Hz( 50 );
 midi.patch( wave.frequency );
 wave.patch( out );
}

// draw is run many times
void draw() {
 if (millis() > trigger) {
   a = b[parcoureur] & 0xff;  // Print each value, from 0 to 255
   if (char(a)=='.') {
     println("point");
   }
   midi.setMidiNoteIn( a );
   parcoureur++;
   if (parcoureur >= b.length) {
     parcoureur=0;
     println("boucle");
   }

   // erase the window to brown
   background( 64, 32, 0 );
   // draw using a beige stroke
   stroke( 255, 238, 192 );
   // draw the waveforms
   trigger = millis() + vitesse;
 }
 text(char(a), width/2,100);
 
  for ( int i = 0; i < out.bufferSize() - 1; i++ ) {
   // find the x position of each buffer value
   float x1  =  map( i, 0, out.bufferSize(), 0, width );
   float x2  =  map( i+1, 0, out.bufferSize(), 0, width );
   // draw a line from one buffer position to the next for both channels
   line( x1, 250 + out.left.get(i)*50, x2, 250 + out.left.get(i+1)*50);
   line( x1, 350 + out.right.get(i)*50, x2, 350 + out.right.get(i+1)*50);
 }
}
Par Stéphane Noël, 19 novembre 2016