In this chapter we suggest an exercise to help you check your understanding of how to sample and play audio. Try completing this exercise in a new file of your own before you check the solution given in the example patch. (But don't have the example Patcher open while you design your own patch, or you will hear both patches when you turn audio on.) The exercise is to design a patch in which:
• Typing the a key on the computer keyboard turns audio on. Typing a again toggles audio off.
• Typing r on the computer keyboard makes a one-second recording of whatever audio is coming into the computer (from the input jacks or from the internal CD player).
• Typing p plays the recording. Playback is to be at half speed, so that the sound lasts two seconds.
• An amplitude envelope is applied to the sample when it is played, tapering the amplitude slightly at the beginning and end so that there are no sudden clicks heard at either end of the sample.
• The sample is played back with a 3 Hz vibrato added to it. The depth of the vibrato is one semitone (a factor of 2±1/12
) up and down.
You will need to store the sound in a buffer~
and play it back from memory.
You can record directly into the buffer~
. (See Tutorial 13
.) The input to record~
will come from adc~
The two obvious choices for playing a sample from a buffer~
at half speed are play~
. However, because we want to add vibrato to the sound -- by continuously varying the playback speed -- the better choice is groove~
, which uses a (possibly time-varying) signal to control its playback speed directly. (See Tutorial 14
The amplitude envelope is best generated by a line~
object which is sending its output to a *~
object to scale the amplitude of the output signal (coming from groove~
). You might want to use a function
object to draw the envelope, and send its output to line~
to describe the envelope. (See Tutorial 7
The computer keyboard will need to trigger messages to the objects adc~
, and line~
) in order to perform the required tasks. Use the key
object to get the keystrokes, and use select
to detect the keys you want to use.
Use a sinusoidal wave from a cycle~
object to apply vibrato to the sample. The frequency of the cycle~
will determine the rate
of the vibrato, and the amplitude of the sinusoid will determine the depth
of vibrato. Therefore, you will need to scale the cycle~
object's amplitude with a *~
object to achieve the proper vibrato depth.
In the discussion of vibrato in Tutorial 10
, we created vibrato by adding the output of the modulating oscillator to the frequency input of the carrier oscillator. However, two things are different in this exercise. First of all, the modulating oscillator needs to modulate the playback speed of groove~
rather than the frequency of another cycle~
object. Second, adding the output of the modulator to the input of the carrier -- as in Tutorial 10
-- creates a vibrato of equal frequency
above and below the carrier frequency, but does not create a vibrato of equal pitch
up and down (as required in this exercise). A change in pitch is achieved by multiplying
the carrier frequency by a certain amount, rather than by adding an amount to it.
To raise the pitch of a tone by one semitone, you must multiply its frequency by the twelfth root of 2, which is a factor of 2 to the 1
power (approximately 1.06). To lower the pitch of a tone by one semitone, you must multiply its frequency by 2 to the -1
power (approximately 0.944). To calculate a signal value that changes continuously within this range, you may need to use an MSP object not yet discussed, pow~
. Consult its description in the Objects section of this manual for details.
• Scroll the example Patcher window all the way to the right to see a solution to this exercise.
Solution to the exercise for recording and playing an audio sample
The arguments to the buffer~
object specify a length in milliseconds ( ) and a number of channels ( ). This determines how much memory will initially be allocated to the buffer~
Set name, length, and channels of the buffer~
Since the memory allocated in the buffer~
is limited to one second, there is no need to tell the record~
object to stop when you record into the buffer~
. It stops when it reaches the end of the buffer~
The keystrokes from the computer keyboard are reported by key
, and the select
object is used to detect the a
, and p
keys. The s from select
trigger the necessary messages to adc~
, and groove~
Keystrokes are detected and used to send messages to MSP objects
The keystroke p
is also used to trigger the amplitude envelope at the same time as the sample is played. This envelope is used to scale the output of groove~
A two-second envelope tapers the amplitude at the beginning and end of the sample
A sig~ 0.5
object sets the basic playback speed of groove~
at half speed. The amplitude of a 3 Hz cosine wave is scaled by a factor of 0.083333 (equal to 1
, but more computationally efficient than dividing by 12) so that it varies from -1
. This sinusoidal signal is used as the exponent in a power function in pow~
(2 to the power of the input), and the result is used as the factor by which to multiply the playback speed.
Play at half speed, ± one semitone