1 /*
   2  * Copyright (c) 2003, 2016, 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.MidiSystem;
  26 import javax.sound.midi.Sequence;
  27 import javax.sound.midi.Sequencer;
  28 import javax.sound.midi.ShortMessage;
  29 import javax.sound.midi.Track;
  30 
  31 /**
  32  * @test
  33  * @bug 4493775
  34  * @summary Sequncer method, setTickPosition(long) doesnot set the Tick position
  35  */
  36 public class SetTickPosition {
  37         private static boolean testPassed = true;
  38 
  39         public void runTest()
  40         {
  41             Sequencer theSequencer = null;
  42             try
  43             {
  44                 System.out.print("Getting Sequencer...");
  45                 theSequencer = MidiSystem.getSequencer();
  46                 System.out.println("got "+theSequencer);
  47 
  48                 if(!(theSequencer.isOpen()))
  49                 {
  50                     System.out.println("Opening Sequencer...");
  51                     theSequencer.open();
  52 
  53                     if(!(theSequencer.isOpen()))
  54                     {
  55                         System.out.println("Unable to open the Sequencer. Test NOT FAILED.");
  56                         return;
  57                     }
  58                 }
  59 
  60                 System.out.println("theSequencer is open!\n");
  61 
  62                 System.out.println("Creating New Sequence...");
  63                 Sequence theSequence = new Sequence(Sequence.PPQ, 120);
  64 
  65                 System.out.println("Adding Track To Sequence...");
  66                 Track theTrack = theSequence.createTrack();
  67 
  68                 int theChannel = 0;
  69 
  70                 int theNote = 60;
  71                 int theVelocity = 100;
  72                 ShortMessage theShortMessage = new ShortMessage();
  73 
  74                 for (int tick=0; tick<2000; tick+=120) {
  75                     //System.out.println("Adding NOTE_ON To Track At Tick: " + tick + "...\n");
  76                     theShortMessage.setMessage(ShortMessage.NOTE_ON, theChannel, theNote, theVelocity);
  77                     MidiEvent theMidiEvent = new MidiEvent(theShortMessage, tick);
  78                     theTrack.add(theMidiEvent);
  79 
  80                     //System.out.println("Adding NOTE_OFF To Track At Tick: " + (tick+60) + "...\n");
  81                     theShortMessage.setMessage(ShortMessage.NOTE_OFF, theChannel, theNote, theVelocity);
  82                     theMidiEvent = new MidiEvent(theShortMessage, tick+60);
  83                     theTrack.add(theMidiEvent);
  84                 }
  85                 theSequencer.setSequence(theSequence);
  86 
  87                 float theTempoInBPM = 120;
  88                 theSequencer.setTempoInBPM(theTempoInBPM);
  89                 long theTickLengthOfSequence = theSequencer.getTickLength();
  90                 System.out.println("Length Of Sequence In Ticks: " + theTickLengthOfSequence);
  91                 System.out.println("Sequence resolution: " + theSequencer.getSequence().getResolution());
  92 
  93                 theSequencer.start();
  94                 for(long theTickPosition = 0; theTickPosition < theTickLengthOfSequence; theTickPosition += (theTickLengthOfSequence / 10))
  95                 {
  96                     System.out.println("Now Setting Tick Position To: " + theTickPosition);
  97                     theSequencer.setTickPosition(theTickPosition);
  98 
  99                     long theCurrentTickPosition = theSequencer.getTickPosition();
 100                     long theCurrentMsPosition = (long) (theSequencer.getMicrosecondPosition()/1000);
 101                     System.out.println("IsRunning()=" + theSequencer.isRunning());
 102                     System.out.println("Now Current Tick Position Is: " + theCurrentTickPosition);
 103                     //System.out.println("Now Current micro Position Is: " + theCurrentMsPosition);
 104                     System.out.println("");
 105 
 106                     try {
 107                         Thread.sleep(800);
 108                     } catch (InterruptedException ie) {}
 109 
 110                     // last time, set tick pos to 0
 111                     if (theTickPosition>0 && theTickPosition<(theTickLengthOfSequence / 10)) {
 112                         theTickPosition=(theTickLengthOfSequence / 10);
 113                     }
 114 
 115                     // 30 = 1/4 * 120, the resolution of the sequence
 116                     if(Math.abs(theCurrentTickPosition - theTickPosition) > 30) {
 117                         System.out.println("theCurrentTickPosition != theTickPosition!");
 118                         testPassed = false;
 119                     }
 120                 }
 121 
 122             }
 123             catch (Exception ex) { ex.printStackTrace(); }
 124             if (theSequencer != null) {
 125                 theSequencer.close();
 126             }
 127             if (testPassed) {
 128                 System.out.println("Test Passed.");
 129             }
 130         }
 131 
 132     public static void main(String[] args) throws Exception {
 133         SetTickPosition thisTest = new SetTickPosition();
 134         thisTest.runTest();
 135         if (!testPassed) {
 136             throw new Exception("Test FAILED");
 137         }
 138     }
 139 }