/*
Mjdj MIDI Morph - an extensible MIDI processor and translator.
Copyright (C) 2010 Confusionists, LLC (www.confusionists.com)
This program 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 3 of the License, or (at your option) any later version. This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
You may contact the author at mjdj_midi_morph [at] confusionists.com
*/
package com.confusionists.mjdj.midi;
import java.util.ArrayList;
import java.util.List;
import java.util.TimerTask;
import javax.sound.midi.InvalidMidiDataException;
import com.confusionists.mjdj.Universe;
import com.confusionists.mjdj.keystrokes.Keyboard;
import com.confusionists.mjdj.midi.time.BeatLockedTimerTask;
import com.confusionists.mjdj.midi.time.MidiTimerTaskWrapper;
import com.confusionists.mjdj.ui.Logger;
import com.confusionists.mjdj.ui.MorphCheckbox;
import com.confusionists.mjdj.ui.MorphCheckboxList;
import com.confusionists.mjdjApi.midi.MessageWrapper;
import com.confusionists.mjdjApi.midiDevice.DeviceWrapper;
import com.confusionists.mjdjApi.midiDevice.ReceiverDeviceWrapper;
import com.confusionists.mjdjApi.morph.Morph;
import com.confusionists.mjdjApi.util.MidiTimerTask;
import com.confusionists.mjdjApi.util.MjdjService;
public class MjdjServiceImpl implements MjdjService {
public static MjdjServiceImpl instance = new MjdjServiceImpl();
@Override
public void morph(MessageWrapper msgWrapper, String from) {
Universe.instance.midiDriverManager.sendToMorphs(msgWrapper, from);
}
@Override
public void morph(MessageWrapper message, String from, Morph avoidMorph) {
Universe.instance.midiDriverManager.sendToMorphs(message, from, avoidMorph);
}
@Override
public void send(MessageWrapper message) {
send(message, (String) null);
}
@Override
public void send(MessageWrapper message, String to) {
List<String> tos = null;
if (to != null) {
tos = new ArrayList<String>();
tos.add(to);
}
send(message, tos);
}
/* if to is null send to all */
@Override
public void send(MessageWrapper message, List<String> to) {
for (DeviceWrapper device : Universe.instance.midiDriverManager.outputReceivers) {
ReceiverDeviceWrapper receiver = (ReceiverDeviceWrapper) device;
if (receiver.isActive() && (to == null || to.contains(receiver.toString()))) {
receiver.send(message);
Logger.log(message, receiver);
}
}
}
@Override
public void send(byte[] bytes) throws InvalidMidiDataException {
send(bytes, null);
}
@Override
public void send(byte[] bytes, List<String> to) throws InvalidMidiDataException {
send(MessageWrapper.newInstance(bytes), to);
}
@Override
public void debugLog(String text) {
Logger.debugLog(text);
}
@Override
public void debugLog(String text, Exception e) {
Logger.debugLog(text, e);
}
@Override
public void log(String text) {
Logger.log(text);
}
@Override
public void log(String string, Exception e) {
Logger.log(string, e);
}
@Override
public void logLine() {
log("-----------------------------------------------------------------");
}
@Override
public boolean isMorphActive(String name) {
boolean retVal = false;
MorphCheckbox box = MorphCheckboxList.instance.getCheckbox(name);
if (box == null) {
Logger.log("Error getting status (returning false)! Morpher not found " + name);
} else {
retVal = box.isSelected();
}
return retVal;
}
@Override
public void setMorphActive(String name, boolean status) {
MorphCheckbox box = MorphCheckboxList.instance.getCheckbox(name);
if (box == null) {
Logger.log("Error setting status! Morpher not found " + name);
} else {
if (box.isSelected() != status) {
box.doClick();
}
}
}
@Override
public void sendKeystrokes(String keystrokes) {
try {
System.out.println("Mjdj sending keystrokes " + keystrokes);
new Keyboard().type(keystrokes);
} catch (Exception e) {
Logger.log("Error sending keystrokes " + keystrokes, e);
}
}
@Override
public boolean schedule(MidiTimerTask task, int beatsBeforeLaunch) {
return new BeatLockedTimerTask().setTask(task, beatsBeforeLaunch);
}
@Override
public boolean schedule(MidiTimerTask task, int beatsBeforeLaunch, float delayAfterBeat) {
if (!(delayAfterBeat < 1 || delayAfterBeat < 0)) {
log(task.getMorph().getName()
+ " is trying to schedule something with a delayAfterBeat greater than 1 or less than zero. Task not scheduled.");
return false;
}
return new BeatLockedTimerTask().setTask(task, beatsBeforeLaunch, delayAfterBeat);
}
@Override
public boolean scheduleInMs(MidiTimerTask task, int delay) {
MidiTimerTaskWrapper taskWrapper = new MidiTimerTaskWrapper(task);
Universe.instance.centralTimer.schedule(taskWrapper, delay);
return true;
}
@Override
public float getAfterBeat() {
return Universe.instance.clockHandler.getSinceLastBeat();
}
@Override
public boolean isDebug() {
return Universe.instance.isDebug();
}
public int compareMorphToMorph(Morph one, Morph two) {
int indexOne = MorphCheckboxList.instance.getMorphs().indexOf(one);
int indexTwo = MorphCheckboxList.instance.getMorphs().indexOf(two);
if (indexOne > indexTwo)
return 1;
if (indexOne < indexTwo)
return -1;
return 0;
}
}