2012-05-06 6 views
3

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; 
    } 
} 
+0

['Note'](http://stackoverflow.com/a/2065693/230513)は、関連する例です。 – trashgod

答えて

1

そのような何か:

public enum Note { 
    CNEG1("c-1"), CSNEG1("c#-1"), DNEG1("d-1"); 

    private final String tonicOctave; 

    private Note(final String tonicOctave) { 
     this.tonicOctave = tonicOctave; 
    } 

    public String getTonicOctave() { 
     return this.tonicOctave; 
    } 

    public static Note fromTonicOctave(final String val) { 
     for (final Note note: Note.values()) { 
      if (note.getTonicOctave().equals(val)) { 
       return note; 
      } 
     } 
     return null; 
    } 
} 

注意あなたが列挙型で必要として、あなたは、多くのパラメータを持つことができますので、あなたは強壮剤やオクターブを分離する必要がある場合は、することができます。

+0

これは面白そうです。この時点ではほんの少しだけ解析することができますが、私はいくつかの研究をします。 EDIT * Can *開始することができます... – TOZ

+0

私は強壮剤とオカベツトを分ける能力について何を意味するのかを知っていると思います。 CNEG1( "c"、 - 1)などの行に沿っていますか?何らかの形で役に立つかもしれません。 – TOZ

+0

@TOZ、はい、 'CNEG1( "c"、 - 1) 'は可能です –

3

あなたがピッチを表現するために列挙型を使用することができますが、私はノート(C、C#の、D、D#、Eという。これは、事実のために会計処理するクラスに

public class Pitch { 

    private final int octave; 
    private final Note note; 

    public enum Note { 
     C("C",4), CSHARP("C#/Db",5), DFLAT("C#/Db",5), //and so on 

     private final String thePitch; 
     private final int midiAdjust; 

     private Note(final String thePitch, final int midiAdjust) { 
      this.thePitch = thePitch; 
      this.midiAdjust = midiAdjust; 
     } 

     String getThePitch() { 
      return thePitch; 
     } 

     int getMidiAdjust() { 
      return midiAdjust; 
     } 
    } 

    public Pitch(Note note, int octave) { 
     this.note = note; 
     this.octave = octave; 
    } 

    public int getMidiNumber(){ 
     return 12*octave + note.getMidiAdjust(); 
    } 

} 

をピッチをカプセル化してみてください...)は繰り返しのセットの1つになりますが、すべての種類のオクターブを持つことができます。この場合、intで処理します。 enumのサイズを大幅に縮小します。

EDIT:アイデアとしてここにいくつかの行を追加しました。 enumのコンストラクタに2番目のパラメータを渡して、ピッチを表すMIDI番号を返すことができます。この中で私はMIDIで表現される最も低い数字がAだと仮定しましたが、それは間違っているかもしれません。また、12*octaveは、各増分ごとに1オクターブのピッチを追加することを意図しています。私はあなたがその1つの奇妙な記法を使用しているのを見て、おそらくこれを少し調整する必要があります。

+0

お返事ありがとうございます。私はこれもいくつかの研究を与えるでしょう。 – TOZ

+0

私は追加の編集を感謝します - もう少しそれを勉強します。 – TOZ

関連する問題