You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

380 lines
10 KiB

import javax.sound.midi.*;
import javax.sound.midi.MidiUnavailableException;
MIDI launchpad;
MIDI software;
MIDIListener receiverA;
MIDIListener receiverB;
MIDIinput launchpadIn;
MIDIinput softwareIn;
int outputChannel;
int customChannel;
///////////////
class MidiMsg extends MidiMessage {
MidiMsg(byte[] data) {
super(data);
}
MidiMsg clone() {
return this;
}
}
class MIDI extends Object {
MidiDevice device;
int deviceNumber = 256;
long midiTS = 0;
boolean initialised = false;
Receiver out = null;
Transmitter in = null;
public MidiDevice.Info[] infos;
public MIDI(String target) {
try {
//debug("1a");
infos = MidiSystem.getMidiDeviceInfo();
//debug("1b");
//debug("Looking for device: "+target);
for (int i = 0; i < infos.length; i++) {
//debug(i+": "+infos[i].getName()+", "+infos[i].getDescription()+", "+MidiSystem.getMidiDevice(infos[i]).getMaxReceivers());
if (target.equals(infos[i].getName()) && (MidiSystem.getMidiDevice(infos[i]).getMaxReceivers() > 0 || MidiSystem.getMidiDevice(infos[i]).getMaxReceivers() == -1)) {
deviceNumber = i;
}
}
//debug("Device is number "+deviceNumber);
if (deviceNumber != 256) {
MidiDevice device = MidiSystem.getMidiDevice(infos[deviceNumber]);
device.open();
out = device.getReceiver();
this.initialised = true;
} else {
this.initialised = false;
}
} catch (MidiUnavailableException e) {
println("Error obtaining device:" + e);
this.initialised = false;
}
}
void sendOff(int note, int vel, int channel) {
ShortMessage msg = new ShortMessage();
try {
msg.setMessage(NOTEOFF, channel, note, vel);
} catch (InvalidMidiDataException e) {
println("Error in "+this+": "+e);
}
out.send(msg, midiTS);
midiTS++;
}
void sendOn(int note, int vel, int channel) {
//debug("sendOn() note="+note+" vel="+vel+" channel="+channel);
ShortMessage msg = new ShortMessage();
try {
msg.setMessage(NOTEON, channel, note, vel);
} catch (InvalidMidiDataException e) {
println("Error in "+this+": "+e);
}
if (!NOSEND) out.send(msg, midiTS);
midiTS++;
}
void sendCtl(int note, int vel, int channel) {
ShortMessage msg = new ShortMessage();
try {
msg.setMessage(CTLCHG, channel, note, vel);
} catch (InvalidMidiDataException e) {
println("Error in "+this+": "+e);
}
if (!NOSEND) out.send(msg, midiTS);
midiTS++;
}
void sendPgr(int program, int channel) {
ShortMessage msg = new ShortMessage();
try {
msg.setMessage(PRGCHG, channel, program, 0);
} catch (InvalidMidiDataException e) {
println("Error in "+this+": "+e);
}
if (!NOSEND) out.send(msg, midiTS);
midiTS++;
}
void close() {
if (device != null) {
//debug("Closing "+this+" ("+infos[deviceNumber].getName()+")");
device.close();
}
}
void reset() {
if (device != null) {
try {
device.close();
device.open();
} catch (Exception e) {
//debug("Exception: "+e);
}
}
}
}
class MIDIinput extends Object {
MidiDevice device;
int deviceNumber = 256;
boolean initialised = false;
Transmitter in = null;
MidiDevice.Info[] infos;
public MIDIinput(String target, Receiver listener) {
try {
infos = MidiSystem.getMidiDeviceInfo();
//debug("Looking for device: "+target);
for (int i = 0; i < infos.length; i++) {
//debug(i+": "+infos[i].getName()+", "+infos[i].getDescription()+", "+MidiSystem.getMidiDevice(infos[i]).getMaxTransmitters());
if (target.equals(infos[i].getName()) && (MidiSystem.getMidiDevice(infos[i]).getMaxTransmitters() > 0 || MidiSystem.getMidiDevice(infos[i]).getMaxTransmitters() == -1)) {
deviceNumber = i;
}
}
//debug("Device is number "+deviceNumber);
if (deviceNumber != 256) {
MidiDevice device = MidiSystem.getMidiDevice(infos[deviceNumber]);
device.open();
in = device.getTransmitter();
in.setReceiver(listener);
this.initialised = true;
} else {
this.initialised = false;
}
} catch (MidiUnavailableException e) {
println("Error obtaining device:" + e);
this.initialised = false;
}
}
void close() {
if (device != null) {
//debug("Closing "+this+" ("+infos[deviceNumber].getName()+")");
device.close();
}
}
void reset() {
if (device != null) {
try {
device.close();
device.open();
} catch (Exception e) {
//debug("Exception: "+e);
}
}
}
}
class MIDIListener implements Receiver {
String context;
public MIDIListener(String context) {
this.context = context;
// super.init();
}
void close() {
}
void send(MidiMessage msg, long ts) {
ShortMessage smsg = (ShortMessage) msg;
int channel = smsg.getChannel();
byte[] data = msg.getMessage();
debug("Control MIDI: "+data[1]);
debug("USERMODE: "+USERMODE);
if ((data[0] & 0xFF) == NOTEON) {
if (context.equals("Launchpad")) {
launchpadAction(data[1], data[2]);
}
if (context.equals("Software")) {
softwareNoteAction(data[1], data[2], channel);
}
}
if ((data[0] & 0xFF) == CTLCHG+channel ) {
if (context.equals("Software")) {
softwareCtlAction(data[1], data[2], channel);
}
if (context.equals("Launchpad")) {
if (LIVECONTROL == false) {
if (data[1] == 107 && data[2] == 127 && currentPage < pageNumbers[numberOfPages-1]) {
selectedPage = pageNumbers[indexForKey(pageNumbers, selectedPage)+1]; loadLayout(selectedPage);
}
if (data[1] == 106 && data[2] == 127 && currentPage > 1) {
selectedPage = pageNumbers[indexForKey(pageNumbers, selectedPage)-1]; loadLayout(selectedPage);
}
}
if (data[1] == 111 && data[2] == 127) {
if (LIVECONTROL == false) {
DEMO = !(DEMO);
//debug("Demo " + DEMO);
if (DEMO == false) {
clearDisplay();
loadLayout(currentPage);
}
}
}
if (data[1] == 108 && data[2] == 127) {
if (LIVEENABLED) {
clearDisplay();
LIVECONTROL = true;
NOSEND = true;
} else {
reloadLayouts();
}
}
if (data[1] == 109 && data[2] == 127 && USERMODE == 1) {
if (USERMODE == 1) {
LIVECONTROL = false;
NOSEND = false;
sleep(500);
loadLayout(selectedPage);
} else {
clearDisplay();
LIVECONTROL = true;
NOSEND = true;
}
}
if (data[1] == 110 && data[2] == 127 && USERMODE == 2) {
if (USERMODE == 2) {
LIVECONTROL = false;
NOSEND = false;
sleep(500);
loadLayout(selectedPage);
} else {
clearDisplay();
LIVECONTROL = true;
NOSEND = true;
}
}
}
}
//debug(context+" "+(data[0] & 0xFF)+" "+data[1]+" "+data[2]);
}
}
int lpacount = 0;
int lpacountmax = 400;
void controlOut(int x, int y, int value) {
if (x == 8) {
software.sendCtl(65+y, value, outputChannel);
} else {
software.sendCtl(y*8 + x, value, outputChannel);
}
outputChannel = currentPage - 1;
}
void controlOut(int cc, int value) {
software.sendCtl(cc, value, outputChannel);
outputChannel = currentPage - 1;
}
void programOut(int program) {
software.sendPgr(program, outputChannel);
outputChannel = currentPage - 1;
}
void noteOut(int note, int vel) {
software.sendOn(note, vel, outputChannel);
outputChannel = currentPage - 1;
}
void launchpadAction(int segment, int value){
if (LIVECONTROL == false) {
if (license.isValid() || demoIsValid()) {
debug("MIDI from X" + segment + " " + value);
if (segment == 8 || segment == 24 || segment == 40 || segment == 56 || segment == 72 || segment == 88 || segment == 104 ) {
if (segment == 8) segment = 65;
if (segment == 24) segment = 66;
if (segment == 40) segment = 67;
if (segment == 56) segment = 68;
if (segment == 72) segment = 69;
if (segment == 88) segment = 70;
if (segment == 104) segment = 71;
} else {
if (segment >= 112) { segment -= 8; }
if (segment >= 96) { segment -= 8; }
if (segment >= 80) { segment -= 8; }
if (segment >= 64) { segment -= 8; }
if (segment >= 48) { segment -= 8; }
if (segment >= 32) { segment -= 8; }
if (segment >= 16) { segment -= 8; }
}
debug("Translated segment: "+segment);
if (segment >= 0 && segment <= 71 && segment != 64) {
if (grid[segment] != null) {
if (value == 127) { grid[segment].down(); }
if (value == 0) { grid[segment].up(); }
}
} else {
if (segment == PAGESELECTOR && value == 127 && !LIVECONTROL) {
loadLayout(PAGESELECTOR);
}
}
lpacount++;
} else {
clearDisplay();
background(0);
fill(#FFFFFF);
textFont(f20, 20);
textAlign(CENTER);
smooth();
text("Demo period expired\nRelaunch or get a license :)", WINDOWSIZE/2, WINDOWSIZE/2);
mousestate = "quit";
}
}
}
void softwareNoteAction(int segment, int value, int channel) {
debug("softwareAction(): " + channel + " " + segment + " " + value);
if (channel+1 == currentPage) {
if (grid[segment] != null) {
grid[segment].nakedSetValue(value);
grid[segment].update();
}
} else {
if (grids[channel+1][segment] != null) grids[channel+1][segment].nakedSetValue(value);
}
}
void softwareCtlAction(int segment, int value, int channel) {
debug("softwareAction(): " + channel + " " + segment + " " + value);
if (channel+1 == currentPage) {
if (grid[segment] != null) {
grid[segment].nakedSetValue(value);
grid[segment].update();
}
} else {
if (grids[channel+1][segment] != null) grids[channel+1][segment].nakedSetValue(value);
}
}