Short post today to design the MIDI Editor interactions to my liking.

This is all text, and ideas for my interaction with the MIDI editor on a fairly basic level. I’m posting this to get feedback and let myself sit on it before I start changing a bunch of actions.

Currently using REAPER 6.16

Contents

Introduction

If you’ve read the previous posts then you’d know that I prefer working 100% keyboard if possible. This means that I need a few general commands:

  • Reset - Go back to a known state, regardless of the current state
  • Cursor Movement - Ways to quickly move the cursor to a point
    • I don’t want to be pressing the arrow key 40 times to get somewhere. < 3 (nearby!) key presses should get me to 80% locations.
  • Selections - Select notes:
    • Relative to the current selection.
    • Relative to the cursor.
    • Inside a time selection.
  • Data movement - Move a note to common places.
  • Place a note at the current cursor position.
    • Via MIDI
    • Computer keyboard, at a given octave.
  • Split notes
    • At cursor
      • Only selected notes?
    • At time selection
      • Only selected notes?
  • Change note length
    • All selected notes to cursor
    • Nearest selected note to cursor, all others expanded by that delta.

I’m not considering MIDI cc, as I believe that’s almost universally best input via mouse or MIDI controller. I may change my mind at some point though.

A note on note movement

NOTE - Assuming 12-tet, because that’s all I work in anymore.

I’m a believer in composability of keyboard commands, which implies some sort of grammar.

Start with a set of clear, non-complex commands, then build up larger actions from these commands. Western music allows me (us?) to build a dictionary of 4 commands:

  • Semitone
  • Octave
  • Minor Third
  • Major Third

Thirds

Most western harmony is built on thirds, and even when it isn’t - it is. Let me go through every interval up to 13ths and map out the use of the previous 4 commands:

  • (s)emitone - 1 semitone shift.
  • (O)ctave - 12 semitone shift.
  • Minor (t)hird - 3 semitone shift.
  • Major (T)hird - 4 semitone shift.

Now how these can be composed for quickly moving notes using the letter in the parentheses. + for shift up in pitch, - for shift down in pitch.

Any of these commands can be executed in any order, and b9 and higher are the same, but with O prefixed.

  1. Minor 2nd - s+
  2. Major 2nd - s+ s+
  3. Minor 3rd - t+
  4. Major 3rd - T+
  5. Perfect 4th - T+ s+
  6. Aug 4th/Dim 5th - t+ t+
  7. Perfect 5th - T+ t+
  8. Aug 5th - T+ T+
  9. Major 6th - O+ t- or T+ t+ s+
  10. Dominant 7th - O+ s- s- or T+ t+ t+
  11. Major 7th - O+ s-
  12. Octave - O+

The worst case scenario is the dominant 7th, and 9th to 15th with 3 key presses. With some practice it should be possible to type these approximately as fast as reaching to grab the mouse or a single command with modifier keys.

This is a form of binary search, I guess a quaternary search?

Not Thirds

I hope the astute reader was rolling their eyes a bit at the last part. What’s easier than the above? Playing it on an instrument.

The major of input will be from the piano for me, however there are times where I will want to select a note and make a small change or when I want to work on my laptop.

I will be setting this up though!

Step Input

Step Note Input Flow?
Step Note Input Flow?

Most DAWs have some concept of “Step Input”. The idea is that cursor control is driven by input, and cursor movement and note length are controlled by a grid value.

  • Either:
    • Input on MIDI controller
      • Note is created at grid length (or separate note length parameter)
    • Input command (or out of the way MIDI note) that either:
      • Moves the cursor forward by the grid amount or
      • Moves the cursor backward by the grid amount.
  • Cursor moves by grid length
  • Input new note or
    • Change grid size.

As a bonus I like if I have some way to:

  • Select notes at cursor via MIDI
  • Input MIDI data (cc/pitch/etc…) at cursor.
    • Optionally interpolate data between nearest two points to the cursor

Then I’m quite happy.

Temporal movement

It’s time for time!

Once again, n-division narrowing buys us a lot of functionality with few commands:

  • Jump - Move to an arbitrary time or a time >3 bars away.
  • Move to start of measure
  • Move by grid (!)
  • Move to nearest pitch by pitch-class

Grid

The existence of a grid simplifies cursor movement, and note length and selection.

I generally only use the following grid positions, which I believe are enough to get to the common locations in 3 or fewer key presses.

  • 1 measure
  • 1/2
  • 1/4
  • 1/4t - 5 (one key above 1/4)
  • 1/8
  • 1/8t - 9 (one key above 1/8)
  • 1/16
  • 1/16t - 7 (one key above 1/16)
  • 1/32

The bolded number is the hotkey I use, this is non negotiable since I already use these in other DAWs.

(Note that triplets are DivisionNumber+1.)

Selection

Thus far I’ve discussed topics that allow me to work on individual notes in some manner (besides piano input). MIDI editing and input require working on multiple notes at a time which means some method of marking notes to be worked on.

There’s two dimensions of selection necessary:

  • Time
  • Pitch, or “notes”

Time is contiguous in most linear DAWs, so I won’t concern myself with multiple time selections.

Note selection is often non-contiguous. I believe the best method is to have a method of selecting all notes at the cursor via MIDI input. If that’s not an option, then I will need to rethink.

Note Split

Note split can happen with a time selection or at the cursor. There are two types of selections:

  • Pitch - Split all notes selected by pitch at the cursor.
  • Time - In/Out points should split all pitch selected notes at the cursor.

I’d like “At cursor” and “At selection” to be separate commands. I don’t think that I’ll use different selection commands such as “at start”, “at end” and “both”.

Note Length

Given a number of selected notes, it should be possible to do two actions:

  • Move the end of all notes to the cursor.
  • Find the note off nearest to the cursor:
    • Determine the distance between that note-off and the cursor.
    • Adjust all selected note lengths by that amount.

Summary

This is a brain dump of thoughts about MIDI note editing. Almost all of these apply to item editing as well.

I welcome comments about things I missed or ideas to explore.

Meta

This post took:

  • 5 hours to write.