1 /* 2 * Copyright (c) 2004, 2017, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 import javax.sound.midi.MidiEvent; 25 import javax.sound.midi.MidiMessage; 26 import javax.sound.midi.MidiSystem; 27 import javax.sound.midi.MidiUnavailableException; 28 import javax.sound.midi.Receiver; 29 import javax.sound.midi.Sequence; 30 import javax.sound.midi.Sequencer; 31 import javax.sound.midi.ShortMessage; 32 import javax.sound.midi.Track; 33 34 /** 35 * @test 36 * @bug 5048381 37 * @summary Sequencer records real time messages into the sequence 38 */ 39 public class SeqRecordsRealTimeEvents { 40 41 public static void main(String argv[]) { 42 Sequencer s = null; 43 try { 44 s = MidiSystem.getSequencer(); 45 s.open(); 46 } catch (final MidiUnavailableException ignored) { 47 // the test is not applicable 48 return; 49 } 50 try { 51 Sequence seq = new Sequence(Sequence.PPQ, 384, 2); 52 s.setSequence(seq); 53 Track t = seq.getTracks()[0]; 54 ShortMessage msg = new ShortMessage(); 55 msg.setMessage(0x90, 0x40, 0x7F); 56 t.add(new MidiEvent(msg, 11000)); 57 msg = new ShortMessage(); 58 msg.setMessage(0x90, 0x40, 0x00); 59 t.add(new MidiEvent(msg, 12000)); 60 t = seq.getTracks()[1]; 61 s.recordEnable(t, -1); 62 System.out.println("Started recording..."); 63 s.startRecording(); 64 Receiver r = s.getReceiver(); 65 Thread.sleep(100); 66 int oldTrackSize = t.size(); 67 // send a realtime message to the track 68 System.out.println("Recording real time message..."); 69 msg = new ShortMessage(); 70 msg.setMessage(0xF8, 0, 0); 71 r.send(msg, -1); 72 Thread.sleep(100); 73 // send a normal message 74 msg = new ShortMessage(); 75 System.out.println("Recording a normal NOTE ON message..."); 76 msg.setMessage(0x90, 0x40, 0x6F); 77 r.send(msg, -1); 78 Thread.sleep(100); 79 s.stop(); 80 // now see if the messages were recorded 81 int newMessages = t.size() - oldTrackSize; 82 System.out.println("Recorded messages:"); 83 for (int i = 0; i < t.size(); i++) { 84 System.out.print(" "+(i+1)+". "); 85 printEvent(t.get(i)); 86 } 87 if (newMessages == 0) { 88 System.out.println("## Failed: No messages were recorded!"); 89 throw new Exception("Test FAILED!"); 90 } else if (newMessages == 1) { 91 System.out.println("Only one message was recorded. Correct!"); 92 } else if (newMessages > 1) { 93 System.out.println("## Failed: 2 or more messages were recorded!"); 94 throw new Exception("Test FAILED!"); 95 } 96 System.out.println("Test passed."); 97 } catch (Exception e) { 98 System.out.println("Unexpected Exception: "+e); 99 //e.printStackTrace(); 100 throw new RuntimeException("Test FAILED!"); 101 } finally { 102 s.close(); 103 } 104 } 105 public static void printEvent(MidiEvent event) 106 { 107 MidiMessage message = event.getMessage(); 108 long tick = event.getTick(); 109 byte[] data = message.getMessage(); 110 111 StringBuffer sb = new StringBuffer((data.length * 3) - 1); 112 113 for (int i = 0; i < data.length; i++) 114 { 115 sb.append(toHexByteString(data[i])); 116 if (i < data.length - 1) sb.append(' '); 117 } 118 System.out.printf("%5d: %s%n", tick, sb); 119 } 120 121 private static String toHexByteString(int n) 122 { 123 if (n < 0) n &= 0xFF; 124 String s = Integer.toHexString(n).toUpperCase(); 125 if (s.length() == 1) s = '0' + s; 126 return s; 127 } 128 }