0

所以我想为使用不同幅度值的音调函数应用 ADSR 曲线

在函数信封中,我有我的 ADSR 曲线数组的函数

首先关闭

我有问题将值应用到我的 E 数组

我希望我的攻击阶段需要 1/8 才能达到 1

欢迎对如何完成实施提出任何建议,谢谢。

但是我的实现不起作用我已经尝试创建一个向量,该向量具有我的正弦波的 1/8 值

试图将此数组用于我的 E 的 1/8 值,但我只得到 0 作为 E 区域的条目

我必须使用信封的参数

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
4

0 回答 0