package com.xenoage.zong.musiclayout.stamper;
import com.xenoage.zong.core.music.clef.ClefType;
import com.xenoage.zong.core.music.format.SP;
import com.xenoage.zong.core.music.time.TimeType;
import com.xenoage.zong.core.music.util.DurationInfo;
import com.xenoage.zong.musiclayout.notation.ClefNotation;
import com.xenoage.zong.musiclayout.notation.TimeNotation;
import com.xenoage.zong.musiclayout.notation.TraditionalKeyNotation;
import com.xenoage.zong.musiclayout.settings.Spacings;
import com.xenoage.zong.musiclayout.spacing.RestSpacing;
import com.xenoage.zong.musiclayout.stampings.KeySignatureStamping;
import com.xenoage.zong.musiclayout.stampings.TimeStamping;
import com.xenoage.zong.musiclayout.stampings.StaffSymbolStamping;
import com.xenoage.zong.musiclayout.stampings.Stamping;
import com.xenoage.zong.symbols.Symbol;
import com.xenoage.zong.symbols.SymbolPool;
import com.xenoage.zong.symbols.common.CommonSymbol;
import lombok.val;
import java.util.HashMap;
import static com.xenoage.zong.core.music.format.SP.sp;
/**
* Creates the {@link Stamping}s for elements like rests,
* clefs, keys and time signatures.
*
* @author Andreas Wenger
*/
public class ElementStamper {
public static final ElementStamper elementStamper = new ElementStamper();
/**
* Creates a stamping for the given rest.
*/
public StaffSymbolStamping createRestStamping(RestSpacing rest, float xMm,
StamperContext context) {
val staff = context.getCurrentStaffStamping();
Symbol symbol = getRestSymbol(rest.getNotation().duration, context);
SP sp = sp(xMm, rest.lp);
return new StaffSymbolStamping(rest.notation, staff, symbol, null, sp, 1, false);
}
/**
* Creates a stamping for the given clef.
*/
public StaffSymbolStamping createClefStamping(ClefNotation clef, float xMm,
StamperContext context) {
val staff = context.getCurrentStaffStamping();
ClefType clefType = clef.element.getType();
return new StaffSymbolStamping(clef, staff,
context.getSymbol(CommonSymbol.getClef(clefType.getSymbol())), null,
sp(xMm, clefType.getLp()), clef.scaling, false);
}
/**
* Creates a stamping for the given key signature.
*/
public KeySignatureStamping createKeyStamping(TraditionalKeyNotation key, float xMm,
StamperContext context) {
val staff = context.getCurrentStaffStamping();
boolean useSharps = key.element.getFifths() > 0;
Symbol symbol = context.getSymbol(useSharps ? CommonSymbol.AccidentalSharp
: CommonSymbol.AccidentalFlat);
Spacings spacings = context.getSettings().spacings;
float distance = (useSharps ? spacings.widthSharp : spacings.widthFlat);
return new KeySignatureStamping(key, xMm, staff, symbol, distance);
}
/**
* Creates a stamping for the given time signature.
*/
public Stamping createTimeStamping(TimeNotation time, float xMm, StamperContext context) {
val staff = context.getCurrentStaffStamping();
if (time.element.getType() == TimeType.timeCommon) {
return new StaffSymbolStamping(time, staff, context.getSymbol(CommonSymbol.TimeCommon),
null, sp(xMm, staff.linesCount - 1), 1f, false);
}
else {
return new TimeStamping(time, xMm, time.numeratorOffset,
time.denominatorOffset, time.digitGap, staff);
}
}
private static HashMap<DurationInfo.Type, CommonSymbol> durationSymbolMapping = new HashMap<>();
static {
durationSymbolMapping.put(DurationInfo.Type.Whole, CommonSymbol.RestWhole);
durationSymbolMapping.put(DurationInfo.Type.Half, CommonSymbol.RestHalf);
durationSymbolMapping.put(DurationInfo.Type.Quarter, CommonSymbol.RestQuarter);
durationSymbolMapping.put(DurationInfo.Type.Eighth, CommonSymbol.RestEighth);
durationSymbolMapping.put(DurationInfo.Type._16th, CommonSymbol.Rest16th);
durationSymbolMapping.put(DurationInfo.Type._32th, CommonSymbol.Rest32th);
durationSymbolMapping.put(DurationInfo.Type._64th, CommonSymbol.Rest64th);
durationSymbolMapping.put(DurationInfo.Type._128th, CommonSymbol.Rest128th);
durationSymbolMapping.put(DurationInfo.Type._256th, CommonSymbol.Rest256th);
}
private Symbol getRestSymbol(DurationInfo.Type duration, StamperContext context) {
CommonSymbol cs = durationSymbolMapping.get(duration);
SymbolPool symbols = context.layouter.symbols;
if (cs != null)
return symbols.getSymbol(cs);
else
return symbols.getWarningSymbol();
}
}