use of com.xenoage.zong.musicxml.types.MxlNote in project Zong by Xenoage.
the class MeasureReader method readToContext.
/**
* Reads the given measure element.
*/
public static void readToContext(MxlMeasure mxlMeasure, int measureIndex, Context context) {
// begin a new measure
context.beginNewMeasure(measureIndex);
// list all elements
List<MxlMusicDataContent> content = mxlMeasure.getMusicData().getContent();
for (int i = 0; i < content.size(); i++) {
// i may be modified within this loop
MxlMusicDataContent mxlMDC = content.get(i);
switch(mxlMDC.getMusicDataContentType()) {
case Note:
{
MxlNote mxlNote = ((MxlNote) mxlMDC);
// when it is a chord, ignore it, because we did already read it
if (mxlNote.getContent().getFullNote().isChord()) {
continue;
}
// instrument change?
MxlInstrument mxlInstrument = mxlNote.getInstrument();
if (mxlInstrument != null) {
String instrumentID = mxlInstrument.getId();
if (context.getInstrumentID() == null || !context.getInstrumentID().equals(instrumentID)) {
// instrument change detected!
context.writeInstrumentChange(instrumentID);
}
}
// collect all following notes which have a chord-element
// inbetween there may be direction elements, so we collect the
// notes until the first non-chord or non-direction element and after
// that go on at the current position + 1
List<MxlNote> mxlNotes = alist(mxlNote);
for (int i2 = i + 1; i2 < content.size(); i2++) {
MxlMusicDataContent mxlMDC2 = content.get(i2);
boolean goOn = false;
if (mxlMDC2.getMusicDataContentType() == MxlMusicDataContentType.Note) {
MxlNote mxlNote2 = (MxlNote) mxlMDC2;
if (mxlNote2.getContent().getFullNote().isChord()) {
mxlNotes.add(mxlNote2);
goOn = true;
}
} else if (mxlMDC2.getMusicDataContentType() == MxlMusicDataContentType.Direction) {
goOn = true;
}
if (!goOn)
break;
}
new ChordReader(mxlNotes).readToContext(context);
break;
}
case Attributes:
new AttributesReader((MxlAttributes) mxlMDC).readToContext(context);
break;
case Backup:
readBackupToContext((MxlBackup) mxlMDC, context);
break;
case Forward:
readForwardToContext((MxlForward) mxlMDC, context);
break;
case Print:
new PrintReader((MxlPrint) mxlMDC).readToContext(context);
break;
case Direction:
new DirectionReader((MxlDirection) mxlMDC).readToContext(context);
break;
case Barline:
new BarlineReader((MxlBarline) mxlMDC).readToContext(context);
break;
}
}
}
use of com.xenoage.zong.musicxml.types.MxlNote in project Zong by Xenoage.
the class ChordReader method addChordNote.
/**
* Reads the given note element, which is part of
* a chord (but not the first note element of the chord), and adds it to the given chord.
* Also the notations of this note are read.
*/
private static void addChordNote(Context context, MxlNote mxlNote, Chord chord, int staffIndexInPart) {
// only pitch is interesting for us, since we do not allow
// different durations for notes within a chord or other strange stuff
MxlFullNoteContent mxlFNC = mxlNote.getContent().getFullNote().getContent();
if (mxlFNC.getFullNoteContentType() == MxlFullNoteContentType.Pitch) {
Pitch pitch = ((MxlPitch) mxlFNC).getPitch();
Note note = new Note(pitch);
chord.addNote(note);
// notations
if (mxlNote.getNotations() != null) {
new NotationsReader(mxlNote.getNotations()).readToNote(chord, chord.getNotes().indexOf(note), staffIndexInPart, context);
}
}
}
use of com.xenoage.zong.musicxml.types.MxlNote in project Zong by Xenoage.
the class LyricReader method readLyrics.
private List<Lyric> readLyrics() {
// not supported yet: in MusicXML also rests can have lyrics. see measure 36 in Echigo-Jishi
List<Lyric> ret = alist();
for (MxlNote mxlNote : mxlNotes) {
for (MxlLyric mxlLyric : it(mxlNote.getLyrics())) {
int verse = readVerse(mxlLyric);
MxlLyricContentType mxlLCType = mxlLyric.getContent().getLyricContentType();
if (mxlLCType == MxlLyricContentType.SyllabicText) {
MxlSyllabicText mxlSyllabicText = (MxlSyllabicText) mxlLyric.getContent();
SyllableType syllableType = readSyllableType(mxlLyric);
// the next element must be the text element
ret.add(new Lyric(Companion.ut(mxlSyllabicText.getText().getValue()), syllableType, verse));
} else if (mxlLCType == MxlLyricContentType.Extend) {
// extend - TODO: extension to next chord!
ret.add(Lyric.Companion.lyricExtend(verse));
}
}
}
return ret;
}
use of com.xenoage.zong.musicxml.types.MxlNote in project Zong by Xenoage.
the class Test01c method test.
@Test
public void test() {
MxlMeasure measure = getFirstMeasure();
for (MxlMusicDataContent data : measure.getMusicData().getContent()) {
if (data.getMusicDataContentType() == MxlMusicDataContentType.Note) {
// check pitch
MxlNote note = (MxlNote) data;
MxlFullNote fullNote = note.getContent().getFullNote();
MxlPitch pitch = (MxlPitch) (fullNote.getContent());
assertEquals(Companion.pi('G', 0, 4), pitch.getPitch());
// check lyric
assertEquals(1, note.getLyrics().size());
assertEquals("A", ((MxlSyllabicText) note.getLyrics().get(0).getContent()).getText().getValue());
return;
}
}
fail("note not found");
}
Aggregations