Specifying loop parameters
Some sounds are simply played from beginning to end; for example, a
line of spoken dialog, a gunshot, or a footstep. For some other
sounds, it is useful
to be able to play the sound in a loop. For example, in a
car racing game, you might want the sound of the engine to play in a
continuous loop while the car is in motion.
You can simply loop a sound from the beginning to the end; you can also
loop just a section of the sound. For example, for our car engine
sound, sample frames 0-1000 might contain the sound of the engine
starting up; sample frames 1000-2000 might contain the loop of the
engine running; and sample frames 2000-3000 might contain the sound of
the engine dying. If you set the loop start and end to 1000 and
2000 and the loop count to -1, when you play the sound, you would first
hear the sound of the car starting up, then the sound of the car
running would loop continuously until you explicitly tell it to
release, at which point you would hear the sound of the engine dying.
There are a few ways to specify loop parameters for a sound: in the source audio file, as sound attributes in cktool, or at runtime using the API.
Specifying loop parameters in an audio file
Both the WAV and AIFF file formats can store loop information; however,
not all audio editors include loop information when they export WAV or
AIFF files, so you may wish to test this with your editor of
choice. (For example, Sony Sound Forge does export loop
information; the free Audacity editor does not.) If cktool
detects a loop in the source audio file when generating a bank sound or
stream sound, it automatically sets the loop start, end, and count from
the data in the audio file.
If you audio editor does not support loops, but does support named
regions, you can mark your loop as a region named "loop", and cktool will set the loop start and end based on the region.
Loop settings from the audio file can be overridden by either sound attributes in cktool or by API calls at runtime.
Specifying loop parameters as sound attributes in cktool
You can also specify the loopStart, loopEnd, and loopCount sound attributes to cktool when creating bank sounds or stream sounds; see the cktool documentation
for more details on how to use these attributes. Sound attributes
will override loop data in the source audio files, but can be
overridden by API calls.
Specifying loop parameters at runtime
Finally, you can specify loop parameters at runtime using the API; for example, CkSound::setLoop(), CkSound::setLoopCount(), and CkSound::releaseLoop().
Creating seamless loops
Creating audio data that loops seamlessly, without pops or clicks at
the loop point, is somewhat of an art. In general, you want to
minimize the discontinuity between the last sample of the loop and the
first sample of the loop.
Take a look at this simple example, using a simple sine wave:
If we were to loop over this entire file, the discontinuity between the
last and first samples would cause a noticeable click. The
resulting waveform would look something like this:
A solution would be to trim the data off the end, so the audio data looks like this:
Or, rather than loop from beginning to end, set the loop points to minimize the discontinuity, for example, at zero crossings:
If your data is encoded as ADPCM, this is tricker, because the loop
points must be at multiples of 36 samples, which is the ADPCM block