和音は複数の音の積み重ねでできています。
今回は、この音と音との間隔をプログラムで自動的に分析して、和音にどのような音程がどのような比率で含まれているのかを明らかにし、さらに楽曲全体にも適用してみようという試みです。


まずは単純な長三和音、ドミソを分析してみます。
3つの音で構成される和音には、以下のように3つの音程間隔が含まれています。
ceg-chord


プログラムに分析対象の和音を代入する際のフォーマットは、アルファベット音名のすぐ後に音域の数字を付加したものを順番に並べる、となります。
ドミソなら、まず一点ハ(上記ドの音)を「c4」とします。
引き続き「e4」と「g4」を書いて、「c4e4g4」とします。

これを、以下の2行目の$chordsに代入して準備完了です。
 
//和音代入
$chords = "c4e4g4";

$array = explode(",", $chords);
$result = array("0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0");

foreach ($array as $notes){
	if(preg_match_all("/[a-z+-]{1,2}\d{1,2}/",$notes,$note)){
		$count = count($note[0]);
	
			for ($i = 0; $i < $count - 1; $i++){

				for ($i2 = 0; $i2 < $count - $i - 1; $i2++){
					preg_match("/[a-z+-]{1,2}/",$note[0][$i2],$note_lower);
					if($note_lower[0] == "c"){$pitch_lower = 0;}
					if($note_lower[0] == "c+" || $note_lower[0] == "d-"){$pitch_lower = 1;}
					if($note_lower[0] == "d"){$pitch_lower = 2;}
					if($note_lower[0] == "d+" || $note_lower[0] == "e-"){$pitch_lower = 3;}
					if($note_lower[0] == "e"){$pitch_lower = 4;}
					if($note_lower[0] == "f"){$pitch_lower = 5;}
					if($note_lower[0] == "f+" || $note_lower[0] == "g-"){$pitch_lower = 6;}
					if($note_lower[0] == "g"){$pitch_lower = 7;}
					if($note_lower[0] == "g+" || $note_lower[0] == "a-"){$pitch_lower = 8;}
					if($note_lower[0] == "a"){$pitch_lower = 9;}
					if($note_lower[0] == "a+" || $note_lower[0] == "b-"){$pitch_lower = 10;}
					if($note_lower[0] == "b"){$pitch_lower = 11;}
					preg_match("/\d{1,2}/",$note[0][$i2],$register_lower);
					$register_lower = $register_lower[0] * 12 - 12;
					
					preg_match("/[a-z]/",$note[0][$i2 + $i + 1],$note_upper);
					if($note_upper[0] == "c"){$pitch_upper = 0;}
					if($note_upper[0] == "c+" || $note_upper[0] == "d-"){$pitch_upper = 1;}
					if($note_upper[0] == "d"){$pitch_upper = 2;}
					if($note_upper[0] == "d+" || $note_upper[0] == "e-"){$pitch_upper = 3;}
					if($note_upper[0] == "e"){$pitch_upper = 4;}
					if($note_upper[0] == "f"){$pitch_upper = 5;}
					if($note_upper[0] == "f+" || $note_upper[0] == "g-"){$pitch_upper = 6;}
					if($note_upper[0] == "g"){$pitch_upper = 7;}
					if($note_upper[0] == "g+" || $note_upper[0] == "a-"){$pitch_upper = 8;}
					if($note_upper[0] == "a"){$pitch_upper = 9;}
					if($note_upper[0] == "a+" || $note_upper[0] == "b-"){$pitch_upper = 10;}
					if($note_upper[0] == "b"){$pitch_upper = 11;}					
					preg_match("/\d{1,2}/",$note[0][$i2 + $i + 1],$register_upper);
					$register_upper = $register_upper[0] * 12 - 12;

					$register = ($pitch_upper + $register_upper) - ($pitch_lower + $register_lower);
					if($register > 12) {
						$register = $register - (12 * floor($register / 12));
					}

					for($i3 = 0;$i3 < 12;$i3++){
						if($register == 12){$register = 0;}
						if($register == $i3){$replacement = array($i3 => $result[$i3] + 1);
							$result = array_replace($result, $replacement);
						}
					}
				}
			}


		
	}
}
echo <<< EOF
短二度	$result[1]
長二度	$result[2]
短三度	$result[3]
長三度	$result[4]
完全四度	$result[5]
増四度	$result[6]
完全五度	$result[7]
短六度	$result[8]
長六度	$result[9]
短七度	$result[10]
長七度	$result[11]
オクターブ	$result[0]
EOF;
これを実行した結果が以下となります。
短二度	0
長二度	0
短三度	1
長三度	1
完全四度	0
増四度	0
完全五度	1
短六度	0
長六度	0
短七度	0
長七度	0
オクターブ	0
短三度が1つ、長三度が1つ、完全五度が1つという結果となりました。

これをエクセルにコピー&ペーストして、グラフ化してみましょう。
c4e4g4-2

こんなんなりました。



複数の和音を分析する場合は、コンマで区切ってください。
シャープは「+」、フラットは「-」です。
和音の構成音数は2つでも9つでも、幾つでも構いません。
例えば「c4e4g4,b3d4f4a-4」のようになります。

