/* * Created on May 27, 2004 * */ package jmslexamples; import java.awt.BorderLayout; import java.awt.Button; import java.awt.FlowLayout; import java.awt.Label; import java.awt.Panel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; import javax.swing.JFrame; import com.softsynth.jmsl.Composable; import com.softsynth.jmsl.DefaultMusicClock; import com.softsynth.jmsl.EventScheduler; import com.softsynth.jmsl.JMSL; import com.softsynth.jmsl.JMSLMixerContainer; import com.softsynth.jmsl.JMSLRandom; import com.softsynth.jmsl.MusicShape; import com.softsynth.jmsl.Playable; import com.softsynth.jmsl.midi.MidiIOFactory; import com.softsynth.jmsl.midi.MidiInstrument; /** * * Play a self-modifying MusicShape with a JMSL MidiInstrument using MidiShare * as MusicDevice
*
* * First install and test MidiShare!!! JMSL has a couple of MidiShare * applications in the src/testmidishare folder. Get those working before you * try this. * * We have some personal logs created during MidiShare installations which you * can check out. * * MidiShare Installation notes for Windows, see... * http://www.algomusic.com/jmsl/midishare_install_notes_win_0903.txt (April * 2005) * * Installation notes for OSX see... * http://www.algomusic.com/jmsl/MidiShare_OSX_Panther_InstallationLog.txt (May * 2004) and * http://www.algomusic.com/jmsl/MidiShare_install_log_OSX_2016-12-16.txt (Dec * 2016) * * If you are using a 64 bit OSX you need to add -d32 to the VM Arguments to run * MidiShare. This worked great for me in Dec 2016 under OSX 10.9 * * Sorry I personally cannot get MidiShare + Java working under Windows 10. I'd * have install a 32 bit JVM and I'm out of gas on this. * * Nick Didkovsky * * @author Nick Didkovsky, email: nick@didkovsky.com, (c) 2016 Nick Didkovsky, * all rights reserved. */ public class JavaSoundMIDIExample2 extends JFrame implements ActionListener { JMSLMixerContainer mixer; MusicShape musicShape; Button startButton; Button stopButton; private void initMIDI() throws IOException { JMSL.midi = new MidiIOFactory().getMidiIO(MidiIOFactory.MidiIO_JAVASOUND); JMSL.midi.edit(this); JMSL.midi.open(); } public void start() throws IOException { JMSLRandom.randomize(); JMSL.clock = new DefaultMusicClock(); JMSL.scheduler = new EventScheduler(); JMSL.scheduler.start(); JMSL.clock.setAdvance(0.1); initMIDI(); buildMixer(); buildMusicShape(); buildGUI(); } public void stop() { musicShape.finishAll(); try { musicShape.waitForDone(); } catch (InterruptedException e) { e.printStackTrace(); } JMSL.scheduler.stop(); JMSL.closeMusicDevices(); removeAll(); } private void buildMixer() { mixer = new JMSLMixerContainer(); mixer.start(); } private void buildGUI() { setLayout(new BorderLayout()); Panel p = new Panel(); p.setLayout(new FlowLayout(FlowLayout.LEFT)); p.add(startButton = new Button("START")); p.add(stopButton = new Button("STOP")); add(BorderLayout.SOUTH, p); add(BorderLayout.NORTH, new Label(JMSL.version)); add(BorderLayout.CENTER, mixer.getPanAmpControlPanel()); stopButton.setEnabled(false); startButton.addActionListener(this); stopButton.addActionListener(this); } private void buildMusicShape() { MidiInstrument ins = new MidiInstrument(1); mixer.addInstrument(ins); musicShape = new MusicShape(4); musicShape.add(0.5, 60, 90, 1.0); musicShape.add(0.75, 63, 110, 1.0); musicShape.add(0.75, 58, 120, 1.0); musicShape.add(0.5, 68, 80, 1.0); musicShape.setRepeats(Integer.MAX_VALUE); musicShape.setInstrument(ins); musicShape.addRepeatPlayable(new Playable() { public double play(double time, Composable parent) throws InterruptedException { MusicShape ms = (MusicShape) parent; ms.scramble(0, ms.size() - 1, 1); if (JMSLRandom.choose() < 0.6) { ms.scramble(0, ms.size() - 1, 0); } ms.transpose(JMSLRandom.choose(-7, 7), 0, ms.size() - 1, 1); ms.calcStats(); if (ms.getMin(1) < 30) { ms.transpose(JMSLRandom.choose(1, 4) * 12, 0, ms.size() - 1, 1); } if (ms.getMin(1) > 80) { ms.transpose(JMSLRandom.choose(1, 4) * -12, 0, ms.size() - 1, 1); } return time; } }); } public void actionPerformed(ActionEvent ev) { Object source = ev.getSource(); if (source == startButton) { musicShape.launch(JMSL.now()); startButton.setEnabled(false); stopButton.setEnabled(true); } if (source == stopButton) { musicShape.finishAll(); startButton.setEnabled(true); stopButton.setEnabled(false); } } public static void main(String[] args) { final JavaSoundMIDIExample2 example = new JavaSoundMIDIExample2(); try { example.start(); example.pack(); example.setVisible(true); } catch (IOException e1) { e1.printStackTrace(); } example.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { example.stop(); System.exit(0); } }); } }