package com.xenoage.zong.io.midi.out;
import static com.xenoage.utils.collections.CList.ilist;
import static com.xenoage.utils.math.Fraction.fr;
import static com.xenoage.zong.core.music.chord.Note.notes;
import static com.xenoage.zong.core.music.time.TimeType.timeType;
import static com.xenoage.zong.core.position.MP.mp0;
import static com.xenoage.zong.desktop.io.midi.out.MidiScorePlayer.midiScorePlayer;
import javax.sound.midi.MidiUnavailableException;
import com.xenoage.utils.math.Fraction;
import com.xenoage.zong.commands.core.music.PartAdd;
import com.xenoage.zong.core.Score;
import com.xenoage.zong.core.instrument.Instrument;
import com.xenoage.zong.core.music.ColumnElement;
import com.xenoage.zong.core.music.Part;
import com.xenoage.zong.core.music.Pitch;
import com.xenoage.zong.core.music.chord.Chord;
import com.xenoage.zong.core.music.clef.Clef;
import com.xenoage.zong.core.music.clef.ClefType;
import com.xenoage.zong.core.music.direction.Dynamic;
import com.xenoage.zong.core.music.direction.DynamicValue;
import com.xenoage.zong.core.music.key.TraditionalKey;
import com.xenoage.zong.core.music.time.TimeSignature;
import com.xenoage.zong.desktop.io.midi.out.MidiScorePlayer;
import com.xenoage.zong.desktop.io.midi.out.SynthManager;
import com.xenoage.zong.io.selection.Cursor;
/**
* Tests for {@link MidiVelocityConverter}.
*
* @author Uli Teschemacher
* @author Andreas Wenger
*/
public class MidiVelocityConverterTry {
public static void main(String... args) {
new MidiVelocityConverterTry().midiConverterTest();
}
public void midiConverterTest() {
Score score = createTestScore();
try {
SynthManager.init(false);
MidiScorePlayer.init();
MidiScorePlayer pl = midiScorePlayer();
pl.addPlaybackListener(new MidiScorePlayerTry());
pl.openScore(score);
pl.start();
try {
Thread.sleep(8000);
} catch (InterruptedException ex) {
}
SynthManager.close();
} catch (MidiUnavailableException e) {
}
/*
byte[] message = sequence.getTracks()[0].get(0).getMessage().getMessage();
//Assert.assertEquals(58, message[2]);
message = sequence.getTracks()[0].get(1).getMessage().getMessage();
Assert.assertEquals(116, message[2]);
//Message 2 is note-off event
message = sequence.getTracks()[0].get(3).getMessage().getMessage();
Assert.assertEquals(110, message[2]);
//Message 4 and 5 are note-off events
message = sequence.getTracks()[0].get(6).getMessage().getMessage();
Assert.assertEquals(110, message[2]);
//Message 7 is note-off event
message = sequence.getTracks()[0].get(8).getMessage().getMessage();
Assert.assertEquals(110, message[2]);
message = sequence.getTracks()[0].get(9).getMessage().getMessage();
Assert.assertEquals(116, message[2]);
//Message 10 is note-off event
message = sequence.getTracks()[0].get(11).getMessage().getMessage();
Assert.assertEquals(58, message[2]);
//Message 12 and 13 are note-off events
message = sequence.getTracks()[0].get(14).getMessage().getMessage();
Assert.assertEquals(58, message[2]);
//Message15 is note-off event
message = sequence.getTracks()[0].get(16).getMessage().getMessage();
Assert.assertEquals(102, message[2]);
message = sequence.getTracks()[0].get(17).getMessage().getMessage();
Assert.assertEquals(58, message[2]);
//Message 18 is note-off event
message = sequence.getTracks()[0].get(19).getMessage().getMessage();
Assert.assertEquals(58, message[2]);
//Message 20 is note-off event
message = sequence.getTracks()[0].get(21).getMessage().getMessage();
Assert.assertEquals(58, message[2]);
//Message 22, 23 and 24 are note-off events
*/
}
public static Score createTestScore() {
Score ret = new Score();
Instrument instr = Instrument.defaultInstrument;
Part pianoPart = new Part("Test", "T", 1, ilist(instr));
new PartAdd(ret, pianoPart, 0, null).execute();
Cursor cursor = new Cursor(ret, mp0, true);
cursor.write((ColumnElement) new TraditionalKey(-3));
cursor.write((ColumnElement) new TimeSignature(timeType(3, 4)));
cursor.write(new Clef(ClefType.clefTreble));
Fraction f4 = fr(1, 4);
Chord attachC;
cursor.write(attachC = chord(f4, Pitch.pi(Pitch.G, 4)));
attachC.addDirection(new Dynamic(DynamicValue.pp));
cursor.write(attachC = chord(f4, Pitch.pi(Pitch.A, 4)));
attachC.addDirection(new Dynamic(DynamicValue.ff));
cursor.write(attachC = chord(f4, Pitch.pi(Pitch.G, 4)));
attachC.addDirection(new Dynamic(DynamicValue.sfp));
/*
Chord chord;
Voice voice = measure.getVoices().get(0);
chord = voice.addNote(pi'G', 0, 4), fr(1, 4));
chord.addDirection(new Dynamic(DynamicsType.pp));
chord = voice.addNote(pi'A', 0, 4), fr(1, 4));
chord.addDirection(new Dynamic(DynamicsType.ff));
chord = voice.addNote(pi'G', 0, 4), fr(1, 4));
chord.addDirection(new Dynamic(DynamicsType.sfp));
*/
cursor.setMp(mp0.withVoice(1));
cursor.write(attachC = chord(f4, Pitch.pi(Pitch.C, 4)));
attachC.addDirection(new Dynamic(DynamicValue.fff));
/*
voice = measure.addVoice();
chord = voice.addNote(pi'C', 0, 4), fr(1, 4));
chord.addDirection(new Dynamic(DynamicsType.fff));
*/
cursor.setMp(mp0.withMeasure(1));
cursor.write(attachC = chord(f4, Pitch.pi(Pitch.G, 4)));
//cursor.withScore(ScoreController.attachElement(cursor.getScore(), attachC, new Dynamic(DynamicsType.pp)));
cursor.write(attachC = chord(f4, Pitch.pi(Pitch.A, 4)));
attachC.addDirection(new Dynamic(DynamicValue.pp));
cursor.write(attachC = chord(f4, Pitch.pi(Pitch.G, 4)));
attachC.addDirection(new Dynamic(DynamicValue.pp));
cursor.setMp(cursor.getMP().withElement(0).withVoice(1));
cursor.write(attachC = chord(f4, Pitch.pi(Pitch.C, 5)));
/*
measure = staff.getMeasures().get(1);
voice = measure.getVoices().get(0);
chord = voice.addNote(pi'G', 0, 4), fr(1, 4));
//chord.addDirection(new Dynamic(DynamicsType.pp));
chord = voice.addNote(pi'A', 0, 4), fr(1, 4));
chord.addDirection(new Dynamic(DynamicsType.pp));
chord = voice.addNote(pi'G', 0, 4), fr(1, 4));
chord.addDirection(new Dynamic(DynamicsType.pp));
voice = measure.addVoice();
chord = voice.addNote(pi'C', 0, 5), fr(1, 4));
*/
cursor.setMp(mp0.withMeasure(2));
cursor.write(attachC = chord(f4, Pitch.pi(Pitch.G, 4)));
attachC.addDirection(new Dynamic(DynamicValue.sfz));
cursor.write(chord(f4, Pitch.pi(Pitch.A, 4)));
//cursor = cursor.withScore(ScoreController.attachElement(cursor.getScore(), attachC, new Dynamic(DynamicsType.pp)));
cursor.write(chord(f4, Pitch.pi(Pitch.G, 4)));
//cursor = cursor.withScore(ScoreController.attachElement(cursor.getScore(), attachC, new Dynamic(DynamicsType.pp)));
cursor.setMp(mp0.withMeasure(2).withVoice(2));
cursor.write(chord(f4, Pitch.pi(Pitch.C, 5)));
/*
measure = staff.getMeasures().get(2);
voice = measure.getVoices().get(0);
chord = voice.addNote(pi'G', 0, 4), fr(1, 4));
chord.addDirection(new Dynamic(DynamicsType.sfz));
chord = voice.addNote(pi'A', 0, 4), fr(1, 4));
//chord.addDirection(new Dynamic(DynamicsType.pp));
chord = voice.addNote(pi'G', 0, 4), fr(1, 4));
//chord.addDirection(new Dynamic(DynamicsType.pp));
voice = measure.addVoice();
voice = measure.addVoice();
chord = voice.addNote(pi'C',0,5), fr(1,2));
*/
return cursor.getScore();
}
private static Chord chord(Fraction fraction, Pitch... pitches) {
return new Chord(notes(pitches), fraction);
}
}