You can download binaries for Justly here. The Justly executable is in the "bin" subfolder (if not a MacOS bundle).
Justly is built with CMake and requires:
- CMake 3.24+
- Qt6 (Core, Gui, Svg, Test, Widgets)
- FluidSynth
- libxml2
On Ubuntu:
sudo apt-get install cmake fluidsynth libfluidsynth-dev libqt6svg6-dev libxml2-dev qt6-base-devOn MacOS:
brew install fluid-synth qt libxml2On Windows, install dependencies with vcpkg and pass -DCMAKE_TOOLCHAIN_FILE=<path to vcpkg>/scripts/buildsystems/vcpkg.cmake to CMake.
You will also need to download the MuseScore General soundfont and its license into the share folder.
Then configure, build, and install:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release
cmake --install build --config Release --prefix <install location>The Justly executable will be in the "bin" subfolder of <install location> (or a MacOS bundle directly inside it).
You can use Justly to both compose and play music using any pitches you want. Using staff notation, you can only write the pitched notes of the 12-tone scale. Some intervals in any 12-tone scale are close to harmonic, but other intervals are not. Johnston expanded staff notation, but relying on staff notation limited him.
New to Justly? The Example walks through a worked song with screenshots before you dig into the notation rules below.
In Justly, you write ratios as a rational fraction (integer / integer). Justly will omit the numerator if it is 1, and omit the denominator if it is 1. Therefore:
- "" represents the ratio 1
- "/2" represents the ratio 1/2
In Justly, you write intervals as a rational fraction (integer / integer) times a power of 2. An "o" suffix is a short hand for "*2^", similar to how the "e" suffix is shorthand for "*10^".
Justly will omit the numerator if it is 1, the denominator if it is 1, and the octave if it is 0. Therefore:
- "" represents the interval 1
- "/3" represents the interval 1/3
- "o1" represents the interval 2^1
- "/3o1" represents the interval (1/3)*2^1
You will likely only need to know 4 "prime" intervals.
- Octave: 2 = o1
- Perfect fifth: 3/2
- Major third: 5/4
- Harmonic seventh: 7/4
Note that the numerators of these intervals are the first 4 prime numbers.
To go up by an interval, multiply by the interval. So to go up by a fifth, multiply by 3/2.
To go down instead of up, divide by the interval. So to go down by a fifth, divide by 3/2 = multiply by 2/3.
You can create new intervals by multiplying and dividing intervals. For example, a minor third is up a perfect fifth and down a major third: 3/2 * 4/5 = 6/5.
Here are some useful composite intervals:
- Major second: 9/8 = perfect fifth * perfect fifth / octave
- Minor third: 6/5 = perfect fifth / major third
- Perfect fourth: 4/3 = octave / perfect fifth
- Minor sixth: 8/5 = octave / major third
- Major sixth: 5/3 = octave / perfect fifth * major third
- Minor seventh: 9/5 = perfect fifth * perfect fifth / major third
- Major seventh: 15/8 = perfect fifth * major third
I suggest using a rational calculator to multiply and divide intervals.
In Justly, there are two kinds of volume: "gain", which is the speaker volume, and "velocity", the force with which Justly plays a note. You can adjust the gain of the whole song, or the velocity of different notes.
- "Gain" is the linear output gain multiplier (not decibels) applied by the FluidSynth synthesizer, between 0 and 10.
- "Starting key" is the starting key, in Hz. For reference, see the piano key frequencies on Wikipedia.
- "Starting velocity" is the starting velocity, between 0 and 127.
- "Starting tempo" is the starting tempo, in beats per minute (bpm).
You can use any of the instruments included with MuseScore soundfont.
Percussion instruments are nested into "percussion sets". Each percussion set has a name and a set of sounds associated with the MIDI numbers 0-127. Some of these MIDI numbers will have no sounds associated with them, and the sound associated with a particular number will vary. The sounds roughly correspond to the Roland MIDI standard.
Each pitched/unpitched note is played with a pitched/unpitched voice, respectively.
Pitched voices have the following fields:
- "Instrument": The MIDI instrument
- "Velocity ratio": The volume of the instrument
- "Name": the name of the voice
Unpitched voices have the following fields:
- "Percussion set": the percussion set
- "MIDI number": the MIDI number for the percussion instrument in the set
- "Velocity ratio": the velocity ratio of the instrument
- "Name": the name of the voice
A chord is a set of pitched and unpitched notes that begin playing simultaneously.
Chords have the following fields, each corresponding to a column:
- "Pitched notes": the number of pitched notes in the chord.
- "Unpitched notes": the number of unpitched notes in the chord.
- "Interval": Justly multiplies the current key by this ratio.
- "Beats": The number of beats until the next chord starts
- "Velocity ratio": Justly multiplies the current velocity by this ratio.
- "Tempo ratio": Justly multiplies the current tempo by this ratio.
- "Words": text associated with the chord
Both pitched and unpitched notes both have the following fields:
- "Voice": the name of the pitched/unpitched voice.
- "Beats": When Justly starts the chord, Justly will play the note for this number of beats.
- "Velocity ratio": Justly sets the note velocity to the current velocity times this ratio.
- "Words": text associated with the note.
Pitched notes have the following additional fields.
- "Interval": Justly sets the note's pitch to this interval times the current key.
You can edit the gain, starting key, starting velocity, and starting tempo using the controls on the left. There are also buttons for raising or lowering the interval of selected chords (see Interval buttons below).
There are buttons on the left for raising (+) or lowering (-) the pitch ratio of a chord or unpitched note by:
- A major third (5/4)
- A perfect fifth (3/2)
- A harmonic seventh (7/4)
- An octave (2)
Each row of the table represents a unit: a chord, pitched note, or unpitched note.
You can select a single cell by clicking on it. Hold shift to select multiple cells. When you select a chord or pitched note cell, Justly will show corresponding frequency and approximate piano key in the status bar at the bottom.
- To edit the unpitched voices, select "Unpitched voices" from the "View" menu.
- To edit the pitched voices, select "Pitched voices" from the "View" menu.
- To edit the pitched notes of a chord, double click its "Pitched notes" cell.
- To edit the unpitched notes of a chord, double click its "Unpitched notes" cell.
- To go back to the chords, select "Back to chords" from the "View" menu (see View Menu below).
Select "Piano roll" from the "View" menu to show or hide the piano roll, a graphical view of the song docked at the bottom of the window.
The piano roll plots pitched notes by pitch (vertical axis) against time (horizontal axis); unpitched notes are shown in lanes below the pitch axis. A legend on the right identifies each voice by color.
While playing, a red playhead line marks the current playback position and scrolls to follow it. Click or drag anywhere in the piano roll to move the playhead to that time, which also selects the corresponding chord in the table. Double click a note to select it in the table.
Select "Zoom in" or "Zoom out" from the "View" menu, or hold Ctrl and scroll the mouse wheel over the piano roll, to zoom the time axis in or out under the cursor. Only the time axis zooms; the pitch axis does not.
In the "File" menu, you can choose among the following options:
- "Open" to open a previously saved song.
- "Import MusicXML" to import an uncompressed MusicXML file (see Import below).
- "Save" to save the song in the previous location.
- "Save As" to save the song in a new location.
- "Export recording" to export a recording of the song as a wav file.
In the "Edit" menu, you can choose among the following options:
- "Undo" to undo any action.
- "Redo" to redo any action.
- "Cut" to cut a selected group of cells.
- "Copy" to copy a selected group of cells.
- "Paste" to choose among the following:
- "Over" to paste over the selected cells.
- "Into start" to paste rows into the start of the table.
- "After" to paste rows after the selected cells.
- "Insert" to choose among the following:
- "After" to insert a row after the selected cells.
- "Into start" to insert a row into the start of the table.
- "Delete cells" to delete cell contents.
- "Remove rows" to remove selected rows.
In the "View" menu, you can choose among the following options:
- "Back to chords" to view the chords.
- "Pitched voices" to view pitched voices.
- "Unpitched voices" to view unpitched voices.
- "Previous chord" to view the pitched or unpitched notes of the previous chord.
- "Next chord" to view the pitched or unpitched notes of the next chord.
- "Piano roll" to show or hide the piano roll (see Piano roll above).
- "Zoom in" to zoom in the piano roll's time axis.
- "Zoom out" to zoom out the piano roll's time axis.
In the play menu, you can choose among the following options:
- "Play selection" to play a selection of chords or notes. If you play a selection of chords, you will skip any previous chords, and only play the selected chords. If you play a selection of notes within a chord, you will skip any previous chords, and only play the selected notes within the current chord.
- "Play to end" like "Play selection", but instead of stopping after the selection, Justly continues playing through to the end of the song.
- "Stop Playing" to stop playing.
| Action | Shortcut | Menu |
|---|---|---|
| Open | Ctrl+O | File |
| Save | Ctrl+S | File |
| Save As | Ctrl+Shift+S | File |
| Undo | Ctrl+Z | Edit |
| Redo | Ctrl+Shift+Z | Edit |
| Cut | Ctrl+X | Edit |
| Copy | Ctrl+C | Edit |
| Paste "Over" | Ctrl+V | Edit |
| Paste "After" | Ctrl+Shift+V | Edit |
| Insert "After" | Shift+Enter | Edit |
| Insert "Into start" | Ctrl+T | Edit |
| Delete cells | Delete | Edit |
| Remove rows | Ctrl+Backspace | Edit |
| Back to chords | Alt+Left | View |
| Previous chord | Ctrl+Shift+Tab | View |
| Next chord | Ctrl+Tab | View |
| Zoom in | Ctrl++ | View |
| Zoom out | Ctrl+- | View |
| Play selection | Space | Play |
| Play to end | Shift+Space | Play |
| Stop playing | Escape | Play |
"Import MusicXML", "Export recording", Paste "Into start", "Pitched voices", "Unpitched voices", and "Piano roll" have no keyboard shortcut; use the menus above instead.
On macOS, Ctrl in the table above is usually Cmd; a few navigation shortcuts (Back to chords, Previous chord, Next chord) use different key combinations on macOS, shown in the menu itself.
Justly can import sheet music written in MusicXML. To do so, Justly uses a few heuristics.
Justly uses the current key signature to find the tonic. Justly then uses the following scale relative to the tonic:
- Minor second: 16/5
- Major second: 9/8
- Minor third: 6/5
- Major third: 5/4
- Perfect fourth: 4/3
- Augmented fourth/diminished fifth: 45/32
- Perfect fifth: 3/2
- Minor sixth: 8/5
- Major sixth: 5/3
- Minor seventh: 9/5
- Major seventh: 15/8
- Perfect octave: 2
For example, in the key of A, the frequency of any E (a perfect fifth away from the tonic) will be 3/2 of the frequency of the tonic below it.
When the key signature changes, Justly modulates by the interval of the new key in the old key signature. So, if you modulate from the key of A to the key of E, Justly will modulate by an interval of 3/2 (plus or minus an octave).
Here are some tips for importing music written in standard notation:
- Change key signatures every time the underlying chord in the music changes.
- You might need to manually adjust seventh intervals. In the context of a seventh chord, you might want to change the seventh of the chord to be a harmonic seventh above the tonic. Likewise, in the context of a half-diminished seventh chord, you might want to change the root note of the chord to be a harmonic seventh below the top note of the chord. Be careful, however, because harmonic seventh intervals are noticeably different from minor seventh intervals.
This example is the simple.xml file in the examples folder.
Here is screenshot of the chords in the song:
The song starts with a key of frequency 220Hz, that is, A3.
The key does not change in the first chord.
After 1 beat, the key changes: Justly divides the key by 3/2, so the key goes down by a fifth. Now, the key is close to D4.
After 1 more beat, Justly multiplies the key by 3/2, so the key goes up by a fifth. Now, the key is back to A3.
Here is a screenshot of the pitched notes in the first chord:
The pitched notes in the first chord are the tonic (≈A3), third (≈C#4), and fifth (≈E4).
Here is a screenshot of the pitched notes in the second chord:
The pitched notes in the second chord are the fifth (≈A3), up 1 octave (≈D4), and up 1 octave and a third (≈F#4).
Here is a screenshot of the pitched notes in the third chord:
The pitched notes in the third chord are the tonic (≈A3), third (≈C#4), and fifth (≈E4).
Justly is licensed under the MIT License.



