MIDIハンドリングプログラムをコーディングしてJavaを教えてください。プログラムが行うことができる必要があることの1つは、MIDIノート番号とそれに対応するコンパクトな文字列表現の間で前後に変換することです。私は、列挙型のセットアップを使用して見たが、原因命名制約のために、あなたは(はい、私はあなたが否定的になってしまいます慣例以下だからシャープやネガのJava enumの代わりにこれをやったのですか?
c-1, c#-1, ... g9;
ような何かを行うことはできませんオクターブ:P)。
許可されているものと私が望むものとの間で変換を加えなければならないのはぎこちないようです。
CNEG1("c-1"),
CSNEG1("c#-1"),
DNEG1("d-1"),
...
G9("g9");
私は以下の静的インポートスキームを考え出しました。しかし、私は列挙型の使い方についてもっと学びたいと思っていますが、実際にはもっとうまくいくと理解していれば、実際にはもっとうまくいくかもしれません。それは私の質問です:enumスキームを使用して同じ機能を提供するエレガントな方法を思いつく人はいますか?さらに、そうすることに対する強い議論があるだろうか?
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);
}
}
EDIT ------------------------------------------
私はこの特定の状況では、結局、列挙型は過不足かもしれないと思います。私はここでこのコードを使用するだけで終わるかもしれませんが、静的インポートのアプローチと同じですが、上記のNoteMapビジネスのようなものは必要ありません。
note_num - >名前の変換は本当に簡単で、そして名 - > note_numのものは、単に古き良き文字列の解析楽しいです。
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