Introduction

Welcome to the documentation for the Helio project, a free lightweight music sequencer that runs on all major desktop and mobile operating systems.

Helio was designed to save me time struggling with the MIDI editor, so I could focus more on musical ideas. In this documentation, I’ll also try to save time by keeping it as short and simple as possible.

If you notice that something important is missing, which I’m pretty sure it is, send me an angry email, or file a PR on Github.

Some generated content will be missing if you read this page in the project’s repository, see the full rendered version at docs.helio.fm.

How to read this

If you’re starting out with Helio, just keep reading the Getting Started page to learn the basic concepts of UI navigation, setting up instruments, creating a project, editing and arranging it, and saving your work in the version control.

Otherwise, you might find the editing tips useful: the majority of the nifty tools and hacks are described there.

If you’ve already tinkered with Helio for a while, you’ll probably only need the hotkeys section.

Installation

Helio is released as a single portable executable file, where possible, but installers are also available for some systems. In both flavors it has a small disk footprint (less than 10 Mb) and should run on most available hardware and platform versions.

Portable vs installer

Installers are provided for Windows and Debian-based Linux distributions. The installer version is only required if you want the desktop shortcut and the uninstall tool.

To use the portable version, simply download the compressed archive and unzip it to a folder of your choice.

32 or 64 bits

The only practical difference between the two is that the 64-bit version can only host 64-bit plugins, and the 32-bit version can only host 32-bit plugins.

Helio does not currently support plugin sandboxing or hosting both 32-bit and 64-bit plugins.

Stable build or development build

The stable builds are supposed to be more reliable, but they are updated less frequently. You can keep up to date on the latest changes in stable builds through the release notes. Install the development build if you want to test new features or verify bug fixes.

The documentation is not versioned at the moment, and some of the features described at docs.helio.fm may be present only in the development build.

Used directories

Helio keeps all files in two directories: one for project files, and another for configuration files.

The configuration directory

All configuration files are created on the first start under the user application data directory. The directory location is platform-dependent:

  • Windows: %APPDATA%\Helio
  • macOS: ~/Library/Application Support/Helio
  • Linux: ~/.config/Helio

settings.helio

This file basically contains all the settings, so deleting or renaming it will cause the app to run as if it were the first time. The settings are intended to be human-readable and are stored in XML format.

translations.helio and maybe others

If the update checks are enabled, some additional resources are updated in the runtime. At the moment of writing, only translations are being updated in this manner.

The projects directory

