/* 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.jsynth;
import java.util.HashMap;
import java.util.Map;
import net.sf.nmedit.jpatch.PModule;
import net.sf.nmedit.jpatch.PParameterDescriptor;
import net.sf.nmedit.jpatch.PPatch;
import net.sf.nmedit.jpatch.event.PModuleContainerEvent;
import net.sf.nmedit.jpatch.event.PModuleContainerListener;
import net.sf.nmedit.jpatch.event.PParameterEvent;
import net.sf.nmedit.jpatch.event.PParameterListener;
import net.sf.nmedit.jpatch.PParameter;
import net.sf.nmedit.jpdl.Packet;
import net.sf.nmedit.jsynth.Slot;
import net.sf.nmedit.jsynth.event.SlotEvent;
import net.sf.nmedit.jsynth.event.SlotListener;
import net.sf.nmedit.jsynth.event.SlotManagerListener;
import net.waldorf.miniworks4pole.jpatch.MWPatch;
import net.waldorf.miniworks4pole.jprotocol.MWListenerSupport;
import net.waldorf.miniworks4pole.jprotocol.MWMidiListener;
import net.waldorf.miniworks4pole.jprotocol.MiniworksMidiMessage;
public class MWEventHandler extends MWMidiListener
implements PModuleContainerListener, PParameterListener, SlotManagerListener, SlotListener
{
private Miniworks4Pole synth;
private PPatch patch = null;
private Map<PParameter, Integer> p2c = new HashMap<PParameter, Integer>();
private Map<Integer, PParameter> c2p = new HashMap<Integer, PParameter>();
public MWEventHandler(Miniworks4Pole synth, MWListenerSupport listenerSupport)
{
this.synth = synth;
synth.getSlotManager().addSlotManagerListener(this);
listenerSupport.addListener(this);
listenerSupport.addParameterListener(this);
for (int i=synth.getSlotCount()-1;i>=0;i--)
install(synth.getSlot(i));
}
public void setPatch(PPatch patch)
{
if (this.patch != patch)
{
p2c.clear();
c2p.clear();
if (this.patch != null)
uninstall(this.patch);
this.patch = patch;
if (this.patch != null)
install(this.patch);
}
}
private void install(PPatch pch)
{
pch.getModuleContainer(0).addModuleContainerListener(this);
for (PModule m : pch.getModuleContainer(0))
install(m);
}
private void uninstall(PPatch pch)
{
pch.getModuleContainer(0).removeModuleContainerListener(this);
for (PModule m : pch.getModuleContainer(0))
uninstall(m);
}
public void moduleAdded(PModuleContainerEvent e)
{
install(e.getModule());
}
public void moduleRemoved(PModuleContainerEvent e)
{
uninstall(e.getModule());
}
private void install(PModule module)
{
for (int i=module.getParameterCount()-1;i>=0;i--)
{
install(module.getParameter(i));
}
}
private void uninstall(PModule module)
{
for (int i=module.getParameterCount()-1;i>=0;i--)
{
uninstall(module.getParameter(i));
}
}
private void install(PParameter parameter)
{
parameter.addParameterListener(this);
PParameterDescriptor pd = parameter.getDescriptor();
Integer controller = ((Integer)pd.getAttribute("controller"));
p2c.put(parameter, controller);
c2p.put(controller, parameter);
}
private void uninstall(PParameter parameter)
{
parameter.removeParameterListener(this);
Integer controller = p2c.get(parameter);
if (controller != null)
c2p.remove(controller);
p2c.remove(parameter);
}
public void parameterValueChanged(PParameterEvent e)
{
PParameter p = e.getParameter();
Integer controller = p2c.get(p);
if (controller == null)
return;
send(MiniworksMidiMessage.createControllerMessage(controller, p.getValue()));
}
private void send(MiniworksMidiMessage message)
{
synth.send(message);
}
public void parameterMessage(MiniworksMidiMessage message)
{
PParameter p = c2p.get(message.getController());
if (p == null)
return;
p.setValue(message.getControllerValue());
};
public void bankChangeMessage(MiniworksMidiMessage message)
{
//System.out.println("bankChangeMessage(bank="+message.getBank());
synth.send(MiniworksMidiMessage.createProgramDumpRequestMessage(1, message.getBank()));
};
public void programDumpMessage(MiniworksMidiMessage message)
{
//System.out.println("programDumpMessage");
Packet pack = message.getPacket().getPacket("data");
//System.out.println(pack.getName());
int programNumber = pack.getVariable("ProgramNumber");
/*for (Object o: pack.getAllVariables())
System.out.println(o);*/
MWPatch patch = new MWPatch(synth.getModuleDescriptions());
patch.setProgramNumber(programNumber);
byte[] data = message.getData();
System.out.println(data);
PModule module = patch.getMiniworksModule();
for (int i=0;i<module.getParameterCount();i++)
{
PParameter par = module.getParameter(i);
PParameterDescriptor pd = par.getDescriptor();
int value = pack.getVariable((String) pd.getAttribute("message-id"));
par.setValue(value);
}
synth.getSlot(0).setPatch(patch);
// TODO
};
public void programBulkDumpMessage(MiniworksMidiMessage message) {
System.out.println("programBulkDumpMessage");
};
public void allDumpMessage(MiniworksMidiMessage message) {
System.out.println("allDumpMessage");
}
public void slotAdded(SlotEvent e)
{
install(e.getSlot());
}
public void slotRemoved(SlotEvent e)
{
uninstall(e.getSlot());
}
private void install(Slot slot)
{
slot.addSlotListener(this);
}
private void uninstall(Slot slot)
{
slot.removeSlotListener(this);
}
public void newPatchInSlot(SlotEvent e)
{
setPatch(((MWSlot) e.getSlot()).getPatch());
}
public void focusRequested(PParameterEvent e)
{
// TODO Auto-generated method stub
};
}