MidiExplorer icon indicating copy to clipboard operation
MidiExplorer copied to clipboard

Yet another MIDI monitor, analyzer, debugger and manipulation tool.

MIDI Explorer LogoMIDI Explorer

License: GPL v3 PyPI - Python Version Downloads PyPI - Version

Yet another MIDI monitor, analyzer, debugger and manipulation tool.

GUI

SMF GUI

The intent is to be specifications compliant to help debugging, reverse-engineering and developing products based on the MIDI protocol while learning everything there is to know in the process.

The reference specifications used are linked below and comes from the following standards bodies:

There is two specification supplement types:

  • Recommended Practices (RP) 001-054
  • Confirmation of Approval for MIDI Standard (CA) 018-035

A nice history list is provided by the MSC [JP].
I have made a translated and slightly updated Google Sheet for easier browsing.

Language is currently Python to help with rapid prototyping and fast iteration. It may change at any time as I see fit.

Table of Contents

  • Status
  • Installation
  • Features & TODO
    • Documentation
    • Quality
    • MIDI protocols
    • Platform support
    • Interactive GUI
    • MIDI implementation charts
  • Prior art
  • Legal notice
    • License
    • Dependencies & License Acknowledgment
    • Trademarks

Status

Basic features implemented.

First alpha released!

Testers welcome ;)

Installation (Python)

Install Python 3.10

From python.org (recommended) or your favorite package manager.

Install PipX

Follow the instructions for your operating system.

Microsoft Windows

In a terminal

py -m pip install --user pipx
py -m pipx ensurepath

Close and reopen your terminal.

Mac OS X / Linux

python3 -m pip install --user pipx

Install MIDI Explorer

pipx install midiexplorer

Installation (Native)

Nuitka (alpha)

You may also build a compiled, single-file executable from a properly configured venv using:

python -m nuitka --follow-imports --include-package=rtmidi --include-package=mido --include-package=dearpygui --include-package=dearpygui_ext --include-package=midiexplorer --include-package-data=midiexplorer --onefile --disable-console --windows-icon-from-ico=src\midiexplorer\icons\midiexplorer.ico src/midiexplorer

Features & TODO

Documentation

Quality

  • [ ] Linting
    • [ ] Code style checks? (PEP8 pycodestyle)
    • [ ] Docstrings? (darglint)
    • [ ] Typechecking? (mypy)
  • [ ] Unit tests? (pytest)
    • [ ] Coverage
  • [x] Packaging
    • [x] PyPi
    • [ ] PyInstaller
    • [ ] WIP Nuitka
      • [x] Microsoft Windows
      • [ ] Apple Mac OS X
      • [ ] GNU/Linux
    • [ ] PyOxidiser?
    • Installers
      • [x] Microsoft Windows
      • [ ] Apple Mac OS X
      • [ ] GNU/Linux
        • [ ] AppImage?
  • [ ] Continuous Integration? (GitHub Actions workflow)

MIDI protocols

  • [x] (WIP) v1.0
    includes RP-001/RP-002/RP-003/RP-004/RP-005/RP-006/RP-007/RP-008/RP-009/RP-010/RP-011/RP-012/RP-013/RP-014
    (1983 - February 1996)
    Using a modified mido
  • [ ] v2.0
    (Planned long term: after v1.0 and all its extensions are fully stable)

Platform support

Interactive GUI

  • [x] Icons
  • [x] Fonts
  • [ ] Custom theme
  • [x] About window
  • [x] Connections window (Node editor based)
    • [x] Inputs
    • [x] Outputs
    • [x] Modules
  • [x] History window (Table)
  • [x] Monitor data window (Decoding with live feedback)
  • [x] Generator data window
  • [ ] (WIP) Standard MIDI file window
  • [x] Log window
    • [ ] Insert comment
    • [ ] Save to file
      • [ ] Overwrite
      • [ ] Append
  • [ ] Actions (Menus and/or keyboard shortcuts)
    • [x] Toggle connections (F1)
    • [x] Toggle history (F2)
    • [x] Toggle monitor (F3)
    • [x] Toggle generator (F4)
    • [x] Toggle standard MIDI file (F5)
    • [x] Toggle full-screen (F11)
    • [x] Toggle log (F12)
    • [ ] Save & restore windows state
      (Buggy at the moment)

