GSoC 2016 - Work Product - Semi-Realtime MIDI

Posted 7 years ago

This page lists all of the changes to MuseScore's code that were completed as part of the Semi-Realtime MIDI project to improve note entry in MuseScore. The project was part of Google Summer of Code 2016.

More information about the project is available at the following locations:

Code changes

Merged code changes

These commits have be merged into MuseScore's main code repository and are available in the Nightly Builds:

  • Pull Request #2719 ToolButtonMenu for switching between Note Entry Modes
    • 2016-07-04 b134418 add ToolButtonMenu class
    • 2016-07-04 81c6af1 update mstyle for ToolButtonMenu
    • 2016-07-04 4c2a7716 add icons for new Note Entry Modes
    • 2016-07-05 a6bba9d Shortcuts and QActions for new Note Entry Modes
    • 2016-07-05 053307d add ToolButtonMenu for new Note Entry Modes
  • Pull Request #2734 Initial implementations of new Note Entry Modes
    • 2016-08-08 a24f61d fix Repitch mode after 1a8cdf1
    • 2016-08-08 de9c2b5 ScoreStates for new note entry modes
    • 2016-08-08 2d11c86 NoteEntryMethod enum class for InputState
    • 2016-08-08 2011942 Rhythm input mode
    • 2016-08-08 8371a25 Real-time (manual) note entry mode
    • 2016-08-08 11cbddb MidiRemote for Real-time Advance
    • 2016-08-08 f4c4f84 Option to trigger "Real-time Advance" when MidiRemote key is released
    • 2016-08-08 205d669 Real-time (automatic) note entry mode
    • 2016-08-08 9492dea Metronome BeatTypes from timeSig and play click on Real-time advance
    • 2016-08-08 0a9f93b New tests for metronome and update existing ones
  • Pull Request #2776 Option to enable PortMidi on Linux
    • 2016-08-08 8c74814 Option to enable PortMidi on Linux
  • Pull Request #2784 Semi realtime midi - simplify rhythms
    • 2016-08-19 921a090 Menu option to combine tied chords. Combine on Real-Time Advance
    • 2016-08-19 5ef641a Rhythmic groupings for rests and tied notes
    • 2016-08-19 65b5be2 Rhythmic grouping tests
    • 2016-08-19 bfd6cd5 Rhythmic groupings for subbeats
    • 2016-08-19 ba49079 Tests for subbeat rhythmic groupings

Un-merged code changes

There is one active pull request that has not yet been merged into MuseScore's main repository:

  • Pull Request #2794 Semi-Realtime MIDI - separation of voices

The pull request adds the ability to enter multiple voices simultaneously in Real-time mode. The voice separation is fully implemented and works very well in most situations, but it can't be merged for the time being because it has exposed a bug in MuseScore's existing functions for handling voices which can sometimes lead to a crash.


The project met all of the goals outlined in the proposal and even went on to implement additional features that were not in the proposal but which are related to note entry. These include the rhythmical grouping of notes and rests according to the time signature, and the new Rhythm Input mode. In terms of the original proposal, the new Automatic Real-time and Manual Real-time modes offer a form of input that is much faster than the old methods, without compromising the accuracy of notation. These modes enable the user to enter notes by performing the piece on a MIDI keyboard. In the automatic variation the user plays along to a metronome beat, while in the manual variation the user provides the beat by tapping a key or pedal. The manual version of Semi-Realtime is particularly effective because it allows the user to play at their own tempo.

Future work

The project implemented a method of entry that I decided to call "Semi-Realtime" because it is similar to the real-time input modes offered by other notation programs, but it is not quite the same as those methods. Semi-Realtime method does away with a time-consuming analysis step in favour of a simpler algorithm which adds notes to the score straightaway, giving the user instant feedback about whether they pressed the right button. The simplicity of the Semi-Realtime approach is a great advantage for the majority of cases, but there some forms of non-rhythmic notation, such as tuplets, that cannot be entered using this method and would require a fully real-time implementation. The changes to MuseScore's code made for the Semi-Realtime project have laid much of the groundwork for this already, the remaining steps being to store the actual input times and convert them to ticks using a quantisation algorithm. After quantisation the ticks can just be passed to the Semi-Realtime algorithm to be displayed in the score. Additional features could be added later, such as the ability to change quantisation level after input is complete. If a Real-time mode ever does get implemented, I envision "Semi-Realtime" as becoming a kind-of "preview" to fully Real-time input, with the user having the ability to switch between the output of both algorithms and choose which form of notation to keep.

Previous Section Next
GSoC 2016 - Week 13 - Voices and Rhythms shoogle's blog GSoC 2016 - Project Demo Videos - Semi-Realtime MIDI


Testing these new entry modes in the Nightly Builds and I'm loving them. I just have one issue in manual... musescore isn't detecting my pedal (which is probably a problem on my end of things) but I can't find the settings to change the key that is used to move from one beat to the next (which, I believe, normally would be the pedal). Under note entry in settings I could only find input settings for semi-realtime. Could somebody help me out if there is something I'm not seeing? Thanx!

In reply to by speedmeteor101

The control that moves to the next beat is called "Real-time Advance". By default, this is set to "Enter" on the computer keyboard (part of the numeric keypad, or Fn+Return on Mac's that don't have a numeric keypad). However, I highly recommend you change it to be the MIDI pedal or something else on the MIDI keyboard. You can do this via the MIDI Remote in Preferences > Note Input. The other settings that affect the new input modes are also available from this tab of the Preferences dialog.

Attachment Size
Real-time_Preferences.png 102.33 KB