First, I would like to thank the WaveSurfer team for this simple but powerful tool!
However, I've been struggling to generate the following type of stimuli with great flexibility in the WaveSurfer. For now, I'm putting my Sine wave in a Triangle wave, but I believe adding a this new function could be very helpful for many other researchers.
%% generate envelope modulation
Fs=30000;
StimT=1.5;
StimDur=0.5;
Npre = round(0.5*Fs );
Npost = round(0.5*Fs);
NsampsAna=0.5*Fs;
avgSig = zeros(1,NsampsAna);
Nreps = 10;
riseT = StimDur/10;
slope = 1/riseT;
timeSig = 0:1/Fs:StimDur;
envSig = ones(1,numel(timeSig));
envSig(1:round(riseT*Fs)) = slope*timeSig(1:round(riseT*Fs));
envSig(end-round(riseT*Fs)+1:end) = 1-slope*timeSig(1:round(riseT*Fs));
freq = 300; volt = 5;
Sig = volt*sin(2*pi*freq*timeSig);
Sig = envSig.*Sig;
Sig2 = 5*ones(size(Sig));
Sig = [zeros(Npre,1); Sig'; zeros(Npost,1)];
Sig2 = [zeros(Npre,1); Sig2'; zeros(Npost,1)];
%% with functions
function Sig = makeSig(obj, voltVal, freq)
% Make signal
riseT = obj.params.StimT/10;
slope = 1/riseT;
timeSig = 0:1/obj.params.Fs:obj.params.StimT;
envSig = ones(1,numel(timeSig));
envSig(1:round(riseT*obj.params.Fs)) = slope*timeSig(1:round(riseT*obj.params.Fs));
envSig(end-round(riseT*obj.params.Fs)+1:end) = 1-slope*timeSig(1:round(riseT*obj.params.Fs));
SigVib = voltVal*sin(2*pi*freq*timeSig);
SigVib = envSig.*SigVib;
SigMask = randn(size(timeSig));
SigMask = 8*SigMask/max(abs(SigMask));
SigMask(end) = 0;
Sig = [SigVib' SigMask'];
end