Author: Jim Merritt (rev. Jim Mensch)
Year: 1987
... discusses a problem with Ensoniq DOC where zero bytes in the waveform stream could cause clicks or static.
Apple II
Technical Notes
_____________________________________________________________________________
Developer Technical Support
Apple IIGS
#11: Ensoniq DOC Swap-Mode Anomaly
Revised by: Jim Mensch November 1988
Written by: Jim Merritt April 1987
Under certain conditions, the IIGS Ensoniq Digital Oscillator Chip (DOC)
inserts a spurious zero-crossing byte into the output sample stream. The
output sample waveform may mask the anomaly, but if it does not, the user may
hear intermittent clicks or even a more pervasive "static." This Technical
Note discusses the situations in which the DOC produces this spurious zero
crossing, as well as strategies to avoid or mask this undesirable behavior.
_____________________________________________________________________________
Background
The Ensoniq DOC in the Apple IIGS is actually a microprocessor dedicated to
producing sound. Like a time-sharing computer, the DOC continually scans
through its array of sound oscillators, proceeding from lower-numbered
oscillators to higher-numbered ones, and updates the signal output level of
each active one to match that indicated by the oscillator's current sample
byte.
An oscillator can operate in any one of several functional modes, as described
in the Apple IIGS Hardware Reference. Here, however, we are concerned only
with swap mode, where two consecutive oscillators are considered as a single
generator. The low-numbered oscillator in the pair is always even. For
example, the pairs of oscillators 0 & 1, 2 & 3, ... , 12 & 13, and 14 & 15
constitute generators. The IIGS Sound Tool Set - the FFStartSound call in
particular - configures the oscillators it uses to operate in swap mode. In
swap mode, the even-numbered oscillator plays its waveform first, halts its
own playback, then starts its partner which also plays its waveform, halts its
own playback upon exhausting its waveform, and restarts the even-numbered
oscillator. At any time between the start of any particular FFStartSound call
and the time the oscillator finishes playing a wave, the Sound Tool Set
interrupt handler may be busy transferring waveform information from the IIGS
main RAM to the dormant oscillator's buffer in DOC RAM. Since one oscillator
is producing sound while the Sound Tool Set interrupt handler is transferring
waveform information to the other oscillator, you can use a generator pair to
produce continuous sound of arbitrary length, and you are limited only by the
amount of memory you can devote to the waveform in the main RAM.
Each oscillator draws its output samples from a dedicated buffer in DOC RAM,
the size and location of which are specified by parameters to the FFStartSound
call. The maximum size for an oscillator buffer is 32K, but since buffers may
neither coincide nor overlap, the practical maximum may be lower when more
than one generator is active. For instance, if four generators (eight paired
oscillators) are active simultaneously, the maximum buffer size is 8K, since
eight non-overlapping buffers of 8K each would occupy the entire 64K available
in the DOC RAM.
The Problem
Whenever a swap occurs from a higher-numbered oscillator to a lower-numbered
one, the output signal from the corresponding generator temporarily falls to
the zero-crossing level (silence); this anomaly does not occur during swaps
from lower-numbered oscillators to higher-numbered ones. The spurious level
change lasts no longer than a single sample period, at which time the
interrupted waveform resumes. However, even this tiny glitch in the output
can be audible as a pop or click; the further away the waveform is from the
zero crossing when the swap interrupts it, the louder the ear will perceive
the pop or click. When high-to-low swaps occur with great frequency, the pops
and clicks happen so often that they are perceived as gentle, but pervasive,
static.
Several Workarounds
There is no ideal solution to the problem of signal interruption in swap mode.
This problem is an anomaly of the DOC design, which may or may not be
addressed in later versions of the chip. However, we have found three general
strategies for mitigating the audible damage to the output waveform caused by
the chip's undesirable behavior.
Minimize Oscillator Swaps per Unit Time
The more often swaps from high-numbered oscillators to low-numbered ones
occur, the more obtrusive the brief signal interruptions will seem. To
minimize the interruptions, you must make the oscillators play for a longer
period of time before swapping to their partners. This means that they must
play at slower output sample rates, use larger buffers in DOC RAM, or use the
two in tandem. Commensurate with the number of active generators you wish to
use and the level of output signal fidelity that you desire, always specify
the largest DOC buffer size and the lowest output sample rate that you
possibly can. Remember that a large number of active generators implies a
very small maximum buffer size for any particular oscillator, so you should
always try to minimize the number of generators that are active at any one
time. As a rough benchmark, the clicks of signal interruption begin to blend
into highly audible static when you specify buffers smaller than 8K for use at
the maximum-fidelity output sample rate of about 26 kHz. (Note: The DOC
supports greater sample rates, but these rates are limited by the output
filtering on the IIGS which permits no greater signal fidelity than that
possible using the 26 kHz rate.) Our figures suggest that output fidelity
must suffer, or signal noise must increase, when more than four generators
(eight oscillators in swap mode) are operating simultaneously.
Avoid Silent or Quiet Passages
The signal content of your waveform can hide the additional noise caused by
the "swap-mode anomaly." The more complex and louder a waveform, the less
your ear will perceive the brief interruption that occurs whenever a higher-
numbered oscillator swaps to a lower-numbered one; pop and rock music is far
less susceptible to this problem than classical, folk, or jazz pieces, which
typically include many quiet passages. In addition, a signal that naturally
contains a large amount of "pink noise," such as recordings of rainstorms or
the surf at the beach, can mask the anomalous noise altogether.
Arrange for Swaps to Occur at or Near Zero Crossings
If the high-to-low swap occurs at a time when the normal output signal level
sits at or near the zero crossing, the swap will cause little or no audible
damage to the waveform. When reproducing arbitrary sampled sound, it is
almost impossible to insure that the output signal level is near the zero
crossing. However, when constructing long waveforms for playback, you may be
able to sidestep the chip's anomalous behavior by ensuring that the waveform
values lie at or near $80 at the end of every waveform segment, where a
waveform segment spans twice the length of one oscillator buffer. For
example, if you specify a buffer size of 4K, make sure that your constructed
waveform crosses the baseline after every 8,192 samples, and for 16K buffers,
make sure that the waveform makes a zero crossing after every 32K.
The length of the waveform segment should be twice the buffer length only if
you are going to reproduce the waveform exactly once per FFStartSound call.
It may be necessary to shorten the length of the waveform segment to exactly
the specified DOC buffer length if you use the nextwave_start parameter in the
FFStartSound parameter block to invoke automatic looping of the waveform. In
other words, you may need to arrange for twice as many zero crossings in your
constructed waveform in the looping case as you would under normal
circumstances since subsequent repetitions of the waveform during the single
FFStartSound call may begin with either the even or odd oscillator, depending
upon which member of the pair was active when the previous repetition ended.
If the playback of a waveform starts with the odd oscillator, then the odd-to-
even swaps will occur at different points in the waveform than they would when
the playback starts with the even oscillator.
Also note that the use of larger buffers causes a progressively longer
disabling of interrupts while the Sound Tool Set moves the waveform into the
DOC RAM.
Further Reference
o Apple IIGS Toolbox Reference, Volume 2
o Apple IIGS Hardware Reference