Releases: DCMLab/reductive_analysis_app
v1.0.0-initial-release
With a new UI, a new tutorial screenshot sequence, and some other fixes compared to v0.8, it is time to call this a proper release. I expect there to be still plenty of bugs, and there are certainly more features planned and wished for, but this is definitely as good a place as any to call this project Ready for a First Release.
v0.8-new-ui
This is, by far, the biggest update of the app yet, and has been a long time coming.
The most obvious user-facing improvement is a new look and experience. Among dozens of other changes over and under the hood:
- Packaging and development environment based on Vite (with a detour via Webpack during development).
- Layers and views are uniformly exposed to the UI; layers can now be selected to be editable and/or saved to the output MEI on a case by case basis.
- A facility is provided for copying and pasting relations (shift-C & shift-V); this feature has interesting implications and is quite limited at the moment. A good area for thoughtful improvements.
- Internally, files are now modules, with explicit imports and exports, making it easier to tell what is or isn't used, from where, and how.
- An entirely new MIDI player component, with a new sound-font.
- Noticeably more responsive UI.
- Updates to the navigation features.
- Improved graphics for relations, tooltips etc.
- Cross-browser keyboard shortcuts.
- LICENSE and license headers everywhere.
- Many iterative bumps to Verovio versions.
Navigation
This release collects several UI and functionality improvements. In particular
- Notes can now be set as bookmarks that can be scrolled between using "Next" and "Previous"
- There are buttons to scroll screenwise "Left" "Right", and view/layer-wise "Up" and "Down"
- Selections can be made by dragging and not just clicking
- Hovering over a (meta)relation now shows its type in a tooltip
- There is a minimap showing the entire drawn area, which can be clicked on to navigate quickly
- There is a redo stack as well as the undo stack
Along with various other bugfixes and tweaks.
Visuals, additional data, and alternative visualisations
The most visible change in this release is the big UI upgrade (thanks @yrammos!) that helps keep things nicely compact and out of the way while allowing access when needed. This is especially relevant since there were a number of new features that needed input fields in the UI this time. In particular:
-
In addition to adding just one relation per click or keypress, there is now the option to add "comborelations", i.e. two relations with one click. The basic idea is that e.g. a two-sided neighbour relation additionally implies a repeat relation between the outer members of the neighbour relation, so a comborelation can be configured in
conf.js
with one "total" and one "outer" relation type. The hierarchy of the "total" relation will always be that the outer pair of member notes will be primary, while the inner ones are secondary. However, the selection the user makes will in terms of primary/secondary selections will be reflected in the "outer" relation. E.g. a selection of a C-D-C movement with only the first C being selected as primary would (with a "neighbour comborelation" operation) result in a "neighbour" relation with the two C's as primary and the D as secondary, as well as a "repeat" relation, with the first C as primary and the second as secondary. -
There is a metadata entry field for the file. This currently does the job, but does not cover a very large portion of the MEI spec relative to the many, many possibilities for metadata it has. In short, one can set the title and composer of the score, and additionally have other roles related to the analysis being entered. In particular, the default set of roles (as set in
conf.js
) isanalyst
andannotator
. These roles can additionally be responsible for specific (meta-)relations, which is set by selecting the relations and clicking the appropriate "Assign responsibility" button. -
There is an input/output facility to interact not just with graph analyses but also tree analyses, both from existing encoded
eTree
elements as described by Rizo and Marsden (and in saving to that format), but also in a way that interacts with the tree annotation app written by Christoph Finkensiep and Daniel Harasim here. The code is once-again fairly bare-bones, but functional. "Aligning" a tree entails associating each leaf of the tree to a specific note in the score. If the number of leaves matches the number of notes, this can be done automatically - otherwise the correct number of notes must be selected (or a relation of the same number of notes). -
Another tree-like visualisation option is to show the graph not in the score but above it, drawn such that if note A is primary in a relation where B is secondary, A is higher up than B. This is done with the "Show/update hierarchy" button. Note that the trees and hierarchies are drawn in the same space, so drawing one will replace the other. Relations can be selected from the hiearchy as well as from the score.
-
Basic support for slicing has been implemented. A new layer can now be constructed to be not just the exact same notes, lacking those hidden but otherwise the same, but instead the new layer score can be_sliced_, such that each measure contains exactly one set of onsets - one measure for each set of onsets in the score, as given by Verovio's MIDI rendering. This, again, is not a Finished feature, as much as it is a basic functionality on which to build additional features.
-
There is a new slider to control the width of the relations, which should work dynamically, and affect all visible relations, which greatly helps with visibility in many situations.
Added notes
This version includes the major missing feature blocking it being possible even in the abstract to input Schenkerian analyses into the app format - implied tones. In short, one can now add new notes in the analysis layers (i.e. not the topmost), using a specific mode. Accidentals are not handled at the moment, and the drawing is somewhat basic, but the functionality is there.
Additionally, the old codepath has been excised, bringing the codebase into better shape for future features.
There are also, as usual, a number of additional improvements, bug fixes, refactorings, and so on, including
- A better notification of what elements are selected (thanks @yrammos)
- A new basic test for reductions and undoing reductions.
- The
delete
code has been moved to its own file, and now works also on metarelations - Libraries are now in
lib/
instead of cluttering upjs/
- Additional documentation, and general cleanup of cosmetics and indentation
- MIDI playback of reductions are now per view
Layers
This release introduces layers, which are new score
elements in the MEI with some notes missing. The next release will also allow these new layers to contain new notes, added by the annotator. In addition to this major change, there are a number of smaller restructurings, improvements, and general better organisation.
- Certain things (such as reductions) are more tightly connected each view, rather than being global, both graphically and in the code.
- We use CSS classes instead of direct style annotations in most cases.
- Quite a lot of the deprecated codepaths have been moved to
js/old.js
- all of that code will be removed after this release. - How the code navigates the various instances of
<graph>
nodes, MEI elements and SVG elements has been clarified. In general, by usingget_id
one reaches a "topmost" ID for whatever element you are looking at (in the case of views and layers), and then various mappings and additional links are used to search for the correct element being sought in the specific situation. - A number of globals have also been removed or moved to
old.js
. In short there is a single MEI that is relevant, and a number ofdraw_contexts
, as well as a number oflayer_contexts
. These are not the only ones, but the major ones. Some/many of the rest might eventually be moved to be per-view configurations instead. - A number of code repetitions have been extracted into separate procedures or functions (
new_view_elements
,button
,add_buttons
,onclick_select_functions
,finalize_draw_context
,note_to_rest
, etc.) - A bunch of smallish documentation has been added here and there (notably in
js/utils.js
).
All in all, a major bunch of code, some more complexity, but also some better structure, and better structure for the future. Next up: adding notes!
Pre-refactor release
This is the final release to use the old global-oriented codepaths. These will remain in the next release as deprecated code in a separate file, but will be removed in the release after that. There are also numerous other improvements in addition to the work that has prepared this major refactoring, not limited to:
- A basic testing framework and an initial set of tests (thanks to @yrammos)
- Better separation of style from code by using CSS classes and parameters instead of direct inline changes to the style
- Code separation into multiple files to make the structure easier.
- Giving the option to selectively undo just reductions
- Add relation scrolling by keyboard command in addition to scrollwheel
Single-view relations version
After some intense work post-ISMIR, some major bugs have been squashed, and the refactor hyperedge -> relation has been completed, along with a number of nice new features:
- Better UI, including lots of highlighting of various elements on hover or select, and smarter handling of greying out of secondaries
- MIDI playback of the full or reduced score. This works best pre-rerendering
- Updated to the latest Verovio version
- Basic loader script for looking at annotated graphs using NetworkX (for the graph) and Music21 (for the music theory) in python
ISMIR 2020 version
As shown at the ISMIR 2020 LBD track.