/*
 * Created on Apr 25, 2004
 *
 */
package jmslexamples.jsyn;

import com.softsynth.jsyn.*;

/** 
 * For Speedy example
 * 
 * @author Nick Didkovsky, email: didkovn@mail.rockefeller.edu, (c) 2004 Nick Didkovsky, all rights reserved. 
 *
 */
public class SpeedySynthNote extends SynthNote {

	SineOscillator myOsc;
	LinearLag myLag;
	MultiplyUnit multy;

	public SpeedySynthNote() throws SynthException {
		super();
		/* Make waveform unit generator. */
		add(myOsc = new SineOscillator());
		add(myLag = new LinearLag());
		add(multy = new MultiplyUnit());

		/* Hook 'em up */
		myLag.time.set(0.01); // 10 msec
		// myLag.input.set(1.0);		// stays alive
		multy.inputA.connect(myOsc.output);
		multy.inputB.connect(myLag.output);

		/* Make ports on internal units appear as ports on circuit. */
		addPort(amplitude = myOsc.amplitude, "amplitude");
		addPort(frequency = myOsc.frequency, "frequency");
		addPort(output = multy.output);

		/* Set signal type for frequency control so that we can operate in hertz. */
		frequency.setSignalType(Synth.SIGNAL_TYPE_OSC_FREQ);
		frequency.set(0.0);
		amplitude.set(0.0);

		//		compile();
	}

	/** Bang the circuit to make a sound */
	public void noteOn(int time, double frq, double ampl) {
		start(time);
	//	System.out.println("SpeedySynthNote noteon " + frq + ", " + ampl);
		try {
			myLag.input.set(time, 1.0);
			myOsc.frequency.set(time, frq); /* Hz */
			myOsc.amplitude.set(time, ampl);
		}
		catch (SynthException se) {
			System.out.println("noteOn() error: " + se);
		}
	}

	public void noteOff(int time) {
		try {
			myLag.input.set(time, 0.0); // dies quick
		}
		catch (SynthException se) {
			System.out.println("noteOff() error: " + se);
		}
	}
}