continuing discussions from:
I’m sharing a proposal for a community library of synthesis engines based on a shared communication standard.
the goal
to open up a variety of use cases beyond typical poly synth stuff, without complicating the synth engine, + opening up some nice interactions for lua script authors. I’m proposing four basic assumptions around such an engine:
- there are n voices
- all the voices are the same (share the same parameters)
- one parameter must set frequency in hz
- one parameter must set the peak level of an envelope, or the volume/presence of a sound
usage
what I’ve worked on is a lua syntax for communicating with such an engine, here’s an overview:
nv.name(name) : select engine from the nv lib
nv.init(n) : initialize n voices
nv.vc : list of voices and parameters per voice (e.g. nv.vc[1].hz = 440 )
nv.all : list of global parameters, summed (multiplied if .hz) with voice parameters per voice
.hz : required parameter, frequency in hz
.peak : required prameter, specifies the peak of an envelope or volume of a sound
vc.list : list of additional parameter keys supplied by engine
nv.active : list of active voices, populated via engine polls
nv.free: list of free voices, populated via engine pools
nv.id(id) : voice allocator, assigns an id to a free voice & returns the voice if id does not exist, or returns actice voice if exists
nv.update() : sends table data to supercollider
in the repo I sketched up three example scripts - a regular poly-synth with a couple niche features, two simultaneous, asynchronously-enveloped arps, and a 20 voice MEGADRONE - all using the same engine and syntax
next steps
what do you think ? what haven’t I considered ?
this is the front end - given my limited comfort with supercollider, I’m seeking help with working on the back-end standard, modifying PolySub and coming up with engine params and polls to best suit the spec laid out in this lua lib. (I * assume * it would be best for the engine to receive per-voice values in a batch format, and send free/active states back to lua in a poll)
from there I can fill out the middle !
(aside: I’m not super attached to names of things, though I enjoy super concise character counts for stuff like this)