音階の演奏

さて、このプログラムでは音が半音階的にずれていくので、あまり音楽的ではない。

           
// myprogram1 - 音階の演奏
exec("initialize.sce");
for i=0:14
    s=i*fs/4;
    n=i;
    f=440*2^(n/12);
    x(w+s+1)=x(w+s+1)+a.*r.*sin(2*%pi*f*t)*0.1;
end
play(x);
          

そこでドレミの音階らしくしてみよう。

そのためには半音的な音を除いてピアノの白鍵の音だけを演奏すればよい。ピアノの白鍵と音の高さの関係は図のようになっている。

nを半音毎の音の高さとすると音名iとnと周波数の関係は以下のようになる。

ドレミ 音名 i n 計算式 周波数
A4 0 0 440×2^(0/12) 440
B4 1 2 440×2^(2/12) 493.8
C5 2 3 440×2^(3/12) 523.3
D5 3 5 440×2^(5/12) 587.3
E5 4 7 440×2^(7/12) 659.3
ファ F5 5 8 440×2^(8/12) 698.5
G5 6 10 440×2^(10/12) 784.0
A5 7 12 440×2^(12/12) 880
B5 8 14 440×2^(14/12) 987.8
C6 9 15 440×2^(15/12) 1046.5

scilabでは小数点以下を切り捨てるintという関数があり、たとえば int(3.2),int(3.7), int(3.0)はすべて3になる。intを用いるとこの表のiからnを計算で求めることができる。

intを使ってiからnを計算してみよう。

--- できれば自分で考えてみよう ---

以下のような式でiからnを計算して、ドレミの音階を鳴らすことができる。

           
// myprogram1 - 音階の演奏
exec("initialize.sce");
for i=0:14
    s=i*fs/4;
    n=int(i/7*12+.4);
    f=440*2^(n/12);
    x(w+s+1)=x(w+s+1)+a.*r.*sin(2*%pi*f*t)*0.1;
end
play(x);
          

 

ハ長調は2から始めればよいから、

           
// myprogram1 - 音階の演奏
exec("initialize.sce");
for i=0:14
    s=i*fs/4;
    n=int((i+2)/7*12+.4);
    f=440*2^(n/12);
    x(w+s+1)=x(w+s+1)+a.*r.*sin(2*%pi*f*t)*0.1;
end
play(x);
          

 

すこし詳しい説明

A4とかG5というのは、音名のアルファベット表記として国際的に使われている表記方法だ。ABCDEFGがピアノの白鍵の1オクターブに相当し、オクターブ毎に下から1,2,3,4という番号がついている。A1がピアノの最も低い鍵盤でA8はそこから7オクターブ上の音になる。

「音名・階名表記」『ウィキペディア日本語版』、
2010年5月24日 (月) 15:10 UTC、
URL http://ja.wikipedia.org/wiki/音名・階名表記

intを使ってiからnを計算する方法を自分で考えることはできただろうか?

音階の場合はiとnの関係はだいたい比例している。そしてiが7増える毎にnは12増えればよい。こうしたことから、まず

n=i/7*12

という式が元になりそうである。このままだと整数にならないので、ここでintを使って、

n=int(i/7*12)

としてみると、だいたいさそうだが、たとえばi=1でn=2となってほしいのだがint(1/7*12)は1になってしまう。

そこで、0.4を加えて

n=int(i/7*12+0.4)

iとnの関係と、i/7*12 および i/7*12+0.4の直線の式をグラフを方眼紙に書いて比較してみよう。