//----------------------------------------------------------------------------// // // // P a r a m e t e r s T a s k // // // //----------------------------------------------------------------------------// // <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.script; import omr.run.AdaptiveDescriptor; import omr.run.FilterDescriptor; import omr.run.GlobalDescriptor; import omr.score.Score; import omr.score.entity.Page; import omr.score.entity.ScorePart; import omr.sheet.Sheet; import omr.sheet.SystemInfo; import omr.step.Step; import omr.step.Stepping; import omr.step.Steps; import omr.util.LiveParam; import omr.util.Param; import omr.util.TreeNode; import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElements; /** * Class {@code ParametersTask} handles global parameters as the * results of dialog {@link omr.score.ui.ScoreParameters}. * * @author Hervé Bitteur */ @XmlAccessorType(XmlAccessType.NONE) public class ParametersTask extends ScriptTask { //~ Instance fields -------------------------------------------------------- /** Language code. */ @XmlElement(name = "language") private String language; /** Tempo value. */ @XmlElement(name = "tempo") private Integer tempo; /** Pixel filter. */ @XmlElements({ @XmlElement(name = "global-filter", type = GlobalDescriptor.class), @XmlElement(name = "adaptive-filter", type = AdaptiveDescriptor.class) }) private FilterDescriptor filterDescriptor; /** Description data for each part. */ @XmlElement(name = "part") private List<PartData> parts = new ArrayList<>(); /** Specific page parameters. */ @XmlElement(name = "page") private List<PageParameters> pages = new ArrayList<>(); //~ Constructors ----------------------------------------------------------- // //----------------// // ParametersTask // //----------------// /** No-arg constructor needed by JAXB */ public ParametersTask () { } //~ Methods ---------------------------------------------------------------- // //---------// // addPart // //---------// /** * Add data for one part * * @param name the part name * @param program the midi program */ public void addPart (String name, int program) { parts.add(new PartData(name, program)); } //------// // core // //------// /** * This is the place where non-default settings are performed. * * @param sheet the current sheet, if any * @throws Exception */ @Override public void core (Sheet sheet) throws Exception { Score score = sheet.getScore(); StringBuilder sb = new StringBuilder(); // Score Binarization if (filterDescriptor != null) { if (score.getFilterParam().setSpecific(filterDescriptor)) { sb.append(" filter:") .append(filterDescriptor); } } // Score Language if (language != null) { if (score.getTextParam().setSpecific(language)) { sb.append(" language:") .append(language); } } // Score Tempo if (tempo != null) { if (score.getTempoParam().setSpecific(tempo)) { sb.append(" tempo:") .append(tempo); } } // Score Parts for (int i = 0; i < parts.size(); i++) { try { ScorePart scorePart = score.getPartList().get(i); PartData data = parts.get(i); // Part name scorePart.setName(data.name); // Part midi program scorePart.setMidiProgram(data.program); } catch (Exception ex) { logger.warn( "Error in script Parameters part#" + (i + 1), ex); } } // Pages for (PageParameters params : pages) { Page page = score.getPage(params.index); sb.append(" {page:").append(params.index); // Page Binarization if (params.filterDescriptor != null) { if (page.getFilterParam().setSpecific(params.filterDescriptor)) { sb.append(" filter:") .append(params.filterDescriptor); } } // Page Language if (params.language != null) { Param<String> context = page.getTextParam(); if (page.getTextParam().setSpecific(params.language)) { sb.append(" language:") .append(params.language); } } sb.append("}"); } if (sb.length() > 0) { logger.info("{}parameters{}", score.getLogPrefix(), sb); } } //--------// // epilog // //--------// /** * Determine from which step we should rebuild, page per page. * * @param sheet the related sheet */ @Override public void epilog (Sheet sheet) { final Step scaleStep = Steps.valueOf(Steps.SCALE); final Step textsStep = Steps.valueOf(Steps.TEXTS); final Step symbolsStep = Steps.valueOf(Steps.SYMBOLS); final Step scoreStep = Steps.valueOf(Steps.SCORE); Step latestStep = Stepping.getLatestMandatoryStep(sheet); for (TreeNode pn : new ArrayList<>(sheet.getScore().getPages())) { final Page page = (Page) pn; Step from = null; // Language if (Steps.compare(latestStep, textsStep) >= 0) { LiveParam<String> param = page.getTextParam(); if (param.needsUpdate()) { logger.debug("Page {} needs TEXT with {}", page.getId(), param.getTarget()); // Convert the text items as much as possible final Sheet theSheet = page.getSheet(); for (SystemInfo system : theSheet.getSystems()) { system.getTextBuilder().switchLanguageTexts(); } // Reprocess this page from SYMBOLS step from = symbolsStep; } } // Binarization if (Steps.compare(latestStep, scaleStep) >= 0) { LiveParam<FilterDescriptor> param = page.getFilterParam(); if (param.needsUpdate()) { logger.debug("Page {} needs SCALE with {}", page.getId(), param.getTarget()); // Reprocess this page from SCALE step from = scaleStep; } } Stepping.reprocessSheet(from, sheet, null, true, false); } // Final SCORE (merge) step? if (latestStep == scoreStep) { Stepping.reprocessSheet(scoreStep, sheet, null, true, true); } super.epilog(sheet); } //-----------// // setFilter // //-----------// /** * Set binarization filter at proper scope level. * * @param filterDescriptor the filter to use for pixels binarization * @param page not null for page setting */ public void setFilter (FilterDescriptor filterDescriptor, Page page) { if (page != null) { getParams(page).filterDescriptor = filterDescriptor; } else { this.filterDescriptor = filterDescriptor; } } //-------------// // setLanguage // //-------------// /** * Set language at proper scope level. * * @param language the language code to set * @param page not null for page setting */ public void setLanguage (String language, Page page) { if (page != null) { getParams(page).language = language; } else { this.language = language; } } //----------// // setTempo // //----------// /** * Set score tempo. * * @param tempo the tempo value */ public void setTempo (Integer tempo) { this.tempo = tempo; } //-----------------// // internalsString // //-----------------// @Override protected String internalsString () { StringBuilder sb = new StringBuilder(" parameters"); if (filterDescriptor != null) { sb.append(" filter:") .append(filterDescriptor); } if (language != null) { sb.append(" language:") .append(language); } for (PartData data : parts) { sb.append(" ") .append(data); } for (PageParameters params : pages) { sb.append(" ") .append(params); } return sb.toString() + super.internalsString(); } //-----------// // getParams // //-----------// /** * [May create] and report the parameters for the provided page. * * @param page the provided page * @return the page parameters */ private PageParameters getParams (Page page) { int index = page.getIndex(); for (PageParameters params : pages) { if (params.index == index) { return params; } } // Not found, create one PageParameters params = new PageParameters(); params.index = index; pages.add(params); return params; } //~ Inner Classes ---------------------------------------------------------- //----------// // PartData // //----------// public static class PartData { //~ Instance fields ---------------------------------------------------- /** Name of the part */ @XmlAttribute public final String name; /** Midi Instrument */ @XmlAttribute public final int program; //~ Constructors ------------------------------------------------------- public PartData (String name, int program) { this.name = name; this.program = program; } private PartData () { name = null; program = 0; } //~ Methods ------------------------------------------------------------ @Override public String toString () { return "{name:" + name + " program:" + program + "}"; } } //----------------// // PageParameters // //----------------// /** * Parameters for a page. */ public static class PageParameters { /** Page unique index. */ @XmlAttribute(name = "index") private int index; /** Language code. */ @XmlElement(name = "language") private String language; /** Pixel filter. */ @XmlElements({ @XmlElement(name = "global-filter", type = GlobalDescriptor.class), @XmlElement(name = "adaptive-filter", type = AdaptiveDescriptor.class) }) private FilterDescriptor filterDescriptor; //~ Constructors ------------------------------------------------------- // /** No-arg constructor needed by JAXB */ public PageParameters () { } @Override public String toString () { StringBuilder sb = new StringBuilder("{page#"); sb.append(index); if (filterDescriptor != null) { sb.append(" filter:") .append(filterDescriptor); } if (language != null) { sb.append(" language:") .append(language); } sb.append("}"); return sb.toString(); } } }