Introduction

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

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

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

How to read this

If you’re starting out with Helio, just continue with 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 useful the editing tips: the majority of all the nifty tools and hacks will be 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 flavours it has 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 needed, if you want to have the desktop shortcut and the uninstall tool.

With portable version, just 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 will only be able to host 64-bit plugins, and the 32-bit version will only host 32-bit plugins.

At the moment of writing this, Helio does not support plugin sandboxing or hosting both 32-bit and 64-bit plugins at the same time.

Master build or development build

Master builds are the latest stable versions. You can keep up to date with the latest changes through the release notes. If you’d like to preview the latest features or verify bug fixes, you can install the development build.

Configuration files

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

Note that the installer-based versions don’t remove any of these when uninstalling the app. If you want to remove Helio from the system completely, you need to delete them manually.

The configuration directory

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

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

settings.helio

This file basically contains all the settings, so if you delete or rename it, the app would run as if it was the first time. The settings are supposed to be human-readable and are stored in XML format.

translations.helio and maybe others

Some additional configuration resources are dynamically updated in the runtime, if the newer version is available. At the moment of writing, only translations are updated this way.

In future, the app may sync more configs, including default scales, chords, arpeggiators, hotkey schemes, colour schemes, etc.

The projects directory

The projects files are created in the Helio subfolder of the user’s default documents folder. The location of this directory is also platform-dependent:

  • Windows: %HOMEPATH%\Helio
  • macOS: ~/Documents/Helio
  • Linux: ~/Documents/Helio

Building from source

Building the app from source will require a C++11 compiler, e.g. GCC 4.8 on Linux, Visual Studio 2015 on Windows, or Xcode 7.3.1 on macOS.

Minimum deployment targets are:

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

Basic build instructions

  • Clone with submodules: git clone --recurse-submodules https://github.com/helio-fm/helio-workstation.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.

Getting started

UI overview

helio-ui

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

The UI is separated into these parts:

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

A bit of a history and a couple of silly excuses

This project was started out of the need for an advanced MIDI editor, something like Sublime Text for music.

I was also sick and tired of visual over-stimulation, which most of the music tools out there tend to have more and more (just google some pictures for “digital audio workstation”). As one of the main goals, I wanted a tool that feels right: something with an uncluttered and non-distractive UI.

So generally, I’m always trying to avoid adding UI controls if there’s 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 both simple or even minimalistic and not disorienting at the same time,
  • another challenge is to keep the UI look and behave consistent across all platforms, especially desktop and mobile.

If something feels misleading to you — apologizes, feel free to report that to help identifying the main friction points.

Workspace navigation

The breadcrumb control on the top is responsible for the navigation over the workspace.

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

breadcrumbs-root-menu

Workspace structure

Breadcrumbs are displaying a hierarchy of the current page you’re on.

Under the hood, all pages live in a tree-like structure 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

After starting Helio the first time you should have a simple example project already open in the editor. Here’s a couple of steps that can help you to get started:

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

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

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

Switching between projects

There are several ways:

  • use the / hotkey to show the projects list in the command palette,
  • or hover the Studio item in the breadcrumb control, which shows the menu with all open projects (the most inconvinient way so far),
  • back and forward buttons also can be useful sometimes, the related hotkeys are Alt + Cursor Left and Alt + Cursor Right.

Instruments

Instruments management

The most notable difference in the instruments management from the majority of DAW’s and sequencers out there is that Helio separates instruments from projects.

Each project only holds the instrument “references” (basically, the hashcodes of the instrument info), so that the instrument settings are not saved in the project file, but rather in the application workspace settings.

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

The reason for implementing it this way was separation of concerns, yo that in my workflow, I tend to use all the same instruments for all the projects. The app was designed primarily as a sketching and prototyping tool, and I usually have lots of sketches, so all the operations that involve 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.

If your setup implies always having different instruments or instrument settings for each project, or if you want the project file to contain the instrument details, Helio will make you suffer.

On the other hand, if you happen to have an instrument library you’re comfortable with (e.g. VSL or some selected soundfonts collection), and you want to set it up once and forget, 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

The 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

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

Key signatures

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

timeline-key-signatures

Apart from that, arpeggiators and a couple of other tools rely on the 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

Left sidebar

This sidebar is responsible for track navigation and UI control.

Most buttons on the sidebars have keyboard shortcuts, which makes then 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 velocity map (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.

Right sidebar

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, 4),
  • 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, but the most commonly used modes are the first two:

Edit modes

  • normal mode to manage selection and edit notes: probably, most useful mode,
  • pen mode to add and edit notes: a bit similar to the previous one,
  • drag-only mode: self-explanatory, hold Space to toggle this mode,
  • knife mode: also self-explanatory, cuts notes in the piano roll and tracks in the pattern roll,
  • selection mode: only displayed on the mobile.

All notes, when edited, are aligned to the grid, which depends on the zoom level and supports the resolution of up to 1/64 notes.

All edits are undoable; note that the last 10 undo actions are saved in the project and are still available after restarting the app.

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.

Velocity map

The velocity levels editor (toggled by V hotkey) provides a way to visualize and draw gradual increase/decrease in note volume.

As well as the piano roll, the velocity map limits its editable scope to the active track. But in addition, if any notes are selected, the editable scope is limited to the selection, to make it easier to draw more complex ramps for different chunks of the track:

velocity-map-toggle

At the moment of writing, only linear ramps are implemented:

velocity-map-ramps

You can also change note velocities without this editor, just by middle-button dragging the note componenets on the roll.

MIDI recording

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

recording-start

