在matlab中建gui出错怎么办_五音不全?我的电脑给我唱!(matlab制作音乐入门)...

记得小的时候,我特别喜欢听音乐,平时一个人的时候也喜欢跟着唱,记得初中时候我一个朋友和我住在一栋楼,他住一楼,我住四楼,有一次他问我是不是最近在听xx,我说:“你咋知道?!”他笑笑:“这几天天天能听到你在楼道里唱,,”

后来我再也没敢上学下楼途中唱歌了......

我最近在大学里学习matlab,听人说matlab除了生孩子都会,那我们能够让matlab唱歌吗?

于是,在茫茫人海中,我发现了它——sound函数

在查阅了一些相关知识后,我也能用matlab去制作一些简单的旋律。

(由于不是专业的,一些比较硬核的物理知识可能出错,欢迎指正~)

首先来讲sound函数的用法,它的形式一般为sound(Y,fs,nBits),其中Y为输入的信号,fs为采样率,nBits为比特率。

Y表示的信号一般为一个正弦波,形式为A*sin(2*pi*w*t),其中A控制音的强弱,w控制音的高低,t控制音的长短。

b217473296c4ca5858d3beaa54461353.png

fs为采样率,即在一秒钟内对声音信号的采样次数,一般mp3的采样率为44100,这表示着1秒钟可以采44100个采样点。如果我们将其改为10000,即1秒采10000个点,相对于44100就会少很多信息,音乐听起来就会不完整。

nBits表示比特率,每秒传送的比特(bit)数,这里我们可以直接不填,即sound(Y,fs),这样的话matlab会启用其默认值。

函数搞清楚了,那么接下来就是音符的问题了。

每个音符有对应的频率,标准A音(即la),对应的频率为440hz,从这个音开始,每比它高一个半音,频率就是它乘上2^(1/12)。

有小伙伴就要问了:那半音是什么呢?

