53 lines
968 B
Matlab
Executable File
53 lines
968 B
Matlab
Executable File
function eval_adsr(Ta, Td, Vs, Tr, ks)
|
|
|
|
% eval_adsr(0.1, 0.2, 0.2, 0.2)
|
|
|
|
fs = 1000;
|
|
|
|
a_a = -log(1-ks)/(Ta*fs);
|
|
a_d = 5/(Td*fs);
|
|
a_r = 5/(Tr*fs);
|
|
state = 0;
|
|
s = 0;
|
|
tol = 1E-4;
|
|
n = 1;
|
|
p = 0;
|
|
k = 1/ks;
|
|
while (1),
|
|
|
|
if state == 0 % Attack
|
|
s = a_a + (1-a_a)*s;
|
|
y(n) = s/ks;
|
|
if s >= (ks-tol)
|
|
state = 1;
|
|
end;
|
|
end;
|
|
if state == 1 % Decay
|
|
s = (1-a_d)*s;
|
|
y(n) = s/(ks);
|
|
if s <= (Vs*ks+tol)
|
|
state = 2;
|
|
p = 0;
|
|
end;
|
|
end;
|
|
if state == 2 % sustain
|
|
y(n) = Vs;
|
|
if p >= 1*fs
|
|
state = 3;
|
|
s = Vs;
|
|
end;
|
|
p = p + 1;
|
|
end;
|
|
if state == 3 % Release
|
|
s = (1-a_r)*s;
|
|
y(n) = s;
|
|
if s <= (tol)
|
|
break;
|
|
end;
|
|
end;
|
|
n = n + 1;
|
|
end;
|
|
|
|
plot((0:n-1)/fs, y); grid;
|
|
set(gca,'xtick',[0:0.1:(n-1)/fs])
|