/*
* 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);
}
});
}
}