We closed this forum 18 June 2010. It has served us well since 2005 as the ALPHA forum did before it from 2002 to 2005. New discussions are ongoing at the new URL http://forum.processing.org. You'll need to sign up and get a new user account. We're sorry about that inconvenience, but we think it's better in the long run. The content on this forum will remain online.
Page Index Toggle Pages: 1
Harmonograph project (Read 532 times)
Harmonograph project
Mar 20th, 2009, 10:20pm
 
Hey guys!

Im quite new to this processing malarky. I have been experimenting with a number of things. I am doing a project of going from gesture movement to sound to geometry using interactivity. Right now I am concentrating on the sound to geometry stage of it. I am using the mathematics of Lissajous curves(based on frequency, amplitude and phases) and I have managed to make a 2D version. I am trying to use OPENGL to  make it more appealing and 3dimensional. Can anyone help? I am not used to Open GL but here is my 2D version of the code. Please note right now I have been using Controllers with control P5 To manipulate the curve, but i also have a version using Arduino but since not everyone might have an arduino board it is easier to show this one.

/* This code is how to manipulate Lissajous or Bowditch curves with the use of controllers
The mathematics behind it is can be put in the following parametric equation

x(t) = a*(sin(w1(t) + THETA1))
y(t) = b*(sin(w2(t) + THETA2));

Time t is a parameter.
x(t) and y(t) are the moving points in the co-ordinate system
a and b are the amplitudes of those moving points along the x and Y axis
w1 and w2 are the angular frequencys along the x axis and y axis
THETA1 and THETA2 are the initial phases of the motions along the x and y axis */

import controlP5.*;      // allows one to put in controllers in this case knobs

ControlP5 gui;

// variables

public int iterations = 9000;
public float xRatio = 3;      // X frequency
public float xPhase = 0;      // X Phase
public float yRatio = 2;      // Y frequency
public float yPhase = 0;      // Y phase
//public float spin = 3;
//public float spinPhase = 0;
//public float decay = 2/10000;

float deg2rad = PI/60;
float cx, cy, x, y;

void setup(){
 size (800, 800);
 cx = (width/2);      // helps to get the amplitude a, it also positions the curve on the sheet
 cy = (height / 4);     // helps to get the amplitude b, it also positions the curve on the sheet
 
gui = new ControlP5(this);
gui.addKnob("xRatio",0, 1, ((width/2)-120), 650, 60);      //(Name, X position on knob, Y position on knob, absolute X co-ord, absolute Y co-ord, diameter)
gui.addKnob("xPhase", 0, 1, ((width/2)-40), 650, 60);
gui.addKnob("yRatio", 0, 1, ((width/2)+40), 650, 60);
gui.addKnob("yPhase", 0, 1, ((width/2)+120), 650, 60);
// gui.addKnob("spin", 0 , 1, 430, 650, 60);
// gui.addKnob("spinPhase", 0, 1, 500, 650, 60);
}


// The above will only draw the controllers but will not allow you to move them
// therefore one needs the gui.draw; command to allow one to manipulate the values

void draw()
{
 background(0);    //Black background
 gui.draw();      // Allows one to manipulate the controller
 translate(cx, cy);    // Positions the curve
 beginShape();
 for (int i=0;i < iterations; i++) {    
 x = (cx-50)*(sin(xRatio * i * deg2rad + xPhase));    // + cx*(sin(spin*i*deg2rad + spinPhase);
 y = (cy-50)*(sin(yRatio * i * deg2rad + yPhase));    // the reason for -50 in the amplitude is so it will not touch the edge of the screen
  float r = mouseX;               // Random Red value
  float g = mouseY;               // Random Blue value
  float b = mouseX*mouseY;        // Random Green value
   stroke(r, g, b);
   strokeWeight(1);
   noFill();
   curveVertex(x, y);
 }
 endShape();  
}

Page Index Toggle Pages: 1