/*
* DumpSequence.java
*
* This file is part of jsresources.org
*/
/*
* Copyright (c) 1999, 2000 by Matthias Pfisterer
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
|<--- this code is formatted to fit into 80 columns --->|
*/
import java.io.File;
import java.io.IOException;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.Sequence;
import javax.sound.midi.Track;
import javax.sound.midi.MidiEvent;
import javax.sound.midi.MidiMessage;
import javax.sound.midi.ShortMessage;
import javax.sound.midi.MetaMessage;
import javax.sound.midi.SysexMessage;
import javax.sound.midi.Receiver;
/** <titleabbrev>DumpSequence</titleabbrev>
<title>Displaying the content of a MIDI file</title>
<formalpara><title>Purpose</title>
<para>Dumps the decoded content of a MIDI file to the console.</para>
</formalpara>
<formalpara><title>Usage</title>
<para>
<cmdsynopsis><command>java DumpSequence</command>
<arg choice="plain"><replaceable class="parameter">midifile</replaceable></arg>
</cmdsynopsis>
</para></formalpara>
<formalpara><title>Parameters</title>
<variablelist>
<varlistentry>
<term><replaceable class="parameter">midifile</replaceable></term>
<listitem><para>the filename of the MIDI file that should be displayed</para></listitem>
</varlistentry>
</variablelist>
</formalpara>
<formalpara><title>Bugs, limitations</title>
<para>Meta and system common events are not displayed in detail.</para>
</formalpara>
<formalpara><title>Source code</title>
<para>
<ulink url="DumpSequence.java.html">DumpSequence.java</ulink>,
<ulink url="DumpReceiver.java.html">DumpReceiver.java</ulink>
</para>
</formalpara>
*/
public class DumpSequence
{
private static String[] sm_astrKeyNames = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"};
private static Receiver sm_receiver = new DumpReceiver(System.out, true);
public static void main(String[] args)
{
/*
* We check that there is exactely one command-line
* argument. If not, we display the usage message and
* exit.
*/
if (args.length != 1)
{
out("DumpSequence: usage:");
out("\tjava DumpSequence <midifile>");
System.exit(1);
}
/*
* Now, that we're shure there is an argument, we take it as
* the filename of the soundfile we want to play.
*/
String strFilename = args[0];
File midiFile = new File(strFilename);
/*
* We try to get a Sequence object, which the content
* of the MIDI file.
*/
Sequence sequence = null;
try
{
sequence = MidiSystem.getSequence(midiFile);
}
catch (InvalidMidiDataException e)
{
e.printStackTrace();
System.exit(1);
}
catch (IOException e)
{
e.printStackTrace();
System.exit(1);
}
/*
* And now, we output the data.
*/
if (sequence == null)
{
out("Cannot retrieve Sequence.");
}
else
{
out("---------------------------------------------------------------------------");
out("File: " + strFilename);
out("---------------------------------------------------------------------------");
out("Length: " + sequence.getTickLength() + " ticks");
out("Duration: " + sequence.getMicrosecondLength() + " microseconds");
out("---------------------------------------------------------------------------");
float fDivisionType = sequence.getDivisionType();
String strDivisionType = null;
if (fDivisionType == Sequence.PPQ)
{
strDivisionType = "PPQ";
}
else if (fDivisionType == Sequence.SMPTE_24)
{
strDivisionType = "SMPTE, 24 frames per second";
}
else if (fDivisionType == Sequence.SMPTE_25)
{
strDivisionType = "SMPTE, 25 frames per second";
}
else if (fDivisionType == Sequence.SMPTE_30DROP)
{
strDivisionType = "SMPTE, 29.97 frames per second";
}
else if (fDivisionType == Sequence.SMPTE_30)
{
strDivisionType = "SMPTE, 30 frames per second";
}
out("DivisionType: " + strDivisionType);
String strResolutionType = null;
if (sequence.getDivisionType() == Sequence.PPQ)
{
strResolutionType = " ticks per beat";
}
else
{
strResolutionType = " ticks per frame";
}
out("Resolution: " + sequence.getResolution() + strResolutionType);
out("---------------------------------------------------------------------------");
Track[] tracks = sequence.getTracks();
for (int nTrack = 0; nTrack < tracks.length; nTrack++)
{
out("Track " + nTrack + ":");
out("-----------------------");
Track track = tracks[nTrack];
for (int nEvent = 0; nEvent < track.size(); nEvent++)
{
MidiEvent event = track.get(nEvent);
output(event);
}
out("---------------------------------------------------------------------------");
}
// TODO: getPatchList()
}
}
public static void output(MidiEvent event)
{
MidiMessage message = event.getMessage();
long lTicks = event.getTick();
sm_receiver.send(message, lTicks);
}
private static void out(String strMessage)
{
System.out.println(strMessage);
}
}
/*** DumpSequence.java ***/