package com.xenoage.zong.musiclayout.notator.chord.stem.beam; import static com.xenoage.utils.collections.ArrayUtils.setValues; import static com.xenoage.zong.core.music.beam.Beam.VerticalSpan.SingleStaff; import static com.xenoage.zong.musiclayout.notator.chord.stem.beam.range.OneMeasureOneStaff.oneMeasureOneStaff; import static com.xenoage.zong.musiclayout.notator.chord.stem.beam.range.OneMeasureTwoStaves.oneMeasureTwoStaves; import com.xenoage.zong.core.Score; import com.xenoage.zong.core.music.beam.Beam; import com.xenoage.zong.core.music.beam.Beam.VerticalSpan; import com.xenoage.zong.core.music.chord.StemDirection; import com.xenoage.zong.musiclayout.notator.chord.stem.beam.range.Strategy; /** * Computes the {@link StemDirection} of beamed chords. * * @author Andreas Wenger */ public class BeamedStemDirector { public static final BeamedStemDirector beamedStemDirector = new BeamedStemDirector(); public StemDirection[] compute(Beam beam, Score score) { //choose appropriate strategy Strategy strategy; if (beam.getVerticalSpan() == SingleStaff) strategy = oneMeasureOneStaff; else if (beam.getVerticalSpan() == VerticalSpan.CrossStaff) strategy = oneMeasureTwoStaves; else //no strategy for more than two or non-adjacent staves return fallback(beam.size()); return strategy.compute(beam, score); } /** * Fallback for unsupported beams: All stems up. */ private StemDirection[] fallback(int stemsCount) { StemDirection[] ret = new StemDirection[stemsCount]; setValues(ret, StemDirection.Up); return ret; } }