I/O management

  • [x] List MIDI I/O
    • [x] USB MIDI 1.0
      • [x] OS Level
      • [ ] Direct Access?
    • [ ] USB MIDI 2.0
      • [ ] OS Level?
      • [ ] Direct Access?
    • [ ] IEEE-1394
      RP-027 (MMA) MIDI Media Adaptation Layer for IEEE-1394 v1.0
      RP-027 (AMEI/MSC) MIDI Media Adaptation Layer for IEEE-1394 v1.0
      • [ ] OS Level?
        (Probably works but no hardware to test with)
      • [ ] Direct Access?
    • [ ] Bluetooth Low Energy (BLE-MIDI)
      RP-052 (MMA) Specification for MIDI over Bluetooth Low Energy (BLE-MIDI) v1.0
      RP-052 (AMEI/MSC) Specification for MIDI over Bluetooth Low Energy (BLE-MIDI) v1.0
      • [ ] OS Level
        Requires WinRt MIDI for Microsoft Windows
      • [ ] Direct Access?
    • [ ] RTP-MIDI
      RTP Payload Format for MIDI (MMA)
      IETF RFC 6295 RTP Payload Format for MIDI
      • [x] (Partial) OS Level
        Requires rtpMIDI for Microsoft Windows
        (Works with Microsoft Windows. Untested on other OS)
      • [ ] Direct Access?
    • [ ] Virtual
      • [ ] OS Level
        Requires loopMIDI for Microsoft Windows
      • [ ] Native
        Provided by RtMidi for Linux & Apple Mac OS X
    • [ ] Custom Hardware
      (Planned in the near future. Prototyping in progress.)
      • [ ] 5-Pin DIN
        CA-033 (MMA) MIDI 1.0 Electrical Specification Update [2014]
        CA-033 (AMEI/MSC) MIDI 1.0 Electrical Specification Update [2014]
      • [ ] 2.5mm TRS Jack
        RP-054 (MMA) Specification for use of TRS Connectors with MIDI Devices
        RP-054 (AMEI/MSC) Specification for use of TRS Connectors with MIDI Devices
      • [ ] Mobile Musical Interface
        RP-048/amd1 (MMA) Mobile Musical Interface Specification v1.0.6
        RP-048/Amd1 (AMEI/MSC) Mobile Musical Instrument Specification v1.1 / Mobile Musical Interface Specification v1.0.6
        RP-048 (AMEI/MSC) Mobile Musical Interface Specification v1.0.2
  • [x] ~~Select mido backend?~~
    (Only RtMidi suits our needs)
  • [x] Input reading modes
    • [x] Polling
    • [x] Callback
  • [ ] ~~Sort by ID/Name~~
    (Forced name sorting is enough for now)
  • [ ] Connections
    • [x] Port to probe
    • [x] Probe to port
    • [x] Port to port
    • [ ] Port to any module
    • [ ] Any module to port
    • [ ] Module to module
  • [ ] Refresh
    • [x] Manual
    • [ ] Auto with reconnect
  • [ ] Virtual ports
    • [ ] Add/Remove
  • [ ] Save/restore connections status
  • [x] Timing
    • [x] System
      (Computed using the highest resolution local clock available)
    • [x] Hardware
      (Retrieved using a modified mido RtMidi backend)

History view (Table decode)

  • [x] Input
  • [x] Output
  • [x] Selection decodes to monitor
  • [ ] Selection prepares generator
  • [ ] Color code?
    • [ ] Per source
    • [ ] Per channel
    • [ ] Per message type

