clc;clear;close all
%歌曲数据:第一列为音阶,第二列为每个音符的持续时间(四分音符=1)
songPart1=[7 1;
12 0.75;
13 0.25;
15 0.75;
16 0.25;
13 0.25;
15 0.25;
12 0.5;
22 0.75;
25 0.25;
23 0.25;
22 0.25;
17 0.25;
22 0.25;
16 1.75;
8 0.25];%空一个十六分音符
songPart2=[16 0.5
16 0.25
17 0.25
14 0.5
13 0.5
12 0.75
13 0.25
15 0.5
16 0.5
7 0.5
15 0.5
13 0.25
12 0.25
13 0.25
15 0.25
12 1.75
8 0.25];%空一个十六分音符
songPart3=[17 0.75
22 0.25
14 0.5
16 0.5
13 0.25
15 0.25
12 0.5
12 1
7 0.375
12 0.125
7 0.6
12 0.375
13 0.125
14 0.25
16 0.25
13 1.5
12 0.25
13 0.25
15 0.75
16 0.25
22 0.5
17 0.5
16 0.5
17 0.25
16 0.25
15 0.5
13 0.25
12 0.25
7 1
15 1
13 0.375
15 0.125
13 0.25
12 0.25
7 0.25
12 0.25
13 0.25
15 0.25
12 1.5];
speed=0.8;%一个四分音符的持续时间(秒)
Fs=44100;%采样率
%wave=generateWave(song,speed,Fs);%音色1
[wave,length]=generateWave2(songPart1,speed,Fs);%音色2
sound(wave,44100)
pause(length)
[wave,length]=generateWave2(songPart2,speed,Fs);%音色2
sound(wave,44100)
pause(length)
[wave,length]=generateWave2(songPart3,speed,Fs);%音色2
sound(wave,44100)
pause(length)
function [y,time]=generateWave(song,speed,Fs)
y=[];
for i=1:size(song,1)
f=song(i,1);
length=song(i,2)*speed;
x=linspace(0,length,length*Fs);
y=[y sin(2*pi*f*x)];
end
time=sum(song(:,2))*speed;
end
function [y,time]=generateWave2(song,speed,Fs)
y=[];
for i=1:size(song,1)
f=getFreq(song(i,1));
length=song(i,2)*speed;
x=linspace(0,length,length*Fs);
y=[y 1/3*sin(2*pi*f*x)+2/3*sin(4*pi*f*x)];
end
time=sum(song(:,2))*speed;
end
function y=getFreq(x)
% do re mi fa sol la si
% 低: 262, 294, 330, 349, 392, 440, 494,
% 中: 523, 587, 659, 698, 784, 880, 988,
% 高: 1046, 1175, 1318, 1397, 1568, 1760, 1976.
freqValues=[262,294,330,349,392,440,494,0,0,0,523,587,659,698,784,880,988,0,0,0,1046,1175,1318,1397,1568,1760,1976];
y=freqValues(x);
end