Living in a shell

Since I started working for my new employer the amount of time I’m spending inside a terminal window is rapidly increasing. And I like it. I’m learning more in a few months than I did in the past 5 years. I’m discovering superhandy commands and utilities that I had never used or even heard of before. Utilities like w, last and the various *stat utilities. And I’m becoming better and better in using utilities that I already know but that always remained hard to grasp simply because I didn’t use them extensively. Think of Vim, screen and sed. Or on a lower level, the Bash shell itself.

I’m particularly starting to develop a fondness for Vim. I’ve worked myself through a complete Vim book and when I finished it I was like, Vim is not arcane at all, it’s actually quite simple. It’s all about terseness, doing things in the fastest, most efficient way, memorizing the most important commands and forcing myself to use it for things I would normally do in say, gedit. So now I find myself easily copying whole blocks of text, commenting and uncommenting multiple lines with just a few keystrokes, using markers and buffers and browsing faster through files than possible with a mouse.

Currently I’m reading a book on Bash and it already provided me with a lot of new insights and ideas that I could use in my daily work. My scripting skills are a bit feeble so hopefully this book will help me to improve these. Luckily I have great colleagues that are very knowledgeable when it come to things like Bash and Vim so I’m coming along just fine. But I want to be able to purge a Sendmail mail queue filled with spam like I saw one of my colleagues do recently. What he did on top of his head was just amazing:

for i in `ls | grep qfr`; do w=`grep example.org $i | wc -l`; if [ "$w" != "0" ]; 
then echo $i | sed -e 's/^qfr//'; fi;  done | sed -e 's/^/*/' | xargs -n 50000;

This allowed him to create a list of all spam messages which he simply ran through rm. It’s no rocket science but I’d really like to be that proficient too. Another colleague of mine is just awesome with regular expressions and Vi. For example, I recently asked him how I could delete all text between parentheses including the parentheses, for example a list of packages I copied from /var/log/apt/history.log, and he immediately replied %s/([^)]*)//g. Yes, I’m blessed that I can work in such an inspiring environment.

Living in a shell

JackLinx site online

De site van het JackLinx project is online gegaan: http://www.jacklinx.nl/

Dit is het project waar ik het in een eerdere blogpost al over had gehad, de educatieve muziekomgeving onder Linux die gebruik maakt o.a. JACK, mididings, QMidiRoute, QmidiNet, Qsynth en Bash scripts:

JackLinx is an application management framework that makes it possible for children and young music students to instantly start working with a complex array of inter-connected Linux Music and Audio applications.

The targeted use scenario is the primary or high school music classroom furnished with a a set of networked desktop or laptop computers, where a music teacher directs and guides a group of music students to perform various music educational assignments and activities using the JackLinx platform.

The JackLinx platform can be used for individual musical instruction and training, for small group work over the network and for live musical performances.

JackLinx aims to be a full featured but simple and flexible music laboratory for all ages that focuses on live musicking.

Ik ben hier ontzettend enthousiast over, vooral vanwege de keuzes van de auteur (Fred de Borst) en het feit dat het optimaal gebruik maakt van de mogelijkheden van Linux audio en Linux in het algemeen (JackLinx maakt bijvoorbeeld goed gebruik van meerdere desktops).


JackLinx op Lubuntu 11.10 met Gnome MPLayer, MuseScore, 9menu en VMPK

Volgende stap is de software geschikt maken om te distribueren en deze zal misschien her en der nog wat gefinetuned moeten worden. Ik ga proberen om de ontwikkelingen zoveel mogelijk te volgen hier op mijn blog.

JackLinx site online

Veel gebeurd

Een alleszeggende titel. Vorige week kennis gemaakt met iemand die bij mij om de hoek woont (en dan ook echt om de hoek) die een complete educatieve muziekomgeving onder Linux heeft gebouwd met behulp van JACK, mididings, QMidiRoute, QmidiNet, Qsynth en Bash scripts. Waanzinnig. En werken als een trein. Hele klassen kunnen via het netwerk met elkaar muziek maken, meespelen met backing tracks of gewoon lekker rommelen met diverse instrumenten. Heel bijzonder en je begrijpt wel dat ik heel graag wil meewerken aan het verder perfectioneren en professionaliseren van deze leeromgeving.

