matlab的演奏实例

  • 欢迎关注微信公众号:十三的梦,一起讨论更多好玩的有趣的~

江湖有传闻,matlab除了不能生孩子,没有什么是他干不了的。

这话可不好说,迟早有一天,matlab得能生孩子。

今天不想用乐器听喜欢的音乐了,让matlab来代劳吧。

要能演奏,首先得来点乐理知识。

1. 十二平均律

十二平均律是学习乐理的基石。这种律法非常流行,现在极多数的乐曲是采用这种律制编成的。

十二平均律,是将频率f 到二倍频2f 的区域,划分成十二个频段,也就是有十三个频率点。要注意的是,这种划分并不是等差数列划分,而是等比数列划分。

根据等比数列的知识,得到第n个频率点的频率值:
在这里插入图片描述

所以第一个频率点

第二个频率点
在这里插入图片描述

直到第十三个频率点

在这里插入图片描述

我们一看,正好把钢琴键盘上的一个八度,白键带黑键平均地分完了。

更为简单地,对照着前人写好的十二平均律音高与频率对照表,直接找到我们需要的频率。
在这里插入图片描述

找到一个自己的基准音频率(我选中了中音do,也就是c1)

那么显而易见地,中音do的波形可以表示为:sin(2pi261.63 *t),t为音长。

2. 音长和节拍

音长的设置,主要还是遵循五线谱中全音符,二分音符,四分音符,八分音符等等音长。(我选择了以16分音符作基准,依此设置好一些基础音长,后面有需要可以继续添加)

于是准备查一下专业的音长乐理,突然发现。距离我上一次读五线谱,大概已经有十多年了吧。

没想到现在看了一眼五线谱,读音符竟然只能靠掰指头数

再也不敢说自己以前会弹钢琴了

在这里插入图片描述

直接上音符:

在这里插入图片描述

这小蝌蚪排下来,还是有一点点熟悉的。

按照我的设置(16分音符为基准t16),其余音符的音长也应符合:

那么问题来了,t16又该如何确定呢?

我们先来看一小截以逻辑精准且严密枯燥著称的巴赫曲谱:

在这里插入图片描述

看到这样的曲谱,我的脑海里只回荡着三个大字:for循环!

这工整程度,巴赫要是捎带手写写代码,那绝对也是大神啊!!

回归主题,曲谱中左侧红框中内容表示该曲节拍为四四拍(分母4表示以四分音符为基本单位一拍,分子4表示每小节输出四拍),上方红框则表示每分钟输出112拍,那么每拍所占用的时长应为60/112 ≈ 0.54s。

按照这样的方法,根据标准琴谱就可以直接设置好基准音长。不过现在很多流行乐谱不标注每拍时长信息,那也就只能凭感觉设置了。

这部分代码附上:

fs = 44100;
dt = 1/fs;
T16 = 0.2;
t16 = [0:dt:T16];
[temp k] = size(t16);
t1 = linspace(0,16*T16,8*k); %全音符
t2 = linspace(0,8*T16,8*k); %2分音符
t3 = linspace(0,7*T16,7*k); %7/16拍
t4 = linspace(0,4*T16,4*k); %4分音符
t6 = linspace(0,3*T16,3*k); %3/16拍
t8 = linspace(0,2*T16,2*k); %8分音符

采样频率 fs 选择为标准CD格为44.1k。

3. 准备输出

然后我们会发现,此时基本已经可以有音乐输出了。但是音与音之间并不平滑,每个音的播放都会迎来一个戛然而止的换音过程。

简直辣耳朵!

这是为什么!

想了一下,可能是因为声波振动存在的正常衰减吧?

那好了,也给输出加个衰减不就ok了吗!

一行代码的事儿,说加就加!

type1 = sin(pi*t1/t1(end));
type2 = sin(pi*t2/t2(end));
type3= sin(pi*t3/t3(end));
type4 = sin(pi*t4/t4(end));
type6 = sin(pi*t6/t6(end));
type8 = sin(pi*t8/t8(end));
type16 = sin(pi*t16/t16(end));

把设置好的衰减添加到输出里:

do0l = type4.*sin(2*pi*Sound(21)*f0*t4);
re0l = type4.*sin(2*pi*Sound(22)*f0*t4);
mi0l = type4.*sin(2*pi*Sound(23)*f0*t4);
fa0l = type4.*sin(2*pi*Sound(1)*f0*t4);
so0l = type4.*sin(2*pi*Sound(2)*f0*t4);
la0l = type4.*sin(2*pi*Sound(3)*f0*t4);
si0l = type4.*sin(2*pi*Sound(4)*f0*t4);
do1l = type4.*sin(2*pi*Sound(5)*f0*t4);
blkl = zeros(1,i);

这样,一个八度内的还原音,外加一个同音长的休止符就设置好了~

f0就是我们选择好的基准音频率,Sound的设置就是十二平均律中的等比例因子。(事实上可以直接照表写,可我实在懒得一个一个音查。就让matlab自己去算吧,反正他除了生孩子啥都能干)

接下来就是最后,按照想要的笑傲江湖的旋律,依次输出音符就完美啦!

为什么选择了笑傲江湖呢,主要还是黄老沾的曲子太极简了啊。

两个八度以内,宫商角徵羽之间,不愧鬼才也。

哦,书归正传,这就输出音乐。

mymusic1 = [blkn...
la1l so1s mi1n re1n do1l blkl...
mi1l re1s do1n la0n so0l blkl...
so0l la0s so0n la0n do1l re1s mi1n so1n la1l so1s mi1s re1s do1n re1l blkl...
la1n la1s so1s mi1n re1n do1l blkl...
mi1n mi1s re1s do1n la0n so0l blkl...
so0l la0s so0n la0n do1l re1s mi1n so1n la1n la1s so1s mi1s re1s do1n do1l blkl...
];
​
s = mymusic1;sound(s,fs);
audiowrite('mymusic1.wav',mymusic1,fs)

其中音长的选择,就凭感觉乱来(好吧,其实就是我懒得找谱子)

大家还可以根据自己的需要进一步改进,输出演奏的话尽量还是去网上找一份靠谱的乐谱来吧,简谱也是可以的哦

也欢迎一起探讨更多好玩的有趣的东西~

扫码或搜索关注 ↓↓↓ ↓↓↓ 查看更多

在这里插入图片描述

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值