本日は短めです。
ただマニアックすぎるので消すかもしれません。
前回の記事はこちら。
おまけはこちら。
本体のプログラムを更新中ですが、フォルマントフイルター実装のために少し苦戦しています。ここで少し脱線しましょう。
今日のものは、こちらの記事にインスパイアーされたものです。
ソルフェジオ周波数の前に、まずは前回やっていないものから2つのものをやります。
ホールトーンスケールは実体としては2つしか存在しません。G-C#系(仮名)とC-F#系(仮名)です。下図、上段の左が前者、右が後者です。
これが意図していることの1つは、短調ドミナントとその裏コードの合成の亜種という考え方です。これにしたがうと、ホールトーンスケールはドミナントの一種と考えることができます。解決先は、根音にもよりますが、もう一つのホールトーンをルートにもつ主に短調系と見なせるでしょう。下図の9小節以降が参考になるでしょう。
前のプログラムに合成してみました。
本来、ディミニッシュをスケールを考える場合は、ハーモニック・マイナーP5ビロウ、スパニッシュなどいろいろなドミナントスケールの派生も考慮した方がいいのですが、今回、説明はコンディミ (Combination of Diminish) のみとし、演奏はただのディミニッシュのみとしました。いずれの場合も、音楽の根底的緊張度にもよりますが、通常はドミナント系とみなして良いでしょう。
コンディミも短調のドミナントとみなすことができます。特徴的なのは、ルートの同ディミニッシュ系列のどのコンディミも同じ構成音ということです。たとえば、G-CoDim = B♭-CoDim = D♭-CoDim = E-CoDim です。図1の下段が参考です。
これを応用すると、G7の代替として、E7、D♭7、B♭7を使用できる、という考えることができます。図2の上段です。なんたらの十字架理論、なんてよばれてたりしたような(忘れました)。逆に考えると、G7の解決先として、C系、E♭系、F#系、A系を選択できるという考え方もできます。
聞けば分かりますが、ただのDim7は要は「ドラクエの洞窟?」です。
なお、同コンディミ系コードの、G7+9 ⇒ A♭7+9 的進行は「緊急速報」です。
再掲します。
こちらについては今回はじめて知りました。音の周波数要素は、相対的なものと絶対的なものがありますが、これは絶対的な要素が強いものといえそうです。
絶対的要素というと大げさですが、この類似はフォルマントや人声、つまり初音ミクのようなものを想像するといいかもしれません。音のイメージは、倍音構成など発振に関わる要素と、固有フォルマント(固定的周波数のピークをもつ)など共鳴やバディに関わる要素の影響を受けます。
これは個人的主観ですが、絶対音感を持っている人をすごいと思う方は、自分自身の聴力の高さを認識してほしいと思います。「誰が」「どのような感情で」「どの言葉を」「さらに高さを確認して」、人声を聞き分けているのです。ミラクルではないでしょうか。記述はできなくても「分かる」わけですから。
ここで音の高さや倍音構成以外で影響のある部分には、フォルマントが関わってきます。ホーミーなど移動フォルマントというものもありますが、固定フォルマントの聴覚上の心理的影響についてはよく知られているところではあるので、ソルフェジオ周波数については興味深いところがあります。
ノイズを組み入れながら作ってみました。
Python プログラムの一部です。
frq_slf のリスト部が、今回使用したソルフェジオ周波数です。
import math
import matplotlib.pyplot as plt
import numpy as np
import random
import simpleaudio as sa
from scipy import fftpack
PI = np.pi
hz = 174
rate = 44100
fm = 50
ratio = 1 - 0.010
noise = 0.15
sine_wave = [math.sin(x*hz*PI*2/rate) for x in range(rate)]
frq_slf = [174, 285, 396, 417, 528, 639, 741, 852, 936]
fm_wave = [[math.sin((
math.sin((x+
random.random()*noise**2*rate/f+(
math.sin(x*(f*(1+0.1*(random.uniform(-1, 1)*(noise**2))))*PI*2/rate)
*(((1-noise)**0.5)+(random.random()*(noise**0.5))))
*fm/100*(rate-x+1)/rate
)*f*ratio*PI*2/rate)
*fm/100*(((rate-x+1)/rate)*(1+0.1*(random.uniform(-1, 1)*(noise**3))))
)*f*PI*2/rate)
for x in range(rate)] for f in frq_slf]
# normalize and adjust
fm_wave = [np.multiply(fm_wave[i], (32767 / ((np.max(np.abs(fm_wave[i])) + 1)*(5+(i/3)))))
for i in range(len(frq_slf))]
音自体は面白いものになったかなと思いますが、調整の難しいシンセデザインやノーマライズ前提なのは残念な結果になりました。あ、でも random をたくさん入れるのは個人的に好きです。なお、今回は特殊なFMを使用しました。
なんだかんだ、長くなりましたね。本日はここまでです。
異世界へお越しいただき、ありがとうございました🍹