いろいろな音を作る

scilabを使うと音を自由自在に操ることができる。今後さまざまなことを学ぶことで、どのようなことができるようになるか、実感してもらうため、いくつかの例を示そう。

1.UFO

stacksize(1e7);
fs=22050;
t=0:1/fs:2;
f400=sin(2*%pi*400*t);
f600=sin(2*%pi*600*t);
p2=(1+sin(2*%pi*4*t))* .5;
n2=(1-sin(2*%pi*4*t))* .5;
w=f400 .* p2 + f600 .* n2;
analyze(w,300,700,fs,2^15);
sound(w,fs);

scilabは万能シンセサイザーとして使うことができる。scilabと楽器の音を理解すれば、およそどんなへんな音でも合成することができる。

2.残響音

人工的に残響音を作ることもできる。

stacksize(1e7);
fs=22050;
t=0:1/fs:2;
a=100000;
f1=sin(2*%pi*1000*t);
f2=sin(2*%pi*1000*5/4*t);
f3=sin(2*%pi*1000*3/2*t) * 1.5;
p11=exp(-a*( t- 0.1)^2) .* f1;
p12=p11+exp(-a*(t-0.2)^2) .* f2;
p13=p12+exp(-a*(t-0.4)^2) .* f3;
p2=exp(-100000*(sin(log(20*t+1)*500+sin(t)))^2) .* exp(-t* 4.0);
w2=convol(p2,p13) * 0.3;
sound(w2,fs);

大きな空間の音場を感じさせる効果も数学的に理解することができる。

3.やっほー

yahoo.wavをダウンロードし,また「2 残響音」を実行してから実行してください。


x=loadwave("yahoo.wav");
w3=convol(p2,x) * 0.5;
sound([x,w3,x,w3,x,w3],fs);

声にエコーをかけるのも自由自在だ。

4.telephone

(「3. ヤッホー」の後に実行してください)

flt1=ffilt("bp",1000,0.07,0.12);
w4=convol(x ^ 3, flt1) * 20;
sound([x,w4,x,w4,x,w4],fs);

電話などの特徴ある音も、原理がわかっていえればごく簡単に合成することができる。

5. 宇宙人の歌


stacksize(1e7);
fs=44100;
r1 = 1;
r2 = 1;
for n=0:99;
    f1=440 * exp( int( 1 + 12 * sin( 2 * %pi * 0.12 * n )) * log(2) / 12);
    f2=440*2/3 * exp( int( 1 + 12 * sin( 2 * %pi * 0.025 * n )) * log(2) / 12);
    m=n * fs * .1;
    mm=1:fs*0.1;
    x1(m+mm)=r1 * exp(2 * %pi * %i * mm / fs * f1);
    r1 = x1(m+fs*0.1);
    x2(m+mm)=r2 * exp(2 * %pi * %i * mm / fs * f2);
    r2 = x2(m+fs*0.1);
end;
x3=(real(x1)+real(x2))*0.3;
sound(x3,fs);

 

6.もう少しきれいな音


// ステレオ!(ちょとむずかしいい)
fs=44100; w=0:(fs*4-1);t=w/fs;
x=[0,0]'*zeros(1:20*fs);
for ss=0:4
    for v=1:8
        a=(1-exp(-t/(100^(-1-rand(1))))).*exp(-t/(.5+rand(1)))*.2; 
        m1=rand(1)*1.0;m2=rand(2)*1.0;
        b1=modulo(0:63,8)+rand(1)*4;
        b2=max(int(modulo(b1 .^ 2,5)-1),0)
        for b=0:15
            c1=modulo(b,2)+1;
            p=int((b+ss*20)*fs/6)+w+1;
            j=b-int(b/4/v)*4*v;
            k=int(j/v)*(2+v)-v*7+14;
            n=int(k/7*12+ss*3+12 + 0.4)-ss*5;
            f=440*2^(n/12);
            m=sin(2*%pi*f*t).*sin(10*t*m1) .* v .* m2;
            x(c1,p)=x(c1,p)+a.*sin(2*%pi*f*t+m) .* 0.2 .* b2(b+1);
        end
    end
end
//再生
playsnd(x,fs);

 

さらに工夫すれば、さらに様々な音色やメロディをプログラムとして奏でることができる。

本講義の目的ではないが、コンピュータによる信号処理に習熟すればどんなことができるか、ということを示す一例だ。こうしたプログラムを書いてみるのも楽しいので、少し時間を使ってプログラムの変更を試みてほしい。