package rice2604hw; import com.softsynth.jsyn.*; /** =================================================================== FM pair SynthNote implemented as a SynthNote @author Nick Didkovsky MANY of ND's helpful comments removed for cleanliness... see original class notes. -J.Rice 10/25/99 ===================================================================*/ public abstract class FMSynthNote extends SynthNote { /* Declare ports. */ FMCircuit fmCircuit; EnvelopePlayer carAmpEnv; EnvelopePlayer modAmpEnv; SynthEnvelope carAmpEnvData; SynthEnvelope modAmpEnvData; LinearLag myLag; MultiplyUnit lagMultiplier; double modIndex; double modfreq; double fcfmRatio; double numer, denom, index; // Construct a SynthNote that maintains numer/denom Fc:Fm ratio, with specified Modindex //------------------------------------------------------------------ public FMSynthNote(double lNumer, double lDenom, double lIndex) throws SynthException { super(); numer = lNumer; denom = lDenom; index = lIndex; fcfmRatio = numer / denom; modIndex = index; add(fmCircuit = new FMCircuit()); add(carAmpEnv = new EnvelopePlayer()); add(modAmpEnv = new EnvelopePlayer()); add(myLag = new LinearLag()); add(lagMultiplier = new MultiplyUnit()); modAmpEnv.amplitude.setSignalType(Synth.SIGNAL_TYPE_OSC_FREQ); myLag.time.set(0.005); carAmpEnv.output.connect( 0, fmCircuit.caramplitude, 0 ); modAmpEnv.output.connect( 0, fmCircuit.modamplitude, 0 ); fmCircuit.output.connect(lagMultiplier.inputA); myLag.output.connect(lagMultiplier.inputB); addPort(amplitude = fmCircuit.caramplitude, "amplitude"); addPort(frequency = fmCircuit.carfrequency, "frequency"); addPort(output = lagMultiplier.output, "output"); frequency.setSignalType( Synth.SIGNAL_TYPE_OSC_FREQ ); frequency.set( 0.0 ); amplitude.set( 0.0 ); } //---------------------------------------------------- /** >>>>>>>>Override this abstract method<<<<<<<<<<<<*/ abstract void buildEnvelopes() throws SynthException; //---------------------------------------------------- /** Bang the circuit to make a sound */ public void noteOn(int time, double frq, double ampl) { try { myLag.input.set(time, 1.0); // avoid pops fmCircuit.carfrequency.set(time, frq); /* Hz */ modfreq = frq/fcfmRatio; fmCircuit.modfrequency.set(time, modfreq); double modamp = modfreq * modIndex; modAmpEnv.amplitude.set(time, modamp); carAmpEnv.amplitude.set(time, ampl); carAmpEnv.envelopePort.clear(time); carAmpEnv.envelopePort.queue(time, carAmpEnvData, 0, carAmpEnvData.getNumFrames()); modAmpEnv.envelopePort.clear(time); modAmpEnv.envelopePort.queue(time, modAmpEnvData, 0, modAmpEnvData.getNumFrames()); } catch (SynthException se) { System.out.println("FMSynthNote noteOn() error: " + se); } } //--------------------------------------------- /** Bang the circuit to shut down the sound */ public void noteOff(int time) { try { myLag.input.set(time, 0.0); carAmpEnv.envelopePort.clear(time); modAmpEnv.envelopePort.clear(time); } catch (SynthException se) { System.out.println("FMSynthNote noteOff() error: " + se); } } //--------------------------------------------- public void setModFreq(int time, double freq) throws SynthException { modfreq = freq; fmCircuit.modfrequency.set(time, freq); } //--------------------------------------------- public void setModIndex(double index) { modIndex = index; } } //====================END FMSynthNote=========================