用MATLAB创作歌曲

前两天在网上看到有人用MATLAB演奏出李建的传奇,文章链接如下:

整理:用matlab创作歌曲(一)_一苇以航-CSDN博客_matlab音乐代码

在大佬的基础上对代码进行了一点点改进,并借此学习了一点点入门级乐理知识。对代码的改进主要为:

1.定义了BPM(Beat Per Minute)变量,即每分钟拍数,在演奏一些快板曲子时可能有用。

2.定义了休止符,更符合谱子的本意。

3.定义了几个全局变量,使代码看起来更简洁。

4.将扬声器奏响的旋律写成.wav及.mp3的文件,方便装B。。。

代码如下:

clc
clear all
close all
%% 用matlab演奏李建的《传奇》
%% 辅助乐理知识
%音名             C4 D4 E4 F4 G4 A4 B4
%唱名             do re mi fa so la si
%p值(音高)      60 62 64 65 67 69 71
%简谱             1  2  3  4  5  6  7
%音高每上升一个半音,p加1
%简谱中0代表休止符,不出声
%4/4代表一个小节有4拍,用4分音符当一拍
%2/4代表一个小节有2拍,用4分音符当一拍
%简谱中:无下划线为四分音符,一拍
%     一个下划线为八分音符,半拍
%     两个下划线为十六分音符,1/4拍
%% 基本量定义
global BPM fs p0 f0
fs=44100;%采样频率
BPM=65;%beat per minute(每分钟拍数)
p0=69;%基准音(la)音高
f0=440;%基准音(la)频率
%% 定义音符
%_2表示2分音符
O_2=key(0,2);%二分休止符
E3_2=key(52,2);
F3_2=key(53,2);
G3_2=key(55,2);
A3_2=key(57,2);
C4_2=key(60,2);
D4_2=key(62,2);
E4_2=key(64,2);
G4_2=key(67,2);
%_4表示4分音符
O_4=key(0,4);%四分休止符
E3_4=key(52,4);
G3_4=key(55,4);
A3_4=key(57,4);
B3_4=key(59,4);
C4_4=key(60,4);
D4_4=key(62,4);
E4_4=key(64,4);
F4_4=key(65,4);
G4_4=key(67,4);
A4_4=key(69,4);
%_8表示8分音符
O_8=key(0,8);%八分休止符
E3_8=key(52,8);
G3_8=key(55,8);
A3_8=key(57,8);
B3_8=key(59,8);
C4_8=key(60,8);
D4_8=key(62,8);
E4_8=key(64,8);
F4_8=key(65,8);
G4_8=key(67,8);
A4_8=key(69,8);
%_16表示16分音符
O_16=key(0,16);%十六分休止符
E3_16=key(52,16);
G3_16=key(55,16);
A3_16=key(57,16);
B3_16=key(59,16);
C4_16=key(60,16);
D4_16=key(62,16);
E4_16=key(64,16);
G4_16=key(67,16);
A4_16=key(69,16);
%% 各小节音符
bar1=[O_8 C4_16 C4_16 C4_8 E4_8 D4_8 D4_16 D4_16 C4_16 C4_8 C4_16];%第一小节(bar)
bar2=[D4_8 D4_8 C4_16 A3_16 A3_8 A3_4 A3_4];
bar3=[O_8 B3_16 B3_16 B3_8 C4_16 D4_16 D4_8 B3_8 A3_16 G3_8 E3_16];
bar4=[E3_4 E3_4 O_4 O_4];
bar5=[O_8 E4_16 D4_16 E4_8 E4_16 D4_16 D4_8 D4_16 C4_16 C4_4];
bar6=[D4_8 A3_8 A3_16 A3_16 D4_16 C4_16 C4_4 O_4];
bar7=[O_8 B3_16 B3_16 B3_8 C4_16 D4_16 D4_8 D4_8 A3_16 G3_8 G3_16];
bar8=[E3_4 E3_4 O_4 O_4];
bar9=[G4_8 G4_16 D4_16 D4_8 E4_8 G4_8 G4_16 D4_16 D4_8 C4_8];
bar10=[A3_4 A3_4 O_4 O_4];
bar11=[D4_8 D4_16 A3_16 A3_8 C4_8 D4_8 D4_16 C4_16 C4_8 C4_8];
bar12=[G3_4 G3_4 O_4 O_4];
bar13=bar9;
bar14=bar10;
bar15=[D4_8 D4_16 A3_16 A3_8 C4_8 D4_8 D4_16 C4_16 C4_8 C4_16 D4_16];
bar16=[D4_4 D4_4 O_4 O_4];
bar17=[O_8 C4_16 C4_16 C4_8 G3_16 C4_16 C4_8 G4_8 F4_8 E4_8];
bar18=[D4_8 D4_16 C4_16 C4_4 C4_4 O_16 C4_16 E4_16 G4_16];
bar19=[A4_8 G4_16 A4_16 A4_16 G4_8 G4_16 A4_8 G4_16 E4_16 E4_16 D4_8 E4_16];
bar20=[E4_4 E4_4 O_4 O_4];
bar21=bar17;
bar22=bar18;
bar23=[A4_8 G4_16 A4_16 A4_16 G4_8 G4_16 A4_8 G4_8 E4_16 G4_8 G4_16];
bar24=[G4_4 G4_4 G4_4 G4_4];
bar25=[G4_4 G4_4 O_4 O_4];
bar26=bar1;
bar27=bar2;
%% 拼接成整首歌
legend0=[bar1 bar2 bar3 bar4 bar5 bar6 bar7 bar8 bar9 bar10...
    bar11 bar12 bar13 bar14 bar15 bar16 bar17 bar18 bar19 bar20...
    bar21 bar22 bar23 bar24 bar25];
legend=[legend0 legend0 bar26 bar27];
%% 在扬声器奏响旋律
sound(legend,fs)
%% 写成文件
audiowrite('legend.wav',legend,fs);
mp3write(legend,fs,'legend.mp3');

function g=key(p, n)
%% 根据音符的音高(p)和音长(二分音符、四分音符或八分音符)得到时历曲线g
%fs为采样率
global BPM fs
t0=1/BPM*60;%一拍的时间(一个四分音符)
t=0:1/fs:(4*t0/n);
if p~=0
   g=sin(2*pi*fre(p)*t);
else %休止符用p=0表示
   g=0*t; 
end
end

function f = fre(p)
global p0 f0
%% 以标准音la为基础(p=69),计算音高为p的音的频率
f=f0*2^((p-p0)/12);
end

事后又查阅一些资料,MIDI(Musical Instrument Digital Interface)技术的发展早已远远超过上述代码能做的事情。上面的代码只能看作是科研间隙的娱乐而已╮(╯▽╰)╭

欢迎各位大佬们批评指正!

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值