import jass.render.*; import jass.engine.*; import jass.generators.*; import jass.neuron.*; public class IF2 { String[] names = {"g ","Vrev ","fIn ","Tref ","Tmem ","Vt ","Vrest ","Delay ","Vext ","Vstim "}; double[] val = {10, 20, 10, 2, 40, 10, 0, 25, 10, 10}; double[] min = {0, -100, 0, 0, 1, .01, -20, 0, 0, 0}; double[] max = {10, 100, 100, 40, 100, 10, 0, 200, 200, 200}; int nbuttons = 1; IFNeuron ifNeuron; SourcePlayer sp1; SinePlusOne stimulus; Probe p1; Probe p2; Probe p3; DelayUG delay; Constant external; Rectify rectify; Boolean probeOn = false; int nSynapses = 3; float srate = 2000.f; public class IF2Controller extends Controller { private IF2 if2; public IF2Controller(java.awt.Frame parent,boolean modal,int nsl,int nbut,IF2 if2) { super(parent,modal,nsl,nbut); this.if2 = if2; } public void onButton(int k) { switch(k) { case 0: if(probeOn) { if2.p1.off(); if2.p2.off(); if2.p3.off(); setButtonName ("Probe is Off",0); } else { if2.p1.on(); if2.p2.on(); if2.p3.on(); setButtonName ("Probe is On",0); } probeOn = !probeOn; break; case 1: break; } } public void onSlider(int k) { switch(k) { case 0: float sw = (float)this.val[k]; for(int i=0;i<nSynapses;i++) { if2.ifNeuron.setSynapticWeight(i,sw); } break; case 1: float vrev = (float)this.val[k]; for(int i=0;i<nSynapses;i++) { if2.ifNeuron.setSynapticReversalPotential(i,vrev); } break; case 2: if2.stimulus.setFrequency((float)(this.val[k])); break; case 3: if2.ifNeuron.setTr((float)(this.val[k]/1000)); break; case 4: if2.ifNeuron.setTm((float)(this.val[k]/1000)); break; case 5: if2.ifNeuron.setVt((float)this.val[k]); break; case 6: if2.ifNeuron.setVr((float)this.val[k]); break; case 7: if2.delay.setRawDelay((float)(this.val[k])/1000); break; case 8: if2.external.setConstant((float)this.val[k]); break; case 9: if2.stimulus.setVolume((float)this.val[k]); break; } } } public static void main (String args[]) throws SinkIsFullException { new IF2(args); } public IF2(String args[]) throws SinkIsFullException { int bufferSize = 2; int bufferSizeJavaSound = 1024; float Tr=10f/1000f; // refractory time float Vt=10f; // threshold potential float V0=0; // resting potential float Vr=0; // reset potential float Tm=40f/1000f; // membrane decay time constant Tm = Rm*Cm, Rm and Cm drop out of the eq. if(args.length <0) { System.out.println("Usage: java IF2 "); return; } ifNeuron = new IFNeuron(bufferSize, nSynapses,srate,Vt,V0,Vr,Tr,Tm); stimulus = new SinePlusOne(srate,bufferSize); external = new Constant(bufferSize); //rectify = new Rectify(bufferSize); p1 = new Probe(bufferSize,"in1.m"); p2 = new Probe(bufferSize,"in2.m"); p3 = new Probe(bufferSize,"out.dat"); delay = new DelayUG(bufferSize,srate); sp1 = new SourcePlayer(bufferSize,bufferSizeJavaSound,srate); // build graph //rectify.addSource(stimulus); p1.addSource(stimulus); ifNeuron.addSource(p1); delay.addSource(stimulus); p2.addSource(delay); ifNeuron.addSource(p2); ifNeuron.addSource(external); p3.addSource(ifNeuron); sp1.addSource(p3); ifNeuron.setSynapticReversalPotential(0,20); ifNeuron.setSynapticWeight(0,10f); p1.off(); p2.off(); p3.off(); IF2Controller a_controlPanel = new IF2Controller(new java.awt.Frame ("IF2"),false,val.length,nbuttons,this); a_controlPanel.addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent e) { sp1.stopPlaying(); try{ //sleep(500); } catch(Exception e3) { } System.exit(0); } }); a_controlPanel.setSliders(val,min,max,names); a_controlPanel.setButtonNames (new String[] {"Probe Off"}); a_controlPanel.setVisible(true); sp1.start(); } class SinePlusOne extends Out { Constant c; Sine s; Mixer m; public SinePlusOne(float srate,int bufferSize) { super(bufferSize); m = new Mixer(bufferSize,2); s = new Sine(srate,bufferSize); c = new Constant(bufferSize); try { m.addSource(s); m.addSource(c); m.setGain(0,1); m.setGain(1,1); } catch(Exception e) {} } public void setFrequency(float f) { s.setFrequency(f); } public void setVolume(float f) { s.setVolume(f); c.setConstant(f); } protected void computeBuffer() { try { buf = m.getBuffer(getTime()); } catch(BufferNotAvailableException e) { System.out.println(this+" "+e); } } } }