package rice2604hw; import java.awt.event.*; import java.awt.*; import com.softsynth.jsyn.*; import com.softsynth.jsyn.view.*; /* ================================================================ 2604 FilteredFM J. Rice ---------------------------------------------------------------- FM pair with independent frequency ports is fed into a SVF. Cutoff is varied with frequency giving a sick, pseudo-wah effect. Standard pitch is lost due to multiple scalings. Finally the highPass and lowPass outputs are split left and right for a nice stereo effect. ---------------------------------------------------------------- 11/23/99 ** edited 11/05/00 for HW-6 ================================================================ */ public class FilteredFM extends SynthCircuit { SineOscillator modOsc; SineOscillator carOsc; AddUnit adder; StateVariableFilter mySVF; public SynthInput freq1; public SynthInput caramplitude; public SynthInput freq2; public SynthInput modamplitude; public SynthInput cutoff; public SynthInput resonance; public SynthOutput output0; public SynthOutput output1; //----------------------------------------------------------------- public FilteredFM() throws SynthException { super(); add(modOsc = new SineOscillator()); add(carOsc = new SineOscillator()); add(adder = new AddUnit()); add(mySVF = new StateVariableFilter()); modOsc.output.connect(adder.inputB); adder.output.connect(carOsc.frequency); carOsc.output.connect(mySVF.input); mySVF.amplitude.set(1.0); addPort(freq1 = modOsc.frequency, "Mod Frequency"); addPort(modamplitude = modOsc.amplitude, "Mod Amplitude"); addPort(freq2 = adder.inputA, "Carrier Frequency"); addPort(caramplitude = carOsc.amplitude, "Carrier Amplitude"); addPort(cutoff = mySVF.frequency, "Cutoff Frequency"); addPort(resonance = mySVF.resonance, "Filter Resonance"); addPort(output0 = mySVF.lowPass, "Lo Output"); //swapped addPort(output1 = mySVF.highPass, "Hi Output"); //changed 11/05 + back } //----------------------------------------------------------------------------- public static void main(String args[]) { try { Synth.startEngine(0); SynthObject.enableTracking(true); Frame f = new Frame("test FilteredFM"); LineOut out = new LineOut(); FilteredFM fm = new FilteredFM(); fm.output0.connect(0, out.input, 0); fm.output1.connect(0, out.input, 1); out.start(); fm.start(); fm.freq1.set(440.0); fm.freq2.set(440.0); fm.modamplitude.set(500.0); fm.caramplitude.set(0.5); fm.cutoff.set(800.0); fm.resonance.set(.5); f.setLayout(new GridLayout(0, 1)); f.add(new PortFader(fm.freq1, "freq1", 100.0, 0, 300));///New nos 11/05/00 f.add(new PortFader(fm.freq2, "freq2", 444.0, 80, 1000)); f.add(new PortFader(fm.modamplitude, "modamp", 10, 0.0, 500)); f.add(new PortFader(fm.caramplitude, "caramp", 0.5, 0, 1.0000)); f.add(new PortFader(fm.cutoff, "cutoff", 440.0, 0, 1500)); f.add(new PortFader(fm.resonance, "resonance", 0.5, 0, 1.0)); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { Synth.stopEngine(); // System.exit(0); }}); f.setSize(320, 200); f.setVisible(true); } catch (SynthException e) { System.out.println("error: " + e); } } }//========================END CIRCUIT============================================