//import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
import jass.generators.*;
import jass.render.*;
import jass.engine.*;
public class Demo2 extends Thread implements MouseMotionListener, MousePositionServer {
/** component over which mouse events are gathered */
Component component;
/** mouse position */
int current_x, current_y,old_x,old_y;
private double oldTime;
int[] mySize;
double mouseSamplingRate; // estimated
int windowHeight = 200;
Butter2LowFilter butterFilter; // filter mouse
// JASS stuff
int buffersize;
boolean useNative = true;
int bufferSizeJavaSound = 8*1024;
int numRtAudioBuffersNative;
float srate = 44100;
SourcePlayer sourcePlayer;
MousedGroove mousedGroove;
Demo2(String[] args) {
int horPixels = Integer.parseInt(args[0]);
Frame frame = new Frame ();
this.component = frame;
mySize = new int[] {horPixels,windowHeight};
frame.setSize(new Dimension(mySize[0],mySize[1]));
frame.setResizable(false);
// to center (workaround from GNOME bug which misplaces window)
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.out.println("Close handler called");
sourcePlayer.stopPlaying();
try{
sleep(500);
} catch(Exception e3) {
}
System.exit(0);
}
});
component.addMouseMotionListener(this);
buffersize = Integer.parseInt(args[1]);
numRtAudioBuffersNative = 512/buffersize;
mouseSamplingRate = srate/buffersize;
butterFilter = new Butter2LowFilter((float)mouseSamplingRate);
float cutOffFreqMouse = Float.parseFloat(args[2]);
butterFilter.setCutoffFrequency(cutOffFreqMouse);
initAudio(args);
}
public static void main (String[] args) {
if(args.length != 4) {
System.out.println("Usage: java Demo2 horpixels buffersize mouseFreqLowPassCutoff ../data/hello.wav");
return;
}
new Demo2(args);
}
private void initAudio(String[] args) {
sourcePlayer = new SourcePlayer(buffersize,bufferSizeJavaSound,srate);
sourcePlayer.setUseNativeSound(useNative);
sourcePlayer.setNumRtAudioBuffersNative(numRtAudioBuffersNative);
try {
mousedGroove = new MousedGroove(srate,buffersize,args[3]);
} catch(Exception e) {
System.out.println("error MouseGroove create:"+e);
}
mousedGroove.setMousePositionServer(this);
mousedGroove.setXSize(mySize[0]);
try {
sourcePlayer.addSource(mousedGroove);
} catch(Exception e) {}
sourcePlayer.start();
float[] audioBuffer = mousedGroove.getGrooveBuffer();
Graphics g = component.getGraphics();
g.setColor(Color.red);
int windSize = 128; // average audio
float maxval = 0; // max square of audio
float val = 0;
if(audioBuffer != null) { // is null for streaming audio file
for(int i=0;i<audioBuffer.length-windSize;i++) {
val = 0;
for(int k=0;k<windSize;k++) {
val += audioBuffer[i+k] * audioBuffer[i+k];
}
val /= windSize;
if(val > maxval) {
maxval = val;
}
}
for(int ix=0;ix<mySize[0];ix++) {
int bufferIndex = (int)(((audioBuffer.length - windSize)* ((double)ix ))/mySize[0]);
val = 0;
for(int k=0;k<windSize;k++) {
val += audioBuffer[bufferIndex+k] * audioBuffer[bufferIndex+k];
}
val /= windSize;
int iy = (int)(.6*(val/maxval) * (mySize[1]-1));
g.fillRect(ix,iy,1,iy);
}
}
}
// implement MousePositionServer
int mouseQueueSize = 2;
float[] mousePos = new float[mouseQueueSize];
Rectangle rect = null;
public double getMouseXPosition() {
mousePos[0] = (float)old_x;
mousePos[1] = (float)current_x;
double oldx = mousePos[1];
int offset = 0;
butterFilter.filter(mousePos,mousePos,mouseQueueSize,offset);
//System.out.println(oldx+" "+mousePos[1]);
Graphics g = component.getGraphics();
int thickness = 1;
g.setXORMode(Color.white);
if(rect != null) {
g.fillOval(rect.x,rect.y,rect.width,rect.height);
} else {
rect = new Rectangle();
}
rect.x = (int)mousePos[1]-thickness/2;
rect.y = 0;
rect.width = thickness;
rect.height= mySize[1];
g.fillOval(rect.x,rect.y,rect.width,rect.height);
return mousePos[1];
}
///implement MouseMotionListener
public void mouseMoved(MouseEvent e) {
old_x = current_x;
old_y = current_y;
current_x = e.getX();
current_y = e.getY();
//System.out.println("p1: ("+dt+":"+dx_cm+")=("+old_red+","+current_red+")");
//System.out.println("(t,v)= ("+time+","+vel+")");
}
public void mouseDragged(MouseEvent e) {}
}