MATLAB音乐演奏:第二期进阶教程

皆さん こんにちは  シコミンです

首先我要给大家说句抱歉,昨天的代码出现了错误。

cut-off

勘误如下:

1:

badu=ceil(original_note/12);    -------->       badu=floor(original_note/12);

%向上取整改为向下取整

2:

if note==0      X

    badu=badu-1;     X 

end        X

%删除此判断体

3:

fs_c=fs*2^(note/12)*2^(badu-2);       -------->     fs_c=fs*2^(note/12)*2^(badu-1);

%减2改为减1

cut-off

最终代码如下

load C5-piano.mat;

%导入数据;data  fs

original_note=1;%数值音符(取值自己定),之后根据12平均律进行计算具体八度音符

badu=floor(original_note/12);%数值音符除以12得所在八度

note=mod(original_note,12);%数值音符对12取余得实际所在八度具体第几个音符

fs_c=fs*2^(note/12)*2^(badu-1);%八度减1整体降一个八度

sound(data,fs_c);

cut-off

昨天我们了解了怎么播放单个数值音符,今天我们开始写一段简单的音乐吧。

Minuet in G Major:

一段音乐简谱

我们先只考虑右手演奏的部分。

r1_1=[8,1,3,5,6,8,1,1,10,6,8,10,12,13,1,1];%第一行

r1_2=[6,8,6,5,3,5,6,5,3,1,0,1,3,5,1,3,0,0];%第二行

r1=[r1_1,r1_2];%数值音符

r2_1=[1,1/2,1/2,1/2,1/2,1,1,1,1,1/2,1/2,1/2,1/2,1,1,1];%第一行

r2_2=[1,1/2,1/2,1/2,1/2,1,1/2,1/2,1/2,1/2,1,1/2,1/2,1/2,1/2,1,1,1];%第二行

r2=[r2_1,r2_2];%节奏

音符根据曲谱按照下表录入,节奏根据曲谱和实际情况录入。如果节奏过于紧凑(比如一个四分之一音符取0.2秒),那么会出现前面一个音符还没有播放完就开始播放接下来的音符,这样有可能让Matlab崩溃或者出现噪音。这里的处理办法:1.放慢播放节奏  2.只取音色数据data的前面一部分。data数据是一个10W行2列的矩阵,节奏较快的话,你可以只取前30%~50%行,例如:data(1:35000,:)只取前3万5千行。

我的数值音符对照表

time_r2=max(size(r2));

t=1;

%-------------------播放---------------------

while(time_r2>=t)          %当t小于向量r2的长度时进入循环

    my_sound(r1(t),data,fs);  %播放第t个音符

    pause(r2(t));            %根据节拍停止r2(t)秒

    t=t+1;

end

%音符播放函数:

function my_sound(original_note,data,fs)

badu=floor(original_note/12);%数值音符除以12得所在八度

note=mod(original_note,12);%数值音符对12取余得实际所在八度具体第几个音符

fs_c=fs*2^(note/12)*2^(badu-1);%八度减1整体降一个八度

sound(data,fs_c);

end

cut-off

今天的最终代码如下

load C5-piano.mat;

r1_1=[8,1,3,5,6,8,1,1,10,6,8,10,12,13,1,1];

r1_2=[6,8,6,5,3,5,6,5,3,1,0,1,3,5,1,3,3,3];

r1=[r1_1,r1_2];%数值音符

r2_1=[1,1/2,1/2,1/2,1/2,1,1,1,1,1/2,1/2,1/2,1/2,1,1,1];

r2_2=[1,1/2,1/2,1/2,1/2,1,1/2,1/2,1/2,1/2,1,1/2,1/2,1/2,1/2,1,1,1];

r2=[r2_1,r2_2];%节奏

time_r2=max(size(r2));

t=1;

%-------------------播放---------------------

while(time_r2>=t)

    my_sound(r1(t),data,fs);

    pause(r2(t));

    t=t+1;

end

%音符播放函数:

function my_sound(original_note,data,fs)

badu=floor(original_note/12);%数值音符除以12得所在八度

note=mod(original_note,12);%数值音符对12取余得实际所在八度具体第几个音符

fs_c=fs*2^(note/12)*2^(badu-1);%八度减1整体降一个八度

sound(data(1:35000,:),fs_c);

end

cut-off

自己播放一下听一听吧~

好了,今天这一期就到这,掰掰!

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空