/* Copyright (C) 2006 Christian Schneider * * This file is part of Nomad. * * Nomad is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Nomad is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Nomad; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* * Created on Jan 15, 2007 */ package net.waldorf.miniworks4pole.jprotocol; import javax.sound.midi.MidiMessage; import net.sf.nmedit.jpdl.BitStream; import net.sf.nmedit.jpdl.Packet; import net.sf.nmedit.jpdl.PacketParser; import net.sf.nmedit.jpdl.Protocol; import net.sf.nmedit.jsynth.SynthException; public class WProtocol //extends NmProtocolST { public static void setProtocol(Protocol protocol) { WProtocol.protocol = protocol; packetParser = protocol.getPacketParser("Message"); } protected static Protocol protocol; private static PacketParser packetParser; public PacketParser getPacketParser() { return packetParser; } public Packet parseMessage(MidiMessage message) { return parseMessage(message.getMessage()); } public Packet parseMessage(byte[] message) { Packet packet = new Packet(); boolean success = packetParser.parse(BitStream.wrap(message), packet); return success ? packet : null; } public MiniworksMidiMessage createMessage(MidiMessage message) throws SynthException { byte[] data = message.getMessage(); Packet packet = parseMessage(data); if (packet == null) throw new SynthException("could not parse message: "+message+" ("+toString(message.getMessage())+")"); return createMessage(packet, data); } private static String toString(byte[] b) { StringBuilder sb = new StringBuilder(); sb.append("["); if (b.length>0) sb.append(byte2hex(b[0])); for(int i=1;i<b.length;i++) { sb.append(","); sb.append(byte2hex(b[i])); } sb.append("]"); return sb.toString(); } private static CharSequence byte2hex(byte b) { int i = (int) (b&0xFF); return Integer.toHexString(i).toUpperCase(); } public MiniworksMidiMessage createMessage(Packet packet, byte[] bdata) throws SynthException { int messageType = packet.getVariable("messageType"); Packet data = packet.getPacket("data"); if (data == null) throw new SynthException("no such packet: data"); switch (messageType) { case MiniworksMidiMessage.MESSAGE_TYPE_BANKCHANGE: { int bank = data.getVariable("bank"); return MiniworksMidiMessage.createBankChangeMessage(bank); } case MiniworksMidiMessage.MESSAGE_TYPE_CONTROLCHANGE: { int controller = data.getVariable("controller"); int value = data.getVariable("value"); return MiniworksMidiMessage.createControllerMessage(controller, value); } case MiniworksMidiMessage.MESSAGE_TYPE_SYSEX: { int dumpType = data.getVariable("dumpType"); return new MiniworksMidiMessage(data, MiniworksMidiMessage.MESSAGE_TYPE_SYSEX, dumpType, bdata); } case MiniworksMidiMessage.MESSAGE_TYPE_ALIVE: { return new MiniworksMidiMessage(data, MiniworksMidiMessage.MESSAGE_TYPE_ALIVE, -1,bdata); } case MiniworksMidiMessage.NOTE_ON: // no op TODO trigger LEDS return null; case MiniworksMidiMessage.NOTE_OFF: // no op return null; default: throw new SynthException("unknown packet: "+data+" (name="+data.getName()+")"); } } public static void parse(MidiMessage message) { parse(message.getMessage()); } private static void parse( byte[] message ) { Packet packet = new Packet(); boolean success = packetParser.parse(BitStream.wrap(message), packet); print(success, packet); } private static void print( boolean success, Packet packet ) { //if (success) System.out.println("success="+success); do { for (Object v : packet.getAllVariables()) { System.out.println(v+"="+packet.getVariable((String)v)); } packet = packet.getPacket("data"); } while(packet!=null); } }