前两天在网上看到有人用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~=0g=sin(2*pi*fre(p)*t);
else %休止符用p=0表示g=0*t;
end
endfunction f = fre(p)
global p0 f0
%% 以标准音la为基础(p=69),计算音高为p的音的频率
f=f0*2^((p-p0)/12);
end

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

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

用MATLAB创作歌曲相关推荐

  1. matlab创作歌曲——《月半小夜曲》

    matlab创作歌曲--<月半小夜曲> 下面是程序(可直接复制粘贴运行) PS:低版本的matlab需要单独保存两个function函数,然后运行 %%%% 演奏<月半小夜曲> ...

  2. 整理:用matlab创作歌曲

    (一部分) 前两天在网上看到了有人用matlab演奏出最炫民族风,用了这么多年matlab还是第一次知道有这种玩法,于是把他的代码研究了一下,自己制作了一首歌曲,在这里分享一下. 首先介绍matlab ...

  3. 整理:用matlab创作歌曲(一)

    前两天在网上看到了有人用matlab演奏出最炫民族风,用了这么多年matlab还是第一次知道有这种玩法,于是把他的代码研究了一下,自己制作了一首歌曲,在这里分享一下. 首先介绍matlab函数的玩法: ...

  4. 整理:用matlab创作歌曲(三)

    %% <最炫民族风> % Most shining national wind %最炫民族风 on Matlab % http://blog.csdn.net/bat67 % fs = 4 ...

  5. 整理:用matlab创作歌曲(二)

    %%Matlab版<卡农> % Cripple Pachebel's Canon on Matlab % Have fun http://blog.csdn.net/bat67 fs = ...

  6. 【从零开始学习深度学习】34. Pytorch-RNN项目实战:RNN创作歌词案例--使用周杰伦专辑歌词训练模型并创作歌曲【含数据集与源码】

    目录 RNN项目实战使用周杰伦专辑歌词训练模型并创作歌曲 1.语言模型数据集预处理 1.1 读取数据集 1.2 建立字符索引 1.3 时序数据的2种采样方式 1.3.1 随机采样 1.3.2 相邻采样 ...

  7. MATLAB写歌曲(艺术与科学的 MEET)

    MATLAB写歌曲(艺术与科学的 MEET) 本人认为用 matlab 可以极大锻炼对于音乐和艺术的理性科学认识,我编的这个是孙燕姿的<遇见>,以表达这种艺术和科学的完美邂逅. 理解这样一 ...

  8. 用计算机搞音乐,一种使用计算机自动创作歌曲的方法与流程

    本发明属于歌曲创作方法技术领域,具体的说是涉及一种使用计算机自动创作歌曲的方法. 背景技术: 自动创作歌曲在流程上分为三种技术,即计算机作曲.计算机编曲和计算机演唱.计算机作曲(automated c ...

  9. 用Matlab生成歌曲,MATLAB制作歌曲

    简谱知识 首先了解简谱基础知识 表示音的高低的基本符号,用七个阿拉伯数字标记. 它们的写法和读法如下: 写法: 1 2 3 4 5 6 7 读法: Do Re Mi Fa Sol La Si 1 ˙ ...

最新文章

  1. 推特雪花算法 java实现
  2. linux下挂载U盘
  3. npm 安装yarn_问题解决记录-npm和yarn全局安装成功后命令无法执行的问题
  4. 小米2s自带rec刷root_刷Magisk模块开机卡Logo了怎么办?两种方法教你轻松解决
  5. IDEA中terminal中执行git log中文乱码
  6. leetcode 273场周赛 Problem-C
  7. Extjs 屏蔽F5
  8. fix ubuntu boot(grub)
  9. [JNI]开发之旅(5)访问c/c++函数
  10. 芯片代理商哪家专业 品质是否有保障
  11. wpl计算方法_用于计算加权路径长度(WPL)的C ++二叉树算法
  12. python 时间格式处理
  13. 洛杉矶湖人队的科比 - 布莱恩特,一个最大的
  14. 题解 P3513 【[POI2011]KON-Conspiracy】
  15. leetcode——第322题——零钱兑换
  16. 微信小程序 定位 获取经纬度城市街道等位置信息
  17. bluedroid acl 发送和接受
  18. iphone ios 横屏,旋转 无响应
  19. 记一次重大的生产事故
  20. 翻译Deep Learning and the Game of Go(10)第八章:部署你的AI

热门文章

  1. 【3D目标检测】PDV(Point Density-Aware Voxels for LiDAR 3D Object Detection)
  2. IP地址-B类网络子网划分
  3. MATLAB保存数据的几种方式
  4. 国内网络下的网络搭建调整细节(六)
  5. backtrace 实现原理
  6. LWIP应用开发|TCP状态机
  7. 一位程序员爸爸抵制编程教育:“我不会教孩子学编程”
  8. Vue iview 动态显示表头信息
  9. 两小灯同亮同灭c语言程序,基于C语言与Proteus联合仿真的单片机技术最新章节_何波,丘利丽著_掌阅小说网...
  10. 杭电1042—— N!(大数乘法的应用!)