Osciloscopio laser II (Figuras de Lissajous)

21 de septiembre de 2008 por cogollo

Ahora que tengo una fuente de alimentación apropiada para el puntero láser de mi osciloscopio y ya he cogido algo de confianza usando Processing no podía pasar mucho tiempo antes de ponerme a fardar.

Para empezar poco a poco he pensado que podríamos hacer unas buenas, viejas, figuras de Lissajous. Son fáciles de implementar, agradables a la vista y nunca pasan de moda.


Proyectando sobre la pared del salón

A continuación te pego el código fuente que mueve esto. Es bastante sencillo y lo he comentado a conciencia, así que espero que, aparte de masajear mi ego, tenga algún valor didáctico. Considérate libre de retorcerlo y mutilarlo como te venga en gana. Tendrás que bajarte la librería de sonido Ess r2 para que funcione, pero por lo demás solo tienes que pulsar play y sentarte a disfrutar.

//Lissajous.pde
//Programa para generar figuras de Lissajous en movimiento
//en un osciloscopio conectado a la salida de audio del PC.
 
import krister.Ess.*;
 
//Este objeto se encargará de manejar el canal izquierdo
AudioStream chanel1;
//Idem con el canal derecho
AudioStream chanel2;
//Onda sinusoidal asociada al canal izquierdo
SineWave Wave1;
//Onda sinusoidal asociada al canal derecho
SineWave Wave2;
 
//Relacion entre la frecuencia de Wave1 y Wave2
int bucles=0;
//Contador con el numero de frames que llevamos
int cont = 0;
 
void setup() {
 
  // Inicializa Ess (la libreria de audio)
  Ess.start(this);
 
  //Creamos dos nuevos streams de audio
  chanel1=new AudioStream();
  chanel2=new AudioStream();
 
  // y dos nuevas ondas a 60 y 61 Hz y rellenamos el buffer de cada
  //canal con una de ellas-
  Wave1=new SineWave(61 ,1);
  Wave1.generate(chanel1);
  Wave2=new SineWave(60,1);
  Wave2.generate(chanel2);
 
  //Comienza a reproducir las ondas a traves de la salida de audio
  chanel1.start();
  chanel2.start();
 
  //Estableciendo el pan del canal uno a 0.3333 conseguimos que
  //su sonido solo salga por el canal izquierdo.
  chanel1.pan(0.3333);
  //Para el canal2 el -0.3333 hace que el sonido salga por el canal derecho.
  chanel2.pan(-0.3333);
}
 
void draw()
{
  cont++;
 
  if(cont > 300)       //Cada 300 frames (10 sg) disminuimos
  {                    //la frecuencia de Wave2 para obtener la
    cont = 0;          // siguiente figura
    bucles++;
    if(bucles >2)      //Cuando hemos hecho esto tres veces volvemos a empezar
      bucles = 0;
    //La nueva frecuewncia sale de dividir por un entero la frecuencia inicial
    //menos un Hz. Ese Hz de diferencia es lo que hace que las figuras giren.
    Wave2.frequency = (Wave1.frequency-1)/(bucles+1);
    //Para un mismo volumen la amplitud de la onda es inversamente proporcional
    //al cuadrado de la frecuencia. Así que para mantener las proporciones de
    //la figura tenemos que cambiar el volumen de Wave2 en consecuencia
    Wave2.volume = Wave1.volume / ((bucles+1)*(bucles+1));
  }
}
 
//Esta funcion se llama automagicamente cuando hay que rellenar algún buffer de audio
void audioStreamWrite(AudioStream theStream) {
  SineWave myWave;
  if(theStream==chanel1){
    myWave=Wave1;
  }
  else{
    myWave= Wave2;
  }
 
  //Genera más onda de sonido
  myWave.generate(theStream);
 
  // Ajustamos la fase para que no se produzcan saltos
  myWave.phase+=theStream.size;
  myWave.phase%=theStream.sampleRate;
}
 
//Al cerrar, para Ess
public void stop() {
  Ess.stop();
  super.stop();
}

Publicado en Nuestros hacks | 4 Comentarios »


4 comentarios


  1. Pax Dice:

    hola, he visto videos de curvas de lissajous en internet y hay unos muy buenos, ponen letras en un osciloscopio, letras ke giran, etc… sabes como puedo hacerlo?? solo me interesa tener el programa y tal vez un archivo de muestra para poder entender como lo crean y cambiarle de poco en poco hasta formar uno diferente mio, te agradezco si me sacas de mi duda


  2. cogollo Dice:

    Pax, supongo que te refieres a esto:

    http://www.youtube.com/watch?v=s1eNjUgaB-g&eurl=http://waxy.org/2008/02/oscilloscope_fu/

    Básicamente, funciona conectando el osciloscopio en modo x-y a la salida de sonido del ordenador, de modo que el canal derecho controle la posición x del punto luminoso y el canal izquierdo la posición y. El principio es el mismo que el que usamos nosotros para manejar nuestro osciloscópio laser, pero con formas de onda mucho más complejas.
    El creador del video también ha colgado el archivo wav que ha utilizado.
    http://mirror.kapsi.fi/koodaa.mine.nu/tvt/youscope-wave.wav
    Para ver esos efectos solo tienes que reproducir el archivo y conectar tu osciloscópio a la toma de auriculares.
    Necesitarás un osciloscópio “de verdad” ,eso sí, porque el nuestro, como tiene que mover físicamente los espejos, no puede responder con la rapidez suficiente.


  3. Andres Dice:

    cogollo y que me cuentas de este video, creo q necesitariamos de la ayuda de un pic y un timekiper, que medices de este miralo.
    http://www.youtube.com/watch?v=6wjl1uMBNkc&feature=player_embedded


  4. Iván Dice:

    Primero que nada enorabuena tardias por este proyecto, yo lo descubrí hace poco haciendo una recopilación de reciclajes de piezas de ordenador para mi blog.

    Bueno, resulta que me ha dado por construirme un osciloscopio igualito excepto por el amplificador, yo utilizo una mini cadena.

    Este es el resultado de las primeras pruebas con un wav q encontré por la red y luego con un programa de edición de musica llamado Fruity Loops

    http://www.youtube.com/watch?v=uil5rVvgE5o

    Me descargué el processing y la librería Ess r2 y la añadí a la carpeta correspondiente, el caso es que cuando ejecuto tu programa me da error en esta linea…

    if(cont > 300) //Cada 300 frames (10 sg) disminuimos

    Me dice que tal vez me falte un parentesis, pero no veo nada fuera de lo común…

    ¿Puede tener algo que ver la libreria?

    Un Saludo