/* * MidiMessageTest.java */ import javax.sound.midi.InvalidMidiDataException; import javax.sound.midi.MidiMessage; import javax.sound.midi.ShortMessage; import javax.sound.midi.MetaMessage; import javax.sound.midi.SysexMessage; public class MidiMessageTest { public static void main(String[] args) { String strType = args[0]; if (strType.equals("base")) { baseMessage(); } else if (strType.equals("short")) { shortMessage(); } else if (strType.equals("sysex")) { sysexMessage(); } else if (strType.equals("meta")) { metaMessage(); } else { System.out.println("use one of 'base', 'short', 'sysex' and 'meta'"); } } private static void baseMessage() { byte[] data = new byte[1]; MidiMessage m; byte[] t1; byte[] t2; int l1; data[0] = 5; m = new TestMessage(data); t1 = m.getMessage(); l1 = m.getLength(); if (t1.length == data.length) { out("MidiMessage.getMessage() returns length of the array passed to MidiMessage.<init>(byte[])"); } else { out("MidiMessage.getMessage() returns length different from the array passed to MidiMessage.<init>(byte[])"); } if (l1 == t1.length) { out("MidiMessage.getLength() returns length of the array returned by MidiMessage.getMessage()"); } else { out("MidiMessage.getLength() returns length different from the array returned by MidiMessage.getMessage()"); } if (l1 == data.length) { out("MidiMessage.getLength() returns length of the array passed to MidiMessage.<init>(byte[])"); } else { out("MidiMessage.getLength() returns length different from the array passed to MidiMessage.<init>(byte[])"); } if (data[0] != t1[0]) { out("MidiMessage.getMessage() returns wrong data; cannot test copying"); } data[0] = 77; t2 = m.getMessage(); if (data[0] == t2[0]) { out("MidiMessage.<init>(byte[]) does not copy"); } else if (t2[0] != 5) { out("MidiMessage.<init>(byte[]) or MidiMessage.getMessage() do something obscure"); } else { out("MidiMessage.<init>(byte[]) does copy"); } data[0] = 5; m = new TestMessage(data); t1 = m.getMessage(); t1[0] = 88; t2 = m.getMessage(); if (t1 == t2) { out("MidiMessage.getMessage() returns the same reference on subsequent invocations (indicates not copying)"); } else { out("MidiMessage.getMessage() returns the different reference on subsequent invocations (indicates copying)"); } if (t1[0] == t2[0]) { out("MidiMessage.getMessage() does not copy"); } else if (t2[0] != 5) { out("MidiMessage.getMessage() or MidiMessage.getMessage() do something obscure"); } else { out("MidiMessage.getMessage() does copy"); } out("----------------------------------------"); } private static void shortMessage() { byte[] data = new byte[1]; MidiMessage m; byte[] t1; byte[] t2; int l1; ShortMessage sm = new ShortMessage(); t1 = sm.getMessage(); l1 = sm.getLength(); out("ShortMessage() data: "); out(t1); out("ShortMessage().getLength(): " + l1); out("ShortMessage().getStatus(): " + sm.getStatus()); out("ShortMessage().getData1(): " + sm.getData1()); out("ShortMessage().getData2(): " + sm.getData2()); out("----------------------------------------"); } private static void sysexMessage() { byte[] data = new byte[1]; MidiMessage m; byte[] t1; byte[] t2; int l1; SysexMessage sxm = new SysexMessage(); t1 = sxm.getMessage(); l1 = sxm.getLength(); out("SysexMessage() data: "); out(t1); out("SysexMessage().getLength(): " + l1); out("----------------------------------------"); sxm = new SysexMessage(); byte[] databytes ={(byte) 240,120,100,100,(byte) 247}; try { sxm.setMessage(databytes,5); } catch (InvalidMidiDataException e) { e.printStackTrace(); } out("SysexMessage.getMessage(): "); out(sxm.getMessage()); out("SysexMessage.getData(): "); out(sxm.getData()); out("SysexMessage.getLength(): " + sxm.getLength()); out("SysexMessage.getStatus(): " + sxm.getStatus()); } private static void metaMessage() { byte[] data = new byte[1]; MidiMessage m; byte[] t1; byte[] t2; int l1; MetaMessage mm = new MetaMessage(); t1 = mm.getMessage(); l1 = mm.getLength(); out("MetaMessage() data: "); out(t1); out("MetaMessage().getLength(): " + l1); out("----------------------------------------"); mm = new MetaMessage(); String strTitle = "no name"; while (strTitle.length() < 200) { strTitle += strTitle; } // setting sequence/track name try { mm.setMessage(3, strTitle.getBytes(), strTitle.length() - 1); } catch (InvalidMidiDataException e) { e.printStackTrace(); } out("MetaMessage() getMessage(): "); out(mm.getMessage()); out("MetaMessage() getData(): "); out(mm.getData()); out("MetaMessage().getLength(): " + mm.getLength()); out("MetaMessage().getStatus(): " + mm.getStatus()); out("MetaMessage().getType(): " + mm.getType()); out("----------------------------------------"); } public static class TestMessage extends MidiMessage { /* This constructor passes null to the superclass constructor. This can be used to test the behaviour if the message content is not set correctely. */ public TestMessage() { super(null); } /* This constructor passes the passed byte array reference straight ahead to the superclass constructor. This can be used to test if the MidiMessage constructor copies the passed array. */ public TestMessage(byte[] abData) { super(abData); } /* not implemented for now. */ public Object clone() { return null; } } /* only for lazy people. */ private static void out(String strMessage) { System.out.println(strMessage); } private static void out(byte[] abArray) { out("data length: " + abArray.length); for (int i = 0; i < abArray.length; i++) { out("" + abArray[i]); } } } /*** MidiMessageTest.java ***/