PAC 1. Tractament d’àudio

En aquesta PAC vàrem tractar els processos bàsics de digitalització d’àudio, sobre els quals se’ns va demanar confeccionar un esquema gràfic.

esquema

 

A més de la confecció d’aquest esquema, també se’ns va demanar entregar una taula amb 10 formats d’àudio i escollir-ne un per tractar-lo amb més detall. Vaig triar el format AAC ja que em sembla que és un format que no ha trobat el lloc que es mereix. És una millora considerable del format MP3, però aquest és el que tothom recorda i identifica amb l’àudio digital. Encara que empreses com Apple hagin donat el seu suport explícit a aquest format (que proporciona millor qualitat de so amb una mida dels fitxers més petita) són pocs els que el fan servir. Tal volta, aquest seria un bon exemple de com el màrqueting i la popularitat d’un producte són a vegades més importants que les qualitats intrínseques del producte en sí mateix. En fi, recordeu que el format AAC sona millor que el MP3! 😉

Finalment, per la tercera pregunta vaig programar un sketch en Processing on es sent un so processat amb diferents filtres quan es clica sobre uns globus en moviment. Pels globus vaig fer servir la llibreria g4p (que aporta alguna funcionalitat extra respecte de la més coneguda controlP5) i pel processat del so en temps real vaig fer servir la llibreria Minim. Aquest vídeo mostra com funciona el programa.

Aquest és el pdf amb la pràctica entregada:

amengual_gomila_pac1

[embd]http://graumultimedia.com/wp-content/uploads/Amengual_Gomila_PAC1-1.pdf[/embed]

 

I aquest és el codi de l’sketch:

 

 

import ddf.minim.*; // llibreria de so
import ddf.minim.analysis.*;
import ddf.minim.effects.*;
import ddf.minim.signals.*;
import ddf.minim.spi.*;
import ddf.minim.ugens.*;
import g4p_controls.*; // llibreria GUI
import java.awt.Font; // llibreria per tipografia GUI

Minim minim; // declaració objecte per treballar amb so
AudioOutput output; // declaració sortida d'àudio
FilePlayer so; // només FilePlayer permet UGens
MoogFilter moog; // filtre de tipus analògic

GImageButton blau, verd, taronja, vermell; // declaració botons GUI
GLabel lblOut; // declaració etiqueta GUI

long timer; // declaració variable temporitzador
String[] files; // array temporal per noms imatges botons

float[] decrements = {random(2), random(2), random(2), random(2)}; // valors velocitat globus

void setup() {
  size (800, 600);
  strokeWeight(4); // mida traç forma d'ona
  minim = new Minim(this); // crear objecte per sons
  output = minim.getLineOut(); // crear objecte sortida àudio
  so = new FilePlayer (minim.loadFileStream("globus.mp3")); // crear i carregar so
  moog = new MoogFilter(22000, 0.4); // crear i definir el filtre
  so.patch( moog ).patch( output ); // enrutar el filtre al so i el resultat a la sortida

  files = new String[] { // creació dels botons de la GUI pels globus
    "balloon-blue.png", "balloon-blue.png", "balloon-blue.png"
  };
  blau = new GImageButton(this, width/5-30, 300, files, "balloon-mask.png");

  files = new String[] { 
    "balloon-green.png", "balloon-green.png", "balloon-green.png"
  };
  verd = new GImageButton(this, width/5*2-30, 300, files, "balloon-mask.png");

  files = new String[] { 
    "balloon-orange.png", "balloon-orange.png", "balloon-orange.png"
  };
  taronja = new GImageButton(this, width/5*3-30, 300, files, "balloon-mask.png");

  files = new String[] { 
    "balloon-red.png", "balloon-red.png", "balloon-red.png"
  };
  vermell = new GImageButton(this, width/5*4-30, 300, files, "balloon-mask.png");

  lblOut = new GLabel(this, 120, height/8*7, 500, 50, ""); // creació etiqueta amb text
  lblOut.setFont(new Font("Monospaced", Font.PLAIN, 24));
  lblOut.setTextAlign(GAlign.CENTER, null);
  timer = millis() - so.length(); // el valor del temporitzador prou baix per començar amb un text
}

