Matlab, как мне применить кривую ASDR, чтобы получить более гладкие звуки (проблема с реализацией) - PullRequest
0 голосов
/ 01 февраля 2020

Поэтому я хочу применить кривую 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
...