Поэтому я хочу применить кривую ADSR для моей функции тона, которая использует разные значения амплитуды
В функции envel у меня есть функция для моего массива кривых ADSR
Сначала отключено
У меня проблемы с применением значений к моему массиву E
Я хочу, чтобы для фазы атаки я набрал 1/8 для достижения 1
Любые предложения о том, как это сделать sh реализация приветствуется.
Но мои реализации не работают, я попытался создать вектор, который имеет 1/8 значения моей волны греха
Пытался использовать этот массив для 1/8 Значения моего E, но я получаю только 0 в качестве записей для региона E
Я должен использовать параметры envel
sound(note(23, 1 / 2, 1, 8000));
function [sinusoid] = createWaveform(frequency, fs, duration, A)
Fs = fs; % samples per second
dt = 1 / Fs; % seconds per sample
t = (0:dt:duration)'; % seconds
% %Sine wave:
Fc = frequency; % hertz
sinusoid = A .* cos(2 * pi * Fc * t + (2 * pi) .* rand(1, 1));
% Plot the signal versus time:
end
function [tone] = note(keynum, relDuration, fullDuration, fs)
basetone = 440;
frequency = basetone * nthroot(2, 12) ^ (keynum - 49);
tone = createWaveform(frequency, fs, relDuration * fullDuration, 1) .* envel(relDuration, fullDuration, fs);
end
% [E] = envel(relDuration,fullDuration,fs)
function [E] = envel(relDuration, fullDuration, fs)
dt = 1 / fs;
dr = fullDuration * relDuration;
t = (0:dt:dr)';
E = (0:dt:dr)';
S = 0;
a = 1 / 8 * length(t);
f = linspace(0, 1, a);
E(1:round(1 / 8 * length(t))) = f(1, :);
X = 1; % Delay
for i = round(length(t) * 1 / 8) : round(length(t) * 3 / 8)
E(i) = X - 1 / 10 * (relDuration * fullDuration * fs * 1 / 8);
X = E(i);
end
F = X; % Sustain
for i = round(length(t) * 3 / 8) : round(length(t) * 6 / 8)
E(i) = F;
end
Y = F; % Restain
for i = round(length(t) * 6 / 8) : round(length(t) * 8 / 8)
E(i) = Y - F / (relDuration * fullDuration * 1 / 8);
end
disp(E);
end