/* * 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.ParallelCollection; 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.Warbler; import com.softsynth.jmsl.util.TuningTable; import com.softsynth.jmsl.view.MusicShapeEditor; /** * Play a melody with a MusicShape. 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, nick@didkovsky.com * */ public class SignalProcessingExampleChanges extends JFrame implements ActionListener { Button launchButton; Button finishButton; MusicShape melodyMusicShape; JSynUnitVoiceInstrument melodyIns; MusicShape signalProcessingMusicShape; JSynUnitVoiceInstrument signalProcessingIns; ParallelCollection myCollection; JMSLMixerContainer mixer; MusicShapeEditor se; public void init() { JMSLRandom.randomize(); } public void start() { setLayout(new BorderLayout()); se = new MusicShapeEditor(); add(BorderLayout.CENTER, se.getComponent()); initMusicDevice(); buildMelody(); buildSignalProcessor(); buildCollection(); buildMixer(); buildButtons(); } public void stop() { melodyMusicShape.finishAll(); JMSL.closeMusicDevices(); } private void initMusicDevice() { MusicDevice dev = JSynMusicDevice.instance(); dev.open(); JMSL.clock.setAdvance(0.2); } 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.25); mixer.addInstrument(signalProcessingIns, 1, 0.5); add(BorderLayout.NORTH, mixer.getPanAmpControlPanel()); } private void buildCollection() { myCollection = new ParallelCollection(); myCollection.add(melodyMusicShape); myCollection.add(signalProcessingMusicShape); } private void buildMelody() { melodyIns = new JSynUnitVoiceInstrument(8, FilteredSawtoothBL.class.getName()); melodyMusicShape = new MusicShape(melodyIns.getDimensionNameSpace()); melodyMusicShape.setInstrument(melodyIns); melodyMusicShape.prefab(); melodyMusicShape.setTimeStretch(4); 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); se.refresh(); return time; } }); melodyMusicShape.setName("Melody"); se.addMusicShape(melodyMusicShape); } private void buildSignalProcessor() { // delay line. Use any JSyn UnitVoice that implements UnitSink signalProcessingIns = new JSynUnitVoiceInstrument(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); signalProcessingMusicShape.setName("Signal processor"); se.addMusicShape(signalProcessingMusicShape); } 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); } public static void main(String[] args) { SignalProcessingExampleChanges test = new SignalProcessingExampleChanges(); 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); } }); } }