package org.jaudiotagger.tag.reference; import java.util.EnumSet; import java.util.HashMap; /** * Musical key used by the Key tagFieldKey * * 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; } }