ギターの 6 つの弦を一連の範囲として表す PHP アプリケーションを作成しています。このようにして、一連の数値を加算または減算して、定義した典型的な構造を体系的に変更できます。
範囲は次のとおりです。
//E: 1-15, A: 26-40, D: 51-65, G: 76-90, b: 101-115, e: 126-140
以下のコードに問題があります。
関数
//the key of the key value pair represents its position on the guitar, and the value
//represents a theoretical function. If the inversion is "0", do nothing. If the
//inversion is "1", all notes that have the value of "r" should have their key
//incremented by 4 and their value changed to '3'.
//example: 1=>"r",28=>"5",52=>"7",77=>"3"
function invChange($pattern, $inversion) {
if ($inversion == 1) {
foreach ($pattern as $position => $function) {
if ($function == 'r' ) { $position += 4; $junction = '3'; }
if ($function == '3' ) { $position += 3; $junction = '5'; }
if ($function == '5' ) { $position += 4; $junction = '7'; }
if ($function == '7' ) { $position += 1; $junction = 'r'; }
$modScale[$position] = $junction;
}
}
if ($inversion == 2) {
foreach ($pattern as $position => $function) {
if ($function == 'r' ) { $position += 7; $junction = '5';}
if ($function == '3' ) { $position += 7; $junction = '7';}
if ($function == '5' ) { $position += 5; $junction = 'r';}
if ($function == '7' ) { $position += 5; $junction = '3';}
$modScale[$position] = $junction;
}
}
if ($inversion == 3) {
foreach ($pattern as $position => $function) {
if ($function == 'r' ) { $position += 11; $junction = '7';}
if ($function == '3' ) { $position += 8; $junction = 'r';}
if ($function == '5' ) { $position += 9; $junction = '3';}
if ($function == '7' ) { $position += 8; $junction = '5';}
$modScale[$position] = $junction;
}
}
return $modScale;
}
ご覧のとおり、これは非常に反復的です。このコードを見るだけで、もっと良い方法が必要だと思います。私が必要としているのは、無限線形の方法で配列を使用することだと思います:
array("root" => 4, "third" => 3, "fifth" => 4, "seventh" => 1);
ここで、定義済みの $note => $offset ペアのいずれかを取得し、この配列を 1、2、または 3 回ジャンプさせる必要があります。たとえば、ルートとして開始し、1 つのジャンプを行う場合、4 を追加して「3 番目」にし、その値を「3 番目」に変更する必要があります。しかし、ルートとして開始して 2 回ジャンプする場合は、4 を加算し、3 を加算してから、その値を「5 番目」に変更する必要があります。