import jass.render.*;
import jass.engine.*;
import jass.generators.*;
import java.net.*;
/**
Play some looping wav file in chorus.
@author Kees van den Doel (kvdoel@cs.ubc.ca)
*/
public class PlayWavApplet extends AppletController {
SourcePlayer player;
LoopBuffer[] loopbuffer;
Mixer mixer;
int nvoices = 5;
boolean isOn = false;
float speed = 1;
String wavfile = "../data/hello.wav";
public void setNSliders() {
nsliders = nvoices*2;
}
public void setNButtons() {
nbuttons = 1;
}
public void init() {
super.init();
wavfile = getParameter("wavfile");
}
public void start() {
float srate = 44100.f;
int bufferSize = 128*4;
int bufferSizeJavaSound = 8*1024;
loopbuffer = new LoopBuffer[nvoices];
URL codebase = getCodeBase();
URL wavurl = null;
try {
wavurl = new URL(codebase,wavfile);
} catch(MalformedURLException e) {
System.out.println(e+" Malformed URL: " +codebase+" "+ wavfile);
}
loopbuffer[0] = new LoopBuffer(srate,bufferSize,wavurl);
float[] wavArray = loopbuffer[0].getLoopBuffer();
for(int i=1;i < nvoices;i++) {
loopbuffer[i] = new LoopBuffer(srate,bufferSize,wavArray);
}
mixer = new Mixer(bufferSize,nvoices);
for(int i=0;i < nvoices;i++) {
mixer.setGain(i,1);
}
player = new SourcePlayer(bufferSize,bufferSizeJavaSound,srate);
try {
player.addSource(mixer);
for(int i=0;i < nvoices;i++) {
mixer.addSource(loopbuffer[i]);
}
} catch(SinkIsFullException e) {
}
String[] names = new String[2*nvoices];
double[] val = new double[2*nvoices];
double[] min = new double[2*nvoices];
double[] max = new double[2*nvoices];
for(int i=0;i < nvoices;i++) {
names[i] = "Speed" + i+" ";
val[i] = (float)(.95 + i/20.);
min[i] = .2f;
max[i] = 5f;
}
for(int i=nvoices;i < 2*nvoices;i++) {
int k = i-nvoices;
names[i] = "Volume" + k +" ";
val[i] = 1f;
min[i] = 0;
max[i] = 1f;
}
for(int i=0;i < nvoices;i++) {
loopbuffer[i].setSpeed((float)val[i]);
}
setValues(val,min,max,names);
jButton[0].setText ("Stop");
player.start();
isOn = true;
}
protected void jButtonMousePressed (int k, java.awt.event.MouseEvent evt) {
switch(k) {
case 0:
if(isOn) {
jButton[0].setText ("Start");
isOn = false;
for(int i=0;i < nvoices;i++) {
loopbuffer[i].setVolume(0);
}
} else {
jButton[0].setText ("Stop");
isOn = true;
player.resetAGC();
for(int i=0;i < nvoices;i++) {
loopbuffer[i].setVolume(1);
}
}
break;
}
}
protected void onSlider(int k) {
if(k < nvoices) {
loopbuffer[k].setSpeed((float)this.val[k]);
} else {
mixer.setGain(k - nvoices,(float)this.val[k]);
}
}
}