package rice2604hw; import java.awt.event.*; import java.awt.*; import com.softsynth.jsyn.*; import com.softsynth.jsyn.view.*; /* ================================================================ 2604 DetunedOctaves J. Rice ---------------------------------------------------------------- Circuit has a sine in the middle and a square on each side which is set octave(s) lower. The detune parameter gently raises the frequency of one side while lowering the other. Separate envelopes are utilized for center and side amplitudes. ---------------------------------------------------------------- Edited 11/05/00 ================================================================ */ public class DetunedOcts extends SynthCircuit { SineOscillator mainOsc; SquareOscillator squareR, squareL; AddUnit diffAdder, adderR, adderL; SubtractUnit diffSub; MultiplyUnit diffMult, octMult; StateVariableFilter rightSVF, leftSVF; public SynthDistributor freq, sideamps, cutoff; public SynthInput amp; public SynthInput detune; public SynthInput octaveMult; public SynthOutput output0; public SynthOutput output1; //----------------------------------------------------------------- public DetunedOcts() throws SynthException { super(); add(mainOsc = new SineOscillator()); add(squareR = new SquareOscillator()); add(squareL = new SquareOscillator()); add(adderR = new AddUnit()); add(adderL = new AddUnit()); add(diffAdder = new AddUnit()); add(diffSub = new SubtractUnit()); add(diffMult = new MultiplyUnit()); add(octMult = new MultiplyUnit()); add(rightSVF = new StateVariableFilter()); add(leftSVF = new StateVariableFilter()); addPort(amp = mainOsc.amplitude, "Main Amplitude"); addPort(detune = diffMult.inputB, "Detune"); addPort(octaveMult = octMult.inputB, "Octave Multiplier"); freq = new SynthDistributor(this, "freq", Synth.SIGNAL_TYPE_OSC_FREQ); sideamps = new SynthDistributor(this, "ampDistr"); cutoff = new SynthDistributor(this, "cutoffDist", Synth.SIGNAL_TYPE_SVF_FREQ); ////edited 11/05 ^^^^^^^^^^^^^^^ //CONNECT--------- freq.connect(mainOsc.frequency); freq.connect(octMult.inputA); octMult.inputB.set(0.5); octMult.output.connect(diffMult.inputA); octMult.output.connect(diffAdder.inputA); octMult.output.connect(diffSub.inputA); sideamps.connect(squareR.amplitude); sideamps.connect(squareL.amplitude); diffMult.output.connect(diffAdder.inputB); diffMult.output.connect(diffSub.inputB); diffAdder.output.connect(squareR.frequency); diffSub.output.connect(squareL.frequency); squareR.output.connect(rightSVF.input); squareL.output.connect(leftSVF.input); rightSVF.bandPass.connect(adderR.inputB); ////Changed to band 11/05 leftSVF.bandPass.connect(adderL.inputB); mainOsc.output.connect(adderR.inputA); mainOsc.output.connect(adderL.inputA); cutoff.connect(rightSVF.frequency); cutoff.connect(leftSVF.frequency); //ADD OUTPUTS---------- addPort(output0 = adderL.output, "Left Output"); addPort(output1 = adderR.output, "Right Output"); } //----------------------------------------------------------------------------- public static void main(String args[]) { try { Synth.startEngine(0); SynthObject.enableTracking(true); Frame f = new Frame("test DetuneOcts"); LineOut out = new LineOut(); DetunedOcts dt = new DetunedOcts(); dt.output0.connect(0, out.input, 0); dt.output1.connect(0, out.input, 1); out.start(); dt.start(); dt.freq.set(440); dt.amp.set(0.5); f.setLayout(new GridLayout(0, 1)); f.add(new PortFader(dt.freq, "freq", 220, 20, 10000)); f.add(new PortFader(dt.amp, "main-amp", 0.75, 0, 1.0000)); f.add(new PortFader(dt.octaveMult, "octaveMult", 0.25, 0.125, 0.5)); f.add(new PortFader(dt.sideamps, "side-amp", 0.5, 0, 1.0000)); f.add(new PortFader(dt.detune, "detune", 0.001, 0.0001, 0.02)); f.add(new PortFader(dt.cutoff, "cutoff", 2000, 20, 10000)); 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============================================