package com.xenoage.zong.musiclayout.spacer.beam; import com.xenoage.zong.core.Score; import com.xenoage.zong.musiclayout.notation.BeamNotation; import com.xenoage.zong.musiclayout.spacing.BeamSpacing; import com.xenoage.zong.musiclayout.spacing.ChordSpacing; import com.xenoage.zong.musiclayout.spacing.SystemSpacing; import lombok.val; import java.util.List; import static com.xenoage.utils.collections.CollectionUtils.alist; import static com.xenoage.zong.core.music.beam.Beam.VerticalSpan.CrossStaff; import static com.xenoage.zong.musiclayout.spacer.beam.SingleStaffBeamSpacer.singleStaffBeamSpacer; import static com.xenoage.zong.musiclayout.spacer.beam.TwoStavesBeamSpacer.twoStavesBeamSpacer; /** * Creates the {@link BeamSpacing} for a beam. * * TODO: ZONG-108: Beams spanning over multiple measures * * @author Andreas Wenger */ public class BeamSpacer { public static BeamSpacer beamSpacer = new BeamSpacer(); public BeamSpacing compute(BeamNotation beam, SystemSpacing systemSpacing, Score score) { BeamSpacer beamSpacer; if (beam.element.getVerticalSpan() == CrossStaff) { //beam spanning over two staves return twoStavesBeamSpacer.compute(beam, systemSpacing); } else { //beam within a single measure, or an even more complicated beam, for which //we have no special strategy int staff = beam.getMp().staff; int staffLinesCount = score.getStaff(staff).getLinesCount(); return singleStaffBeamSpacer.compute(beam, systemSpacing, staffLinesCount); } } List<ChordSpacing> getBeamChordSpacings(BeamNotation beam, SystemSpacing systemSpacing) { val column = systemSpacing.getColumn(beam.mp.measure); List<ChordSpacing> chords = alist(beam.element.size()); for (val chord : beam.chords) chords.add((ChordSpacing) column.getElement(chord)); return chords; } }