Max for Eigenharp

Using Max/MSP to control the Eigenharp

Splits, layers and tuning

In this article, I describe the approach I used in Max to implement keyboard splits and layers and configuring a desired tuning. I assume you are using the basic OSC setup described in an earlier article and that EigenD is running.

You should open the object [Eigen.OSCInputV2] in its own patcher or instantiate it in some other patcher that will remain open. This object takes care of receiving incoming OSC data and converts it into a format that’s usable with standard Max objects. The object makes the data available through four [send] objects though which packed data is available:

  1. [send EigenKeyInfo]
    KeyNumber, Velocity (0 velocity means the key was released)
  2. [send EigenX] – horizontal key movement
    KeyNumber, Value (-16,000 … 16,000)
  3. [send EigenY] – vertical key movement
    KeyNumber, Value (-16,000 … 16,000)
  4. [send EigenZ] – pressure
    KeyNumber, Value (0 … 32000)

On the Alpha, the KeyNumber will be between 1 and 132 (120 main keys and 12 percussion keys). While you are free to just [Receive] these values directly and do whatever you want, a number of convenient objects have been created that receive these values internally and convert them to information that’s more usable within Max.

The [Eigen.Alpha.Keygroup]

This object, taking four arguments (minRow, maxRow, minColumn, maxColumn), produces output when you touch a key on the Alpha that is within the rectangle defined by the four arguments.


This object produces output when you touch a key in any of the 5 columns of the first three rows of the keyboard.

This object produces output when you touch keys between row 5 and row 8 but only if they are within columns 2 or 3.

The four outlets each sent out a list of three values, the first two of which are normalized row and column numbers starting at 0,0. This is important. For every keygroup that you define on the Alpha, the row and column value of the first key of that keygroup will always be 0,0.

So in this example, I pressed the key that is located in the third column on the seventh row of the Alpha.

The third value of the other three outlets are the current Z, Y and X values for the key.

The Eigen.Alpha.Keygroup object is typically not used in isolation. Instead, its outputs are connected to an object that will convert the row and column information into a musical scale with the keys mapped to a suitable fingering. Although I have created several objects for different tunings (to show it can be done), personally I to use a single tuning where the keys are the same as the top 5 strings of a 6 string guitar. (Yeah, I wish there was a 6 column version of the Alpha).

The [Eigen.Scale.Guitar]

This object, taking 2 arguments (firstNoteValue, MidiChannel) accepts the outputs of an Eigen.Alpha.Keygroup and produces values that can be fed directly into a [midiformat] object and then on to [midiout]


Here, the entire Alpha main keyboard is used (rows 1 through 24, columns 1 through 5) and the very first key on the Alpha will produce MIDI note 36. The second parameter is the MIDI channel to be used for the event. This is optional and is useful if you have multiple splits setup on the Alpha and want all notes to go to different sounds on the same MIDI device.

I created some other tunings (Eigen.Scale.Violin, Eigen.Scale.Major, Eigen.Scale.Minor) that are included with the library but I never use them myself.

By the way, layering is trivial. Just connect a single [Eigen.Alpha.Keygroup] to multiple [Eigen.Scale.Guitar] objects.

In this example, the entire keyboard is sent to two different “tunings” that will use two different MIDI channels (if needed) and are an octave apart.

Have fun.

, , ,

Leave a Reply

Your email address will not be published. Required fields are marked *