//click on the note numbers to get the respective frequency
float hertz;
int noteNumber;//variable for the midi note
int xspacing = 5; // How far apart should each horizontal location be spaced
int w; // Width of entire wave
int theta = 0; // Start angle at 0
float ampl; // Height of wave
float period = 100.0; // How many pixels before the wave repeats
float dx; // Value for incrementing X, a function of period and xspacing
float[] yvalues; // Using an array to store height values for the wave
void setup() {
size(640, 360);
w = width+16;
dx = (TWO_PI / period) * xspacing;
yvalues = new float[w/xspacing];
}
void draw() {
background(0,0,255);
float startPointX = width/2; //define the X position of the start point in the center of the screen;
float startPointY = height/2; //define the Y position of the start point in the center of the screen;
float endPointX=mouseX; //define the X position of the end point that will follow the mouse;
float endPointY=mouseY; //define the Y position of the end point that will follow the mouse;
float deltaX=mouseX-width/2; //create a variable with the delta of the x component of the ending - start point
float deltaY=mouseY-height/2; //create a variable with the delta of the y component of the ending - start point
float angleInRadians=atan2(deltaY,deltaX); //get the angle in radians between them with atan2()
PVector[]points=new PVector[100]; //create an array of vectors that will store the flat positions of points that will create the graph with the number of elements equal to the size of the of the arraylist
PVector[]amplitude = new PVector[100]; //create an array of vectors that will store the amplitude of the mapped mouse with the number of elements equal to the size of the of the arraylist
//initalize each vector with x=0 and y=0 values;
for(int a=0; a<100-1; a++){
points[a] = new PVector(0,0,0);
amplitude[a] = new PVector(0,0,0);
}
//here the magic begins
//we will create a line made of vertex, and each vertex will receive the values of the vectors
textSize(28);
fill(255);
text("60",30,40);
text("69",width-60,40);
text("100",30,height-40);
text("127",width-60,height-40);
text("hertz "+hertz,width-300,height/2+100);
if(mousePressed){
if((mouseX>10&&mouseX<50) && (mouseY>10&&mouseY<60)){
noteNumber=60;
}
if((mouseX>width-80&&mouseX<width) && (mouseY>10&&mouseY<60)){
noteNumber=69;
}
if((mouseX>10&&mouseX<50) && (mouseY>height-70&&mouseY<height)){
noteNumber=100;
}
if((mouseX>width-80&&mouseX<width) && (mouseY>height-70&&mouseY<height)){
noteNumber=127;
}
}
println("noteNumber "+ noteNumber);
//convert midi to frequency
hertz = ( 440*pow(2,((noteNumber-69)/12.0))) ;
println("hertz "+ hertz);
ampl=20;//aplitude of 20px
// For every x value, calculate a y value with sine function
for (int i = 0; i < 100-1; i++) {
theta += int(hertz);
theta+=int(dx);
if(theta%1000==0){//reset theta
theta=0;
}
yvalues[i] = sin(theta)*ampl;
println(theta);
}
beginShape();
noFill(); //no fill
stroke(255); // white stroke
strokeWeight(2); //2 px stroke
for(int i = 0; i<100-1;i++){
float X=lerp(startPointX,endPointX,i/float(99)); // create a linear interpolation between the start and the end point of the X component, and the amount of interpolation will cover the entire interval;
float Y=lerp(startPointY,endPointY,i/float(99)); // create a linear interpolation between the start and the end point of the Y component, and the amount of interpolation will cover the entire interval;
amplitude[i].set(0,(yvalues[i]),0); //set each vertex of the aray with the amplitude of the graph, acquiring the data of the buffer
rotate2D(amplitude[i],angleInRadians); //rotate the vector of amplitude acordingly to the angle between the start and end points
points[i].set(X,Y,0); //set each vertex of the array with the correspondent value of the interpolation, creating a flat line
points[i].add(amplitude[i]); //add the amplitude vector to the flat line of vectors, creating a 2D graph
vertex (points[i].x,points[i].y); //draw each vertex with the values (coordinates) of the vertex
}
endShape();
//draw the ellipses with the positions of the startpoint and endpoint
float diam=40;
fill(255);
ellipse(startPointX,startPointY,diam,diam);
ellipse(endPointX,endPointY,diam,diam);
}
//A function that rotates the vector
void rotate2D(PVector v, float angle) {
// What's the magnitude?
float m = v.mag();
// What's the angle?
float a = v.heading2D();
// Change the angle
a += angle;
// Polar to cartesian for the new xy components
v.x = m * cos(a);
v.y = m * sin(a);
}
Thursday, November 8, 2012
Midi to waveform representation in Processing
Subscribe to:
Post Comments (Atom)

Such a Nice post. Thanks for Awesome tips Keep it up
ReplyDeleterawdigger-crack
screenfloat-crack
diskdigger-crack
Great set of tips from the master himself. Excellent ideas. Thanks for Awesome tips Keep it up
ReplyDeleterawdigger-Free Download
So nice I am enjoying for that post as for u latest version of this Security tool Available
ReplyDeletewebcammax-crack
mirillis-action-crack
rawdigger-crack