Tim Blechmann wrote:
hi all,
just in case people are curious, about the future of nova ...
i started prototyping a new audio engine, code named `supernova', which
is based on the codebase of nova, but with a completely different
design ...
features:
- audio server with a node-based design, similar to scsynth
- asynchronous scripting of the server via osc
- synchronous sample-accurate scripting, based on an embedded
server-side scripting language
- multi-core support for the audio computation
- strong distinction between `audio rate', `control rate' (once per
dsp
block), `events' (synchronous sample-accurate scripting)
the development is done with git:
http://tim.klingt.org/git?p=nova-server.git;a=summary
git://tim.klingt.org/nova-server.git
the multi-core dsp scheduler is already working fine, i already heard a
hello-world sine wave oscillator ...
Cool! This sounds like a great move. I haven't had time to jump in and
help on Nova like I originally hoped to, but I think if the code base
was more easily navigated it would be easier to help out on weekend size
projects. Since you are doing a bit of a redesign, I wanted to at least
get a conversation going about a few thoughts I had after last spending
a few days in the source...
(On a quick side note, I think it is worth studying Apple's CoreAudio
system. I'm a linux guy, but I have to admit that they did a very good
job with that audio library. It's graph based, simple to use and simple
to extend. Checkout the Impromptu live-coding system that puts a little
scheme interpreter on top of CoreAudio for a good example of how easy it
can be to play with.)
I think it should be a major goal to simplify the design of the system.
Using a generic graph API to structure the processing graph would help a
lot here, but I think de-coupling various components of the system and
then limiting the interfaces as much as possible should be the goal.
You know this system way better than anyone, but maybe if I throw out an
outline of what I'm imagining then you can see what you think and
comment on it:
* A base node class that lets you add and remove edges to other nodes,
and probably access a per-node property hash for parameterization and
communication to the "outside world". All the audio and control nodes
would derive from this guy.
* All the stuff that is processing the graph in order to do DSP
scheduling could also be completely decoupled from the user defined
graph API. You hand it a graph and it generates it's own DSP processing
chain for scheduling. The graph would be observable so any updates on
node properties or changes in the graph would be sent to the scheduler.
* For starters I would not include any languages, scripts, osc or
anything. Just create the cleanest, simplest DSP processor possible.
This could and would be used for many things, and forcing Nova to do
this first and to define a clean API to interact with the nodes and with
the graph overall will simplify everything else.
* Supporting Chuck style, sample synchronous scripts will be really
awesome, but I think it's important to not let it bleed into the DSP
chain API. The scripts should either run inside a DSP node, or run in
an external script runner that can call methods on graphs and nodes.
* One of the difficulties I had in Nova was pulling apart the PD type
language from the actual DSP stuff. It would be so nice to just have a
big library of DSP nodes that could be chained together and run. On top
of that any number of languages, scripting APIs, gui manipulators could
be developed to create and manipulate DSP graphs.
You really have some great code in the Nova source, and I bet with some
refactoring and simplification you could get a lot more developers to
join in because it would be easier to figure out and to jump in. For
example, implementing a new DSP node should be as simple as creating one
class in one file. I would start a branch with the goal of using the
least amount of code possible to support fully functional DSP graphs.
You already have this going, so it's probably a matter of pulling it
away from all the other stuff connected to it.
As for the GUI, I think either the Qt GraphicsView or the Clutter
library are the best option. They can both be rendered in OpenGL, and
they both support object level grouping, events, transformations, and
animation. 3D manipulation is rarely useful for anything practical so
GL is really only good for effects, not functionality. Having a fancy
GUI can get people interested in the project though, so maybe getting
some generic shaders setup to do glowing and pulsing and burning would
get people excited...
Be great to hear what you guys think.
Cheers,
Jeff
_______________________________________________
nova-dev mailing list
[email protected]
http://klingt.org/cgi-bin/mailman/listinfo/nova-dev
http://tim.klingt.org/nova