/* * 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.Warbler; 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. SignalProcessing instrument is played by a * MusicShape that changes its values Shows signal processing changing over * time. * * @author Nick Didkovsky, didkovn@mail.rockefeller.edu * */ public class SignalProcessingExampleChanges extends java.applet.Applet implements ActionListener { Button launchButton; Button finishButton; MusicShape melodyMusicShape; Instrument melodyIns; MusicShape signalProcessingMusicShape; SynthNoteAllPortsInstrumentSP signalProcessingIns; ParallelCollection myCollection; JMSLMixerContainer mixer; public void init() { JMSLRandom.randomize(); } public void start() { initMusicDevice(); buildMelody(); buildSignalProcessor(); buildCollection(); buildMixer(); buildButtons(); } public void stop() { melodyMusicShape.finishAll(); JMSL.closeMusicDevices(); } private void initMusicDevice() { MusicDevice dev = JSynMusicDevice.instance(); dev.open(); } 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.25); mixer.addInstrument(signalProcessingIns, 1, 0.5); } private void buildCollection() { myCollection = new ParallelCollection(); myCollection.add(melodyMusicShape); myCollection.add(signalProcessingMusicShape); } private void buildSignalProcessor() { // delay line. Use any SynthNote that has a SynthInput named "input" signalProcessingIns = new SynthNoteAllPortsInstrumentSP(8, Warbler.class.getName()); // IMPORTANT!!! Patch signal to processor!!! signalProcessingIns.addSignalSource(melodyIns.getOutput()); // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!!! signalProcessingMusicShape = new MusicShape(signalProcessingIns.getDimensionNameSpace()); signalProcessingMusicShape.setInstrument(signalProcessingIns); signalProcessingMusicShape.prefab(); signalProcessingMusicShape.setRepeats(Integer.MAX_VALUE); signalProcessingMusicShape.setTimeStretch(4); } private void buildMelody() { melodyIns = new SynthNoteAllPortsInstrument(8, FilteredSawtoothBL.class.getName()); melodyMusicShape = new MusicShape(melodyIns.getDimensionNameSpace()); melodyMusicShape.setInstrument(melodyIns); melodyMusicShape.prefab(); melodyMusicShape.setTimeStretch(4); ((TunedSynthNoteInstrument)melodyIns).setTuning(new TuningTable()); melodyMusicShape.setRepeats(Integer.MAX_VALUE); melodyMusicShape.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; } }); } public void actionPerformed(ActionEvent ev) { Object source = ev.getSource(); if (source == launchButton) { handleLaunch(); } if (source == finishButton) { handleFinish(); } } private void handleFinish() { myCollection.finishAll(); launchButton.setEnabled(true); finishButton.setEnabled(false); } private void handleLaunch() { myCollection.launch(JMSL.now()); launchButton.setEnabled(false); finishButton.setEnabled(true); } }