//----------------------------------------------------------------------------//
// //
// P a g e s S t e p //
// //
//----------------------------------------------------------------------------//
// <editor-fold defaultstate="collapsed" desc="hdr"> //
// Copyright © Hervé Bitteur and others 2000-2013. All rights reserved. //
// This software is released under the GNU General Public License. //
// Goto http://kenai.com/projects/audiveris to report bugs or suggestions. //
//----------------------------------------------------------------------------//
// </editor-fold>
package omr.step;
import omr.constant.Constant;
import omr.constant.ConstantSet;
import omr.score.ScoreChecker;
import omr.score.ScoreCleaner;
import omr.score.TimeSignatureFixer;
import omr.score.TimeSignatureRetriever;
import omr.score.entity.Page;
import omr.score.entity.ScoreSystem;
import omr.sheet.Sheet;
import omr.sheet.SystemInfo;
import omr.util.WrappedBoolean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Collection;
/**
* Class {@code PagesStep} translates glyphs into score entities for
* a page.
*
* @author Hervé Bitteur
*/
public class PagesStep
extends AbstractSystemStep
{
//~ Static fields/initializers ---------------------------------------------
/** Specific application parameters */
private static final Constants constants = new Constants();
/** Usual logger utility */
private static final Logger logger = LoggerFactory.getLogger(
PagesStep.class);
//~ Constructors -----------------------------------------------------------
//-----------//
// PagesStep //
//-----------//
/**
* Creates a new PagesStep object.
*/
public PagesStep ()
{
super(
Steps.PAGES,
Level.SHEET_LEVEL,
Mandatory.MANDATORY,
DATA_TAB,
"Translate glyphs to score items");
}
//~ Methods ----------------------------------------------------------------
//-----------//
// displayUI //
//-----------//
@Override
public void displayUI (Sheet sheet)
{
// Since we may have purged slots, let's reset highlighted slot if any
sheet.getSymbolsEditor()
.highLight(null);
Steps.valueOf(Steps.SYMBOLS)
.displayUI(sheet);
}
//----------//
// doSystem //
//----------//
@Override
public void doSystem (SystemInfo system)
throws StepException
{
final int iterMax = constants.maxPageIterations.getValue();
final ScoreSystem scoreSystem = system.getScoreSystem();
final WrappedBoolean modified = new WrappedBoolean(true);
// Purge system of non-active glyphs
system.removeInactiveGlyphs();
for (int iter = 1; modified.isSet() && (iter <= iterMax); iter++) {
modified.set(false);
logger.debug(
"System#{} translation iter #{}",
system.getId(),
iter);
// Clear errors for this system only (and this step)
clearSystemErrors(system);
// Cleanup the system, staves, measures, barlines, ...
// and clear glyph (& sentence) translations
scoreSystem.accept(new ScoreCleaner());
// Real translation
system.translateSystem();
// Final checks at system level
scoreSystem.acceptChildren(new ScoreChecker(modified));
}
}
//----------//
// doEpilog //
//----------//
@Override
protected void doEpilog (Collection<SystemInfo> systems,
Sheet sheet)
throws StepException
{
// For the very first time, we reperform from the SYMBOLS step
if (!sheet.isDone(this)) {
sheet.done(this);
// Reperform SYMBOLS once
try {
Stepping.reprocessSheet(
Steps.valueOf(Steps.SYMBOLS),
sheet,
systems,
true);
} catch (Exception ex) {
logger.warn("Error in re-processing from " + this, ex);
}
} else {
// Final cross-system translation tasks
if (systems == null) {
systems = sheet.getSystems();
}
if (!systems.isEmpty()) {
systems.iterator()
.next()
.translateFinal();
// Finally, all actions for completed page (in proper order)
Page page = sheet.getPage();
// 1/ Look carefully for time signatures
page.accept(new TimeSignatureRetriever());
// 2/ Adapt time sigs to intrinsic measure & chord durations
page.accept(new TimeSignatureFixer());
}
}
}
//~ Inner Classes ----------------------------------------------------------
//-----------//
// Constants //
//-----------//
private static final class Constants
extends ConstantSet
{
//~ Instance fields ----------------------------------------------------
private final Constant.Integer maxPageIterations = new Constant.Integer(
"count",
2,
"Maximum number of iterations for PAGES task");
}
}