/* -*- c-basic-offset: 2; indent-tabs-mode: nil; -*- */
/*
* FreeDots -- MusicXML to braille music transcription
*
* Copyright 2008-2010 Mario Lang All Rights Reserved.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 3, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details (a copy is included in the LICENSE.txt file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License
* along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This file is maintained by Mario Lang <mlang@delysid.org>.
*/
package freedots;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/** All the braille signs required for music and a few utility methods.
* <p>
* TODO: This class is an enum for purely historical reasons, there is actually
* no real use of the properties of an enum except for the syntactic sugar
* it offers for initialising static members.
*/
@Deprecated
public enum Braille {
valueDistinction(126, 2),
// Piano pedal marks
pedalPress(126, 14), pedalRelease(16, 14), pedalChange(16, 126, 14),
fermata(126, 123), fermataSquare(56, 126, 123), fermataTent(45, 126, 123);
private int[] dots;
private String cachedString;
Braille(final int dots) { this(new int[] {dots}); }
Braille(final int dots1, final int dots2) { this(new int[] {dots1, dots2}); }
Braille(final int dots1, final int dots2, final int dots3) {
this(new int[] {dots1, dots2, dots3});
}
private Braille(final int[] dots) {
this.dots = dots;
cachedString = "";
for (int element: dots)
cachedString += String.valueOf(unicodeBraille(dotsToBits(element)));
}
@Override
public String toString() {
return cachedString;
}
public static final Map<Character, Character> BRF_TABLE =
Collections.unmodifiableMap(new HashMap<Character, Character>() {
{
put(createCharacter(0), new Character(' '));
put(createCharacter(1), new Character('A'));
put(createCharacter(2), new Character('1'));
put(createCharacter(3), new Character((char)0X27));
put(createCharacter(4), new Character('@'));
put(createCharacter(5), new Character('"'));
put(createCharacter(6), new Character(','));
put(createCharacter(12), new Character('B'));
put(createCharacter(13), new Character('K'));
put(createCharacter(14), new Character('C'));
put(createCharacter(15), new Character('E'));
put(createCharacter(16), new Character('*'));
put(createCharacter(23), new Character('2'));
put(createCharacter(24), new Character('I'));
put(createCharacter(25), new Character('3'));
put(createCharacter(26), new Character('5'));
put(createCharacter(34), new Character('/'));
put(createCharacter(35), new Character('9'));
put(createCharacter(36), new Character('-'));
put(createCharacter(45), new Character('^'));
put(createCharacter(46), new Character('.'));
put(createCharacter(56), new Character(';'));
put(createCharacter(123), new Character('L'));
put(createCharacter(124), new Character('F'));
put(createCharacter(125), new Character('H'));
put(createCharacter(126), new Character('<'));
put(createCharacter(134), new Character('M'));
put(createCharacter(135), new Character('O'));
put(createCharacter(136), new Character('U'));
put(createCharacter(145), new Character('D'));
put(createCharacter(146), new Character('%'));
put(createCharacter(156), new Character(':'));
put(createCharacter(234), new Character('S'));
put(createCharacter(235), new Character('6'));
put(createCharacter(236), new Character('8'));
put(createCharacter(245), new Character('J'));
put(createCharacter(246), new Character('['));
put(createCharacter(256), new Character('4'));
put(createCharacter(345), new Character('>'));
put(createCharacter(346), new Character('+'));
put(createCharacter(356), new Character('0'));
put(createCharacter(456), new Character('_'));
put(createCharacter(1234), new Character('P'));
put(createCharacter(1235), new Character('R'));
put(createCharacter(1236), new Character('V'));
put(createCharacter(1245), new Character('G'));
put(createCharacter(1246), new Character('$'));
put(createCharacter(1256), new Character((char)0X5C));
put(createCharacter(1345), new Character('N'));
put(createCharacter(1346), new Character('X'));
put(createCharacter(1356), new Character('Z'));
put(createCharacter(1456), new Character('?'));
put(createCharacter(2345), new Character('T'));
put(createCharacter(2346), new Character('!'));
put(createCharacter(2356), new Character('7'));
put(createCharacter(2456), new Character('W'));
put(createCharacter(3456), new Character('#'));
put(createCharacter(12345), new Character('Q'));
put(createCharacter(12346), new Character('&'));
put(createCharacter(12356), new Character('('));
put(createCharacter(12456), new Character(']'));
put(createCharacter(13456), new Character('Y'));
put(createCharacter(23456), new Character(')'));
put(createCharacter(123456), new Character('='));
}
});
private static Character createCharacter(int dots) {
return new Character(unicodeBraille(dotsToBits(dots)));
}
public static char unicodeBraille(int bits) {
return (char)(0X2800 | bits);
}
public static int dotsToBits(int dots) {
int bits = 0;
while (dots > 0) {
int number = dots % 10;
dots /= 10;
bits |= 1 << (number - 1);
}
return bits;
}
}