package org.jaudiotagger.tag.reference;
import java.util.EnumSet;
import java.util.HashMap;
/**
* Musical key used by the Key tagFieldKey
* <p/>
* It is not enforced but can be used to verify the Musical key according to the ID3 specification of the TKEY field
*/
public enum MusicalKey {
NOTE_A("A"),
NOTE_B("B"),
NOTE_C("C"),
NOTE_D("D"),
NOTE_E("E"),
NOTE_F("F"),
NOTE_G("G"),
FLAT("b"),
SHARP("#"),
MINOR("m"),
OFF_KEY("o");
private String value;
MusicalKey(String value) {
this.value = value;
}
public String getValue() {
return value;
}
private static final int MAX_KEY_LENGTH = 3;
private final static HashMap<String, MusicalKey> groundKeyMap;
private final static HashMap<String, MusicalKey> halfKeyMap;
static {
EnumSet<MusicalKey> groundKey = EnumSet.of(NOTE_A, NOTE_B, NOTE_C, NOTE_D, NOTE_E, NOTE_F, NOTE_G);
groundKeyMap = new HashMap<String, MusicalKey>(MusicalKey.values().length);
for (MusicalKey curr : groundKey) {
groundKeyMap.put(curr.getValue(), curr);
}
EnumSet<MusicalKey> halfKey = EnumSet.of(FLAT, SHARP, MINOR);
halfKeyMap = new HashMap<String, MusicalKey>(MusicalKey.values().length);
for (MusicalKey curr : halfKey) {
halfKeyMap.put(curr.getValue(), curr);
}
}
public static boolean isValid(String musicalKey) {
if (musicalKey == null || musicalKey.length() > MAX_KEY_LENGTH || musicalKey.length() == 0) {
return false;
}
if (musicalKey.length() == 1) {
if (musicalKey.equals(OFF_KEY.getValue())) {
return true;
}
}
if (!groundKeyMap.containsKey(musicalKey.substring(0, 1))) {
return false;
}
if (musicalKey.length() == 2 || musicalKey.length() == 3) {
if (!halfKeyMap.containsKey(musicalKey.substring(1, 2))) {
return false;
}
}
if (musicalKey.length() == 3) {
if (!musicalKey.substring(2, 3).equals(MINOR.getValue())) {
return false;
}
}
return true;
}
}