/* * Created on Sep 15, 2003 * */ package jmsltestsuite; import java.awt.Frame; import com.didkovsky.portview.PVFrame; import com.didkovsky.portview.PVPanel; import com.didkovsky.portview.swing.ViewFactorySwing; import com.softsynth.jmsl.Instrument; import com.softsynth.jmsl.InstrumentAdapter; import com.softsynth.jmsl.JMSL; import com.softsynth.jmsl.JMSLMixerContainer; import com.softsynth.jmsl.MusicShape; import com.softsynth.jmsl.ParallelCollection; import com.softsynth.jmsl.midi.MidiIO_JavaSound; /** * Add wildly heterogeneous Instruments to a JMSLMixer. Test mixing JSyn and * Midi and instruments with no sound at all. Use MidiIO_JavaSound for midi * output. Note that midi output will be rhythmically unstable. * * @author Nick Didkovsky, email: didkovn@mail.rockefeller.edu, (c) 2003 Nick * Didkovsky, all rights reserved. * */ public class TestJMSLMixerContainer { public static void initMusicDevice(java.awt.Frame f, Instrument ins) { System.out.println("ins.MusicDevice " + ins.getMusicDevice().toString()); if (ins.getMusicDevice() == null) return; if (ins.getMusicDevice().getEditEnabled()) { ins.getMusicDevice().edit(f); } ins.getMusicDevice().open(); ins.getMusicDevice().setEditEnabled(false); } public static void main(String[] args) { JMSL.setViewFactory(new ViewFactorySwing()); JMSL.midi = MidiIO_JavaSound.instance(); PVFrame f = JMSL.getViewFactory().createFrame("JMSLMixer"); f.addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent e) { JMSL.closeMusicDevices(); System.exit(0); } }); JMSL.clock.setAdvance(0.1); // We will initialize MusicDevices without referring to any MusicDevice // explicitely... // Here's a JSyn Instrument com.softsynth.jmsl.jsyn.JSynInsFromClassName ins1 = new com.softsynth.jmsl.jsyn.JSynInsFromClassName(); TestJMSLMixerContainer.initMusicDevice((Frame) f.getComponent(), ins1); ins1.setName("Mono (JSyn)"); ins1.setMaxVoices(4); ins1.setSynthNoteClassName("com.softsynth.jsyn.circuits.FilteredSawtoothBL"); ins1.buildFromAttributes(); MusicShape s1 = new MusicShape(4); s1.add(0.5, 60, 0.5, 0.28); s1.add(0.5, 72, 0.5, 0.28); s1.setRepeats(10000); s1.setInstrument(ins1); // Here's another JSyn Instrument, this one with two outputs com.softsynth.jmsl.jsyn.JSynInsFromClassName ins2 = new com.softsynth.jmsl.jsyn.JSynInsFromClassName(); TestJMSLMixerContainer.initMusicDevice((Frame) f.getComponent(), ins2); ins2.setName("Pan Me! (JSyn)"); ins2.setMaxVoices(4); ins2.setSynthNoteClassName("com.softsynth.jmsl.jsyn.circuits.AutopanningSawtooth"); ins2.buildFromAttributes(); MusicShape s2 = new MusicShape(4); s2.add(0.75, 67, 0.5, 1.68); s2.add(0.75, 79, 0.5, 1.68); s2.setRepeats(10000); s2.setInstrument(ins2); // Here's a MidiInstrument that sends on channel 2 com.softsynth.jmsl.midi.MidiInstrument ins3 = new com.softsynth.jmsl.midi.MidiInstrument(2); TestJMSLMixerContainer.initMusicDevice((Frame) f.getComponent(), ins3); ins3.setName("Midi"); MusicShape s3 = new MusicShape(4); s3.add(0.333, 67, 120, 1.68); s3.add(0.333, 79, 120, 1.68); s3.setRepeats(10000); s3.setInstrument(ins3); // JMSLMixer, add these heterogenous instruments JMSLMixerContainer mixer = new JMSLMixerContainer(); mixer.addInstrument(ins1); mixer.addInstrument(ins2); mixer.addInstrument(ins3, 0.5, 0.65); // set initial pan=0.5, amp=0.65 // add a completely generic Instrument as well. Instrument quietIns = new InstrumentAdapter(); quietIns.setName("Quiet ins"); mixer.addInstrument(quietIns); // START MIXER! mixer.start(); // Set up a GUI with pan/amp panels PVPanel faderPanel = JMSL.getViewFactory().createPanel(); faderPanel.setLayout(new java.awt.GridLayout(1, 0, 20, 10)); for (int i = 0; i < mixer.getNumFaders(); i++) { System.out.println("" + mixer.getPan(i) + ", " + mixer.getAmp(i)); com.softsynth.jmsl.view.PanAmpPanel panel = new com.softsynth.jmsl.view.PanAmpPanel(mixer.getPan(i), mixer .getAmp(i), mixer); panel.setFaderName(mixer.getInstrument(i).getName()); faderPanel.add(panel.getComponent()); } f.add(faderPanel.getComponent()); f.pack(); // f.setSize(mixer.getNumFaders() * 100, 400); f.setVisible(true); ParallelCollection col = new ParallelCollection(); col.add(s1); col.add(s2); col.add(s3); col.launch(JMSL.now()); } }