The project files are saved to the user’s default documents folder in the Helio subfolder. This directory’s location is also platform-dependent:

  • Windows: %HOMEPATH%\Helio (for example, “c:\Users\Peter\Documents\Helio")
  • macOS: ~/Documents/Helio
  • Linux: ~/Documents/Helio

Building from source

Building the app from source will require a C++14 compiler, e.g. GCC 5.0 or Clang 3.4 on Linux, Visual Studio 2015 on Windows, or Xcode 9.2 on macOS.

Minimum deployment targets are:

  • Windows: Windows Vista
  • macOS: macOS 10.7
  • Linux: mainstream distributions

Basic build instructions

  • Clone with submodules: git clone --recursive https://github.com/helio-fm/helio-sequencer.git.
  • Install dependencies:
    • On Windows, get ASIO SDK (which can’t be redistributed in this project due to licensing restrictions, but you may use ThirdParty/ASIO/get_asio_sdk.ps1 powershell script to download and extract the SDK source).
    • On Linux, you’ll need to have the following packages installed: libfreetype6-dev libx11-dev libxinerama-dev libxrandr-dev libxcursor-dev libxcomposite-dev mesa-common-dev freeglut3-dev libcurl4-openssl-dev libasound2-dev libjack-dev libc++-dev; the makefile assumes you’ve set up either export CONFIG=Debug, export CONFIG=Release32 or export CONFIG=Release64 before you make.
  • Pick the right project for your OS from the Projects directory and build.

Troubleshooting

  • Be sure to clone the repository with recursive mode enabled so that the ThirdParty folder is pre-populated with the neccecary files. Alternatively, add them yourself by going to their respecive repositories.
  • If you experience build errors, make sure you have ALL required dependencies installed in your system.
  • If you experience the error: [‘exchange’ is not a member of ‘std’], add [#include ] to JUCE/modules/juce_core/system/juce_StandardHeader.h in the appropriate place. This is an issue pending resolution with the JUCE library, and is probably not a problem with your compiler.

Release notes

Helio features and updates

All notable changes to this project will be documented in this file. For more detailed info, please see the git log.

Version 3.12

  • This is mostly a mobile fixes release: reworked layouts for phone screens, fixed SoundFont player bugs, fixed import/export crashes, added adaptive and themed icons on Android, reworked multi-touch (better late than never)
  • Added automations editor panel supporting hand-drawing custom curves with the pen tool
  • Volume editor panel now also supports hand-drawing custom ramps and is more consistent with edit modes
  • Both the piano roll and the pattern roll can display the volume editor and the automations editor
  • Added support for MIDI channels (better late than never)
  • Piano roll: the lasso component cannot be zero-width or zero-height, dragged notes snap to the original note’s beat, the default note length and volume are persisted
  • Version control: switching to another version now works like a hard reset
  • Added commands to shift tempo tracks 1 BPM up/down (hotkeys Shift + and Shift -)
  • Fixed re-adjusting MIDI input from 12-tone keyboards for microtonality
  • The number of saved undo actions is now configurable
  • Minor feature cutting: removed the updates info control, the legacy undocumented scale preview panel and the alternative spectrogram view

Version 3.11

  • Added built-in SoundFont player instrument
  • Migrated to JUCE 7 and enabled experimental support for hosting LV2 plugins
  • Microtonality: added built-in 26-edo temperament, fixed Alt + Up/Down transposition hotkeys for microtonal layouts, fixed Pianoteq keyboard mapping presets to match A440 on default settings
  • Piano roll: added staccato and legato commands (Alt + S and Alt + L hotkeys), clicking a single note makes that note’s velocity and length the default, holding Alt disables snapping to barlines
  • Pattern roll: improved solo mode indication (implicitly muted tracks are dimmed)
  • Tempo dialog: adjusting the tempo with mouse wheel
  • Render dialog: preview the waveform while rendering
  • Fixed regressions in computing time codes and in the audio rendering code

Version 3.10

  • Added built-in metronome, toggled by Control + M hotkey, each time signature now has its own editable metronome scheme
  • Added an option to select the MIDI output device
  • Added an option to scale the UI x1.5 or x2
  • Made the update checks optional
  • Updated the app icon
  • Fixed renaming or recoloring multiple tracks in the pattern roll
  • Minor fixes: double click on a tempo track opens “set one tempo” dialog, fixed some grid arrangement glitches and inaccurate time signature alignment, fixed zooming out in large projects, fixed inactive notes blocking double-clicks on the roll

Version 3.9

  • Added per-track time signatures: hotkey Alt + F2 to add a time signature anchored to track’s position
  • Made retrograde hotkey work in the pattern roll, re-ordering all selected clips backwards for each row
  • Implemented auto-fitting the roll view range by zooming it out until it “clicks”
  • Added support for nonoctave tunings (only affect the built-in instrument at the moment)
  • Minor tweaks: more conventional right click menu behavior on multiple selection, improved aligning the dragged clips in the pattern roll, long-overdue UI fixes for smaller phone screens

Version 3.8

  • Added in-scale transposition commands, hotkeys Alt + Up and Alt + Down
  • Implemented recording MIDI from a 12-tone keyboard in any temperament
  • Improved the pen tool: delete notes and clips with right mouse button
  • Improved the knife tool: merge two clips into one or join notes with right mouse button (long tap on mobile platforms)
  • Added “save preset” button in the key signature editor
  • Mini-map improvements: draw a zoom region with left mouse button and pan the stretched mini-map with right mouse button
  • Minor tweaks: allowed “natural” scrolling in the rolls on macOS, improved file choosers for mobile platforms, updated 19-edo settings, re-ordered the edit modes a bit

Version 3.7

  • Made the playback loop markers draggable
  • Added 19-edo to built-in temperaments
  • Added keyboard mapping presets menu (with some built-in multi-channel mappings for Pianoteq), allowing to save your own presets
  • Lasso improvements: added a cool selection range dashed indicator in the roll headers and fixed selection behavior when deselecting items with Alt
  • Mouse wheel control improvements: added support for mice with dual-axis wheels and added a separate “vertical zooming by default” UI option
  • Fixed missing note-offs when editing, which broke some VST3 plugins
  • Facelifted the default color schemes
  • Minor convenience tweaks: global zooming with Alt modifier key, toggling mini-map mode with a click at scroller’s free area, transposing by perfect fifth or equivalent with Control + Shift + Up/Down hotkeys

Version 3.6

  • Fixed VST3 plugins showing black screen and made minor improvements in instrument management
  • Fixed loading the invalid audio settings (which caused issues when using JACK)
  • Fixed the audio setting page not always updating correctly
  • Many minor UI tweaks: made “move notes” menus more convenient so that closer clips are shown first, fixed tooltips in the chord tool, fixed updating with the editable scope in velocity map, fixed the pen tool behavior on mobile platforms

Version 3.5

  • Disabled all network-related features on mobile platforms
  • Added two UI flags for better control over mouse wheel behavior, notably for using mouse wheel for panning instead of zooming by default
  • Added UI option to disable most of the editor animations
  • Added UI flag to change the bottom mini-map appearance (toggled by B hotkey)
  • Added tooltips to sidebar buttons
  • UI improvements: fixed the pattern roll not updating with time signature changes, prettied up the cut point marks for the knife tool and note resizers on mobile platforms
  • Implemented duplicating automation tracks in the pattern roll
  • Fixed the project length being calculated incorrectly for rendering
  • Fixed font scanning so the app shouldn’t freeze on the very first run

Version 3.4

  • Added horizontal scrolling using shift + mouse wheel
  • When exporting MIDI, the track segments are grouped in the same way as you see them grouped in the pattern roll
  • All instances of selected clips in the pattern roll are now highlighted with the dashed header
  • Added ‘+’ button on the tools sidebar, which shows the new track dialog, or the menu to choose the instrument first; using the quill tool on any empty row will invoke the same menu or dialog
  • Fixed minor UI glitches on MIDI import and checkout, fixed the track range indicator not always updated properly, tweaked hotkeys a bit
  • Added a menu to move selected notes to another track, also available in the command palette with ‘:’ shortcut
  • Better support for file choosers on mobile platforms to allow exporting MIDI file to a custom location, e.g. iCloud container

Version 3.3

  • Added initial support for custom temperaments, the default list includes 22-EDO and 31-EDO; added commands to switch temperament or convert a piece into any other temperament
  • Added keyboard mapping page for instruments, allowing to overcome the limits of MIDI 1.0 for microtonal music, or just to re-map any key for whatever purposes
  • Forgive me father, for I have synthed: removed the built-in piano samples to reduce binary size (my OCD appreciates this immensely), and added a simple sine-like synth which works in any n-tone equal temperament out of the box; it sucks, but hopefully it will be improved in future
  • Added a command to switch to the most visible track/clip in the viewport, hotkey F3
  • Fixed note previewing for some instruments: now it sends note-off events after a delay
  • Minor UI tweaks: made animations a bit shorter and sharper, fixed several focus issues when deleting tracks, the resizable edge in note components now depends on the note width

Version 3.2

  • Added tempo dialog with “tap tempo” control, invoked either by clicking at tempo track nodes, or by hitting “Set one tempo” menu item in project->refactor menu or tempo track context menu
  • Fixed the old and super annoying rows tiling bug in OpenGL mode
  • Context menus in the sequencer are now only available via long right-click: instant rclick menu often gets in the way when misclicking / trying to switch to another track
  • Playback: will compute states of all present CC automations at the playhead position and apply them when playback starts, which helps a lot if you use pedal tracks or similar automations
  • Orchestra pit: if some instrument hasn’t loaded properly (e.g. plugin file missing), then the last valid instrument settings will be preserved in hope that it can be loaded correctly in the next launches; invalid instruments are shown as greyed out in the orchestra pit page, they also can be deleted, or made valid by adding a plugin node
  • Key signature dialog: right-click on any key will play the key
  • Lots of UI updates: tidied up the project info page and the dashboard, updated the colours list and the breadcrumbs control

Version 3.1

  • Added right-click context menus in the sequencer, version control and orchestra pit pages: the menu content is always the same as in the breadcrumbs control tail menu
  • Added a command to bring up the current instrument’s window, hotkey F4
  • Fixed some more UI glitches - most notably, focusing the piano roll scope on a track
  • Minor bugfixes in MIDI recording

Version 3.0

  • Added initial support for MIDI recording, hotkey F12
  • Added initial support for looping the playback over the selected scope, hotkey F11
  • Added quantization commands
  • Made annotations lengths adjustable
  • Added timeout for scanning fonts on the first run to avoid the app hanging on some systems
  • Minor UI updates for a prettier look and less glitching; added the command palette button in the headline and the timeline repeat sign
  • More tech debt has been paid down, this part of the update will hopefully be invisible
  • Added some documentation

Version 2.5

  • This is mostly a bugfix release: addressed some UX inconveniences and fixed a stupid crash
  • Added hotkeys for tweaking lengths of selected notes; also adding a note with a modifier key inserts a new note in a dragging mode
  • Made all hotkey-based beat/length-shift actions depend on the current zoom level
  • Implemented duplicating tracks in an interactive manner
  • Made all dialogs draggable
  • Enabled hardened runtime for macOS builds

Version 2.4

  • Added the command palette aka goto anything, toggled by ~ hotkey: the default mode is used for quick access to commands for the current context, the ‘/’ mode is used for quick access to projects list, ‘@’ mode to go to any timeline event or focus on any clip, and ‘!’ mode to construct chords from the text description (still experimental)
  • Added an option to display note names for a visual cue, toggled by the default hotkey ‘g’ (for ‘guides’)
  • Added an option to disable scales highlighting, toggled by the default hotkey ‘h’ (for ‘highlighting’)
  • Removed some shame from my heart by refactoring ugly bits of serialization code, also removed the legacy serializer which definitely did not spark joy, thus dropped support for v1 file format
  • Made it possible to control volume ramping amount with mouse wheel in the velocity map
  • Fixed some issues with switching between system/custom title bar
  • Fine-tuned the performance and piano roll behaviour
  • Added notarization for macOS builds

Version 2.3

  • Added support for aug/dim chords descriptions
  • Allow switching between custom and native title bar on Windows and Linux
  • Also display breadcrumbs in the title bar if possible to save some screen space
  • Added retrograde and melodic inversion to selection refactoring menu
  • Added shift-drag-to-copy for all timeline events
  • Go to next/previous anchor now jumps over clips in pattern mode
  • Reworked midi import, should fix importing controller tracks, key/time signatures and track names
  • Made plugins search less likely to stuck and cancellable with a click or escape keypress

Version 2.2

  • Long-overdue implementation of inline velocity map/editor (toggled by V button)
  • Arpeggiators can use advanced options, like length multiplier, inversion, randomness level (shift/ctrl/atl + arp button)
  • Refactored instruments managements to fix rare crashes on the orchestra pit page
  • Fixed shift-drag-to-copy for notes, which was broken even before v2 release
  • Fixed automation curves interpolation
  • Some refactorings for lesser memory usage

Version 2.1

  • Clips now can be muted/soloed
  • Patterns can be grouped by name/colour/instrument
  • Notes can be split into triplets/quadruplets/quintuplets/etc
  • Binary size is much smaller and more optimized overall, due to unity build

Version 2.0

  • Spent entire 2018 paying off the tech debt of version 1 (or tech mortgage, if you will), which was pretty much of a POC
  • Changed bundle ids to more consistent ones
  • Rewritten the backend side API’s from scratch
  • LOTS of refactorings, performance/stability fixes, etc - hopefully all future updates will be just incremental improvements

Getting started

UI overview

helio-ui

This is how the sequencer page looks like in Helio, as of version 3. There are other pages besides this, but you’ll spend majority of your time in the sequencer.

The UI is divided into the following sections:

They will be described below, but, before you dive in,

A little backstory and a couple of silly excuses

This project arose from the need for an advanced MIDI editor, something like Sublime Text for music.

I was also sick and tired of visual overstimulation, which most music tools tend to have more and more (just google some pictures for “digital audio workstation”). One of my main goals was to create a tool that feels right: one with an uncluttered and non-distractive user interface.

So, in general, I try to avoid adding UI controls if there is a way to do without them. As it turned out, though, there are a couple of challenges with that approach (for which I don’t see simple solutions, UX design is hard):

  • one challenge is to keep the UI simple, even minimalistic, while also not being disorienting,
  • another challenge is to keep the UI look and behave consistently across all platforms, both desktop and mobile.

If something feels misleading to you, please report it to help identify the main friction points.

Workspace navigation

The breadcrumb control on the top is responsible for navigating the workspace.

The Studio root node contains links to all available pages and open projects:

breadcrumbs-root-menu

Workspace structure

Breadcrumbs show the hierarchy of the current page you’re on.

Under the hood, all pages have a tree-like structure that looks like this:

  • Dashboard for the projects list, a fancy logo, and a couple of buttons
  • Settings for choosing a language, audio drivers, playing with UI flags, etc
  • Orchestra pit for managing plugins and instruments on the stage
    • Instrument 1 page for setting up audio/MIDI routing for all plugins in your instrument
    • Instrument 2 page and so on
  • Project 1 page for the basic project info: title, author, etc
  • Project 2 page

Context menus

Note that all items in the breadcrumb control have their own context menus:

breadcrumbs-menus

Creating a Project

When you first launch Helio, you should see a simple example project open in the editor. Here are a few steps that can help you get started:

  • to rename the project, click Example Project in the breadcrumb control, and you’ll be taken to the project info page, where you can edit some details,
  • after renaming, return to the piano roll page by pressing Alt + Left Arrow or by pressing the back button on the top left.
  • note that you can only edit one track at a time: use right-click to switch to another track (or long tap on mobile),
  • to play with arrangement, switch to the pattern roll by pressing Tab or Page Down, or by clicking the uppermost button in the left sidebar,
  • double-click any clip to return to the piano roll with that clip in focus; at this point you should get an idea of how the sequencer layout works.

To start a new project from scratch, go to the dashboard by pressing the Home key, or clicking the Studio node in the breadcrumbs. There you’ll see a list of recent projects, and a couple of buttons:

  • create an empty project,
  • open an existing project (this also imports MIDI files).

Switching between projects

There are several ways:

  • use the / hotkey to display the projects list in the command palette,
  • or hover the Studio item in the breadcrumb control to display a menu with all open projects,
  • the back and forward buttons are also useful at times; the associated hotkeys are Alt + Cursor Left and Alt + Cursor Right.

Instruments

Instruments management

The most notable difference between Helio’s instrument management and that of the majority of DAWs and sequencers is that Helio separates instruments from projects.

Each project only stores the instrument references, so the instrument settings are saved in the application workspace settings rather than the project files.

Instruments are created and set up in a separate page, called Orchestra Pit.

The reason for implementing it this way was that in my workflow, I tend to use the same instruments for all of my projects. The app was designed primarily as a sketching and prototyping tool, and I usually have lots of sketches, so all the operations involving switching between projects, opening and closing them, or checking out in the version control, were ought to be as fast as possible, and not eat up all the memory.

Helio is probably not the best choice if your setup requires you to always have different instruments or instrument settings for each project, or if you want the project file to contain the instrument details.

On the other hand, if you happen to have an instrument library you’re comfortable with (e.g. VSL or a selected soundfonts collection), and you want to set it up once and forget it, you’ll probably like this approach.

Orchestra pit page

The orchestra pit page has two sections:

  • all found plugins are displayed on the left side,
  • all instruments on stage, created from those plugins, are on the right.

orchestra-pit

First, you want to scan for available plugins, there are two options in the orchestra pit menu:

  • either pick a specific folder to scan (note that all subfolder will be scanned as well),
  • or perform a global plugins scan: it tries to guess the most possible locations, e.g. Steinberg folders in Program Files, and scans them and all their subfolders.

Once you have a list of plugins, create an instrument using the plugin menu, so that it appears on the stage and can be assigned to your tracks.

Instrument details and routing

Double-click on any of the instruments to get to the instrument details page.

instrument-routing

Most of the actions here, including audio and MIDI routing, are available through the menus.

Interacting with nodes:

  • left-click on the node will create a plugin window, it it has one, or just select it, if it doesn’t,
  • right-click on the node will just select it,
  • use mouse drag to connect sockets representing audio and MIDI inputs and outputs.

While it is possible to set up a multi-plugin instrument with audio/MIDI routing in Helio, the convenience of the instrument page was not of a particular concern: the development is rather focused on the sequencer functionality. If you are running it under Linux, it might be a good idea to add Carla as an instrument, and use it to manage VST/whatever plugins and routing.

Editing and arranging

Timeline

On the top of the editor canvas, there’s a timeline control. To interact with it:

  • left click at the timeline to position the playhead,
  • middle-click to start the playback from that position,
  • right click to invoke the timeline events menu:

timeline-events

Timeline events include annotations, key signatures and time signatures, and they don’t affect the playback of your piece in any way, they are rather meant to provide a visual cue.

Manipulating the timeline events:

  • click on any event to focus the playhead at its position,
  • once focused, click again to edit or delete the event (displays a dialog),
  • drag to move, or shift-drag to duplicate the event.

Annotations

Annotations are just text markers with optionally adjustable length:

timeline-annotations

Right-click on the annotation selects all notes of the active track up to the next annotation.

Time signatures

Time signatures simply define the way the vertical grid lines are aligned in the roll:

timeline-time-signatures

Right-click on the time signature selects all notes of the active track up to the next time signature.

If you need to manage complex rhythms, see this page.

Key signatures

Key signatures affect the way the rows are highlighted in the piano roll, but this can be disabled.

timeline-key-signatures

Apart from that, arpeggiators and a couple of other tools rely on key signatures to figure out the current harmonic context.

Reprise

If you have enabled the playback loop over the selected scope, timeline will display the repeat signs:

timeline-reprise

This sidebar is responsible for track navigation and UI control.

Most buttons on the sidebars have keyboard shortcuts, which makes them kinda redundant, but they are displayed anyway for the sake of having a consistent UI on mobiles or touch-screen laptops, where you don’t have hotkeys.

  • sidebar-left-1 — switch the editor view between the piano roll and the pattern roll (Tab),
  • sidebar-left-2 — zoom out (Shift + Z), zoom in (Z), and zoom selection (Control + Tab),
  • sidebar-left-3 — jump over the timeline events (, and .),
  • sidebar-left-4 — toggle the volume/automation editors (V),
  • sidebar-left-5 — UI flags that toggle scales highlighting and the note guides (H and G),
  • sidebar-left-6 — a simple waveform or spectrogram view.

This sidebar is responsible for editing tools and playback control:

  • sidebar-right-1 — toggle the playback loop over the selection (F11),
  • sidebar-right-2 — edit modes (1, 2, 3),
  • sidebar-right-3 — some other tools - the chord tool and arpeggiators, if available,
  • sidebar-right-4 — copy and paste, undo and redo,
  • sidebar-right-5 — playback (Space or Enter) and recording (F12) control.

Piano roll

The piano roll always limits the editable scope to a single track. You will see all other tracks in a semi-transparent ghost mode. Most common interactions with the piano roll canvas are:

  • right-click on the inactive note to focus the editor to another track,
  • right-drag the empty space to pan the canvas:

piano-roll

Interacting with piano roll also depends on the current edit mode:

Edit modes

  • normal mode to manage selection and edit notes,
  • pen mode to add and edit notes,
    • alternatively, use it to delete notes or clips with right mouse button,
  • knife mode: cuts notes in the piano roll, cuts tracks in the pattern roll,
    • alternatively, use it to merge tracks or notes with right mouse button,
  • drag-only mode: an auxiliary mode, hold Space to toggle it temporarily,
  • selection mode is only displayed on mobile platforms.

All notes, when edited, are aligned to the grid. The grid resolution (the density of bar lines) depends on the zoom level and supports up to 1/64 notes. Tip: holding Alt while editing notes disables snapping to the grid.

All edits are undoable, and there is no limit to the number of undo actions available until the app is restarted. Additionally, each project saves the last 16 undo actions (32 on mobile platforms), which remain undoable after restarting the app. This limit can be changed by editing the main configuration file.

All changes are saved automatically: on exit, and on a timeout after the last change.

The editor relies heavily on hotkeys; feel free to explore available actions by browsing breadcrumb control menus or command palette.

Adding new tracks

Add new tracks by duplicating the existing ones (F5), or via project menu, or by cutting tracks with the knife tool in the pattern roll.

Volume and automation editors

The bottom panel (toggled by V hotkey) combines the volume editor and the automation editor:

bottom-editors-panel

(the piano roll allows you to manually switch between volume and automation tracks, while the pattern roll switches the editor type based on the selected clip)

The volume editor, like the piano roll, restricts its editable scope to the active clip. Furthermore, if any notes in the roll are selected, the editable scope is limited to the selection, making it easier to fine-tune and draw more complex ramps for different sections of the track.

The automation editor’s editable scope is limited to the active clip and the selected controller. The active clip is determined by the pattern roll’s selection or by the closest range intersection with the piano roll’s active clip.

Unlike automation clips in the pattern roll, the automation editor allows you to use the pen tool to hand-draw custom curves for curve automations.

Both the volume editor and the automation editor currently only support the default edit mode and the pen tool (no selection or knife tool).

MIDI recording

The record button (hotkey F12) will try to auto-detect the available and enabled MIDI input device, or will provide a selection if there are multiple (the choice is “remembered” and can be changed later in the settings page):

recording-start

If the recording mode is on, but playback has not yet started, it will wait until it receives the first MIDI event and start recording & playback.

In the piano roll mode, it always records to the selected track/clip:

recording-piano-roll

In the pattern roll, it either records to the selected track/clip, or if no piano clip is selected, it adds one once the recording begins.

Pattern roll

You don’t necessarily need that editor. Helio was designed to be a hybrid linear-based/pattern-based sequencer, so you could just stay in the piano roll mode and treat your project as one big canvas.

However, the pattern roll is helpful for rearranging experiments:

patterns

Pattern roll also allows you to tweak some track parameters, like key offset of velocity multiplier. In future, it may shift towards more parametric sequencer features.

See also: track grouping

Global tempo

Pattern roll is also where you can edit various MIDI controller automation tracks, most notably the tempo track(s):

tempo-automation

The tempo track, as any other automation track, interpolates the controller value between nodes, and those tiny points are displayed at the exact times each new MIDI event is sent.

To interact with it:

  • delete nodes with right click,
  • use the pen tool (hotkey 2) to add nodes,
  • use the cursor tool (hotkey 1) to drag nodes or to adjust the interpolation curve,
  • click on the node to invoke the tempo dialog to set the exact BPM value, or to set tempo by tapping:

tempo-dialog

Tip: use the mouse wheel to quickly adjust the tempo in this dialog.

Tip: adding a tempo node while holding any mod key will immediately open the tempo dialog.

Often, you only need one tempo for the whole song - for that, pick “Set one tempo” menu item from the tempo track menu or the project refactoring menu.

Tip: use Shift + and Shift - hotkeys to shift tempo tracks 1 BPM up or down. It affects all selected tempo tracks in the pattern roll, and all tempo tracks in the piano roll.

Mute and solo

Individual clips can be muted via the M hotkey or the context menu in the pattern roll. Except for automation, all clips can be soloed (with the S hotkey or via the context menu) for the convenience of isolating chunks of notes without disabling the tempo/pedal/etc. automation at the same time.

All clips that are explicitly or implicitly muted (muted by others) are displayed as dimmed:

solo-clips

Version control

The concept of version control comes from the software development world. If you’re not familiar with it, you can think of it as of creating “save points” in your project, and tracking changes made since the last time you saved.

The point of having a version control is lowering the friction of committing changes: any changes can be reset if you don’t like them, any saved revision can be restored later. Helio was started as a prototyping tool, a playground for ideas, where you’d want to have several variations of your sketch — hence the idea of having a built-in version control.

Notable use cases are:

  • saving a project state at some point, and resetting to any earlier saved state,
  • resetting some of the recent changes (think of it as of another mechanism of undoing things),
  • hiding and restoring back the most recent changes to get the idea of what have been done since the last commit,
  • synchronizing projects across devices.

The UI of the versions page is split in two parts:

version-control

The left side lists all changes in the project, compared to the current revision. Items in the list can be checked and unchecked: both committing and resetting changes are applied selectively.

The right side shows the tree of all revisions that you have saved. Note a couple of icons under each revision: they indicate whether the revision is available locally, or remotely, or both.

Getting microtonal

Before you get started with microtonal music, you will need two things:

  • Find a plugin (VST/whatever) that supports microtonal temperaments: here’s a list with some examples.
  • Set up keyboard mapping for that instrument: this must be done both in the plugin’s settings and in the host (this app), to overcome the limitations of MIDI 1.0. The piano roll works as a microtonal keyboard with a wide key range from 0 up to 2048, and it needs to map every key across 16 MIDI channels, of 128 keys each; these MIDI messages are sent to the plugin, which needs to know how to interpret them, or how to map them back from multi-channel data.

Setting up instruments

You can skip the instrument setup steps, if you only want to get familiar with microtonal scales. The default instrument in Helio is simple, but it works with all temperaments out of the box with no setup required, and it should give you an idea of how things work.

Otherwise, once you’ve added an instrument to the stage, select “Edit keyboard mapping” from the menu. “Keyboard mapping” in this context refers to how MIDI events are transformed when they are routed from the ‘Midi In’ node to the plugin node(s).

Keyboard mapping page

Note: this describes key mapping on the host side, but you’ll need to set it up on the plugin side as well. Unfortunately, can’t help you with that, as it depends on the plugin; see a couple of examples below.

The page allows you to manually adjust key mappings and preview mapped keys by clicking on them. The upper limit for each source channel is set to 2048 keys, this is the maximum number of keys that can fit into 16 target MIDI channels. 2048 keys would be enough to handle temperaments of size up to 192-EDO:

keyboard-mapping-page

(source channel selection at the top, channel paging at the bottom)

Some additional actions are available via context menu:

  • reset to the default modulo-based mapping,
  • load custom channel mapping(s) in Scala .kbm format,
  • copy/paste the mapping as a string in Helio’s own format into/from the system clipboard,
  • select one of the presets or save your own.

keyboard-mapping-menu

While you can set up virtually any custom mapping by hand, there are a couple of (sometimes) more convenient ways, described below.

Scala keyboard mapping

Note: don’t confuse Scala keyboard mapping (.kbm files) with Scala tuning files. The latter are of little use to the piano roll because it doesn’t care about cents and ratios - those are only needed by instruments.

Helio can load Scala keyboard mapping(s), including multichannel mappings which consist of a set of single mapping files with the same name followed by an underscore and a channel number. When you pick a .kbm file, Helio will search for “same_name_*.kbm” files to try to determine whether or not there are multiple channel mappings, and try to load them all.

Keep in mind that the mapping on the sequencer side will be reversed when compared to the same mapping on the instrument side. The piano roll works as a microtonal keyboard that needs to overcome the limitations of MIDI channels by mapping all keys above 127 across multiple channels.

Helio keyboard mapping format

Although the Scala kbm format is flexible, I find it unintuitive, so let me reinvent the wheel and introduce another keyboard mapping format, supposed to be shorter, cleaner and kind of human-readable. You can use it on the keyboard mapping page by simply copying and pasting the mapping as a string.

Let’s start with an example: the entire multi-channel mapping for Pianoteq 31-EDO could be written like this:

0/1:0/14,31+ 31:0/15,31+ 62:0/16,31+ 93:0/1,31+ 124:0/2,31+ 155:0/3,31+ 186:0/4,31+ 217:0/5,31+ 248:0/6,31+ 279:0/7,31+ 310:0/8,31+

Which reads:

  • starting from key 0 channel 1 of the source channel, map it to the key 0 of channel 14, then map the next 31 keys in a sequential manner: for example, key 1 maps to 1/14, key 2 maps to 2/14, and so on,
  • starting from key 31, map it to the key 0 of channel 15, and, again, map the next 31 keys sequentially, and so on,
  • for each next channel the mapping will pick the key from the previous channel and increase the channel number.

Source channel can be omitted, since you probably only need channel 1. E.g., the 22-EDO Pianoteq mapping would look like this:

0:0/14,22+ 22:0/15,22+ 44:0/16,22+ 66:0/1,22+ 88:0/2,22+ 110:0/3,22+ 132:0/4,22+ 154:0/5,22+ 176:0/6,22+ 198:0/7,22+ 220:0/8,22+

For 34-EDO mapping you might want to start one octave lower since the key range is wider:

0:0/13,34+ 34:0/14,34+ 68:0/15,34+ 102:0/16,34+ 136:0/1,34+ 170:0/2,34+ 204:0/3,34+ 238:0/4,34+ 272:0/5,34+ 306:0/6,34+ 340:0/7,34+

Format description

First, the format assumes the default modulo-based mapping:

  • keys 0..127 are mapped as they are to channel 1,
  • keys 128..255 are mapped as 0..127 in channel 2, and so on.

Everything that differs from the default values is serialized. The serialized mapping is just a string divided by whitespaces into chunks.

Chunks follow this pattern: base:key/channel,key2/channel2,key3/channel3. Which means:

  • for the base key in the sequencer, the specified key/channel will be sent to the instrument,
  • then, for the base + 1 key in the sequencer, the next key and channel will be sent, and so on.

If each next key just incrementally moves by 1, the chunk could be shortened like this: base:key/channel,count+.

// TODO more examples (if you have set up keyboard mappings, which work well for some of your instruments, feel free to share them to improve these docs)

Switching temperaments

The most straightforward way to start playing around with microtonal scales is to convert any of your twelve-tone pieces (or a new project) into other temperament.

change-temperament

The project refactoring menus provide two choices:

  • the "Change temperament" command will simply switch the piano roll highlighting and update key signatures,
  • the "Convert to temperament" command will, in addition, update notes: the conversion is done using chromatic scale approximations (see the temperament model for more information). Helio will use these chromatic maps as the “least common denominators” among temperaments to convert from one to another.

All tool that work with scales will only show scales with octave size matching current temperament. The piano roll doesn’t distinguish between EDOs and non-EDOs; all that matters is the number of keys per octave, highlighting, key names, and so on.

Limitations

The built-in temperaments list includes 12-edo, 19-edo, 22-edo, 26-edo and 31-edo.

The built-in scales list only includes 7-tone scales for each of those temperaments, because there are several pieces of the app which still assume working with diatonic scales, e.g. the chord tool or the arpeggiator tool. With that limitation, using these tools with any built-in temperament or scale would make some sense.

Adding a custom temperament

To add custom temperaments and their scales, follow the guide in the сonfigs page. Use the built-in temperaments and scales configuration files as a reference.

Recording MIDI from 12-tone keyboard

The app makes it possible to play and improvise on a standard 12-tone physical keyboard and record MIDI regardless of what temperament is used. For that, it uses the current temperament’s ‘chromatic mapping’ scale to readjust the incoming MIDI data so that all notes sound like their closest 12-tone approximations.

Here is an example of each chromatic scale key played on a 12-tone MIDI keyboard and recorded in a 19-EDO project:

readjust-midi-input-recording

This feature is enabled by default, but it can be disabled in the audio settings section, just below the MIDI input device box. If you’re using a microtonal physical keyboard, uncheck this box so that the app doesn’t mess up MIDI input:

readjust-midi-input-checkbox

Examples

This section will describe setting up various microtonal plugins in Helio. For now, it’s just a couple of examples, if you managed to make any other plugin work, please share your findings.

Pianoteq

Steps to set up a custom equal temperament:

  • In Pianoteq UI, navigate to the advanced tuning page:
    • there, create a custom microtonal temperament via the "Temperament" -> "Make equal temperament..." dropdown menu,
    • make sure to choose the "Full rebuild" option nearby instead of the "String tension" option,
    • in the "Keyboard mapping" -> "Extended layout for up to 16\*128 notes" dropdown menu, check "Multi-channel MIDI layout",
    • the "Main MIDI Channel" option in the same menu should be set to the default "MIDI channel 1".
  • In Helio UI, navigate to your instrument’s keyboard mapping page:
    • there, either select a keyboard mapping preset for your temperament from the menu, if it’s available: for now there are presets for 19-edo, 22-edo, 26-edo and 31-edo,
    • or, set up your own multi-channel mapping (see examples above on this page).

For more details on all Pianoteq’s tuning parameters refer to the manual.

Surge XT

Surge synth supports multi-channel mapping since recent versions of Surge XT, so a custom equal temperament can be set up similarly:

  • In the main menu, open the tuning settings submenu and check these two options there:
    • "Use MIDI channel for octave shift"
    • "Tuning applied at MIDI input"
  • From the same tuning submenu, load the Scala tuning (Surge installation provides a set of equal temperament tunings),
  • Navigate to your instrument’s keyboard mapping page in Helio UI and choose a keyboard mapping preset; the same Pianoteq multi-channel presets will work for Surge.

Getting polymetric

Sometimes you might want to have several voices playing in different meters simultaneously. For example, a simple trick to make a piece more entertaining would be to write the drums part in 5/4, and all other voices in 4/4.

However, editing and rearranging that kind of rhythms on a standard 4/4 grid can quickly become a mess.

This page describes how to set up time signatures to avoid getting lost in bars and make piano/pattern roll grids more manageable, even for complex polymeters.

How time signatures work

Time signatures affect how the vertical grid lines are arranged across the canvas, which is to make aligning notes/clips more convenient and provide some visual cue.

Each time signature also defines how the metronome/click track will sound in the time signature’s scope.

There are two kinds of time signatures:

  • “Global” time signatures, which can be added to the timeline:

    timeline-time-signatures

  • “Per-track” time signatures, which can be assigned to any track via menu or Alt + F2 hotkey:

    track-time-signatures

Global time signatures can be dragged all over the timeline, and you can add as many of them as you want (e.g. shift-drag to copy them).

Per-track time signatures are anchored to their track’s position (although they can be dragged within the track’s range, which may be useful, if the track starts off-beat), and you can have exactly one per track.

You might want to use either of two kinds, or both, depending on your setup:

  • For simpler pieces, or, if you’re not using the pattern roll at all, you might only need global, timeline-based time signatures, often a single one.
  • If using the pattern roll and have lots of clips, try assigning time signatures to some parts of your piece in addition to global time signature(s) for more flexibility - see below the examples of how the timeline switches between them.
  • Finally, if you’re making complex rhythms, you might want to use per-track time signatures only. Even if you’re not making polymeters, time signatures attached to tracks make it easier to rearrange the piece and experiment.

Timeline behavior

Timeline will display global time signatures by default, and override them with time signatures of selected track(s), when possible.

In the pattern roll, it will try to aggregate time signatures for the entire row, assuming that one row is one “voice” (see also track grouping):

switching-meters-pattern-roll

In the piano roll, timeline will simply switch to time signature(s) of the edited track, if any:

switching-meters-piano-roll

Limitations

Note that making polytempo is not currently possible: the beat length is the same for all tracks. Time signatures make different bar sizes (and different snaps arrangements within a bar), but the global tempo track(s) affect the project as a whole.

Polyrhythm support is also poor; although you can think of polyrhythms as of polymeters on a smaller scale, that’s not very practical. There is basic support for tuplets (hotkeys Alt + 1 to Alt + 9):

tuplets-6-to-9

But you can’t edit tuplet parts individually at the moment, which makes them only useful for drums, probably. Hopefully this will be improved in future.

Metronome

The built-in metronome is toggled by Control + M hotkey.

Each time signature has its own metronome scheme: basically a short sequence of different click sounds, which defines how metronome accents are aligned within one bar:

time-signature-dialog

Note that different time signatures with same meter can still have different metronome schemes.

The internal metronome instrument comes with 4 click sounds representing different click accents. You can customize them and pick your own samples in the instrument’s UI:

  • either select “Show UI” from the metronome instrument’s menu on the Orchestra Pit page,
  • or click on the metronome icon in the time signature dialog (a shortcut to the above).

See also: the default meters config

Tips and tricks

This page lists features, hacks, and nuances that may be handy, non-obvious, or both.

Piano roll

Warnings

During playback, Helio may sometimes draw red or yellow vertical warning lines:

warnings

These are the clipping and over-saturation warning markers:

  • red lines indicate problematic regions with clipping sound,

  • yellow warning lines will appear in the areas where the perceived loudness (a.k.a. the root mean square loudness) is way lower than the peak loudness, which is considered harmful unhealthy: in my setup it typically means that I have some redundant duplicate notes in the same place.

Spacebar panning

One quick way to switch between the current editing mode and the canvas panning mode is holding the Space key:

space-drag

Dragging with the right mouse button does the same thing, but it also switches to another track when clicked on any semi-transparent note.

Time measure tool

Hold the Space key, then click-and-drag over the timeline to measure time between two points on the timeline:

time-measure-tool

Sound probe tool

Finally, holding Space and clicking on the timeline is what I call a “sound probe” and it’s supposed to give you an idea of what notes are playing at the given point:

sound-probe

Range selection

Click-and-drag on the timeline while holding any modifier key (Control/Alt/Shift) to select all notes or clips in a time range:

range-select

Resizing a group

Resize a group of notes proportionally by holding Shift:

group-resizing

Drag-and-copy

Hold Shift to drag-and-copy notes in the piano roll, clips in the pattern roll, key/time signatures, annotations or automation events:

drag-and-copy

Pen tool

Also hold Shift or any modifier key to change the behavior of the pen tool when adding notes. By default, the newly added note is edited in transpose-and-resize mode. Alternatively, there is the drag mode, which is more familiar:

pen-tool-alt

Fine-tuning dynamics

Use the pen tool to hand-draw custom ramps in the volume editor panel. Control how the ramp curve blends with the original velocities by using the mouse wheel:

velocity-panel-hand-drawing

In the default edit mode, fine-tune volume of the selected notes: dragging them vertically with no modifier keys will shift the velocities linearly, dragging while holding Alt will scale them.

Holding Shift while dragging will shape-shift group’s velocities into a sine (when dragging up) or flatten them, reducing dynamic range (when dragging down):

velocity-panel-fine-tuning

(the indicator displays the group’s lowest and highest MIDI volume)

You can also adjust notes volume linearly just by middle-button dragging the note components in the piano roll directly.

UI flags

A couple of display options are available to provide a visual cue. They can be toggled using the navigation panel or hotkeys (G and H by default).

The first is used for displaying the note name guides:

note-names

Another highlights the in-scale keys of the key signatures that have been added to the timeline. If you prefer C Major coloring in the piano roll, just turn it off:

scales-highlighting

The mini-map mode can be toggled with B hotkey, or by clicking at any area except the screen range rectangle.

When in compact mode, the mini-map is stretched to fit all project:

toggle-minimap

When in full mode, the mini-map allows you to draw a region to zoom in on:

zoom-to-region

Chord tool

By double-clicking on a row in the piano roll you invoke the chord tool:

chord-tool

It picks the current key signature from the timeline to determine which scale and root key to use to generate chords. Hence the main limitation of this tool: it can only generate chords that are easy to define with in-scale keys.

It can be dragged around by the center node, which is helpful if you clicked the wrong row or position.

Since it depends on the harmonic context, it will do nothing when placed on an out-of-scale note (darker rows). To avoid confusion, make sure the scales highlighting option is enabled.

See also: piano roll hotkeys, refactoring options

Pattern roll

Knife tool

In my workflow, I’m often adding new tracks with a knife tool: even though there’s a normal way to add an empty track via project menu, or duplicate a track, I often end up having added some sketches in different places of a single sequence, and then seeing that they represent different parts, and can be cut into different tracks after switching to the pattern mode:

patterns-knife-tool

Merging tracks

Knife tool has an alternative mode: use right-click and drag (or long-tap and drag on mobile platforms) to merge one clip with another:

patterns-merge-tool

Clips and track grouping

In the example above, two split tracks remain on the same row because the tracks are grouped by name, and the knife tool keeps the track name the same. Pattern roll can also group tracks by color, instrument, or track id — yet grouping by name works better for me.

So, the segments on one row could be either different tracks or multiple instances (or “clips”) of the same track. Instances always share the same notes, and have the same name and color, but they can be slightly modified: have different position, key shift or volume multiplier, which is mainly meant for prototyping:

patterns-clips

When you select an item in the pattern roll, all of its instances are highlighted with a dashed header: this helps distinguish between “instances” and other tracks with the same name or color on the same row. The F6 hotkey is a quick way to convert an instance to a unique track.

Track grouping also affects MIDI export: all segments on a single row are exported as a single track in the resulting MIDI file.

See also: pattern roll hotkeys

Refactoring

This page describes various refactoring options, available via selection menus and hotkeys:

refactoring-menu

Transposition and inversion

Not listed in the menu, but also handy: the Shift + Up and Shift + Down hotkeys transpose the selected notes one octave up or down.

Also, Alt + Shift + Up and Alt + Shift + Down are used for transposition by a “fifth” - simply put, a transposition by +7 or -7 semitones in the 12-tone temperament, or by the closest equivalent of a perfect fifth in other temperaments, e.g. +18/-18 for 31-edo, etc.

The latter is useful for introducing short-term chord modulations to a “neighboring key” (one step in either direction on the circle of fifths).

Note that the above hotkeys also work for pattern roll selection: creating track “instances” and modulating them is one of the easiest ways to prototype the piece’s structure.

Chord inversion

Use the Control + Up and Control + Down hotkeys for chord inversion (don’t confuse it with melodic inversion).

Chord inversion treats selected notes as chord(s); the lowest note in each chord moves one octave up (or the highest note moves one octave down), while all others remain unchanged.

In-scale transposition

Use the Alt + Up and Alt + Down hotkeys to transpose the selected notes using in-scale keys only:

inscale-transposition

The notes which are out of scale will be aligned up or down to the nearest in-scale keys.

More generally, you can think of it as “transposition using highlighted rows only”. For example, when the scales highlighting flag is turned off, it can be useful in microtonal temperaments to transpose notes using only those keys which approximate the 12-tone scale.

Melodic inversion

The Alt + I hotkey applies melodic inversion to selected notes. This contrapuntal derivation is better described on Wikipedia; in short, it “flips” the melodic line upside down.

Retrograde

The Alt + R hotkey applies another contrapuntal derivation, retrograde or “walking backward”.

Retrograde inversion, which is “backwards and upside down”, can be done by combining inversion and retrograde.

Tip: use the retrograde hotkey to quickly swap two neighbor chords:

retrograde-swap-chords

Or to swap two notes like this:

retrograde-swap-notes

The retrograde hotkey also works in the pattern roll, re-ordering all selected clips backwards for each row:

reverse-clips-order

Cleanup overlaps

The Alt + O hotkey removes duplicate notes and corrects lengths in a way that notes do not overlap.

Staccato and legato

The Alt + S and Alt + L hotkeys apply staccato and legato commands to the selection, respectively. Staccato simply shortens all selected notes (Alt + Shift + S shortens them to their shortest length). Legato connects selected notes together in a way that each note lasts until the next note begins:

staccato-legato

Move to track

Pretty self-explanatory shorthand; this function is also available in the command palette: press : and select another track to move the selected notes to. The “closest” tracks will be listed first for convenience.

Rescaling

This re-aligns the selected notes into one of the parallel modes of the same tonic.

You can think of it as introducing the in-place modal interchange.

As well as the chord tool, re-scaling assumes that the harmonic context is specified correctly. In the example below, the first section is marked as D Dorian, and all of the notes in that section are in the key. Any out-of-scale notes will be left in their original positions.

Note that this function doesn’t change the key signature. Consider using it for introducing brief or transitory variations to bring more harmonic color.

If you want to re-scale an entire section of your piece, use the next option:

Quick rescale tool

Right-click on any key signature at the timeline (long-tap on mobile platforms) to choose another scale into which all tracks will be translated. This affects all notes in all tracks until the next key signature or the end of the project and updates the key signature.

This example shows rescaling, along with some undo/redo to demonstrate the difference:

quick-rescale

Arpeggiators

Arpeggiators submenu is available in the notes selection menu. If you have created any arpeggiators, you will also find a button on the right sidebar to apply one of them to a selection.

How arpeggiators work

The idea behind arpeggiators is to remember any custom sequence of notes in their in-scale keys, so that the sequence is no longer dependent on the scale, and later apply that scale-agnostic sequence to some chords in any different harmonic context.

Arpeggiators also rely on time signatures to remember bar starts. When you apply the arpeggiator, it will try to align to your time context by skipping some of its keys to the nearest bar start if necessary when it hits a bar start on the timeline.

Creating an arpeggiator

Because the creation and use of arpeggiators is tied to harmonic context, arpeggiators rely on valid key signatures at the timeline.

  • First, create any sequence in the current key and scale (enable scales highlighting to avoid confusion). Any out-of-scale keys will be ignored.
  • To create a named arpeggiator from that sequence, select it and press the Shift + A hotkey or select a submenu item.
  • After that, in any other place, apply that arpeggiator to any selection, presumably some chords.

Arpeggiators is one of the unfinished parts of this app: there’s still no convenient way to edit or delete an arpeggiator, other than manually editing your arpeggiators.json in the documents directory. Hopefully this will be improved in future; as a workaround for editing arpeggiators, I’m keeping a separate track just for arpeggiator sequences.

Command palette

The command palette control is inspired by ‘Goto Anywhere’ in Sublime Text or ‘Locator’ in QT Creator, and is meant for quick access to the commands available for the current context, and things like projects and timeline events.

Toggled by ~ or Control + P hotkeys by default:

command-palette

Besides just commands, it supports special modes, triggered by typing a certain symbol. This symbol also acts as a hotkey to show the command palette in that mode:

  • / is for the project list,
  • : is for moving selected notes into another track (target tracks are ordered “closest first”),
  • @ is for the timeline events list + tracks list,
  • ! is for the chord compiler, which deserves a separate description:

Chord compiler

One of the modes of that command palette allows to generate chords based on the chord name decoding rules. This tool is not aware of any of the key signatures present at the timeline, all the chord’s notes are inferred from the given description.

Just hit ! and start typing a chord description, or pick some of the suggestions it provides:

chord-compiler

Configs

Helio uses several configuration files, such as: scales, in-scale chords, temperaments, hotkeys, color schemes and translations.

For each of those configs, there can be up to three versions, which are loaded and merged in this order:

  • ones that a built-in into executable,
  • latest updates fetched from helio.fm - they extend and override the built-in ones,
    • for example, translations, which is now the only resource updated in the runtime,
  • user’s configs - they extend and override the previous step.
    • for example, arpeggiators that you create in the app,
    • or any other configuration you might add and fill by hand.

Built-in configs

Chords

This config lists all chords displayed in the chord tool:

{
  /*
    A number of chords that are easy to define with in-scale keys.
    Sharp or flat near the number simply works as a halftone up/down.
  */
  "chords": {
    "chord": [
      { "name": "3", "keys": "1 3 5" },
      { "name": "sus2", "keys": "1 2 5" },
      { "name": "sus4", "keys": "1 4 5" },
      //{ "name": "aug", "keys": "1 3 5#" },
      //{ "name": "dim", "keys": "1 3 5b" },
      { "name": "6", "keys": "1 3 5 6" },
      { "name": "7", "keys": "1 3 5 7" },
      { "name": "7 sus2", "keys": "1 2 5 7" },
      { "name": "7 sus4", "keys": "1 4 5 7" },
      { "name": "9", "keys": "1 3 5 7 9" },
      { "name": "add9", "keys": "1 3 5 9" },
      { "name": "add9 sus4", "keys": "1 4 5 9" },
      { "name": "add11", "keys": "1 3 5 11" }
    ]
  }
}

Temperaments

This file lists all available temperaments, to which you can switch your project:

{
  "temperaments": {
    "temperament": [
      {
        "id": "12edo",
        "name": "12 equal temperament",
        "period": "C/B# C#/Db D Eb/D# E/Fb F/E# F#/Gb G G#/Ab A Bb/A# B/Cb",
        "highlighting": "2 2 1 2 2 2 1",
        "chromaticMap": "1 1 1 1 1 1 1 1 1 1 1 1",
        "chromaticScale": [
          { "key": "A", "scale": "A A# B C C# D D# E F F# G G#" },
          { "key": "Ab", "scale": "Ab A Bb B C Db D Eb E F Gb G" },
          { "key": "A#", "scale": "A# B C C# D D# E F F# G G# A" },
          { "key": "B", "scale": "B C C# D D# E F F# G G# A A#" },
          { "key": "Bb", "scale": "Bb B C Db D Eb E F Gb G Ab A" },
          { "key": "B#", "scale": "B# C# D D# E F F# G G# A A# B" },
          { "key": "C", "scale": "C C# D D# E F F# G G# A A# B" },
          { "key": "Cb", "scale": "Cb C Db D Eb E F Gb G Ab A Bb" },
          { "key": "C#", "scale": "C# D D# E F F# G G# A A# B C" },
          { "key": "D", "scale": "D D# E F F# G G# A A# B C C#" },
          { "key": "Db", "scale": "Db D Eb E F Gb G Ab A Bb B C" },
          { "key": "D#", "scale": "D# E F F# G G# A A# B C C# D" },
          { "key": "E", "scale": "E F F# G G# A A# B C C# D D#" },
          { "key": "Eb", "scale": "Eb E F Gb G Ab A Bb B C Db D" },
          { "key": "E#", "scale": "E# F# G G# A A# B C C# D D# E" },
          { "key": "F", "scale": "F Gb G Ab A Bb B C Db D Eb E" },
          { "key": "Fb", "scale": "Fb F Gb G Ab A Bb B C Db D Eb" },
          { "key": "F#", "scale": "F# G G# A A# B C C# D D# E F" },
          { "key": "G", "scale": "G G# A A# B C C# D D# E F F#" },
          { "key": "Gb", "scale": "Gb G Ab A Bb B C Db D Eb E F" },
          { "key": "G#", "scale": "G# A A# B C C# D D# E F F# G" }
        ]
      },
      {
        "id": "19edo",
        "name": "19 equal temperament",
        "period": "C C# Cx D D# Eb E E# F F# Fx G G# Ab A A# Bb B B#",
        "highlighting": "2 1 2 1 2 2 1 2 1 2 2 1",
        "chromaticMap": "2 1 2 1 2 2 1 2 1 2 2 1"
      },
      {
        "id": "22edo",
        "name": "22 equal temperament",
        "period": "C ^C vC# C# D Eb ^Eb vE E F Gb ^Gb vG G Ab ^Ab vA A Bb ^Bb vB B",
        "highlighting": "3 1 3 1 3 1 1 3 1 3 1 1",
        "chromaticMap": "3 1 3 1 3 1 1 3 1 3 1 1"
      },
      {
        "id": "26edo",
        "name": "26 equal temperament",
        "period": "D D# Ebb Eb E E# Fb F F# Fx Gb G G# Gx Ab A A# Bbb Bb B B# Cb C C# Cx Db",
        "highlighting": "2 2 3 1 3 2 2 2 2 3 2 2",
        "chromaticMap": "2 2 3 1 3 2 2 2 2 3 2 2"
      },
      {
        "id": "31edo",
        "name": "31 equal temperament",
        "period": "C Dbb C# Db C## D Ebb D# Eb D## E Fb E# F Gbb F# Gb F## G Abb G# Ab G## A Bbb A# Bb A## B Cb B#",
        "highlighting": "2 3 3 2 3 2 3 2 3 3 2 3",
        "chromaticMap": "2 3 3 2 3 2 3 2 3 3 2 3"
      }
    ]
  }
}

Temperaments define how highlighting works in the piano roll, including octave size and key names, and which scales are available to choose from. Temperament description also provides a chromatic approximation, which is used as the “least common denominator” to be able to convert a piece from one temperament to another.

Scales

Scales listed here are available to choose from in the key signature dialog, and in the rescale tool. Scales with octave size mismatching the current temperament’s octave size are ignored.

{
  "scales": {
    "scale": [

      // 12 edo scales; source: "The Scale Omnibus"
      { "period": 12, "name": "Ionian", "intervals": "2 2 1 2 2 2 1" },
      { "period": 12, "name": "Aeolian", "intervals": "2 1 2 2 1 2 2" },
      { "period": 12, "name": "Lydian", "intervals": "2 2 2 1 2 2 1" },
      { "period": 12, "name": "Mixolydian", "intervals": "2 2 1 2 2 1 2" },
      { "period": 12, "name": "Dorian", "intervals": "2 1 2 2 2 1 2" },
      { "period": 12, "name": "Phrygian", "intervals": "1 2 2 2 1 2 2" },
      { "period": 12, "name": "Locrian", "intervals": "1 2 2 1 2 2 2" },
      { "period": 12, "name": "Melodic Major", "intervals": "2 2 1 2 1 2 2" },
      { "period": 12, "name": "Melodic Minor", "intervals": "2 1 2 2 2 2 1" },
      { "period": 12, "name": "Harmonic Major", "intervals": "2 2 1 2 1 3 1" },
      { "period": 12, "name": "Harmonic Minor", "intervals": "2 1 2 2 1 3 1" },
      { "period": 12, "name": "Hungarian Major", "intervals": "3 1 2 1 2 1 2" },
      { "period": 12, "name": "Hungarian Minor", "intervals": "2 1 1 3 1 3 1" },
      { "period": 12, "name": "Neapolitan Major", "intervals": "1 2 2 2 2 2 1" },
      { "period": 12, "name": "Neapolitan Minor", "intervals": "1 2 2 2 1 3 1" },
      { "period": 12, "name": "Romanian Major", "intervals": "1 3 2 1 2 1 2" },
      { "period": 12, "name": "Romanian Minor", "intervals": "2 1 3 1 2 1 2" },
      { "period": 12, "name": "Enigmatic", "intervals": "1 3 2 2 2 1 1" },
      { "period": 12, "name": "Enigmatic Minor", "intervals": "1 2 3 2 2 1 1" },
      { "period": 12, "name": "Ionian Augmented", "intervals": "2 2 1 3 1 2 1" },
      { "period": 12, "name": "Lydian Augmented", "intervals": "2 2 2 2 1 2 1" },
      { "period": 12, "name": "Lydian Diminished", "intervals": "2 1 3 1 2 2 1" },
      { "period": 12, "name": "Lydian Dominant", "intervals": "2 2 2 1 2 1 2" },
      { "period": 12, "name": "Mixolydian Augmented", "intervals": "2 2 1 3 1 1 2" },
      { "period": 12, "name": "Phrygian Dominant", "intervals": "1 3 1 2 1 2 2" },
      { "period": 12, "name": "Ultraphrygian", "intervals": "1 2 1 3 1 1 3" },
      { "period": 12, "name": "Locrian Dominant", "intervals": "1 3 1 1 2 2 2" },
      { "period": 12, "name": "Superlocrian", "intervals": "1 1 2 2 2 2 2" },
      { "period": 12, "name": "Ultralocrian", "intervals": "1 2 1 2 2 1 3" },
      { "period": 12, "name": "Major Locrian", "intervals": "2 2 1 1 2 2 2" },
      { "period": 12, "name": "Leading Whole-Tone", "intervals": "2 2 2 2 2 1 1" },
      { "period": 12, "name": "Double Harmonic", "intervals": "1 3 1 2 1 3 1" },
      { "period": 12, "name": "Half Diminished", "intervals": "2 1 2 1 2 2 2" },
      { "period": 12, "name": "Altered Dominant", "intervals": "1 2 1 2 2 2 2" },
      { "period": 12, "name": "Blues Heptatonic", "intervals": "2 1 2 1 3 1 2" },
      { "period": 12, "name": "Blues Phrygian", "intervals": "1 2 2 1 1 3 2" },
      { "period": 12, "name": "Blues Modified", "intervals": "2 1 2 1 1 3 2" },
      { "period": 12, "name": "Blues Mixed", "intervals": "3 1 1 1 1 3 2" },
      { "period": 12, "name": "Blues Leading Tone", "intervals": "3 2 1 1 3 1 1" },
      { "period": 12, "name": "Rock'n'Roll", "intervals": "3 1 1 2 2 1 2" },

      // 19 edo scales; source: https://en.xen.wiki/w/19edo_modes
      { "period": 19, "name": "Melodic Minor", "intervals": "2 3 2 3 3 3 3" },
      { "period": 19, "name": "Harmonic Minor", "intervals": "2 3 2 3 3 2 4" },
      { "period": 19, "name": "Harmonic Major", "intervals": "2 3 2 4 2 3 3" },
      { "period": 19, "name": "Deutone", "intervals": "1 3 3 3 3 3 3" },
      { "period": 19, "name": "Meantone", "intervals": "2 3 3 2 3 3 3" },
      { "period": 19, "name": "Ionian", "intervals": "3 3 2 3 3 3 2" },
      { "period": 19, "name": "Aeolian", "intervals": "3 2 3 3 2 3 3" },
      { "period": 19, "name": "Dorian", "intervals": "3 2 3 3 3 2 3" },
      { "period": 19, "name": "Lydian", "intervals": "3 3 3 2 3 3 2" },
      { "period": 19, "name": "Mixolydian", "intervals": "3 3 2 3 3 2 3" },
      { "period": 19, "name": "Locrian", "intervals": "2 3 3 2 3 3 3" },
      { "period": 19, "name": "Major Locrian", "intervals": "2 2 3 3 3 3 3" },
      { "period": 19, "name": "Phrygian", "intervals": "2 3 3 3 2 3 3 "},

      // 22 edo scales; source: https://en.xen.wiki/w/22edo
      { "period": 22, "name": "Harmonic Minor", "intervals": "4 2 3 4 2 5 2" },
      { "period": 22, "name": "Superpyth, diatonic", "intervals": "4 1 4 4 4 1 4" },
      { "period": 22, "name": "Just major", "intervals": "4 3 2 4 3 4 2" },
      { "period": 22, "name": "Natural minor", "intervals": "4 2 3 4 2 4 3" },
      { "period": 22, "name": "Tetrachordal major", "intervals": "4 3 2 4 4 3 2" },
      { "period": 22, "name": "Tetrachordal minor", "intervals": "4 2 3 4 2 3 4" },
      { "period": 22, "name": "Just harmonic minor", "intervals": "4 2 3 4 2 5 2" },
      { "period": 22, "name": "Just harmonic major", "intervals": "4 3 2 4 2 5 2" },
      { "period": 22, "name": "Just melodic minor", "intervals": "4 2 3 4 3 4 2" },
      { "period": 22, "name": "Superpyth harmonic minor", "intervals": "4 1 4 4 1 7 1" },
      { "period": 22, "name": "Superpyth harmonic major", "intervals": "4 4 1 4 1 7 1" },
      { "period": 22, "name": "Superpyth melodic minor", "intervals": "4 1 4 4 4 4 1" },
      { "period": 22, "name": "Superpyth double harmonic", "intervals": "1 7 1 4 1 7 1" },
      { "period": 22, "name": "Porcupine bright major", "intervals": "4 3 3 3 3 4 2" },
      { "period": 22, "name": "Porcupine bright minor", "intervals": "4 2 4 3 3 3 3" },
      { "period": 22, "name": "Porcupine dark minor", "intervals": "4 2 3 4 3 3 3" },

      // 26 edo scales; home-cooked approximations of 12-edo
      { "period": 26, "name": "Ionian", "intervals": "4 5 2 4 5 4 2" },
      { "period": 26, "name": "Aeolian", "intervals": "4 3 4 4 2 5 4" },
      { "period": 26, "name": "Lydian", "intervals": "4 5 4 2 5 4 2" },
      { "period": 26, "name": "Mixolydian", "intervals": "4 5 2 4 5 2 4" },
      { "period": 26, "name": "Dorian", "intervals": "4 3 4 4 5 2 4" },
      { "period": 26, "name": "Phrygian", "intervals": "2 5 4 4 2 5 4" },
      { "period": 26, "name": "Locrian", "intervals": "2 5 4 2 4 5 4" },
      { "period": 26, "name": "Melodic Major", "intervals": "4 5 2 4 2 5 4" },
      { "period": 26, "name": "Melodic Minor", "intervals": "4 3 4 4 5 4 2" },
      { "period": 26, "name": "Harmonic Major", "intervals": "4 5 2 4 2 7 2" },
      { "period": 26, "name": "Harmonic Minor", "intervals": "4 3 4 4 2 7 2" },
      { "period": 26, "name": "Neapolitan Major", "intervals": "2 5 4 4 5 4 2" },
      { "period": 26, "name": "Neapolitan Minor", "intervals": "2 5 4 4 2 7 2" },
      { "period": 26, "name": "Romanian Major", "intervals": "2 7 4 2 5 2 4" },
      { "period": 26, "name": "Romanian Minor", "intervals": "4 3 6 2 5 2 4" },

      // 31 edo scales; source: https://en.xen.wiki/w/31edo
      { "period": 31, "name": "Major", "intervals": "5 5 3 5 5 5 3" },
      { "period": 31, "name": "Natural Minor", "intervals": "5 3 5 5 3 5 5" },
      { "period": 31, "name": "Melodic Minor", "intervals": "5 3 5 5 5 5 3" },
      { "period": 31, "name": "Harmonic Major", "intervals": "5 5 3 5 3 7 3" },
      { "period": 31, "name": "Harmonic Minor", "intervals": "5 3 5 5 3 7 3" },
      { "period": 31, "name": "Major-Minor", "intervals": "5 5 3 5 3 5 5" },
      { "period": 31, "name": "Septimal Natural Minor", "intervals": "5 2 6 5 2 5 6" },
      { "period": 31, "name": "Neutral Diatonic Mixolydian", "intervals": "4 4 5 4 4 5 5" },
      { "period": 31, "name": "Neutral Diatonic Lydian", "intervals": "4 5 4 4 5 5 4" },
      { "period": 31, "name": "Neutral Diatonic Phrygian", "intervals": "5 4 4 5 5 4 4" },
      { "period": 31, "name": "Neutral Diatonic Dorian", "intervals": "4 4 5 5 4 4 5" },
      { "period": 31, "name": "Neutral Diatonic Hypolydian", "intervals": "4 5 5 4 4 5 4" },
      { "period": 31, "name": "Neutral Diatonic Hypophrygian", "intervals": "5 5 4 4 5 4 4" },
      { "period": 31, "name": "Neutral Diatonic Hypodorian", "intervals": "5 4 4 5 4 4 5" },
      { "period": 31, "name": "Hemiolic Chromatic Mixolydian", "intervals": "2 2 9 2 2 9 5" },
      { "period": 31, "name": "Hemiolic Chromatic Lydian", "intervals": "2 9 2 2 9 5 2" },
      { "period": 31, "name": "Hemiolic Chromatic Phrygian", "intervals": "9 2 2 9 5 2 2" },
      { "period": 31, "name": "Hemiolic Chromatic Dorian", "intervals": "2 2 9 5 2 2 9" },  
      { "period": 31, "name": "Hemiolic Chromatic Hypolydian", "intervals": "2 9 5 2 2 9 2" },
      { "period": 31, "name": "Hemiolic Chromatic Hypophrygian", "intervals": "9 5 2 2 9 2 2" },
      { "period": 31, "name": "Hemiolic Chromatic Hypodorian", "intervals": "5 2 2 9 2 2 9" },
      { "period": 31, "name": "Ratio 2:3 Chromatic Mixolydian", "intervals": "2 3 8 2 3 8 5" },
      { "period": 31, "name": "Ratio 2:3 Chromatic Lydian", "intervals": "3 8 2 3 8 5 2" },
      { "period": 31, "name": "Ratio 2:3 Chromatic Phrygian", "intervals": "8 2 3 8 5 2 3" },
      { "period": 31, "name": "Ratio 2:3 Chromatic Dorian", "intervals": "2 3 8 5 2 3 8" },
      { "period": 31, "name": "Ratio 2:3 Chromatic Hypolydian", "intervals": "3 8 5 2 3 8 2" },
      { "period": 31, "name": "Ratio 2:3 Chromatic Hypophrygian", "intervals": "8 5 2 3 8 2 3" },
      { "period": 31, "name": "Ratio 2:3 Chromatic Hypodorian", "intervals": "5 2 3 8 2 3 8" },
      { "period": 31, "name": "Intense Diatonic Mixolydian", "intervals": "3 5 5 3 5 5 5" },
      { "period": 31, "name": "Intense Diatonic Phrygian", "intervals": "5 3 5 5 5 3 5" },
      { "period": 31, "name": "Intense Diatonic Dorian", "intervals": "3 5 5 5 3 5 5" },
      { "period": 31, "name": "Intense Diatonic Hypolydian", "intervals": "5 5 5 3 5 5 3" },
      { "period": 31, "name": "Intense Diatonic Hypophrygian", "intervals": "5 5 3 5 5 3 5" },
      { "period": 31, "name": "Soft Diatonic Mixolydian", "intervals": "2 5 6 2 5 6 5" },
      { "period": 31, "name": "Soft Diatonic Lydian", "intervals": "5 6 2 5 6 5 2" },
      { "period": 31, "name": "Soft Diatonic Phrygian", "intervals": "6 2 5 6 5 2 5" },
      { "period": 31, "name": "Soft Diatonic Dorian", "intervals": "2 5 6 5 2 5 6" },
      { "period": 31, "name": "Soft Diatonic Hypolydian", "intervals": "5 6 5 2 5 6 2" },
      { "period": 31, "name": "Soft Diatonic Hypophrygian", "intervals": "6 5 2 5 6 2 5" },
      { "period": 31, "name": "Soft Diatonic Hypodorian", "intervals": "5 2 5 6 2 5 6" }
    ]
  }
}

Meters

Meters listed here are available to choose from in the time signature dialog.

Each meter comes with a metronome, which is described using “Oona Pana” scheme, suggested by Rods Bobavich - a simplified, but handy way to describe musical rhythms, which is also easy to read and edit manually.

Metronome schemes listed here are just the default ones, and they can be edited for each time signature separately in the time signature dialog.

{
  "meters": {
    "meter": [
      {
        "name": "Common time",
        "time": "4/4",
        "metronome": "oona pana"
      },
      {
        "name": "Alla breve",
        "time": "2/4",
        "metronome": "oona"
      },
      {
        "name": "Waltz time",
        "time": "3/4",
        "metronome": "oonapa"
      },
      {
        "time": "5/4",
        "metronome": "oonapa pana"
      },
      {
        "time": "6/4",
        "metronome": "oonapa panapa"
      },
      {
        "time": "7/8",
        "metronome": "oonapa pana papa"
      },
      {
        "time": "9/8",
        "metronome": "oonapa panapa panapa"
      },
      {
        "time": "10/8",
        "metronome": "oona panapa pana panapa"
      },
      {
        "time": "11/8",
        "metronome": "oona papa oona pana panapa"
      },
      {
        "time": "13/8",
        "metronome": "oonapa panapa panapa pana papa"
      }
    ]
  }
}

Hotkeys

See the hotkeys page.

Translations

The translations file is too big to be included here; if you want to help proofread and improve the translation for your native language, please follow this link.

The translations are updated in the runtime, if there are any changes: the latest translations are saved in the translations.helio file in the app’s config directory.

User configs

To override or extend the built-in data, you can create a file with one of these names in your documents directory:

  • chords.json
  • scales.json
  • meters.json
  • temperaments.json
  • etc.

Custom scales

Let’s say, you want to add a scale - here’s the example content for scales.json:

{
  "scales": {
    "scale": [
      { "period": 12, "name": "Oriental", "intervals": "1 3 1 1 3 1 2" }
    ]
  }
}

What it means:

  • "period": 12 - this scale will be available only in twelve-tone projects,
  • "name": "Oriental" - scales are merged by name; if the built-in list contained a scale with such name, it would be replaced,
  • "intervals": "1 3 1 1 3 1 2" - this one is a heptatonic scale, i.e. it contains 7 intervals.

Custom temperaments

Or, if you want to add a temperament, create temperaments.json; for example, let’s add 24-EDO:

{
  "temperaments": {
    "temperament": [
      {
        "id": "24edo",
        "name": "24 equal temperament",
        "period": "C ^C C# vD D ^D Eb vE E ^E F ^F F# vG G ^G Ab vA A ^A Bb vB B ^B",
		"periodRange": 2.0,
        "highlighting": "3 4 3 4 3 4 3",
        "chromaticMap": "2 2 2 2 2 2 2 2 2 2 2 2"
      }
    ]
  }
}

What it means:

  • id - if the built-in list contained a temperament with such id, it would be replaced,
  • name - this is displayed in the menus,
  • period - key names separated by whitespace; the number of keys defines the octave size,
  • periodRange - the pitch range that makes up a period, defaults 2.0 representing one octave; for nonoctave tunings use 3.0 for the duodecime used in the Bohlen-Pierce tuning or 1.5 for the pure fifth, used in the Carlos Alpha, Beta and Gamma tunings; for backward compatibility, if this parameter isn’t given, Helio assumes one octave; this parameter only affects the built-in instrument at the moment,
  • highlighting - the default highlighting scheme in the piano roll, i.e. which rows are highlighted as “white keys” by default,
  • chromaticMap - this is used to convert temperaments; here, since 24-EDO just divides the 12-tone semitone in two, the chromatic map just jumps over quarter-tones. …

You might want to add some scales for it, for example:

{
  "scales": {
    "scale": [
      // append this list to your scales:
      { "period": 24, "name": "Maqam Nahfat", "intervals": "3 3 4 4 4 2 4" },
      { "period": 24, "name": "Maqam Saba", "intervals": "3 3 2 6 2 4 4" },
      { "period": 24, "name": "Maqam Sabr Jadid", "intervals": "3 3 2 6 2 6 2" }
      // etc, etc.
      // (source: https://en.xen.wiki/w/24edo)
    ]
  }
}

Custom arpeggiators

Arpeggiators are created in the app, you will find them saved in arpeggiators.json. You can edit this file by hand, but you probably won’t need to.

Hotkeys

This page simply lists sections of the default hotkeys configuration file. Hopefully the command names are descriptive enough.

If you don’t see any hotkeys here, you’re reading the markdown source of this page, please visit docs.helio.fm.

Hotkeys for all pages

    "receiver": "MainLayout",
    "keyPress": [

      // Command Palette aka Spotlight Search aka Goto Anything:
      { "command": "CommandPalette", "key": "`" },
      { "command": "CommandPalette", "key": "Control + P" },
      { "command": "CommandPalette", "key": "Command + P" },
      { "command": "CommandPalette", "key": "Control + G" },
      { "command": "CommandPalette", "key": "Command + G" },

      // Quick access to command palette modes - /, :, !, @
      { "command": "CommandPaletteWithMode", "key": "/" },
      { "command": "CommandPaletteWithMode", "key": "Shift + 1" },
      { "command": "CommandPaletteWithMode", "key": "Shift + 2" },
      { "command": "CommandPaletteWithMode", "key": "Shift + ;" },

      { "command": "ShowPreviousPage", "key": "Command + Cursor Left" },
      { "command": "ShowPreviousPage", "key": "Control + Cursor Left" },
      { "command": "ShowPreviousPage", "key": "Alt + Cursor Left" },
      { "command": "ShowNextPage", "key": "Command + Cursor Right" },
      { "command": "ShowNextPage", "key": "Control + Cursor Right" },
      { "command": "ShowNextPage", "key": "Alt + Cursor Right" },

      { "command": "SwitchToEditMode", "key": "Page Up" },
      { "command": "SwitchToArrangeMode", "key": "Page Down" },
      { "command": "SwitchToVersioningMode", "key": "Control + S" },
      { "command": "SwitchToVersioningMode", "key": "Command + S" },
    ]

Common hotkeys for editing and arranging

    "receiver": "SequencerLayout",
    "keyPress": [

      { "command": "SwitchBetweenRolls", "key": "Tab" },

      { "command": "ExportMidi", "key": "Control + E" },
      { "command": "ExportMidi", "key": "Command + E" },

      { "command": "RenderToWAV", "key": "Control + R" },
      { "command": "RenderToWAV", "key": "Command + R" },
      { "command": "RenderToFLAC", "key": "Control + Shift + R" },
      { "command": "RenderToFLAC", "key": "Command + Shift + R" }
    ]

Piano roll

    "receiver": "PianoRoll",
    "keyPress": [

      // Undo/redo:
      { "command": "Undo", "key": "Command + Z" },
      { "command": "Undo", "key": "Control + Z" },
      { "command": "Redo", "key": "Command + Shift + Z" },
      { "command": "Redo", "key": "Control + Shift + Z" },
      { "command": "Redo", "key": "Command + Y" },
      { "command": "Redo", "key": "Control + Y" },

      // Copy
      { "command": "CopyEvents", "key": "Command + C" },
      { "command": "CopyEvents", "key": "Control + C" },
      { "command": "CopyEvents", "key": "Command + Insert" },
      { "command": "CopyEvents", "key": "Control + Insert" },

      // Cut
      { "command": "CutEvents", "key": "Command + X" },
      { "command": "CutEvents", "key": "Control + X" },
      { "command": "CutEvents", "key": "Shift + Delete" },

      // Cut selection to the new track
      { "command": "NewTrackFromSelection", "key": "Control + Shift + X" },
      { "command": "NewTrackFromSelection", "key": "Command + Shift + X" },

      // Delete
      { "command": "DeleteEvents", "key": "X" },
      { "command": "DeleteEvents", "key": "Delete" },
      { "command": "DeleteEvents", "key": "Backspace" },

      // Paste
      { "command": "PasteEvents", "key": "Command + V" },
      { "command": "PasteEvents", "key": "Control + V" },
      { "command": "PasteEvents", "key": "Shift + Insert" },

      // Playback/record control
      { "command": "TransportStop", "key": "Stop" },
      { "command": "TransportStop", "key": "Escape" },
      { "command": "TransportPlaybackStart", "key": "Play" },
      { "command": "TransportPlaybackStart", "key": "Return" },
      { "command": "TransportRecordingAwait", "key": "F12" },
      { "command": "TransportRecordingAwait", "key": "Control + Return" },
      { "command": "TransportRecordingAwait", "key": "Command + Return" },
      { "command": "TransportRecordingStart", "key": "Shift + Return" },
      { "command": "ToggleLoopOverSelection", "key": "F11" },

      // Navigation
      { "command": "ZoomIn", "key": "Z" },
      { "command": "ZoomOut", "key": "Shift + Z" },
      { "command": "ZoomEntireClip", "key": "Alt + Z" },
      { "command": "ZoomEntireClip", "key": "Command + Tab" },
      { "command": "ZoomEntireClip", "key": "Control + Tab" },
      { "command": "TimelineJumpNext", "key": "." },
      { "command": "TimelineJumpPrevious", "key": "," },
      { "command": "TimelineJumpHome", "key": "Home" },
      { "command": "TimelineJumpEnd", "key": "End" },

      // Selection
      { "command": "SelectAllEvents", "key": "Command + A" },
      { "command": "SelectAllEvents", "key": "Control + A" },

      // Edit selection
      { "command": "ToggleMuteClips", "key": "M" },
      { "command": "ToggleSoloClips", "key": "S" },
      { "command": "RenameTrack", "key": "F2" },
      { "command": "SetTrackTimeSignature", "key": "Alt + F2" },
      { "command": "TempoUp1Bpm", "key": "Shift + +" },
      { "command": "TempoDown1Bpm", "key": "Shift + -" },
      { "command": "BeatShiftLeft", "key": "Cursor Left" },
      { "command": "BeatShiftRight", "key": "Cursor Right" },
      { "command": "LengthDecrease", "key": "Shift + Cursor Left" },
      { "command": "LengthIncrease", "key": "Shift + Cursor Right" },
      { "command": "TransposeUp", "key": "Cursor Up" },
      { "command": "TransposeDown", "key": "Cursor Down" },
      { "command": "TransposeScaleKeyUp", "key": "Alt + Cursor Up" },
      { "command": "TransposeScaleKeyDown", "key": "Alt + Cursor Down" },
      { "command": "TransposeOctaveUp", "key": "Shift + Cursor Up" },
      { "command": "TransposeOctaveDown", "key": "Shift + Cursor Down" },
      { "command": "TransposeFifthUp", "key": "Shift + Alt + Cursor Up" },
      { "command": "TransposeFifthDown", "key": "Shift + Alt + Cursor Down" },
      { "command": "MakeStaccato", "key": "Alt + S" },
      { "command": "MakeStaccatissimo", "key": "Shift + Alt + S" },
      { "command": "MakeLegato", "key": "Alt + L" },

      // Refactor selection
      { "command": "Retrograde", "key": "Alt + R" },
      { "command": "MelodicInversion", "key": "Alt + I" },
      { "command": "CleanupOverlaps", "key": "Alt + O" },
      { "command": "NotesVolumeUp", "key": "+" },
      { "command": "NotesVolumeDown", "key": "-" },
      { "command": "NotesVolumeRandom", "key": "Alt + +" },
      { "command": "NotesVolumeFadeOut", "key": "Alt + -" },
      { "command": "InvertChordUp", "key": "Control + Cursor Up" },
      { "command": "InvertChordUp", "key": "Command + Cursor Up" },
      { "command": "InvertChordDown", "key": "Control + Cursor Down" },
      { "command": "InvertChordDown", "key": "Command + Cursor Down" },

      // Multiplets
      { "command": "Tuplet1", "key": "Alt + 1" },
      { "command": "Tuplet2", "key": "Alt + 2" },
      { "command": "Tuplet3", "key": "Alt + 3" },
      { "command": "Tuplet4", "key": "Alt + 4" },
      { "command": "Tuplet5", "key": "Alt + 5" },
      { "command": "Tuplet6", "key": "Alt + 6" },
      { "command": "Tuplet7", "key": "Alt + 7" },
      { "command": "Tuplet8", "key": "Alt + 8" },
      { "command": "Tuplet9", "key": "Alt + 9" },

      // Quantization
      { "command": "QuantizeTo1_1", "key": "Control + 1" },
      { "command": "QuantizeTo1_2", "key": "Control + 2" },
      { "command": "QuantizeTo1_4", "key": "Control + 3" },
      { "command": "QuantizeTo1_8", "key": "Control + 4" },
      { "command": "QuantizeTo1_16", "key": "Control + 5" },
      { "command": "QuantizeTo1_32", "key": "Control + 6" },

      // Edit modes
      { "command": "EditModeDefault", "key": "1" },
      { "command": "EditModeDraw", "key": "2" },
      { "command": "EditModeKnife", "key": "3" },

      // Version control
      { "command": "VersionControlToggleQuickStash", "key": "Shift + Tab" },

      // Panels
      { "command": "ShowArpeggiatorsPanel", "key": "A" },
      { "command": "CreateArpeggiatorFromSelection", "key": "Shift + A" },
      { "command": "ShowRescalePanel", "key": "R" },
      { "command": "ShowChordPanel", "key": "C" },

      // Other toggles
      { "command": "ToggleScalesHighlighting", "key": "H" },
      { "command": "ToggleNoteNameGuides", "key": "G" },
      { "command": "ToggleBottomMiniMap", "key": "B" },
      { "command": "ToggleVolumePanel", "key": "V" },
      { "command": "ToggleMetronome", "key": "Control + M" },
      { "command": "ToggleMetronome", "key": "Command + M" },

      // Various
      { "command": "DuplicateTrack", "key": "F5" },
      { "command": "SwitchToClipInViewport", "key": "F3" },
      { "command": "EditCurrentInstrument", "key": "F4" }
    ],
    "keyDown": [
      { "command": "StartDragViewport", "key": "Spacebar" }
    ],
    "keyUp": [
      { "command": "EndDragViewport", "key": "Spacebar" }
    ]

Pattern roll

    "receiver": "PatternRoll",
    "keyPress": [

      // Undo/redo
      { "command": "Undo", "key": "Command + Z" },
      { "command": "Undo", "key": "Control + Z" },
      { "command": "Redo", "key": "Command + Shift + Z" },
      { "command": "Redo", "key": "Control + Shift + Z" },
      { "command": "Redo", "key": "Command + Y" },
      { "command": "Redo", "key": "Control + Y" },

      // Delete clips
      { "command": "DeleteClips", "key": "X" },
      { "command": "DeleteClips", "key": "Delete" },
      { "command": "DeleteClips", "key": "Backspace" },

      // Playback control
      { "command": "TransportStop", "key": "Stop" },
      { "command": "TransportStop", "key": "Escape" },
      { "command": "TransportPlaybackStart", "key": "Play" },
      { "command": "TransportPlaybackStart", "key": "Return" },
      { "command": "TransportRecordingStart", "key": "Shift + Return" },
      { "command": "TransportRecordingAwait", "key": "Control + Return" },
      { "command": "TransportRecordingAwait", "key": "Command + Return" },
      { "command": "TransportRecordingAwait", "key": "F12" },
      { "command": "ToggleLoopOverSelection", "key": "F11" },

      // Navigation
      { "command": "ZoomIn", "key": "Z" },
      { "command": "ZoomOut", "key": "Shift + Z" },
      { "command": "ZoomEntireClip", "key": "Alt + Z" },
      { "command": "ZoomEntireClip", "key": "Command + Tab" },
      { "command": "ZoomEntireClip", "key": "Control + Tab" },
      { "command": "TimelineJumpNext", "key": "." },
      { "command": "TimelineJumpPrevious", "key": "," },
      { "command": "TimelineJumpHome", "key": "Home" },
      { "command": "TimelineJumpEnd", "key": "End" },

      // Selection
      { "command": "SelectAllClips", "key": "Command + A" },
      { "command": "SelectAllClips", "key": "Control + A" },

      // Quantization
      { "command": "QuantizeTo1_1", "key": "Control + 1" },
      { "command": "QuantizeTo1_2", "key": "Control + 2" },
      { "command": "QuantizeTo1_4", "key": "Control + 3" },
      { "command": "QuantizeTo1_8", "key": "Control + 4" },
      { "command": "QuantizeTo1_16", "key": "Control + 5" },
      { "command": "QuantizeTo1_32", "key": "Control + 6" },

      // Edit modes
      { "command": "EditModeDefault", "key": "1" },
      { "command": "EditModeDraw", "key": "2" },
      { "command": "EditModeKnife", "key": "3" },

      // Grouping
      { "command": "PatternsGroupByName", "key": "Q" },
      { "command": "PatternsGroupByColour", "key": "W" },
      { "command": "PatternsGroupByInstrument", "key": "E" },
      { "command": "PatternsGroupById", "key": "R" },

      // Version control
      { "command": "VersionControlToggleQuickStash", "key": "Shift + Tab" },

      // Edit selection
      { "command": "ToggleMuteClips", "key": "M" },
      { "command": "ToggleSoloClips", "key": "S" },
      { "command": "RenameTrack", "key": "F2" },
      { "command": "SetTrackTimeSignature", "key": "Alt + F2" },
      { "command": "TempoUp1Bpm", "key": "Shift + +" },
      { "command": "TempoDown1Bpm", "key": "Shift + -" },
      { "command": "ClipVolumeUp", "key": "+" },
      { "command": "ClipVolumeDown", "key": "-" },
      { "command": "ClipTransposeUp", "key": "Cursor Up" },
      { "command": "ClipTransposeDown", "key": "Cursor Down" },
      { "command": "ClipTransposeOctaveUp", "key": "Shift + Cursor Up" },
      { "command": "ClipTransposeOctaveDown", "key": "Shift + Cursor Down" },
      { "command": "ClipTransposeFifthUp", "key": "Shift + Alt + Cursor Up" },
      { "command": "ClipTransposeFifthDown", "key": "Shift + Alt + Cursor Down" },
      { "command": "BeatShiftLeft", "key": "Cursor Left" },
      { "command": "BeatShiftRight", "key": "Cursor Right" },
      { "command": "Retrograde", "key": "Alt + R" },

      // Various
      { "command": "ToggleBottomMiniMap", "key": "B" },
      { "command": "ToggleVolumePanel", "key": "V" },
      { "command": "ToggleMetronome", "key": "Control + M" },
      { "command": "ToggleMetronome", "key": "Command + M" },
      { "command": "DuplicateTrack", "key": "F5" },
      { "command": "InstanceToUniqueTrack", "key": "F6" },
      { "command": "EditCurrentInstrument", "key": "F4" }
    ],
    "keyDown": [
      { "command": "StartDragViewport", "key": "Spacebar" }
    ],
    "keyUp": [
      { "command": "EndDragViewport", "key": "Spacebar" }
    ]

Version control page

    "receiver": "VersionControlStage",
    "keyPress": [
      
      { "command": "VersionControlSelectAll", "key": "Control + A" },
      { "command": "VersionControlSelectNone", "key": "Escape" },
      { "command": "VersionControlCommitSelected", "key": "Return" },
      { "command": "VersionControlResetSelected", "key": "Backspace" },
      { "command": "VersionControlResetSelected", "key": "Delete" },
      { "command": "VersionControlCommitAll", "key": "Shift + Return" },
      { "command": "VersionControlCommitAll", "key": "Shift + Return" },
      { "command": "VersionControlResetAll", "key": "Shift + Backspace" },
      { "command": "VersionControlResetAll", "key": "Shift + Delete" },

      // Sync all revisions - only works when logged in
      { "command": "VersionControlSyncAll", "key": "F5" },

      // Stash all changes or apply stashed changes
      { "command": "VersionControlToggleQuickStash", "key": "Tab" }
    ]