[Japi-cvs] SF.net SVN: japi:[1355] tools/midiMonitor/trunk/src/prj/net/sf/japi/tools/ midiMonitor
Status: Beta
Brought to you by:
christianhujer
From: <chr...@us...> - 2009-06-21 09:53:56
|
Revision: 1355 http://japi.svn.sourceforge.net/japi/?rev=1355&view=rev Author: christianhujer Date: 2009-06-21 09:53:05 +0000 (Sun, 21 Jun 2009) Log Message: ----------- Add facility to monitor all midi devices. Add optional to filter time events. Modified Paths: -------------- tools/midiMonitor/trunk/src/prj/net/sf/japi/tools/midiMonitor/MidiMonitor.java Added Paths: ----------- tools/midiMonitor/trunk/src/prj/net/sf/japi/tools/midiMonitor/MidiMonitor.properties Modified: tools/midiMonitor/trunk/src/prj/net/sf/japi/tools/midiMonitor/MidiMonitor.java =================================================================== --- tools/midiMonitor/trunk/src/prj/net/sf/japi/tools/midiMonitor/MidiMonitor.java 2009-06-14 09:32:23 UTC (rev 1354) +++ tools/midiMonitor/trunk/src/prj/net/sf/japi/tools/midiMonitor/MidiMonitor.java 2009-06-21 09:53:05 UTC (rev 1355) @@ -17,17 +17,22 @@ package net.sf.japi.tools.midiMonitor; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiMessage; import javax.sound.midi.MidiSystem; import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Receiver; import javax.sound.midi.Transmitter; import net.sf.japi.io.args.ArgParser; import net.sf.japi.io.args.CommandWithHelp; import net.sf.japi.io.args.Option; import net.sf.japi.io.args.OptionType; +import net.sf.japi.io.args.RequiredOptionsMissingException; import net.sf.japi.midi.MonitorReceiver; import org.jetbrains.annotations.NotNull; @@ -38,8 +43,13 @@ public class MidiMonitor extends CommandWithHelp { /** The transmitters that shall be monitored. */ - private final Map<String, Transmitter> transmitters = new HashMap<String, Transmitter>(); + private final Map<String, List<Transmitter>> transmitters = new HashMap<String, List<Transmitter>>(); + /** Whether or not to print time events (0xF8). + * @see #setNoTime() + */ + private boolean time = true; + /** Main program. * @param args Command line arguments (try --help). */ @@ -47,30 +57,72 @@ ArgParser.simpleParseAndRun(new MidiMonitor(), args); } + /** Sets that time events (0xF8) shall be filtered. */ + @Option("notime") + public void setNoTime() { + time = false; + } + + /** Adds all available transmitters to the list of transmitters to monitor. + * @throws MidiUnavailableException if MIDI is unavaialble. + */ + @Option({"a", "all"}) + public void addAllTransmitters() throws MidiUnavailableException { + for (final MidiDevice.Info deviceInfo : MidiSystem.getMidiDeviceInfo()) { + addTransmitter(deviceInfo); + } + } + /** Adds a transmitter to the list of transmitters to monitor. + * If multiple devices have the same name, the transmitter is added for the first device of that name. * @param transmitterName Name of the transmitterName to add. * @throws MidiUnavailableException If MIDI is unavailable. */ - @Option(type = OptionType.REQUIRED, value = {"t", "transmitter"}) + @Option({"t", "transmitter"}) public void addTransmitter(@NotNull final String transmitterName) throws MidiUnavailableException { for (final MidiDevice.Info deviceInfo : MidiSystem.getMidiDeviceInfo()) { if (transmitterName.equals(deviceInfo.getName())) { - final MidiDevice device = MidiSystem.getMidiDevice(deviceInfo); - if (device.getMaxTransmitters() != 0) { - device.open(); - transmitters.put(transmitterName, device.getTransmitter()); - return; - } + addTransmitter(deviceInfo); + return; } } } + /** Adds a transmitter. + * @param deviceInfo DeviceInfo for the transmitter to add. + * @return <code>true</code> if a transmitter for the specified device was added, otherwise <code>false</code>. + * @throws MidiUnavailableException If MIDI is unavailable. + */ + private boolean addTransmitter(@NotNull final MidiDevice.Info deviceInfo) throws MidiUnavailableException { + final MidiDevice device = MidiSystem.getMidiDevice(deviceInfo); + if (device.getMaxTransmitters() != 0) { + device.open(); + final String deviceName = deviceInfo.getName(); + if (transmitters.get(deviceName) == null) { + transmitters.put(deviceName, new ArrayList<Transmitter>()); + } + transmitters.get(deviceName).add(device.getTransmitter()); + return true; + } + return false; + } + /** {@inheritDoc} */ @SuppressWarnings({"InstanceMethodNamingConvention"}) public int run(@NotNull final List<String> args) throws Exception { - for (final Map.Entry<String, Transmitter> entry : transmitters.entrySet()) { - entry.getValue().setReceiver(new MonitorReceiver(entry.getKey())); + final Set<Map.Entry<String, List<Transmitter>>> entries = transmitters.entrySet(); + if (entries.size() == 0) { + throw new RequiredOptionsMissingException("-a or at least once -t"); } + for (final Map.Entry<String, List<Transmitter>> entry : entries) { + for (final Transmitter transmitter : entry.getValue()) { + if (time) { + transmitter.setReceiver(new MonitorReceiver(entry.getKey())); + } else { + transmitter.setReceiver(new TimeFilter(new MonitorReceiver(entry.getKey()))); + } + } + } try { synchronized (this) { wait(); @@ -81,3 +133,38 @@ return 0; } } + +/** Filter that filters away MIDI time events. + * @author <a href="mailto:ch...@ri...">Christian Hujer</a> + * @since 0.2 + */ +class TimeFilter implements Receiver { + + /** Whether this TimeFilter is open. */ + private boolean open = true; + + /** The Receiver to which the message shall be forwarded. */ + private Receiver receiver; + + /** Creates a TimeFilter. + * @param receiver Receiver to which messages shall be forwarded. + */ + TimeFilter(@NotNull final Receiver receiver) { + this.receiver = receiver; + } + + /** {@inheritDoc} */ + public void close() { + open = false; + } + + /** {@inheritDoc} */ + public void send(final MidiMessage message, final long timeStamp) throws IllegalStateException { + if (!open) { + throw new IllegalStateException("Receiver closed."); + } + if (message.getStatus() != 0xF8) { + receiver.send(message, timeStamp); + } + } +} Added: tools/midiMonitor/trunk/src/prj/net/sf/japi/tools/midiMonitor/MidiMonitor.properties =================================================================== --- tools/midiMonitor/trunk/src/prj/net/sf/japi/tools/midiMonitor/MidiMonitor.properties (rev 0) +++ tools/midiMonitor/trunk/src/prj/net/sf/japi/tools/midiMonitor/MidiMonitor.properties 2009-06-21 09:53:05 UTC (rev 1355) @@ -0,0 +1,3 @@ +setNoTime=Do not monitor time events (0xF8). +addAllTransmitters=Monitor all available transmitters. +addTransmitter=Monitor the transmitter with the specified name. Property changes on: tools/midiMonitor/trunk/src/prj/net/sf/japi/tools/midiMonitor/MidiMonitor.properties ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + LF This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |