package com.xenoage.zong.io.musicxml.in.readers;
import static com.xenoage.utils.math.Fraction._0;
import static com.xenoage.zong.core.position.MP.atMeasure;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import org.junit.Test;
import com.xenoage.zong.core.Score;
import com.xenoage.zong.core.instrument.PitchedInstrument;
import com.xenoage.zong.core.music.InstrumentChange;
import com.xenoage.zong.core.music.Measure;
import com.xenoage.zong.core.music.Part;
import com.xenoage.zong.core.music.util.BeatE;
import com.xenoage.zong.io.musicxml.in.MusicXmlScoreFileInputTest;
/**
* Test cases for the {@link InstrumentsReader}.
*
* @author Andreas Wenger
*/
public class InstrumentsReaderTest {
/**
* Read the file "InstrumentChanges.xml".
* It must contain 3 instruments, namely a Clarinet in B, an Alto Sax in Eb
* and a Trombone in C. Check also the transpositons and see if the instrument
* changes happen at the right positions.
*/
@Test public void testInstrumentChanges() {
Score score = MusicXmlScoreFileInputTest.loadXMLTestScore("InstrumentChanges.xml");
Part part = score.getStavesList().getParts().get(0);
assertEquals(3, part.getInstruments().size());
//clarinet
PitchedInstrument instr0 = (PitchedInstrument) part.getInstruments().get(0);
assertEquals("Clarinet in Bb", instr0.getName());
assertEquals(new Integer(-1), instr0.getTranspose().getDiatonic());
assertEquals(-2, instr0.getTranspose().getChromatic());
//altosax
PitchedInstrument instr1 = (PitchedInstrument) part.getInstruments().get(1);
assertEquals("Alto Saxophone", instr1.getName());
assertEquals(new Integer(-5), instr1.getTranspose().getDiatonic());
assertEquals(-9, instr1.getTranspose().getChromatic());
//trombone
PitchedInstrument instr2 = (PitchedInstrument) part.getInstruments().get(2);
assertEquals("Trombone", instr2.getName());
assertEquals(new Integer(0), instr2.getTranspose().getDiatonic());
assertEquals(0, instr2.getTranspose().getChromatic());
//instrument changes in measures 1, 2 and 3
Measure measure = score.getMeasure(atMeasure(0, 1));
assertEquals(instr1, getInstrumentChangeAtBeat0(measure).getInstrument());
measure = score.getMeasure(atMeasure(0, 2));
assertEquals(instr2, getInstrumentChangeAtBeat0(measure).getInstrument());
measure = score.getMeasure(atMeasure(0, 3));
assertEquals(instr0, getInstrumentChangeAtBeat0(measure).getInstrument());
}
private static InstrumentChange getInstrumentChangeAtBeat0(Measure measure) {
for (BeatE<InstrumentChange> ic : measure.getInstrumentChanges()) {
if (ic.beat.equals(_0))
return ic.element;
}
fail("Instrument change not found");
return null;
}
}