注意点が幾つかあります。
1)必ず低い音から高い音の順に並べてください。
2)E#はF、F♭はE、B#はC、C♭はBです。
3)ダブルフラットやダブルシャープは使用不可です。
4)機能は分析対象ではないので転回は無視されています。
5)複音程は単音程として取り扱われます。


さて、これを応用して一曲丸々分析してみましょう。
まずは基本ということで、バッハの平均律クラヴィーア曲集第1巻第1番の前奏曲を分析してみます。
IMG_6323

比率をみるので今回は繰り返しは省いて1小節1和音として分析します。

入力するデータは以下のようになります。
$chords = "c4e4g4c5e5,c4d4a4d5f5,b3d4g4d5f5,c4e4g4c5e5,c4e4a4e5a5,c4d4f+4a4d5,b3d4g4d5g5,b3c4e4g5c6,a3c4e4g4c5,d3a3d4f+4c5,g3a-3d4f4b4,e3g3c4g4c5,e3f3a3c4f4,d3f3a3c4f4,g2d3g3b3f4,c3e3g3c4e4,c3g3b-3c4e4,f2f3a3c4e4,f+2c3a3c4e-4,a-2f3b3c4d4,g2f3g3b3d4,g2e3g3c4e4,g2d3g3c4f4,g2d3g3b3f4,g2e-3a3c4f+4,g2e3g3c4g4,g2d3g3c4f4,g2d3g3b3f4,c2c3g3b-3e4,c2c3d3f3a3c4f4,c2b2d4f4g4b4d5f5,c2c3e4g4c5";

これを実行すると以下の結果を得られます。
短二度	5
長二度	15
短三度	53
長三度	41
完全四度	51
増四度	19
完全五度	39
短六度	23
長六度	28
短七度	23
長七度	7
オクターブ	45
エクセルでグラフ化してみると、
bach-welltemp-05242015-2

こんなんなります。
見やすいように、含有率の多い順にソートしてあります。

予想通りの分布になっていましたでしょうか?


次に、バッハと比較するため、だいぶ新しい作品を分析してみましょう。
短い曲がいいので、スクリャービンの前奏曲 op.16 第5番を分析してみます。
IMG_6324

入力するデータは以下の通りです。
$chords = "c+2g+2f3b3c+4d+4g+4,c+3g+3b3c+4f4b4c+5d+5,b4d+5a+5g+5,c+3b3c+4f4g+4a+4,F+3a+3c+4f4f+4g+4,c3g+3d+4d+5,c+2g+2f3b3c+4d+4g+4,c+3g+3b3c+4f4b4c+5d+5,b4d+5a+5g+5,c+3b3c+4f4g+4a+4,f+3a+3c+4f4f+4a+4,c+3c+5,f+2a+3f+4f+5,f+2c+3a+3e4f+4g+4c+5d+5,f+2c+3a+3e4f+4g+4c+5d+5,b1b2f+2d+4f+4c+5,g+1g+2f+3b3d+4f+4g+4a+4b4c+4,c+2g+2f3b3c+4d+4g+4,c+3g+3b3c+4f4b4c+5d+5,b4d+5a+5g+5,c+3b3c+4f4g+4a+4,f+3a+3c+4f4f+4a+4,c+3c+5,f+2a+3f+4f+5,f+2c+3a+3e4f+4g+4c+5d+5,f+2c+3a+3e4f+4g+4c+5d+5,b1b2f+2d+4f+4c+5,g+1g+2f+3b3d+4f+4g+4a+4b4c+4,c+2g+2f3b3c+4d+4g+4,c+3g+3b3c+4f4b4c+5d+5,b4d+5a+5g+5,c+3b3c+4f4g+4a+4,f+3a+3c+4f4f+4a+4,c+3c+5,f+2a+3f+4f+5";

実行結果はこちら。
短二度	83
長二度	23
短三度	72
長三度	74
完全四度	6
増四度	103
完全五度	27
短六度	48
長六度	32
短七度	38
長七度	64
オクターブ	13
エクセルでグラフ化して比率順でソートしてみると、
scriabin-05242015-2

こんなんなります。

バッハと並べてみましょう。
bach-scriabin-05242015-2

約170年の間に響きが大幅に変化したのが見て取れます。
バッハでは協和音程がほとんどを占めるのに対して、スクリャービンでは増四度や短二度などの不協和音程の比率がとても高くなっています。


いかがでしたでしょうか?
使用されている和音から、当然このような結果になる事は予測していましたが、実際に分析して眺めてみるとなかなか楽しいです。

和音構成音が増えていくと、音程間隔は指数関数的に増えていきます。
例えば最初に挙げた3和音の場合は音程間隔は3つだけでしたが、これが構成音数が5つになったりすると、音程間隔数は10個になっちゃいます。
cegb-chord
特に近現代の作品になってくると、プログラムで解析した方がかなり早く結果を得られるでしょう。


ここに来て解決できない問題が一つあります。
それはこのプログラムにどんな意味があるのか?ということ。

それは貴方次第です!(また丸投げ)