Skip to content

Create mechanism to programmatically navigate rendering #158

@jaredjj3

Description

@jaredjj3

Requirements

From #118, #122, and myself, the requirements are:

  • The cursor can accept position instructions. Callers should be able to specify time, position (x, y), measure index/number with or without repeat information, next(n), previous(n), and the cursor should update its position accordingly.
  • vexml can generate default position instructions coupled to time.
  • The cursor provides information about the active elements, including provenance information about the MusicXML that is associated with the active elements.
  • The cursor emits events: activeelementchange, positioninstructionreceived, cursorexhausted, etc..
  • The cursor's visibility is toggleable.
  • A rendering can accommodate multiple cursors. Each cursor is agnostic to one another and therefore it is the caller's responsibility to coordinate them.
  • Cursors can be styled.
  • Cursors can be interpolated between voice entries or they can snap to the closest voice entry given the last position instruction.
  • Cursors can navigate through entire voice entries or they can navigate individual elements within a voice. The former is typically more useful for reading music, while the latter is more useful for editing MusicXML.

Hints

I would like something that is derived from the *Rendering object tree that accomplishes all of these things. Right now, the *Rendering object tree expose the underlying vexflow objects, but I would like callers to not have to interact with that.

I recommend creating a new library within this project called cursor, which will house all the logic needed to accomplish the requirements. Consider converting the *Rendering object tree to something more useful for the cursor as a first step, which will also have the benefit of decoupling cursor from rendering. That way, if rendering has to change significantly, the cursor library should only need to be updated in one place.

Inspiration

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions