package com.xenoage.zong.musicxml.types; import com.xenoage.utils.annotations.NonNull; import com.xenoage.utils.xml.XmlReader; import com.xenoage.utils.xml.XmlWriter; import com.xenoage.zong.musicxml.types.choice.MxlNotationsContent; import com.xenoage.zong.musicxml.util.IncompleteMusicXML; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; import java.util.List; import static com.xenoage.utils.collections.CollectionUtils.alist; /** * MusicXML notations. * * @author Andreas Wenger */ @IncompleteMusicXML(missing = "tuplet,glissando,slide,technical,arpeggiate," + "non-arpeggiate,other-notation", children = "slur,tied,articulations,dynamics,ornaments") @AllArgsConstructor @Getter @Setter public final class MxlNotations { public static final String elemName = "notations"; @NonNull private List<MxlNotationsContent> elements; public static MxlNotations read(XmlReader reader) { List<MxlNotationsContent> elements = alist(); while (reader.openNextChildElement()) { String childName = reader.getElementName(); MxlNotationsContent element = null; if (childName.equals(MxlAccidentalMark.elemName)) { element = MxlAccidentalMark.read(reader); } switch (childName) { case MxlArticulations.elemName: element = MxlArticulations.read(reader); break; case MxlDynamics.elemName: element = MxlDynamics.read(reader); break; case MxlFermata.elemName: element = MxlFermata.read(reader); break; case MxlOrnaments.elemName: element = MxlOrnaments.read(reader); break; case MxlSlurOrTied.elemNameSlur: case MxlSlurOrTied.elemNameTied: element = MxlSlurOrTied.read(reader); break; } reader.closeElement(); if (element != null) elements.add(element); } return new MxlNotations(elements); } public void write(XmlWriter writer) { writer.writeElementStart(elemName); for (MxlNotationsContent element : elements) element.write(writer); writer.writeElementEnd(); } }