Hacking an Android TV stick, the sequel

jeremy@rk3066:~$ uname -a
Linux rk3066 3.0.36-rt58 #1 SMP PREEMPT RT Thu Jul 4 13:18:23 CEST
2013 armv7l GNU/Linux

Managed to compile and run a real-time kernel on the Android TV stick with the RK3066 SoC. Packaged the latest version of amSynth (1.4.0 which has been released recently), installed it, fired up JACK and amSynth and so far no xruns, nothing. And this is with -p64!

jackd -P84 -p32 -t2000 -dalsa -dhw:Device -n3 -p64 -r44100 -s -P

I should measure the latency of the $2 USB audio interface I’m using to find out what the total latency of this set-up is. Well, at least I got the system latency for usage with softsynths like amSynth down to 64/44100*2=3ms. Now that’s a usable situation.

jeremy@rk3066:~$ lsusb | grep -i c-media
Bus 002 Device 006: ID 0d8c:000e C-Media Electronics, Inc. Audio Adapter (Planet
UP-100, Genius G-Talk)
jeremy@rk3066:~$ cat /proc/asound/cards 0 [RK29RK1000 ]: RK29_RK1000 - RK29_RK1000 RK29_RK1000 1 [HDMI ]: ROCKCHIP_HDMI - ROCKCHIP HDMI ROCKCHIP HDMI 2 [Device ]: USB-Audio - Generic USB Audio Device Generic USB Audio Device at usb-usb20_host-1.1, full speed

A big pro of this stick is that it suffers less from SD card corruption than my RPi. Yesterday evening I wrecked up yet another SD card when testing my RPi with a real-time kernel, it’s getting a bit cumbersome. Speaking of real-time kernels, it was quite some work to apply the RT patchset to the RockChip kernel source. Had to add stuff by hand and when I finally got everything in place it wouldn’t compile. But I managed to solve all the build errors. After flashing the kernel image the TV stick wouldn’t boot of course, it hung at some point. But I quickly saw that the issue was with the SD card reader and that it was similar to the SD card reader issue on the RPi for which I found a workaround. So I added an #ifdef clause to the RockChip SD card reader driver, recompiled, reflashed and wham, it continued booting. Now I have to clean up my build directory and get a usable diff of it against the pristine RK3066 kernel sources.

Hacking an Android TV stick, the sequel

LV2 galore!

De afgelopen tijd zijn er aardig wat nieuwe LV2 plug-ins gereleased. Daarom wat screenies.


text-align: center;

amsynth classic subtractive synthesizer

 


text-align: center;

Triceratops polyphonic subtractive synthesizer

 


text-align: center;

synthv1 old-school 4-oscillator subtractive polyphonic synthesizer

 


text-align: center;

samplv1 old-school all-digital polyphonic sampler synthesizer

 


text-align: center;

drumkv1 old-school drum-kit sampler

 


text-align: center;

setBfree DSP Tonewheel Organ (screenshot van standalone versie)



text-align: center;

Fomp LV2 port of the MCP, VCO, FIL, and WAH plugins by Fons Adriaensen


LV2 galore!

amSynth Galore!

Eigenlijk moet ik gewoon meer muziek maken maar dan zie ik m’n BCR2000 staan naast m’n scherm met de laatste beta van amSynth erop die je kunt skinnen en dan ben ik alweer afgeleid. Oftewel, heb een amSynth skin gemaakt voor gebruik met de BCR2000.


text-align: center;

amSynth 1.3 beta 2 met BCR2000 skin

amSynth zelf is inmiddels bij de tweede beta van de 1.3 release aangekomen. Zowel deze beta versie als de BCR2000 skin staan in mijn PPA. De skin staat trouwens ook op mijn Sourceforge pagina. Daarnaast heb ik de laatste git versie van de amSynth DSSI plug-in geüpload naar mijn PPA aangezien de plug-in uit het eerdere pakketje de boel liet crashen op sommige 64-bits machines.

amSynth Galore!

amSynth DSSI plug-in

De ontwikkelversie van amSynth heeft twee extra Makefiles in de broncode zitten waarmee je amSynth ook als DSSI en als (Linux) VST plug-in kan compileren. Vooral de DSSI plug-in leek me interessant dus ben aan het testen gegaan. Na het maken van Ubuntu pakketjes, waarvoor ik wel de DSSI Makefile moest aanpassen, en het installeren van het amsynth-dssi pakketje kon ik zonder problemen de plug-in openen en gebruiken in mijn favoriete host, Qtractor.

