2017-06-02 5 views
2

J'écris une fonction MATLAB en train de jouer une chanson (thème Game of Thrones).Musique de thème - Essayer d'obtenir la durée et les touches pour travailler ensemble

J'ai la bonne frappe et la durée. J'essaie d'en avoir deux (aigus et graves) en même temps et pour que chaque frappe ait la bonne durée. Pour une raison quelconque, je ne peux pas obtenir la durée pour travailler avec la touche (ils jouent tous à la durée = 1) ou pour que les deux ensembles jouent ensemble. Des idées?

function xx = key2note(X, keynum, dur) 
% KEY2NOTE Produce a sinusoidal waveform corresponding to a given piano key number 
% usage: xx = key2note (X, keynum, dur) 
% xx = the output sinusoidal waveform 
% X = complex amplitude for the sinusoid, X = A*exp(j*phi). 
% keynum = the piano keyboard number of the desired note 
% dur = the duration (in seconds) of the output note 

fs = 8000; 
tt = (1/fs):(1/fs):dur; 
freq = 440*(2^((keynum-49)/12)); %<=============== fill in this line 
xx = real(X*exp(j*2*pi*freq*tt)); %<=============== fill in this line 
end 

t = 0.17; 
%treble - 40 is middle C 
throne.keys = [47 40 43 45, 47 40 43 45, 47 40 43 45, 47 40 43 45, 47 40 44 45, 47 40 44 45, 47 40 44 45, 47 40 44 45, 47, 40, 40 45 47, 40 43 45, 42 47 36 40]; 
throne.dur = [ 1 1 0.5 0.5, 1 1 0.5 0.5, 1 1 0.5 0.5, 1 1 0.5 0.5, 1 1 0.5 0.5, 1 1 0.5 0.5, 1 1 0.5 0.5, 1 1 0.5 0.5, 4, 4, 1 1 2 1, 2 1 1, 1 1 1 1]; 

%bass 
throne.keys2 = [ 21, 21 25 28 31 28 25, 21 25 28 31 28 25]; 
throne.dur2 = [ 32, 1/3 1/3 1/3 1/3 1/3 1/3, 1/3 1/3 1/3 1/3 1/3 1/3]; 

throne.durations = 0.2 * ones(1,length(throne.dur)); 
fs = 8000; % 11025 Hz also works 
f = 329.62; 
xx = zeros(1, sum(throne.dur)*fs + length(throne.keys)); 
n1 = 1; 
for kk = 1:length(throne.keys) 
    keynum = throne.keys(kk); 
    tone = key2note(1,keynum,0.25); %amplitude 1, keynum, 0.38s % <------- Fill in this line 
    n2 = n1 + length(tone) - 1; 
    xx(n1:n2) = tone; %<------- Insert the note 
    n1 = n2 + 1; 
end 

fs = 8000; 
%xt = zeros(1, sum(tdur)*fs + length(keyst)); 
%xb = zeros(1, sum(bdur)*fs + 1); 
%xa = zeros(1, sum(adur)*fs+1); 
%xd = zeros(1, sum(ddur)*fs+1); 
%xx = xt + xb + xa + xd 
xx = xt + xb; 
soundsc(xx,fs) 

Répondre

0

Je commenté quelques lignes jamais utilisées sur - vous pouvez supprimer les commentaires si elles ont été utilisées pour autre chose plus tard. Aussi je me sentais tellement libre de faire t un contrôle de vitesse globale.

t = 0.17; % this variable was never used. 
%I assumed you wanted to control the overall speed with it and felt so free to adjust the durations with it. 

%treble - 40 is middle C 
throne.keys = [47 40 43 45, 47 40 43 45, 47 40 43 45, 47 40 43 45, 47 40 44 45, 47 40 44 45, 47 40 44 45, 47 40 44 45, 47, 40, 40 45 47, 40 43 45, 42 47 36 40]; 
throne.dur = t*[ 1 1 0.5 0.5, 1 1 0.5 0.5, 1 1 0.5 0.5, 1 1 0.5 0.5, 1 1 0.5 0.5, 1 1 0.5 0.5, 1 1 0.5 0.5, 1 1 0.5 0.5, 4, 4, 1 1 2 1, 2 1 1, 1 1 1 1]; 

%bass 
throne.keys2 = [ 21, 21 25 28 31 28 25, 21 25 28 31 28 25]; 
throne.dur2 = t*[ 32, 1/3 1/3 1/3 1/3 1/3 1/3, 1/3 1/3 1/3 1/3 1/3 1/3]; 

%throne.durations = 0.2 * ones(1,length(throne.dur)); % this was never used - no clue what you intended to do with it 
fs = 8000; % 11025 Hz also works 
%f = 329.62; % is also never used 

%treble loop 
xt = zeros(1, ceil(sum(throne.dur)*fs + length(throne.keys))); 
n1 = 1; 
for kk = 1:length(throne.keys) 
    tone = key2note(1,throne.keys(kk),throne.dur(kk)); % You used here the constant length of 0.25 instead of taking the duration value from throne.dur 
    n2 = n1 + length(tone) - 1; 
    xt(n1:n2) = tone; %<------- Insert the note 
    n1 = n2 + 1; 
end 

%Bass loop 
xb = zeros(1, ceil(sum(throne.dur2)*fs + length(throne.keys2))); 
n1 = 1; 
for kk = 1:length(throne.keys2) 
    tone2 = key2note(1,throne.keys2(kk),throne.dur2(kk)); 
    n2 = n1 + length(tone2) - 1; 
    xb(n1:n2) = tone2; %<------- Insert the note 
    n1 = n2 + 1; 
end 
xb(length(xb)+1:length(xt)) = 0; %bass voice has a much shorter duration currently - padding to same size as xt with 0's at the end. 
%If you add more voices, you have to pad them all to the length of the longest one. 


%xt = zeros(1, sum(tdur)*fs + length(keyst)); 
%xb = zeros(1, sum(bdur)*fs + 1); 
%xa = zeros(1, sum(adur)*fs+1); 
%xd = zeros(1, sum(ddur)*fs+1); 
%xx = xt + xb + xa + xd 
xx = xt + xb; 
soundsc(xx,fs) 

Bien sûr, vous pouvez simplement télécharger quelque part la chanson thème et utiliser [y,Fs] = audioread(filename) pour le convertir. Mais cela ne serait même pas aussi cool que ce que vous faites.