package jp.kshoji.javax.sound.midi.ble; import android.support.annotation.NonNull; import android.util.Log; import jp.kshoji.blemidi.device.MidiInputDevice; import jp.kshoji.blemidi.listener.OnMidiInputEventListener; import jp.kshoji.blemidi.util.Constants; import jp.kshoji.javax.sound.midi.InvalidMidiDataException; import jp.kshoji.javax.sound.midi.MidiDevice; import jp.kshoji.javax.sound.midi.MidiDeviceTransmitter; import jp.kshoji.javax.sound.midi.Receiver; import jp.kshoji.javax.sound.midi.ShortMessage; import jp.kshoji.javax.sound.midi.SysexMessage; /** * {@link jp.kshoji.javax.sound.midi.Transmitter} implementation * * @author K.Shoji */ public final class BleMidiTransmitter implements MidiDeviceTransmitter, OnMidiInputEventListener { private final BleMidiDevice bleMidiDevice; private Receiver receiver; /** * Constructor * * @param bleMidiDevice the device */ public BleMidiTransmitter(@NonNull BleMidiDevice bleMidiDevice) { this.bleMidiDevice = bleMidiDevice; open(); } @NonNull @Override public MidiDevice getMidiDevice() { return bleMidiDevice; } @Override public void setReceiver(Receiver receiver) { this.receiver = receiver; } @Override public Receiver getReceiver() { return receiver; } public void open() { MidiInputDevice midiInputDevice = bleMidiDevice.getMidiInputDevice(); if (midiInputDevice != null) { midiInputDevice.setOnMidiInputEventListener(this); } } @Override public void close() { MidiInputDevice midiInputDevice = bleMidiDevice.getMidiInputDevice(); if (midiInputDevice != null) { midiInputDevice.setOnMidiInputEventListener(null); } } @Override public void onMidiSystemExclusive(@NonNull MidiInputDevice sender, @NonNull byte[] systemExclusive) { if (receiver != null) { try { final SysexMessage message = new SysexMessage(); message.setMessage(systemExclusive, systemExclusive.length); receiver.send(message, -1); } catch (final InvalidMidiDataException e) { Log.d(Constants.TAG, "InvalidMidiDataException", e); } } } @Override public void onMidiNoteOff(@NonNull MidiInputDevice sender, int channel, int note, int velocity) { if (receiver != null) { try { final ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.NOTE_OFF, channel, note, velocity); receiver.send(message, -1); } catch (final InvalidMidiDataException e) { Log.d(Constants.TAG, "InvalidMidiDataException", e); } } } @Override public void onMidiNoteOn(@NonNull MidiInputDevice sender, int channel, int note, int velocity) { if (receiver != null) { try { final ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.NOTE_ON, channel, note, velocity); receiver.send(message, -1); } catch (final InvalidMidiDataException e) { Log.d(Constants.TAG, "InvalidMidiDataException", e); } } } @Override public void onMidiPolyphonicAftertouch(@NonNull MidiInputDevice sender, int channel, int note, int pressure) { if (receiver != null) { try { final ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.POLY_PRESSURE, channel, note, pressure); receiver.send(message, -1); } catch (final InvalidMidiDataException e) { Log.d(Constants.TAG, "InvalidMidiDataException", e); } } } @Override public void onMidiControlChange(@NonNull MidiInputDevice sender, int channel, int function, int value) { if (receiver != null) { try { final ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.CONTROL_CHANGE, channel, function, value); receiver.send(message, -1); } catch (final InvalidMidiDataException e) { Log.d(Constants.TAG, "InvalidMidiDataException", e); } } } @Override public void onMidiProgramChange(@NonNull MidiInputDevice sender, int channel, int program) { if (receiver != null) { try { final ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.PROGRAM_CHANGE, channel, program, 0); receiver.send(message, -1); } catch (final InvalidMidiDataException e) { Log.d(Constants.TAG, "InvalidMidiDataException", e); } } } @Override public void onMidiChannelAftertouch(@NonNull MidiInputDevice sender, int channel, int pressure) { if (receiver != null) { try { final ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.CHANNEL_PRESSURE, channel, pressure, 0); receiver.send(message, -1); } catch (final InvalidMidiDataException e) { Log.d(Constants.TAG, "InvalidMidiDataException", e); } } } @Override public void onMidiPitchWheel(@NonNull MidiInputDevice sender, int channel, int amount) { if (receiver != null) { try { final ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.PITCH_BEND, channel, amount & 0x7f, (amount >> 7) & 0x7f); receiver.send(message, -1); } catch (final InvalidMidiDataException e) { Log.d(Constants.TAG, "InvalidMidiDataException", e); } } } @Override public void onMidiTimeCodeQuarterFrame(@NonNull MidiInputDevice sender, int timing) { if (receiver != null) { try { final ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.MIDI_TIME_CODE, timing, 0); receiver.send(message, -1); } catch (final InvalidMidiDataException e) { Log.d(Constants.TAG, "InvalidMidiDataException", e); } } } @Override public void onMidiSongSelect(@NonNull MidiInputDevice sender, int song) { if (receiver != null) { try { final ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.SONG_SELECT, song, 0); receiver.send(message, -1); } catch (final InvalidMidiDataException e) { Log.d(Constants.TAG, "InvalidMidiDataException", e); } } } @Override public void onMidiSongPositionPointer(@NonNull MidiInputDevice sender, int position) { if (receiver != null) { try { final ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.SONG_POSITION_POINTER, (position >> 7) & 0x7f, position & 0x7f); receiver.send(message, -1); } catch (final InvalidMidiDataException e) { Log.d(Constants.TAG, "InvalidMidiDataException", e); } } } @Override public void onMidiTuneRequest(@NonNull MidiInputDevice sender) { if (receiver != null) { try { final ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.TUNE_REQUEST, 0, 0); receiver.send(message, -1); } catch (final InvalidMidiDataException e) { Log.d(Constants.TAG, "InvalidMidiDataException", e); } } } @Override public void onMidiTimingClock(@NonNull MidiInputDevice sender) { if (receiver != null) { try { final ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.TIMING_CLOCK, 0, 0); receiver.send(message, -1); } catch (final InvalidMidiDataException e) { Log.d(Constants.TAG, "InvalidMidiDataException", e); } } } @Override public void onMidiStart(@NonNull MidiInputDevice sender) { if (receiver != null) { try { final ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.START, 0, 0); receiver.send(message, -1); } catch (final InvalidMidiDataException e) { Log.d(Constants.TAG, "InvalidMidiDataException", e); } } } @Override public void onMidiContinue(@NonNull MidiInputDevice sender) { if (receiver != null) { try { final ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.CONTINUE, 0, 0); receiver.send(message, -1); } catch (final InvalidMidiDataException e) { Log.d(Constants.TAG, "InvalidMidiDataException", e); } } } @Override public void onMidiStop(@NonNull MidiInputDevice sender) { if (receiver != null) { try { final ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.STOP, 0, 0); receiver.send(message, -1); } catch (final InvalidMidiDataException e) { Log.d(Constants.TAG, "InvalidMidiDataException", e); } } } @Override public void onMidiActiveSensing(@NonNull MidiInputDevice sender) { if (receiver != null) { try { final ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.ACTIVE_SENSING, 0, 0); receiver.send(message, -1); } catch (final InvalidMidiDataException e) { Log.d(Constants.TAG, "InvalidMidiDataException", e); } } } @Override public void onMidiReset(@NonNull MidiInputDevice sender) { if (receiver != null) { try { final ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.SYSTEM_RESET, 0, 0); receiver.send(message, -1); } catch (final InvalidMidiDataException e) { Log.d(Constants.TAG, "InvalidMidiDataException", e); } } } @Override public void onRPNMessage(@NonNull MidiInputDevice sender, int channel, int function, int value) { // do nothing in this implementation } @Override public void onNRPNMessage(@NonNull MidiInputDevice sender, int channel, int function, int value) { // do nothing in this implementation } }