Dynamic max voices based on CPU load


#1

Hey, so my app is a cross-platform synth. Since each device has wildly different levels of processing power, what’s the recommended way of setting the max number of synth voices? I notice the ROLI Noise does it per device, i.e. on the iPad 2 it’s monophonic, but on newer devices you can have more.

My initial thought was to set this manually per device, like Noise. Detect the device type (iPad 2/3/4) then create x voices based on that. However, the CPU varies per preset, so it doesn’t make sense to limit the polyphony as much on cheaper presets.
What about a dynamic max voicing system? The voice count starts low, but based on the CPU load, it keeps adding new voices until a max load is reached. Then that level is saved with the instrument. This way, you don’t have to manually go through each instrument for each device, setting a maximum.

The easy way of doing this is having an option for max voices in the settings, and the user can then set it manually. However, since a lot of our users are new to digital music, they won’t associate buffer overruns with CPU power and thus swamp us in bug reports…


#2

We do this for each preset. Every preset has it’s voice limits hard-coded.


#3

Hard coded per preset per device? Won’t that be a nightmare on android?


#4

So finally I implemented a dynamic voice count based on the peak cpu load since the last noteOn. It seems to work quite well. Each presets starts with 2 voices. At the start of each noteOn, if the peak CPU since the last one is less than a certain amount (say 30%) and all voices are being used, add a voice. Then if the peak CPU load is above another amount (say 40%) remove a voice. It saves the max voices so the procedure doesn’t have to start from 2 voices every time.
What would you recommend to be a good CPU usage threshold for adding and deleting voices?