Java examples for javax.sound.midi:MidiMessage
Creates a midi message from a readable signature string
/*/*from w ww .j a va 2s.c o m*/ * 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. */ import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.sound.midi.InvalidMidiDataException; import javax.sound.midi.MetaMessage; 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.ShortMessage; import javax.sound.midi.SysexMessage; import javax.sound.midi.Transmitter; import org.apache.log4j.Logger; public class Main{ public static final String NOTE_ON = "NOTE ON"; public static final String NOTE_OFF = "NOTE OFF"; public static final String POLYPHONIC_KEY_PRESSURE = "POLYPHONIC KEY PRESSURE"; public static final String CONTROL_CHANGE = "CONTROL CHANGE"; public static final String PROGRAM_CHANGE = "PROGRAM CHANGE"; public static final String KEY_PRESSURE = "KEY PRESSURE"; public static final String PITCH_WHEEL_CHANGE = "PITCH WHEEL CHANGE"; public static final String SYSTEM_MESSAGE = "SYSTEM MESSAGE"; /** * Creates a midi message from a readable signature string * * @param signature * The signature * @return a midi message * @throws InvalidMidiDataException */ public static MidiMessage signatureToMessage(String signature) throws InvalidMidiDataException { if (signature == null) { return null; } int channel = -1; Pattern pattern = Pattern.compile("channel [0-9]*"); Matcher matcher = pattern.matcher(signature); if (matcher.find()) { String[] split = matcher.group(0).split(" "); channel = Integer.parseInt(split[1]); } int command = -1; int controlNo = -1; pattern = Pattern.compile(": .* value"); matcher = pattern.matcher(signature); if (matcher.find()) { String[] split = matcher.group(0).split(" "); String commandString = split[1] + " " + split[2]; command = encodeCommand(commandString); controlNo = Integer.parseInt(split[3]); } int value = -1; pattern = Pattern.compile("value: [0-9]*"); matcher = pattern.matcher(signature); if (matcher.find()) { String[] split = matcher.group(0).split(" "); value = Integer.parseInt(split[1]); } ShortMessage message = new ShortMessage(); message.setMessage(command, channel - 1, controlNo, value); return message; } /** * Encodes the midi command from a readable string * * @param command * The command as readable string * @return The midi encoded command, -1 if it could not be encoded */ private static int encodeCommand(String command) { int result; switch (command) { case NOTE_OFF: result = ShortMessage.NOTE_OFF; break; case NOTE_ON: result = ShortMessage.NOTE_ON; break; case POLYPHONIC_KEY_PRESSURE: result = ShortMessage.POLY_PRESSURE; break; case CONTROL_CHANGE: result = ShortMessage.CONTROL_CHANGE; break; case PROGRAM_CHANGE: result = ShortMessage.PROGRAM_CHANGE; break; case KEY_PRESSURE: result = 0xd0; break; case PITCH_WHEEL_CHANGE: result = 0xe0; break; case SYSTEM_MESSAGE: result = 0xF0; default: result = -1; break; } return result; } }