Skip to content

Commit

Permalink
Deprecation of fermata-arc and fermata-dot in favor of a full fermata…
Browse files Browse the repository at this point in the history
… recognition
  • Loading branch information
hbitteur committed Jan 31, 2024
1 parent 9096b04 commit ad05a3d
Show file tree
Hide file tree
Showing 17 changed files with 191 additions and 588 deletions.
4 changes: 0 additions & 4 deletions src/main/org/audiveris/omr/classifier/AnnotationsBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,6 @@
import org.audiveris.omr.sig.inter.BracketConnectorInter;
import org.audiveris.omr.sig.inter.BracketInter;
import org.audiveris.omr.sig.inter.EndingInter;
import org.audiveris.omr.sig.inter.FermataArcInter;
import org.audiveris.omr.sig.inter.FermataDotInter;
import org.audiveris.omr.sig.inter.HeadChordInter;
import org.audiveris.omr.sig.inter.HeadInter;
import org.audiveris.omr.sig.inter.Inter;
Expand Down Expand Up @@ -108,8 +106,6 @@ public class AnnotationsBuilder
excludedInterClasses.add(BracketConnectorInter.class);
excludedInterClasses.add(BracketInter.class); // TODO: should be defined in OmrShape?
excludedInterClasses.add(EndingInter.class);
excludedInterClasses.add(FermataArcInter.class);
excludedInterClasses.add(FermataDotInter.class);
excludedInterClasses.add(KeyInter.class);
excludedInterClasses.add(RepeatDotInter.class); // Processed via BarlineInter
excludedInterClasses.add(SegmentInter.class);
Expand Down
17 changes: 6 additions & 11 deletions src/main/org/audiveris/omr/glyph/Shape.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@
* <li>an augmentation dot (first or second dot),
* <li>a part of a repeat sign (upper or lower dot),
* <li>a staccato sign,
* <li>a part of fermata sign,
* <li>a dot of an ending indication,
* <li>a simple text dot.
* </ul>
Expand Down Expand Up @@ -102,8 +101,8 @@ public enum Shape
CODA("Closing section"),
BREATH_MARK("Breath Mark"),
CAESURA("Caesura"),
FERMATA_ARC("Fermata arc, without dot"),
FERMATA_ARC_BELOW("Fermata arc below, without dot"),
FERMATA("Fermata arc + dot"),
FERMATA_BELOW("Fermata below, arc + dot"),
REPEAT_ONE_BAR("Repeat last bar"),
REPEAT_TWO_BARS("Repeat last two bars"),
REPEAT_FOUR_BARS("Repeat last four bars"),
Expand Down Expand Up @@ -336,7 +335,6 @@ public enum Shape
//
REPEAT_DOT("Repeat dot", DOT_set),
AUGMENTATION_DOT("Augmentation Dot", DOT_set),
FERMATA_DOT("Fermata Dot", DOT_set),
STACCATO("Staccato dot", DOT_set),

//
Expand Down Expand Up @@ -469,12 +467,6 @@ public enum Shape
STEM("Stem"),
VERTICAL_SERIF("Vertical serif"),

//
// Full fermatas ---
//
FERMATA("Fermata with dot"),
FERMATA_BELOW("Fermata below with dot"),

//
// Other stuff ---
//
Expand All @@ -495,7 +487,10 @@ public enum Shape
FLAG_2_UP("OBSOLETE Double flag up"),
FLAG_3_UP("OBSOLETE Triple flag up"),
FLAG_4_UP("OBSOLETE Quadruple flag up"),
FLAG_5_UP("OBSOLETE Quintuple flag up");
FLAG_5_UP("OBSOLETE Quintuple flag up"),
FERMATA_DOT("Fermata dot"),
FERMATA_ARC("Fermata arc, without dot"),
FERMATA_ARC_BELOW("Fermata arc below, without dot");

// =============================================================================================
// This is the end of shape enumeration
Expand Down
60 changes: 28 additions & 32 deletions src/main/org/audiveris/omr/sheet/SystemInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import org.audiveris.omr.sheet.rhythm.MeasureStack;
import org.audiveris.omr.sig.SIGraph;
import org.audiveris.omr.sig.SigListener;
import org.audiveris.omr.sig.inter.FermataInter;
import org.audiveris.omr.sig.inter.Inter;
import org.audiveris.omr.sig.inter.LyricLineInter;
import org.audiveris.omr.sig.inter.OctaveShiftInter;
Expand Down Expand Up @@ -325,50 +326,45 @@ public void afterReload ()

