[Matlab] Muzik Sentezleme

Aslinda muzik degil de melodi sentezi desek daha dogru olabilirdi. Cep telefonu melodisi yazmak gibi birsey.

Sentezlemeye calisacagimiz melodi pek bir sevdigim Norvec’li grup Dimmu Borgir’in 1996 Stormblåst albumundeki Når Sjelen Hentes Til Helvete isimli parcadan. 2005 yilinda Stormblåst albumunu yeni kayitlarla tekrar cikardilar. Fakat klasiklerin yeri ayri :)

Youtube’da buldugum asagidaki video da tam olarak sentezleyecegimiz melodinin piyano ile icra edilmis versiyonu. Hatta daha fazlasi. Yalnizca ilk kismi sentezlemeye calisacagim.

Oncelikle notalari gozden gecirelim.

Når Sjelen Hentes Til Helvete

Når Sjelen Hentes Til Helvete

clear
close all
% 1-2 olculerin notalari
olcu12=['E','f','G','f', 'E']; % mi fa# sol fa# mi
zaman12=[1/4 1/8 1/8 1/8 1/8]; % notalarin vurus degerleri
% 3-4 olculerin notalari
olcu34=['C','E','F','H','F','E']; % do mi fa la fa mi
zaman34=[1/8 1/8 1/8 1/8 1/8 1/8]; % notalarin vurus degerleri
% 5-6 olculerin notalari
olcu56=['A','A','J','H','J','H']; % la la do la do la
zaman56=[1/8 1/8 1/8 1/8 1/8 1/8]; % notalarin vurus degerleri
% 7-8 olculerin notalari
olcu78=['D','f','G','I','G','f']; % re fa# sol si sol fa#
zaman78=[1/8 1/8 1/8 1/8 1/8 1/8]; % notalarin vurus degerleri
zaman90=[1/4 1/4 1/4 1/2 1/2 1]; % notalarin vurus degerleri
% zaman90 parca biterken yavaslayan kisim icin gecerli.
%vurus degerleri artarak bitiyor.
 
%% matris boyutlari
boyut=16384;
aaa=1:boyut/4; % 1/4 vuruslu notalar icin geri donen
% fonksiyon degerinin saklanacagi matris boyutu
aa=1:boyut/8% 1/8 vuruslu notalar icin matris (ilk olcu)
bb=1:boyut/8% 1/8 vuruslu notalar icin matris (ikinci olcu)
cc=1:boyut/8% 1/8 vuruslu notalar icin matris (ucuncu olcu)
dd=1:boyut/8% 1/8 vuruslu notalar icin matris (dorduncu olcu)
%
sona=1:boyut/4; % parca bitisindeki yavaslayan kisim icin matris (1/4)
sonb=1:boyut/4; % parca bitisindeki yavaslayan kisim icin matris (1/4)
sonc=1:boyut/4; % parca bitisindeki yavaslayan kisim icin matris (1/4)
sond=1:boyut/2; % parca bitisindeki yavaslayan kisim icin matris (1/2)
sone=1:boyut/2; % parca bitisindeki yavaslayan kisim icin matris (1/2)
sonf=1:boyut; % parca bitisindeki yavaslayan kisim icin matris (1)
 
%% olcu 1-2
aaa(1,:)=nota(olcu12(1),zaman12(1));
for z=1:length(zaman12)-1
aa(z,:)=nota(olcu12(z+1),zaman12(z+1));
end
%% olcu 3-4
for z=1:length(zaman34)
bb(z,:)=nota(olcu34(z),zaman34(z));
end
%% olcu 5-6
for z=1:length(zaman56)
cc(z,:)=nota(olcu56(z),zaman56(z));
end
%% olcu 7-8
for z=1:length(zaman78)
dd(z,:)=nota(olcu78(z),zaman78(z));
end
%% olcu 9-0
sona(1,:)=nota(olcu78(1),zaman90(1));
sonb(1,:)=nota(olcu78(2),zaman90(2));
sonc(1,:)=nota(olcu78(3),zaman90(3));
sond(1,:)=nota(olcu78(4),zaman90(4));
sone(1,:)=nota(olcu78(5),zaman90(5));
sonf(1,:)=nota(olcu78(6),zaman90(6));
 
%% tum dizileri arka arkaya diz
xx=[];
yy=[];
zz=[];
ww=[];
for say=1:length(zaman12)-1
xx=[xx aa(say,:)];
end
for say=1:length(zaman34)
yy=[yy bb(say,:)];
end
for say=1:length(zaman56)
zz=[zz cc(say,:)];
end
for say=1:length(zaman78)
ww=[ww dd(say,:)];
end
%% dizilerin hepsini cal.
tumdizi=[aaa xx aaa xx yy yy zz zz ww ww aaa xx aaa xx yy yy zz zz ww sona sonb sonc sond sone sonf];
soundsc(tumdizi,11025);
%bitti :)

