import jass.render.*;
import jass.engine.*;
import jass.generators.*;
import jass.utils.*;
import java.util.*;
import java.awt.*;
/**
Filter something through a Tube filter
*/
public class VTDemoW extends Thread {
public static void main (String args[]) throws Exception {
float srate = 44100.f;
int bufferSize = 16;
int bufferSizeJavaSound = 1024*8;
int nchannels = 1;
int nTubeSections;
if(args.length != 3) {
System.out.println("Usage: java VTDemoW ncontrolpoints length srate");
return;
}
nTubeSections = Integer.parseInt(args[0]); // only for control
double tubeLength = Double.parseDouble(args[1]);
srate = (float) Double.parseDouble(args[2]);
// TubeModel will decide how many segments are needed and interpolate
final TubeModel tm = new TubeModel(nTubeSections);
tm.setLength(tubeLength);
int nbuttons = 4;
final int nAuxSliders = 4+3;
int nSliders = nTubeSections+nAuxSliders;
String[] names = new String[nSliders];
double[] val = new double[nSliders];
double[] min = new double[nSliders];
double[] max = new double[nSliders];
names[0] = "lip M ";
val[0] = 1; min[0] = 0.1; max[0] = 100;
names[1] = "lip damp";
val[1] = .3; min[1] = 0.0; max[1] = 10;
names[2] = "wall damp";
val[2] = 1; min[2] = 0.0; max[2] = 10;
names[3] = "pitch ";
val[3] = 80; min[3] = 20; max[3] = 1000;
names[4] = "openQuot ";
val[4] = .5; min[4] = 0.001; max[4] = 1;
names[5] = "speedQuot ";
val[5] = 4; min[5] = 0.1; max[5] = 10;
names[6] = "length ";
val[6] = tubeLength; min[6] = tubeLength/10; max[6] = tubeLength*1.8;
double minA = 0;
double maxA = 20;
for(int k=nAuxSliders;k<nSliders;k++) {
names[k] = "R("+new Integer(k-nAuxSliders).toString() + ") ";
val[k] = 5;
min[k] = minA;
max[k] = maxA;
double r=Math.sqrt(val[k]/Math.PI);
tm.setRadius(k-nAuxSliders,r);
}
final SourcePlayer player = new SourcePlayer(bufferSize,bufferSizeJavaSound,srate);
player.setUseNativeSound(false);
player.setNumRtAudioBuffersNative(4);
double c= 340; // vel. of sound
double minLen = .10;
final RightLoadedWebsterTube filter = new RightLoadedWebsterTube(srate,tm,minLen);
final FilterContainer filterContainer = new FilterContainer(srate,bufferSize,filter);
final GlottalWave source = new GlottalWave(srate,bufferSize);
filterContainer.addSource(source);
player.addSource(filterContainer);
filter.changeTubeModel();
Controller a_controlPanel = new Controller(new java.awt.Frame ("DemoFilter"),
false,val.length,nbuttons) {
boolean muted=false;
public void onButton(int k) {
switch(k) {
case 0:
player.resetAGC();
filter.reset();
break;
case 1: {
FileDialog fd = new FileDialog(new Frame(),"Save");
fd.setMode(FileDialog.SAVE);
fd.setVisible(true);
saveToFile(fd.getFile());
}
break;
case 2: {
FileDialog fd = new FileDialog(new Frame(),"Load");
fd.setMode(FileDialog.LOAD);
fd.setVisible(true);
loadFromFile(fd.getFile());
}
break;
case 3:
muted = !muted;
player.setMute(muted);
player.resetAGC();
break;
}
}
public void onSlider(int k) {
switch(k) {
case 0:
filter.M = this.val[k];
break;
case 1:
filter.d = this.val[k];
break;
case 2:
filter.dWall = this.val[k];
break;
case 3:
source.setFrequency((float)this.val[k]);
break;
case 4:
source.setOpenQuotient((float)this.val[k]);
break;
case 5:
source.setSpeedQuotient((float)this.val[k]);
break;
case 6:
tm.setLength((double)this.val[k]);
filter.changeTubeModel();
break;
default:
double r=Math.sqrt(val[k]);
tm.setRadius(k-nAuxSliders,r);
filter.changeTubeModel();
break;
}
}
};
a_controlPanel.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
System.out.println("Close handler called");
player.stopPlaying();
try{
//sleep(500);
} catch(Exception e3) {
}
System.exit(0);
}
});
a_controlPanel.setSliders(val,min,max,names);
a_controlPanel.setButtonNames (new String[] {"Reset","Save","Load","(Un)mute"});
a_controlPanel.setVisible(true);
player.start();
/*
int sleepms = 50;
double deltaa=.1;
while(true) {
sleep(sleepms);
for(int i=0;i<nTubeSections;i++) {
double da = deltaa*(2*Math.random()-1);
double r0 = tm.getRadius(i);
double ar0 = Math.PI*r0*r0;
double ar1 = ar0 + da;
if(ar1<minA) {
ar1 = ar0 - da;
} else if(ar1>maxA) {
ar1 = ar0 - da;
}
val[i+nAuxSliders] = ar1;
}
a_controlPanel.setSliders(val,min,max,names);
filter.changeTubeModel();
}
*/
}
}