通過編寫MIDI處理程序來自學Java。程序需要做的一件事就是在MIDI音符數字和它們相應的緊湊字符串表示之間來回轉換。我看着使用枚舉設置,但由於命名約束你不能這樣做Java枚舉替代我如何做到這一點?
c-1, c#-1, ... g9;
因爲銳器和底片的
(是的,我下面,讓你最終有一個負的約定八度:P)。
看起來很笨重,必須在允許的和我想要的之間進行轉換。
CNEG1("c-1"),
CSNEG1("c#-1"),
DNEG1("d-1"),
...
G9("g9");
所以我想出了下面的靜態導入方案,它工作正常。但是,我想了解更多關於如何使用枚舉的知識,並且我有一種預感,他們可能實際上更適合於這項任務 - 只要我能更好地理解這些細節。所以這是我的問題:任何人都可以想出一個優雅的方式來使用枚舉方案提供相同的功能嗎?而且,這樣做會有強有力的論據嗎?
public abstract class MethodsAndConstants {
public static final String TONICS[] = {"c","c#","d","d#","e","f","f#","g","g#","a","a#","b"};
static final NoteMap notemap = new NoteMap();
static class NoteMap{
static String map[] = new String[128];
NoteMap() {
for (int i = 0; i < 128; i++){
int octave = i/12 - 1;
String tonic = MethodsAndConstants.TONICS[i%12];
map[i] = tonic + octave;
}
}
}
public static int convert_midi_note(String name){
return indexOf(NoteMap.map, name);
}
public static String convert_midi_note(int note_num){
return NoteMap.map[note_num];
}
public static int indexOf(String[] a, String item){
return java.util.Arrays.asList(a).indexOf(item);
}
}
編輯------------------------------------------
經過沉重的考慮,我認爲在這種特殊情況下,枚舉可能是矯枉過正的。我可能最終只是在這裏使用這個代碼,同樣的靜態導入方法,但不再需要像上面的NoteMap業務那樣的任何東西。
note_num - >名稱轉換非常簡單,名稱 - > note_num stuff只是很好的字符串解析樂趣。
public abstract class MethodsAndConstants {
public static final String[] TONICS = {"c","c#","d","d#","e","f","f#","g","g#","a","a#","b"};
static String convert(int i) {
String tonic = MethodsAndConstants.TONICS[i%12];
int octave = (i/12) - 1;
return tonic + octave;
}
static int convert(String s) {
int tonic = java.util.Arrays.asList(MethodsAndConstants.TONICS).indexOf(s.substring(0,1));
if (s.contains("#")) tonic += 1;
int octave = Integer.parseInt(s.substring(s.length()-1));
if (s.contains("-")) octave -= 2; // case octave = -1
int note_num = ((octave + 1) * 12) + tonic;
return note_num;
}
}
['Note'](http://stackoverflow.com/a/2065693/230513)是一個相關示例。 – trashgod