Case Study: Building an Out Of The Box Raspberry Pi Modular Synthesizer J¨urgenReuter

Karlsruhe, Germany, reuter [email protected]

Abstract Headless Synth Modules The idea is simple and obvious: Take some Rasp- berry Pi computing units, each as a reusable syn- VCO VCA thesizer module. Connect them via a network. Con- nect a notebook or PC to control and monitor them. Start playing on your virtual analog modular syn- thesizer. However, is existing audio sufficiently mature to implement this vision out of Network the box? We investigate how far we get in building such a synthesizer, what existing software to choose with focus on networking, analyse what limits we Control Host hit and what features still need to be implemented (Synth GUI & to make our vision become reality. Configuration) Keywords Raspberry Pi, Virtual Anolog Modular Synthesizer, Figure 1: The Vision Distributed Networked Audio proach of a network of RPis reveals several ad- 1 The Vision vantages: The popular Raspberry Pi (or, shortly, RPi )[Raspberry Pi Foundation, 2014b] is a • Dedicated System. The RPis are solely small, cheap, yet powerful, computing unit with used for synthesis. The OS, residing on many I/O jacks with Linux/ARMv6 available an SD card, can be tailored to this pur- as (OS). It is predestinated pose. Many services are irrelevant for head- for building networks of collaborative modules, less mode or use in a synthesizer and thus with each RPi taking over the role of a synthe- need not be installed, thus saving space sizer module with dedicated function as e.g. os- and CPU time. The Linux audio RPi cillator, filter or modulator. Using the RPi’s page[Linuxaudio.org, 2014] lists many tips General Purpose I/O (GPIO) pins or SPI in- for tuning overall latency. Once running, terface, only minimal circuitry is required to infrequent software updates should suffice, equip the RPi with knobs (e.g. potentiometers such that the chance to break the installed or rotary encoders) or sliders, preferably on a software e.g. with incompatible libraries separate, tiny board, also called a shield. This can be reduced. way, you get a distributed user interface, with • Distributed computing. While the knobs and sliders located directly on the mod- performance of the notebook or PC can ule that it controls. Modules can be added to easily become a bottleneck, in the dis- or removed from the network in a hot-plugging tributed network audio computing perfor- manner. If, for a different setup, you need, say, mance scales with the number of modules. more oscillators and less modulators, you may change the role of a module simply by changing • Distributed interface. With a single the software that it runs. mouse and keyboard, you can control only Compared with a virtual analog modular syn- a single input (such as a slider or knob) thesizer running on a notebook or PC, the ap- at one time. Optionally, the RPis can be equipped with their own sliders and knobs, 10 / 100 HDMI enabling to control them in parallel. Also, Mbps you may place the modules on, say, a large Ethernet table, while on the virtual desktop of your 2x notebook or PC, you are limited to size of USB 2.0 your screen display. 3.5mm RCA Video • Authenticity. In a live performance, it Audio GPIO / I2S is more comprehensible for the audience to see a musician put hands on physically exis- tent modules and hear the resulting change Figure 2: RPi Connectors Relevant for Audio of sound, rather than watching a PC user clicking and typing on his computer. 2.1.1 Analog 3.5” Audio Output Jack Users report glitches, crackles and pops when Still, a notebook or PC maybe useful as host using the 3.5” jack, at least in the early days of for controlling network connections between the the RPi. It appearently supports only 11 bits of modules. resolution [Linuxaudio.org, 2014]. Most impor- tant, the RPi has no analog audio input. Analog 2 The Hardware audio can not feed back into the RPi without ad- ditional hardware; hence we do not persue this Our vision just integrates existing software and jack. hardware, one may think. In fact, we have to carefully choose software that smoothely inte- 2.1.2 USB grates with our RPis. We look at the RPi’s Linux supports audio over USB. The RPi model hardware to better understand software require- B’s built-in USB 2.0 connectors only support ments. connecting a USB device, but not another USB host[Raspberry Pi Foundation, 2012d]. Similar 2.1 Audio Connections to the analog audio jack, symmetrical host-to- For building an audio network, we have to de- host transmission is impossible for RPi model B. cide what interconnects to use for audio trans- In theory, RPi model A’s single USB port can mission. Essential criteria are: make the RPi act as device, via a host-to-host USB cable, but there does not seem anyone on the Web having confirmed that the USB drivers • Duplex operation. Synthesizer modules support this mode. typically have both, input and output. We do not want to add hardware to gain full 2.1.3 Audio via HDMI duplex operation. While audio can be transmitted via HDMI, the RPi’s built-in hardware does not support HDMI • Bandwidth. Bandwidth must be suffi- input; hence we do not persue this option. ciently high for carrying multiple channels. 2.1.4 GPIO pins • Audio and control data. For low band- The RPi’s GPIO pins are ideal for low-level in- width data such as envelopes or frequency put and output of binary data. For streaming control, low bandwidth connections (e.g. audio data over GPIO, we would have to im- MIDI) should be supported to save overall plement a full protocol stack in software, thus bandwidth. consuming much computing resources and lim- iting bandwidth. Specific GPIO pins implement • Hardware protocol support. To save I2S with hardware support[Raspberry Pi Foun- computing resources, low-level issues (e.g. dation, 2012c]. While this interface may provide parity check bits or serializing / deserializ- sufficient performance (users report varying ing) should be implemented in hardware. experiences on this issue[stackexchange.com, 2013]), we would need special hardware (e.g. an The RPi’s hardware connectors capable of I2S router). Some users claim that the kernel transmitting audio include the analog 3.5” au- needs to be patched with an I2S kernel module dio output jack, USB, HDMI, GPIO / I2S, and to achieve high performance for audio data over Ethernet (Fig. 2). I2S[GmbH, 2013]. At least, special I2S audio drivers would have to be implemented to make 3.1.1 Network Audio System (NAS) audio applications aware of I2S. The Network Audio System 2.1.5 TCP/IP or UDP over Ethernet (NAS)[radscan.com, 1996 2013] does not The RPi’s Ethernet plug can be used for trans- (yet) list any ARM architecture as supported mitting audio data. Neither TCP/IP nor platform. The man page of NAS states that UDP have been designed for realtime applica- the server automatically converts all data to tions, but existing software for audio and video the designed format or rate, that is, resampling streaming over the internet shows that, with may slow down overall performance. some effort, streaming is feasible as long as net- 3.1.2 PulseAudio work bandwith is sufficiently high. We persue the approach of streaming audio over ethernet. PulseAudio supports streaming over net- works[freedesktop.org, 2013; archlinux.org, 3 The Software 2012 2014]. However, latency seems to be Preferring Ethernet for audio transmission, we a major problem; only recently, major im- next look into the software to choose and how to provements have been announced[Lindner, set it up. We prefer an out of the box solution 2013]. Also, PulseAudio resamples all data of open source software. into some internal format and again resamples it for delivery. The RPi’s limited computing 3.1 Choosing Proper Audio Streaming performance should be saved for the actual Software audio processing of the synthesizer module’s On Linux, there are competiting sound servers function. for streaming audio data over a network. In our 3.1.3 JACK with netJACK short survey the following criteria are essential: In contrast to PulseAudio and NAS[jack de- • Availability. The software must be avail- [email protected], 2012], JACK[jackaudio.org, able for ARMv6. Software, that is not open 2006 2014] synchronizes all clients to one sound source or not under active development, is sink. JACK has been designed from the begin- typically not available for this architecture. ning with low latency in mind. Over the last • Latency. In modular synthesis audio and few months, some remaining bugs that specif- control data typically follow a path run- ically appeared on the RPi/ARMv6 platform, ning through many modules. Therefore, have been fixed. We decide to pursue JACK, the should care for low la- using (jackdmp) version 1.9.9. On our control tency. host notebook, there was a pre-installed JACK (jackdmp) version 1.9.8 that we continue using. • Headless use. The RPis will be typi- Any newer version should also work. cally controlled remotely and therefore run headlessly, that is without a display con- 3.1.4 netJACK1 vs. netJACK2 vs. nected to them. No graphical environment JackTrip such as X11 or a window manager should netJACK1 is available for both JACK1 and JACK2. be required to run. In JACK1, netJACK1 is loaded with the command jackd -R -d net, while netJACK2 is not avail- Audio streaming software like the Enlightened able. In JACK2, netJACK1 is loaded with jackd Sound Daemon (ESD) or Phonon are bound -R -d netone, while netJACK2 is loaded with to a window manager. Therefore, ESD and jackd -R -d net. Phonon are no valid candidates for our purpose. The graphical application qjackctl can sndio is an audio server for OpenBSD, however, be used to load and configure netJACK1 or we are looking into a solution for Linux/ARM. netJACK2 as backend. However, as of qjackctl The aRts sound server is out of development version 0.3.9 bundled with current NOOBS, sev- since 2006 and therefore not a viable choice. A eral bugs render qjackctl effectively useless quick internet search yields the following candi- when used with the netJACK2 backend on the dates: RPi. Particularly, it uses netJACK1 options such • Network Audio System (NAS) as -o4 instead of -P 4 for setting up 4 output channels, and exhibited problems to detect an • PulseAudio already running JACK instance. We prefer to use • JACK with netJACK the RPis in headless mode anyway, i.e. without using qjackctl. Running qjackctl on the con- and to set up a proper route to your network. trol host seems to be fine for our purposes. Now we have basic NOOBS installed on the RPi. The documentation of JackTrip[Caceres and Name for login on the RPi is pi, password is Chafe, 2010] explains how to setup a single raspberry. JackTrip server with a single JackTrip client. 3.2.2 Setting Up JACK on the RPi The server is a stand-alone applica- JackTrip To automatically start a JACK slave instance on tion that, when started, appears as regular JACK each RPi upon boot, put the following line into client. When trying to start another JackTrip the /etc/rc.local script: server instance, it complains that the associ- sudo -u pi /usr/bin/jackd -R -d net -n ated UDP socket is already in use. The sin- module-name >/dev/null 2>&1 & gle server instance spawns only a sin- JackTrip The instance will then appear to the mas- gle readable client in qjackctl. The JackTrip ter JACK instance on the control host as a re- documentation does not show any appearent mote slave instance called module-name. Alter- way to connect multiple JackTrip clients. The natively, JACK can be started implicitly by the latest ChangeLog entry of dates from JackTrip client application. Say, you have a low-pass fil- November 2010. As we need to connect multiple ter implementation that connects to JACK with clients, we do not further persue JackTrip. 3.2 Putting it All Together jack_options_t options = JackNullOption; client = jack_client_open (client_name, Next, we give a step by step instructions for options, &status, server_name); installing and configuring all software for an RPi based modular synthesizer with JACK and and your .jackdrc configuration file in your netJACK. home directory containing the following line: 3.2.1 Setting up NOOBS on the RPi By now, there is no distribution tailored for au- /usr/bin/jackd -R -d net -n low-pass \ dio applications on the RPi. Instead, we use the -C 3 -P 4 New Out Of Box Software (NOOBS) version 1.3.2 (Debian 3.10.24+ #614 PREEMPT armv6l ker- Then starting your client application will also nel) based on the Wheezy Raspian distribu- start JACK. That is, in your /etc/rc.local tion. We follow the instructions on the down- script, you can also directly launch your client load webpage[Raspberry Pi Foundation, 2014a] application. and on the screen display, that we needed to at- 3.2.3 Setting Up JACK on the Control tach to the RPi solely for the first installation, Host as well as a keyboard. Once one system is run- On our notebook we use JACK 1.9.8. The JACK ning, no more display or keyboard is needed. master instance is started with the command The SD card’s contents can be copied to create jackd -R -d alsa or with whatever backend another OS instance for another RPi. else you prefer over ALSA. After that, we When asked by NOOBS to select a distribution, load netJACK with the command jack load we choose Raspian (i.e. Debian wheezy). With netmanager, such that all JACK slaves on the 16GB class 4 SD card and 10 MBit/s internet RPis may connect to the JACK master. connection, the following installation roughly Note that the JACK master on the control host takes 45 minutes, including several automatic must be started first. After that, boot the RPis. reboots. Finally, the raspberry configuration If JACK is automatically started on the RPi, tool raspi-config is executed. The preset de- then it will become visible to the control host. faults should be fine. Use qjackctl on the control host to connect all JACK including netJACK should be al- RPis’ inputs and outputs. Start playing your ready installed. For developing and com- distributed RPi based modular synthesizer. piling JACK clients, you need to install C header files for JACK with the command sudo 3.3 Synthesizer Software apt-get install libjack-jackd2-dev, that Throughout this work, the author used very installs the packages libdbus-1-dev and simple self-written JACK clients based on the libjack-jackd2-dev. If there is no DHCP simple client.c example of the JACK distri- server on your network, do not forget to stat- bution. In our out of the box spirit, we want ically assign a unique IP address to each RPi to apply those existing LV2 plugins[LV2, 2014] for actual synthesis that do not require a GUI. function. Each shield can be individually Therefore we need a simple JACK client serving labelled (e.g. “master reverb effect”) and as host for LV2 plugins that examines a given typically has a set of knobs or sliders that LV2 plugin’s I/O lines and exports them as JACK also may help identify its function. channels. The author does not know of an exist- ing software doing this job, but the effort should • Parallel control of hardware knobs not be too large. This work still has to be done. and sliders. When controlling a virtual knob or slider on a screen, you need to 4 Advanced Module Identity and place the mouse pointer on it. That is, Identification only one input control can be used at a For simplicity and ease of use, each RPi should time. Switching between knobs or sliders represent exactly one synthesizer module. Then takes time for relocating the mouse pointer. each RPi has a dedicated, clearly distinct func- Hardware knobs and sliders enable parallel tion, helping to keep clear oversight over the use and fast switching. whole system. This approach looks like waste of • Module identity change by shield re- computing resources, if, for example, one RPi is placement. If the shield provides an iden- dedicated as an oscillator. However, even tasks tifier for the RPi that represents the mod- looking as simple as an oscillator may evolve ule’s intended function (e.g. an LADSPA into high complexity when adding sophisticated plugin ID), the RPi may automatically input controls, for example for morphing be- start any associated software or plug-in tween sounds. We identify three options of iden- that implements the module’s function in- tification: remote setup, SD card based identity, dicated by the shield. shield based identity. 4.1 Remote Setup This way configuring an RPi as a dedicated The software on the RPi’s SD card contains all module boils down to connecting a specific software for all supported module types, e.g. shield with knobs and sliders to it. The RPi’s oscillator, low-pass filter or reverb effect. The SD card holds the software for any supported function of a specific RPi is determined by re- module, and when plugging in a shield, the RPi motely configuring it on the control host. can determine which module to represent. 4.2 SD Card Based Identity 4.4 Shield Design As the RPi uses its SD card as resident mem- While the author has not (yet) developed a ory with complete OS and application software shield, the design idea is simple and straight- on it, the RPi gets a complete new identity by forward. We need circuitry connected to the simply replacing the SD card. That is, we may RPi’s GPIO pins that converts input from ana- create an oscillator SD card, a low-pass filter log controls like knobs or sliders into digi- SD card, a reverb effect SD card, etc. The RPi tal signals. There are shields available with represents a particular type of synthesizer mod- exactly this feature[abelectronics.co.uk, 2013; ule just by inserting the appropriate SD card. Raspberry Pi Foundation, 2012a; Modern De- The RPi announces itself e.g. as oscillator or vice, 2014]. Even cheap A/D converters are suf- low-pass filter or reverb effect. The control host ficient for low frequency signals such as move- will collect all announcements and present all ments of knobs and sliders[Sklar, 2012] and available modules to the user for wiring. accessible via SPI[Brownell and others, 2013; 4.3 Shield Based Identity Gzamboni, 2013]. Rotary encoders can be di- For most modules, it is useful to provide hard- rectly connected to the GPIO pins, as they ware knobs or sliders directly attached to the simply consist of mechanical switches. The modules, using a shield mounted directly on the shield should contain a small serial EEPROM RPi. While this approach requires (little) extra for uniquely identifying or describing the mod- hardware and thus is not a pure out of the box ule’s function and maybe storing a user-defined solution, it has substantial advantages: module label. The label must be stored on the shield, not on the RPi’s SD card, as is • Visual module identification. The ex- names the module’s function as stamped by the tra hardware gives the RPi a visual iden- shield, regardless of the particular underlying tity and emphasizes that RPi’s dedicated RPi. Maybe designing and producing proper shields for our synth modules can emerge as can- and back to the notebook, then to the second didate for a tiny crowdfunding project. loop-through module and back to the notebook and finally to the ALSA backend device (Fig. 3). 5 Evaluation That is, for n channels, there are 6n connections Our attempt to set up a modular synthesizer configured in qjackctl. using out of the box software shows remarkable We measured the CPU load reported by limitations that should be considered as feature jack cpu load() and varied the number of chan- requests for the software that we discuss. nels per module. Each box plot shows the range of CPU load of 480 samples (1sample/sec × 5.1 Audio Data Routing 8min). For n > 18 (i.e. > 108 connections), se- vere problems like xrun errors and JACK crashes ALSA arised. Below this threshold, the system be- VCO haved smoothly with moderate load (Fig. 4). n n n For comparison, the overall CPU load shown n n n by xosview kept below 0.7. Master JACK Server CPU Load on Master JACK Server

13 Quartiles

12

11

10

Figure 3: Routing via Master JACK Server 9 The probably most obstructive issue is the 8 central routing of all audio data via the mas- 7 6 ter JACK instance. The netJACK2 approach as- CPU Load Reported by jackd_cpu_load() sumes a single master instance[St´ephaneLetz 5

4 et al., 2009]. Similarly, in netJACK1 a slave 2 4 6 8 10 12 14 16 18 can only be connected to one master at a time. Number of Channels per Module The master’s backend (e.g. an ALSA sound de- Figure 4: CPU Load on Master JACK Server vice) determines the sample rate and format for all commnunication with all participating JACK qjackctl often unexpectedly exited (with slave instances. To prevent the master becom- exit code 0), when a remote client reappeared ing a bottleneck, we would prefer RPi hosting a after reboot. Sometimes it did not recognize slave and a master JACK instance. when the connection to a remote client broke The qjackctl application follows the JACK down due to client shutdown (maybe due to and netJACK design and provides a GUI for con- some problem of netJACK2). The master JACK figuring routing between the single master and server crashed when trying to connect more multiple clients / slaves. If in a future version than 21 channels to the ALSA backend. of JACK / netJACK multiple masters were sup- ported, we would like to have an extended ver- 5.2 Labelling of Modules sion of qjackctl capable of managing connec- On our control host notebook running tions between two remote master instances. qjackctl, by default all JACK slaves ap- For evaluating the impact of central routing, pear as clients with the name of the host they we measured the master JACK CPU load as a are running on. While this is reasonable default function of the number of audio channel connec- behaviour, we have a network of RPis with tions. We connected three RPis to our notebook basically identical software setup. Therefore (Quad Core i5-2430M @ 2.4 GHz), used as con- all RPis will appear as JACK clients labelled trol host for running the master JACK server. “raspberry” – the default host name for the One of the RPis served as array of n oscilla- Raspian Linux distribution. We could configure tor outputs; the other two modules just looped individual hostnames for each RPi, but it is through data from their n input channels to the type of synthesizer module that should be their n output channels. That is, for each chan- displayed rather than a host identifier. Also, we nel audio data flows from the oscillator to the do not want to change the host name each time notebook, then to the first loop-through module the RPi changes the type of module. Luckily, netJACK2 provides command line option -n to Of course, if software running on the con- explicitly set the client name. For example, trol host has knowledge about all synthesizer jackd -R -d net -n low-pass will result in module types that may appear in the network, a client called low-pass (Fig. 5). In netJACK1, it may derive labels channels labels from the there is no comparable option. slave’s name. This workaround however does not qualify as out of the box solution. 5.5 Boot Time Our NOOBS based setup takes almost one minute of time for booting an RPi. For an embed- ded system that you want to immediately start working with, this time is far too long. There exist tailored kernels and software configura- tions for faster booting, reduced to a minimum of what is required for the dedicated purpose. Choosing a fast SD card may speed up boot- ing as well as using the kernel’s fastboot op- Figure 5: Slave started with jackd -R -d net tion. RPi users report tips und tricks to re- -n low-pass -C 3 -P 4 duce its boot time to as low as less than 20 seconds[Raspberry Pi Foundation, 2012b].

5.3 Number of Channels 6 Conclusions By default, a netJACK client is started with a number of audio input and output channels Linux on Raspberry Pi is almost mature for im- equal to that of the soundcard, i.e. mostly 2 for plementing our vision of a modular synthesizer stereo sound. In contrast, a synthesizer module based on a network of RPis connected to a note- may have an arbitrary number of inputs and book or PC as control host. The most outstand- ing problem in our setup is that all audio and ouputs. Luckily again, the netJACK2 backend MIDI data is routed through the master provides the command line options -C, -P, -i, JACK instance running on the control host. Instead, and -o to specify the number of audio input, audio output, MIDI input, and MIDI output the RPis should be able to communicate directly with each other. This approach however would channels, respectively (Fig. 5). In netJACK1, require multiple master instances to be the corresponding options are named -i, -o, -I, JACK part of the communication network, while the -O, respectively. netJACK architecture currently assumes a sin- 5.4 Labelling of Channels gle master instance. The module software should be able to config- As the RPis are run in headless mode, on the ure the names of a JACK slave’s audio and MIDI control host we would like to run an applica- input and output channels individually. For ex- tion capable of configuring the complete sys- ample, an oscillator may have a pitch control in- tem. In particular, setting up direct connections put, a noise content control input, a left channel between two RPis (once it will be supported) audio output and a right channel audio output. reaches beyond the scope of qjackctl. An ex- In JACK, port names can be set with the tended version of qjackctl could turn out es- function jack port set name(jack port t sential for our vision. The overall stability of *port, const char *port name). They are qjackctl should be improved. initially set to capture n or playback n for For using existing LV2 plugins, there is miss- inputs or outputs, respectively. When the ing some JACK client serving as LV2 plugin host. function is executed on the RPi, it refers The author plans to get in contact with to the port name locally shown on the RPi. the authors of the depicted software to solve Unfortunately, netJACK does not report slave remaining issues. The example & testing port names to the master. Instead, on the code of this study is available at http://www. master JACK instance, remote client channels soundpaint.org/rpi-modular-synth/. The always appear as from slave n, to slave n, author wants to thank the anonymous reviewer midi from slave n, and midi to slave n for pointing out some missing point for true out (Fig. 5). of the box spirit and a further reference. References Modern Device. 2014. Lots of abelectronics.co.uk. 2013. ADC Pi - 8 Pots Board for Raspberry Pi. Channel Analogue to Digital converter http://moderndevice.com/product/ for the Raspberry Pi computer boards lots-of-pots-lop-board-for-raspberry-pi. ADC PIV2. http://www.abelectronics. radscan.com. 1996–2013. The Network Audio co.uk/products/3/Raspberry-Pi/17/ System (NAS). http://www.radscan.com/ ADC-Pi-V2---Raspberry-Pi-Analogue-to-\ nas.html. Digital-converter. Raspberry Pi Foundation. 2012a. Gertboard archlinux.org. 2012–2014. Pulseau- — Raspberry Pi. http://www.raspberrypi. dio/examples - archwiki. https://wiki. org/archives/tag/gertboard. archlinux.org/index.php/PulseAudio/ Examples#PulseAudio_over_network. Raspberry Pi Foundation. 2012b. How to speed up boot time if run headless? David Brownell et al. 2013. spi- http://www.raspberrypi.org/phpBB3/ dev. https://www.kernel.org/doc/ viewtopic.php?f=29&t=25777. Documentation/spi/spidev. Raspberry Pi Foundation. 2012c. Rasp- Juan-Pablo Caceres and Chris Chafe. berry Pi – I2S: Anyone got it running? 2010. JackTrip: JackTrip Documentation. (answer is yes!). http://www.raspberrypi. https://ccrma.stanford.edu/groups/ org/phpBB3/viewtopic.php?t=8496. soundwire/software/jacktrip/. Raspberry Pi Foundation. 2012d. freedesktop.org. 2013. Network. Raspberry Pi - Model A Q: Can it http://www.freedesktop.org/wiki/ be USB client instead of USB host? Software/PulseAudio/Documentation/ http://www.raspberrypi.org/phpBB3/ User/Network/. viewtopic.php?f=63&t=15696. Modul 9 GmbH. 2013. Hifiberry Raspberry Pi Foundation. 2014a. Downloads dac – linux configuration — crazy — Raspberry Pi. http://www.raspberrypi. audio. http://www.crazy-audio. org/downloads. com/projects/hifiberry-mini/ hifiberry-mini-linux-configuration/. Raspberry Pi Foundation. 2014b. Raspberry Pi — An ARM GNU/Linux box for $25. Take Gzamboni. 2013. SPIdev. http: a byte! http://www.raspberrypi.org. //linux-sunxi.org/SPIdev. Mikey Sklar. 2012. Analog In- jack [email protected]. 2012. Discussion puts for Raspberry Pi Using the of the jack audio server and jack applica- MCP3008 — Adafruit Learning Sys- tions: Netjack for Thinclients Instead of tem. http://learn.adafruit.com/ Pulseaudio. http://comments.gmane.org/ reading-a-analog-in-\and-controlling-\ gmane.comp.audio.jackit/25406. audio-volume-with-the-raspberry-pi/ jackaudio.org. 2006-2014. JACK — connect- overview. ing a world of audio. http://jackaudio. stackexchange.com. 2013. hardware org/. – How fast is GPIO+DMA? Multi Mirko Lindner. 2013. PulseAudio I2S input – Raspberry Pi Stack 4.0 verringert Latenz und steigert Exchange. http://raspberrypi. Geschwindigkeit - Pro-Linux. http: stackexchange.com/questions/9646/ //www.pro-linux.de/news/1/19858/ how-fast-is-gpiodma-multi-i2s-input. -40-verringert-latenz-und-\ St´ephane Letz et al. 2009. Walk- steigert-geschwindigkeit.html. Through/User/NetJack2 Jack Audio Linuxaudio.org. 2014. Raspberry Pi and Connection Kit – Trac. http://trac. realtime, low-latency audio [Linux-Sound]. jackaudio.org/wiki/WalkThrough/User/ http://wiki.linuxaudio.org/wiki/ NetJack2. raspberrypi#on-board_audio. LV2. 2014. LV2 Trac. http://lv2plug.in.