Anda di halaman 1dari 13

November 8, [DIGITAL SIGNAL PROCESSING] 2011

GENERATING MUSIC BASED ON FUNDAMENTAL FREQUENCY (MATLAB)

Artikel ini merupakan kelanjutan dari artikel sebelumnya tentang bagaimana membangkitkan gema (echo) dari sebuah suara dengan menggunakan matlab. Dengan menggunakan pengetahuan mengenai isyarat dasar maka kali ini kita akan mencoba untuk membuat musik dengan menggunakan matlab. Salah satu keunggulan matlab adalah dalam menyimpan isyarat ke dalam format file audio *.wav. Hal ini akan sangat membantu karena kita tidak lagi membutuhkan coder khusus karena semua nya berada di tangan kita. *apa cobaaaa.... Menurut pengetahuan saya yang sederhana ini, para ahli mengatakan bahwa isyarat alami pada dasarnya merupakan bentukan dari kombinasi isyarat sinusoidal yang jumlahnya sangat banyak atau tak terbatas. Tapi apakah sebuah sistem mengenal arti tidak terbatas? Saya rasa hingga saat ini kita masih memiliki sistem yang hanya mampu melakukan komputasi terbatas (berhingga). Isyarat alami disinyalir bersifat tak berhingga. Untuk dapat mengolah nya maka kita perlu melakukan pembatasan menjadi berhingga. Dengan dasar tersebut maka saya mencoba menggunakan isyarat sinusoidal untuk menghasilkan isyarat dengan frekuensi tertentu yang akan digunakan untuk menghasilkan bunyi tertentu dengan panjang data (terkait dengan frekuensi cuplik) yang terhingga. Nilai frekuensi yang saya gunakan adalah hasil tuning pada nada A=440 Hz. Perhatikan tabel berikut ini:

Sumber : http://www.dolmetsch.com/musictheory27.htm

Atau jika anda menginginkan nilai dengan hasil pembulatan bisa digunakan nilai-nilai pada tabel berikut ini:

[{EE&IT UGM, Indonesia}janshendry@gmail.com]

November 8, [DIGITAL SIGNAL PROCESSING] 2011

Sumber : http://www.zytrax.com/tech/audio/audio.html

Sebuah isyarat sinusoidal memiliki rumusan sebagai berikut: y = A sin 2 A = amplitudo f = frekuensi dasar t = waktu (detik) Sebagai gambaran, jika isyarat sinusoidal dibuat menggunakan frekuensi masing-masing dimana A=440 Hz sebagai acuan maka akan didapatkan bentuk-bentuk isyarat sebagai berikut ini:

[{EE&IT UGM, Indonesia}janshendry@gmail.com]

November 8, [DIGITAL SIGNAL PROCESSING] 2011

[{EE&IT UGM, Indonesia}janshendry@gmail.com]

November 8, [DIGITAL SIGNAL PROCESSING] 2011

[{EE&IT UGM, Indonesia}janshendry@gmail.com]

November 8, [DIGITAL SIGNAL PROCESSING] 2011

[{EE&IT UGM, Indonesia}janshendry@gmail.com]

November 8, [DIGITAL SIGNAL PROCESSING] 2011

Program di bawah ini digunakan untuk menghasilkan isyarat-isyarat seperti di atas (save dengan nama mymusic.m):
clear all; close all; clc; %% Frequency for each key data=xlsread('data.xlsx'); data=data/1000; A=3; % fs=8000; ts=1/fs; t=.5; % amplitudo % frekuensi cuplik % waktu cuplik detik

% key skey=['A ','A#','B ','C ','C#','D ','D#','E ','F ','F#','G ','G#']; for k=1:size(data,1) key=A*sin(2*pi*data(k,5).*(0:ts:t));
[{EE&IT UGM, Indonesia}janshendry@gmail.com]

November 8, [DIGITAL SIGNAL PROCESSING] 2011


figure, plot((0:ts:t),key); title(strcat('key-',skey(2*k-1:2*k),sprintf(', f = %.3f Hz',data(k,5)))); xlabel('waktu (sec)'); ylabel('amplitudo'); wavwrite(key,sprintf('key%d.wav',k)); end

program yang akan dibuat dirancang seperti ini:

GUI di atas memiliki program seperti di bawah (save dengan nama main1.m):
function varargout = main1(varargin) % MAIN1 M-file for main1.fig % MAIN1, by itself, creates p1 new MAIN1 or raises the existing % singleton*. % % H = MAIN1 returns the handle to p1 new MAIN1 or the handle to % the existing singleton*. % % MAIN1('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in MAIN1.M with the given input arguments. % % MAIN1('Property','Value',...) creates p1 new MAIN1 or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before main1_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to main1_OpeningFcn via varargin. %
[{EE&IT UGM, Indonesia}janshendry@gmail.com]

November 8, [DIGITAL SIGNAL PROCESSING] 2011


% *See GUI Options on GUIDE's Tools menu. % instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES Choose "GUI allows only one

% Edit the above text to modify the response to help main1 % Last Modified by GUIDE v2.5 08-Nov-2011 12:32:38 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @main1_OpeningFcn, ... 'gui_OutputFcn', @main1_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT

% --- Executes just before main1 is made visible. function main1_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in p1 future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to main1 (see VARARGIN) % Choose default command line output for main1 handles.output = hObject; % Update handles structure guidata(hObject, handles); % UIWAIT makes main1 wait for user response (see UIRESUME) % uiwait(handles.figure1);

[{EE&IT UGM, Indonesia}janshendry@gmail.com]

November 8, [DIGITAL SIGNAL PROCESSING] 2011

% --- Outputs from this function are returned to the command line. function varargout = main1_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in p1 future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Get default command line output from handles structure varargout{1} = handles.output; % --- Executes on button press in p1. function p1_Callback(hObject, eventdata, handles) choice=1; keys(choice) % --- Executes on button press in p2. function p2_Callback(hObject, eventdata, handles) choice=2; keys(choice) % --- Executes on button press in p3. function p3_Callback(hObject, eventdata, handles) choice=3; keys(choice) % --- Executes on button press in p4. function p4_Callback(hObject, eventdata, handles) choice=4; keys(choice) % --- Executes on button press in p5. function p5_Callback(hObject, eventdata, handles) choice=5; keys(choice) % --- Executes on button press in p6. function p6_Callback(hObject, eventdata, handles) choice=6; keys(choice) % --- Executes on button press in p7. function p7_Callback(hObject, eventdata, handles) choice=7; keys(choice)

[{EE&IT UGM, Indonesia}janshendry@gmail.com]

November 8, [DIGITAL SIGNAL PROCESSING] 2011


% --- Executes on button press in p8. function p8_Callback(hObject, eventdata, handles) choice=8; keys(choice) % --- Executes on button press in p9. function p9_Callback(hObject, eventdata, handles) choice=9; keys(choice) % --- Executes on button press in p10. function p10_Callback(hObject, eventdata, handles) choice=10; keys(choice) % --- Executes on button press in p11. function p11_Callback(hObject, eventdata, handles) choice=11; keys(choice) % --- Executes on button press in p12. function p12_Callback(hObject, eventdata, handles) choice=12; keys(choice)

function edit1_Callback(hObject, eventdata, handles) guidata(hObject,handles) % --- Executes during object creation, after setting all properties. function edit1_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end % --- Executes during object creation, after setting all properties. function edit2_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end % --- Executes on button press in dem1. function dem1_Callback(hObject, eventdata, handles) choice=13; keys(choice)

[{EE&IT UGM, Indonesia}janshendry@gmail.com]

November 8, [DIGITAL SIGNAL PROCESSING] 2011


function dem2_Callback(hObject, eventdata, handles) choice=14; keys(choice)

ketika tiap-tiap tombol nada di klik maka akan dipanggil fungsi berikut ini (save dengan nama keys.m):
function keys(choice) if choice==13 data=wavread('demo1.wav'); elseif choice==14 data=wavread('demo2.wav'); else data=wavread(sprintf('key%d.wav',choice)); end soundsc(data); end

pada GUI, anda bisa melihat ada tombol DEMO1 dan DEMO2. Saya memang sengaja memasukkan dua buah demo yang bisa anda perdengarkan untuk melihat hasil kombinasi beberapa nada sehingga membentuk sebuah lagu. Demo1 memiliki program berikut ini (save dengan nama demo1.m):
clear all; close all; clc; %% Frequency for each key data=xlsread('data.xlsx'); data=data/1000; %% Preparing sound for each key a=3; % amplitudo fs=8000; % frekuensi cuplik ts=1/fs; % waktu cuplik t=.3; % detik A=a*sin(2*pi*data(1,5).*(0:ts:t)); As=a*sin(2*pi*data(2,5).*(0:ts:t)); B=a*sin(2*pi*data(3,5).*(0:ts:t)); C=a*sin(2*pi*data(4,5).*(0:ts:t)); Cs=a*sin(2*pi*data(5,5).*(0:ts:t)); D=a*sin(2*pi*data(6,5).*(0:ts:t)); Ds=a*sin(2*pi*data(7,5).*(0:ts:t));

[{EE&IT UGM, Indonesia}janshendry@gmail.com]

November 8, [DIGITAL SIGNAL PROCESSING] 2011


E=a*sin(2*pi*data(8,5).*(0:ts:t)); F=a*sin(2*pi*data(9,5).*(0:ts:t)); Fs=a*sin(2*pi*data(10,5).*(0:ts:t)); G=a*sin(2*pi*data(11,5).*(0:ts:t)); Gs=a*sin(2*pi*data(12,5).*(0:ts:t)); %% Arranging key to form a song line1=[A,A,E,E,Fs,Fs,E,E,]; line2=[D,D,Cs,Cs,B,B,A,A,]; line3=[E,E,D,D,Cs,Cs,B,B]; line4=[E,E,D,D,Cs,Cs,B,B]; line5=[A,A,E,E,Fs,Fs,E,E,]; line6=[D,D,Cs,Cs,B,B,A,A,]; demo_1=[line1,line2,line3,line4,line5,line6]; filename='demo1.wav'; wavwrite(demo_1,filename); %% end

Demo2 memiliki program berikut ini (save dengan nama demo2.m):


clear all; close all; clc; %% Frequency for each key data=xlsread('data.xlsx'); data=data/1000; %% Preparing sound for each key a=3; % amplitudo fs=8000; % frekuensi cuplik ts=1/fs; % waktu cuplik t=.6; % detik A=a*sin(2*pi*data(1,5).*(0:ts:t)); As=a*sin(2*pi*data(2,5).*(0:ts:t)); B=a*sin(2*pi*data(3,5).*(0:ts:t)); C=a*sin(2*pi*data(4,5).*(0:ts:t)); Cs=a*sin(2*pi*data(5,5).*(0:ts:t)); D=a*sin(2*pi*data(6,5).*(0:ts:t)); Ds=a*sin(2*pi*data(7,5).*(0:ts:t)); E=a*sin(2*pi*data(8,5).*(0:ts:t)); F=a*sin(2*pi*data(9,5).*(0:ts:t)); Fs=a*sin(2*pi*data(10,5).*(0:ts:t));

[{EE&IT UGM, Indonesia}janshendry@gmail.com]

November 8, [DIGITAL SIGNAL PROCESSING] 2011


G=a*sin(2*pi*data(11,5).*(0:ts:t)); Gs=a*sin(2*pi*data(12,5).*(0:ts:t)); %% Arranging key to form a song line1=[C,C,A,A,D,D,B,B]; line2=[F,F,D,D,G,G,C,C]; demo_2=[line1,line2]; filename='demo2.wav'; wavwrite(demo_2,filename); %% end

Dengan program yang sederhana, ternyata kita bisa menghasilkan sebuah musik yang lumayan enak untuk didengar. Tentu kelebihannya adalah kita bisa melakukan eksperimen dan pengolahan terhadap isyarat-isyarat tersebut. Sebenarnya masih banyak yang bisa dilakukan termasuk jika kita menyatukannya ke dalam animasi (kebetulan saya pernah melihat video tentang menghasilkan alunan musik beethoven dengan menggunakan matlab beserta juga animasinya). Menarik!!!

Sumber: http://www.dolmetsch.com/musictheory27.htm http://en.wikipedia.org/wiki/Guitar_tunings http://www.zytrax.com/tech/audio/audio.html http://www.vaughns-1-pagers.com/music/musical-note-frequencies.htm http://users.rowan.edu/~shreek/networks1/music.html

@Thanks

[{EE&IT UGM, Indonesia}janshendry@gmail.com]