use of com.xenoage.zong.core.music.slur.SlurWaypoint in project Zong by Xenoage.
the class SlurReader method readToContext.
public static void readToContext(Chord chord, int noteIndex, int staffIndexInPart, Context context, MxlSlurOrTied mxlSlur) {
Pitch pitch = chord.getNotes().get(noteIndex).getPitch();
float noteLP = context.getMusicContext(staffIndexInPart).getLp(pitch);
// type
SlurType type = (mxlSlur.getElementType() == MxlElementType.Slur ? SlurType.Slur : SlurType.Tie);
// number (tied does usually not use a number, but is distinguished by pitch)
Integer number = mxlSlur.getNumber();
BezierPoint bezierPoint = readBezierPoint(mxlSlur.getPosition(), mxlSlur.getBezier(), context.getTenthMm(), context.getStaffLinesCount(staffIndexInPart), noteLP, chord.getDuration());
VSide side = readVSide(mxlSlur.getPlacement());
// waypoint
SlurWaypoint wp = new SlurWaypoint(chord, noteIndex, bezierPoint);
if (type == SlurType.Tie && number == null) {
// unnumbered tied
OpenUnnumberedTieds openTieds = context.getOpenElements().getOpenUnnumberedTies();
if (mxlSlur.getType() == MxlStartStopContinue.Start) {
openTieds.startTied(wp, side);
} else if (mxlSlur.getType() == MxlStartStopContinue.Stop) {
OpenSlur openTied = openTieds.stopTied(wp, side, context);
if (openTied != null)
context.createSlur(openTied);
}
} else {
// numbered
WaypointPosition wpPos;
if (mxlSlur.getType() == MxlStartStopContinue.Start)
wpPos = WaypointPosition.Start;
else if (mxlSlur.getType() == MxlStartStopContinue.Stop)
wpPos = WaypointPosition.Stop;
else
wpPos = WaypointPosition.Continue;
context.registerSlur(type, wpPos, number, wp, side);
}
}
use of com.xenoage.zong.core.music.slur.SlurWaypoint in project Zong by Xenoage.
the class SlurStamper method createStartForFirstSystem.
/**
* Creates a {@link SlurStamping} for a curved line that
* starts at this system but spans at least one other system.
*/
SlurStamping createStartForFirstSystem(StaffStamping staff, SP defaultSp, Slur slur) {
SlurWaypoint wp1 = slur.getStart();
// end points of the bezier curve
SP p1 = computeEndPoint(slur, defaultSp, wp1.getBezierPoint());
SP p2 = sp(staff.positionMm.x + staff.lengthMm, p1.lp);
// control points of the bezier curve
BezierPoint b1 = wp1.getBezierPoint();
SP c1 = (// custom formatting
b1 != null && b1.getControl() != null ? // custom formatting
b1.getControl() : // default formatting
computeLeftControlPoint(slur, p1, p2, staff));
// default formatting
SP c2 = computeRightControlPoint(slur, p1, p2, staff);
return new SlurStamping(slur, p1, p2, c1, c2, staff, staff);
}
use of com.xenoage.zong.core.music.slur.SlurWaypoint in project Zong by Xenoage.
the class Test33b method test.
@Test
public void test() {
Score score = getScore();
Chord chord1 = (Chord) score.getVoice(atVoice(0, 0, 0)).getElement(0);
Chord chord2 = (Chord) score.getVoice(atVoice(0, 1, 0)).getElement(0);
assertEquals(1, chord1.getSlurs().size());
Slur tie = chord1.getSlurs().get(0);
assertEquals(SlurType.Tie, tie.getType());
List<SlurWaypoint> waypoints = tie.getWaypoints();
assertEquals(2, waypoints.size());
assertEquals(chord1, waypoints.get(0).getChord());
assertEquals(chord2, waypoints.get(1).getChord());
}
use of com.xenoage.zong.core.music.slur.SlurWaypoint in project Zong by Xenoage.
the class ChordStamper method stampAll.
/**
* Returns all the stampings for the given {@link Chord}, including beams,
* tuplets, slurs and other attachments.
*
* The given {@link OpenSlursCache},
* {@link OpenLyricsCache}, {@link LastLyrics} and {@link OpenTupletsCache} may be modified.
*/
public List<Stamping> stampAll(ChordNotation chord, float xMm, BeamSpacing beam, StaffStampings staffStampings, StamperContext context, FormattedTextStyle defaultLyricStyle, OpenSlursCache openSlursCache, OpenLyricsCache openLyricsCache, LastLyrics lastLyrics, OpenTupletsCache openTupletsCache) {
List<Stamping> ret = alist();
Chord element = chord.getElement();
int staffIndex = context.staffIndex;
int systemIndex = context.systemIndex;
// noteheads, leger lines, dots, accidentals, stem, flags, articulations
ChordStampings chordSt = stampCore(chord, xMm, context);
chordSt.addAllTo(ret);
// beam
if (beam != null) {
// stamp the whole beam (when we find the beginning of the beam)
// TIDY: create/store beam stampings elsewhere?
Beam beamElement = beam.notation.element;
int chordIndex = beamElement.getWaypointIndex(element);
if (chordIndex == 0) {
ret.addAll(beamStamper.stamp(beam, context.getCurrentStaffStamping()));
}
}
// ties and slurs
for (Slur slur : element.getSlurs()) {
SlurWaypoint wp = slur.getWaypoint(element);
WaypointPosition pos = slur.getWaypointPosition(element);
// TODO: choose top/bottom
int noteIndex = notNull(wp.getNoteIndex(), 0);
NoteheadStamping notehead = chordSt.noteheads[noteIndex];
// define the placement: above or below (TODO: better strategy)
VSide side = slurStamper.getSide(slur);
// compute position
val staff = staffStampings.get(systemIndex, notehead.parentStaff.staffIndex);
val slurCache = openSlursCache.getOrCreate(slur);
float distanceIs = slurStamper.getAdditionalDistanceIs(chord, slur.getSide());
SP defaultSp = sp(notehead.position.xMm, notehead.position.lp + side.getDir() * distanceIs * 2);
if (pos == WaypointPosition.Start)
slurCache.setStart(defaultSp, staff, systemIndex);
else
slurCache.setStop(defaultSp, staff, systemIndex);
}
// lyric
List<Lyric> lyrics = element.getLyrics();
if (lyrics.size() > 0) {
float baseLine = -10;
for (Lyric lyric : lyrics) {
if (lyric != null) {
SyllableType lyricType = lyric.getSyllableType();
StaffTextStamping lastLyric = lastLyrics.get(staffIndex, lyric.getVerse());
if (lyricType == SyllableType.Extend) {
// extend
if (// TODO: frame breaks...
lastLyric != null) {
// remember it
openLyricsCache.setUnderscore((Lyric) lastLyric.getElement(), lastLyric, chordSt.noteheads[0], /* TODO*/
staffIndex);
}
} else {
// normal lyric
// create text stamping
StaffTextStamping sts = lyricStamper.createSyllableStamping(lyric, defaultLyricStyle, context.getCurrentStaffStamping(), chordSt.noteheads[0].position.xMm, baseLine);
ret.add(sts);
// when middle or end syllable, add a hypen between the preceding syllable and this syllable
if (// TODO: frame breaks...
lastLyric != null) {
if (lyricType == SyllableType.Middle || lyricType == SyllableType.End) {
StaffTextStamping hyphenStamping = lyricStamper.createHyphenStamping(lastLyric, sts, defaultLyricStyle);
ret.add(hyphenStamping);
}
}
// remember this lyric as the currently last one in the current staff and verse
lastLyrics.set(staffIndex, lyric.getVerse(), sts);
}
}
baseLine += -5;
}
}
// directions
ret.addAll(directionStamper.stampForChord(chordSt, context.layouter.symbols));
// tuplet
Tuplet tuplet = element.getTuplet();
if (tuplet != null) {
openTupletsCache.addChord(element, tuplet, chordSt);
}
return ret;
}
use of com.xenoage.zong.core.music.slur.SlurWaypoint 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);
}
Aggregations