Modules

  • [ ] Plugins based architecture?
  • [ ] Instances management?
    (Add/Remove, multiple instances of a module…)
  • [x] Virtual Debug Probe
    • [x] Read raw input
    • [x] Thru support
  • [x] Activity monitor
    • [x] Settings
      • [x] Colors
        • [x] Live
        • [x] Selected
      • [x] Persistence
      • [x] Note-On with velocity set to 0 is Note-Off (Per specification)
      • [x] Display EOX as either a System Common or a System Exclusive message
      • [x] Notation
        • [x] English Alphabetical
        • [x] Syllabic
        • [x] German Alphabetical
    • [ ] Stateless
      • [x] Message type
        • [x] Channel
        • [x] System
      • [x] Channel
      • [x] Controllers
    • [ ] Stateful
      • [x] Notes
        • [x] Keyboard
          • [x] Velocity
        • [ ] Staff
      • [ ] Controllers
        • [x] Value
        • [ ] Data Increment / Decrement
          RP-018 (MMA) Response to Data Inc/Dec Controllers
          RP-018 (AMEI/MSC) Response to Data Increment/Decrement Controller
        • [ ] Sound Controller Defaults
          RP-021 (MMA) Sound Controller Defaults (Revised)
          RP-021 (AMEI/MSC) Defaults for Sound Controllers
        • [x] (Partial decoding) High Resolution Velocity Prefix
          CA-031 (MMA) CC #88 High Resolution Velocity Prefix
          CA-031 (AMEI/MSC) CC#88 High Resolution Velocity Prefix
        • [ ] Registered Parameter Numbers (RPN)
          • [x] (Partial decoding) 00 Pitch Bend Sensitivity
          • [x] (Partial decoding) 01 Fine Tuning
          • [x] (Partial decoding) 02 Coarse Tuning
          • [x] (Partial decoding) 03 Tuning Program Select
          • [x] (Partial decoding) 04 Tuning Bank Select
          • [x] (Partial decoding) 05 GM2 Modulation Depth Range
            CA-026 (MMA) Modulation Depth Range RPN
            CA-026 (AMEI/MSC) Modulation Depth Range RPN
          • [ ] 06 MIDI Polyphonic Expression v1.1 (MPE)
            RP-053/CA-034/M1-100-UM MIDI Polyphonic Expression v1.1
            CA-034 (AMEI/MSC) MPE Configuration RPN
          • [ ] …
          • [ ] 61 (0x3D) Three Dimensional Sound Controller
            RP-049 (MMA) Three Dimensional Sound Controllers
            RP-049 (AMEI/MSC) Three Dimensional Sound Controllers
        • [ ] Non Registered Parameter Numbers (NRPN)
      • [ ] Program Changes, Bank Select & Patches
      • [x] System Exclusive (SysEx)
        • [x] Basic decoding
          • [x] Manufacturer ID
          • [x] Device ID
          • [x] Raw payload
        • [ ] (WIP) Universal System Exclusive (Realtime & Non-Realtime)
          • [x] Sub-IDs 1 & 2 type decoding
          • [ ] Payloads decoding
            • [ ] MIDI Show Control (MSC)
              RP-002/RP-014 (MMA) MIDI Show Control 1.1.1
            • [ ] MIDI Time Code (MTC)
              MMA0001/RP-004/RP-008 (MMA) MIDI Time Code v4.2.1
            • [ ] Notation information
              RP-005/RP-006
            • [ ] File dump
              RP-009
            • [ ] MIDI tuning
              RP-012
            • [ ] MIDI Machine Control (MMC)
              MMA-0016/RP-013 (MMA) MIDI Machine Control 1.0
            • [ ] File Reference System Exclusive Message
              CA-018 (MMA) File Reference System Exclusive Message
              CA-018 (AMEI/MSC) File Reference System Exclusive Message
            • [ ] Sample Dump Size, Rate and Name Extensions
              CA-019 (MMA) Sample Dump Size, Rate and Name Extensions
              CA-019 (AMEI/MSC) Sample Dump Size, Rate and Name Extensions
            • [ ] GM2 Midi Tuning Messages
              CA-020/CA-021/RP-020 (MMA) MIDI Tuning Messages
              CA-020 (AMEI/MSC) MIDI Tuning Bank and Dump Extensions
              CA-021 (AMEI/MSC) Scale/Octave Tuning
              CA-021/Amd1 (AMEI/MSC) Amendment to Scale/Octave Tuning
              RP-020 (AMEI/MSC)
            • [ ] GM2 Controller Destination Setting
              CA-022 (MMA) Controller Destination Setting
              CA-022 (AMEI/MSC) Controller Destination Setting
            • [ ] GM2 Key-Based Instrument Controllers
              CA-023 (MMA) Key-Based Instrument Controllers
              CA-023 (AMEI/MSC) Key-Based Instrument Controllers
            • [ ] GM2 Global Parameter Control
              CA-024 (MMA) Global Parameter Control
              CA-024 (AMEI/MSC) Global Parameter Control
            • [ ] GM2 Master Fine & Coarse Tuning
              CA-025 (MMA) Master Fine/Coarse Tuning
              [CA-025 (AMEI/MSC)] https://amei.or.jp/midistandardcommittee/Recommended_Practice/e/ca25.pdf) Master Fine/Coarse Tuning
            • [ ] GM2 System Level 2 Message
              CA-027 (AMEI/MSC) General MIDI Level 2 Universal System Exclusive Message
            • [ ] Extension 00-01 to File Reference SysEx Message
              CA-028 (AMEI/MSC) Extension 00-01 to File Reference Sysex Message
            • [ ] GM-Lite Scalable Polyphony MIDI Specification (SP-MIDI)
              [RP-034/RP-035 (MMA)](ç https://www.midi.org/specifications/file-format-specifications/mobile-midi/scalable-polyphony-midi-sp-midi-2) Scalable Polyphony MIDI Specification and Device Profiles v1.0b
              RP-034/RP-035 (AMEI/MSC) Scalable Polyphony MIDI Specification and Device Profiles v1.0a
            • [ ] GM-Lite Maximum Instantaneous Polyphony (MIP)
              CA-029 (AMEI/MSC) Maximum Instantaneous Polyphony (MIP)
            • [ ] Mobile Phone Control Message
              RP-046 (MMA) Mobile Phone Control Message
              CA-030 (MMA) Mobile Phone Control Universal Real Time System Exclusive Message
            • [ ] MIDI Visual Control (MVC)
              CA-032/RP-050 (MMA) MIDI Visual Control Specification v1.0
              CA-032 (AMEI/MSC) MIDI Visual Control Universal Non Realtime System Exclusive Message
              RP-050 (AMEI/MSC) MIDI Visual Control Specification v1.0
            • [ ] MIDI Capability Inquiry (MIDI-CI)
              CA-035 (AMEI/MSC) MIDI Capability Inquiry (MIDI-CI) Specification
              CA-035 Spec (AMEI/MSC) MIDI Capability Inquiry (MIDI-CI) v1.0
  • [x] Generator
    • [x] Decode raw hex string
    • [x] Generate raw output
    • [ ] Buffer/Clipboard any message (raw or decoded) to output
  • [ ] File formats
  • [ ] Splitter
  • [ ] Merger
  • [ ] Translator/Filter
  • [ ] Protocol analyzers/decoders
    • [ ] HUI
    • [ ] LCU
    • [ ] MCU
    • Others?
  • [ ] Trigger/Response (Protocol emulator)
    • [ ] HUI
    • [ ] LCU
    • [ ] MCU
    • Others?
  • [ ] Performance analyzer
    • [ ] Round trip latency
    • [ ] Jitter
    • [ ] Bandwidth
    • [ ] Correctness
    • [ ] Stresser/Fuzzer
  • [ ] Hardware toolbox

MIDI implementation charts

Prior art

Legal notice

License

GPLv3

Author: ©2021-2023 Raphaël Doursenaud.

This software is released under the terms of the GNU General Public License, version 3.0 or later (GPL-3.0-or-later).

See LICENSE.

Logo and icons released under the Creative Commons Attribution-Share Alike 4.0 International.

Dependencies & License Acknowledgment

  • Python v3.10
    Copyright © 2001-2022 Python Software Foundation.
    Used under the terms of the PSF License Agreement.
  • RtMidi
    Copyright (c) 2003-2021 Gary P. Scavone.
    Used under the terms of the MIT license.
  • via python-rtmidi
    Copyright (c) 2012 - 2021 Christopher Arndt.
    Used under the terms of the MIT license.
  • via mido
    Copyright (c) 2013-infinity Ole Martin Bjørndalen.
    Used under the terms of the MIT license.
  • Dear ImGui
    Copyright (c) 2014-2022 Omar Cornut.
    Used under the terms of the MIT license.
  • via Dear PyGui
    Copyright (c) 2021 Dear PyGui, LLC.
    Used under the terms of the MIT license.

Fonts

  • Roboto
    Copyright (c) 2015 The Roboto Project Authors.
    Used under the terms of the Apache License, Version 2.0.
  • Roboto Mono
    Copyright (c) 2015 The Roboto Mono Project Authors.
    Used under the terms of the Apache License, Version 2.0.

Logo and icons

Composite work based upon:

Trademarks

MIDI is a trademark of the MIDI Manufacturers Association (MMA) in the United States of America.

This is not a registered trademark in the European Union and France where I reside.

Other

Other trademarks are property of their respective owners and used fairly for descriptive and nominative purposes only.