// Process staves upfront, so that their notes have their staff assigned.
// Doing so, measure chords can determine which staves they belong to.
for (Staff staff : staves) {
staff.afterReload();
}
staves.forEach(staff -> staff.afterReload());

{
// Support for OldStaffBarline
// (In part left PartBarline and in measures PartBarlines)
boolean upgraded = false;
parts.forEach(part -> part.afterReload());

for (Part part : parts) {
final PartBarline lpb = part.getLeftPartBarline();
stacks.forEach(stack -> stack.afterReload(this));

if (lpb != null) {
upgraded |= lpb.upgradeOldStuff();
}
sig.inters(SentenceInter.class).forEach(inter -> {
((SentenceInter) inter).assignStaff(this, ((SentenceInter) inter).getLocation());
});

for (Measure measure : part.getMeasures()) {
for (PartBarline pb : measure.getContainedPartBarlines()) {
upgraded |= pb.upgradeOldStuff();
}
}
}
sig.inters(OctaveShiftInter.class).forEach(
inter -> ((OctaveShiftInter) inter).afterReload(this));

if (upgraded) {
sheet.getStub().setUpgraded(true);
}
}
boolean upgraded = false;

// Support for OldStaffBarline
// (In part left PartBarline and in measures PartBarlines)
for (Part part : parts) {
part.afterReload();
}
final PartBarline lpb = part.getLeftPartBarline();

if (lpb != null) {
upgraded |= lpb.upgradeOldStuff();
}

for (MeasureStack stack : stacks) {
stack.afterReload(this);
for (Measure measure : part.getMeasures()) {
for (PartBarline pb : measure.getContainedPartBarlines()) {
upgraded |= pb.upgradeOldStuff();
}
}
}

