package jmslexamples.jsyn;

import com.softsynth.jmsl.PlayLurker;
import com.softsynth.jmsl.jsyn.SynthNoteAllPortsInstrument;
import com.softsynth.jsyn.Synth;

/**
 * This behaves just like a SynthNoteAllPortsInstrument playing a
 * com.softsynth.jsyn.circuits.FilteredSawtoothBL, adding the PlayLurker
 * interface so that it can be notified of elements being played by other
 * objects. This could be used to create an arpeggiating instrument, for
 * example, that listens to notes being played by a MusicShape or a MusicList or
 * a JMSL Score Track. <br>
 * <br>
 * 
 * COMPLETE SOURCE: <br>
 * <br>
 * 
 * <pre>
 * package jmslexamples.jsyn;
 * 
 * import com.softsynth.jmsl.*;
 * import com.softsynth.jmsl.score.jsyn.SynthNoteAllPortsInstrument;
 * import com.softsynth.jsyn.*;
 * 
 * public class PlayLurkingFSBLInstrument extends SynthNoteAllPortsInstrument implements PlayLurker {
 * 
 *     public PlayLurkingFSBLInstrument() {
 *         super(8, com.softsynth.jsyn.circuits.FilteredSawtoothBL.class.getName());
 *     }
 * 
 *     public void notify(double playTime, com.softsynth.jmsl.MusicJob job, int index) {
 *         System.out.println(&quot;PlayLurkingFSBLInstrument being notified of index &quot; + index + &quot; being played&quot;);
 *     }
 * 
 *     public static void main(String args[]) {
 *         try {
 *             Synth.startEngine(0);
 *             String filename = &quot;PlayLurkingFSBLInstrument.xml&quot;;
 *             PlayLurkingFSBLInstrument ins = new PlayLurkingFSBLInstrument();
 *             ins.setName(&quot;Play Lurking FilteredSawtoothBL ins&quot;);
 *             java.io.PrintWriter pout = new java.io.PrintWriter(new java.io.FileOutputStream(filename));
 *             (new com.softsynth.jmsl.score.util.SimpleXMLSaver(ins, &quot;jmslscoreinstrument&quot;)).writeXML(pout);
 *             pout.close();
 *             System.out.println(&quot;Wrote &quot; + filename);
 *             Synth.stopEngine();
 *         } catch (java.io.IOException e) {
 *             System.out.println(&quot;ERROR in main: &quot; + e);
 *         }
 *     }
 * 
 * }
 * 
 * 
 * </pre>
 * 
 * @author Nick Didkovsky, July 23, 2002, (c) 2002 Nick Didkovsky all rights
 *         reserved
 */

public class PlayLurkingJSynInstrument extends SynthNoteAllPortsInstrument implements PlayLurker {

    /**
     * Hard coded to call super(8,
     * com.softsynth.jsyn.circuits.FilteredSawtoothBL.class.getName());
     */
    public PlayLurkingJSynInstrument() {
        super(8, com.softsynth.jsyn.circuits.FilteredSawtoothBL.class.getName());
    }

    /**
     * PlayLurker interface. notify() is called by any MusicShape or MusicList
     * which has this object in its list of PlayLurkers
     */
    public void notifyPlayLurker(double playTime, com.softsynth.jmsl.MusicJob job, int index) {
        System.out.println("PlayLurkingFSBLInstrument being notified of index " + index + " being played");
    }

    /**
     * Just instantiate an instrument and write out an XML file so it can be
     * loaded into JMSL Score
     */
    public static void main(String args[]) {
        try {
            Synth.startEngine(0);
            String filename = "PlayLurkingFSBLInstrument.xml";
            PlayLurkingJSynInstrument ins = new PlayLurkingJSynInstrument();
            ins.setName("Play Lurking FilteredSawtoothBL ins");
            java.io.PrintWriter pout = new java.io.PrintWriter(new java.io.FileOutputStream(filename));
            (new com.softsynth.jmsl.util.SimpleXMLSaver(ins, "jmslscoreinstrument")).writeXML(pout);
            pout.close();
            System.out.println("Wrote " + filename);
            Synth.stopEngine();
        } catch (java.io.IOException e) {
            System.out.println("ERROR in main: " + e);
        }
    }

}