第5回 Beats (平均律) #5


平均律の場合です。
二つのキーから 音程比の“うなり”を求めてみます。
キー番号 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])
dispQbeat octave

画面の表情を整える為に もう少し付け加えると

-------ここから-------
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])
dispQbeat1 octave

となります。


Last modified: 1月 03日 火 12:43:14 2023 JST