If the recording mode is on, but the playback has not started yet, 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 actual recording starts.

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 to tweak some track parameters, like key offset of velocity multiplier. In future, it may shift towards more parametric sequencer features.

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 “savepoints” 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 changeset can be reset if you don’t like it, 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/unhiding 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.

Synchronizing projects across devices

// TODO

Tips and tricks

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

Piano roll

Warnings

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

warnings

These are the clipping and oversaturation 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 at 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 similar thing, but it will also switch to another track, if 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 at the timeline:

time-measure-tool

Sound probe tool

Finally, holding Space and clicking at the timeline is something I call “sound probe”, which is supposed to give an idea of what notes are playing at the given point:

sound-probe

Velocity map fine-tuning

It’s possible to use the mouse wheel when dragging the velocity ramping tool to control how it blends with the original notes’ velocities. The main use case for that is fine-tuning the dynamics:

velocity-map-fine-tuning

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 and annotations at the timeline:

drag-and-copy

Pen tool

Also hold Shift or any modifier key to change the behaviour of the pen tool when adding notes. By default, the newly added note is edited in the transpose-and-resize mode. With Shift, it’s the drag mode, more familiar:

pen-tool-alt

UI flags

A couple of display options are available to provide a visual cue. They are toggled either in the navigation panel, or via hotkeys (G and H by default).

The first one is for displaying the note name guides:

note-names

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

scales-highlighting

More UI flags

The audio monitor view and the project mini-map view will toggle different modes on click or tap.

The audio monitor switches between the simple spectrogram mode and the waveform mode. The mini map is stretched either to fit all project, or to fit some fixed duration into the display area box.

monitor-and-map

Chord tool

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

chord-tool

It pick the current key signature from the timeline to know what 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 — kinda helpful if you clicked the wrong row or position.

Since it depends on the harmonic context, it will do nothing when placed on the out-of-scale note (the grey row). It might be a good idea to make sure the scales highlighting is enabled to avoid confusion.

Quick rescale tool

Another tool for experiments and prototyping is the quick rescale menu: once you right-click on any key signature at the timeline, you can choose another scale, into which all the tracks will be translated. This affects all notes of all tracks up to the next key signature (or the very end of the project).

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

quick-rescale

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

See also: piano roll hotkeys

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, after switching to the pattern mode I see that they represent different parts, and can be cut into different tracks:

patterns-knife-tool

Clips and track grouping

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

So, what you see in one row might be either different tracks, or there might be also several instances of the same track. Instances (or clips, as I call them in a code) always share the same name and same notes, but they can be slightly modified: have different position, key shift or volume multiplier, which is mainly meant for prototyping:

patterns-clips

See also: pattern roll hotkeys

Command palette

This 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 several modes, which are 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 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 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

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": "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": "ShowRootPage", "key": "Home" },
      { "command": "SwitchToEditMode", "key": "Page Up" },
      { "command": "SwitchToArrangeMode", "key": "Page Down" },
      { "command": "SwitchToVersioningMode", "key": "End" }
    ]

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" },

      // Duplicate track
      { "command": "DuplicateTrack", "key": "F5" },

      // 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": "Escape" },
      { "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": "Command + Tab" },
      { "command": "ZoomEntireClip", "key": "Control + Tab" },
      { "command": "TimelineJumpNext", "key": "." },
      { "command": "TimelineJumpPrevious", "key": "," },

      // 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": "BeatShiftLeft", "key": "Cursor Left" },
      { "command": "BeatShiftRight", "key": "Cursor Right" },
      { "command": "LengthDecrease", "key": "Shift + Cursor Left" },
      { "command": "LengthIncrease", "key": "Shift + Cursor Right" },
      { "command": "KeyShiftUp", "key": "Cursor Up" },
      { "command": "KeyShiftDown", "key": "Cursor Down" },
      { "command": "OctaveShiftUp", "key": "Shift + Cursor Up" },
      { "command": "OctaveShiftDown", "key": "Shift + Cursor Down" },

      // 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": "Alt + Cursor Up" },
      { "command": "InvertChordUp", "key": "Command + Cursor Up" },
      { "command": "InvertChordUp", "key": "Control + Cursor Up" },
      { "command": "InvertChordDown", "key": "Alt + Cursor Down" },
      { "command": "InvertChordDown", "key": "Command + Cursor Down" },
      { "command": "InvertChordDown", "key": "Control + 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": "EditModePan", "key": "3" },
      { "command": "EditModeKnife", "key": "4" },
      { "command": "EditModeEraser", "key": "5" },

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

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

      // Other toggles
      { "command": "ToggleScalesHighlighting", "key": "H" },
      { "command": "ToggleNoteNameGuides", "key": "G" }
    ],
    "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" },

      // Duplicate track
      { "command": "DuplicateTrack", "key": "F5" },

      // Playback control
      { "command": "TransportStop", "key": "Escape" },
      { "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": "Command + Tab" },
      { "command": "ZoomEntireClip", "key": "Control + Tab" },
      { "command": "TimelineJumpNext", "key": "." },
      { "command": "TimelineJumpPrevious", "key": "," },

      // 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": "EditModePan", "key": "3" },
      { "command": "EditModeKnife", "key": "4" },
      { "command": "EditModeEraser", "key": "5" },

      // 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": "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": "BeatShiftLeft", "key": "Cursor Left" },
      { "command": "BeatShiftRight", "key": "Cursor Right" }
    ],
    "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": "Control + S" },
      { "command": "VersionControlResetSelected", "key": "Backspace" },
      { "command": "VersionControlResetSelected", "key": "Delete" },
      { "command": "VersionControlCommitAll", "key": "Control + Shift + S" },
      { "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" }
    ]

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.0

  • Added initial support for MIDI recording (fucking finally), 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, invertion, 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 optimised 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