The Zynthian project

Recently I found out that I was not the only one trying to build a synth module out of a Raspberry Pi with ZynAddSubFX. The Zynthian project is trying to achieve the exact same goal and so far it looks very promising. I contacted the project owner to ask if he would be interested in collaborating. I got a reply promptly and we both agreed it would be a good idea to join forces. The Zynthian project has all the things that I still had to set up already in place but I think I can still help out. The Zynthian set-up might benefit from some optimizations like a real-time kernel and things like boot time can be improved. Also I could help out testing, maybe do some packaging. And if there’s a need for things like a repository, web server or other hosting related stuff I could provide those.

Protoype of the Zynthian project
Zynthian prototype

I’m very happy with these developments of our projects converging. Check out the Zynthian blog for more information on the current state of the project.

The Zynthian project

Two steps further

For my little synth module project I created the following systemd unit file /etc/systemd/system/zynaddsubfx.service that starts up a ZynAddSubFX proces at boot time:

[Unit]
Description=ZynAddSubFX

[Service]
Type=forking
User=zynaddsubfx
Group=zynaddsubfx
ExecStart=/usr/local/bin/zynaddsubfx-mpk
ExecStop=/usr/bin/killall zynaddsubfx

[Install]
WantedBy=local-fs.target

/usr/local/bin/zynaddsubfx-mpk is a simple script that starts ZynAddSubFX and connects my Akai MPK:

#!/bin/bash

zynaddsubfx -r 48000 -b 64 -I alsa -O alsa -P 7777 -L /usr/share/zynaddsubfx/banks/SynthPiano/0040-BinaryPiano2.xiz &

while ! aconnect 'MPK mini' 'ZynAddSubFX'
do
  sleep 0.1
done

/usr/local/bin/zynpi.py

/usr/local/bin/zynpi.py in its turn is a small Python script that shows a message and a red LED on a 16×2 LCD display so that I know the synth module is ready to use:

#!/usr/bin/python
# Example using a character LCD plate.
import math
import time

import Adafruit_CharLCD as LCD

# Initialize the LCD using the pins
lcd = LCD.Adafruit_CharLCDPlate()

# Show some basic colors.
lcd.set_color(1.0, 0.0, 0.0)
lcd.clear()
lcd.message('Raspberry Pi 2\nZynAddSubFX')

The LCD is not an Adafruit one though but a cheaper version I found on Dealextreme. It works fine though with the Adafruit LCD Python library. Next step is to figure out if I can use the buttons on the LCD board to change banks and presets.

synth_module_lcd_startup
Raspberry Pi synth module with 16×2 LCD display
synth_module_test_setup
The synth module test environment
Two steps further

Working on a stable setup

Next step for the synth module project was to get the Raspberry Pi 2 to run in a stable manner. It seems like I’m getting close or that I’m already there. First I built a new RT kernel based on the 4.1.7 release of the RPi kernel. Therefore I had to checkout an older git commit because the RPi kernel is already at 4.1.8. The 4.1.7-rt8 patchset applied cleanly and the kernel booted right away:

pi@rpi-jessie:~$ uname -a
 Linux rpi-jessie 4.1.7-rt8-v7 #1 SMP PREEMPT RT Sun Sep 27 19:41:20 CEST 2015 armv7l GNU/Linux

After cleaning up my cmdline.txt it seems to run fine without any hiccups so far. My cmdline.txt now looks like this:

dwc_otg.lpm_enable=0 dwc_otg.speed=1 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 rootflags=data=writeback elevator=deadline rootwait

Setting USB speed to Full Speed (so USB1.1) by using dwc_otg.speed=1 is necessary otherwise the audio coming out of my USB DAC sounds distorted.

I’m starting ZynAddSubFX as follows:

zynaddsubfx -r 48000 -b 64 -I alsa -O alsa -P 7777 -L /usr/share/zynaddsubfx/banks/SynthPiano/0040-BinaryPiano2.xiz

With a buffer of 64 frames latency is very low and so far I haven’t run into instruments that cause a lot of xruns with this buffer size. Not even the multi-layered ones from Will Godfrey.