(关于乐理知识的图片与解释摘自基础乐理知识(教你认五线谱)_qq_41262681的博客-CSDN博客

半音

在音乐中,它是最小的计量单位,表示一个音到另一个音的关系,一个全音,等于两个半音。

所谓全音和半音,是指两个音之间的高低关系,不能和某一个音混为一谈,如果说某个音是全音,某个音是半音是不对的。他们的意思是:某个音到某个音是全音或半音。并可以用两种标记来表示全音和半音关系。

ea8c24a087a61da501b144db20e04360.png

C D E F G A B分别对应dol,re,mi,fa,so,la,xi(简谱对应1,2,3,4,5,6,7)。

得到这个表之后,我们就可以用标准A音通过乘除法将其他所有音代替,也就是说所有的的音我们都可以表示了!

Y=A*sin(2*pi*w*t),w的问题我们已经解决,音的大小我们暂时不用考虑,暂时设为1就好,那么接下来就是t的问题。

众所周知,每首歌里的音符是有节拍的,也就是音的长短,通过不同长短音的结合,才能创造出更好听的音乐。

8d931c4f72fda3b245cae094e5fe226e.png
不同的音有不同节拍

在matlab的世界中,音符中的t应当是一个矩阵。

比如四分之一拍的la,t=0:1/fs:1/4,这意味着我们将一拍的长度设为1秒,那四分之一拍就是四分之一秒,如果觉得不够长可以改为t=0:1/fs:2/4,即设一拍为两秒。步长为1/fs,这也控制了1秒可以采样fs个采样点。

那么音符的问题就顺利解决了!接下来就可以开始写代码了!

诶?等等,好像少了些什么......

对了!我们该唱哪首歌呢?

马上头脑中浮现出一个人......

30a81faa108dc4c4e13923d7e5f48e84.png

林宥嘉!!他是我最喜欢的歌手哈哈哈。

赶紧从网上找到了他《残酷月光》的简谱。

6dab45e895dea8cc906fa87f86d9b1bb.png
简谱取自http://www.jianpu.cn/pu/14/149357.htm

看到这里,我还是要解释一下关于简谱的一些知识。在乐谱的左上角可以看到一个4/4。

305bfd9b9473d337f7087370f56dedf8.png

其中上面的4代表了每个小节有4拍(小节就是乐谱中两条相邻“|”间的内容),下面的4代表了以四分音符为一拍,其他的音符节拍就以此计算。

除了这个我们还能看到谱子里有的数字间有了连线。

cab8c6e057b780721d39d3dfd88ac5f4.png
比如这里

先看1和1的小连线,在连线中数字一样的情况下,连线表示这些音符要连起来唱,例如图中的两个do,加上连线后唱的时候应当唱成一个音。而如果是数字不一样的连线,则是要保持演唱时的连贯性。

最后,我们还能看到有的音符后面跟着一个“·”。

607d4d712809f53af8a884361b5b141b.png

这代表着这个音的节拍变成了原来的1.5倍,也就是延长了一半。

好!了解了乐谱,那我们就可以打开matlab开始我们的“演唱”!

bde4dc170ebd8390a60dc5a717044655.png
胖虎觉得很赞

首先呢,我们要先在文件夹中建一个文件夹,来放置我们的程序。

c78eae561e023e2652919051628394f0.png

然后将路径复制粘贴在matlab的路径里(保持好习惯)。点击“新建脚本”。

13f7f81731889bb2650bf6b4f6151f90.png
%filename is::cankuyueguang.m

%clear
clc;clear;close all;


%prepare
fs = 44100;%采样率


function output = key(p,n,fs)
t=0 : 1/fs : 1/n;
output = sin(2*pi* 440*2^((p-69)/12) *t)%这里我们定义la对应p为69,每往上加一个半音p+1
end

在进行常规的clc之后先进行准备工作,由于音符每个都写成A*sin(2*pi*w*t)的形式太麻烦,我就加了一个函数key,更方便去表示音符。(音乐中的停顿,用同样长短的0矩阵代替即可。)

ps:函数的定义要放在函数的末尾

接下来进行的就是漫长而无聊的写代码过程......

%音符
do_1=key(60,1,fs);
do_2=key(60,2,fs);%2 -> 1/2拍
do_4=key(60,4,fs);
do_23=key(60,2/3,fs);%一拍半
do_43=key(60,4/3,fs);%3/4拍
do_45=key(60,4/5,fs);%5/4拍
do_49=key(60,4/9,fs);%9/4拍
do0_4=key(48,4,fs);%这里的do是低音do
re_1=key(62,1,fs);
re_45=key(62,4/5,fs);%5/4拍
re_2=key(62,2,fs);
re_4=key(62,4,fs);
re_23=key(62,2/3,fs);%3/2拍
re_43=key(62,4/3,fs);%3/4拍
re_25=key(62,2/5,fs);%5/2拍
mi_13=key(64,1/3,fs);%3拍
mi_2=key(64,2,fs);
mi_4=key(64,4,fs);
mi_43=key(64,4/3,fs);%3/4拍
mi_45=key(64,4/5,fs);%5/4拍
mi_49=key(64,4/9,fs);%9/4拍
mi0_23=key(52,2/3,fs);%这里的mi是低音mi,有一拍半
fa_2=key(65,2,fs);
fa_4=key(65,4,fs);
fa0_43=key(53,4/3,fs);%3/4拍
so_2=key(67,2,fs);
so_4=key(67,4,fs);
so0_1=key(55,1,fs);
so0_2=key(55,2,fs);
so0_4=key(55,4,fs);
so0_23=key(55,2/3,fs);%一拍半
so0_43=key(55,4/3,fs);%3/4拍
la0_2=key(57,2,fs);
la0_4=key(57,4,fs);
la0_25=key(57,2/5,fs);%2/5拍
xi0_2=key(59,2,fs);
xi0_4=key(59,4,fs);
xi0_23=key(59,2/3,fs);%一拍半

%停顿
t=0:1/fs:1;
blk_1=zeros(1,length(t));
t=0:1/fs:0.5;
blk_2=zeros(1,length(t));
t=0:1/fs:0.25;
blk_4=zeros(1,length(t));
t=0:1/fs:3/4;
blk_43=zeros(1,length(t));

%把音符串起来
part1=[la0_2 so0_23 la0_2 mi0_23 blk_2 so0_4 so0_4 la0_2 do_2 re_2 re_4 do_45 blk_43];
part2=[so0_4 re_43 do_4 re_4 mi_43 blk_1 fa_2 mi_4 re_4 mi_13 blk_2 mi_4 mi_4 mi_43 re_43 la0_4 re_45 blk_1];
part3=[re_2 xi0_2 so0_2 re_2 do_1 blk_1 do_43 xi0_4 do_4 fa0_43 blk_1 la0_4 do_43 mi_45 xi0_23];
part4=[do_2 so0_23 la0_2 mi0_23 blk_2 so0_4 so0_4 la0_2 do_2 re_4 do_4 do_2 blk_1 blk_2 blk_4 so0_4 re_4/3 do_4 re_4 mi_43 blk_2 blk_4];
part5=[so0_4 fa_2 mi_4 re_43 fa_4 mi_49 blk_2 mi_4 mi_4 mi_43 re_43 la0_4 re_45 blk_1];
part6=[re_2 xi0_2 so0_2 re_2 do_1 blk_2 blk_4 do0_4 do_2 re_4 re_43 do_23 so0_2 so_2 do_2 re_25 blk_2 blk_4];
part7=[so0_4 so_2 mi_2 mi_4 re_4 re_4 re_4 do_2 do_2 do_4 so0_4/3 so_2 re_2 re_4 do_4 do_4 xi0_2 do_2 do_4 re_4 mi_4 do_4 la0_4 do_4 so0_4 la0_25 blk_4];
part8=[la0_2 la0_4 so0_2 re_2 re_4 so0_2 mi_4 re_1 blk_2 blk_4 so_4 so_2 mi_2 mi_2 re_4 re_4 do_2 do_2 re_4 mi_43 so_2 re_2 re_4 do_43 xi0_4 do_2 do_4 re_4 mi_4 do_4 la0_4 do_4 so0_4 la0_25 blk_2 blk_4];
part9=[la0_4 la0_2 so0_1 re_23 blk_2 mi_2 mi_2 re_4 do_49];
song=[part1 part2 part3 part4 part5 part6 part7 part8 part9];

终于写完了!那就让我们来听一听吧!

sound(song,fs);

还不错哈哈哈!

c2338d5fdd25773002d26e1f76420461.png

又有小伙伴要问了,如果我想把这个作品保存成音频,怎么办呢?

于是又可以请出它——audiowrite函数

filename='cankuyueguang.wav';
audiowrite(filename,song,fs);

b3b7f951c4fa2e2c819f63cc25246f65.png

就可以在文件夹里看到它的音频了。

还有一个问题,我按下运行后,matlab就开始播放歌曲,该怎么停止呢?

只要在命令栏里输入“clear sound”按回车就可以了!

那可以能否实现暂停、再播放呢?这里我指路我的老师的一篇文章,蒋挺:如何用Matlab编写一款mp3音乐播放器大家可以在这里学到实现制作mp3的代码。

看到这里,大家应该都已经学会如何用matlab去创造一段音乐,赶紧回去找到喜欢歌曲的简谱,让电脑给你唱一段吧!

当然,用matlab制作音乐绝不仅限于此,这里还有更广阔的世界等待着我们的探索,今天这篇文章只是一块敲门砖,希望大家可以继续喜欢matlab,继续深入地学习。

最后,完整的代码如下:

%filename is::cankuyueguang.m

%clear
clc;clear;close all;


%prepare
fs = 44100;%采样率

%音符
do_1=key(60,1,fs);
do_2=key(60,2,fs);%2 -> 1/2拍
do_4=key(60,4,fs);
do_23=key(60,2/3,fs);%一拍半
do_43=key(60,4/3,fs);%3/4拍
do_45=key(60,4/5,fs);%5/4拍
do_49=key(60,4/9,fs);%9/4拍
do0_4=key(48,4,fs);%这里的do是低音do
re_1=key(62,1,fs);
re_45=key(62,4/5,fs);%5/4拍
re_2=key(62,2,fs);
re_4=key(62,4,fs);
re_23=key(62,2/3,fs);%3/2拍
re_43=key(62,4/3,fs);%3/4拍
re_25=key(62,2/5,fs);%5/2拍
mi_13=key(64,1/3,fs);%3拍
mi_2=key(64,2,fs);
mi_4=key(64,4,fs);
mi_43=key(64,4/3,fs);%3/4拍
mi_45=key(64,4/5,fs);%5/4拍
mi_49=key(64,4/9,fs);%9/4拍
mi0_23=key(52,2/3,fs);%这里的mi是低音mi,有一拍半
fa_2=key(65,2,fs);
fa_4=key(65,4,fs);
fa0_43=key(53,4/3,fs);%3/4拍
so_2=key(67,2,fs);
so_4=key(67,4,fs);
so0_1=key(55,1,fs);
so0_2=key(55,2,fs);
so0_4=key(55,4,fs);
so0_23=key(55,2/3,fs);%一拍半
so0_43=key(55,4/3,fs);%3/4拍
la0_2=key(57,2,fs);
la0_4=key(57,4,fs);
la0_25=key(57,2/5,fs);%2/5拍
xi0_2=key(59,2,fs);
xi0_4=key(59,4,fs);
xi0_23=key(59,2/3,fs);%一拍半

%停顿
t=0:1/fs:1;
blk_1=zeros(1,length(t));
t=0:1/fs:0.5;
blk_2=zeros(1,length(t));
t=0:1/fs:0.25;
blk_4=zeros(1,length(t));
t=0:1/fs:3/4;
blk_43=zeros(1,length(t));

%把音符串起来
part1=[la0_2 so0_23 la0_2 mi0_23 blk_2 so0_4 so0_4 la0_2 do_2 re_2 re_4 do_45 blk_43];
part2=[so0_4 re_43 do_4 re_4 mi_43 blk_1 fa_2 mi_4 re_4 mi_13 blk_2 mi_4 mi_4 mi_43 re_43 la0_4 re_45 blk_1];
part3=[re_2 xi0_2 so0_2 re_2 do_1 blk_1 do_43 xi0_4 do_4 fa0_43 blk_1 la0_4 do_43 mi_45 xi0_23];
part4=[do_2 so0_23 la0_2 mi0_23 blk_2 so0_4 so0_4 la0_2 do_2 re_4 do_4 do_2 blk_1 blk_2 blk_4 so0_4 re_4/3 do_4 re_4 mi_43 blk_2 blk_4];
part5=[so0_4 fa_2 mi_4 re_43 fa_4 mi_49 blk_2 mi_4 mi_4 mi_43 re_43 la0_4 re_45 blk_1];
part6=[re_2 xi0_2 so0_2 re_2 do_1 blk_2 blk_4 do0_4 do_2 re_4 re_43 do_23 so0_2 so_2 do_2 re_25 blk_2 blk_4];
part7=[so0_4 so_2 mi_2 mi_4 re_4 re_4 re_4 do_2 do_2 do_4 so0_4/3 so_2 re_2 re_4 do_4 do_4 xi0_2 do_2 do_4 re_4 mi_4 do_4 la0_4 do_4 so0_4 la0_25 blk_4];
part8=[la0_2 la0_4 so0_2 re_2 re_4 so0_2 mi_4 re_1 blk_2 blk_4 so_4 so_2 mi_2 mi_2 re_4 re_4 do_2 do_2 re_4 mi_43 so_2 re_2 re_4 do_43 xi0_4 do_2 do_4 re_4 mi_4 do_4 la0_4 do_4 so0_4 la0_25 blk_2 blk_4];
part9=[la0_4 la0_2 so0_1 re_23 blk_2 mi_2 mi_2 re_4 do_49];
song=[part1 part2 part3 part4 part5 part6 part7 part8 part9];

%play
sound(song,fs);

%save
filename='cankuyueguang.wav';
audiowrite(filename,song,fs);


function output = key(p,n,fs)
t=0 : 1/fs : 1/n;
output = sin(2*pi* 440*2^((p-69)/12) *t);%这里我们定义la对应p为69,每往上加一个半音p+1
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值