package com.xenoage.zong.io.midi.out.dynamics; import com.xenoage.utils.annotations.Const; import com.xenoage.zong.core.music.direction.DynamicValue; import com.xenoage.zong.core.position.MP; import com.xenoage.zong.io.midi.out.score.MeasureBeats; import com.xenoage.zong.io.midi.out.score.PartStaves; import lombok.Data; import lombok.val; /** * Provides the dynamics for each ({@link MP}) in the score. * * @author Andreas Wenger */ @Const @Data public class Dynamics { public static final DynamicValue defaultDynamics = DynamicValue.mf; //dynamics in the score and their interpretations private final DynamicsPeriods periods; private final DynamicsInterpretation interpretation; //additional information on the score private final MeasureBeats measureBeats; private final PartStaves partStaves; /** * Gets the volume (0 = silent, 1 = full) at the given {@link MP} and repetition, * or the volume of {@link #defaultDynamics}, if undefined. */ public float getVolumeAt(MP mp, int repetition) { int part = partStaves.getPartByStaff(mp.staff); val staves = partStaves.getStaves(part); val period = periods.get(mp, repetition, staves); if (period != null) return period.getVolumeAt(mp.getTime(), interpretation, measureBeats); else return interpretation.getVolume(defaultDynamics); } }