So I guess it’s time for the next step, creating a systemd startup unit so that ZynAddSubFX starts at boot. And it would be nice if USB MIDI devices would get connected automatically. And if you could see somehow which instrument is loaded, an LCD display would be great for this. Also I’d like to have the state of the synth saved, maybe by saving an .xmz file whenever there’s a state change or on regular intervals. And the synth module will need a housing or casing. Well, let’s get the software stuff down first.

Working on a stable setup

Building a synth module using a Raspberry Pi

Ever since I did an acid set with my brother in law at the now closed bar De Vinger I’ve been playing with the idea of creating some kind of synth module out of a Raspberry Pi. The Raspberry Pi 2 should be powerful enough to run a complex synth like ZynAddSubFX. When version  2.5.1 of that synth got released the idea resurfaced again since that version allows to remote control a running headless instance of ZynAddSubFX via OSC that is running on for instance a Raspberry Pi. I looked at this functionality before a few months ago but the developer was just starting to implement this feature so it wasn’t very usable yet.

zynaddsubfx-ext-guiBut with the release of ZynAddSubFX 2.5.1 the stabilitity of the zynaddsubfx-ext-gui utility has improved to such an extent that it’s a very usable tool. In the above screenshot you can see zynaddsubfx-ext-gui running on my notebook with Ubuntu 14.04 controlling a remote instance of ZynAddSubFX running on a Raspberry Pi.

So basically all the necessary building blocks for a synth module are there. Coupled with my battered Akai MPK Mini and a cheap PCM2704 USB DAC I started setting up a test setup.

For the OS on the Raspberry Pi 2 I chose Debian Jessie as I feel Raspbian isn’t getting you the most out of your Pi. It’s running a 4.1.6 kernel with the 4.1.5-rt5 RT patch set, which applied cleanly and seems to run so far:

pi@rpi-jessie:~$ uname -a
Linux rpi-jessie 4.1.6-rt0-v7 #1 SMP PREEMPT RT Sun Sep 13 21:01:19 CEST 2015 armv7l GNU/Linux

This isn’t a very clean solution of course so let’s hope a real 4.1.6 RT patch set will happen or maybe I could give the 4.1.6 PREEMPT kernel that rpi-update installed a try. I packaged a headless ZynAddSubFX for the RPi on my notebook using pbuilder with a Jessie armhf root and installed the package for Ubuntu 14.04 from the KXStudio repos. I slightly overclocked the RPi to 1000MHz and set the CPU scaling governor to performance. The filesystem is Ext4, mounted with noatime,nobarrier,data=writeback.

To get the USB audio interface and the USB MIDI keyboard into line I had to add the following line to my /etc/modprobe.d/alsa.conf file:

options snd-usb-audio index=0,1 vid=0x08bb,0x09e8 pid=0x2704,0x007c

This makes sure the DAC gets loaded as the first audio interface, so with index 0. Before adding this line the Akai would claim index 0 and since I’m using ZynAddSubFX with ALSA it couldn’t find an audio interface. But all is fine now:

pi@rpi-jessie:~$ cat /proc/asound/cards
 0 [DAC            ]: USB-Audio - USB Audio DAC
                      Burr-Brown from TI USB Audio DAC at usb-bcm2708_usb-1.3, full speed
 1 [mini           ]: USB-Audio - MPK mini
                      AKAI PROFESSIONAL,LP MPK mini at usb-bcm2708_usb-1.5, full speed

So no JACK as the audio back-end, the output is going directly to ALSA. I’ve decided to do it this way because I will only be running one single application that uses the audio interface so basically I don’t need JACK. And JACK tends to add a bit of overhead, you barely notice this on a PC system but on small systems like the Raspberry Pi JACK can consume a noticeable amount of resources. To make ZynAddSubFX use ALSA as the back-end I’m starting it with the -O alsa option:

zynaddsubfx -r 48000 -b 256 -I alsa -O alsa -P 7777

The -r option sets the sample rate, the -b option sets the buffer size, -I is for the MIDI input and the -P option sets the UDP port on which ZynAddSubFX starts listening for OSC messages. And now that’s the cool part. If you then start zynaddsubfx-ext-gui on another machine on the network and tell it to connect to this port it starts only the GUI and sends all changes to the GUI as OSC messages to the headless instance it is connected to:

zynaddsubfx-ext-gui osc.udp://10.42.0.83:7777

Next up is stabilizing this setup and testing with other kernels or kernel configs as the kernel I’ve cooked up now isn’t a viable long-term solution. And I’d like to add a physical MIDI in and maybe a display like described on the Samplerbox site. And the project needs a casing of course.

Building a synth module using a Raspberry Pi

De wederopstanding van PHASEX

PHASEX leeft weer! De oorspronkelijke ontwikkelaar heeft de draad weer opgepakt en een nieuwe release uitgebracht. Heb er nog niet uitgebreid naar kunnen kijken maar hij heeft de boel flink onder handen genomen. Uiteraard zijn de nodige bugs gefikst maar daarnaast is de functionaliteit van PHASEX flink uitgebreid: je kan nu meerdere parts tegelijkertijd gebruiken (dus geen losse instances meer), support voor JACK MIDI en JACK Transport en PHASEX kan nu zonder GUI gebruikt worden. Ook heeft de GUI een update gehad en zijn er de nodige filters toegevoegd en bestaande filters verbeterd.

Al met al goed nieuws, PHASEX is een erg goed klinkende synthesizer waar je echt heel veel uit kan halen. Als de ontwikkelaar dit alles nou ook nog in een LV2 plug-in zou kunnen stoppen…


PHASEX-0.14.97

PHASEX 0.14.97

De wederopstanding van PHASEX

KVR One Synth Challenge IV

Het stemmen is inmiddels begonnen en kennelijk heb ik een redelijke track geleverd want vooralsnog staat mijn bijdrage op de 3e plaats. De stemming sluit op 15 april dus als je een KVR account hebt en meer dan 20 posts breng je stem uit. Zou een stunt zijn als ik of Folderol (Folderol staat nu vierde, hij is dé ZASFX/Yoshimi guru) zouden winnen. Of één van de andere deelnemers waarvan ik weet dat ze Linux gebruiken (RuediRena, Zlouis, fundamental en laklop). Sowieso fantastisch dat er 6 bijdragen zijn volledig gemaakt onder Linux! Voor de prijzen doen we het allemaal niet, daar heb je als Linux gebruiker erg weinig aan.

KVR One Synth Challenge IV

KVR One Synth Challenge III

Gelukt! Tot 3 uur vannacht bezig geweest maar mijn entry voor de KVR One Synth Challenge 26 is af! Geüpload naar SoundCloud en toegevoegd aan de KVR One Synth Challenge group. Had wel een beetje ruzie met de algehele compressie, de Calf Multiband Compressor klinkt gewoon niet goed dus heb de Invada Stereo Compressor gebruikt. Maar was moe en moest het over mijn koptelefoon doen dus had er meer uit kunnen halen. Ook heeft de conversie naar mp3 iets gedaan met de attacks van de snares en sommige lead synths waardoor die een beetje clippen. Uiteraard heeft ogg hier geen last van, dus bij deze ook een ogg’je van de track.

KVR One Synth Challenge III

KVR One Synth Challenge II

Vandaag moet ik echt mijn entry afmaken. Achteraf ben ik niet zo blij met mijn oorspronkelijke idee maar kan nu niet meer terug, tenzij ik nog een enorme inspiratieboost krijg vandaag. Ga er in ieder geval voor zorgen dat het goed klinkt en dat het een mooie showcase wordt van de mogelijkheden van ZynAddSubFX/Yoshimi.

Misschien moet ik toch meer genre-specifiek gaan werken in plaats van maar wat te gaan doen. Aan de andere kant komen er zo wel dingetjes uit die typisch zijn voor mijn stijl, mijn manier van werken. Maar ik wil me meer gaan verdiepen in hoe anderen het doen, zelf het wiel iedere keer uitvinden kost best wel veel tijd.

KVR One Synth Challenge II

KVR One Synth Challenge

