前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >matlab演奏《雨碎江南》

matlab演奏《雨碎江南》

作者头像
巴山学长
发布2019-07-15 15:17:23
4120
发布2019-07-15 15:17:23
举报
文章被收录于专栏:巴山学长巴山学长

先请大家听一下上面这首曲子,演奏的是著名的古风乐曲《雨碎江南》。你是否已经融入了那一场夜雨,感受到了雨水的清凉。大家一定想问:用的是什么乐器?

回答:matlab。

下面,我就带大家用matlab演奏这一曲“雨碎江南”。首先我们看一看这首曲子的简谱。如下所示

我截取了一部分作为我们的例子,有一些音乐基础的同学都能读懂简谱。1234567六个数字分别代表7个音阶。这7个音阶按音调分为高音,低音,中音。按照长短可以分为四分音符,八分音符,16分音符。我们要做的就是用matlab表示出这些音符。然后连接成句子。最后连接成段落。然后用sound函数演奏出来。

首先我们都知道,声音在电脑中存储实际上是用数字信号存储的。就像下面的图形一样。

这是《雨碎江南》笛子演奏的波形图。实际上都是【-1,1】之间的数字。matlab读取的音乐就是这些数据,然后可以演奏出来。

我们设定中音的抽样率为8000,那么低音就是16000。比中音低一个8度高音就是4000.比中音高一个8度。以下代表的是时间长度,即每个音持续的时间.t2表示二分音符,t4表示四分音符,t8表示八分音符,t16表示十六分音符。持续时间呈指数增长。

代码语言:javascript
复制
%时间长度,分别代表演奏不同长度的时间。
t2=[0:1/f1:1];
t4=[0:1/f1:0.5];
t8=[0:1/f1:0.25];
t16=[0:1/f1:0.125];

我们用这样的数据表示1234567这些音符。如1(中音do)。这是一个四分音符的中音。

代码语言:javascript
复制
%各个音阶对应的频率
fre1=392;
fre2=440;
fre3=493.88;
fre4=523.25;
fre5=587.33;
fre6=659.25;
fre7=698.45;

表示成m14=sin(2*pi*fre1*t4);然而,这样不加任何处理的信号听起来非常刺耳。没有音乐的美感。而且音符与音符之间不够衔接。音符转换时非常卡。为了解决这个问题我们增加了一个衰减函数函数exp(-2*t4)对这个音符进行处理,这样,得到的函数就更连续,也有一个衰减的分量。请大家对比一下下面两个图,一个是又衰减函数的1,另一个是没有衰减函数的1。区别相当明显。

按照同样的方式,我们得到了所有音阶的表示方法,然后,我们对照简谱。一句一句输入。用矩阵存储起来,最后,利用sound函数播放。大功告成。

下面是全部的源代码

代码语言:javascript
复制
f1=8000;
f2=16000;
f3=4000;
%时间长度,分别代表演奏不同长度的时间。
t2=[0:1/f1:1];
t4=[0:1/f1:0.5];
t8=[0:1/f1:0.25];
t16=[0:1/f1:0.125];
%各个音阶对应的频率
fre1=392;
fre2=440;
fre3=493.88;
fre4=523.25;
fre5=587.33;
fre6=659.25;
fre7=698.45;
%计算得到每一个音,这些是中音
m0=0;
%m54代表中音5的4拍音阶,这一部分是中音
m54=exp(-2*t4).*sin(2*pi*fre5*t4);
m52=exp(-2*t2).*sin(2*pi*fre5*t2);
m58=exp(-2*t8).*sin(2*pi*fre5*t8);
m516=exp(-2*t16).*sin(2*pi*fre5*t16);

m14=exp(-2*t4).*sin(2*pi*fre1*t4);
m12=exp(-1*t2).*sin(2*pi*fre1*t2);

m24=exp(-2*t4).*sin(2*pi*fre2*t4);
m22=exp(-2*t2).*sin(2*pi*fre2*t2);

