实用技巧 | MATLAB演奏《Lemon》

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实用技巧 | MATLAB演奏《Lemon》相关的知识,希望对你有一定的参考价值。


注:本次推文内容在获得B站UP主华仞之锋授权后发表。

原文视频链接:https://b23.tv/h0kSvpv


hello,大家好。各位可点击左下方阅读原文,访问公众号官方店铺。谨防上当受骗,感谢各位支持!


今天与各位聊聊MATLAB的一个神奇功能——演奏歌曲,实际上,我们都知道,MATLAB无所不能,基本上只有你想不到,没有它做不到。本期我们选择的歌曲是《lemon》,接下来,我们边啃代码,边欣赏歌曲吧。


主函数


clear;
clc;
Fs = 8192;
a = 1;
b = 1/2;
c = 1/4;
d = 1/8;
e = 1/16;
f = 1/32;
c3 = 3/4;
d3 = 3/8;
e3 = 3/16;
d4 = 1/12;
e5 = 5/16;
d5 = 5/12;
c1 = 1/6;
c2 = 2/6;
B = B;
A = A;
% tone: 取哪个音节;rythm: 节拍数; keynote_change:升降调8度; keynote_type:当前基调; up_down:音节升降
tone = [0, 0, 0, 1, 2, 3, 1, 6, 2, 7, 5, 3, 7, 6, 5, 1, 5, 3, 2, 3,...
4, 1, 7, 7, 1, 5, 4, 3, 4, 4, 1, 7, 7, 6, 5, 1, 2, 3, 1, 6, 2,...
7, 5, 3, 7, 6, 5, 1, 5, 3, 2, 3, 4, 5, 4, 4, 5, 3, 5, 1, 3,...
2, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 1, 6, 2,...
7, 5, 3, 7, 6, 5, 1, 5, 3, 2, 3, 4, 1, 7, 1, 5, 4, 3, 4,...
4, 1, 7, 7, 6, 5, 1, 2, 3, 1, 6, 2, 7, 5, 3, 7, 6, 5, 1, 5,...
3, 2, 3, 4, 5, 4, 4, 5, 3, 5, 1, 3, 2, 2, 2, 1, 1,...
6, 7, 1, 7, 6, 5, 3, 3, 2, 3, 4 ,3, 2, 1, 2, 5, 4, 5, 6, 5, 4,...
3, 1, 1, 1, 7, 6, 7, 1, 0, 2, 3, 2, 1, 6, 1, 3, 5, 2, 1, 2, 3, 2, 1,...
6, 1, 3, 5, 2, 1, 2, 3, 2, 1, 5, 1, 3, 5, 6, 5, 5, 1,...
7, 5, 3, 5, 2, 2, 2, 3, 2, 1, 6, 1, 3, 5, 2, 1, 1, 1, 2, 3,...
4, 3, 2, 7, 1, 1, 7, 6, 7, 1, 2, 1, 5, 3, 5, 6, 2, 7, 1,...
1, 1, 7, 6, 7, 1, 2, 1, 5, 1, 2, 3, 4, 2, 1, 1, 0];
rythm = [c, c, c, d, d, c, d, d3,c, c, d, d3,c, c, d, d3,c, c3,d, d,...
b, c, d4,d4,d4,b, c, e3,e, b, c, d4,d4,d4,c3,d, d, c, d, d3,c,...
c, d, d3,c, c, d, d3,c, c3,d, d, b, c, d4,d4,d4,c, c, c, c,...
d3,d, d, c, d, a, c, c, c, c, c, c, c, d, d, c, d, d3,c,...
c, d, d3,c, c, d, d3,c, c3,d, d, b, c, d, d, b, c, e3,e,...
b, c, d4,d4,d4,c3,d, d, c, d, d3,c, c, d, d3,c, c, d, d3,d,...
c3,d, d, b, c, d4,d4,d4,c, c, c, c, d, d3, e3,e5,a,...
d3,d, c, d, d, c, c, b, d3,d, c, d, d, c, c, b, d3,d, c, d, d,...
c, c, c, c, b, c, c, c, c, e3,e, e3,e, d, d3,e3,e5,d, d3,e3,e, e3,e,...
d, d3,e3,e5,d, d3,e3,e, e3,e, d, d3,e3,e5,d, d3,d, d3,...
d, d3,d, c, d, b, e3,e, e3,e, d, d3,e3,e5,d, d3,e3,e, e3,e,...
d3,d5,c2,c1,c3,e3,e, c, c, c, c, c, c, c1,c2,d3,d5,d3,d5,...
c3,e3,e, c, c, c, c, c, c, c2,c1,e3,e5,e3,e5,c3,c];
keynote_change= [1, 1, 1, 2, 2, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,...
1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 2,...
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,...
2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 2,...
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1,...
1, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,...
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2,...
1, 1, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1,...
1, 2, 2, 2, 1, 1, 1, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2 ,2, 2, 2, 2, 2,...
1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2,...
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2,...
2, 2, 2, 1, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 2, 1, 2,...
2, 2, 1, 1, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1];
up_down = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,...
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
keynote_type= [B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,...
B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,...
B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,...
B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,...
B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,...
B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,...
B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,...
B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,...
B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B...
B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,...
B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,...
B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B...
B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B];
y = [];
len = length(tone);
for i = 1:1:len y = [y, get_wave(tone(i), rythm(i), keynote_change(i), keynote_type(i), up_down(i))];
end%plot(y);
sound(y, Fs)


get_wave函数


function y = get_wave(tone, rythm, keynote_change, keynote_type, up_down)
% get_wave:
% tone: 取哪个音节; rythm: 节拍数; keynote_change:升降调8度; keynote_type:当前基调; up_down:音节升降
Fs = 8192; keynote_B = 493; % 开始的节奏降E
keynote_Ab = 415; % 中间变为降A
rythm = 1.25 * rythm;
tones_normal = [1, 3, 5, 6, 8, 10, 12]; % 1-7 到 C D E F G A B映射
if nargin == 5 % 有改变基调&可能有升降调&可能有音节升降
if keynote_type == A
keynote = keynote_Ab;
elseif keynote_type == B
keynote = keynote_B;
end
keynote = keynote * keynote_change;
end
if tone == 0 % 停顿
tone = 13;
else tone = tones_normal(tone);
end
freqs = [1, 1.059, 1.122, 1.189, 1.260, 1.335, 1.414, 1.498, 1.587, 1.682, 1.782, 1.888, 0] .* keynote.*(1.059^up_down);
x = linspace(0, 2*pi*rythm, floor(Fs*rythm));
y = sin(freqs(tone) * x) .* (1 - x/(2*pi*rythm));
end


OK,今天就到这里啦

以上是关于实用技巧 | MATLAB演奏《Lemon》的主要内容,如果未能解决你的问题,请参考以下文章

音乐基于matlab演奏《过火》含Matlab源码 1875期

音乐基于matlab演奏《天空之城》含Matlab源码 1874期

《全国钢琴演奏考级作品集(新编第一版) 》1-10级曲目

Matlab学习(可以用MATLAB作曲)

Guitar Pro小课堂之弹唱和弦转换小技巧

Frank是开音节还是闭音节?