私のプロジェクトでは、少なくとも、ユーザーが演奏する必要がある音符がどの弦にあるかをユーザーに通知できるようにしたいと考えています。音符とそのオクターブを取得できますが、私が発見したように、その音符とそのオクターブはギターのフレット ボードの複数の場所に表示される可能性があります。
だから私の質問は: とにかく、MIDI ノートをギターの弦にマッピングする方法はありますか?
これは、MIDIノート値を取得し、楽器の端に最も近いギターフレットボード上の位置を返すコードです。フレットゼロはオープンストリングです。
static class Fingering {
int string;
int fret;
public String toString() {
return "String : " + stringNames[string] + ", fret : " + fret;
}
}
static String[] stringNames = new String[] {"Low E", "A", "D", "G", "B", "High E"};
/** Array showing guitar string's relative pitches, in semi-tones, with "0" being low E */
static int[] strings = new int[]{64, 69, 74, 79, 83, 88};
public static Fingering getIdealFingering(int note) {
if (note < strings[0])
throw new RuntimeException("Note " + note + " is not playable on a guitar in standard tuning.");
Fingering result = new Fingering();
int idealString = 0;
for (int x = 1; x < strings.length; x++) {
if (note < strings[x])
break;
idealString = x;
}
result.string = idealString;
result.fret = note - strings[idealString];
return result;
}
public static void main(String[] args) {
System.out.println(getIdealFingering(64)); // Low E
System.out.println(getIdealFingering(66)); // F#
System.out.println(getIdealFingering(72)); // C on A string
System.out.println(getIdealFingering(76)); // E on D string
System.out.println(getIdealFingering(88)); // guitar's high e string, open
System.out.println(getIdealFingering(100)); // high E, 12th fret
System.out.println(getIdealFingering(103)); // high G
}
結果:
String : Low E, fret : 0
String : Low E, fret : 2
String : A, fret : 3
String : D, fret : 2
String : High E, fret : 0
String : High E, fret : 12
String : High E, fret : 15
はい、簡単なロジックでこれを行うことができます。Note は相対音符とオクターブの両方を保持し、まともな equals と hashcode メソッドを持つクラスであり、 MidiNote<Note, MidiNote>
は Midi 音符を表すクラスです。
MIDI は、ピアノのキーを定義するようなものと考えてください。コードとキーは 1 対 1 です。これは、同じ音色を複数の場所で演奏できるギターやバイオリンとは異なります。
あるデータ形式でギターの自由度を表現したい場合は、別の形式を見つけるか発明する必要があります。MIDI は、必要なものをエンコードしません。
ただし、これには間接的な方法があります。それは、以前に発生した音符のスライディング ウィンドウが与えられた場合に、どこで音符を再生するかについてのヒューリスティックを開発することと関係があります。与えられた音は、あなたが今演奏したものに応じて、ある弦または別の弦の方が簡単かもしれません.手のモデルと指がどこにあったかを考えれば、それを計算することができます. これに基づいて、MIDI を最も演奏しやすい方法で MIDI をギターに変換できます。これらのルールに従っているギター音楽が既にある場合は、それを MIDI でエンコードし、後でデコードすることができます。
しかし、おそらくあなたの質問はより基本的なものです。はい、MIDI ノートをギターにマッピングできます。単純な方法は、ギターで演奏可能な各ノートのマッピングを作成し、ナットに最も近いものを選択することで同等の代替案を決定することです。これは簡単な 1 対 1 のマッピングですが、必ずしも最も簡単にプレイできるとは限りません。
本当に正しくやりたい場合は、音楽を注意深く分析して、最適な手の位置と手の位置を変更する場所を決定し、最も簡単なものに基づいて MIDI ノートをフレットと弦に関連付けます。手の位置に基づいてリーチします。最適な解はおそらく NP 完全かそれより悪いですが、手の位置を変更できる頻度と距離に関するいくつかのルールに基づいて、近似解を作成したいと思うでしょうか。