m34=exp(-2*t4).*sin(2*pi*fre3*t4);
m32=exp(-2*t2).*sin(2*pi*fre3*t2);

m44=exp(-2*t4).*sin(2*pi*fre4*t4);
m42=exp(-2*t2).*sin(2*pi*fre4*t2);

m54=exp(-2*t4).*sin(2*pi*fre5*t4);
m52=exp(-2*t2).*sin(2*pi*fre5*t2);

m64=exp(-2*t4).*sin(2*pi*fre6*t4);
m62=exp(-2*t2).*sin(2*pi*fre6*t2);

m74=exp(-2*t4).*sin(2*pi*fre7*t4);
m72=exp(-2*t2).*sin(2*pi*fre7*t2);

m48=exp(-4*t8).*sin(2*pi*fre4*t8);
m38=exp(-4*t8).*sin(2*pi*fre3*t8);
m28=exp(-4*t8).*sin(2*pi*fre2*t8);
m18=exp(-4*t8).*sin(2*pi*fre1*t8);
m58=exp(-4*t8).*sin(2*pi*fre5*t8);
m68=exp(-4*t8).*sin(2*pi*fre6*t8);
m78=exp(-4*t8).*sin(2*pi*fre7*t8);


%以下是低音
%低音时间长度,分别代表演奏不同长度的时间。
tl2=[0:1/f2:0.5];
tl4=[0:1/f2:0.25];
tl8=[0:1/f2:0.125];
tl16=[0:1/f2:0.0625];

%计算得到每一个音,这些是低音
m0=0;
%m54代表中音5的4拍音阶,这一部分是低音
l54=exp(-2*tl4).*sin(2*pi*fre5*tl4);
l52=exp(-2*tl2).*sin(2*pi*fre5*tl2);
l58=exp(-2*tl8).*sin(2*pi*fre5*tl8);
l516=exp(-2*tl16).*sin(2*pi*fre5*tl16);

l14=exp(-2*tl4).*sin(2*pi*fre1*tl4);
l12=exp(-1*tl2).*sin(2*pi*fre1*tl2);

l24=exp(-2*tl4).*sin(2*pi*fre2*tl4);
l22=exp(-2*tl2).*sin(2*pi*fre2*tl2);

l34=exp(-2*tl4).*sin(2*pi*fre3*tl4);
l32=exp(-2*tl2).*sin(2*pi*fre3*tl2);

l44=exp(-2*tl4).*sin(2*pi*fre4*tl4);
l42=exp(-2*tl2).*sin(2*pi*fre4*tl2);

l54=exp(-2*tl4).*sin(2*pi*fre5*tl4);
l52=exp(-2*tl2).*sin(2*pi*fre5*tl2);

l64=exp(-2*tl4).*sin(2*pi*fre6*tl4);
l62=exp(-2*tl2).*sin(2*pi*fre6*tl2);

l74=exp(-2*tl4).*sin(2*pi*fre7*tl4);
l72=exp(-2*tl2).*sin(2*pi*fre7*tl2);

l48=exp(-4*tl8).*sin(2*pi*fre4*tl8);
l38=exp(-4*tl8).*sin(2*pi*fre3*tl8);
l28=exp(-4*tl8).*sin(2*pi*fre2*tl8);
l18=exp(-4*tl8).*sin(2*pi*fre1*tl8);
l58=exp(-4*tl8).*sin(2*pi*fre5*tl8);
l68=exp(-4*tl8).*sin(2*pi*fre6*tl8);
l78=exp(-4*tl8).*sin(2*pi*fre7*tl8);


