Creates a midi message from a readable signature string - Java javax.sound.midi

Java examples for javax.sound.midi:MidiMessage

Description

Creates a midi message from a readable signature string

Demo Code

/*/*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;
    }
}

Related Tutorials