void draw() {
  background(220, 220, 240); // fons de la pantalla
  dibuixarCartell();
  moureGlobus();
  dibuixarEspectre();
}

void dibuixarEspectre() {
  // codi dels exemples de la llibreria Minim
  for ( int i = 0; i < output.bufferSize() - 1; i++ )
  { // mapejam la amplada de la pantalla a la mida del buffer d'àudio i dibuixem cada punt a l'altura del valor dins el buffer
    float x1  =  map( i, 0, output.bufferSize(), 0, width );
    float x2  =  map( i+1, 0, output.bufferSize(), 0, width );
    float y1=height/2 + output.left.get(i)*height/2;
    float y2=height/2 + output.left.get(i+1)*height/2;
    bezier ( x1, y1, x1, y1, x2, y2, x2, y2); // la corba bezier suavitza els valors intermitjos
  }
}

void dibuixarCartell() {
  if (millis() - timer > so.length()) { // quan acaba el so tornem a posar l'etiqueta inicial
    lblOut.setText("     CLICA SOBRE UN GLOBUS");
    lblOut.setIcon("click.png", 1, GAlign.CENTER, null);
  }
}

void moureGlobus() {
  blau.moveTo(blau.getX(), blau.getY()-decrements[0]); // cada globus puja a la seva velocitat
  if (blau.getY()<-200) { // si abandona la pantalla per dalt, torna abaix
    blau.moveTo(blau.getX(), height);
  }
  verd.moveTo(verd.getX(), verd.getY()-decrements[1]);
  if (verd.getY()<-200) {
    verd.moveTo(verd.getX(), height);
  }
  taronja.moveTo(taronja.getX(), taronja.getY()-decrements[2]);
  if (taronja.getY()<-200) {
    taronja.moveTo(taronja.getX(), height);
  }
  vermell.moveTo(vermell.getX(), vermell.getY()-decrements[3]);
  if (vermell.getY()<-200) {
    vermell.moveTo(vermell.getX(), height);
  }
}

void handleButtonEvents(GImageButton button, GEvent event) {
  if (button == blau) { // el codi corresponent a cada botó
    blau.moveTo(blau.getX(), height+100); // posa el globus abaix
    lblOut.setText("so original"); // sona el so corresponent al globus
    lblOut.setIcon("or.png", 1, GAlign.CENTER, null); // canvia la icona corresponent al filtre
    moog.type = MoogFilter.Type.LP; // canvia el tipus de filtre
    moog.frequency.setLastValue(20000); // un LP a 20000Hz equival a cap filtre
  } else if (button == verd) {
    verd.moveTo(verd.getX(), height+100);
    lblOut.setText("filtre passa-baixos");
    lblOut.setIcon("lp.png", 1, GAlign.CENTER, null);
    moog.type = MoogFilter.Type.LP;
    moog.frequency.setLastValue(200);
  } else if (button == taronja) {
    taronja.moveTo(taronja.getX(), height+100);
    lblOut.setText("filtre passa-alts");
    lblOut.setIcon("hp.png", 1, GAlign.CENTER, null);
    moog.type = MoogFilter.Type.HP;
    moog.frequency.setLastValue(8000);
  } else if (button == vermell) {
    vermell.moveTo(vermell.getX(), height+100);
    lblOut.setText("filtre passa-banda");
    lblOut.setIcon("bp.png", 1, GAlign.CENTER, null);
    moog.type = MoogFilter.Type.BP;
    moog.type = MoogFilter.Type.BP;
    moog.frequency.setLastValue(500);
  }
  so.rewind(); // rebobinem el so a l'inici
  so.play(); // reproduir el so
  timer = millis(); // resetejar temportizador
}

 

 

Leave a Reply