카이로스의 시간

[통신공학] matlab을 이용한 piano project 본문

기타

[통신공학] matlab을 이용한 piano project

차녕 2017. 9. 14. 12:56

matlab을 이용해서 간단한 piano project를 만듭니다.

 

밑에 악보는 이루마의 'river flows in you'의 앞부분 입니다.

 

matlab은 비교적 high-level language라서 구현하는 부분은 어렵지 않습니다. 그래서 matlab 기초는 포스팅하지 않겠습니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
%이루마 river flows in you 앞부분 만들기
Fs = 8192; %주파수 샘플링비율
= 0:1/Fs:(1-1/Fs);
oc = [440 523 587 659 830 880];%높은음자리표 주파수
c_oc = [146 184 220 261 329 349];%낮은음자리표 주파수
Sla = oc(1); %4옥타브 라
do = oc(2); %5옥타브 도
re = oc(3); %5옥타브 레
mi = oc(4); %5옥타브 미
sol = oc(5); %5옥타브 솔샾
la = oc(6); %5옥타브 라
three_re = c_oc(1); %3옥타브 레
three_pa = c_oc(2); %3옥타브 파
three_la = c_oc(3); %3옥타브 라
four_do = c_oc(4); %4옥타브 도
four_mi = c_oc(5); %4옥타브 미
four_pa = c_oc(6); %4옥타브 파
river = [la sol la sol la mi la re re re Sla do];
chord = [three_pa four_do four_pa 0 three_re three_la four_mi 0 four_mi 0 0 0 ]; %박자맞추기위해 중간에 0 넣음
for i=1:numel(river) %i=1부터 river배열 끝부분의 수까지 들어감
    x = 0.02*cos(2*pi*river(i)*t); %높은음자리표 진폭은 소리의크기
    y = 0.02*cos(2*pi*chord(i)*t); %낮은음자리표 화음용  
    sound(x,Fs); %높은음 소리내기
    if(i<10)
       sound(y,Fs);%낮은음 소리내기
    end    
    Xf = fft(x); %Xf에 x에대한 주파수도메인 함수표시
    f = 0:(Fs-1);
    plot(f,abs(Xf)); %함수그림 x축은 주파수절대값 y축은 amp
    xlabel('Frequency');
    ylabel('Amplitude');
    if(i ~= 9) %i = 9일때빼고 0.5초씩 딜레이
        pause(0.5);
    end
    if(i == 9) % i = 9일때 1초딜레이
        pause(1);        
    end    
    cla; %실행될때마다 그래프 지우고 다시그림
    clear x;
    clear y;
    clear Xf;
end
cs

river 부분이 소프라노(?) 부분이고 chord가 화음이란 뜻인데 밑에 낮은음자리표(?)부분 이다.

river, chord라는 배열만들어서 싱크 맞게 0을 적절하게 넣었음.

시간 domain과 주파수 domain에서,

 

 

이렇게 plotting 결과를 볼 수 있다. 위 결과는 주파수-진폭 그래프이다.

 

Fs(샘플링 주파수)는 8192로 설정했는데 그 이유는 샘플링 주파수는 주파수 대역폭의 약 2배 이어야하고

음계주파수가 대략 수십Hz에서 수천 Hz인데 그중 7옥타브가 대략 4000Hz이므로 1~7옥타브만 듣기위해 샘플링주파수를 8192로 잡았다.