f1=8000;
f2=16000;
f3=4000;
%时间长度,分别代表演奏不同长度的时间。
t22=[0:1/f3:2];
t24=[0:1/f3:1];
t28=[0:1/f3:0.5];
t26=[0:1/f3:0.25];
%各个音阶对应的频率
fre1=392;
fre2=440;
fre3=493.88;
fre4=523.25;
fre5=587.33;
fre6=659.25;
fre7=698.45;
%计算得到每一个音,这些是高音
m0=0;
%m54代表高音5的4拍音阶,这一部分是高音
h54=exp(-2*t24).*sin(2*pi*fre5*t24);
h52=exp(-2*t22).*sin(2*pi*fre5*t22);
h58=exp(-2*t28).*sin(2*pi*fre5*t28);
h516=exp(-2*t26).*sin(2*pi*fre5*t26);

h14=exp(-2*t24).*sin(2*pi*fre1*t24);
h12=exp(-1*t22).*sin(2*pi*fre1*t22);

h24=exp(-2*t24).*sin(2*pi*fre2*t24);
h22=exp(-2*t22).*sin(2*pi*fre2*t22);

h34=exp(-2*t24).*sin(2*pi*fre3*t24);
h32=exp(-2*t22).*sin(2*pi*fre3*t22);

h44=exp(-2*t24).*sin(2*pi*fre4*t24);
h42=exp(-2*t22).*sin(2*pi*fre4*t22);

h54=exp(-2*t24).*sin(2*pi*fre5*t24);
h52=exp(-2*t22).*sin(2*pi*fre5*t22);

h64=exp(-2*t24).*sin(2*pi*fre6*t24);
h62=exp(-2*t22).*sin(2*pi*fre6*t22);

h74=exp(-2*t24).*sin(2*pi*fre7*t24);
h72=exp(-2*t22).*sin(2*pi*fre7*t22);

h48=exp(-4*t28).*sin(2*pi*fre4*t28);
h38=exp(-4*t28).*sin(2*pi*fre3*t28);
h28=exp(-4*t28).*sin(2*pi*fre2*t28);
h18=exp(-4*t28).*sin(2*pi*fre1*t28);
h58=exp(-4*t28).*sin(2*pi*fre5*t28);
h68=exp(-4*t28).*sin(2*pi*fre6*t28);
h78=exp(-4*t28).*sin(2*pi*fre7*t28);

m1=[l64 l68 m38 m34 m28 m18 m24 m28  m38 m28 l74 l68 l58];
m2=[l64 l68 m18 m28 m38 m58 m68 m58 m38 m38 m28 m34 m38 m58];
m3=[m64 m68 m58 m64 m58 m38 m54 m58 m68 m54 m38 m28];
m4=[m14 m18 m28 m38 m28 m18 l68 l58 l62];
m5=[l62 m38 m34 m28 m18 m24 m28 m38 m28 l78 l68 l58];
m6=[l64 l68 m18 m28 m38 m58 m68 m58 m38 m38 m28 m34 m38 m58];
m7=[m64 m68 m58 m64 m58 m38 m54 m58 m68 m54 m38 m28];
m8=[m14 m28 m38 m28 m18 l68 l58 l68 l68 l68 m34 m64 m64 m64 l68 m18];
m9=[m24 m24 m28 m28 m18 m28 m54 m58 m38 m24 m28 m38];
m10=[m18 l68 l64 l64 l68 l78 m14 l68 m14 m18 m24 m34];
m11=[l74 l68 l78 m14 l78 l58 l68 l68 l68 m38 m38 m64 m68 h18 m78 m68 m68 m58];
m12=[m58 m38 m34 m34 l68 l38 m28 m38 m28 m18 m28 m38];
m13=[m54 m58 m38 m68 m58 h18 m78 m64 m68 m58 m68 m58 m58 m38];
m14=[m24 m58 m34 m38 l68 m38 m24 m38 m24 m28 m58 m38];
m15=[h14 h18 m74 m68 m58 m64 m64 m64 m64];
m16=[m0 m0 m38 m54 m54 m0 m0 m0 m0];
m=[m1 m2 m3 m4 m5 m6 m7 m8 m9 m10 m11 m12 m13 m14 m15 m16];
sound(m);
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 巴山学长 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档