/* * tests if using two sequencers can give the effect of continous playback * of several midi files */ import javax.sound.midi.*; import java.io.File; import java.io.IOException; public class SeqSwapTest implements MetaEventListener { private Sequencer player1, player2; private Sequence seq1, seq2; private int beingPlayed; private boolean swapping = true; public SeqSwapTest(String file1, String file2) { // loading midifiles try { seq1 = MidiSystem.getSequence(new File(file1)); seq2 = MidiSystem.getSequence(new File(file2)); } catch (NullPointerException e) { System.out.println("Error reading files: " + file1 + " " + file2); System.exit(1); } catch (InvalidMidiDataException e) { System.out.println("Midi error in files: " + file1 + " " + file2); System.exit(1); } catch (IOException e) { System.out.println("I/O error loading files: " + file1 + " " + file2); System.exit(1); } // getting players try { player1 = MidiSystem.getSequencer(); player2 = MidiSystem.getSequencer(); player1.open(); player2.open(); player1.addMetaEventListener(this); player2.addMetaEventListener(this); } catch (MidiUnavailableException e) { System.out.println("Error configuring players"); System.exit(1); } // setting sequences try { player1.setSequence(seq1); player2.setSequence(seq2); } catch (InvalidMidiDataException e) { System.out.println("Error in midisequences"); System.exit(1); } } public void startPlayer() { if (swapping) System.out.println("Using swapping..."); else System.out.println("No swapping..."); player1.start(); beingPlayed = 1; } /* metaeventlistener implementation, listens for "end of track", when reached ends playback, then starts the other player */ public void meta(MetaMessage meta) { if (meta.getType() == 47) { // 47 is end of track in SMF if (swapping) { if (beingPlayed == 1) { player2.start(); player1.stop(); beingPlayed = 2; } else if (beingPlayed == 2) { player1.start(); player2.stop(); beingPlayed = 1; } } else { if (beingPlayed == 1) { try { player1.setSequence(seq2); beingPlayed = 2; } catch (Exception ignored) {}; player1.start(); } else if (beingPlayed == 2) { try { player1.setSequence(seq1); beingPlayed = 1; } catch (Exception ignored) {}; player1.start(); } } } } public static void main(String[] args) { //SeqSwapTest foo = new SeqSwapTest("drum01.mid", "drum02.mid"); SeqSwapTest foo = new SeqSwapTest("complex01.mid", "complex01.mid"); foo.startPlayer(); } }