import jass.render.*;
import jass.engine.*;
import jass.generators.*;
/**
Delay line with low-pass; a simple Karplus-Strong like string
sound (though the lowpass is at the wrong place it sounds good to me)
@author Kees van den Doel (kvdoel@cs.ubc.ca)
*/
public class DelayApplet extends AppletController {
Mixer mixer;
SourcePlayer player;
boolean isOn = false;
float gain2 = .95f;
public void setNSliders() {
nsliders = 1;
}
public void setNButtons() {
nbuttons = 1;
}
public void start() {
float srate = 44100.f;
int bufferSize = 128*4;
int bufferSizeJavaSound = 8*1024;
/*
[Rnd]o->[Mixer]o->[speaker]
^---<---|
*/
Source rout = new Rnd(bufferSize);
mixer = new Mixer(bufferSize,2);
player = new SourcePlayer(bufferSize,bufferSizeJavaSound,srate);
LowPass lp = new LowPass();
FilterContainer lowpass = new FilterContainer(srate,bufferSize,lp);
try {
player.addSource(mixer);
mixer.addSource(rout);
mixer.addSource(lowpass);
lowpass.addSource(mixer);
} catch(SinkIsFullException e) {
}
mixer.setGain(0,1f);
mixer.setGain(1,gain2); // feedback
String[] names = {"Feedback "};
double[] val = {gain2 };
double[] min = {0 };
double[] max = {1 };
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;
mixer.setGain(0,0);
} else {
jButton[0].setText ("Stop");
isOn = true;
player.resetAGC();
mixer.setGain(0,gain2);
}
break;
}
}
protected void onSlider(int k) {
switch(k) {
case 0:
mixer.setGain(1,gain2 = (float)this.val[0]);
break;
}
}
}
// Simple low-pass
class LowPass implements Filter {
float lastin = 0;
public void filter(float [] output, float[] input, int nsamples, int inputOffset) {
int len = input.length;
// note input[] may be same as output[]!
for(int i=0;i<len;i++) {
float tmplastin = input[i];
output[i] = (lastin + tmplastin)*.5f;
lastin = tmplastin;
}
}
}
// Produce some random pulses to excite the string
class Rnd extends Out {
public Rnd(int bufferSize) {
super(bufferSize);
}
protected void computeBuffer() {
double x = Math.random();
if(x > .95) {
buf[0] = 1;
} else {
buf[0] = 0;
}
}
}