import jass.render.*; import jass.engine.*; import jass.generators.*; import jass.contact.*; /** As Bang using ModalObjectWithOneContact */ public class Bang extends Controller { static int nsliders = 11; static int nbuttons = 2; public Bang(java.awt.Frame parent,boolean modal) { super (parent, modal,nsliders,nbuttons); } public void onSlider(int k) { switch(k) { case 0: dur = (float)super.val[0]; banger.setDur(dur); break; case 1: force = (float)super.val[1]; banger.setForce(force); break; case 2: vs = (float)super.val[2]; af.setSlideProperties(fslide,vs); break; case 3: fslide = (float)super.val[3]; af.setSlideProperties(fslide,vs); break; case 4: vr = (float)super.val[4]; af.setRollProperties(froll,vr); break; case 5: froll = (float)super.val[5]; af.setRollProperties(froll,vr); break; case 6: lpFRoll = (float)super.val[6]; af.setRollFilter(lpFRoll, lpDryG); break; case 7: lpDryG = (float)super.val[7]; af.setRollFilter(lpFRoll, lpDryG); break; case 8: loc = (float)super.val[8]; if(nLocs > 1) { double x = (.00001 +loc)/1.0001; // 0 - 1, map to location x = x*(nLocs - 1); // 0 -- np-1 int p1 = (int)x; int p2 = (int)(x+1); int p3 = 0; float b2 = (float)(x-p1); float b1 = (float)(1 - b2); float b3 = 0; System.out.println("np="+nLocs+ " "+"loc(0-np-1)="+x); mob.setLocation(p1,p2,p3,b1,b2,b3); } break; case 9: nmodes = (int)super.val[9]; mob.setNf(nmodes); break; case 10: hitT = (float)super.val[10]; banger.setHitT(hitT); break; } } public void onButton(int k) { switch(k) { case 0: af.bang(force,dur/1000); break; case 1: if(isMuted) { sp1.resetAGC(); isMuted = false; app.setButtonName("Mute",k); } else { isMuted = true; app.setButtonName("Unmute",k); } sp1.setMute(isMuted); break; } } static ModalObjectWithOneContact mob; static ContactForce af; static float dur=0; //dur in ms of impact static float hitT = -1; // < 0 is no auto hitting static float force = 10f; // force of impact static float vs=0,vr=0,fslide=0,froll=0; // slide, roll speed and normal forces // maximum audio speeds, 1 is original wav file static float slideSpeed1=1f,rollSpeed1=1f; // physical speed ranges static float vslide0=.0f,vslide1=1f,vroll0=.00f,vroll1=1f; // gain ratios static float physicalToAudioGainSlide=1,physicalToAudioGainRoll=1,physicalToAudioGainImpact=1; static float lpFRoll=100.f, lpDryG=0; static int nLocs = 1; // if using an sy with locations static float loc=0; //location 0-1 static SourcePlayer sp1; static Banger banger; static boolean isMuted = false; static Bang app; static ModalModel mm; static int nmodes; static String[] names = {"dur ","Fbang ","vslide ","Fslide ","vroll ","Froll ", "lPFroll ","lpDryG ", "loc ","nmodes ","hitT "}; static double[] val = {dur, force, vs, fslide, vr, froll, lpFRoll, lpDryG, loc, nmodes, hitT}; static double[] min = {0, 0, 0, 0, 0, 0, 10, 0, 0, 1, -1}; static double[] max = {50, 1000, 1, 1000, 1, 1000, 2000, 1, 1, 2, 10}; public static void main (String args[]) throws SinkIsFullException { float srate = 22050.f; int bufferSize = 256*4; int bufferSizeJavaSound = 10*1024; if(args.length != 4) { System.out.println("Usage: java Bang ../data/clayvase-nobogus2.sy ../data/cos20ms.wav ../data/d1.25.wav ../data/roll.wav\n"); return; } try { mm = new ModalModel(args[0]); mob = new ModalObjectWithOneContact(mm,srate,bufferSize); } catch (java.io.FileNotFoundException ee) { System.out.println("Modes file not found\n"); } max[max.length-2] = mm.f.length; nmodes = mm.f.length; val[max.length-2] = nmodes; nLocs = mob.modalModel.np; af = new ContactForce(srate,bufferSize,args[1],args[2],args[3]); mob.addSource(af); af.setStaticContactModelParameters(slideSpeed1, rollSpeed1, vslide0, vslide1, vroll0, vroll1, physicalToAudioGainSlide, physicalToAudioGainRoll,physicalToAudioGainImpact); af.setSlideProperties(fslide,vs); af.setRollProperties(froll,vr); af.setRollFilter(lpFRoll, lpDryG); sp1 = new SourcePlayer(bufferSize,bufferSizeJavaSound,srate); sp1.setUseNativeSound(false); sp1.addSource(mob); sp1.start(); banger = new Banger(af); banger.start(); app = new Bang(new java.awt.Frame("Wavetable contact forces"), true); app.setSliders(val,min,max,names); app.setButtonNames (new String[] {"Bang","Mute"}); app.setVisible(true); } } class Banger extends Thread { float hitT = -1; float force = 1; float dur = 0; ContactForce af; public void setHitT(float val) { hitT = val; } public void setForce(float f) { force = f; } public void setDur(float d) { dur = d; } public Banger(ContactForce af) { this.af = af; } public void run() { while(true) { try { if(hitT > 0) { sleep((int)(1000 * hitT)); af.bang(force,dur/1000f); } else { sleep(200); } } catch(Exception e) {;} } } }