import jass.render.*; import jass.engine.*; import jass.generators.*; import java.util.*; import java.net.*; import java.io.*; public class Morph2Applet extends AppletController { SourcePlayer player; ModalModel mm,mm1,mm2; // morph between the two ModalObjectWithOneContact mob; OneShotBuffer force; double hitFreq = 1.; Hitter hitter; String syfile1; String syfile2; float morphPar = 0; // 0 is nodel 1, 1 is model 2 int maxModes; public void setNSliders() { nsliders = 5; } public void setNButtons() { nbuttons = 1; } //for x = 0 is syfile1, for x = 1 is syfile2 public void morph(double x) { for(int i=0;i< maxModes;i++) { mm.f[i] = (float)((1-x)*mm1.f[i] + x*mm2.f[i]); mm.d[i] = (float)((1-x)*mm1.d[i] + x*mm2.d[i]); mm.a[0][i] = (float)((1-x)*mm1.a[0][i] + x*mm2.a[0][i]); } } public void init() { super.init(); syfile1 = getParameter("syfile1"); syfile2 = getParameter("syfile2"); } public void start() { float srate = 44100.f; int bufferSize = 128; int bufferSizeJavaSound = 8*1024; player = new SourcePlayer(bufferSize,bufferSizeJavaSound,srate); URL codebase = getCodeBase(); URL syurl1 = null; URL syurl2 = null; try { syurl1 = new URL(codebase,syfile1); syurl2 = new URL(codebase,syfile2); } catch(MalformedURLException e) { System.out.println(e+" Malformed URL"); } try { mm = new ModalModel(syurl1); // warp this one mm1 = new ModalModel(syurl1); // don't change this one mm2 = new ModalModel(syurl2); // don't change this one } catch(IOException e) { System.out.println(e); } maxModes = mm1.nfUsed; if(mm2.nfUsed < maxModes) { maxModes = mm2.nfUsed; } mob = new ModalObjectWithOneContact(mm,srate,bufferSize); float dur = .002f; // 2 ms int nsamples = (int)(srate * dur); float[] cosForce = new float[nsamples]; for(int i=0;i<nsamples;i++) { cosForce[i] = (float)(.5*(1.-Math.cos(2*Math.PI*(i+1)/(1+nsamples)))); } force = new OneShotBuffer(srate,bufferSize,cosForce); try { mob.addSource(force); player.addSource(mob); } catch(SinkIsFullException e) { System.out.println(this+ " " + e); } mob.setNf(maxModes); float hardNess0 = 10f; force.setSpeed(hardNess0); force.setVolume(hardNess0); String[] names = {"Hardness ", "No. modes ", "Freq. ", "Hit speed ", "Morph " }; double[] val = {hardNess0, maxModes, 1, hitFreq, 0 }; double[] min = {0.1, 1, .25, .1, 0 }; double[] max = {hardNess0, maxModes, 3, 1, 1 }; setValues(val,min,max,names); jButton[0].setText ("Stop"); player.start(); hitter = new Hitter(); hitter.hitFreq = hitFreq; hitter.force = force; hitter.start(); hitter.isRunning = true; } protected void onSlider(int k) { switch(k) { case 0: force.setSpeed((float)this.val[0]); force.setVolume((float)this.val[0]); break; case 1: int nf = (int)this.val[1]; mob.setNf(nf); break; case 2: mob.setFrequencyScale((float)this.val[2]); break; case 3: hitter.hitFreq = this.val[3]; break; case 4: morph(this.val[4]); mob.computeFilter(); break; } } protected void jButtonMousePressed (int k,java.awt.event.MouseEvent evt) { switch(k) { case 0: if(hitter.isRunning) { jButton[0].setText("Start"); hitter.isRunning = false; mob.clearHistory(); force.clearBuffer(); player.resetAGC(); } else { jButton[0].setText("Stop"); hitter.isRunning = true; } break; } } class Hitter extends Thread { public double hitFreq = .33; public OneShotBuffer force; public boolean isRunning = false; public void run() { try { while(true) { if(isRunning) { force.hit(); } sleep((int)(1000/hitFreq)); } } catch(InterruptedException e) { System.out.println(this+" "+e); } } } }