Search in sources :

Example 1 with SlurWaypoint

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);
    }
}
Also used : BezierPoint(com.xenoage.zong.core.music.format.BezierPoint) OtherReader.readBezierPoint(com.xenoage.zong.io.musicxml.in.readers.OtherReader.readBezierPoint) WaypointPosition(com.xenoage.zong.core.music.WaypointPosition) OpenSlur(com.xenoage.zong.io.musicxml.in.util.OpenSlur) Pitch(com.xenoage.zong.core.music.Pitch) SlurType(com.xenoage.zong.core.music.slur.SlurType) OtherReader.readVSide(com.xenoage.zong.io.musicxml.in.readers.OtherReader.readVSide) VSide(com.xenoage.utils.math.VSide) SlurWaypoint(com.xenoage.zong.core.music.slur.SlurWaypoint) OpenUnnumberedTieds(com.xenoage.zong.io.musicxml.in.util.OpenUnnumberedTieds)

Example 2 with SlurWaypoint

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);
}
Also used : BezierPoint(com.xenoage.zong.core.music.format.BezierPoint) SlurStamping(com.xenoage.zong.musiclayout.stampings.SlurStamping) SP(com.xenoage.zong.core.music.format.SP) SlurWaypoint(com.xenoage.zong.core.music.slur.SlurWaypoint)

Example 3 with SlurWaypoint

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());
}
Also used : Slur(com.xenoage.zong.core.music.slur.Slur) Score(com.xenoage.zong.core.Score) Chord(com.xenoage.zong.core.music.chord.Chord) SlurWaypoint(com.xenoage.zong.core.music.slur.SlurWaypoint) Test(org.junit.Test)

Example 4 with SlurWaypoint

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;
}
Also used : lombok.val(lombok.val) WaypointPosition(com.xenoage.zong.core.music.WaypointPosition) SlurWaypoint(com.xenoage.zong.core.music.slur.SlurWaypoint) SlurWaypoint(com.xenoage.zong.core.music.slur.SlurWaypoint) VSide(com.xenoage.utils.math.VSide) Beam(com.xenoage.zong.core.music.beam.Beam) Tuplet(com.xenoage.zong.core.music.tuplet.Tuplet) Slur(com.xenoage.zong.core.music.slur.Slur) Lyric(com.xenoage.zong.core.music.lyric.Lyric) SyllableType(com.xenoage.zong.core.music.lyric.SyllableType) Chord(com.xenoage.zong.core.music.chord.Chord) ChordStampings(com.xenoage.zong.musiclayout.layouter.scoreframelayout.util.ChordStampings) SP(com.xenoage.zong.core.music.format.SP)

Example 5 with SlurWaypoint

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);
}
Also used : BezierPoint(com.xenoage.zong.core.music.format.BezierPoint) SlurStamping(com.xenoage.zong.musiclayout.stampings.SlurStamping) SP(com.xenoage.zong.core.music.format.SP) SlurWaypoint(com.xenoage.zong.core.music.slur.SlurWaypoint)

Aggregations

SlurWaypoint (com.xenoage.zong.core.music.slur.SlurWaypoint)7 BezierPoint (com.xenoage.zong.core.music.format.BezierPoint)4 SP (com.xenoage.zong.core.music.format.SP)4 Slur (com.xenoage.zong.core.music.slur.Slur)4 VSide (com.xenoage.utils.math.VSide)3 SlurStamping (com.xenoage.zong.musiclayout.stampings.SlurStamping)3 WaypointPosition (com.xenoage.zong.core.music.WaypointPosition)2 Chord (com.xenoage.zong.core.music.chord.Chord)2 Score (com.xenoage.zong.core.Score)1 Pitch (com.xenoage.zong.core.music.Pitch)1 Beam (com.xenoage.zong.core.music.beam.Beam)1 Lyric (com.xenoage.zong.core.music.lyric.Lyric)1 SyllableType (com.xenoage.zong.core.music.lyric.SyllableType)1 SlurType (com.xenoage.zong.core.music.slur.SlurType)1 Tuplet (com.xenoage.zong.core.music.tuplet.Tuplet)1 OtherReader.readBezierPoint (com.xenoage.zong.io.musicxml.in.readers.OtherReader.readBezierPoint)1 OtherReader.readVSide (com.xenoage.zong.io.musicxml.in.readers.OtherReader.readVSide)1 OpenSlur (com.xenoage.zong.io.musicxml.in.util.OpenSlur)1 OpenUnnumberedTieds (com.xenoage.zong.io.musicxml.in.util.OpenUnnumberedTieds)1 ContinuedSlur (com.xenoage.zong.musiclayout.continued.ContinuedSlur)1