Een belangrijke functionaliteit miste wel: het selecteren van bestaande amSynth presets. De meeste DSSI plug-ins kunnen wel presets inladen, dit is ook een belangrijk voordeel van het DSSI plug-in framework, dus heb een feature request gedaan op de amSynth Google code site. En wie schetst mijn verbazing, dit verzoek werd gelijk opgepikt door de ontwikkelaar van amSynth en inmiddels is het mogelijk om met de laatste SVN versie bestaande amSynth presets te selecteren in het Track Properties venster van Qtractor!

text-align: center;

Qtractor Track Properties venster met amSynth DSSI plug-in

Inmiddels zijn mijn DSSI Makefile patch en een patch voor de DSSI plug-in zelf toegevoegd aan de source tree dus de DSSI plug-in in SVN versie laat zich nu heel makkelijk packagen voor Ubuntu, resultaat is terug te vinden in mijn PPA.

amSynth DSSI plug-in

Nieuwe pakketjes in de PPA

Pakketjes gebrouwen van een tweetal nieuwe releases (Qtractor 0.4.9 en QMidiArp 0.4.1) en van de amSynth DSSI plug-in die in de SVN repository van amSynth staat. Ben vooral benieuwd naar QMidiArp, had twee tutorials gevonden op YouTube en daar werd ik nieuwsgierig door want het ziet er zeer veelbelovend uit.


text-align: center;

Hoofdscherm van QMidiArp met een LFO, Sequencer en twee Arpeggiator modules

Nieuwe pakketjes in de PPA

Bash Session Management

Zo af en toe krijg ik de vraag wat voor session manager ik gebruik om mijn projecten en de daarbijbehorende applicaties en JACK connecties te beheren. Mijn antwoord is dan: Bash. Dus géén Ladish, géén JACK Session en ook géén aj-snapshot maar simpele Bash scripts. Waarom? Omdat ik Bash begrijp en momenteel geen tijd en zin heb om me te verdiepen in nóg een extra tool. Daarnaast is het aantal applicaties dat Ladish en JACK Session ondersteunt echt minimaal.

Maar hoe ziet zo’n Bash script er dan uit? Nou zo:

#!/bin/bash
export SESSION=$HOME/Sessions/moneyorlove.d

hydrogen -s $SESSION/moneyorlove.h2song &
seq24 -j $SESSION/seq24-moneyorlove.midi &
sleep 2
yoshimi -N analoguebass --state=$SESSION/yoshimi-analoguebass.state &
yoshimi -N dubstep --state=$SESSION/yoshimi-dubstep.state &
sleep 2
guitarix -r default -f $SESSION/guitarix_moneyorlove_bass_rc &
sleep 2
amsynth -b $SESSION/moneyorlove.amSynth.presets &
sleep 2
qtractor $SESSION/moneyorlove.qtr &
sleep 3
export SEQ24_BASS_OUT=$(jack_lsp | grep "(capture): Yoshimi Analogue")
export SEQ24_DUBSTEP_OUT=$(jack_lsp | grep "(capture): Yoshimi Dubstep")
export DRONE1=$(jack_lsp | grep "Feedback Drone/out_1")
export DRONE2=$(jack_lsp | grep "Feedback Drone/out_2")
aconnect Hydrogen:1 MPK
jack_connect "$SEQ24_BASS_OUT" yoshimi-analoguebass:midi in
jack_connect "$SEQ24_DUBSTEP_OUT" yoshimi-dubstep:midi in
jack_disconnect "$DRONE1" "system:playback_1"
jack_disconnect "$DRONE2" "system:playback_2"

Ok, wat gebeurt hier?

export SESSION=$HOME/Sessions/moneyorlove.d

Ik maak als eerste een SESSION variable aan met als waarde de directory waar alle benodigde bestanden voor mijn sessie in staan. In mijn home staat een Sessions directory en daar staan alle sessie directories en bijbehorende Bash scripts in. Vervolgens start ik Hydrogen en seq24 op met de parameters om de bijbehorende project bestanden in te laden:

hydrogen -s $SESSION/moneyorlove.h2song &
seq24 -j $SESSION/seq24-moneyorlove.midi &

