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~ with
record~. (See
Tutorial 13.) The input to
record~ will come from
adc~ (or
ezadc~).
The two obvious choices for playing a sample from a
buffer~ at half speed are
play~ and
groove~. 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~,
record~,
groove~, and
line~ (or
function) 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/
12 power (approximately 1.06). To lower the pitch of a tone by one semitone, you must multiply its frequency by 2 to the
-1/
12 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 (
1000) and a number of channels (
2). 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,
r, and
p keys. The
bangs from
select trigger the necessary messages to
adc~,
record~, 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/
12, but more computationally efficient than dividing by 12) so that it varies from
-1/
12 to
1/
12. 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