Events

Overview

Although understanding Compositions and Parts is vital to using Mass, neither of them actually output any messages to your MIDI gear. That responsibility is left entirely to the Events. That said, Events are incapable of performing their functions without data from the Parts that contain them. This symbiotic relationship is a core feature of Mass, however it is largely explained in other sections. This section focuses on understanding what an Event is, and how they use the most central piece of information: Part positions.

Event Parameters

Conceptually, Events are generic objects. Parts own Events, and Compositions own Parts. So how does one Event cause a note to play, while another sends a CC? Events achieve this by using parameters. Each Event has 1 or more parameters, and each Event type contains the exact parameters it needs to perform its function.

All parameters an Event owns display in the UI editor(s), and will immediately change to reflect the new parameter set if the Event's type is changed.

How Event values are determined

Events are always contained within a Part, and Parts always have a position within the Composition. Each time a Part moves, it notifies its contained Events of the new position, and each Event utilizes its parameters to set its internal values. What the "internal value" represents, and how it is computed, is entirely up to the parameter.

However, there are some basic constants:

  • Part positions are almost always used as a percentage
    • ex: a MIDI CC parameter uses the position as a percentage from 0 to 127 (if using MIDI1)
    • ex: a MIDI note parameter uses the position as an index into the note set
    • ex: Transpose parameters use the position as an index into the root set or scale set
  • Each parameter is tied to a single axis, allowing two value parameters per Event
    • ex: Note Events have a parameter for note, and another for velocity
    • ex: CC Events are able to assign a CC value to each axis
    • ex: Transpose Events have a parameter for root, and another for scale

Astute readers may notice that the Impulse Event type is left out of the constants above. Impulse Events do not like to follow conventions. They are agents of chaos.

Event types

Every Event can be set to one of the available types, and then further configured based on the parameters for that type.
Screenshot 2024-10-16 at 2.49.52 AM.png