Create musical notes with pauses in between
Show older comments
Dear community,
I am interested in creating a simple alarm tone using MATLAB and would like to know how to put various lengths of pauses in between notes.
Currently i have the following. How can i add pauses between the notes 'C' 'd' 'g' 'C' 'd'?
notes={'C' 'c' 'd' 'e' 'f' 'g'}
freq=[523.251 261 294 330.00 349.00 392]
song={'C' 'd' 'g' 'C' 'd' }
dur=[0.125 0.125 0.125 0.06 0.5]
Answers (1)
Cris LaPierre
on 5 Jan 2021
0 votes
10 Comments
Mengjia Lyu
on 5 Jan 2021
Cris LaPierre
on 5 Jan 2021
Use a for loop to play the notes one at a time, and add a pause after each note has been played. The pause should be at least as long as the duration value, or the notes will play on top of each other.
Mengjia Lyu
on 5 Jan 2021
Mengjia Lyu
on 5 Jan 2021
Cris LaPierre
on 5 Jan 2021
Could you explain what you mean by "mess up with the original tune"?
I would modify your code by specifying a sample frequency instead of a period. Then, when playing the sound and when writing the audio, use the specified sample frequency to ensure the timing is preserved.
Here's how I might do it.
notes={'C' 'c' 'd' 'e' 'f' 'g'}
freq=[523.251 261 294 330.00 349.00 392]
Fs = 20*min(freq);
song={'C' 'd' 'g' 'C' 'd' } % your song
dur=[0.5 0.5 0.5 0.5 0.5]
a=[]
for k = 1 : numel(song)
index = find(ismember(notes, song{k}));
numberOfSoundSamples = dur(k) * Fs;
t = linspace(0, dur(k), numberOfSoundSamples);
a=[a sin(2 * pi * freq(index) * t)]; % sinusoidal
end
sound(a,Fs)
audiowrite('alarm.wav',a,Fs)
Mengjia Lyu
on 5 Jan 2021
Cris LaPierre
on 5 Jan 2021
Edited: Cris LaPierre
on 5 Jan 2021
The first issue is the placement of the pause, then. This pause is happening after every note. However, the code does not wait for sound(a) to finish playing before moving on to the pause. They are executed near simultaneously. Your pause should be equal to the duration of a plus one more second.
Also, pause pauses execution of the code. It does nothing to affect the values of a.
Mengjia Lyu
on 5 Jan 2021
Mengjia Lyu
on 5 Jan 2021
Cris LaPierre
on 5 Jan 2021
Edited: Cris LaPierre
on 5 Jan 2021
Duration is dependent on the sample frequency, which could be anything. You could try setting the sample frequency rather than defining it as the min of freq.
Try this.
Fs = 8000;
...
for k = 1 : numel(song)
index = ismember(notes, song{k});
t = 0:1/Fs:dur(k);
a=[sin(2 * pi * freq(index) * t)]; % sinusoidal
sound(a,Fs)
pause(dur(k))
end
Categories
Find more on Correlation and Convolution in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!