Java examples for javax.sound.midi:MidiMessage
Normalizes the midi signature by removing the velocity from NOTE_ON and NOTE_OFF messages.
/*/* ww w .j a v a2 s. co 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{ static Logger log = Logger.getLogger(MidiUtils.class.getName()); 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"; public static final String UNKNOWN_MESSAGE = "UNKNOWN MESSAGE"; /** * Normalizes the midi signature by removing the velocity from NOTE_ON and * NOTE_OFF messages. Normalizes CONTROL_CHANGE, KEY_PRESSURE, * POLYPHONIC_KEY_PRESSURE and PITCH_WHEEL_CHANGE messages to 0 or 127. * * @param message * The original midi message * @return the normalized midi message */ public static MidiMessage normalizeMidiMesage(MidiMessage message) { MidiMessage result = message; if (message instanceof ShortMessage) { ShortMessage shortMessage = (ShortMessage) message; int command = shortMessage.getCommand(); int channel = shortMessage.getChannel(); int commandNo = shortMessage.getData1(); int value = shortMessage.getData2(); String strCommand = decodeCommand(shortMessage.getCommand()); try { if (strCommand == NOTE_ON || strCommand == NOTE_OFF) { value = 0; result = new ShortMessage(command, channel, commandNo, value); } if (strCommand == POLYPHONIC_KEY_PRESSURE || strCommand == KEY_PRESSURE || strCommand == PITCH_WHEEL_CHANGE) { if (value <= 63) { value = 0; } else { value = 127; } result = new ShortMessage(command, channel, commandNo, value); } } catch (InvalidMidiDataException e) { log.error("The MIDI message to normalize is invalid", e); } } return result; } /** * Interprets the midi command byte code to a readable String. * * @param command * The midi command * @return a readable command */ private static String decodeCommand(int command) { String result; switch (command) { case 0x80: result = NOTE_OFF; break; case 0x90: result = NOTE_ON; break; case 0xa0: result = POLYPHONIC_KEY_PRESSURE; break; case 0xb0: result = CONTROL_CHANGE; break; case 0xc0: result = PROGRAM_CHANGE; break; case 0xd0: result = KEY_PRESSURE; break; case 0xe0: result = PITCH_WHEEL_CHANGE; break; case 0xF0: result = SYSTEM_MESSAGE; default: result = UNKNOWN_MESSAGE; break; } return result; } }