/* * Created on Nov 11, 2012 by Nick * */ package jmslexamples.jsyn2; import java.awt.BorderLayout; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import com.didkovsky.portview.swing.ViewFactorySwing; import com.softsynth.jmsl.Composable; import com.softsynth.jmsl.EventScheduler; import com.softsynth.jmsl.Instrument; import com.softsynth.jmsl.JMSL; import com.softsynth.jmsl.JMSLMixerContainer; import com.softsynth.jmsl.JMSLRandom; 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.view.MusicShapeEditor; /** * One MusicShape plays SubtractiveSynthVoice, another plays a SimpleDelay. The * first is patched into the second. Use the MusicShapeEditor to change values. * * @author Nick Didkovsky, (c) 2012 Nick Didkovsky, nick@didkovsky.com * */ public class JSyn2SignalProcessing extends JFrame { JMSLMixerContainer mixer; Instrument instrument; JSynUnitVoiceInstrument delayInstrument; MusicShape musicShape; MusicShape signalProcessingMusicShape; ParallelCollection par; public void start() { initJMSL(); initMusicDevices(); buildMixer(); buildInstruments(); buildMusicShape(); buildMusicShapeEditor(); launchCollection(); } private void initJMSL() { JMSL.setViewFactory(new ViewFactorySwing()); JMSL.scheduler = new EventScheduler(); JMSL.scheduler.start(); JMSL.clock.setAdvance(0.1); } private void initMusicDevices() { JSynMusicDevice.instance().open(); } private void buildMixer() { mixer = new JMSLMixerContainer(); mixer.start(); } /* * create two instruments. One plays a melody and the other plays a delay * circuit. patch the output of the melody instrument into the delay instrument. */ private void buildInstruments() { // instrument = new JSynUnitVoiceInstrument(8, // com.jsyn.instruments.SubtractiveSynthVoice.class.getName()); instrument = new JSynUnitVoiceInstrument(8, com.softsynth.jmsl.jsyn2.unitvoices.FilteredSawtoothBL.class.getName()); mixer.addInstrument(instrument); delayInstrument = new JSynUnitVoiceInstrument(8, com.softsynth.jmsl.jsyn2.unitvoices.SimpleDelay.class.getName()); mixer.addInstrument(delayInstrument); /* PATCH THEM ! */ delayInstrument.addSignalSource(instrument.getOutput()); MusicShape s = new MusicShape(instrument.getDimensionNameSpace()); s.prefab(); s.print(); /* pan them */ mixer.panAmpChange(0, 0.0, 0.25); // fadexIndex, pan, amp mixer.panAmpChange(1, 1.0, 0.5); add(BorderLayout.SOUTH, mixer.getPanAmpControlPanel()); } protected void buildMusicShape() { musicShape = new MusicShape(instrument.getDimensionNameSpace()); musicShape.setInstrument(instrument); musicShape.prefab(); musicShape.setRepeats(10000); musicShape.setName("Signal source (left)"); signalProcessingMusicShape = new MusicShape(delayInstrument.getDimensionNameSpace()); signalProcessingMusicShape.setInstrument(delayInstrument); signalProcessingMusicShape.prefab(); signalProcessingMusicShape.setRepeats(10000); signalProcessingMusicShape.setName("Sig Processor (right)"); // just for fun, add a scrambler to the melody to possibly change it every time // it repeats musicShape.addRepeatPlayable(new Playable() { public double play(double time, Composable parent) throws InterruptedException { MusicShape s = (MusicShape) parent; // treat parent like a MusicShape because we // know it is one if (JMSLRandom.choose() < 0.2) { s.scramble(0, s.size() - 1, 1); } return time; } }); } private void buildMusicShapeEditor() { MusicShapeEditor se = new MusicShapeEditor(); se.addMusicShape(musicShape); se.addMusicShape(signalProcessingMusicShape); add(BorderLayout.NORTH, se.getComponent()); } private void launchCollection() { par = new ParallelCollection(musicShape, signalProcessingMusicShape); par.launch(JMSL.now()); } public void stop() { par.finishAll(); try { par.waitForDone(); } catch (InterruptedException e) { e.printStackTrace(); } JMSL.scheduler.stop(); JMSL.closeMusicDevices(); } public static void main(String[] args) { JSyn2SignalProcessing test = new JSyn2SignalProcessing(); test.setSize(900, 700); test.setVisible(true); test.start(); test.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { test.stop(); System.exit(0); } }); } }