Skip to content

Ankalot/XenRoll

Repository files navigation

XenRoll

Screenshot of XenRoll

  • XenRoll is a xenharmonic (microtonal) piano roll audio plugin.
  • You can choose the pitch of notes with an accuracy of one cent, and there are 1200 cents in an octave (so it's a 1200 EDO piano roll)!
  • You can bend notes independently in a visible way.
  • This plugin features a unique short-term pitch memory model that shows the tonality, stability, and consonance of notes/keys. It includes two dissonance submodels (with visualization): one based on compactness and the other on partials' beating.
  • You can generate notes and/or a pitch curve in real time by singing/humming.
  • You can use the keyboard to play and record keys.
  • You can display a clock diagram that shows notes, intervals, and chords in real time.
  • You can import and export tracks.
  • You can have several independent instances of this plugin in a single project and view ghost notes from other instances.
  • XenRoll uses either MPE or MTS-ESP (as a master) for microtuning.

  Video examples

How to get it?

  So far, only VST3 versions for Windows, Linux, and macOS are available. Go to the Releases tab and download the corresponding archive. Instructions are included inside.

How to use it?

  This plugin is intended for use inside a DAW. Place the synth/sampler after XenRoll in the track's FX chain.
  XenRoll has two tuning modes: MPE (selected by default) and MTS-ESP. The tuning mode is the same for all instances of XenRoll in the project; it can be changed in the UI via the combo box at the bottom right. After changing it, you need to save and reopen the project for the changes to take effect. Many things change depending on the tuning mode, so I strongly advise you to read at least the first two rows (requirements):

Property MPE MTS-ESP
Suitable DAWs Almost any Many popular ones: FL Studio, Reaper, Bitwig Studio, Cubase/Nuendo, Logic Pro, Ableton Live, and others
Synth/sampler requirements and setup
  • The synth/sampler must support MPE.
  • You need to turn on MPE mode in the synth/sampler.
  • Make sure that the MPE pitch bend range in the synth/sampler matches the one in XenRoll (located in the settings; Β±48 semitones by default).
  • If the synth/sampler has a setting that limits polyphony to one of any note number, it must be turned off.
  • The project should not contain any MTS-ESP master plugins other than XenRoll.
  • The synth/sampler must support MTS-ESP as a client in continuous mode.
  • MPE should be disabled in the synth/sampler.
  • Normally, MTS-ESP mode is turned on automatically for synthesizers/samplers, but if it is disabled, turn it on manually.
  • The synth/sampler's input channel must match (or contain) the XenRoll instance's channel number (it is shown in the lower right corner of the UI).
Compatible with DAW native piano roll DAW native piano rolls have nothing to do with XenRoll. They work in 12 EDO. The DAW's native piano roll is unsuitable1 for working with the MIDI channels used by XenRoll instances.
Max number of instances Not limited 16: one instance per MIDI channel
Pitch accuracy Depends on the MPE pitch bend range in XenRoll2. Maximum errors in cents:
  • Β±12 semitones: β‰ˆ0.07Β’
  • Β±24 semitones: β‰ˆ0.15Β’
  • Β±48 semitones (by default): β‰ˆ0.29Β’
  • Β±96 semitones: β‰ˆ0.59Β’
The maximum error is less than 1Γ—10⁻¹⁰ cents because the pitch is set using a frequency in Hz as a double-precision floating-point number.
Max number of pitches Not limited, but no more than 15 simultaneously played pitches (because each note uses its own MIDI channel, not including the first one). This can be greatly relaxed3. 128 different pitches (pitches that match at least one note)
Max bend that a note can have Depends on the MPE pitch bend range in XenRoll2; it is Β±48 semitones by default, so the default maximum bend range for a note is approximately Β±48 (47.5–48.5) semitones. If the MPE pitch bend range is set to Β±96 semitones, the maximum bend range for a note will be approximately Β±96 (95.5–96.5) semitones Β±10 octaves = Β±120 semitones (the full XenRoll pitch range)
Single pitch polyphony4 Supported Not supported (may be added in future versions, but it is unlikely)

List of synths/samplers that definitely work with XenRoll:

Type Name Developer MPE mode, setup MTS-ESP mode, setup
Hybrid Synth Surge XT Surge Synth Team βœ…
Enable MPE.
βœ…
Disable MPE if enabled. Turn off the 'Menu β†’ MIDI settings β†’ Use MIDI channels 2 and 3 to play scenes individually' setting.
Synth (Wavetable) Serum Xfer Records βœ…
Enable MPE and turn off the 'limit polyphony to one of any note number' setting.
βœ…
Disable MPE if enabled.
Hybrid Synth Serum 2 Xfer Records βœ…
Enable MPE if it is disabled.
βœ…βš οΈ (the multi-sampler is problematic: samples are selected not by the nearest frequency, but by the MIDI note number, which is completely independent of frequency)
Disable MPE.
Synth (Physical Modeling) Pianoteq Modartt βœ…
Set the pitch bend range in the settings equal to the MPE pitch bend range in XenRoll settings (by default: Β±48 semitones β†’ (-4800, +4800) range).
❌
Hybrid Sampler Shortcircuit XT Surge Synth Team βœ…βš οΈ(Currently works only (?) with the version of Shortcircuit XT from autumn 2025)
Enable MPE in 'PARTS'. Set the 'semi bend range' in the MPE settings equal to the MPE pitch bend range in XenRoll settings.
βœ…
Set the MIDI channel shown in the bottom right corner of XenRoll in 'PARTS'.
Synth (4-bit Wavetable) Junior Fors βœ… βœ…βš οΈ(bends do not work)
Synth (Spectral Warping Wavetable) Vital Matt Tytel βœ…
Enable MPE
❌
Synth (Analogue) Diva u-he βœ…
Enable MPE
❌

This is just a list of some synths/samplers that I personally tested. In fact, many more synths/samplers may work with XenRoll.

How to build from source?

You will need JUCE, a C++ compiler, CMake, and the C++ Boost library. You may have to make some adjustments to CMakeLists.txt. You can use the provided *.bat/*.sh scripts.
To debug the plugin through VS Code with any DAW, configure the .vscode/launch.json file.

Examples

video1.webm
video2.webm

License

This project is licensed under the GNU General Public License v3.0.

Footnotes

  1. The pitch of a MIDI note depends arbitrarily on its number. In addition, during the playback of bent notes, XenRoll changes the frequency of the MIDI note in real time. ↩

  2. Don't forget to sync this value with the synth/sampler! ↩ ↩2

  3. In MIDI channels economy mode (can be enabled in XenRoll settings), simultaneously playing non-bent notes that have the same {pitch mod 100Β’} will occupy the same MIDI channel. But if the synth/sampler does not support polyphony on each channel individually in MPE mode, there will be errors! ↩

  4. Whether two or more notes with the same pitch (the pitch of a bent note equals its initial pitch) can be played simultaneously. ↩