package com.xenoage.zong.musicxml.types; import com.xenoage.utils.annotations.MaybeNull; import com.xenoage.utils.annotations.NonNull; import com.xenoage.utils.xml.XmlReader; import com.xenoage.utils.xml.XmlWriter; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; import static com.xenoage.utils.Parser.parseInt; /** * MusicXML transpose. * * @author Andreas Wenger */ @AllArgsConstructor @Getter @Setter public final class MxlTranspose { public static final String elemName = "transpose"; @MaybeNull private Integer diatonic; private int chromatic; @MaybeNull private Integer octaveChange; private boolean doubleValue; @NonNull public static MxlTranspose read(XmlReader reader) { Integer diatonic = null; Integer chromatic = null; Integer octaveChange= null; boolean doubleValue = false; while (reader.openNextChildElement()) { String eName = reader.getElementName(); switch (eName) { case "diatonic": diatonic = parseInt(reader.getText()); break; case "chromatic": chromatic = parseInt(reader.getText()); break; case "octave-change": octaveChange = parseInt(reader.getText()); break; case "double": doubleValue = true; break; } reader.closeElement(); } if (chromatic == null) throw reader.dataException("chromatic not found"); return new MxlTranspose(diatonic, chromatic, octaveChange, doubleValue); } public void write(XmlWriter writer) { writer.writeElementStart(elemName); writer.writeElementText("diatonic", diatonic); writer.writeElementText("chromatic", chromatic); writer.writeElementText("octave-change", octaveChange); if (doubleValue) writer.writeElementEmpty("double"); writer.writeElementEnd(); } }