皆さん こんにちは シコミンです
首先我要给大家说句抱歉,昨天的代码出现了错误。
勘误如下:
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
最终代码如下
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);
昨天我们了解了怎么播放单个数值音符,今天我们开始写一段简单的音乐吧。
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
今天的最终代码如下
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
自己播放一下听一听吧~
好了,今天这一期就到这,掰掰!