package com.xenoage.zong.io.midi.out.repetitions; import com.xenoage.utils.annotations.MaybeNull; import com.xenoage.utils.collections.IList; import com.xenoage.zong.core.music.volta.Volta; import com.xenoage.zong.io.midi.out.repetitions.VoltaGroup.VoltaStartMeasure; import lombok.AllArgsConstructor; import lombok.val; /** * The {@link VoltaGroup}s in a score. */ @AllArgsConstructor public class VoltaGroups { final IList<VoltaGroup> voltaGroups; /** * Gets information about the volta group over the given measure. */ @MaybeNull public VoltaGroupState getStateAt(int measure) { val group = getVoltaGroupAt(measure); val volta = getVoltaAt(measure); if (volta == null) return null; return new VoltaGroupState(group, volta.volta, volta.startMeasure, volta.startMeasure + volta.volta.getLength() - 1); } /** * Gets the {@link Volta} and its start measure over the given measure. */ @MaybeNull public VoltaStartMeasure getVoltaAt(int measure) { val group = getVoltaGroupAt(measure); if (group == null) return null; VoltaStartMeasure volta = null; for (val v : group.voltasStartMeasures) { volta = v; if (measure < v.startMeasure + v.volta.getLength()) break; } return volta; } /** * Gets the {@link VoltaGroup} over the given measure. */ @MaybeNull public VoltaGroup getVoltaGroupAt(int measure) { for (val group : voltaGroups) if (group.startMeasure <= measure && measure <= group.endMeasure) return group; return null; } /** * Gets the {@link VoltaGroup} starting at the given measure. */ @MaybeNull public VoltaGroup getVoltaGroupStartingAt(int measure) { for (val group : voltaGroups) if (group.startMeasure == measure) return group; return null; } }