import jass.render.*; import jass.engine.*; import jass.generators.*; /** Filter white noise through a modal resonbank. Have a large number of modes, for slider freaks. @author Kees van den Doel (kvdoel@cs.ubc.ca) */ public class ModalNoiseApplet2 extends AppletController { RandOut rout; SourcePlayer player; ModalObjectWithOneContact mob; ModalModel mm; int nmodes = 10; float srate = 44100.f; double fmin = 50; double fmax = 440*4; double dmin = 1; double dmax = 100; double amin = 0; double amax = 1; String[] names = new String[nmodes*3+1]; double[] val = new double[nmodes*3+1]; double[] min = new double[nmodes*3+1]; double[] max = new double[nmodes*3+1]; public void setNSliders() { nsliders = nmodes*3 + 1; } public void setNButtons() { nbuttons = 2; } public void initRandom() { for(int i=0;i<nmodes;i++) { mm.f[i] = (float)(fmin + (fmax-fmin)*Math.random()); mm.d[i] = (float)(dmin + (dmax-dmin)*Math.random()); //mm.a[0][i] = (float)(amin + (amax-amin)*Math.random()); mm.a[0][i] = (float)amax; } } public void start() { int bufferSize = 128*4; int bufferSizeJavaSound = 10*1024; rout = new RandOut(bufferSize); player = new SourcePlayer(bufferSize,bufferSizeJavaSound,srate); mm = new ModalModel(nmodes,1); mm.f = new float[nmodes]; mm.d = new float[nmodes]; mm.a = new float[1][nmodes]; initRandom(); mob = new ModalObjectWithOneContact(mm,srate,bufferSize); try { player.addSource(mob); mob.addSource(rout); } catch(SinkIsFullException e) { } for(int i=0;i<nmodes;i++) { names[i] = "freq" + i + " "; names[i+nmodes] = "damping" + i + " "; names[i+2*nmodes] = "gain" + i + " "; val[i] = mm.f[i]; val[i+nmodes] = mm.d[i]; val[i+2*nmodes] = mm.a[0][i]; min[i] = fmin; min[i+nmodes] = dmin; min[i+2*nmodes] = amin; max[i] = fmax; max[i+nmodes] = dmax; max[i+2*nmodes] = amax; } names[nsliders-1] = "DAMP "; val[nsliders-1] = dmax; min[nsliders-1] = dmin; max[nsliders-1] = dmax; setValues(val,min,max,names); jButton[0].setText ("Randomize"); jButton[1].setText ("Reset AGC"); player.start(); } protected void jButtonMousePressed (int k, java.awt.event.MouseEvent evt) { switch(k) { case 0: initRandom(); for(int i=0;i<nmodes;i++) { val[i] = mm.f[i]; val[i+nmodes] = mm.d[i]; val[i+2*nmodes] = mm.a[0][i]; } setValues(val,min,max,names); mob.computeFilter(); player.resetAGC(); break; case 1: player.resetAGC(); break; } } protected void onSlider(int k) { if(k<nmodes) { val[k] = mm.f[k] = (float)(super.val[k]); } else if(k<nmodes*2) { val[k] = mm.d[k-nmodes] = (float)(super.val[k]); } else if(k<nmodes*3) { val[k] = mm.a[0][k-2*nmodes] = (float)(super.val[k]); } else if(k == nmodes*3) { val[k] = (float)(super.val[k]); // set all dampings to this for(int i=0;i<nmodes;i++) { val[i+nmodes] = val[k]; mm.d[i] = (float)(val[i+nmodes]); setValues(val,min,max,names); } } mob.computeFilter(); } }