package jmsltestsuite; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Frame; import java.awt.GridLayout; 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 com.didkovsky.portview.PVButton; import com.didkovsky.portview.PVPanel; import com.softsynth.jmsl.JMSL; import com.softsynth.jmsl.JMSLMixerContainer; import com.softsynth.jmsl.MusicDevice; import com.softsynth.jmsl.MusicShape; import com.softsynth.jmsl.ParallelCollection; import com.softsynth.jmsl.midi.MidiIO_JavaSound; import com.softsynth.jmsl.midi.MidiInstrument; import com.softsynth.jmsl.view.MusicShapeEditor; import com.softsynth.jmsl.view.PVPanelAdapter; /** * Perform some Midi melodies, change them in the MusicShapeEditor, and log them * as they are being played. Write a type 1 MIDI file "TestMidiLogger.MID" . * * @author Nick Didkovsky */ public class TestMidiLoggerRealTime extends Frame implements ActionListener { PVButton goButton; PVButton stopButton; PVButton writeMIDIFileButton; ParallelCollection col; public TestMidiLoggerRealTime() { addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { quit(); } }); setLayout(new BorderLayout()); PVPanel p = new PVPanelAdapter(); p.setLayout(new GridLayout(1, 0)); p.add((goButton = JMSL.getViewFactory().createButton("GO")).getComponent()); p.add((stopButton = JMSL.getViewFactory().createButton("STOP")).getComponent()); p.add((writeMIDIFileButton = JMSL.getViewFactory().createButton("Write MIDI File")).getComponent()); add(BorderLayout.SOUTH, p.getComponent()); goButton.addActionListener(this); stopButton.addActionListener(this); writeMIDIFileButton.addActionListener(this); stopButton.setEnabled(false); writeMIDIFileButton.setEnabled(false); goButton.setBackground(Color.green); initMidi(); build(); } void initMidi() { MusicDevice dev = MidiIO_JavaSound.instance(); // MusicDevice dev = MidiIO_MidiShare.instance(); dev.edit(this); dev.open(); JMSL.clock.setAdvance(0.1); JMSL.midi.setMidiLogging(true); } void build() { MidiInstrument ins1 = new MidiInstrument(1); MidiInstrument ins2 = new MidiInstrument(2, 68); // channel, program // change MusicShape s1 = new MusicShape(ins1.getDimensionNameSpace()); s1.add(0.0, 64, 100, 2.0); s1.add(0.0, 66, 90, 2.5); s1.add(1.5, 69, 80, 1.5); s1.add(0.0, 72, 70, 2.5); s1.add(1.5, 75, 100, 2.0); s1.setInstrument(ins1); s1.setRepeats(100); s1.setName("Piano"); MusicShape s2 = new MusicShape(ins2.getDimensionNameSpace()); s2.add(0.3333, 72, 70, 0.33); s2.add(0.3333, 74, 80, 0.33); s2.add(0.3333, 77, 70, 0.33); s2.add(0.6666, 80, 85, 0.66); s2.add(0.3333, 73, 70, 0.33); s2.setInstrument(ins2); s2.setRepeats(100); s2.setName("Oboe"); MusicShapeEditor se = new MusicShapeEditor(); se.addMusicShape(s1); se.addMusicShape(s2); add(BorderLayout.NORTH, se.getComponent()); col = new ParallelCollection(); col.add(s1); col.add(s2); // PUT UP A MIDI MIXER // pan/amp changes will not be recorded unless you move them while // logging is enabled because in this demo, logging is only enabled when // GO is pressed JMSLMixerContainer mixer = new JMSLMixerContainer(); mixer.addInstrument(ins1); mixer.addInstrument(ins2); mixer.start(); Frame myFrame = new Frame("MIDI mixer"); myFrame.add(mixer.getPanAmpControlPanel()); //Dimension mixerFrameDimension = // com.softsynth.jmsl.view.PanAmpPanel.getSuggestedFrameSize(mixer.getNumFaders() // + 1); //f.setSize(mixerFrameDimension); myFrame.pack(); myFrame.setVisible(true); myFrame.toFront(); this.setLocation(myFrame.getWidth(), 0); } void quit() { JMSL.midi.close(); System.exit(0); } public void actionPerformed(ActionEvent ev) { Object source = ev.getSource(); if (source == goButton) { JMSL.midi.clearMidiLog(); JMSL.midi.setMidiLogging(true); col.launch(JMSL.now()); goButton.setEnabled(false); writeMIDIFileButton.setEnabled(false); stopButton.setEnabled(true); setTitle("Playing"); } if (source == stopButton) { col.finishAll(); JMSL.midi.setMidiLogging(false); goButton.setEnabled(true); writeMIDIFileButton.setEnabled(true); setTitle("Stopped"); } if (source == writeMIDIFileButton) { try { JMSL.midi.writeMidiFile("TestMidiLogger.MID"); setTitle("MIDI File written to TestMidiLogger.MID"); } catch (IOException ioe) { System.out.println("Cannot write midi file " + ioe); ioe.printStackTrace(); } } } public static void main(String args[]) { TestMidiLoggerRealTime testMidiLogger = new TestMidiLoggerRealTime(); testMidiLogger.pack(); testMidiLogger.setVisible(true); } }