平均律の場合です。
二つのキーから 音程比の“うなり”を求めてみます。
キー番号 37と42(5度音程)の 4倍音と3倍音で計算します。
> getQbeat(37, 42, 4, 3) ans = 0.99430
function beat = getQbeat(key1, key2,\
ratio1, ratio2)
freq1 = getFrequ(key1)*ratio1;
freq2 = getFrequ(key2)*ratio2;
beat = freq2-freq1;
end
> getFrequ(37) ans = 220
function freq = getFrequ(key) freq = 440*2.^((key-49)/12); end
しかしそれでは 一々面倒なので 引数を キーの間隔(4度では 5、 オクターブでは 12など)に変更してみます。
まず Interval.mは キーの間隔から間隔・下と上の倍音数・音程名を求めます。
> [inte name] = Interval(5) inte = 5 4 3 name = P.4th
function [inter, intst] = Interval(inte)
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;
intst = '';
x = find(intn(:, 1) == inte);
if (x > 0)
inter = intn(x, 1:3);
intst = ratio{x};
end
end
では キー番号とキー間隔から“うなり”を求めます。
キー番号 37の 音程 5(4度)です。
> getQbeat1(37, 5) ans = 0.99430
function beat = getQbeat1(key,inte) ratio = Interval(inte); freq1 = getFrequ(key)*ratio(2); freq2 = getFrequ(key+inte)*ratio(3); beat = freq2-freq1; end
その getQbeat1.mを使って キー全体の“うなり”を求めてみます。
function dispQbeats(intes)
for inte = intes
ks = 1:88-inte;
beat = getQbeat1(ks,inte);
plot(beat,'@')
hold on
end
hold off
xlabel('Key')
ylabel('Beat')
end
5(4度)・7(5度)・12(オクターブ)の“うなり”を一緒に表示します。
> dispQbeats([5 7 12])
画面の表情を整える為に もう少し付け加えると
function dispQbeats1(intes)
n = 1;
for inte = intes
[intr ra] = Interval(inte);
ks = 1:88-inte;
beat = getQbeat1(ks,inte);
str = strcat(';', ra, ';@', getCP(n++));
plot(beat, str)
hold on
end
hold off
xlabel('Key')
ylabel('Beat')
grid on
legend(2)
axis([1 90])
end
> getCP(1) ans = b+
function cp = getCP(num)
colors = {'y', 'b', 'r', 'm', 'g', 'c'};
points = {'h', '+', 'x', '*', 'o', '^', 'v', '>', '<' ,'s', 'd', 'p'};
c = mod(num, length(colors))+1;
p = mod(num, length(points))+1;
cl = colors{c};
pt = points{p};
cp = strcat(cl, pt);
end # グラフで表示する点の形と色を決めます。
> dispQbeats1([5 7 12])
となります。