IMPORTANT: Comments are closed in this post, please, use the forum.
Zynthian is an Open Synth Platform based in Raspberry Pi, some Open Software Synthesizers and more.
I’m trying to integrate all the parts in a realiable case with a nice and ergonomic User Interface, so everybody can enjoy this wonderful synthesizers in any place without having to install or configure anything.
When it’s finished, i would like to make it available for everybody, as a toolkit or as a finished product, so you can use it for Live Playing, Music Production or any kind of experimentation.
Of course, all the specifications will be freely available, so you can build your own device if you prefer 😉
- RaspBerry Pi 2
- HifiBerry DAC+
- AdaFruit TFT 2.8 inch
- 4 rotary encoders + switches
- MIDI IN connector (using RBPi UART)
- A Hard Rock Steel Case !!!
First, I’m using HifiBerry DAC+ and i’m really satisfied with it. The sound is clear and warm. Really HiFi.
Surprisingly, the rotary controller part was really easy. Now i ve a beatiful printed PCB circuit for this part and a really functional and stable C library/driver that interface the controllers. With the actual configuration, every GPIO pin is used, and 2 of the switches can’t be connected, so i’m working in expand it using a I2C GPIO bridge. I hope it will be ready before christmas. By now, i’m working with 2 switches and is, more or less, enough.
In the other side, the MIDI IN connector was a nightmare. Really! I’ve spent a lot of hours trying to understand what happened. Even i tryed with an oscilloscope! Finally, i’ve realized that the kernel was not setting correctly the UART frecuency. Luckly, there are very good people in the Kernel side and i get a patch in couple of days. You can read the history:
Now i have a fully working MIDI IN connector. I’ve dessigned a nice PCB, that includes the MIDI and GPIO/I2C expander. When i finish my tests, i will send to print some units.
The TFT screen is a resistive touch screen, but i’m not using the “touch part” by now. I’ve done an initial version of UI using it, but it gots clear that rotary controller are, by far, more ergonomic, so i decided to remove the touch part. In the future, i would like to use the touch screen as a bi-dimensional controller, ala “kaos pad”.
Zynthian is a multi-engine architecture. By now, i’ve integrated 4 engines:
- setBfree (Hammond B3)
But i intend to implement some others in the near future:
- Dexed (DX7)
- Pure Data
I would like to include some sequencer/arpeggiator features. I’m doing some promising tests with “midish”, a very interesting command line sequencer.
When the project was started, Jackd was not supported by HifiBerry sound cards, so i start using only ALSA. The first three engine integrations are ALSA-based for audio and MIDI.
Recently, these problems with HifiBerry and Jackd, related to the lack of MMAP support in Raspberry Pi, has been solved. Currently is possible to enable the MMAP support (see /boot/config.txt), so i can use Jackd with HifiBerry.
So, now there is a playable integration of setBfree, a Hammond Organ Emulator that sounds really fine. It includes a decent Leslie, percussion, vibrato, overdrive, etc. and a good collection of popular Hammond presets. And you can connect 2 keyboards + pedals! You will enjoy playing it for sure.
In the near future I would like to integrate Dexed (DX7 emulator) and many other synthesizers.
Also, I would like to migrate to a Jackd-only architecture, but by now, ALSA is giving very good results, so the migration can wait a little more 😉
UPDATE: Currently Zynthian is completely “jackified”, and include basic integration with Carla Plugin Host, that allows to use Dexed and many other plugins (LV2, DSSI, VST, LADSPA)
I think i’ve achieved an aceptable latency, posibly under 20ms, perhaps even less than 10ms (total, including USB/MIDI delays). To achieve this, I’ve recompiled the kernel with a higher frecuency (1000Hz) and i’ve removed some daemons, etc. but i’ve not applied the RT patch. I’ve to to do it.
For ZynAddSubFX i’m using 48000 Hz, 16 bit and a buffer size of 256. It works fine for me with a lot of instruments, but it collapses the CPU when using some of it. For example, “Angel Piano” is completly unplayable. I’ve speaked with McCurry about improving the performance of ZynAddSubFX, but i’s a very complex question. I’m studing it.
I need to spend some time meassuring the latency and putting some real numbers to this question but it isn’t a priority task because Zynthian Box is working fine by now. The prototype is very playable and the latency is low enough so you can’t perceive it while playing.
Also, i’ve spent some time getting the system to boot up in a reasonable time: less than 5 seconds to get the Zynthian Logo Screen and less than 20 seconds to get the Zynthian GUI. I know that i can improve this and i know the way. I’ve done some tests with Jessie and systemd, but it’s an open task.
The Zynthian User Interface:
The Zynthian GUI is writen in Python, using Tkinter. I’m a newcomer to Python, but i really like this language, so i’m learning fast 😉
The actual UI structure is:
- Engine Selection Screen
- MIDI Channel Selection (normaly 1, but you can configure multichannel arrangements, and use more than 1 keyboard
- Bank Selection
- Instrument Selecion
- Instrument Controller (you can play with the rotary controllers)
- OSC Browser => Work in Progress …
- Admin Screen => Update Software from GitHub, etc.
UPDATE: Currently, there is a more detailed scheme of the User Interface Workflow.
In the beggining, i’ve used an “only MIDI” approach to communicate with Synth Engines. I’have patched ZynAddSubFX to fix/add some features i needed to improve bank & program selection by MIDI. Mark McCurry have merged this changes in the main trunk:
Actually i’m changing to a mixed MIDI/OSC approach. It’ clear that MIDI is too limited. I’m implementing OSC using liblo. I’m trying to browse the OSC path tree (parameters) from zynthian UI, so you can select any parameter and assign it to a Zynthian Rotary Controller, play with it, etc.
Also, i’ve done some work for getting the “Synth Engine Native GUI” opened in a “big” computer, using the X11 protocol. I’ve tested in the three main platforms (Windows, MacOS and Linux) with success. Now it’s a question of “easy install and config”.
There is a lot more, but i think it’s a good description by now. If you want to take a look into the code, you can access the repository in github: