使用matlab制作音乐

一.一些音乐基础

1.认识简谱

简谱中最重要的信息就是曲调、节拍,位于简谱左上角,

如图中的1=G,是以G调为基准频率,即1对应G调,其他常见的还有1=C等,

4/4为一节4个1/4拍,一节则为一个短竖线隔开的,相似的还有3/4排,1/2拍等。

 对应数字是在以1为基频下的不同音频

0拍表示占位,不出声

数字左上角带#为半个音阶

数字上下方的点代表增加或者降低一个八度,也有两个点的情况,对应降低两个八度。

在4/4拍的谱中,一节有四个1/4拍组成,每个1/4拍为1秒,单个数字对应一个1/4拍,数字下方一个下划线表示这个音占1/8拍,两个表示1/16拍,以此类推...在一节中排数和总是等于这个谱对应的拍数,上例为4/4拍,即4秒。

数字右边的点表示这个音延长其1/2拍,如1·表示3/8拍,数字后面的-表示再延长1/4拍。

数字间的上连接符号表示过渡平稳,连贯,一般在演唱时需要考虑。

2.基本曲调频率

根据十二平均律计算,得出下面不同曲调对应频率

 表示以这个频率振动发出声音,产生的调则为对应音调。

值得注意的是,一个八度音对应是倍频关系。这也是由于十二平均率计算规律。

根据此可确定出每个数字对应频率

在G调基础上对应频率

g0表示占位,g1_表示降调,g2_5表示#2

g0=0;2
g1_=195.998;
g2_=220.000;
g3_=246.942;
g4_=261.626;
g5_=293.665;
g6_=329.628;
g7_=349.228;
g1=391.995;
g2=440;
g2_5=415.305;
g3=493.883;
g4=523.251;
g4_5=554.365;
g5=587.330;
g5_5=622.254;
g6=659.255;
g7=698.456;
g33=987.767;

二.使用matlab产生声音

1.乐音频率,抽样频率 ,节拍

使用如220hz为频率的正弦波,持续一段时间

这个波的频率为乐音的频率,取一个个抽样的点的频率表示抽样频率,持续的时间则为节拍的时间

抽样频率一般要远大于发音频率,保证不失真。

 因此我们可以创建一个频率为220,持续时间为1s,抽样频率为8000的一段矩阵

fs=8000;
f=220;
x=linspace(0,1,fs);
y=sin(2*pi*f*x);
plot(x,y);
sound(y,fs);

可以看到产生了频率为220hz,持续时间为1s,采样频率为8000的一段波。

只需要不断改变频率和节拍(持续时间),一个简单的音乐就可以播放了。

2.播放一段音乐

f1=[g0 g0 g0 g5_];
t1=[1 1 1 1];
f2=[g3 g2_5 g3 g6];
t2=[1.5 0.25 0.75 1.5];
f3=[g5 g3 g6_];
t3=[0.75 2.25 1];
f45=[g1 g2 g3 g5 g4_5 g5 g5_5 g5];
t45=[2 0.75 1.75 0.5 0.5 0.5 1.5 0.5];
f67=[g6 g33 g0];
t67=[1.5 4.5 2];
f0=[f1 f2 f3 f45 f67];
t0=[t1 t2 t3 t45 t67];
for i=1:size(f0,2)
    x=linspace(0,t0(i),8000*t0(i));
    y=sin(2*pi*f0(i)*x);
    sound(y,8000);
    pause(t0(i));
end

 我们用两个一维矩阵储存音调和节拍信息,要求必须一一对应!否则播放矩阵对不上。

sound函数播放,pause函数延迟一段时间。

3.给音乐加包络

 可以听到这一段音乐中在中间过渡的时候总是有杂音,影响音乐品质,因此我们这是由于相位不连续造成的,我们的解决方法是给声音加包络

关于包络信号讲解(10条消息) 利用包络函数优化MATLAB中sound函数的发声【matlab调音_2】_歪卜巴比的博客-CSDN博客_钢琴包络函数

其中最后的x/exp(-kx/rhythm)型包络函数表达形式有误或不完整。

这里进行修改

 

 上式为完整的包络函数,其中t代表节拍时间。

修改后的包络函数解决了不同节拍时长和k值导致不同音量大小的问题

 其形状为

 

 很明显,这使得声音更加圆润,对比传统指数包络,有一个先上升的过程,能保证前一个音符能量消失后,才发出后续音符,这样就能有效消除,音符交替时的轻微杂音

这里k值的大小决定了下降的快慢,根据不同谱子进行调整,一般来说,k值越大声音越清脆。 

4.完整代码

clc;clear all
fs=8000;
k=10;
k0=5;
g0=0;
g1_=195.998;
g2_=220.000;
g3_=246.942;
g4_=261.626;
g5_=293.665;
g6_=329.628;
g7_=349.228;
g1=391.995;
g2=440;
g2_5=415.305;
g3=493.883;
g4=523.251;
g4_5=554.365;
g5=587.330;
g5_5=622.254;
g6=659.255;
g7=698.456;
g33=987.767;
%前奏
f1=[g0 g0 g0 g5_];
t1=[1 1 1 1];
f2=[g3 g2_5 g3 g6];
t2=[1.5 0.25 0.75 1.5];
f3=[g5 g3 g6_];
t3=[0.75 2.25 1];
f45=[g1 g2 g3 g5 g4_5 g5 g5_5 g5];
t45=[2 0.75 1.75 0.5 0.5 0.5 1.5 0.5];
f67=[g6 g33 g0];
t67=[1.5 4.5 2];

f0=[f1 f2 f3 f45 f67];
t0=[t1 t2 t3 t45 t67];
d=0.2;
for n=1:size(f0,2)
    x=linspace(0,t0(n),t0(n)*fs);
    if n==1
        m0=d*exp(1)*k0*x.*exp((-k0/t0(n))*x).*sin(2*pi*f0(n)*x);
        %m=k*x.*exp(-k*x).*sin(2*pi*f0(n)*x);
        %m0=exp(-k0*x).*sin(2*pi*f0(n)*x); 
    else 
        if n==size(f0,2)-1
            m0=[m0 d*exp(1)*2/t0(n)*x.*exp((-4/t0(n))*x).*sin(2*pi*f0(n)*x)]; 
        else
            m0=[m0 d*exp(1)*k0/t0(n)*x.*exp((-k0/t0(n))*x).*sin(2*pi*f0(n)*x)];
            %m=[m k*x.*exp(-k*x).*sin(2*pi*f0(n)*x)];
            %m0=[m0 exp(-k0*x).*sin(2*pi*f0(n)*x)];
        end
    end