for (Inter inter : sig.inters(SentenceInter.class)) {
SentenceInter sentence = (SentenceInter) inter;
sentence.assignStaff(this, sentence.getLocation());
// Support for old fermata arc and dot
for (Inter inter : sig.inters(FermataInter.class)) {
final FermataInter fermata = (FermataInter) inter;
upgraded |= fermata.upgradeOldStuff();
}

for (Inter inter : sig.inters(OctaveShiftInter.class)) {
OctaveShiftInter os = (OctaveShiftInter) inter;
os.afterReload(this);
if (upgraded) {
sheet.getStub().setUpgraded(true);
}

// Listen to sig modifications
Expand Down
92 changes: 42 additions & 50 deletions src/main/org/audiveris/omr/sheet/rhythm/Measure.java
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,7 @@ public class Measure
/**
* No-arg constructor meant for JAXB.
*/
@SuppressWarnings("unused")
private Measure ()
{
this.part = null;
Expand Down Expand Up @@ -384,38 +385,34 @@ public void addInter (Inter inter)
logger.info("VIP addInter {} into {}", inter, this);
}

if (inter instanceof ClefInter clefInter) {
final ClefInter clef = clefInter;
switch (inter) {
case ClefInter clefInter -> {
final ClefInter clef = clefInter;

if (!clefs.contains(clef)) {
clefs.add(clef);
if (!clefs.contains(clef)) {
clefs.add(clef);

if ((clefs.size() > 1) && (clef.getCenter() != null)) {
Collections.sort(clefs, Inters.byFullCenterAbscissa);
if ((clefs.size() > 1) && (clef.getCenter() != null)) {
Collections.sort(clefs, Inters.byFullCenterAbscissa);
}
}
}
} else if (inter instanceof KeyInter keyInter) {
keys.add(keyInter);
} else if (inter instanceof AbstractTimeInter abstractTimeInter) {
timeSigs.add(abstractTimeInter);
} else if (inter instanceof AbstractChordInter chord) {
chord.setMeasure(this);

if (chord instanceof HeadChordInter headChordInter) {
headChords.add(headChordInter);
} else if (chord instanceof RestChordInter restChordInter) {
restChords.add(restChordInter);
case KeyInter keyInter -> keys.add(keyInter);
case AbstractTimeInter abstractTimeInter -> timeSigs.add(abstractTimeInter);
case AbstractChordInter chord -> {
chord.setMeasure(this);

switch (chord) {
case HeadChordInter headChordInter -> headChords.add(headChordInter);
case RestChordInter restChordInter -> restChords.add(restChordInter);
default -> {}
}
}
} else if (inter instanceof FlagInter flagInter) {
flags.add(flagInter);
} else if (inter instanceof TupletInter tupletInter) {
tuplets.add(tupletInter);
} else if (inter instanceof AugmentationDotInter augmentationDotInter) {
augDots.add(augmentationDotInter);
} else if (inter instanceof MeasureRepeatInter measureRepeat) {
repeatSigns.add(measureRepeat);
} else {
logger.error("Attempt to use addInter() with {}", inter);
case FlagInter flagInter -> flags.add(flagInter);
case TupletInter tupletInter -> tuplets.add(tupletInter);
case AugmentationDotInter augmentationDotInter -> augDots.add(augmentationDotInter);
case MeasureRepeatInter measureRepeat -> repeatSigns.add(measureRepeat);
default -> logger.error("Attempt to use addInter() with {}", inter);
}
}

Expand Down Expand Up @@ -623,7 +620,7 @@ public List<Inter> filter (Collection<Inter> inters)
private Set<Inter> filterByStaff (Set<? extends Inter> inters,
Staff staff)
{
Set<Inter> found = new LinkedHashSet<>();
final Set<Inter> found = new LinkedHashSet<>();

for (Inter inter : inters) {
if (inter.getStaff() == staff) {
Expand Down Expand Up @@ -1809,28 +1806,23 @@ public void removeInter (Inter inter)
logger.info("VIP removeInter {} from {}", inter, this);
}

if (inter instanceof ClefInter clefInter) {
clefs.remove(clefInter);
} else if (inter instanceof KeyInter keyInter) {
keys.remove(keyInter);
} else if (inter instanceof AbstractTimeInter abstractTimeInter) {
timeSigs.remove(abstractTimeInter);
} else if (inter instanceof HeadChordInter headChordInter) {
headChords.remove(headChordInter);
removeVoiceChord(headChordInter);
} else if (inter instanceof RestChordInter restChordInter) {
restChords.remove(restChordInter);
removeVoiceChord(restChordInter);
} else if (inter instanceof FlagInter flagInter) {
flags.remove(flagInter);
} else if (inter instanceof TupletInter tupletInter) {
tuplets.remove(tupletInter);
} else if (inter instanceof AugmentationDotInter augmentationDotInter) {
augDots.remove(augmentationDotInter);
} else if (inter instanceof MeasureRepeatInter repeatSign) {
repeatSigns.remove(repeatSign);
} else {
logger.error("Attempt to use removeInter() with {}", inter);
switch (inter) {
case ClefInter clefInter -> clefs.remove(clefInter);
case KeyInter keyInter -> keys.remove(keyInter);
case AbstractTimeInter abstractTimeInter -> timeSigs.remove(abstractTimeInter);
case HeadChordInter headChordInter -> {
headChords.remove(headChordInter);
removeVoiceChord(headChordInter);
}
case RestChordInter restChordInter -> {
restChords.remove(restChordInter);
removeVoiceChord(restChordInter);
}
case FlagInter flagInter -> flags.remove(flagInter);
case TupletInter tupletInter -> tuplets.remove(tupletInter);
case AugmentationDotInter augmentationDotInter -> augDots.remove(augmentationDotInter);
case MeasureRepeatInter repeatSign -> repeatSigns.remove(repeatSign);
default -> logger.error("Attempt to use removeInter() with {}", inter);
}
}

Expand Down
69 changes: 0 additions & 69 deletions src/main/org/audiveris/omr/sheet/symbol/DotFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,16 +41,13 @@
import org.audiveris.omr.sig.inter.ArticulationInter;
import org.audiveris.omr.sig.inter.AugmentationDotInter;
import org.audiveris.omr.sig.inter.BarlineInter;
import org.audiveris.omr.sig.inter.FermataArcInter;
import org.audiveris.omr.sig.inter.FermataDotInter;
import org.audiveris.omr.sig.inter.HeadInter;
import org.audiveris.omr.sig.inter.Inter;
import org.audiveris.omr.sig.inter.Inters;
import org.audiveris.omr.sig.inter.LedgerInter;
import org.audiveris.omr.sig.inter.RepeatDotInter;
import org.audiveris.omr.sig.inter.StaffBarlineInter;
import org.audiveris.omr.sig.relation.AugmentationRelation;
import org.audiveris.omr.sig.relation.DotFermataRelation;
import org.audiveris.omr.sig.relation.Link;
import org.audiveris.omr.sig.relation.Relation;
import org.audiveris.omr.sig.relation.RepeatDotBarRelation;
Expand Down Expand Up @@ -83,7 +80,6 @@
* <li>a part of a repeat sign (upper or lower dot),
* <li>a staccato sign,
* <li>an augmentation dot (first or second dot), [TODO: Handle augmentation dot for mirrored notes]
* <li>a part of a fermata sign,
* <li>a dot of an ending indication, [TODO: Handle dot in ending]
* <li>a simple text dot. [TODO: Anything to be done here?]
* <li>or just some stain...
Expand All @@ -109,8 +105,6 @@ public class DotFactory

private final SIGraph sig;

private final Scale scale;

/** Dot candidates. Sorted top down, then left to right. */
private final List<Dot> dots = new ArrayList<>();

Expand All @@ -128,7 +122,6 @@ public DotFactory (InterFactory interFactory,
this.interFactory = interFactory;
this.system = system;
sig = system.getSig();
scale = system.getSheet().getScale();
}

//~ Methods ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -608,71 +601,9 @@ public void lateDotChecks ()

// Run all late checks
lateAugmentationChecks(); // Note-Dot and Note-Dot-Dot configurations
lateFermataChecks(); // Dot as part of a fermata sign
lateRepeatChecks(); // Dot as part of stack repeat (to say the last word)
}

//-------------------//
// lateFermataChecks //
//-------------------//
/**
* Try to include the dot in a fermata symbol.
*/
private void lateFermataChecks ()
{
final int profile = system.getProfile();

// Collection of fermata arc candidates in the system
List<Inter> arcs = sig.inters(FermataArcInter.class);

if (arcs.isEmpty()) {
return;
}

for (Dot dot : dots) {
Glyph glyph = dot.getGlyph();

if (glyph == null) {
continue;
}

Rectangle dotBox = dot.getBounds();
FermataDotInter dotInter = null;

for (Inter arc : arcs) {
// Box: use lower half for FERMATA_ARC and upper half for FERMATA_ARC_BELOW
Rectangle halfBox = arc.getBounds();
halfBox.height /= 2;

if (arc.getShape() == Shape.FERMATA_ARC) {
halfBox.y += halfBox.height;
}

if (halfBox.intersects(dotBox)) {
final Point2D dotCenter = GeoUtil.center2D(dotBox);
double xGap = Math.abs(dotCenter.getX() - (halfBox.x + (halfBox.width / 2)));
double yTarget = (arc.getShape() == Shape.FERMATA_ARC_BELOW) ? (halfBox.y
+ (halfBox.height * 0.25)) : (halfBox.y + (halfBox.height * 0.75));
double yGap = Math.abs(dotCenter.getY() - yTarget);
DotFermataRelation rel = new DotFermataRelation();
rel.setOutGaps(scale.pixelsToFrac(xGap), scale.pixelsToFrac(yGap), profile);

if (rel.getGrade() >= rel.getMinGrade()) {
if (dotInter == null) {
double grade = Grades.intrinsicRatio * dot.getGrade();
dotInter = new FermataDotInter(glyph, grade);
sig.addVertex(dotInter);
logger.debug("Created {}", dotInter);
}

sig.addEdge(dotInter, arc, rel);
logger.debug("{} matches dot glyph#{}", arc, glyph.getId());
}
}
}
}
}

//---------------------------//
// lateNoteAugmentationCheck //
//---------------------------//
Expand Down
Loading

0 comments on commit ad05a3d

Please sign in to comment.