Op het KVR forum houden ze een maandelijkse wedstrijd wie het beste nummer kan maken met behulp van slechts één softsynth. Voor de maand maart hebben ze gekozen voor ZynAddSubFX, één van de bekendste Linux softsynths. Heb even navraag gedaan en het is de eerste One Synth Challenge met een uit de Linux community afkomstige softsynth. Gave uitdaging dus ik ga proberen mee te doen, en als het lukt ook met meerdere tracks. Dus zit nu iedere dag in de trein op en neer van mijn werk op m’n netbookje muziek te maken met seq24, Qtractor en Yoshimi. Superleuk om te doen en vooralsnog kom ik al een heel eind.

KVR One Synth Challenge

Remix in de maak II

Het remixen van een oud nummertje van mij loopt toch weer uit de hand. Heb gitaar- en baspartijen op zitten nemen en flink zitten rommelen met het refrein. Het refrein is gewoon al goed van zichzelf maar de onderliggende instrumenten zorgden ervoor dat de som der delen het aandeel van de zanglijn weer teniet deden. In ene schoot me wat te binnen, kreeg het idee dat een dubstep-achtig baslijntje misschien wel heel vet zou zijn. Dus ik mijn Dubstep patch ingeladen, wat aangepast zodat ie lekker wobbelt en inderdaad, het past onwijs goed. De wobble is min of meer een 5/4 wat perfect uitkomt met de triool waarmee de refreinpatronen afsluiten. Flink de cutoff open op die slagen waardoor het een stuk dynamischer is geworden.

De brug heb ik helemaal overnieuw gedaan, vond de gitaarpartij niet overtuigend genoeg. Guitarix heeft me weer versteld doen staan. IR ingeladen uit de Redwirez IR Library in de Convolver, m’n ouwe Tele ingeprikt, wat aan de knoppies zitten draaien en wham, prachtig clean geluid met een heel licht randje waar Line6 of NI Guitar Rig nog een puntje aan kunnen zuigen. Eigenlijk kunnen de twee laatsten alleen achterlijk hard scheuren, leuk voor black metal of iets in die trant, en de effectjes zijn wel goed. Maar guitarix excelleert in de cleane of crunchy geluiden, dus eigenlijk is guitarix een betere buizenbakemulator dan de pocketPOD die ik heb liggen en NI Guitar Rig die ik trouwens jaren geleden voor het laatst een keer heb opgestart, dus hoop voor NI dat Guitar Rig inmiddels wat beter klinkt. Inmiddels is er een nieuwe versie van guitarix, omgedoopt naar gx_head. Nog niet geprobeerd want de ontwikkelaar waarschuwt wel voor backward compatibility problemen dus voor dit projectje hou ik het nog even bij guitarix. Heb de gitaren lekker fel ingespeeld en het geluid benadert aardig het geluid van de originele opname, heb ik destijds ook met mijn Tele ingespeeld over mijn ouwe Teisco buizencombo met Alnico speaker.

Ook het intro is volledig anders. Moet ik nog flink aan schaven maar de basis vind ik beter zo. Heb de synth gitaarpartij uit de coupletten omgezet naar een baspartij en er de geniale SO-666 feedback drone synth overheen gegooid. Flinke sidechain compressie erop zodat het lekker dynamisch zuigt en trekt (ja, het wordt een vuig nummertje, dit soort terminologie is geoorloofd met betrekking tot dit project). Ben er nog niet helemaal uit of die phaser eroverheen moet maar hij suist nu wel heel mooi van de ene naar de andere kant.

De zang in de coupletten heb ik helemaal plat gecompressed zodat deze in de hardere stukken een lekker randje krijgt. De baslijn heb ik geautomatiseerd wat betreft de cutoff en de EQ van de C* tube-preamp plugin die ik heb gebruikt. Het enige waar ik nog voor moet gaan zitten zijn de overgangen. Dat wordt het moeilijkst, geen idee nog welke kant dat op moet qua dynamiek. Ik denk dat ik me moet gaan focussen op de drums aangezien ik daar altijd het meeste moeite mee heb. Is wel leerzaam denk ik.

Het voorlopige mixje hou ik wel nog even voor mezelf, als ik er tevreden genoeg over ben post ik zeker wat. Wil eerst de overgangetjes goed hebben en de balans qua mix is verre van optimaal. Maar tot zover ben ik erg te spreken over het resultaat, maar ook over het werken met seq24. Welkome aanvulling voor mijn workflow.

Remix in de maak II