Hello,
I'm new to this mailing list, though not especially new to computer music. I
was heavily involved in it some years ago, mainly on the NeXT platform, then
fell away. Out of curiousity, I recently decided to look around and see what
was available today for Linux, audio-wise.
One of the items I found was LADSPA. "A standardized interface for audio
plugin units carried in shared libraries," thought I. "Interesting idea." I
took a closer look at LADSPA and, like any happy programmer, decided that
there are some things about it that I'd do differently. So, to flesh out and
test my ideas, and just for fun, I proceeded to build a LADSPA-inspired
plugin system of my own. I'm writing now to present these ideas in the event
that someone may find a few of them useful, and to perhaps contribute to
LADSPA's evolution:
- I've done away with the distinction between control signals and audio
signals. I understand the performance gains to be had by computing one class
of signals less often than another, but I feel this is a hold-over from days
when computers were much slower than they are now. In my ideal system,
signals are signals and any signal should be potentially applicable to any
purpose. I don't want to be bothered with control vs. audio, either
conceptually or in actual code.
- Somewhat related to the item above, a plugin's run() method computes exactly
one sample at each call, not a block of samples. This is again a matter of
conceptual simplification. I don't want the individual plugin to have to know
anything of process iteration; that job is for the containing infrastructure.
Also, some years ago I started working on some computer synthesis software
and found that when units ("plugins") computed samples in blocks (instead of
one at a time), there was a strange behavior when these units were patched
together in looped delay line configurations. As I recall, gaps would appear
in the audio output, and these gaps would grow in length as the loop
proceeded. I don't remember if I ever discovered the exact cause, but I think
it had something to do with the relationship between the length of a block of
samples and the length of the delay line. Maybe I was doing something wrong,
but going to a one-sample-per-run process made the problem go away. I wanted
the flexibility of being able to patch units together in any sort of
topology.
- Every input port is a mixer/modulator. Since the operations of mixing and
modulating (multiplying) signals together are so often needed, I decided to
build them into plugin input ports. A given input port can accept any number
of connections from "feeders" and either mixes or modulates their outputs
transparently, according to the port's configuration. I believe this
simplifies use of the system and eliminates the need for a special
runAdding() plugin method.
There's more, but this is getting rather long. I'll leave it here for now. If
you've gotten this far, thanks for your time.
--
Pete Yadlowsky
ITC Unix Systems Support
University of Virginia