package com.frinika.midi; import java.util.List; import java.util.Vector; import javax.sound.midi.MidiDevice; import javax.sound.midi.MidiMessage; import javax.sound.midi.Receiver; import javax.sound.midi.ShortMessage; import javax.sound.midi.Transmitter; /** * * Midi device that acts like a hub. Messages coming in are sent to all * recievers * * MidiDebugDevice dev; * * Transmitter t1,t2; Reciever r1; * * dev.getReciever().addTransmitter(t1); dev.getReciever().addTransmitter(t2); * * r1.addTransmitter(dev.getTransmitter()); * * * @author pjl * @version 1.0 */ public class MidiDebugDevice implements MidiDevice { List<Transmitter> trans = new Vector<Transmitter>(); List<Receiver> recvs = new Vector<Receiver>(); static class DeviceInfo extends MidiDevice.Info { DeviceInfo() { super("DebugDevice", "DrPJ", "debug device", "0.1a"); } } static DeviceInfo info = new DeviceInfo(); boolean isOpen; class Rec implements Receiver { public void close() { MidiDebugDevice.this.recvs.remove(this); } public void send(MidiMessage mess, long timeStamp) { // byte a[] = mess.getMessage(); // StringBuffer buff = new StringBuffer(" MESS: "); byte[] msgBytes = mess.getMessage(); if (msgBytes[0] == -1 && msgBytes[1] == 0x51 && msgBytes[2] == 3) { int mpq = ((msgBytes[3] & 0xff) << 16) | ((msgBytes[4] & 0xff) << 8) | (msgBytes[5] & 0xff); // sequencer // .setTempoInBPM((int) (60000000f / mpq)); // PJL remove cast to int System.out.println("DEBUG RECVIEVED TMEPO " + 60000000f / mpq); } if (mess instanceof ShortMessage) { ShortMessage shm = (ShortMessage) mess; switch (shm.getCommand()) { case ShortMessage.CONTROL_CHANGE: System.out.println("ControlChange :" + shm.getData1() + " " + shm.getData2()); break; case ShortMessage.PITCH_BEND: short low = (byte) shm.getData1(); short high = (byte) shm.getData2(); short val = (short) ((high << 7) | low); System.out.println(" Pitch Change = " + high + ":" + low + " " + val); break; default: int cmd = shm.getCommand(); if (cmd != 240) { int chn = shm.getChannel(); int dat1 = shm.getData1(); int dat2 = shm.getData2(); System.out.println(" cmd:" + cmd + " chn:" + chn + " data:" + dat1 + " " + dat2); } } for (Transmitter t : MidiDebugDevice.this.trans) { if (((Trans) t).recv != null) { ((Trans) t).recv.send(mess, -1); } } } } } class Trans implements Transmitter { Receiver recv; public void close() { MidiDebugDevice.this.trans.remove(this); if (this.recv != null) { this.recv.close(); } this.recv = null; } public Receiver getReceiver() { return this.recv; } public void setReceiver(Receiver recv) { this.recv = recv; } } public MidiDebugDevice() { } public long getMicrosecondPosition() { return -1; } public List<Transmitter> getTransmitters() { return this.trans; } public List<Receiver> getReceivers() { return this.recvs; } public void close() { } public Transmitter getTransmitter() { Trans t = new Trans(); this.trans.add(t); return t; } public Receiver getReceiver() { Rec r = new Rec(); this.recvs.add(r); return r; } public int getMaxTransmitters() { return -1; } public int getMaxReceivers() { return -1; } public MidiDevice.Info getDeviceInfo() { return info; } public void open() { this.isOpen = true; } public boolean isOpen() { return this.isOpen; } static public String eventToString(MidiMessage mess) { String ret=null; byte[] msgBytes = mess.getMessage(); if (msgBytes[0] == -1 && msgBytes[1] == 0x51 && msgBytes[2] == 3) { int mpq = ((msgBytes[3] & 0xff) << 16) | ((msgBytes[4] & 0xff) << 8) | (msgBytes[5] & 0xff); // sequencer // .setTempoInBPM((int) (60000000f / mpq)); // PJL remove cast to int ret="TMEPO " + (60000000f / mpq); } if (mess instanceof ShortMessage) { ShortMessage shm = (ShortMessage) mess; switch (shm.getCommand()) { case ShortMessage.NOTE_ON: return null; case ShortMessage.NOTE_OFF: return null; case ShortMessage.CONTROL_CHANGE: ret="ControlChange :" + shm.getData1() + " " + shm.getData2(); break; case ShortMessage.PITCH_BEND: short low = (byte) shm.getData1(); short high = (byte) shm.getData2(); short val = (short) ((high << 7) | low); ret=" Pitch Change = " + high + ":" + low + " " + val; break; default: int cmd = shm.getCommand(); if (cmd != 240) { int chn = shm.getChannel(); int dat1 = shm.getData1(); int dat2 = shm.getData2(); ret=" cmd:" + cmd + " chn:" + chn + " data:" + dat1 + " " + dat2; } } } return ret; } }