package rice2604hw; /* =============================================================== 2604 FiltFMInst J.Rice --------------------------------------------------------------- A JMSL instrument file which acts as intermediary between a music applet and a Jsyn circuit. This file is instantiated by the Key- PlayerApplet, creates a circuit, makes amplitude envelopes and allows JMSL note data to get to the fundamental circuit. --------------------------------------------------------------- Edited 11/05/00 =============================================================== */ import com.softsynth.jmsl.*; import com.softsynth.jsyn.*; class FiltFMInst extends Instrument { FilteredFM myOsc; LineOut myOut; SynthEnvelope ampEnvData, modEnvData; EnvelopePlayer ampEnvPlayer, modEnvPlayer; //------------------------------------------- public FiltFMInst() { myOsc = new FilteredFM(); myOut = new LineOut(); setParameters(); ampEnvData = new SynthEnvelope(makeEnvelope2()); modEnvData = new SynthEnvelope(makeEnvelopeHz()); ampEnvPlayer = new EnvelopePlayer(); modEnvPlayer = new EnvelopePlayer(); ampEnvPlayer.output.connect(0, myOsc.caramplitude, 0); modEnvPlayer.output.connect(0, myOsc.modamplitude, 0); myOsc.output0.connect(0, myOut.input, 0); myOsc.output1.connect(0, myOut.input, 1); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public void setParameters() { double vari; vari = (JMSLRandom.choose(4000)+50); //edit11/05(then back) myOsc.cutoff.set((int)vari); myOsc.freq1.set(JMSLRandom.choose(300.0));//Moved from Play() myOsc.modamplitude.set(JMSLRandom.choose(500.0)); //added11/05 } //------------------------------------- public double[] makeEnvelope2() { double[] d = new double[8]; double x, y, z, dur; x = JMSLRandom.choose(2.0); z = JMSLRandom.choose(2.0); d[0] = z; d[1] = .95; d[2] = x - z; d[3] = (JMSLRandom.choose(0.3) + 0.3); d[4] = x; d[5] = (JMSLRandom.choose(0.3) + 0.3); d[6] = x; d[7] = 0.0; dur = ((int)(x * 3000.0) / 1000.0); JMSL.out.print(" [FMenv of dur: " + dur + "] "); return d; } //------------------------------------- public double[] makeEnvelopeHz() { //Method added 11/05 double[] d = new double[8]; double x, y, z, dur; x = JMSLRandom.choose(2.0); z = JMSLRandom.choose(2.0); d[0] = z; d[1] = 500.0; d[2] = x - z; d[3] = (JMSLRandom.choose(200.0) + 150); d[4] = x; d[5] = (JMSLRandom.choose(200.0) + 150); d[6] = x; d[7] = 0.0; dur = ((int)(x * 3000.0) / 1000.0); JMSL.out.print(" [FMenv of dur: " + dur + "] "); return d; } //-------------------------------------------------------- public double open(double playTime) { int itime = (int)JMSL.clock.timeToNative(playTime); myOsc.start(itime); myOut.start(itime); ampEnvPlayer.start(itime); modEnvPlayer.start(itime); return playTime; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public double close(double playTime) { int itime = (int)JMSL.clock.timeToNative(playTime); myOsc.stop(itime); myOut.stop(itime); ampEnvPlayer.stop(itime); modEnvPlayer.stop(itime); return playTime; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public double play(double playTime, double timeStretch, double dar[]) { int itime = (int)JMSL.clock.timeToNative(playTime); myOsc.freq2.set(itime, dar[1]); ampEnvPlayer.amplitude.set(itime, dar[2]); modEnvPlayer.amplitude.set(itime, 500.0);///Edited 11/05 ampEnvPlayer.envelopePort.clear(itime); modEnvPlayer.envelopePort.clear(itime); ampEnvPlayer.envelopePort.queue(itime, ampEnvData, 0, ampEnvData.getNumFrames()); modEnvPlayer.envelopePort.queue(itime, modEnvData, 0, modEnvData.getNumFrames()); return playTime + dar[0] * timeStretch; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ }