Please do not post a support request without first reading and following the advice in https://retropie.org.uk/forum/topic/3/read-this-first

[Tutorial] Installing Munt (MT-32 emulation) on RPi 3



  • This is a tutorial on setting up Munt (Roland MT-32 and CM-32L synthesizer modules emulator) on RetroPie 4.2 on Raspberry Pi 3 (Model B). This article should be applicable to other hardware as well (with proper compiler flags). Tutorial is based on these two articles:

    Munt is generally working on Raspberry Pi 3, but sometimes sound jams a bit.

    Here are the installation steps:

    1. Install necessary packages (some other packages might be needed as well):
      sudo apt-get install build-essential cmake portaudio19-dev qtmobility-dev libx11-dev libxt-dev libxpm-dev
    2. Download Munt 2.2.0:
      wget https://github.com/munt/munt/archive/munt_2_2_0.tar.gz
    3. Extract Munt and prepare build dir:
      tar -xzf munt_2_2_0.tar.gz
      mkdir munt-build
      cd munt-build
    4. Set compiler flags (this is specific for Raspberry Pi 3, compiler flags for other systems are listed at the end of this post):
      export CCFLAGS="-Ofast -march=armv8-a+crc -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard -ftree-vectorize -funsafe-math-optimizations"
      export CXXFLAGS="-Ofast -march=armv8-a+crc -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard -ftree-vectorize -funsafe-math-optimizations"
    5. Build Munt:
      cmake -DCMAKE_BUILD_TYPE=Release -Dmunt_WITH_MT32EMU_QT:BOOL=OFF ../munt-munt_2_2_0
      make -j 4
    6. Install Munt:
      sudo make install
    7. Build Munt ALSA MIDI driver:
      cd ../munt-munt_2_2_0/mt32emu_alsadrv
      make
    8. Install Munt ALSA MIDI driver:
      sudo make install
    9. Verify that Install Munt ALSA MIDI driver is installed:
      ls -la /usr/local/bin/mt32d
    10. Place MT-32/CM-32L ROM files (MT32_CONTROL.ROM and MT32_PCM.ROM for MT-32 emulation, or CM32L_CONTROL.ROM and CM32L_PCM.ROM for CM-32L emulation) in folder /usr/share/mt32-rom-data
    11. Configure Munt to start automatically - add line /usr/local/bin/mt32d -i 12& to file /etc/rc.local (above last line containing exit 0). The parameter -i 12 is audio output buffer size, a bigger number might be needed if audio is shuttering (output buffer underruns occur), a smaller number might be used to decrease sound output latency/lag (important for CM-32L sound effects).
    12. To decrease jamming of the sound these ondemand CPU governor tweaks can be added to /etc/rc.local (above or below mt32d command line):
      echo -n 100 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor
      echo -n 50000 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_rate
    13. As alternative to previous step CPU governor can be set to performance - this will make Raspberry Pi more hot however might decrease jamming more:
      echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
    14. After configuring autostart and CPU governor reboot Raspberry Pi
    15. After reboot check that Munt has created MIDI output port by command aconnect -o (output should contain client 128: 'MT-32' [type=user]).
    16. Configure DOSBox to output MIDI to Munt - in file /home/pi/.dosbox/dosbox-SVN.conf adjust the line midiconfig= to be midiconfig=128:0
    17. Run a DOS game and test MT-32/CM-32L emulation.

    Compiler flags for various boards/systems/hardware (taken/adapted from RetroPie-Setup). There are exactly two commands for each system (long command-lines get visually wrapped here).

    • Raspberry Pi 3:
      export CCFLAGS="-Ofast -march=armv8-a+crc -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard -ftree-vectorize -funsafe-math-optimizations"
      export CXXFLAGS="-Ofast -march=armv8-a+crc -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard -ftree-vectorize -funsafe-math-optimizations"
    • Alternative Raspberry Pi 3 compiler flags (probably less optimal, mentioned in initial versions of this article):
      export CCFLAGS="-Ofast -mcpu=cortex-a53"
      export CXXFLAGS="-Ofast -mcpu=cortex-a53"
    • Raspberry Pi 2:
      export CCFLAGS="-Ofast -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -ftree-vectorize -funsafe-math-optimizations"
      export CXXFLAGS="-Ofast -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -ftree-vectorize -funsafe-math-optimizations"
    • Alternative Raspberry Pi 2 compiler flags (probably less optimal) are described here.
    • Raspberry Pi 1/Zero (not sure whether Munt will be usable on these boards):
      export CCFLAGS="-Ofast -mfpu=vfp -march=armv6j -mfloat-abi=hard"
      export CXXFLAGS="-Ofast -mfpu=vfp -march=armv6j -mfloat-abi=hard"
    • ODROID-C2:
      export CCFLAGS="-Ofast -march=armv8-a+crc -mtune=cortex-a53 -mfpu=neon-fp-armv8 -ftree-vectorize -funsafe-math-optimizations"
      export CXXFLAGS="-Ofast -march=armv8-a+crc -mtune=cortex-a53 -mfpu=neon-fp-armv8 -ftree-vectorize -funsafe-math-optimizations"
    • ODROID-C1:
      export CCFLAGS="-Ofast -mcpu=cortex-a5 -mfpu=neon-vfpv4 -mfloat-abi=hard -ftree-vectorize -funsafe-math-optimizations"
      export CXXFLAGS="-Ofast -mcpu=cortex-a5 -mfpu=neon-vfpv4 -mfloat-abi=hard -ftree-vectorize -funsafe-math-optimizations"
    • ODROID-XU:
      export CCFLAGS="-Ofast -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -ftree-vectorize -funsafe-math-optimizations -DGL_GLEXT_PROTOTYPES"
      export CXXFLAGS="-Ofast -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -ftree-vectorize -funsafe-math-optimizations -DGL_GLEXT_PROTOTYPES"
    • Freescale i.MX6 Quad/DualLite:
      export CCFLAGS="-Ofast -march=armv7-a -mfpu=neon -mtune=cortex-a9 -mfloat-abi=hard -ftree-vectorize -funsafe-math-optimizations"
      export CXXFLAGS="-Ofast -march=armv7-a -mfpu=neon -mtune=cortex-a9 -mfloat-abi=hard -ftree-vectorize -funsafe-math-optimizations"
    • x86/other/unknown:
      export CCFLAGS="-Ofast -march=native -ftree-vectorize -funsafe-math-optimizations"
      export CXXFLAGS="-Ofast -march=native -ftree-vectorize -funsafe-math-optimizations"


  • @david87 This is awesome. How's the performance on a stock Pi 3?



  • After much arguing with names, I've discovered the docs on the above web site link aren't quite correct for Linux. ROM names need to be uppercase:

    MT32_CONTROL.ROM
    MT32_PCM.ROM
    CM32L_CONTROL.ROM
    CM32L_PCM.ROM
    

  • Banned

    I read the title as tmnt there are no ninja turtles here ....:( I am off to bed



  • @sduensin Regarding performance of Munt on Raspberry Pi 3 - the sound sometimes jams a bit (timing between notes/sounds seems a bit off). The average CPU usage of Munt (shown by top) is around 40% (of a single core). I guess both Munt and Dosbox should be single threaded (or at least all the heavy processing should be done in a single thread), so Raspberry Pi 3 with its 4 core CPU should be able to run both apps in parallel (without affecting each other).
    I assume that jamming of the sound might be caused by very short and time critical CPU usage spikes of Munt (some heavy processing done by Munt that doesn't happen all the time, but when it happens it must complete in a very short amount of time to prevent sound from being crippled).
    Anyway with the described CPU governor tweaks Munt works IMHO quite well.

    And thanks for mentioning ROM file names - I have updated OP!



  • @david87 said in [Tutorial] Installing Munt (MT-32 emulation) on RPi 3:

    Munt works IMHO quite well.

    Heck yeah it does! Played a few titles in DOSBox on the Pi after getting it to work. Just amazing. This needs to be in the official RetroPie distro!



  • I have updated compiler flags (and added a list of flags that should work on other systems). With updated compiler flags sound seems to jam a bit less on Raspberry Pi 3.



Contributions to the project are always appreciated, so if you would like to support us with a donation you can do so here.

Hosting provided by Mythic-Beasts. See the Hosting Information page for more information.

Looks like your connection to RetroPie Forum was lost, please wait while we try to reconnect.