DSP Implementation
575
Figure 51.5
Two-filter trachea approximation.
Now we want to connect all these parts
together to make the complete bird, so this
is where things get interesting. There are
11 parameters in total, summarised in fig-
ure 51.6. Although we’ve captured the essen-
tials of the sound, the spectrum of birdcall,
real birdcalls are complex—not because the
production mechanism is complex but because
of the huge amount of control data needed to
run it.
Going back to our earlier observations on
living things, they make sounds that have
semantics and even simple living things will make astonishingly complex neu-
ral patterns to control movement and voicing. Let’s suppose we could simplify
birdcall to one envelope per parameter and make each sound a short phrase
lasting less than one second. Then we could connect together these phrases into
more elaborate calling. If we control each with an envelope that has an attack
time, decay time, initial level, and final level we will have 44 parameters to play
with, a lot for what will be unsophisticated behaviour.
Parameter
Value range
bp1 Left bronchus pressure (pulse frequency)
0Hz to 10Hz
bp2 Right bronchus pressure (pulse frequency)
0Hz to 10Hz
bw1 Left bronchus impedance (pulse width) (scalar)
1 to 4
bw2 Right bronchus impedance (pulse width) (scalar)
1 to 4
rm Ring modulation mix (scalar)
0
.
0 to 1
.
0
mod FM modulation index (frequency)
0Hz to 200Hz
bf Syrinx base frequency (frequency)
80Hz to 1kHz
pw Syrinx pulse width (scalar)
0 to 4
tf1 First trachea formant (frequency)
50Hz to 3kHz
tf2 Second trachea formant (frequency)
50Hz to 3kHz
amp Attenuation (absolute fsd)
0
.
0 to 1
.
0
Figure 51.6
Birdcall synthesiser parameters.
Remember that for real-time synthesis we always try to avoid memory
access, because if everything can be done in registers it’s much faster, and
memory access hinders parallelism for the DSP tree. However, in this case we
will choose an easy way out, partly because it demonstrates the joys of using
arrays as control envelopes. To translate this patch for proper procedural use
you should create breakpoint parameter lists. Here I am going to create a
table of 1
,
024 points for each parameter and read them back using the
object. Included in the supplemental online material are some other birdcall
Do'stlaringiz bilan baham: |