/* * Created by Nick on Jan 3, 2005 * */ package jmslexamples.simple; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.JLabel; import com.jsyn.swing.JAppletFrame; import com.softsynth.jmsl.EventScheduler; import com.softsynth.jmsl.Instrument; import com.softsynth.jmsl.JMSL; import com.softsynth.jmsl.JMSLMixerContainer; import com.softsynth.jmsl.MusicJob; import com.softsynth.jmsl.MusicShape; import com.softsynth.jmsl.jsyn2.JSynMusicDevice; import com.softsynth.jmsl.jsyn2.JSynUnitVoiceInstrument; /** * Use a MusicJob to turn an Instrument on() for five seconds, then shut it * off(). Turn it on in MusicJob.start(). Turn it off in MusicJob.stop(). Cause * the delay with musicJob's startPause. * * Updated to JSyn2 API on Dec 6, 2016 * * @author Nick Didkovsky, (c) 2004 All rights reserved, Email: * nick@didkovsky.com * */ public class InstrumentOnOff extends JFrame { JMSLMixerContainer mixer; Instrument instrument; MusicJob myMusicJob; public void start() { initJMSL(); initMusicDevices(); buildMixer(); buildInstrument(); buildMusicJob(); launchMusicJob(); } private void initJMSL() { JMSL.scheduler = new EventScheduler(); JMSL.scheduler.start(); JMSL.clock.setAdvance(0.1); } private void initMusicDevices() { JSynMusicDevice.instance().open(); } private void buildMixer() { mixer = new JMSLMixerContainer(); mixer.start(); } private void buildInstrument() { // instrument = new JSynUnitVoiceInstrument(1, com.softsynth.jmsl.jsyn2.unitvoices.WarblingRing.class.getName()); instrument = new JSynUnitVoiceInstrument(1, com.jsyn.instruments.SubtractiveSynthVoice.class.getName()); // instrument = new JSynUnitVoiceInstrument(1, com.jsyn.instruments.WaveShapingVoice.class.getName()); mixer.addInstrument(instrument); } protected void buildMusicJob() { myMusicJob = new MusicJob() { Object voiceToken; public double start(double playTime) { JMSL.out.println("MusicJob.start() is calling instrument.on() "); if (getInstrument() != null) { double[] data = MusicShape.getDefaultArray(getInstrument().getDimensionNameSpace()); // on() returns a token identifying which voice was allocated, so you can refer // to it later in off() voiceToken = getInstrument().on(playTime, 1.0, data); } return playTime; } public double stop(double playTime) { JMSL.out.println("MusicJob.stop() is calling instrument.off() "); if (getInstrument() != null) { // retrieve voiceToken int vt = ((Integer) voiceToken).intValue(); ((JSynUnitVoiceInstrument) getInstrument()).off(playTime, vt); } return playTime; } }; myMusicJob.setStartPause(5); myMusicJob.setInstrument(instrument); } private void launchMusicJob() { myMusicJob.launch(JMSL.now()); } public void stop() { myMusicJob.finishAll(); try { myMusicJob.waitForDone(); } catch (InterruptedException e) { e.printStackTrace(); } JMSL.scheduler.stop(); JMSL.closeMusicDevices(); } public static void main(String[] args) { InstrumentOnOff myFrame = new InstrumentOnOff(); myFrame.add(new JLabel("There is no GUI for this example", JLabel.CENTER)); myFrame.setSize(600, 200); myFrame.setVisible(true); myFrame.start(); myFrame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { myFrame.stop(); System.exit(0); } }); } }