package org.protocoderrunner.apprunner.api.other;
import android.content.Context;
import android.hardware.usb.UsbDevice;
import android.os.Handler;
import android.os.Handler.Callback;
import android.os.Message;
import org.protocoderrunner.apprunner.PInterface;
import org.protocoderrunner.sensors.WhatIsRunning;
import java.util.Arrays;
import jp.kshoji.driver.midi.device.MidiInputDevice;
public class PMidi extends PInterface {
private static final String TAG = "PMidi";
// User interface
final Handler midiInputEventHandler = new Handler(new Callback() {
@Override
public boolean handleMessage(Message msg) {
return true;
}
});
final Handler midiOutputEventHandler = new Handler(new Callback() {
@Override
public boolean handleMessage(Message msg) {
return true;
}
});
private void callback(final int cable, final int channel, final int function, final int value) {
mHandler.post(new Runnable() {
@Override
public void run() {
midiEvent.event(cable, channel, function, value);
}
});
}
private UsbMidiDriver usbMidiDriver;
// --------- startVoiceRecognition ---------//
public interface MidiDeviceEventCB {
void event(int cable, int channel, int function, int value);
}
MidiDeviceEventCB midiEvent;
public PMidi(Context appActivity, MidiDeviceEventCB callbackfn) {
super(appActivity);
this.midiEvent = callbackfn;
WhatIsRunning.getInstance().add(this);
usbMidiDriver = new UsbMidiDriver(appActivity) {
@Override
public void onDeviceAttached(UsbDevice usbDevice) {
// Toast.makeText(UsbMidiDriverSampleActivity.this, "USB MIDI Device " + usbDevice.getDeviceName() + " has been attached.", Toast.LENGTH_LONG).show();
}
@Override
public void onDeviceDetached(UsbDevice usbDevice) {
// Toast.makeText(UsbMidiDriverSampleActivity.this, "USB MIDI Device " + usbDevice.getDeviceName() + " has been detached.", Toast.LENGTH_LONG).show();
}
@Override
public void onMidiNoteOff(final MidiInputDevice sender, int cable, int channel, int note, int velocity) {
midiInputEventHandler.sendMessage(Message.obtain(midiInputEventHandler, 0, "NoteOff from: " + sender.getUsbDevice().getDeviceName() + ", cable: " + cable + ", channel: " + channel + ", note: " + note + ", velocity: " + velocity));
callback(cable, channel, note, velocity);
}
@Override
public void onMidiNoteOn(final MidiInputDevice sender, int cable, int channel, int note, int velocity) {
midiInputEventHandler.sendMessage(Message.obtain(midiInputEventHandler, 0, "NoteOn from: " + sender.getUsbDevice().getDeviceName() + ", cable: " + cable + ", channel: " + channel + ", note: " + note + ", velocity: " + velocity));
callback(cable, channel, note, velocity);
}
@Override
public void onMidiPolyphonicAftertouch(final MidiInputDevice sender, int cable, int channel, int note, int pressure) {
midiInputEventHandler.sendMessage(Message.obtain(midiInputEventHandler, 0, "PolyphonicAftertouch from: " + sender.getUsbDevice().getDeviceName() + ", cable: " + cable + ", channel: " + channel + ", note: " + note + ", pressure: " + pressure));
callback(cable, channel, note, pressure);
}
@Override
public void onMidiControlChange(final MidiInputDevice sender, final int cable, final int channel, final int function, final int value) {
midiInputEventHandler.sendMessage(Message.obtain(midiInputEventHandler, 0, "ControlChange from: " + sender.getUsbDevice().getDeviceName() + ", cable: " + cable + ", channel: " + channel + ", function: " + function + ", value: " + value));
callback(cable, channel, function, value);
}
@Override
public void onMidiProgramChange(final MidiInputDevice sender, int cable, int channel, int program) {
midiInputEventHandler.sendMessage(Message.obtain(midiInputEventHandler, 0, "ProgramChange from: " + sender.getUsbDevice().getDeviceName() + ", cable: " + cable + ", channel: " + channel + ", program: " + program));
callback(cable, channel, channel, program);
}
@Override
public void onMidiChannelAftertouch(final MidiInputDevice sender, int cable, int channel, int pressure) {
midiInputEventHandler.sendMessage(Message.obtain(midiInputEventHandler, 0, "ChannelAftertouch from: " + sender.getUsbDevice().getDeviceName() + ", cable: " + cable + ", channel: " + channel + ", pressure: " + pressure));
callback(cable, channel, channel, pressure);
}
@Override
public void onMidiPitchWheel(final MidiInputDevice sender, int cable, int channel, int amount) {
midiInputEventHandler.sendMessage(Message.obtain(midiInputEventHandler, 0, "PitchWheel from: " + sender.getUsbDevice().getDeviceName() + ", cable: " + cable + ", channel: " + channel + ", amount: " + amount));
callback(cable, channel, channel, amount);
}
@Override
public void onMidiSystemExclusive(final MidiInputDevice sender, int cable, final byte[] systemExclusive) {
midiInputEventHandler.sendMessage(Message.obtain(midiInputEventHandler, 0, "SystemExclusive from: " + sender.getUsbDevice().getDeviceName() + ", cable: " + cable + ", data:" + Arrays.toString(systemExclusive)));
}
@Override
public void onMidiSystemCommonMessage(final MidiInputDevice sender, int cable, final byte[] bytes) {
midiInputEventHandler.sendMessage(Message.obtain(midiInputEventHandler, 0, "SystemCommonMessage from: " + sender.getUsbDevice().getDeviceName() + ", cable: " + cable + ", bytes: " + Arrays.toString(bytes)));
}
@Override
public void onMidiSingleByte(final MidiInputDevice sender, int cable, int byte1) {
midiInputEventHandler.sendMessage(Message.obtain(midiInputEventHandler, 0, "SingleByte from: " + sender.getUsbDevice().getDeviceName() + ", cable: " + cable + ", data: " + byte1));
}
@Override
public void onMidiMiscellaneousFunctionCodes(final MidiInputDevice sender, int cable, int byte1, int byte2, int byte3) {
midiInputEventHandler.sendMessage(Message.obtain(midiInputEventHandler, 0, "MiscellaneousFunctionCodes from: " + sender.getUsbDevice().getDeviceName() + ", cable: " + cable + ", byte1: " + byte1 + ", byte2: " + byte2 + ", byte3: " + byte3));
}
@Override
public void onMidiCableEvents(final MidiInputDevice sender, int cable, int byte1, int byte2, int byte3) {
midiInputEventHandler.sendMessage(Message.obtain(midiInputEventHandler, 0, "CableEvents from: " + sender.getUsbDevice().getDeviceName() + ", cable: " + cable + ", byte1: " + byte1 + ", byte2: " + byte2 + ", byte3: " + byte3));
}
};
usbMidiDriver.open();
}
public void stop() {
usbMidiDriver.close();
}
}