end
sound(m0,fs*2)
plot(linspace(0,sum(t0),sum(t0)*fs),m0)
pause(sum(t0)/2-2)
%主调
f7=[g0 g0 g0 g5_ g6_ g1];
t7=[1 1 0.5 0.5 0.5 0.5];
f8=[g5 g3 g0 g5 g2 g1];
t8=[0.5 1.5 0.5 0.5 0.5 0.5];
f9=[g3 g2 g0 g5 g2 g1];
t9=[0.5 1.5 0.5 0.5 0.5 0.5];
f10=[g2 g2 g0 g3 g1 g6_];
t10=[0.5 1.5 0.5 0.5 0.5 0.5];
f11=[g2 g1 g0 g5_ g6_ g1];
t11=[0.5 1.5 0.5 0.5 0.5 0.5];
f12=[g5 g3 g0 g5 g2 g1];
t12=[0.5 1.5 0.5 0.5 0.5 0.5];
f13=[g3 g2 g0 g5 g2 g1];
t13=[0.5 1.5 0.5 0.5 0.5 0.5];
f14=[g3 g2 g0 g3 g6_ g1];
t14=[0.5 1.5 0.5 0.5 0.5 0.5];
f15=[g1 g1 g0 g0 g3 g4];
t15=[0.5 1.5 1 0.5 0.25 0.25];
f16=[g5 g5 g3 g5 g5 g5 g3 g5 g6 g5 g5];
t16=[0.5 0.25 0.25 0.5 0.5 0.25 0.25 0.25 0.25 0.5 0.5];
f17=[g5 g5 g3 g5 g5 g5 g3 g5 g6 g5 g5];
t17=[0.5 0.25 0.25 0.5 0.5 0.25 0.25 0.25 0.25 0.5 0.5];
f18=[g5 g3 g2 g1 g5_ g1 g1];
t18=[0.5 0.5 0.5 0.5 0.5 0.5 1];
f19=[g3 g3 g2 g3 g2 g1 g3 g4];
t19=[0.5 0.25 0.25 0.5 0.5 1.5 0.25 0.25];
f20=[g5 g5 g3 g5 g5 g5 g3 g5 g6 g5 g5];
t20=[0.5 0.25 0.25 0.5 0.5 0.25 0.25 0.25 0.25 0.5 0.5];
f21=[g5 g5 g3 g5 g5 g5 g3 g5 g6 g5 g5];
t21=[0.5 0.25 0.25 0.5 0.5 0.25 0.25 0.25 0.25 0.5 0.5];
f22=[g5 g3 g2 g1 g5_ g1 g1];
t22=[0.5 0.5 0.5 0.5 0.5 0.5 1];
f23=[g3 g3 g2 g3 g2 g1];
t23=[0.5 0.25 0.25 0.5 0.5 2];
f24=[g3 g3 g2 g3 g2 g3 g3 g2 g3 g2];
t24=[0.5 0.25 0.25 0.5 0.5 0.5 0.25 0.25 0.5 0.5];
f25=[g3 g3 g2 g3 g2 g1];
t25=[0.5 0.25 0.25 0.5 0.5 2];
f26=[g3 g3 g2 g3 g2 g3 g3 g2 g3 g2];
t26=[0.5 0.25 0.25 0.5 0.5 0.5 0.25 0.25 0.5 0.5];
f27=[g3 g3 g2 g3 g2 g1 g0 g3 g4];
t27=[0.5 0.25 0.25 0.5 0.5 1 0.5 0.25 0.25];
f28=[g5 g5 g3 g5 g5 g5 g3 g5 g6 g5 g5];
t28=[0.5 0.25 0.25 0.5 0.5 0.25 0.25 0.25 0.25 0.5 0.5];
f29=[g5 g5 g3 g5 g5 g5 g3 g5 g6 g5 g5];
t29=[0.5 0.25 0.25 0.5 0.5 0.25 0.25 0.25 0.25 0.5 0.5];
f30=[g5 g5 g3 g5 g5 g5 g3 g5 g6 g5 g5];
t30=[0.5 0.25 0.25 0.5 0.5 0.25 0.25 0.25 0.25 0.5 0.5];
f31=[g5 g5 g3 g5 g5 g5 g3 g5 g6 g5 g5];
t31=[0.5 0.25 0.25 0.5 0.5 0.25 0.25 0.25 0.25 0.5 0.5];
f32=[g5 g5 g3 g5 g5 g5 g3 g5 g6 g5 g5];
t32=[0.5 0.25 0.25 0.5 0.5 0.25 0.25 0.25 0.25 0.5 0.5];
f33=[g5 g5 g3 g5 g5 g5 g3 g5 g6 g5 g5];
t33=[0.5 0.25 0.25 0.5 0.5 0.25 0.25 0.25 0.25 0.5 0.5];
f34=[g5 g5 g3 g5 g5 g5 g3 g5 g6 g5 g5];
t34=[0.5 0.25 0.25 0.5 0.5 0.25 0.25 0.25 0.25 0.5 0.5];
f35=[g3 g5 g3 g2 g1 g5_ g1 g1 g1 g2];
t35=[0.125 0.375 0.5 0.5 0.5 0.5 0.5 0.5 0.25 0.25];
f36=[g3 g3 g2 g3 g3 g2 g3 g3 g2 g3 g4 g3 g2];
t36=[0.5 0.25 0.25 0.5 0.25 0.25 0.5 0.25 0.25 0.25 0.25 0.25 0.25];
f37=[g1 g1 g2 g1 g7_ g6_ g0 g2 g3];
t37=[0.5 0.25 0.25 0.5 0.5 1 0.5 0.25 0.25];
f38=[g4 g4 g3 g4 g4 g3 g4 g4 g3 g4 g5 g4 g3];
t38=[0.5 0.25 0.25 0.5 0.25 0.25 0.5 0.25 0.25 0.25 0.25 0.25 0.25];
f39=[g2 g2 g1 g7_ g1 g2 g5_ g1 g2];
t39=[0.5 0.25 0.25 0.5 0.5 0.5 0.5 0.5 0.5];
f40=[g3 g3 g2 g3 g3 g2 g3 g3 g2 g3 g4 g3 g2];
t40=[0.5 0.25 0.25 0.5 0.25 0.25 0.5 0.25 0.25 0.25 0.25 0.25 0.25];
f41=[g1 g1 g2 g1 g7_ g6_ g0 g2 g3];
t41=[0.5 0.25 0.25 0.5 0.5 1 0.5 0.25 0.25];
f42=[g4 g4 g3 g4 g4 g3 g4 g4 g3 g4 g5 g4 g3];
t42=[0.5 0.25 0.25 0.5 0.25 0.25 0.5 0.25 0.25 0.25 0.25 0.25 0.25];
f43=[g5 g3 g2 g1 g5_ g1 g1];
t43=[0.5 0.5 0.5 0.5 0.5 0.5 1];

f=[f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19 f20 f21 f22 f23 f24 f25 f26 f27 f28 f29 f30 f31 f32 f33 f34 f35 f36 f37 f38 f39 f40 f41 f42 f43];
t=[t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25 t26 t27 t28 t29 t30 t31 t32 t33 t34 t35 t36 t37 t38 t39 t40 t41 t42 t43];

for n=1:size(f,2)
    x=linspace(0,t(n),t(n)*fs);
    if n==1
        m=exp(1)*k/t(n)*x.*exp((-k/t(n))*x).*sin(2*pi*f(n)*x);
        %m=k*x.*exp(-k*x).*sin(2*pi*f(n)*x);
        %m=exp(-k*x).*sin(2*pi*f(n)*x);
    else
        m=[m exp(1)*k/t(n)*x.*exp((-k/t(n))*x).*sin(2*pi*f(n)*x)];
        %m=[m k*x.*exp(-k*x).*sin(2*pi*f(n)*x)];
        %m=[m exp(-k*x).*sin(2*pi*f(n)*x)];
    end
end
sound(m,fs*2)

猜你喜欢

转载自blog.csdn.net/npu_noj/article/details/128515299