Developers
The MOD Duo and Duo X units run a highly-optimized Linux embed system, using JACK as audio server and loading plugins in LV2 format.
Plugin parameters can be controlled via the units' built-in knobs and footswitches, via MIDI CC and Pitchbend or via Control Chain devices.
Contents
Technical information
The MOD Duo runs the Linux kernel version 3.4, with real-time patch. Running in a ARMv7 32bit OS.
The MOD Duo X runs version 4.9, also with real-time patch. Running in a ARMv8a 64bit OS.
ALSA is used for the audio driver. JACK runs inside as audio server backend, with mod-host loading each LV2 plugin as a new (internal) JACK client. mod-ui is the web server, it talks to mod-host over a unix socket.
There's no X11 or any other kind of graphical interface. In fact, X11 libs are not even available.
The MOD Duo CPU is a dual-core Cortex A7, running at a constant 912 MHz. It is possible to set the speed to 1.0GHz, but with the risk of stability issues.
The MOD Duo X CPU is a quad-core Cortex A53, running at a constant 1.5GHz.
The compiler is GCC 4.9.
The default compilation flags for the Duo are:
-O3 -mcpu=cortex-a7 -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -mvectorize-with-neon-quad
And the flags for Duo X are:
-O3 -mcpu=cortex-a53 -mtune=cortex-a53
(Note: 64bit ARM compilers do not use 'fpu' flags, as their usage is implied)
For aggressive optimization, add these:
-ffast-math -fprefetch-loop-arrays -funroll-loops -funsafe-loop-optimizations
Building binaries for the MOD Duo can be easily done using the mod-plugin-builder.
Apart from programming software in a "traditional" way, it's also possible to generate audio plugins for the MOD from gen~ objects created in Cycling '74 Max. See the Max_gen~ page for more details.
Useful links
These are useful links for general information regarding developing audio plugins and realtime software.
Please note that it is also possible to build LV2 plugins using DPF or Juce. Building with those frameworks is not yet documented though, please reach out to us if interested on the subject.
mod-plugin-builder
The mod-plugin-builder is a custom build system that gives developers a similar system to what's available inside the Duo.
We do not recommend the use of a regular Linux ARM system or compiler, as it might lead to issues due to mismatching library versions.
If you're running Linux just clone MOD Plugin Builder and follow the instructions.
For other operating systems you will need something like docker desktop, more details here.
In summary:
$ git clone https://github.com/moddevices/mod-plugin-builder
$ cd mod-plugin-builder
$ ./bootstrap.sh <platform>
$ # Where platform can be modduo or modduox
This process should take at least 1 hour, probably more depending on your CPU.
Assuming your source code is cross-compile friendly (ie, no hardcoded compiler and paths and uses pkg-config to find extra libraries), the compiler setup is as simple as: (adjust as needed)
$ pushd ~/mod-plugin-builder/
$ source local.env <platform>
$ popd
$ # cmake, waf configure, ./configure, etc
$ make
The local.env file will setup your Linux compiler environment variables (such as CC, CXX, CFLAGS, etc) to use mod-plugin-builder files.
If everything goes well, the resulting binaries will be ARMv7, MOD Duo compatible.
Quick example plugin
A quick example plugin is available inside mod-plugin-builder in plugins/package/eg-amp-lv2/source/, which works with this cross-compilation setup.
See https://github.com/moddevices/mod-plugin-builder/tree/master/plugins/package/eg-amp-lv2/source
Building this example plugin can be done like so:
$ source ~/mod-plugin-builder/local.env
$ make -C ~/mod-plugin-builder/plugins/package/eg-amp-lv2/source
After this the eg-amp.lv2 bundle is ready to be deployed into a MOD unit.
Deploying plugins
You can push an LV2 plugin bundle to the MOD Duo via command-line, using curl, by running this: (adjust as needed)
$ cd ~/mod-plugin-builder/plugins/package/eg-amp-lv2/source/
$ tar cz eg-amp.lv2 | base64 | curl -F 'package=@-' http://192.168.51.1/sdk/install
That's it! Your plugin is now inside the Duo!
To those curious ones, the last command packs the eg-amp.lv2 into a tar.gz file, encodes it as base64 and then sends it to a special URL that the MOD unit uses to install plugin tarballs.
APIs and Documentation
Linux
Being Linux, developers have access to UNIX and POSIX APIs.
This means <unistd.h>, <pthread.h> and <stdlib.h> for example.
For more information see:
- https://www.kernel.org/doc/man-pages/
- http://pubs.opengroup.org/onlinepubs/9699919799/functions/contents.html
JACK
Also known as Jack Audio Connection Kit, is the audio server running inside the MOD.
Developers can create JACK clients to interact with the audio data directly (without being managed by a plugin host).
For more information see:
NOTE: All MOD units use JACK2.
LV2
Audio and MIDI plugins in MOD Devices are done in LV2 format.
MOD provides custom LV2 extensions (for MOD specific data and HTML interfaces).
For more information see:
- http://lv2plug.in/pages/developing.html
- https://moddevices.github.io/mod-sdk/mod/
- https://moddevices.github.io/mod-sdk/modgui/
Toolchain
As of release 1.10, the MOD Duo and MOD Duo X uses:
- GCC 4.9
- glibc 2.21
- binutils 2.25
While the MOD Dwarf uses:
- GCC 7.5
- glibc 2.27
- binutils 2.26.1
We are working to bring the same GCC 7.5 to the Duo and Duo X as optional build target, while keeping the same glibc and binutils.
Libraries
The following libraries are available inside the Duo:
- acl
- alsa
- armadillo
- audiofile
- boost
- cairo
- dbus
- expat
- fftw/fftwf (v3.3.5 on Duo, v3.3.8 on Duo X and Dwarf)
- ffmpeg
- flac
- fluidsynth
- fontconfig
- freetype
- gio/giomm
- glib/glibmm
- glibc (v2.21)
- icu
- jack
- libffi
- libgig
- libjpeg/libturbojpeg
- liblo
- libogg
- libpng
- libsamplerate
- libsigc
- libsndfile
- libvorbis
- libxml2
- lilv
- lvtk (v1 and v2)
- mxml
- ncurses
- ne10
- pcre
- pixman
- python (v3.4)
- qt5 (core, network, sql and xml)
- readline
- sdl
- serd
- sord
- sratom
- systemd (v219)
- zita-convolver
- zita-resampler
Developer mode
MOD's web interface has some hidden features, not really useful for users but useful for developers.
This includes:
- Buffer size change (128 or 256 frames per cycle)
- Install-All button in plugin store
- Network statistics
- Xrun counter (a.k.a. audio drop-outs)
Beta/Unstable plugins
By default unstable plugins are hidden in the plugin store; however they can be made visible for use within pedalboards.
There is an option on the special settings page: http://192.168.51.1/settings.
NOTE: Do not report bugs when using unstable plugins.
They have not been curated or tested, so they might corrupt memory or even crash.
Use with caution.
USB Device Support
- Most USB-MIDI devices (if they are class-compliant, they should just work)
- Arduino running MocoLufa firmware (to create midi-controllers)
- PlayStation 3 and 4 Controllers
- Guitar Hero Controller (Red Octane Xbox version)
- Any regular joystick
Hardware Specification
MOD Duo
CPU:
- Dual Core ARMv7 1.0GHz
- 4GB Flash Storage, 1GB RAM
AUDIO CODEC:
- Cirrus Logic, 24 bit / 48 kHz AD/DA
- DAC/ADC: 104dB Dynamic Range. -90dB THD+N
CONTROLLER:
- 2 knobs with LCD screen
- 2 foot switches with color LEDs
I/O CONNECTIONS:
- MIDI IN/OUT – Standard DIN 5 pins
- Control Chain – RJ45 connector – for additional controllers
- USB HOST – USB 2.0 Standard-A type, supporting: USB Bluetooth and USB MIDI
- USB DEVICE – USB 2.0 Standard-B type, supporting: USB Ethernet Connection
MOD DuoX
CPU:
- A53 quad core 1.4 GHz + A72 dual core 2 GHz
- 16GB Flash Storage, 2GB RAM
AUDIO CODEC:
- Cirrus Logic, 24 bit / 48 kHz AD/DA
- DAC/ADC: 104dB Dynamic Range. -90dB THD+N
CONTROLLER:
- 2 knobs with LCD screens
- 7 pushbuttons with color LEDs
- 8 analog potentiometers
I/O CONNECTIONS:
- MIDI IN/OUT – Standard DIN 5 pins
- Control Chain – RJ45 connector – for additional controllers
- USB HOST – USB 2.0 Standard-A type, supporting: USB Bluetooth and USB MIDI
- USB DEVICE – USB 2.0 Standard-B type, supporting: USB Ethernet Connection
- Control Voltage IN/OUT – 0 to 10 volt – for connecting to analog gear
- SPDIFF output – 3.5mm-jack – for digital audio output