Java MIDI Sequencer

From Java Example Source Code

Jump to: navigation, search

Contents

[edit] Overview - Java MIDI Sequencer

This Java example program introduce how to play a Midi sequence with Java. First, the sequence is played once with track 1 turned off. Then the sequence is played once with track 1 turned on. Track 1 is the drum track in the example midi file..

[edit] Java Source Code

  • Package: brackeen
  • File: MidiTest.java
package brackeen;
 
/*
 * DEVELOPING GAME IN JAVA
 * 
 * Caracteristiques
 * 
 * Editeur : NEW RIDERS Auteur : BRACKEEN Parution : 09 2003 Pages : 972 Isbn : 1-59273-005-1
 * Reliure : Paperback Disponibilite : Disponible a la librairie
 */
 
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
 
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MetaEventListener;
import javax.sound.midi.MetaMessage;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
 
/**
 * An example that plays a Midi sequence. First, the sequence is played once with track 1 turned
 * off. Then the sequence is played once with track 1 turned on. Track 1 is the drum track in the
 * example midi file.
 */
public class MidiTest implements MetaEventListener {
 
    // The drum track in the example Midi file
    private static final int DRUM_TRACK = 1;
 
    public static void main(String[] args) {
	new MidiTest().run();
    }
 
    private MidiPlayer player;
 
    public void run() {
 
	player = new MidiPlayer();
 
	// load a sequence
	Sequence sequence = player.getSequence("../sounds/music.midi");
 
	// play the sequence
	player.play(sequence, true);
 
	// turn off the drums
	System.out.println("Playing (without drums)...");
	Sequencer sequencer = player.getSequencer();
	sequencer.setTrackMute(DRUM_TRACK, true);
	sequencer.addMetaEventListener(this);
    }
 
    /**
     * This method is called by the sound system when a meta event occurs. In this case, when the
     * end-of-track meta event is received, the drum track is turned on.
     */
    public void meta(MetaMessage event) {
	if (event.getType() == MidiPlayer.END_OF_TRACK_MESSAGE) {
	    Sequencer sequencer = player.getSequencer();
	    if (sequencer.getTrackMute(DRUM_TRACK)) {
		// turn on the drum track
		System.out.println("Turning on drums...");
		sequencer.setTrackMute(DRUM_TRACK, false);
	    } else {
		// close the sequencer and exit
		System.out.println("Exiting...");
		player.close();
		System.exit(0);
	    }
	}
    }
 
}
 
class MidiPlayer implements MetaEventListener {
 
    // Midi meta event
    public static final int END_OF_TRACK_MESSAGE = 47;
 
    private Sequencer sequencer;
 
    private boolean loop;
 
    private boolean paused;
 
    /**
     * Creates a new MidiPlayer object.
     */
    public MidiPlayer() {
	try {
	    sequencer = MidiSystem.getSequencer();
	    sequencer.open();
	    sequencer.addMetaEventListener(this);
	} catch (MidiUnavailableException ex) {
	    sequencer = null;
	}
    }
 
    /**
     * Loads a sequence from the file system. Returns null if an error occurs.
     */
    public Sequence getSequence(String filename) {
	try {
	    return getSequence(new FileInputStream(filename));
	} catch (IOException ex) {
	    ex.printStackTrace();
	    return null;
	}
    }
 
    /**
     * Loads a sequence from an input stream. Returns null if an error occurs.
     */
    public Sequence getSequence(InputStream is) {
	try {
	    if (!is.markSupported()) {
		is = new BufferedInputStream(is);
	    }
	    Sequence s = MidiSystem.getSequence(is);
	    is.close();
	    return s;
	} catch (InvalidMidiDataException ex) {
	    ex.printStackTrace();
	    return null;
	} catch (IOException ex) {
	    ex.printStackTrace();
	    return null;
	}
    }
 
    /**
     * Plays a sequence, optionally looping. This method returns immediately. The sequence is not
     * played if it is invalid.
     */
    public void play(Sequence sequence, boolean loop) {
	if (sequencer != null && sequence != null && sequencer.isOpen()) {
	    try {
		sequencer.setSequence(sequence);
		sequencer.start();
		this.loop = loop;
	    } catch (InvalidMidiDataException ex) {
		ex.printStackTrace();
	    }
	}
    }
 
    /**
     * This method is called by the sound system when a meta event occurs. In this case, when the
     * end-of-track meta event is received, the sequence is restarted if looping is on.
     */
    public void meta(MetaMessage event) {
	if (event.getType() == END_OF_TRACK_MESSAGE) {
	    if (sequencer != null && sequencer.isOpen() && loop) {
		sequencer.start();
	    }
	}
    }
 
    /**
     * Stops the sequencer and resets its position to 0.
     */
    public void stop() {
	if (sequencer != null && sequencer.isOpen()) {
	    sequencer.stop();
	    sequencer.setMicrosecondPosition(0);
	}
    }
 
    /**
     * Closes the sequencer.
     */
    public void close() {
	if (sequencer != null && sequencer.isOpen()) {
	    sequencer.close();
	}
    }
 
    /**
     * Gets the sequencer.
     */
    public Sequencer getSequencer() {
	return sequencer;
    }
 
    /**
     * Sets the paused state. Music may not immediately pause.
     */
    public void setPaused(boolean paused) {
	if (this.paused != paused && sequencer != null && sequencer.isOpen()) {
	    this.paused = paused;
	    if (paused) {
		sequencer.stop();
	    } else {
		sequencer.start();
	    }
	}
    }
 
    /**
     * Returns the paused state.
     */
    public boolean isPaused() {
	return paused;
    }
 
}

[edit] What Result You Can Get

Coming soon...

[edit] Required External Libraries and/or Files for this Java Example

Need nothing.


[edit] How to Run this Java Example Program

We recommend running this Java example program with Eclipse.

For assistance in working with Eclipse, please see How to Run Java Program with Eclipse.

It's fairly easy.



[edit] Question & Answer

Any question?

Click edit and post your question or answer here.


Personal tools