package com.xenoage.zong.io.musicxml.in.readers;
import com.xenoage.zong.core.music.MeasureSide;
import com.xenoage.zong.core.music.barline.Barline;
import com.xenoage.zong.core.music.barline.BarlineStyle;
import com.xenoage.zong.core.music.volta.Volta;
import com.xenoage.zong.io.musicxml.Equivalents;
import com.xenoage.zong.musicxml.types.MxlBarline;
import com.xenoage.zong.musicxml.types.MxlEnding;
import com.xenoage.zong.musicxml.types.attributes.MxlRepeat;
import com.xenoage.zong.musicxml.types.enums.MxlBackwardForward;
import com.xenoage.zong.musicxml.types.enums.MxlRightLeftMiddle;
import lombok.RequiredArgsConstructor;
import static com.xenoage.utils.NullUtils.notNull;
import static com.xenoage.zong.core.music.MeasureSide.Left;
import static com.xenoage.zong.core.music.MeasureSide.Right;
import static com.xenoage.zong.core.music.barline.Barline.*;
/**
* Reads a {@link Barline}, including its {@link Volta},
* from a {@link MxlBarline}.
*
* @author Andreas Wenger
*/
@RequiredArgsConstructor
public class BarlineReader {
private final MxlBarline mxlBarline;
private Barline barline;
private MeasureSide side;
public void readToContext(Context context) {
read();
//write barline
if (barline != null)
context.writeColumnElement(barline, side);
//write volta
MxlEnding mxlEnding = mxlBarline.getEnding();
if (mxlEnding != null)
new VoltaReader(mxlEnding).readToContext(context);
}
private void read() {
MxlRightLeftMiddle location = mxlBarline.getLocation();
MxlRepeat repeat = mxlBarline.getRepeat();
BarlineStyle style = null;
if (mxlBarline.getBarStyle() != null)
style = Equivalents.barlineStyles.getBy2(mxlBarline.getBarStyle().getBarStyle());
if (repeat != null) {
//repeat barline
if (repeat.getDirection() == MxlBackwardForward.Forward) {
style = notNull(style, BarlineStyle.HeavyLight);
barline = barlineForwardRepeat(style);
}
else if (repeat.getDirection() == MxlBackwardForward.Backward) {
style = notNull(style, BarlineStyle.LightHeavy);
int times = notNull(repeat.getTimes(), 1);
barline = barlineBackwardRepeat(style, times);
}
}
else if (style != null) {
//regular barline
barline = barline(style);
}
if (barline != null) {
//side / beat
if (location == MxlRightLeftMiddle.Left)
side = Left;
else if (location == MxlRightLeftMiddle.Right)
side = Right;
}
}
}