import jass.render.*; import jass.engine.*; import jass.generators.*; /** Combustion engine model @author Kees van den Doel (kvdoel@cs.ubc.ca) */ public class Engine { public static void main (String args[]) throws SinkIsFullException, java.io.FileNotFoundException { float srate = 44100.f; int bufferSize = 128; int nInputs=4; int bufferSizeJavaSound = 8*1024; if(args.length != 1) { System.out.println("Usage: java Engine ../data/stick.sy "); return; } final Mixer mixer = new Mixer(bufferSize,nInputs); //final ErraticLoopBuffer cylinders = new ErraticLoopBuffer(srate,bufferSize,args[1]); final LoopBuffer intake = new LoopBuffer(srate,bufferSize,"../data/fourStrokeIntake.wav"); final LoopBuffer combustion = new LoopBuffer(srate,bufferSize,"../data/fourStrokeCombustion.wav"); final LoopBuffer exhaust = new LoopBuffer(srate,bufferSize,"../data/fourStrokeExhaust.wav"); final LoopBuffer fan = new LoopBuffer(srate,bufferSize,"../data/neytone2.wav"); mixer.addSource(intake); mixer.addSource(combustion); mixer.addSource(exhaust); mixer.addSource(fan); for(int i=0;i<nInputs;i++) { mixer.setGain(i,1); } final SourcePlayer player = new SourcePlayer(bufferSize,bufferSizeJavaSound,srate); final ModalModel mm = new ModalModel(args[0]); final ModalObjectWithOneContact engineResonances = new ModalObjectWithOneContact(mm,srate,bufferSize); player.addSource(engineResonances); engineResonances.addSource(mixer); // Add control panel boolean isModal = false; int nsliders = 8; Controller a_controlPanel = new Controller(new java.awt.Frame ("Engine"), isModal,nsliders,1) { public void onButton(int k) { switch(k) { case 0: player.resetAGC(); //mm.fscale = .1f; //mm.dscale = .001f; //engineResonances.computeFilter(); break; } } public void onSlider(int k) { switch(k) { case 0: intake.setSpeed((float)super.val[0]); combustion.setSpeed((float)super.val[0]); exhaust.setSpeed((float)super.val[0]); fan.setSpeed((float)super.val[0]/16); break; case 1: //cylinders.setMisfireProb((float)super.val[1]); break; case 2: mixer.setGain(0,(float)super.val[2]); break; case 3: mixer.setGain(1,(float)super.val[3]); break; case 4: mixer.setGain(2,(float)super.val[4]); break; case 5: mm.fscale = (float)super.val[5]; engineResonances.computeFilter(); break; case 6: mm.dscale = (float)super.val[6]; engineResonances.computeFilter(); break; case 7: mixer.setGain(3,(float)super.val[7]); break; } } }; float speed0 = 3f; String[] names = {"Speed ", "Beatupness ","Intake ","Combustion ","Exhaust ","Freq. ","Damping ","Fan "}; double[] val = {speed0, 0 ,.3 ,.3 ,.3 ,.15 , 2 ,.4 }; double[] min = {speed0, 0 ,0 ,0 ,0 ,.03 ,.01 ,0 }; double[] max = {30, .1 ,1 ,1 ,1 ,1 ,10 ,1 }; a_controlPanel.setSliders(val,min,max,names); a_controlPanel.setButtonNames(new String[] {"Reset"}); a_controlPanel.setVisible(true); //cylinders.setSpeed(speed0); player.start(); } }