This document describes how to setup and use a linux computer to record MIDI data. This setup has been used along with a self-penned program (metro, courtesy of Martin Neubauer) to manipulate MIDI data like pitch, velocity and note on and off in real-time, as well as, along with yet another custom-made script (sendtrigger, courtesy of yours truly) to send note-on events as well as metronome clicks to an EEG amplifier via the parallel port.
In this section a couple of scenarios are described under which MIDI data need to be acquired. We will start as simple as possible and increase complexity step by step. But first, we will list required and nice-to-have programs along with alternatives.
On most (all?) modern linux systems, ALSA (Advanced Linux Sound Architecture, http://alsa-project.org/) is used as the sound subsystem, which is the software layer located between soundcard drivers and upper layer software. Your Debian system should come preinstalled with it as it is part of modern linux kernels.
A sound server is at the next hierarchical level atop the sound subsystem, and modern linuxes often (but not always, or not exclusively) use JACK (Jack Audio Connection Kit, http://jackaudio.org/) as sound server. It can be installed by
apt-get install jackd2
To be able to run JACK with real-time priority (essential when real-time manipulations are done to MIDI commands, or during live recording), it needs to be configured appropriately. This can be done during installation of jackd2 or by issuing
dpkg-reconfigure -p high jackd2
Also, the user needs to be added to the audio group:
adduser <user-name> audio
The user must re-log in for this to work! To test whether real-time and memory-locking are allowed for the current user issue
ulimit -r -l
On a working system this yielded
real-time priority (-r) 95
max locked memory (kbytes, -l) unlimited
for me, and starting Qjackctl (see below) ran smoothly (as opposed to before reconfiguring jackd). If this does not work, please visit the config page of JACK!
To ease setting up and controlling JACK, we will also need Qjackctl (https://sourceforge.net/projects/qjackctl/files/):
apt-get install qjackctl
End-user applications like MIDI sequencers etc. operate on top of the sound server and make use of its connections setup in, e.g., qjackctl. To quickly check functionality of connections we install MusE:
apt-get install muse
To be able to run MusE with a high-frequency timer, their FAQ suggests to install a real-time kernel:
aptitude install linux-image-4.14.0-0.bpo.3-rt-amd64
For the kernel to be used the computer needs to be rebooted! Unfortunately, this did not make the error message go away when starting MusE. Starting MusE from the console yielded, among other messages:
Trying RTC timer...
fatal error: open /dev/rtc failed: Keine Berechtigung
hint: check if 'rtc' kernel module is loaded, or used by something else
Trying ALSA timer...
AlsaTimer::initTimer(): best available ALSA timer: system timer
got timer = 72
Aquired timer frequency: 250
The above mentioned FAQ mentions possible problems with priviliges and suggests to add the line
echo 3072 >/sys/class/rtc/rtc0/max_user_freq
to the file /etc/rc.local directly above the “exit” line, followed by a reboot. This did not solve things for me though. They go on to suggest the following:
KERNEL=="rtc0", GROUP="audio"
KERNEL=="hpet", GROUP="audio"
This killed MusE entirely:
Trying RTC timer...
got timer = 72
*** stack smashing detected ***: muse terminated
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x70bcb)[0x7ff56cb2ebcb]
/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x7ff56cbb7227]
/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x0)[0x7ff56cbb71f0]
/usr/lib/muse/modules/libmuse_driver.so(+0x169bc)[0x7ff5723c49bc]
/usr/lib/muse/modules/libmuse_core.so(_ZN8MusECore7MidiSeq30checkAndReportTimingResolutionEv+0x29)[0x7ff573212389]
muse(main+0xab4)[0x56362057cbb4]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf1)[0x7ff56cade2b1]
muse(_start+0x2a)[0x56362057e77a]
======= Memory map: ========
563620577000-563620581000 r-xp 00000000 08:02 9451563 /usr/bin/muse
563620781000-563620782000 r--p 0000a000 08:02 9451563 /usr/bin/muse
563620782000-563620783000 rw-p 0000b000 08:02 9451563 /usr/bin/muse
56362111f000-563621de3000 rw-p 00000000 00:00 0 [heap]
.
.
.
As found on MusE’s github repository, this is a known issue in pre-3 versions of the program. So I got rid of the Debian packages:
aptitude purge muse
and followed their build instructions and compiled the latest git (the stable branch on sourceforge was down at the time).
After successful compilation and installation, MusE3 can be started by
muse3
Since Muse3 uses Pulse Audio as sound subsystem instead of JACK, go to Settings|Global Settings and change the default sound output on the Audio tab to JACK Audio.
MIDI keyboards, especially the more expensive ones, often come with reasonably sounding, sometimes even sample-based instruments. If you only want to use those ‘internal’ sythesizers you are good to go. Should you instead want to sound a computer-generated metronome while recording MIDI messages from a keyboard you need to install a software synthesizer. The same holds for the case where you want to manipulate MIDI messages in real-time.
A software synthesizer emulates a hardware-based synthesizer. Therefore it needs some kind of information about how real instruments sound. These come as digital files called sound fonts. There are quite some sound fonts freely available on the internet. I chose to go with the one that comes with fluidsynth, others suggested http://www.pianosounds.com/freesoundfont.htm and http://www.pianosounds.com/freesoundfont.htm. To me they sounded about the same, but who am I to judge. Here’s how install the soft synth along a control panel to simplify its configuration:
aptitude install qsynth
(Maybe we also need to install fluidsynth
? Installing qsynth
‘only’ installs libfluidsynth1
…)
The Linux Journal has a (rather old but nevertheless) nice article](http://www.linuxjournal.com/article/8354) on using jack along with fluidsynth.
In case you have no access to a physical MIDI keyboard, the linux program vkeybd may come in handy. It can be installed by issuing
apt-get install vkeybd
See Scenario #1: Playback MIDI From Keyboard for details. Also check vkeybd
’s man page.
Connect your MIDI keyboard to the computer using either a MIDI converter or a plain MIDI cable.
The command
sudo modprobe snd_virmidi enable=1
adds one virtual MIDI port to the system. For me this was /dev/midi2, but it might be a different one on your system. The MIDI port /dev/midi1 was the ‘real’ MIDI port I connected the MIDI keyboard with.
Start qsynth, click on [Configure…] and make sure everything looks as in Fig. 1.
Fig. 1. Configuration for fluidsynth in the control panel, qsynth.
(Have a look at /home/grossbach/files/customers/ioannou_christos/eeg-stress-experiment/MIDIwExternalMetronome2EEG.pdf and sendtrigger.pdf for details. The python scripts are in /home/grossbach/files/customers/ioannou_christos/eeg-stress-experiment/software.)
Start qjackctl, click on [Settings…] and make sure everyhing looks as in Fig. 2.
Fig. 2. Configuration of the sound subsystem, jack, in its control panel GUI, qjackctl.
The following needs to be done in the right order to work properly (mostly stolen from here):