package jmsltestsuite; import java.awt.*; import java.awt.event.*; import com.softsynth.jmsl.*; import com.softsynth.jmsl.midi.*; import com.softsynth.jmsl.view.TextAreaOut; /** * Bring up a frame with Midi record/stop/play buttons. * * @author Nick Didkovsky, Phil Burk * */ public class MidiRecorderTest extends Frame implements Playable, ActionListener { Button recordButton; Button stopButton; Button playButton; TextArea textArea; MidiNoteRecorder shapeRecorder; MidiInstrument midiIns; MidiParser parser; final int MODE_PLAYING = 2; final int MODE_RECORDING = 1; final int MODE_STOPPED = 0; int mode = MODE_STOPPED; Checkbox thru; public MidiRecorderTest() { buildGUI(); buildRecorder(); WindowAdapter windowAdapter = new WindowAdapter() { public void windowClosing(WindowEvent e) { JMSL.closeMusicDevices(); System.exit(0); } }; addWindowListener(windowAdapter); } void buildGUI() { removeAll(); setLayout(new BorderLayout(10, 10)); textArea = new TextArea(20, 80); JMSL.setSTDOut(new TextAreaOut(textArea)); add("South", textArea); Panel p = new Panel(); p.add(thru = new Checkbox("Thru while recording", true)); p.add(recordButton = new Button("Record")); p.add(stopButton = new Button("Stop")); p.add(playButton = new Button("Play")); stopButton.setEnabled(false); playButton.setEnabled(false); add("North", p); recordButton.addActionListener(this); stopButton.addActionListener(this); playButton.addActionListener(this); } void buildRecorder() { // create an extended shape that can record notes shapeRecorder = new MidiNoteRecorder(); MidiInstrument midiIns = new MidiInstrument(1); // set up instrument on channel 1 shapeRecorder.setInstrument(midiIns); midiIns.setInterpreter(new NoteOnOffInterpreter()); parser = new MidiParser(); parser.addMidiListener(shapeRecorder); } synchronized void handleStart() { JMSL.midi.addMidiParser(parser); shapeRecorder.setThru(thru.getState()); shapeRecorder.startRecording(JMSL.now()); System.out.println("Start"); mode = MODE_RECORDING; recordButton.setEnabled(false); stopButton.setEnabled(true); playButton.setEnabled(false); } synchronized void handleStop() { if (mode == MODE_RECORDING) { shapeRecorder.stopRecording(JMSL.now()); JMSL.midi.removeMidiParser(parser); // take it out so polling doesn't hog CPU } else { shapeRecorder.finish(); } mode = MODE_STOPPED; recordButton.setEnabled(true); stopButton.setEnabled(false); playButton.setEnabled(true); } /** Called by shape when finished playing. * @return time finished */ public double play(double stopTime, Composable thing) { handleStop(); return stopTime; } synchronized void handlePlay() { shapeRecorder.addStopPlayable(this); shapeRecorder.launch(JMSL.now()); recordButton.setEnabled(false); stopButton.setEnabled(true); playButton.setEnabled(false); mode = MODE_PLAYING; } public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if (source == recordButton) { handleStart(); } else if (source == stopButton) { handleStop(); } else if (source == playButton) { handlePlay(); } } public static void main(String args[]) { MidiRecorderTest f = new MidiRecorderTest(); MusicDevice dev = MidiIO_MidiShare.instance(); dev.edit(f); dev.open(); f.pack(); f.setVisible(true); } }