Daarna laat ik Bash even twee tellen uitrusten

sleep 2

om vervolgens twee instances van Yoshimi (respectievelijke JACK poortnamen analoguebass en dubstep, kun je opgeven met de -N optie) op te starten met de bijbehorende .state bestanden. Je kunt met Yoshimi ook .xmz (parameter) bestanden opslaan, komt bijna op hetzelfde neer.

yoshimi -N analoguebass --state=$SESSION/yoshimi-analoguebass.state &
yoshimi -N dubstep --state=$SESSION/yoshimi-dubstep.state &

Weer even pas op de plaats:

sleep 2

Guitarix opstarten met de standaard instellingen (kun je aanpassen in Guitarix) en een Guitarix state file inladen:

guitarix -r default -f $SESSION/guitarix_moneyorlove_bass_rc &

Bash weer uit laten puffen:

sleep 2

amSynth starten met de juiste .presets file:

amsynth -b $SESSION/moneyorlove.amSynth.presets &

Even wachten…

sleep 2

Qtractor laden en een .qtr sessie file laten openen:

qtractor $SESSION/moneyorlove.qtr &

Hier speel ik een beetje vals want in feite gebruik ik Qtractor voor een deel als session manager. Qtractor slaat in de .qtr sessie file namelijk alle JACK connecties op die naar en van Qtractor gemaakt worden. Nadat Qtractor is gestart laat ik Bash weer even bijkomen:

sleep 3

Aangezien Qtractor dus alleen JACK connecties opslaat van en naar Qtractor moet ik de resterende JACK connecties handmatig aanmaken. Dit doe ik met jack_connect. De benodigde ALSA MIDI connecties die Qtractor niet kan opslaan zet ik op mbv aconnect. Maar eerst moet ik wat poortnamen toewijzen aan variabelen om er zeker van te zijn dat de juiste poorten met elkaar verbonden worden. Hier gebruik ik jack_lsp voor, de CLI JACK tool om een lijstje te genereren van beschikbare JACK poorten, en hier laat ik grep op los om de juiste poorten eruit te pikken.

export SEQ24_BASS_OUT=$(jack_lsp | grep "(capture): Yoshimi Analogue")
export SEQ24_DUBSTEP_OUT=$(jack_lsp | grep "(capture): Yoshimi Dubstep")
export DRONE1=$(jack_lsp | grep "Feedback Drone/out_1")
export DRONE2=$(jack_lsp | grep "Feedback Drone/out_2")

Lest best de JACK connecties die Qtractor niet kan maken:

aconnect Hydrogen:1 MPK
jack_connect "$SEQ24_BASS_OUT" yoshimi-analoguebass:midi in
jack_connect "$SEQ24_DUBSTEP_OUT" yoshimi-dubstep:midi in

En op de valreep nog even wat onnodige poorten disconnecten:

jack_disconnect "$DRONE1" "system:playback_1"
jack_disconnect "$DRONE2" "system:playback_2"

En nu is mijn volledige sessie opgestart en klaar om mee te werken. Twee dingen vallen waarschijnlijk al meteen op: 1. de ampersands (&) en 2. de vele sleep commando’s. Waarom? 1. een ampersand toevoegen aan een commando zorgt ervoor dat het commando op de achtergrond gaat draaien en het script door kan gaan met de volgende regel, oftewel, het script stopt niet om het commando af te wachten, 2. sommige applicaties hebben even tijd nodig om op te starten en het is cruciaal dat als de sessie file van Qtractor ingeladen wordt alle applicaties zijn opgestart zodat Qtractor de JACK connecties kan aanmaken.

Ja, en wat nu als je je sessie af wilt sluiten? Moet je dan alle applicaties handmatig afsluiten? Ja. Maar zo af en toe gebruik ik ook een ‘end-session’ script die alle openstaande audio applicaties killt. Dit kun je ook netjes scripten in je sessie script zelf, zo ver ben echter nog niet en vooralsnog red ik me prima zo. Als ik klaar ben zet ik toch meestal mijn PC uit en het komt zelden voor dat ik tijdens het maken van muziek meerdere sessies na elkaar moet openen.

Bash Session Management

Remix is af!