M’n Raspberry Pi’s lagen wat stof te happen maar daar is sinds een paar weken wel een einde aan gekomen. Werd eigenlijk getriggered door een post op de Jack-Devel mailinglist met een patch voor ARM platformpjes zoals de RPi. Een vergelijkbare patch was maanden geleden al een keer gepost maar is bijkans niet meer googlebaar dus aan mijn aandacht ontglipt. Door de patch op Jack-Devel kon ik weer verder als in JACK (zowel Jack1 als Jack2) draait prima op de RPi met deze patch. In eerste instantie kreeg ik de boel niet goed draaiende (vooral full-duplex kreeg ik niet voor elkaar) maar na me goed ingelezen te hebben heb ik mijn RPi zo weten te tweaken dat deze bruikbaar is voor real-time, low-latency audio. Afgelopen woensdag m’n bevindingen laten zien en horen op een Horus meeting en de RPi hield zich prima als virtuele gitaarversterker. En dat allemaal op een ontwikkelboardje van nog geen €30,-. Mijn bevindingen heb ik neergepend in de linuxaudio.org Wiki: http://wiki.linuxaudio.org/wiki/raspberrypi

Ook op mijn werk heb ik het erg druk. Heb me gestort op het WebRTC gebeuren en dat begint nu wel te lopen. Klanten zijn bijzonder geïnteresseerd in het videobelplatform dat we aan het ontwikkelen zijn en het werkt gewoon goed. Ook is het altijd fijn om nieuwe dingen te leren (WebRTC, WebSocket, STUN/TURN/ICE) of je meer te kunnen verdiepen in dingen waar je al wel wat van af wist maar die je nooit echt praktisch hebt hoeven toepassen (audio- en videocodecs, encrypten van datastromen, iptables). Ondertussen zijn we al weer verder aan het kijken naar een volgend project waarbij de focus ligt op router-achtige hardware en software, oftewel we gaan proberen zelf eenvoudige network appliances te gaan bouwen. Onze bureaus worden inmiddels bevolkt door RPi’s, MikroTik RouterBoards en PC Engines Alix boardjes. En die mag je dan onder de baas z’n tijd gaan zitten hacken. Hoe vet is dat. Vooral als het werkt en je met elkaar kunt bellen via een boardje met een 400MHz MIPS processor waar zelfgebouwde OpenWRT firmware op draait.

Oh ja, en maandag gaan we trouwen.

Veel gebeurd

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

Unaware of a Direction

Ben bezig het ideetje van wat blogjes terug verder uit te werken.

The Infinite Repeat – Unaware of a Direction Creative Commons License

Heb de gitaar er nog even uitgelaten en heb zang en bas toegevoegd. Voor de bas heb ik Guitarix gebruikt, machtig modelling programmaatje. Goeie preamp en gain stages en bovendien een zogenaamde convolution engine zodat je met behulp van impulse response bestandjes ook de beschikking hebt over goed klinkende cabinet simulaties. Voor deze opname heb ik een IR bestandje gebruikt van, uiteraard, een Ampeg baskast.

Heb de hele sessie gescript zodat ik met één Bash scriptje de hele boel kan aanroepen, inclusief JACK connecties. Ik zou ook zoiets als Ladish kunnen gebruiken maar dat is weer meer overhead, weer een programma aanleren en bovendien zijn nog niet alle audio apps goed compatibel met Ladish. Daarnaast heb je voor Ladish Jack2 nodig en ik gebruik nog Jack1. Session management onder Linux is sowieso een heet hangijzer op het moment, wacht wel tot de storm is gaan liggen en het sterkste scheepje is blijven drijven. Tot die tijd script ik het zelf wel, hou ik ook volledige controle. En leer ik nog eens wat bij over Bash.

Unaware of a Direction