use of com.xenoage.zong.core.music.format.SP in project Zong by Xenoage.
the class SlurStamper method createStopForLastSystem.
/**
* Creates a {@link SlurStamping} for a last part of a slur or tie
* that spans at least two systems.
*/
SlurStamping createStopForLastSystem(StaffStamping staff, SP defaultSp, Slur slur) {
SlurWaypoint wp2 = slur.getStop();
// end points of the bezier curve
SP p2 = computeEndPoint(slur, defaultSp, wp2.getBezierPoint());
SP p1 = sp(staff.positionMm.x + staff.system.getMeasureStartAfterLeadingMm(staff.system.getStartMeasure()) - 5, // TODO
p2.lp);
// control points of the bezier curve
BezierPoint b2 = wp2.getBezierPoint();
// default formatting
SP c1 = computeLeftControlPoint(slur, p1, p2, staff);
SP c2 = (// custom formatting
b2 != null && b2.getControl() != null ? // custom formatting
b2.getControl() : // default formatting
computeRightControlPoint(slur, p1, p2, staff));
return new SlurStamping(slur, p1, p2, c1, c2, staff, staff);
}
use of com.xenoage.zong.core.music.format.SP in project Zong by Xenoage.
the class SlurStamper method createForSingleSystem.
/**
* Creates a {@link SlurStamping} for a curved line that
* uses only a single system. The slur may span over multiple staves.
*/
SlurStamping createForSingleSystem(SlurCache slurCache) {
Slur slur = slurCache.getSlur();
SlurWaypoint wp1 = slur.getStart();
SlurWaypoint wp2 = slur.getStop();
// end points of the bezier curve
VSide side = slurCache.getSide();
SP p1 = computeEndPoint(slur, slurCache.getDefaultStartSp(), wp1.getBezierPoint());
SP p2 = computeEndPoint(slur, slurCache.getDefaultStopSp(), wp2.getBezierPoint());
// control points of the bezier curve
BezierPoint b1 = wp1.getBezierPoint();
BezierPoint b2 = wp2.getBezierPoint();
SP c1 = (// custom formatting
b1 != null && b1.getControl() != null ? // custom formatting
b1.getControl() : // default formatting
computeLeftControlPoint(slur, p1, p2, slurCache.getStartStaff()));
SP c2 = (// custom formatting
b2 != null && b2.getControl() != null ? // custom formatting
b2.getControl() : // default formatting
computeRightControlPoint(slur, p1, p2, slurCache.getStopStaff()));
return new SlurStamping(slur, p1, p2, c1, c2, slurCache.getStartStaff(), slurCache.getStopStaff());
}
use of com.xenoage.zong.core.music.format.SP in project Zong by Xenoage.
the class OtherReader method readBezierPoint.
@MaybeNull
public static BezierPoint readBezierPoint(MxlPosition mxlPosition, MxlBezier mxlBezier, float tenthsMm, int staffLinesCount, float noteLP, Fraction chordDuration) {
Float px = mxlPosition.getDefaultX();
Float py = mxlPosition.getDefaultY();
Float cx = (mxlBezier != null ? mxlBezier.getBezierX() : null);
Float cy = (mxlBezier != null ? mxlBezier.getBezierY() : null);
SP point = null;
SP control = null;
float halfNoteWidth = getNoteheadWidth(chordDuration) / 2;
if (px != null && py != null) {
float fpx = notNull(px, 0).floatValue();
float fpy = notNull(py, 0).floatValue();
// default-x is relative to left side of note. thus, substract the half width
// of a note (TODO: note type. e.g., whole note is wider)
point = sp((fpx / 10 - halfNoteWidth) * tenthsMm, (staffLinesCount - 1) * 2 + fpy / 10 * 2 - noteLP);
}
if (cx != null && cy != null) {
float fcx = notNull(cx, 0).floatValue();
float fcy = notNull(cy, 0).floatValue();
control = sp((fcx / 10 - halfNoteWidth) * tenthsMm, fcy / 10 * 2);
}
if (point != null || control != null)
return new BezierPoint(point, control);
else
return null;
}
Aggregations