インハーモニシティのある場合です。
2キー間で 片方のキーを変化させた時の
倍音の“うなり”の変化を見てみます。
function dispIKbeats(key, inte) global Inha Cent KB; KB = 88; grade = 0.087; Inha = makeCurve(28, 0.55, grade); Cent = tuning_c(Inha, 1.0, grade); multiple = 1:5; # 倍音の範囲 widec = 30; # ±セント値の範囲 [ratio rstr]= Interval(inte); for m = multiple ra = [ratio(2:3)*m inte]; be = abs(getIKbeat(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
function beat = getIKbeat(key, ratio, cent) freq1 = getIFrequ(key, ratio(1)); freq2 = getIFrequ(key+ratio(3), ratio(2)); freq2 = ctof(freq2, cent); beat = freq2-freq1; end
function [inter, intst] = Interval(inte) # v0.2 intn = [0 1 1; 1 16 15; 2 9 8; 3 6 5; 4 5 4; 5 4 3; 6 7 5;\ 7 3 2; 8 8 5; 9 5 3; 10 7 4; 11 15 8; 12 2 1;\ 16 5 2; 19 3 1; 24 4 1; 28 5 1; 31 6 1; 36 8 1]; ratio = {'Unison' 'mi.2nd' 'Mj.2nd' 'mi.3rd' 'Mj.3rd' 'P.4th' 'Dim.5th'\ 'P.5th' 'mi.6th' 'Mj.6th' 'mi.7th' 'Mj.7th' 'Octave'\ '10th' '12th' '2octave' 'Oct.10th' 'Oct.12th' '3octave'}; inter = -1; # not intst = ''; x = find(intn(:, 1) == abs(inte)); if (x > 0) if (inte > 0) inter = intn(x, 1:3); else inter = [intn(x,1) intn(x,3) intn(x,2)]; end intst = ratio{x}; else usage("Interval([0-36]) -> [interval low high][name]"); end end
dispKbeats1.m と getKbeat.mの一部を改造して dispIKbeats.m と getIKbeat.mとして 他はそのまま使います。
Interval.m は キー間隔のマイナスに対応させました。
Tuningのシミュレーションを行ってから 2キー間の倍音の“うなり”の変化を見てみます。
> dispIKbeats(37, 5)
37Aキーの 4度上です。
> dispIKbeats(37, -7)
37Aキーの 5度下です。
> dispIKbeats(37, 12)
37Aキーのオクターブ上です。