1
votes

I want to generate my own samples of a Kick, Clap, Snare and Hi-Hat sounds in MATLAB based on a sample I have in .WAV format.

Right now it does not sound at all correct, and I was wondering if my code does not make sense? Or if it is that I am missing some sound theory.

Here is my code right now.

 [y,fs]=audioread('cp01.wav');
 Length_audio=length(y);
 df=fs/Length_audio;
 frequency_audio=-fs/2:df:fs/2-df;
 frequency_audio = frequency_audio/(fs/2); //Normalize the frequency
 figure
 FFT_audio_in=fftshift(fft(y))/length(fft(y));
 plot(frequency_audio,abs(FFT_audio_in));

The original plot of y.

The sound

My FFT of y

enter image description here

I am using the findpeaks() function to find the peaks of the FFT with amplitude greater than 0.001.

[pk, loc] = findpeaks(abs(FFT_audio_in), 'MinPeakHeight', 0.001);

I then find the corresponding normalized frequencies from the frequency audio (positive ones) and the corresponding peak.

 loc = frequency_audio(loc);
 loc = loc(length(loc)/2+1:length(loc))
 pk = pk(length(pk)/2+1:length(pk))

So the one sided, normalized FFT looks like this.

enter image description here

Since it looks like the FFT, I think I should be able to recreate the sound by summing up sinusoids with the correct amplitude and frequency. Since the clap sound had 21166 data points I use this for the for loop.

for i=1:21116

    clap(i) = 0;
for j = 1:length(loc);
    clap(i) = bass(i) + pk(j)*sin(loc(j)*i);

end

end

But this results in the following sound, which is nowhere near the original sound. enter image description here

What should I do differently?

1

1 Answers

1
votes

You are taking the FFT of the entire time-period of the sample, and then generating stationary sinewaves for the whole duration. This means that the temporal signature of the drum is gone. And the temporal signature is the most characteristic of percussive unvoiced instruments.

Since this is so critical, I suggest you start there first instead of with the frequency content. The temporal signature can be approximated by the envelope of the signal. MATLAB has a convenient function for this called envelope. Use that to extract the envelope of your sample.

Then generate some white-noise and multiply the noise by the envelope to re-create a very simple version of your percussion instrument. You should hear a clear difference between Kick, Clap, Snare and Hi-Hat, though it won't sound the same as the original.

Once this is working, you can attempt to incorporate frequency information. I recommend taking the STFT to get a spectrogram of the sound, so you can see how it the frequency spectrum changes over time.