This repository has been archived on 2023-12-21. You can view files and clone it, but cannot push or open issues or pull requests.
ece45-project/src/PitchEnvelope/DarellAnnePitchEnvelope.m
2021-12-10 10:01:30 +08:00

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