75 lines
2.1 KiB
Matlab
75 lines
2.1 KiB
Matlab
%Written by Darell and Anne
|
|
%If there is a frequency of 200Hz:
|
|
%1. it needs to ramp up a frequency from 0Hz to the 200Hz over the attack time
|
|
%2. It needs to ramp down to a set sustained frequency over the decay time e.g. 160Hz < 200Hz
|
|
%3. It maintains this 160Hz until the release time
|
|
%4. Release time: It decays from 160Hz further all the way back to 0Hz.
|
|
%This envelope uses logarithmic calculations
|
|
|
|
% CONTRIBUTORS:
|
|
% Person1: Darell
|
|
% Person2: Anne
|
|
|
|
% DOCUMENTATION:
|
|
% phase shift is in number of periods
|
|
% fs is the sampling frequency: how many sample points per second
|
|
% duration is time in seconds
|
|
% duty is a number between 0 and 1
|
|
|
|
|
|
function output = DarellAnnePitchEnvelope(input, Fs, attack,decay,sustain,release) %percentages for attack, decay, sustain, release
|
|
len = length(input);
|
|
T = (len-1)/Fs;
|
|
attacktime = attack * T * Fs;
|
|
decaytime = attacktime + decay * T * Fs;
|
|
sustaintime = (T - (release * T)) * Fs;
|
|
|
|
output = zeros([1,len]);
|
|
|
|
tcounter = 1;
|
|
%attack phase
|
|
curr = attacktime;
|
|
while tcounter <= curr
|
|
ncount = round(curr*log(tcounter)/log(curr)+1);
|
|
output(tcounter) = input(ncount);
|
|
tcounter = tcounter+1;
|
|
end
|
|
|
|
%decay phase
|
|
prevcur = curr;
|
|
tcounter = prevcur;
|
|
curr = decaytime;
|
|
while tcounter <= curr
|
|
ncount = round(sustain*curr*(1-log(tcounter)/log(prevcur)) + prevcur);
|
|
tcounter = round(tcounter);
|
|
output(tcounter)
|
|
output(tcounter) = input(ncount);
|
|
tcounter = tcounter+1;
|
|
end
|
|
|
|
%sustain phase
|
|
prevncount = ncount;
|
|
prevcur = curr;
|
|
tcounter = prevcur;
|
|
curr = sustaintime;
|
|
while tcounter <= curr
|
|
ncount = round(sustain*(tcounter - prevcur) + prevncount);
|
|
tcounter = round(tcounter);
|
|
output(tcounter) = input(ncount);
|
|
tcounter = tcounter+1;
|
|
end
|
|
|
|
%release phase
|
|
prevncount = ncount;
|
|
prevcur = curr;
|
|
tcounter = prevcur;
|
|
curr = Fs;
|
|
while tcounter <= Fs
|
|
ncount = round(curr*(1-log(tcounter)/log(prevcur)) + prevncount);
|
|
tcounter = round(tcounter);
|
|
output(tcounter) = input(ncount);
|
|
tcounter = tcounter+1;
|
|
end
|
|
|
|
end
|