En son kisimda, parcada olmayan bir sekilde yavaslatarak bitirdim :) O da benim yorumum olsun.

Burada kullandigim nota fonksiyonunu da ayri bir dosyada yazdim. O da su sekilde,

function  [a]=nota(note,vurus)
 
switch note
%% native notalar
case {'A'} %la
frekans=440;
case {'a'} %la#
frekans=466.16;
case {'B'} %si
frekans=493.92;
case {'C'} %do
frekans=523.28;
case {'c'} %do#
frekans=554.40;
case {'D'} %re
frekans=587.36;
case {'d'} %re#
frekans=622.24;
case {'E'} %mi
frekans=659.28;
case {'F'} %fa
frekans=698.48;
case {'f'} %fa#
frekans=740;
case {'G'} %sol
frekans =784;
%% oktav yukari
case {'H'} %la
frekans=2*440;
case {'h'} %la#
frekans=2*466.16;
case {'I'} %si
frekans=2*493.92;
case {'J'} %do
frekans=2*523.28;
case {'j'} %do#
frekans=2*554.40;
case {'K'} %re
frekans=2*587.36;
case {'k'} %re#
frekans=2*622.24;
case {'L'} %mi
frekans=2*659.28;
case {'M'} %fa
frekans=2*698.48;
case {'m'} %fa#
frekans=2*740;
case {'N'} %sol
frekans=2*784;
%% oktav asagi
case {'O'} %la
frekans=440/2;
case {'o'} %la#
frekans=466.16/2;
case {'P'} %si
frekans=493.92/2;
case {'Q'} %do
frekans=523.28/2;
case {'q'} %do#
frekans=554.40/2;
case {'R'} %re
frekans=587.36/2;
case {'r'} %re#
frekans=622.24/2;
case {'S'} %mi
frekans=659.28/2;
case {'T'} %fa
frekans=698.48/2;
case {'t'} %fa#
frekans=740/2;
case {'U'} %sol
frekans =784/2;
%% diger durumlar
otherwise
disp('Yok boyle bisey')
frekans=0;
end
%% Belirlenen frekansda ve vurus suresinde sinus
%  sinyali fonksiyonun cikisina veriliyor.
a=sin(2*pi*frekans*(0:1/16383:vurus));

Burada cozemedigim ve aklimi kurcalayan bir soru var. soundsc komutu ile tumdizi matrisini sese donustururken kullandigim ornekleme frekansi denedigim farkli bilgisayarlarda farkli sonuclar verdi. Bazisinda 44100 kullandigimda, bazisinda ise buradaki gibi 11025 kullandigimda dogru sonucu verdi. Nedenini cozemedim.

Ayrica kodun yukaridaki kismina ek olarak, olusan matrisin spektogramini da cizdiriyordum. Fakat su anda kullandigim Matlab’in surumu ile daha once kullandigim arasinda bir uyumsuzluk var. O yuzden bir sorun cikti. O kismi da su sekilde idi,

%% spektrumlari cizdir
subplot(2,1,1);
spectogram(tumdizi,1024,6950,256,192);    % tumdizinin spektrumunu cizdir.
grid on;
title('Yapay Sinyalin Spektrumu')
subplot(2,1,2);
wav=wavread('sinyal1.wav',[2000 12000]);     % gercek sesi import et
spectogram(wav,2048,44100,1024,256);        % sesin spektrumunu cizdir.
grid on;
title('Gercek Sesin Spektrumu')

Sonucta ortaya cikan matrisi de bir wav dosyasina yazdirip

lame girdi.wav cikti.mp3

seklinde basitce mp3′e donusturdukten sonra burada dinlenebilir hale geldi.

Audio clip: Adobe Flash Player (version 9 or above) is required to play this audio clip. Download the latest version here. You also need to have JavaScript enabled in your browser.

Sarkinin orijinal hali de burada. Bir ihtimal oldschool black metal sevenler cikabilir :) Once 1996, ardindan da 2005 versiyonu geliyor, tum sevenler icin.

  • 00:00 – 04:30 1996 versiyonu
  • 04:30 – 09:12 2005 versiyonu

Related Posts
  1. Çok güzel bir yazı olmuş, tebrikler. Şu finaller bi bitsin, biraz kurcalayacam :)

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">