Gisteren tot een uur of één ‘s nachts mee bezig geweest, de kleine was uit logeren bij opa en oma dus kon ik de boel wat beter afmixen op mijn studio monitoren.

The Infinite Repeat – Money or Love (DJ AutoStatic Remix)

Creative Commons Licentie
Money or Love (DJ AutoStatic Remix) van The Infinite Repeat is in licentie gegeven volgens een Creative Commons Naamsvermelding-NietCommercieel-GelijkDelen 3.0 Unported licentie.
Gebaseerd op een werk op theinfiniterepeat.com.

Wat ik zoal heb gebruikt:

  • Yoshimi Analogue Bass met de C* Pre-amp en Crossover Distortion LADSPA plug-ins
  • Yoshimi Dubstep (custom patch), cut-off live gedaan met behulp van een Akai MPK Mini
  • amSynth Synth Strings 1
  • SO-666 Feedback Drone LV2 plug-in
  • WhySynth DragonPurr DSSI plug-in
  • MDA Vocoder LV2 plug-in + Yoshimi Hard Synth
  • Alle gitaren (Fender Tele and OLP Music Man) door Guitarix en de Redwirez IR Library gehaald
  • Aardig wat Calf Compressors en zowat iedere track (ongeveer 20) heeft een verschillende reverb plug-in (TAP, FreeVerb). Daarnaast een aantal Calf Vintage Delays voor de gitaren en de SO-666. En 2 of 3 Calf Phasers. O ja, en de SC3 plug-in om de SO-666 te ‘ducken’ met behulp van sidechain compressie.
  • Meeste drum samples zijn afkomstig uit de sample collectie die bij LMMS zit. Die had ik ook voor het originele nummer gebruikt en heb besloten ze te recyclen. De crashes komen uit de GSCW2 Hydrogen kit.
  • Lest best, er zit een Glockenspiel in de brug ik. Ik wilde eerst de Glockenspiel uit de SSO library gebruiken maar de kwaliteit van die specifieke samples is niet echt fantastisch dus ben naar de oefenruimte gereden en heb de Glockenspiel van onze drummer opgehaald. Mic erop, een AT2020, en gelukkig stond het er snel en goed op.

Voor deze remix heb ik Qtractor als mixer ingezet, Hydrogen als sampler en seq24 als MIDI sequencer voor de softsynths en de samples. In seq24 heb ik ook de automatisering gedaan voor de plug-ins in Qtractor naast wat volume fades en het muten/unmuten van tracks. Mixdown heb ik gedaan met behulp van jack-capture, weer importeren in Qtractor en vervolgens de linuxDSP MBC2 compressor plug-in erover heen geknald met een limiter erachter.

Reacties zijn vooralsnog goed. Vooral zo’n reactie van de ontwikkelaar van Qtractor is natuurlijk geweldig. Volgens mij heb ik de goeie workflow wel te pakken zo. Ik zal proberen er nog een screencast van te maken.

Remix is af!

Knopjes, knopjes en nog meer knopjes

Meer knopjes wilde ik in mijn thuisstudiootje, dat miste nog een beetje. Ik wil draaien, drukken en schuiven. Even op Marktplaats kijken en ja, iemand heeft ze allebei staan. Nauwelijks gebruikt. En bereid ze weg te doen voor een schappelijk prijsje.

http://www.behringer.com/EN/Products/BCR2000.aspx

http://www.rncbc.org/datahub/Qtractor_Mixer_1-8.syx

Beide apparaten prijken nu op m’n bureautje. Na ze aangesloten te hebben gelijk de nodige SysEx bestanden en het bijbehorende Controller bestand gedownload voor Qtractor:

Qtractor_Mixer_1-8.syx

Qtractor_Mixer_9-16.syx

bcx2000.qtc

De SysEx bestanden heb ik overgezet naar de BCF2000 met behulp van BC Manager wat prima werkt onder Wine. Daarna het Controller bestand geïmporteerd in Qtractor. Werkt perfect allemaal, best cool die automatische faders die terugspringen naar hun plek als je een bestaand project laadt. Vervolgens heb ik de BCR2000 aangesloten via MIDI (geen vrije USB poortjes meer) en een amSynth preset gemaakt. Moet daar nog even een SysEx dumpje van maken en de MIDI mapping opslaan, dan kan ik die ook online zetten.


Knopjes, knopjes en nog meer knopjes