( 変更履歴:
v0.2 [11/10/30] ctofの計算式を変更しました。)
平均律の場合です。
2キー間で 片方のキーを変化させた時の
倍音の“うなり”の変化を見てみます。
function dispKbeats(key,inte) multiple = 1:5; # 倍音の範囲 widec = 15; # ±セント値の範囲 ratio = Interval(inte); for m = multiple ra = [ratio(1:2)*m inte]; be = abs(getKbeat(key, ra, -widec:widec)); plot(-widec:widec, be, '-@') hold on end hold off xlabel('[cent]') ylabel('Beat') end
getKbeat.m はキー番号(37)の 間隔 5(4度)の 4:3の“うなり”を -5[cent]から 5[cent]までの 1[cent]間隔で求めます。
> getKbeat(37, [4 3 5], -5:5) ans = Columns 1 through 7: -1.546437 -1.038876 -0.531021 -0.022873 0.485568 0.994304 1.503333 Columns 8 through 11: 2.012656 2.522274 3.032186 3.542393
function beat = getKbeat(key,ratio,cent) freq1 = getFrequ(key) * ratio(1); freq2 = getFrequ(key + ratio(3)) * ratio(2); freq2 = ctof(freq2, cent); beat = freq2-freq1; end
ctof.m は セント値から周波数を求めます。
> ctof(220, 1200) ans = 440
220[Hz]の +1200[cent]は 1オクターブ上の 440[Hz]になります。
function f = ctof(freq, cent) f = freq.*2.^(cent/1200); end
上記の様に 3つのファイルに分けます。
キー番号(37)のキー間隔 5(4度)の 倍音の“うなり”の変化をみます。
> dispKbeats(37, 5)
さらに 画面に説明を加えます。
function dispKbeats1(key,inte) multiple = 1:5; # 倍音の範囲 widec = 15; # ±セント値の範囲 [ratio rstr]= Interval(inte); for m = multiple ra = [ratio(2:3)*m inte]; be = abs(getKbeat(key, ra, -widec:widec)); str = strcat(';P-', num2str(m), ';-@', getCP(m)); plot(-widec:widec, be, str) hold on end hold off title(rstr) xlabel('[cent]') ylabel('Beat') grid on end
-------ここまで-------
> dispKbeats1(37, 5)