- 聲音模型
- 音色
- 簡易電子琴
用MATLAB遍了一個小程式,可以彈奏一些簡單的曲子,演示視頻:
Bilbili視頻:MATLAB 撰寫簡易電子琴
一個電子琴基本的要求應當是能按鍵盤命令發出特定音高和音色的聲音,鍵盤命令我用的是input 函式,缺點是每按一個鍵要回車使得彈奏很難連續,但目前沒想到合適的替代方法;而聲音的音高和音色則分別基頻和泛頻決定
聲音模型
聲音本質是機械振動產生的波通過介質傳播至人耳,這一振動可由函式
x
(
t
)
x(t)
x(t)表示,離散化后即為向量
x
n
x_n
xn?以及采樣率
f
s
f_s
fs?,且滿足
x
n
=
x
(
t
n
)
,
t
n
=
n
/
f
s
x_n=x(t_n), t_n=n/f_s
xn?=x(tn?),tn?=n/fs?.
而MATLAB 中可用sound(x,fs)函式發出一段聲音,如下面的代碼運行后將發出一段白噪聲:
x=normrnd(0,1,1,10000);
fs=5000;
sound(x,fs)
琴弦則近似以如下方式振動(數學物理方法等教材有介紹):
x
(
t
)
=
∑
n
=
1
N
A
n
s
i
n
(
2
π
f
n
t
+
?
n
)
x(t)=\sum_{n=1}^{N}A_nsin(2\pi f_nt+\phi_n)
x(t)=n=1∑N?An?sin(2πfn?t+?n?)
其中基頻
f
1
f_1
f1? 決定聲音的音高,
f
n
,
n
>
1
f_n, n>1
fn?,n>1決定音色,基頻與音階的部分對應表如下(沒有加升降音):
E4 329.63
F4 349.23
G4 392
A4 440
B4 493.88
C5 523.25
D5 587.33
E5 659.25
F5 698.46
G5 783.99
A5 880
B5 987.77
C6 1046.5
D6 1174.66
E6 1318.51
F6 1396.91
G6 1567.98
A6 1760
B6 1975.53
于是,在MATLAB中發出A4音的代碼如下:
fs=5000;
t=0:1/fs:1;
f=440;
x=sin(2*pi*f*t);
sound(x,fs)
音色
除基頻
f
1
f_1
f1?外,還有由高階模式振動產生的倍頻,各本征頻頻的振幅
A
n
A_n
An?以及相位
?
n
\phi_n
?n?確定了聲音的音色,簡單起見,假定
?
0
=
0
\phi_0=0
?0?=0,并加入一個衰減:
x
(
t
)
=
e
?
t
2
/
2
t
0
2
∑
n
=
1
N
A
n
s
i
n
(
2
π
f
n
t
)
x(t)=e^{-t^2/2t_0^2}\sum_{n=1}^{N}A_nsin(2\pi f_nt)
x(t)=e?t2/2t02?n=1∑N?An?sin(2πfn?t)
從網上找到一段任意音高的鋼琴音,傅里葉變換后頻譜如下:
記錄下前八個本征頻率對應的振幅
A
n
A_n
An?如下:
645.4
183.7
30
20
20
20
20
56
簡易電子琴
撰寫函式piano(f,amp),其中f 為基頻,amp為最低的數個本征頻率對應的振幅,其中f通過查找鍵盤輸入的音階對應的頻率得到,再回圈運行此函式即可
代碼如下:
Amp=xlsread('Amp.xlsx');
Amp=1/max(Amp)*Amp;
n=length(Amp);
f=xlsread('frequency.xlsx','B:B');
%To input "exit" to exit
IN=0;
or=1;
while 1
IN=input('','s');
switch IN
case 's'
or=1;
case 'a'
or=0;
case 'd'
or=2;
case '1'
piano(f(or*7+1),Amp);
case '2'
piano(f(or*7+2),Amp);
case '3'
piano(f(or*7+3),Amp);
case '4'
piano(f(or*7+4),Amp);
case '5'
piano(f(or*7+5),Amp);
case '6'
piano(f(or*7+6),Amp);
case '7'
piano(f(or*7+7),Amp);
case 'exit'
break
otherwise
disp('Again');
end
end
function p=piano(f,amp)
fs=32000;
t=0:1/fs:1;
x=0*t;
n=length(amp);
for i=1:n
x=x+amp(i)*sin(2*pi*f*i*t);
end
x=x.*exp(-1/(2*0.3^2)*t.^2);
sound(x,fs)
p=1;
end
這一電子琴小程式是寫著玩的,非常簡陋,一個較大的問題就是彈奏很難連續,如果有改進建議歡迎留言
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/257716.html
標籤:其他
