From ff335bbc81a3746746fbde28f428a8dbbf788ab3 Mon Sep 17 00:00:00 2001 From: Sam Archer Date: Sun, 9 Oct 2011 03:17:17 -0700 Subject: [PATCH] Renamed Main to MoppySequencer to support UI. --- .gitignore | 3 +- Java/MoppyDesk/src/moppydesk/Main.java | 107 ------------------ .../src/moppydesk/MoppySequencer.java | 99 ++++++++++++++++ 3 files changed, 101 insertions(+), 108 deletions(-) delete mode 100644 Java/MoppyDesk/src/moppydesk/Main.java create mode 100644 Java/MoppyDesk/src/moppydesk/MoppySequencer.java diff --git a/.gitignore b/.gitignore index b7bdf8c..24c48db 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /Java/MoppyDesk/nbproject/private/ -/Java/MoppyDesk/build/ \ No newline at end of file +/Java/MoppyDesk/build/ +/Java/MoppyDesk/dist/ \ No newline at end of file diff --git a/Java/MoppyDesk/src/moppydesk/Main.java b/Java/MoppyDesk/src/moppydesk/Main.java deleted file mode 100644 index fa63a8e..0000000 --- a/Java/MoppyDesk/src/moppydesk/Main.java +++ /dev/null @@ -1,107 +0,0 @@ -package moppydesk; - -/** - * - * @author Sammy1Am - */ -import gnu.io.NoSuchPortException; -import gnu.io.PortInUseException; -import gnu.io.UnsupportedCommOperationException; -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.sound.midi.InvalidMidiDataException; -import javax.sound.midi.MidiSystem; -import javax.sound.midi.MidiUnavailableException; -import javax.sound.midi.Sequence; -import javax.sound.midi.Sequencer; - -public class Main { - - /** - * @param args the command line arguments - */ - public static void main(String[] args) { - - MoppyBridge mb = null; - MoppyPlayer mp = null; - - try { - mb = new MoppyBridge("COM6"); //Create MoppyBridge on the COM port with the Arduino - mp = new MoppyPlayer(mb); - - mb.resetDrives(); - - //Load a MIDI file (TODO: Make this an argument, or a GUI window) - Sequence sequence = MidiSystem.getSequence(new File("samplesongs/KirbysTheme.mid")); - - final Sequencer sequencer = MidiSystem.getSequencer(false); - - //Start a new thread to listen on the command-line to exit the program early - new Thread(){ - @Override - public void run(){ - BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - while (true){ - try { - if (br.readLine().equalsIgnoreCase("exit")) { - sequencer.stop(); - sequencer.close(); - System.exit(0); - } - } catch (IOException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } - } - } - }.start(); - - - //Start the sequencer, and set the tempo (not being read from file!) - sequencer.open(); - sequencer.setSequence(sequence); - sequencer.setTempoInBPM(160); - System.out.println(sequence.getTracks().length); - sequencer.getTransmitter().setReceiver(mp); // Set MoppyPlayer as a receiver. - - sequencer.start(); //GO! - - //Wait til the sequence is done... - while (sequencer.isRunning()){ - Thread.sleep(3000); - } - - //Close the sequencer - sequencer.close(); - - } catch (MidiUnavailableException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } catch (InvalidMidiDataException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } catch (InterruptedException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } catch (NoSuchPortException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } catch (PortInUseException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } catch (UnsupportedCommOperationException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } catch (IOException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } finally { - //Reset everything and close down cleanly (hopefully) - if (mb != null){ - mb.resetDrives(); - mb.close(); - } - if (mp != null){ - mp.close(); - } - } - - System.exit(0); - } -} diff --git a/Java/MoppyDesk/src/moppydesk/MoppySequencer.java b/Java/MoppyDesk/src/moppydesk/MoppySequencer.java new file mode 100644 index 0000000..830d70b --- /dev/null +++ b/Java/MoppyDesk/src/moppydesk/MoppySequencer.java @@ -0,0 +1,99 @@ +package moppydesk; + +import gnu.io.NoSuchPortException; +import gnu.io.PortInUseException; +import gnu.io.UnsupportedCommOperationException; +import java.io.File; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.ArrayList; +import javax.sound.midi.InvalidMidiDataException; +import javax.sound.midi.MetaEventListener; +import javax.sound.midi.MetaMessage; +import javax.sound.midi.MidiMessage; +import javax.sound.midi.MidiSystem; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Receiver; +import javax.sound.midi.Sequence; +import javax.sound.midi.Sequencer; + +/** + * + * @author Sammy1Am + */ +public class MoppySequencer implements MetaEventListener{ + + MoppyBridge mb; + MoppyPlayer mp; + Sequencer sequencer; + ArrayList listeners = new ArrayList(1); + + public MoppySequencer(String comPort) throws NoSuchPortException, PortInUseException, UnsupportedCommOperationException, IOException, MidiUnavailableException { + mb = new MoppyBridge("COM6"); //Create MoppyBridge on the COM port with the Arduino + mp = new MoppyPlayer(mb); + + mb.resetDrives(); + + sequencer = MidiSystem.getSequencer(false); + sequencer.open(); + sequencer.getTransmitter().setReceiver(mp); // Set MoppyPlayer as a receiver. + sequencer.addMetaEventListener(this); + } + + public void loadFile(String filePath) throws InvalidMidiDataException, IOException, MidiUnavailableException { + + sequencer.stop(); + Sequence sequence = MidiSystem.getSequence(new File(filePath)); + + sequencer.setSequence(sequence); + System.out.println("Loaded sequence with "+sequence.getTracks().length+" tracks."); + } + + public void startSequencer(){ + sequencer.start(); + } + + public void stopSequencer(){ + sequencer.stop(); + mb.resetDrives(); + } + + public void setTempo(float newTempo){ + sequencer.setTempoInBPM(newTempo); + } + + public void addListener(MoppyStatusConsumer newListener){ + listeners.add(newListener); + } + + public void removeListener(MoppyStatusConsumer oldListener){ + listeners.remove(oldListener); + } + + public void closeSequencer(){ + stopSequencer(); + sequencer.close(); + mp.close(); + } + + public void meta(MetaMessage meta) { + if (meta.getType() == 81){ + int uSecondsPerQN = 0; + uSecondsPerQN |= meta.getData()[0] & 0xFF; + uSecondsPerQN <<= 8; + uSecondsPerQN |= meta.getData()[1] & 0xFF; + uSecondsPerQN <<= 8; + uSecondsPerQN |= meta.getData()[2] & 0xFF; + + int newTempo = 60000000/uSecondsPerQN; + + sequencer.setTempoInBPM(newTempo); + for (MoppyStatusConsumer c : listeners){ + c.tempoChanged(newTempo); + } + + System.out.println("Tempo changed to: " + newTempo); + } + } +}