/* * MidiInDump.java * * This file is part of jsresources.org */ /* * Copyright (c) 1999 - 2001 by Matthias Pfisterer * Copyright (c) 2003 by Florian Bomers * 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.IOException; import javax.sound.midi.Transmitter; import javax.sound.midi.Receiver; import javax.sound.midi.MidiUnavailableException; import javax.sound.midi.MidiDevice; import javax.sound.midi.MidiSystem; import javax.sound.midi.Synthesizer; /* If the compilation fails because this class is not available, get gnu.getopt from the URL given in the comment below. */ import gnu.getopt.Getopt; /** <titleabbrev>MidiInDump</titleabbrev> <title>Listens to a MIDI port and dump the received event to the console</title> <formalpara><title>Purpose</title> <para>Listens to a MIDI port and dump the received event to the console.</para></formalpara> <formalpara><title>Usage</title> <para> <cmdsynopsis> <command>java MidiInDump</command> <arg choice="plain"><option>-l</option></arg> </cmdsynopsis> <cmdsynopsis> <command>java MidiInDump</command> <arg choice="plain"><option>-d <replaceable>devicename</replaceable></option></arg> <arg choice="plain"><option>-n <replaceable>device#</replaceable></option></arg> </cmdsynopsis> </para></formalpara> <formalpara><title>Parameters</title> <variablelist> <varlistentry> <term><option>-l</option></term> <listitem><para>list the availabe MIDI devices</para></listitem> </varlistentry> <varlistentry> <term><option>-d <replaceable>devicename</replaceable></option></term> <listitem><para>reads from named device (see <option>-l</option>)</para></listitem> </varlistentry> <varlistentry> <term><option>-n <replaceable>device#</replaceable></option></term> <listitem><para>reads from device with given index (see <option>-l</option>)</para></listitem> </varlistentry> </variablelist> </formalpara> <formalpara><title>Bugs, limitations</title> <para> For the Sun J2SDK 1.3.x or 1.4.0, MIDI IN does not work. See the <olink targetdoc="faq_midi" targetptr="faq_midi">FAQ</olink> for alternatives. </para></formalpara> <formalpara><title>Source code</title> <para> <ulink url="MidiInDump.java.html">MidiInDump.java</ulink>, <ulink url="DumpReceiver.java.html">DumpReceiver.java</ulink>, <ulink url="MidiCommon.java.html">MidiCommon.java</ulink>, <ulink url="http://www.urbanophile.com/arenn/hacking/download.html">gnu.getopt.Getopt</ulink> </para> </formalpara> */ public class MidiInDump { /** Flag for debugging messages. If true, some messages are dumped to the console during operation. */ private static boolean DEBUG = true; public static void main(String[] args) throws Exception { /* * The device name/index to listen to. */ String strDeviceName = null; int nDeviceIndex = -1; boolean bUseDefaultSynthesizer = false; // TODO: synchronize options with MidiPlayer /* * Parsing of command-line options takes place... */ Getopt g = new Getopt("MidiInDump", args, "hlsd:n:D"); int c; while ((c = g.getopt()) != -1) { switch (c) { case 'h': printUsageAndExit(); case 'l': MidiCommon.listDevicesAndExit(true, false); case 's': bUseDefaultSynthesizer = true; break; case 'd': strDeviceName = g.getOptarg(); if (DEBUG) { out("MidiInDump.main(): device name: " + strDeviceName); } break; case 'n': nDeviceIndex = Integer.parseInt(g.getOptarg()); if (DEBUG) { out("MidiInDump.main(): device index: " + nDeviceIndex); } break; case 'D': DEBUG = true; break; case '?': printUsageAndExit(); default: out("MidiInDump.main(): getopt() returned " + c); break; } } if ((strDeviceName == null) && (nDeviceIndex < 0)) { out("device name/index not specified!"); printUsageAndExit(); } MidiDevice.Info info; if (strDeviceName != null) { info = MidiCommon.getMidiDeviceInfo(strDeviceName, false); } else { info = MidiCommon.getMidiDeviceInfo(nDeviceIndex); } if (info == null) { if (strDeviceName != null) { out("no device info found for name " + strDeviceName); } else { out("no device info found for index " + nDeviceIndex); } System.exit(1); } MidiDevice inputDevice = null; try { inputDevice = MidiSystem.getMidiDevice(info); inputDevice.open(); } catch (MidiUnavailableException e) { out(e); } if (inputDevice == null) { out("wasn't able to retrieve MidiDevice"); System.exit(1); } Receiver r = new DumpReceiver(System.out); try { Transmitter t = inputDevice.getTransmitter(); t.setReceiver(r); } catch (MidiUnavailableException e) { out("wasn't able to connect the device's Transmitter to the Receiver:"); out(e); inputDevice.close(); System.exit(1); } if (bUseDefaultSynthesizer) { Synthesizer synth = MidiSystem.getSynthesizer(); synth.open(); r = synth.getReceiver(); try { Transmitter t = inputDevice.getTransmitter(); t.setReceiver(r); } catch (MidiUnavailableException e) { out("wasn't able to connect the device's Transmitter to the default Synthesizer:"); out(e); inputDevice.close(); System.exit(1); } } out("now running; interupt the program with [ENTER] when finished"); try { System.in.read(); } catch (IOException ioe) { } inputDevice.close(); out("Received "+((DumpReceiver) r).seCount+" sysex messages with a total of "+((DumpReceiver) r).seByteCount+" bytes"); out("Received "+((DumpReceiver) r).smCount+" short messages with a total of "+((DumpReceiver) r).smByteCount+" bytes"); out("Received a total of "+(((DumpReceiver) r).smByteCount + ((DumpReceiver) r).seByteCount)+" bytes"); try { Thread.sleep(1000); } catch (InterruptedException e) { if (DEBUG) { out(e); } } } private static void printUsageAndExit() { out("MidiInDump: usage:"); out(" java MidiInDump -h"); out(" gives help information"); out(" java MidiInDump -l"); out(" lists available MIDI devices"); out(" java MidiInDump [-D] [-d <input device name>] [-n <device index>]"); out(" -d <input device name>\treads from named device (see '-l')"); out(" -n <input device index>\treads from device with given index(see '-l')"); out(" -D\tenables debugging output"); System.exit(1); } private static void out(String strMessage) { System.out.println(strMessage); } private static void out(Throwable t) { if (DEBUG) { t.printStackTrace(); } else { out(t.toString()); } } } /*** MidiInDump.java ***/