/* 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 */ package net.waldorf.miniworks4pole.jprotocol; import javax.sound.midi.MidiMessage; import javax.sound.midi.Receiver; import javax.swing.event.EventListenerList; import net.sf.nmedit.jsynth.SynthException; public class MWListenerSupport implements Receiver { private EventListenerList listeners = new EventListenerList(); private EventListenerList parameterListeners = new EventListenerList(); private WProtocol protocol; public MWListenerSupport (WProtocol protocol) { this.protocol = protocol; } public void addListener(MWMidiListener l) { listeners.add(MWMidiListener.class, l); } public void removeListener(MWMidiListener l) { listeners.remove(MWMidiListener.class, l); } public void addParameterListener(MWMidiListener l) { parameterListeners.add(MWMidiListener.class, l); } public void removeParameterListener(MWMidiListener l) { parameterListeners.remove(MWMidiListener.class, l); } public void notifyListeners(MiniworksMidiMessage message) { if (message == null) // note on/off return; switch (message.getMessageType()) { case MiniworksMidiMessage.MESSAGE_TYPE_BANKCHANGE: bankChangeReceived(message); return; case MiniworksMidiMessage.MESSAGE_TYPE_CONTROLCHANGE: controlChangeReceived(message); return; case MiniworksMidiMessage.MESSAGE_TYPE_ALIVE: aliveMessageReceived(message); return; case MiniworksMidiMessage.MESSAGE_TYPE_SYSEX: switch (message.getDumpType()) { case MiniworksMidiMessage.DUMP_TYPE_PROGRAM_DUMP: programDumpReceived(message); return; case MiniworksMidiMessage.DUMP_TYPE_PROGRAM_BULK_DUMP: programBulkDumpReceived(message); return; case MiniworksMidiMessage.DUMP_TYPE_ALL_DUMP: allDumpReceived(message); return; } break; } System.err.println("unknown message: "+message); } private void allDumpReceived(MiniworksMidiMessage message) { Object[] list = listeners.getListenerList(); for (int i=list.length-2;i>=0;i-=2) { if (MWMidiListener.class == list[i]) { ((MWMidiListener)list[i+1]).allDumpMessage(message); } } } private void aliveMessageReceived(MiniworksMidiMessage message) { Object[] list = listeners.getListenerList(); for (int i=list.length-2;i>=0;i-=2) { if (MWMidiListener.class == list[i]) { ((MWMidiListener)list[i+1]).aliveMessage(message); } } } private void programBulkDumpReceived(MiniworksMidiMessage message) { Object[] list = listeners.getListenerList(); for (int i=list.length-2;i>=0;i-=2) { if (MWMidiListener.class == list[i]) { ((MWMidiListener)list[i+1]).programBulkDumpMessage(message); } } } private void programDumpReceived(MiniworksMidiMessage message) { Object[] list = listeners.getListenerList(); for (int i=list.length-2;i>=0;i-=2) { if (MWMidiListener.class == list[i]) { ((MWMidiListener)list[i+1]).programDumpMessage(message); } } } private void bankChangeReceived(MiniworksMidiMessage message) { Object[] list = listeners.getListenerList(); for (int i=list.length-2;i>=0;i-=2) { if (MWMidiListener.class == list[i]) { ((MWMidiListener)list[i+1]).bankChangeMessage(message); } } } private void controlChangeReceived(MiniworksMidiMessage message) { Object[] list = parameterListeners.getListenerList(); for (int i=list.length-2;i>=0;i-=2) { if (MWMidiListener.class == list[i]) { ((MWMidiListener)list[i+1]).parameterMessage(message); } } } public void close() { // ignore } public void send(MidiMessage message, long timeStamp) { MiniworksMidiMessage mmm; try { mmm = protocol.createMessage(message); } catch (SynthException e) { // TODO Auto-generated catch block e.printStackTrace(); return; } notifyListeners(mmm); } }