package com.xenoage.zong.musicxml; import com.xenoage.zong.musicxml.util.error.handler.ErrorHandler; import com.xenoage.zong.musicxml.util.error.handler.TolerantErrorHandler; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; import com.xenoage.utils.xml.XmlException; import com.xenoage.utils.xml.XmlReader; import com.xenoage.utils.xml.XmlWriter; import com.xenoage.zong.musicxml.types.MxlScorePartwise; /** * MusicXML document. * * Only partwise scores are supported. * * @author Andreas Wenger */ @AllArgsConstructor @Getter @Setter public final class MusicXMLDocument { private MxlScorePartwise score; public static MusicXMLDocument read(XmlReader reader) throws XmlException { ErrorHandler errorHandler = new TolerantErrorHandler(); //try to fix errors in MusicXML files reader.openNextChildElement(); String n = reader.getElementName(); if (n.equals(MxlScorePartwise.elemName)) return new MusicXMLDocument(MxlScorePartwise.read(reader, errorHandler)); else if (n.equals("score-timewise")) throw new IllegalArgumentException("Timewise scores are not supported."); throw new IllegalArgumentException("Unknown root element: " + n); } public void write(XmlWriter writer) { writer.writeStartDocument(); writer.writeDTD("<!DOCTYPE score-partwise PUBLIC \"-//Recordare//DTD MusicXML 2.0 Partwise//EN\"" + " \"http://www.musicxml.org/dtds/partwise.dtd\">"); score.write(writer); } }