/*
* TempoTestCase.java
*/
/*
* Copyright (c) 2003 by Matthias Pfisterer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.tritonus.test.sequencer;
import javax.sound.midi.MetaEventListener;
import javax.sound.midi.MetaMessage;
import javax.sound.midi.MidiEvent;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
import javax.sound.midi.Track;
/** Tests for class javax.sound.midi.MidiMessage.
*/
public class TempoTestCase
extends BaseSequencerTestCase
{
private static final float DELTA = 1.0E-9F;
private static final float MPQ0 = 500000;
private static final float BPM0 = 120;
private static final float MPQ1 = 600000;
private static final float BPM1 = 100;
private static final float MPQ2 = 416666.66F;
private static final float BPM2 = 144;
private static final byte[] TEMPOTEXT =
{
't', 'e', 'm', 'p', 'o'
};
public TempoTestCase(String strName)
{
super(strName);
}
protected void checkSequencer(Sequencer seq)
throws Exception
{
// initial tempo
checkTempoValues("initial", seq, MPQ0, BPM0, 1.0F);
// setting values in closed state
seq.setTempoInMPQ(MPQ1);
checkTempoValues("closed: setMPQ", seq, MPQ1, BPM1, 1.0F);
seq.setTempoInBPM(BPM2);
checkTempoValues("closed: setBPM", seq, MPQ2, BPM2, 1.0F);
seq.setTempoFactor(2.0F);
checkTempoValues("closed: setFactor", seq, MPQ2, BPM2, 2.0F);
seq.setSequence(createSequence());
checkTempoValues("closed: after setSequence()", seq, MPQ2, BPM2, 1.0F);
seq.open();
checkTempoValues("after open()", seq, MPQ2, BPM2, 1.0F);
// setting values in open state
seq.setTempoInMPQ(MPQ1);
checkTempoValues("open: setMPQ", seq, MPQ1, BPM1, 1.0F);
seq.setTempoInBPM(BPM2);
checkTempoValues("open: setBPM", seq, MPQ2, BPM2, 1.0F);
seq.setTempoFactor(3.0F);
checkTempoValues("open: setFactor", seq, MPQ2, BPM2, 3.0F);
seq.start();
checkTempoValues("after start()", seq, MPQ2, BPM2, 3.0F);
// setting values in start state
seq.setTempoInMPQ(MPQ1);
checkTempoValues("started: setMPQ", seq, MPQ1, BPM1, 3.0F);
seq.setTempoInBPM(BPM2);
checkTempoValues("started: setBPM", seq, MPQ2, BPM2, 3.0F);
seq.setTempoFactor(2.0F);
checkTempoValues("started: setFactor", seq, MPQ2, BPM2, 2.0F);
seq.stop();
checkTempoValues("after stop()", seq, MPQ2, BPM2, 2.0F);
// setting values in start state
seq.setTempoInMPQ(MPQ1);
checkTempoValues("stopped: setMPQ", seq, MPQ1, BPM1, 2.0F);
seq.setTempoInBPM(BPM2);
checkTempoValues("stopped: setBPM", seq, MPQ2, BPM2, 2.0F);
seq.setTempoFactor(3.0F);
checkTempoValues("stopped: setFactor", seq, MPQ2, BPM2, 3.0F);
seq.close();
checkTempoValues("after close()", seq, MPQ2, BPM2, 3.0F);
}
private void checkTempoValues(String strMessagePrefix,
Sequencer seq,
float fExpectedMPQ,
float fExpectedBPM,
float fExpectedFactor)
{
assertEquals(strMessagePrefix + " tempo in MPQ",
fExpectedMPQ, seq.getTempoInMPQ(), DELTA);
assertEquals(strMessagePrefix + " tempo in BPM",
fExpectedBPM, seq.getTempoInBPM(), DELTA);
assertEquals(strMessagePrefix + " tempo factor",
fExpectedFactor, seq.getTempoFactor(), DELTA);
}
private static Sequence createSequence()
throws Exception
{
Sequence sequence = new Sequence(Sequence.PPQ, 480);
Track track = sequence.createTrack();
for (long lTick = 0; lTick < 100000; lTick += 1000)
{
MetaMessage mm = new MetaMessage();
mm.setMessage(6, TEMPOTEXT, TEMPOTEXT.length);
MidiEvent me = new MidiEvent(mm, lTick);
track.add(me);
}
return sequence;
}
private static class TempoDetector
implements MetaEventListener
{
private long[] m_alArrivalTimes;
public void meta(MetaMessage message)
{
if (message.getType() == 6)
{
System.arraycopy(m_alArrivalTimes, 0, m_alArrivalTimes, 1, 9);
m_alArrivalTimes[0] = System.currentTimeMillis();
}
}
public float getTempoInMPQ()
{
return 0.0F;
}
}
}
/*** TempoTestCase.java ***/