一、前言 本篇文章內容為個人學習分享,讀代碼須知以下 樂理的基本知識,以及十二平均律(波的頻率與音高的標準),個人推薦在維基百科中搜索十二平均律表。 二、整體思想 在主函數中,將一些簡單的樂譜按照節拍,按鍵,基調,半音改變經行拆解。 然後我個人學習時,以440hz為標準的do依次類推,得到的基礎 ...
一、前言
本篇文章內容為個人學習分享,讀代碼須知以下
樂理的基本知識,以及十二平均律(波的頻率與音高的標準),個人推薦在維基百科中搜索十二平均律表。
二、整體思想
在主函數中,將一些簡單的樂譜按照節拍,按鍵,基調,半音改變經行拆解。
然後我個人學習時,以440hz為標準的do依次類推,得到的基礎鋼琴七鍵,然後通過改變基礎七鍵得到其他的音高。
因為相鄰的音階是等差的,且音高p = 69 + 12 x log2(f頻率/440),瞭解更加細緻的講解點擊這裡
三、matlab實現代碼:
1.主文件:初始化樂譜
clear;clc
Fs=8192; %sound函數的採樣頻率
%說明:tone為七節白鍵,rythm預設為4/4拍,keynote_type為更改基調,
%說明:rythm_change為節拍改變,文中有一部份為3/4拍,Soundzone_change為低中高音設定
%1234567分別對應do,re,mi,fa,so,la,si
tone1=[5,5,6,5,1,7,5,5,6,5,2,...
1,5,5,5,3,1,7,6,4,4,3,1,3,2,5,5,6,5,1,...
7,5,5,6,5,2,1,5,5,5,3,1,7,6];
tone2=[4,4,3,1,2,1,5,5,...
6,5,1,7,5,5,6,5,2,1,5,5,...
5,3,1,7,6,4,4,3,1,3,2,5,5,...
6,5,1,7,5,5,6,5,2,1,5,5,5,3,1,...
7,6,4,4,3,1,2,1];
tone=[tone1,tone2];
rythm1=[0.5,0.5,1,1,1,2,0.5,0.5,1,1,1,...
2,0.5,0.5,1,1,1,1,1,0.5,0.5,1,1,1,2,0.5,0.5,1,1,1,...
2,0.5,0.5,1,1,1,2,0.5,0.5,1,1,1,1,5];
rythm2=[1,1,2,2,2,7,0.5,0.5,...
1.5,1.5,1,3,0.5,0.5,1.5,1.5,1,3,0.5,0.5,...
1.5,1.5,1,1.5,1.5,0.5,0.5,1.5,1.5,1,3,0.5,0.5,...
1.5,1.55,1,3,0.5,0.5,1.5,1.5,1,3,0.5,0.5,1.5,1.5,1,...
1.5,5.5,0.5,0.5,2,2,4,8];
rythm=[rythm1,rythm2];
length1=length(tone1);
length2=length(tone2);
rythm_change_1=ones(1,length1)*3/4/2;
rythm_change_2=ones(1,length2)*1/4;
rythm_change=[rythm_change_1,rythm_change_2];
rythm=rythm.*rythm_change;
y=[];
len=length(tone);
%A調為1,B調為2,C調為3,D調為4,E調為5,F調為6,E調為7;
keynote_type=6;
%3為高音,2為中音,1為低音
Soundzone_change=[1,1,1,1,2,1,1,1,1,1,2,...
2,1,1,2,2,2,1,1,2,2,2,2,2,2,1,1,1,1,2,...
1,1,1,1,1,2,2,1,1,2,2,2,1,1,...
2,2,2,2,2,2,1,1,...
1,1,2,1,1,1,1,1,2,2,1,1,...
2,2,2,1,1,2,2,2,2,2,2,1,1,...
1,1,2,1,1,1,1,1,2,2,1,1,2,2,2,...
1,1,2,2,2,2,2,2];
%3為上升一個全音,2.5為上升一個半音,2為原音,1.5為下調一個半音,1為下調一個全音
up_down=2;
for i=1:1:len
y=[y,get_ware(tone(i),rythm(i),keynote_type,Soundzone_change(i),up_down)];
end
%plot(y)
sound(y,Fs) %按照給定的波,發出聲音的函數
2.聲波製作函數:
function y=get_ware(tone, rythm,keynote_type,Soundzone_change,up_down)
%tone為音節,rythm為節拍,keynote_type為當前基調預設為C調,keynote_change為改變基調,up_down為音節升降
%Sound zone_change為改變音區;
Fs=8192;
freqs=[440*2.^(3/12),440*2^(5/12),440*2^(7/12),440*2^(8/12),440*2^(10/12),440*2^(12/12),440*2^(14/12)];%C調中音
freqs=freqs*2.^((keynote_type-3)/12);
freqs=freqs*2.^((Soundzone_change-2)*12/12);
freqs=freqs*2.^((up_down-2)/12);
x=linspace(0,2*pi*rythm,floor(Fs*rythm));
y=(sin(freqs(tone)*x).*(1-(x/(2*pi*rythm))));
end
四、總結:
上述的音樂繪製還有一些值得研究的地方,比如說,如何發出同時發出多個音,實現更為複雜的樂曲的演奏,以及如何模擬出鋼琴按鍵輕重不同導致的尾音長短的不同。還有就是在轉換樂譜上邊,如果有更加智能的方式生成就更加好了,因為基礎的演奏的函數其實很簡單。