/* * Created on Nov 12, 2004 * */ package jmslexamples.jsyn2; import java.awt.BorderLayout; import java.awt.Button; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JPanel; import com.softsynth.jmsl.Composable; import com.softsynth.jmsl.JMSL; import com.softsynth.jmsl.JMSLMixerContainer; import com.softsynth.jmsl.JMSLRandom; import com.softsynth.jmsl.MusicDevice; import com.softsynth.jmsl.MusicShape; import com.softsynth.jmsl.Playable; import com.softsynth.jmsl.jsyn2.JSynMusicDevice; import com.softsynth.jmsl.jsyn2.JSynUnitVoiceInstrument; import com.softsynth.jmsl.jsyn2.unitvoices.FilteredSawtoothBL; import com.softsynth.jmsl.jsyn2.unitvoices.SimpleDelay; import com.softsynth.jmsl.util.TuningTable; import com.softsynth.jmsl.view.MusicShapeEditor; /** * 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, nick@didkovsky.com * */ public class SignalProcessingExampleNoChanges extends JFrame implements ActionListener { Button launchButton; Button finishButton; MusicShape myMusicShape; JSynUnitVoiceInstrument melodyIns; JSynUnitVoiceInstrument signalProcessingIns; JMSLMixerContainer mixer; double[] signalProcessingData; MusicShapeEditor se; public void init() { JMSLRandom.randomize(); JMSL.clock.setAdvance(0.2); } public void start() { setLayout(new BorderLayout()); se = new MusicShapeEditor(); add(BorderLayout.CENTER, se.getComponent()); initMusicDevice(); buildMelody(); buildSignalProcessor(); buildMixer(); buildButtons(); } public void stop() { myMusicShape.finishAll(); JMSL.closeMusicDevices(); } private void buildButtons() { JPanel p = new JPanel(); p.setLayout(new FlowLayout()); p.add(launchButton = new Button("Launch")); p.add(finishButton = new Button("Finish")); add(BorderLayout.SOUTH, p); launchButton.addActionListener(this); finishButton.addActionListener(this); } private void buildMixer() { mixer = new JMSLMixerContainer(); mixer.start(); mixer.addInstrument(melodyIns, 0, 0.35); // hard left mixer.addInstrument(signalProcessingIns, 1, 0.95); // hard right add(BorderLayout.NORTH, mixer.getPanAmpControlPanel()); } private void buildSignalProcessor() { // delay line. Use any UnitVoice that implements UnitSink signalProcessingIns = new JSynUnitVoiceInstrument(8, SimpleDelay.class.getName()); // IMPORTANT!!! Patch signal to processor!!! signalProcessingIns.addSignalSource(melodyIns.getOutput()); } private void buildMelody() { melodyIns = new JSynUnitVoiceInstrument(8, FilteredSawtoothBL.class.getName()); myMusicShape = new MusicShape(melodyIns.getDimensionNameSpace()); myMusicShape.prefab(); myMusicShape.print(); 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); se.refresh(); return time; } }); se.addMusicShape(myMusicShape); } 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(); } } /* * store the token returned when ins.on() is called, so we can turn it off() and * retrieve the correct allocated circuit */ Integer signalProcessingVoiceToken = null; private void handleFinish() { if (signalProcessingVoiceToken != null) { System.out.println("Turning ins off() by referencing voice token stored from on(): " + signalProcessingVoiceToken); signalProcessingIns.off(JMSL.now(), signalProcessingVoiceToken); } myMusicShape.finishAll(); launchButton.setEnabled(true); finishButton.setEnabled(false); } private void handleLaunch() { signalProcessingData = MusicShape.getDefaultArray(signalProcessingIns.getDimensionNameSpace()); signalProcessingVoiceToken = (Integer) signalProcessingIns.on(JMSL.now(), 1, signalProcessingData); myMusicShape.launch(JMSL.now()); launchButton.setEnabled(false); finishButton.setEnabled(true); } public static void main(String[] args) { SignalProcessingExampleNoChanges test = new SignalProcessingExampleNoChanges(); test.init(); test.start(); test.pack(); test.setVisible(true); test.addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent e) { System.exit(0); } }); } }