移調の説明において、
「音程をそのままに…」
と言った表現をよく見掛けることがありますが、
そもそも、
「具体的にどのような操作」
をしたら音程をそのままにできるのでしょうか?
例えばキーを1音上げるには、
「周波数を全体的に1音分高くする」
必要がありますが、周波数を1音分高くするには、
「周波数を全体的に9/8倍する」
必要があります(平均律なら2の6乗根≒1.12倍)。
この操作を相対音感的にプログラムで実現すると、
次のようなイメージになります。
var 基本周波数; //書き換え可
var 移動ド = [ ]; //音律(周波数比)を格納
~
基本周波数 = 原曲キー * 9/8;
for(i = 0; i < 移動ド.length; i++){
周波数[i] = 基本周波数 * 移動ド[i];
}
実際には自分で原曲キーを9/8倍するのではなく、
原曲キーを9/8倍した値が外部からセットされる、
いわゆる、
「基準音をもらう」
ことになりますが、ここでのポイントは、
基本周波数 = ○○;
の部分で基本周波数に原曲キーがセットされようが
移調されたキーがセットされようが、
「後続の処理は全く変わらない」
結果的に9/8倍すると言う操作が、
「ループの中で個々の音に対して毎回発生」
するのではなく、
「ループの前で基本周波数に対して1回発生」
するだけで済みます。
相対音感では移調の際、
「音程がそのままになるような操作、計算」
が行われていると言うよりも、もともと
「自然と音程がそのままになるような仕組み」
で音が取られている、だから最初に基本周波数に
移調されたキーをセットするだけであとは、
「原曲キーの時と同じ感覚」
で容易に音が取れるのではないでしょうか?
関連記事
(其の十一) (其の十二) (其の十三) (其の十四) (其の十五)