Version 0.3.0 of the CircuitPython library released!

In an effort to make the python library more viable for full operation, I have been working on expanding features and optimizing existing functionality. This is all while in conjunction of developing the first full program for the device, pico_synth_sandbox-synthesizer. Here’s a quick rundown on the major features with this release.

Simple but Powerful Menu System

I’ve finally decided to migrate the menu system used in the old pcolamakerfaire2023 repository to the core library after thorough review and tweaking. Though it is entirely modular and complex groups can be built from the ground up, a number of MenuGroup classes are provided from the get-go to make configuring your pico_synth_sandbox project incredibly easy.

This system is not yet fully documented and no dedicated examples have yet been provided, but this file does demonstrate much of its functionality.

Finally, Proper Voice Allocation!

Since the beginning, the Keyboard object has been limited in that it was technically only designed for monophonic operation. Since version 0.1.0, it has always been a goal to offer a sort of virtual voice allocation for polyphonic support in the same way that analog synthesizers with a fixed number of voices allocate notes. There’s probably room for better optimization using special Python tricks, but the results are very promising so far!

All of the same keyboard modes are still supported, High, Low, & Last, but now you can specify how many voices you would like within the constructor or dynamically with set_max_voices.

In order to use this functionality, you will need to add the following new callbacks: set_voice_press and set_voice_release. The old callbacks are still supported, but instead trigger whenever the physical Key objects are detected to have changed state without any additional calculation. I encourage you to review the documentation and see the updated examples for more details.

Overclocking? Yes please!

One additional modification I’ve done to the library is offer overclocking by default when calling get_board (if it is enabled for the designated board). This decision may be controversial, but in my testing, I’ve discovered minimal negative effects with hardware timing, thermal capacity, and power consumption. It’s simply… more power! I have added a small heat sink to the RP2040 on the development boards I’m working on right now, but I don’t think it is necessary for operation.

Generally, I wouldn’t bother adjusting this feature (especially by default), but any sizable program quickly experiences audio buffer loss when running at 44.1khz and sometimes even 22.05khz with a smaller buffer size. The difference in perceived audio quality between the two is immediately noticeable. I think supporting 44.1khz is necessary to make the pico_synth_sandbox more viable for real music production. If you have any issues with this new feature, you can disable it by calling get_board(overclock=False).

Things to Come

At the moment, I am working on a few items which will likely make it into a 0.3.1 incremental release.

  • Complete library documentation.
  • Optimize memory and processor usage of menu objects.
  • Improve display responsiveness.

If you have any features you’d like to see in a future update, please contact me or add them as an issue on the repository!

Posted on




Leave a Reply

Your email address will not be published. Required fields are marked *