package com.xenoage.zong.io.midi.out.dynamics;
import com.xenoage.zong.core.music.direction.DynamicValue;
import static com.xenoage.zong.core.music.direction.DynamicValue.*;
/**
* Map {@link DynamicValue} to concrete volume values.
*
* These values are currently predefined. Later, we could load them
* from used-defined settings.
*
* @author Andreas Wenger
*/
public class DynamicsInterpretation {
/**
* Gets the concrete loudness of the given {@link DynamicValue}
* at its beginning. This is a value between 0 (silence) and 1 (maximum loudness).
*/
public float getVolume(DynamicValue dynamics) {
switch (dynamics) {
case pppppp: return 0.02f;
case ppppp: return 0.04f;
case pppp: return 0.06f;
case ppp: return 0.8f;
case pp: return 0.1f;
case p: return 0.3f;
case mp: return 0.45f;
case mf: return 0.55f;
case f: return 0.7f;
case ff: return 0.9f;
case fff: return 0.92f;
case ffff: return 0.94f;
case fffff: return 0.96f;
case ffffff: return 0.98f;
//the other values imply dynamic changes within the note,
//we return their start volume
case sffz: return getVolume(ff);
case sf: case sfp: case sfpp: case fp: case rf: case rfz: case sfz: return getVolume(f);
}
throw new IllegalArgumentException(""+dynamics);
}
}