/* * Created on Nov 12, 2004 * */ package jmslexamples.jsyn; import java.awt.Button; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import com.softsynth.jmsl.*; import com.softsynth.jmsl.jsyn.*; import com.softsynth.jmsl.jsyn.circuits.SimpleDelay; import com.softsynth.jmsl.util.TuningTable; import com.softsynth.jsyn.circuits.FilteredSawtoothBL; /** * Play a melody with a MusicsShape. Send the output of its instrument to a * signal processing instrument that is turned on() and stays on() (ie no * parameter changes over time) * * @author Nick Didkovsky, didkovn@mail.rockefeller.edu * */ public class SignalProcessingExampleNoChanges extends java.applet.Applet implements ActionListener { Button launchButton; Button finishButton; MusicShape myMusicShape; Instrument melodyIns; SynthNoteAllPortsInstrumentSP signalProcessingIns; JMSLMixerContainer mixer; double[] signalProcessingData; public void init() { JMSLRandom.randomize(); } public void start() { initMusicDevice(); buildMelody(); buildSignalProcessor(); buildMixer(); buildButtons(); } public void stop() { myMusicShape.finishAll(); JMSL.closeMusicDevices(); } private void buildButtons() { add(launchButton = new Button("Launch")); add(finishButton = new Button("Finish")); launchButton.addActionListener(this); finishButton.addActionListener(this); } private void buildMixer() { mixer = new JMSLMixerContainer(); mixer.start(); mixer.addInstrument(melodyIns, 0, 0.5); // hard left mixer.addInstrument(signalProcessingIns, 1, 0.5); // hard right } private void buildSignalProcessor() { // delay line. Use any SynthNote that has a SynthInput named "input" signalProcessingIns = new SynthNoteAllPortsInstrumentSP(8, SimpleDelay.class.getName()); // IMPORTANT!!! Patch signal to processor!!! signalProcessingIns.addSignalSource(melodyIns.getOutput()); } private void buildMelody() { melodyIns = new SynthNoteAllPortsInstrument(8, FilteredSawtoothBL.class.getName()); myMusicShape = new MusicShape(melodyIns.getDimensionNameSpace()); myMusicShape.prefab(); myMusicShape.print(); ((TunedSynthNoteInstrument)melodyIns).setTuning(new TuningTable()); myMusicShape.setInstrument(melodyIns); myMusicShape.setRepeats(1000); myMusicShape.addRepeatPlayable(new Playable() { // scramble every repeat public double play(double time, Composable parent) throws InterruptedException { MusicShape s = (MusicShape) parent; s.scramble(0, s.size() - 1, -1); return time; } }); } private void initMusicDevice() { MusicDevice dev = JSynMusicDevice.instance(); dev.open(); } public void actionPerformed(ActionEvent ev) { Object source = ev.getSource(); if (source == launchButton) { handleLaunch(); } if (source == finishButton) { handleFinish(); } } private void handleFinish() { signalProcessingIns.off(JMSL.now(), 1, signalProcessingData); myMusicShape.finishAll(); launchButton.setEnabled(true); finishButton.setEnabled(false); } private void handleLaunch() { signalProcessingData = MusicShape.getDefaultArray(signalProcessingIns.getDimensionNameSpace()); signalProcessingIns.on(JMSL.now(), 1, signalProcessingData); myMusicShape.launch(JMSL.now()); launchButton.setEnabled(false); finishButton.setEnabled(true); } }