//----------------------------------------------------------------------------// // // // S y m b o l s // // // //----------------------------------------------------------------------------// // <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.ui.symbol; import omr.glyph.Shape; import static omr.glyph.Shape.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.EnumMap; /** * Class {@code Symbols} manages all {@link ShapeSymbol} instances, * both for the simple symbols and for a few decorated symbols. * * @author Hervé Bitteur */ public class Symbols { //~ Static fields/initializers --------------------------------------------- /** Usual logger utility */ private static final Logger logger = LoggerFactory.getLogger(Symbols.class); /** Map of (simple) symbols */ private static final EnumMap<Shape, ShapeSymbol> sym = new EnumMap<>( Shape.class); /** Map of decorated symbols */ private static final EnumMap<Shape, ShapeSymbol> dec = new EnumMap<>( Shape.class); /** Symbol of '8' char for ottava sign (alta or bassa) on F & G clefs */ public static final BasicSymbol SYMBOL_OTTAVA = new BasicSymbol(false, 165); /** Symbol for upper part of brace */ public static final BasicSymbol SYMBOL_BRACE_UPPER_HALF = new BasicSymbol( 167); /** Symbol for lower part of brace */ public static final BasicSymbol SYMBOL_BRACE_LOWER_HALF = new BasicSymbol( 234); /** Symbol for upper serif of bracket */ public static final BasicSymbol SYMBOL_BRACKET_UPPER_SERIF = new BasicSymbol( 194); /** Symbol for lower serif of bracket */ public static final BasicSymbol SYMBOL_BRACKET_LOWER_SERIF = new BasicSymbol( 76); /** Symbol for staff lines */ public static final BasicSymbol SYMBOL_STAFF_LINES = new BasicSymbol(61); /** Symbol for stem */ public static final BasicSymbol SYMBOL_STEM = new BasicSymbol(92); /** Symbol for ledger */ public static final BasicSymbol SYMBOL_LEDGER = new BasicSymbol(45); /** Symbol for a complete quarter (head + stem) */ public static final BasicSymbol SYMBOL_QUARTER = new BasicSymbol(113); /** Symbol for a user mark */ public static final BasicSymbol SYMBOL_MARK = new BasicSymbol(205); /** Symbol for FLAG_1 */ public static final ShapeSymbol SYMBOL_FLAG_1 = new ShapeSymbol( FLAG_1, 106); /** Symbol for FLAG_2 */ public static final ShapeSymbol SYMBOL_FLAG_2 = new ShapeSymbol( FLAG_2, 107); /** Symbol for FLAG_1_UP */ public static final ShapeSymbol SYMBOL_FLAG_1_UP = new ShapeSymbol( FLAG_1_UP, 74); /** Symbol for FLAG_2_UP */ public static final ShapeSymbol SYMBOL_FLAG_2_UP = new ShapeSymbol( FLAG_2_UP, 75); static { assignSymbols(); assignDecoratedSymbols(); } //~ Constructors ----------------------------------------------------------- //---------// // Symbols // This is just a functional class, no instance is needed //---------// private Symbols () { } //~ Methods ---------------------------------------------------------------- //-----------// // getSymbol // //-----------// /** * Return a symbol from its definition in MusicFont. * * @param shape the symbol related shape * @param decorated true for a decorated symbol, false for a simple one * @return the desired symbol, or null if none found */ public static ShapeSymbol getSymbol (Shape shape, boolean decorated) { if (decorated) { ShapeSymbol symbol = dec.get(shape); if (symbol != null) { return symbol; } } return getSymbol(shape); } //-----------// // getSymbol // //-----------// /** * Return a simple symbol from its definition in MusicFont. * * @param shape the symbol shape * @return the desired symbol, or null if none */ public static ShapeSymbol getSymbol (Shape shape) { return sym.get(shape); } //------------------------// // assignDecoratedSymbols // //------------------------// /** * Populate the 'dec' map: Shape -> decorated Symbol. */ private static void assignDecoratedSymbols () { dec.put(BEAM, new BeamSymbol(1, BEAM)); dec.put(BEAM_2, new BeamSymbol(2, BEAM_2)); dec.put(BEAM_3, new BeamSymbol(3, BEAM_3)); dec.put(BEAM_HOOK, new BeamHookSymbol()); dec.put(BRACE, new BraceSymbol(false)); dec.put(BRACKET, new BracketSymbol(false)); dec.put(BREVE_REST, new RestSymbol(BREVE_REST, true, 227)); dec.put(CHARACTER, new TextSymbol(CHARACTER, "a")); dec.put(CLUTTER, new TextSymbol(CLUTTER, "?")); dec.put(STEM, new StemSymbol()); dec.put(CRESCENDO, new CrescendoSymbol(false, CRESCENDO)); dec.put(DECRESCENDO, new DecrescendoSymbol(false, DECRESCENDO)); dec.put(ENDING, new EndingSymbol()); dec.put(HALF_REST, new RestSymbol(HALF_REST, true, 238)); dec.put(LEDGER, new LedgerSymbol(true)); dec.put(LONG_REST, new LongRestSymbol(true)); dec.put(NON_DRAGGABLE, new NonDraggableSymbol(192)); dec.put(SLUR, new SlurSymbol()); dec.put(TEXT, new TextSymbol(TEXT, "txt")); dec.put(WHOLE_REST, new RestSymbol(WHOLE_REST, true, 183)); } //---------------// // assignSymbols // //---------------// /** * Populate the 'sym' map: Shape -> (simple) Symbol. * These symbols are draggable */ private static void assignSymbols () { // Instances to be defined first, because others depend on them map(DYNAMICS_F, 102); map(DYNAMICS_FF, 196); map(DYNAMICS_FFF, 236); map(DYNAMICS_FZ, 90); map(DYNAMICS_SF, 83); map(NOTEHEAD_BLACK, 207); map(TIME_ZERO, 48); map(EIGHTH_REST, 228); map(RIGHT_REPEAT_SIGN, 125); map(THICK_BARLINE, 91); map(THIN_BARLINE, 108); map(WHOLE_REST, 238); map(HALF_REST, 238); map(REPEAT_DOT_PAIR, 123); // Other instances, in any order map(DOT_set, 46); map(AUGMENTATION_DOT, 46); map(STACCATO, 46); map(REPEAT_DOT, 46); map(ACCENT, 62); map(ARPEGGIATO, 103); sym.put(BACK_TO_BACK_REPEAT_SIGN, new BackToBackSymbol(false)); map(BREATH_MARK, 44); map(BREVE, 87); sym.put(BREVE_REST, new RestSymbol(BREVE_REST, false, 227)); map(CAESURA, 34); map(CODA, 222); sym.put(FLAG_1_set, new FlagsDownSymbol(1, false, FLAG_1_set)); sym.put(FLAG_2_set, new FlagsDownSymbol(2, false, FLAG_2_set)); sym.put(FLAG_3_set, new FlagsDownSymbol(3, false, FLAG_3_set)); sym.put(FLAG_4_set, new FlagsDownSymbol(4, false, FLAG_4_set)); sym.put(FLAG_5_set, new FlagsDownSymbol(5, false, FLAG_5_set)); flagsDown(1, FLAG_1); flagsUp(1, FLAG_1_UP); flagsDown(2, FLAG_2); flagsUp(2, FLAG_2_UP); flagsDown(3, FLAG_3); flagsUp(3, FLAG_3_UP); flagsDown(4, FLAG_4); flagsUp(4, FLAG_4_UP); flagsDown(5, FLAG_5); flagsUp(5, FLAG_5_UP); // STEM? map(COMMON_TIME, 99); sym.put(CUSTOM_TIME, new CustomNumDenSymbol()); map(CUT_TIME, 67); map(C_CLEF, 66); map(DAL_SEGNO, 100); map(DA_CAPO, 68); sym.put(DOUBLE_BARLINE, new DoubleBarlineSymbol(false)); sym.put(DOUBLE_FLAT, new FlatSymbol(DOUBLE_FLAT, 186)); map(DOUBLE_SHARP, 220); map(DYNAMICS_CHAR_M, 189); map(DYNAMICS_CHAR_R, 243); map(DYNAMICS_CHAR_S, 115); map(DYNAMICS_CHAR_Z, 122); // slanted(DYNAMICS_FFFF, 236, 102); // slanted(DYNAMICS_FFFFF, 236, 196); // slanted(DYNAMICS_FFFFFF, 236, 236); slanted(DYNAMICS_FP, 102, 112); map(DYNAMICS_MF, 70); map(DYNAMICS_MP, 80); map(DYNAMICS_P, 112); map(DYNAMICS_PP, 185); map(DYNAMICS_PPP, 184); // slanted(DYNAMICS_PPPP, 184, 112); // slanted(DYNAMICS_PPPPP, 184, 185); // slanted(DYNAMICS_PPPPPP, 184, 184); slanted(DYNAMICS_RF, 243, 102); slanted(DYNAMICS_RFZ, 243, 102, 122); slanted(DYNAMICS_SFFZ, 83, 90); slanted(DYNAMICS_SFP, 83, 112); slanted(DYNAMICS_SFPP, 83, 185); slanted(DYNAMICS_SFZ, 83, 122); // map(ENDING_HORIZONTAL); // map(ENDING_VERTICAL); map(FERMATA_set, 85); map(FERMATA, 85); map(FERMATA_BELOW, 117); map(FINAL_BARLINE, 211); sym.put(FLAT, new FlatSymbol(FLAT, 98)); map(F_CLEF, 63); small(F_CLEF_SMALL, 63); ottava(true, F_CLEF_8VA, 63); ottava(false, F_CLEF_8VB, 63); map(GRACE_NOTE, 59); map(GRACE_NOTE_SLASH, 201); map(G_CLEF, 38); small(G_CLEF_SMALL, 38); ottava(true, G_CLEF_8VA, 38); ottava(false, G_CLEF_8VB, 38); sym.put(HW_REST_set, new RestSymbol(HALF_REST, false, 238)); sym.put(HALF_REST, new RestSymbol(HALF_REST, false, 238)); map(INVERTED_MORDENT, 77); flatKey(-1, KEY_FLAT_1); flatKey(-2, KEY_FLAT_2); flatKey(-3, KEY_FLAT_3); flatKey(-4, KEY_FLAT_4); flatKey(-5, KEY_FLAT_5); flatKey(-6, KEY_FLAT_6); flatKey(-7, KEY_FLAT_7); sharpKey(1, KEY_SHARP_1); sharpKey(2, KEY_SHARP_2); sharpKey(3, KEY_SHARP_3); sharpKey(4, KEY_SHARP_4); sharpKey(5, KEY_SHARP_5); sharpKey(6, KEY_SHARP_6); sharpKey(7, KEY_SHARP_7); sym.put(LEDGER, new LedgerSymbol(false)); map(LEFT_REPEAT_SIGN, 93); sym.put(LONG_REST, new LongRestSymbol(false)); map(MORDENT, 109); map(NATURAL, 110); sym.put(NON_DRAGGABLE, new NonDraggableSymbol(192)); heads(2, NOTEHEAD_BLACK_2, 207); heads(3, NOTEHEAD_BLACK_3, 207); // map(NO_LEGAL_TIME); // sym.put( // OLD_QUARTER_REST, // new TransformedSymbol( // false, // OLD_QUARTER_REST, // EIGHTH_REST, // ShapeSymbol.horizontalFlip)); map(ONE_128TH_REST, 229); map(OTTAVA_ALTA, 195); map(OTTAVA_BASSA, 215); // map(PART_DEFINING_BARLINE); map(PEDAL_MARK, 161); map(PEDAL_UP_MARK, 42); map(PERCUSSION_CLEF, 47); map(QUARTER_REST, 206); map(REVERSE_FINAL_BARLINE, 210); map(SEGNO, 37); map(SHARP, 35); map(ONE_16TH_REST, 197); map(ONE_64TH_REST, 244); // SLUR? map(STACCATISSIMO, 174); map(STRONG_ACCENT, 94); // STRUCTURE (for training?) map(TENUTO, 45); map(ONE_32ND_REST, 168); map(TIME_EIGHT, 56); map(TIME_FIVE, 53); map(TIME_FOUR, 52); numDen(TIME_FOUR_FOUR, 4, 4); map(TIME_NINE, 57); map(TIME_ONE, 49); map(TIME_SEVEN, 55); map(TIME_69_set, 54); map(TIME_SIX, 54); map(TIME_SIXTEEN, 49, 54); numDen(TIME_SIX_EIGHT, 6, 8); map(TIME_THREE, 51); numDen(TIME_THREE_FOUR, 3, 4); map(TIME_TWELVE, 49, 50); map(TIME_TWO, 50); numDen(TIME_TWO_FOUR, 2, 4); numDen(TIME_TWO_TWO, 2, 2); map(TR, 96); map(TUPLET_SIX, 164); map(TUPLET_THREE, 163); map(TURN_set, 84); map(TURN, 84); sym.put( INVERTED_TURN, new TransformedSymbol( false, INVERTED_TURN, TURN, ShapeSymbol.verticalFlip)); sym.put(TURN_SLASH, new TurnSlashSymbol(false)); sym.put( TURN_UP, new TransformedSymbol( false, TURN_UP, TURN, ShapeSymbol.quadrantRotateOne)); heads(1, NOTEHEAD_VOID, 250); heads(2, NOTEHEAD_VOID_2, 250); heads(3, NOTEHEAD_VOID_3, 250); heads(1, WHOLE_NOTE, 119); heads(2, WHOLE_NOTE_2, 119); heads(3, WHOLE_NOTE_3, 119); sym.put(WHOLE_REST, new RestSymbol(WHOLE_REST, false, 183)); sym.put(WEDGE_set, new CrescendoSymbol(false, CRESCENDO)); } //- Convenient methods ----------------------------------------------------- //-----------// // flagsDown // //-----------// private static void flagsDown (int count, Shape shape) { sym.put(shape, new FlagsDownSymbol(count, false, shape)); } //---------// // flagsUp // //---------// private static void flagsUp (int count, Shape shape) { sym.put(shape, new FlagsUpSymbol(count, false, shape)); } //----------// // flatKey // //----------// private static void flatKey (int key, Shape shape) { sym.put(shape, new KeyFlatSymbol(key, false, shape)); } //-------// // heads // //-------// private static void heads (int count, Shape shape, int... codes) { sym.put(shape, new HeadsSymbol(count, false, shape, codes)); } //-----// // map // //-----// private static void map (Shape shape, int... codes) { sym.put(shape, new ShapeSymbol(shape, codes)); } //--------// // numDen // //--------// private static void numDen (Shape shape, int num, int den) { sym.put(shape, new NumDenSymbol(shape, num, den)); } //--------// // ottava // //--------// private static void ottava (boolean isAlta, Shape shape, int... codes) { sym.put(shape, new OttavaClefSymbol(isAlta, false, shape, codes)); } //----------// // sharpKey // //----------// private static void sharpKey (int key, Shape shape) { sym.put(shape, new KeySharpSymbol(key, false, shape)); } //---------// // slanted // //---------// private static void slanted (Shape shape, int... codes) { sym.put(shape, new SlantedSymbol(shape, codes)); } //-------// // small // //-------// private static void small (Shape shape, int... codes) { sym.put(shape, new ResizedSymbol(shape, 0.67d, codes)); } }