From 04e26cbfd8f93313fd57720efe7b5851e625846f Mon Sep 17 00:00:00 2001 From: Johannes Hentschel Date: Tue, 16 Jan 2024 12:16:06 +0100 Subject: [PATCH] docs: converts CHANGELOG rst => md and adds the release-please workflow --- .github/workflows/release-please.yml | 20 + CHANGELOG.rst | 813 ----------------------- docs/CHANGELOG.md | 951 +++++++++++++++++++++++++++ docs/index.rst | 2 +- 4 files changed, 972 insertions(+), 814 deletions(-) create mode 100644 .github/workflows/release-please.yml delete mode 100644 CHANGELOG.rst create mode 100644 docs/CHANGELOG.md diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 00000000..52c3cdb0 --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,20 @@ +on: + push: + branches: + - main + +permissions: + contents: write + pull-requests: write + +name: release-please + +jobs: + release-please: + runs-on: ubuntu-latest + steps: + - uses: google-github-actions/release-please-action@v3 + with: + release-type: python + package-name: dimcat + changelog-path: docs/CHANGELOG.md diff --git a/CHANGELOG.rst b/CHANGELOG.rst deleted file mode 100644 index c7641b4d..00000000 --- a/CHANGELOG.rst +++ /dev/null @@ -1,813 +0,0 @@ -========= -Changelog -========= - -Version 2.4.0 -============= - -* adds ``git_revision`` and ``git_tag`` to frictionless JSON descriptors whenever the git repo is clean (5b76a815) - - * This includes the new property ``Corpus.repo`` that makes the ``git.Repo`` object available if applicable. - -* adds ``--force`` to ``ms3 compare`` and ``ms3 review`` commands, allowing to output comparison files (potentially - including the ``compared_against`` metadata key) even if no differences were found (5b76a815) - - -Version 2.3.1 -============= - -Ignoring pandas 2.1.0 FutureWarning which cause some intimidating output when using the ms3 precommit hook. - -Version 2.3.0 -============= - -- Adds ‘ms3 precommit’ and makes the repo usable as a hook by - @johentsch in https://github.com/johentsch/ms3/pull/106 - - - The new ``ms3 precommit`` command is simply a wrapper around - ``ms3 review`` that accepts the ``--files`` arguments as - positional arguments. This is required for the command to be - useable as an entry point for a `Git - pre-commit `__, which passes the paths of - modified or added files as positional arguments. In addition, the - command executes ``git add -A`` after the review so that all - changed files are included. - - This is to work in the first version of the new, localized, DCML - annotation workflow that runs on the annotator’s machine before - committing, rather than on a GitHub runner after pushing. Things - that might be changed in the future: - - - The ``ms3 precommit`` command could convert the positional - arguments into a regular expression to be passed to - ``-i/--include`` instead of using the deprecated ``--files``. - - At some point a mechanism might be needed that makes it - possible for the hook to ignore warnings that were already - there, i.e., which are not caused/added by the current commit. - Currently one would have to remove ``--fail`` from the repo’s - args configuration but that would let all warnings pass and - would be besides the point. - - - New method ``score.mscx.update_metadata()`` to facilitate (manual) - updating of the key-value pairs. - - Comparison files come with the metadata key - ``compared_against=`` when the comparison has been - performed against a particular git revision. - - ``"LATEST_VERSION"`` is now accepted as argument to - ``git_revision`` and resolves to the latest version tag (falling - back to the current HEAD if the repo has no tags) - -- Extended excerpting functionality by @leobruneau in - https://github.com/johentsch/ms3/pull/105 - - - It is now possible to replace head and tail of an excerpt with - rests. This does not look pretty but it is an easy way to create - audio excerpts starting and ending at the given points in time. - - It is now possible to set an arbitrary tempo by inserting an - invisible metronome mark at the beginning of excerpts. - - ``score.mscx.store_phrase_excerpts()`` makes use of this to omit - notes before and after the actual phrase - - new methods accessible via ``score.mscx``: - - - ``store_measures()`` - - ``store_within_phrase_excerpts()`` - - ``store_phrase_endings()`` - - ``store_random_excerpts()`` - - - -**Full Changelog**: https://github.com/johentsch/ms3/compare/v2.2.2...v2.3.0 - -Version 2.2.1 -============= - -* Form label columns by @johentsch in `https://github.com/johentsch/ms3/pull/98`__ - - * catches exception when resource descriptor cannot be generated - * creates IntervalIndex based on the ``quarterbeats_all_endings`` column - * always stores form_labels with a single column level instead of MultiIndex - -**Full Changelog**: https://github.com/johentsch/ms3/compare/v2.2.0...v2.2.1 - -Version 2.2.0 -============= - -What’s Changed --------------- - -- Changing the instrumentation to “Drumset” by @arinaLozhkina in - `https://github.com/johentsch/ms3/pull/84`__ - - - More robust updating of score instrumentation by modifying - ``metadata.tsv`` and calling ``ms3 metadata --instrumentation`` - - Ensures playback with the correct MIDI instrument - - Handles a change to ``Drumset`` correctly in terms of changing - clef, removing key signature, and playback - -- MSCX class API for creating score excerpts by @leobruneau in - `https://github.com/johentsch/ms3/pull/91`__ - - - score excerpts can now be stored using - ``score.mscx.store_excerpt()`` - - batch excerpt creation via ``MSCX.store_phrase_excerpts()`` and - ``MSCX.store_random_excerpts()`` - -- Improved algorithm for computing ``mc_offset`` including bugfix by - @johentsch in `https://github.com/johentsch/ms3/pull/95`__ -- Updated schema mechanism following the first trial by @johentsch in - `https://github.com/johentsch/ms3/pull/97`__ - - - ``quarterbeats_all_endings`` column now added to all facet - dataframes by default - - schema URLs now use the dedicated - `DCMLab/frictionless_schemas `__ - and the amount of required schemas was reduced drastically - - - no schemas are stored for ``events`` anymore - - ``rests`` and ``notes_and_rests`` do not include non-sensical - empty columns anymore - - ``chords`` is the only remaining facet where the abundance of - schemas due to high combinatoriality of column names is - (somewhat) justified. - - - Renamed columns: - - - in unfolded dataframes, ``quarterbeats`` is now called - ``quarterbeats_playthrough`` - - in the ``chords`` facet, ``metronome_visible`` is now called - ``tempo_visible`` - -- documentation now hosted at `https://ms3.readthedocs.io/`__ - -New Contributors ----------------- - -- @leobruneau made their first contribution in - `https://github.com/johentsch/ms3/pull/91`__ - -**Full Changelog**: -`https://github.com/johentsch/ms3/compare/v2.1.1…v2.2.0`__ - - -Version 2.1.1 -============= - -* Message headers in ``.warnings`` files now come without trailing `` --``. -* This version is able to correctly IGNORED_WARNINGS even if the header ends on a trailing `` --`` (copied from a - ``.warnings`` file generated by an older version of ms3). -* adds the low-level function :meth:`ms3.bs4_parser._MSCX_bs4.make_excerpt` that returns the new object type - ``ms3.bs4_parser.Excerpt``. High-level API in preparation (#91). - -Version 2.1.0 -============= - -This update includes a few minor bug fixes but some heavy updating of the code internals: - -* pandas>=2.0.0 is now supported -* the ``@function_logger`` decorator has been removed and replaced with a function argument that defaults to the - ``module_logger`` -* all modules which have seen a commit since the previous tag have been fully linted using pre-commit hooks -* the filelock problem that made a couple of test fail under Windows since the early days has been resolved (by using - pytest's ``tmp_path`` fixture instad of ``NamedTemporaryFile``). -* ``make_ml()`` (responsible for creating measure tables) was refactored and should be much more legible (and easier - to adapt and extend in the future) - - -**Full Changelog**: `https://github.com/johentsch/ms3/compare/v2.0.1...v2.1.0`__ - - -Version 2.0.1 -============= - -* Allow metronome mark to appear in MC 2 - -Version 2.0.0 -============= - -Breaking changes ----------------- - -* Renamed MultiIndex levels: - - * The column ``fname`` has been renamed to ``piece``. This concerns especially ``metadata.tsv`` where it is used as - index, but also the MultiIndex of concatenated facets such as those output by ``Parse.get_facet()`` or ``ms3 - transform``. - * The last (right-most) index level, which used to be called ``_i`` in some cases, is now consistently called - ``i``. - -* When extracting TSV files: - - * The possibility to assign custom suffixes to the extracted facets has been replaced by default suffixes separated - by a full stop. For example, the notes for the MuseScore file ``MS3/filename.mscx`` will be extracted to - ``notes/filename.notes.tsv`` by default. - * Every extracted TSV file comes with a JSON descriptor file following the - `frictionless specification `__ for metadata. This replaces the - ``csv-metadata.json`` files that were following the `CSV on the Web `__ specification. - * The frictionless schemas used in the JSON descriptor files are stored in the ``schemas`` folder of the ms3 - package in YAML format. Their filenames are truncated hashes computed from the included column/field names and - they are stored in a folder pertaining to the facet in question. This comes with the advantage that schemas do not - have to be written out in every descriptor: Instead, the ``schema`` field contains the URL of the schema file, - allowing to update the schema specifications at a later point, e.g. with added or more elaborate descriptions. - * Validation errors are written into ``.errors`` files stored next to the resource descriptor in question. - -* The command ``ms3 transform``, by default, outputs the concatenated facets as a single ZIP file that comes with a - `frictionless DataPackage descriptor `__ (for the parameters added to the - command, see below). The concatenated files are now named ``..tsv`` (previously - ``concatenated_.tsv``). - - -New features ------------- - -* It is now possible to batch-edit the instrumentation in many scores at once by changing the relevant column(s) in - ``metadata.tsv`` and calling ``ms3 metadata --instrumentation``. -* Since ``ms3 transform`` now outputs zipped `frictionless DataPackages `__ by - default (meaning that all concatenated facets are described in the same package descriptor JSON file), it comes with - additional parameters: - - * ``--unzipped`` to output the package as uncompressed TSV files rather than as single ZIP file. - * ``--resources`` to create a frictionless resource descriptor per concatenated facet instead of a package descriptor. - * ``--safe`` to prevent overwriting existing files. - -* The ``ms3 extract`` command now has a ``--corpuswise`` option allowing to parse and extract one corpus after the - other, avoiding the need to parse all scores at once and keep them in memory before beginning the extraction. -* The parser throws a warning if a score does not have a metronome mark at the beginning (which can be hidden). This is - to encourage the inclusion of information on the basic beat unit (in 6/8 meter, e.g., the metronome unit is typically - a dotted quarter) and pace to every score for better comparability. - -Bugfixes --------- - -* For the ``IGNORED_WARNINGS`` file. -* For the ``--threshold`` argument of the ``ms3 review`` command. -* Writing and reading the ``volta_mcs`` column of ``metadata.tsv``. -* #60, #63, #78, #79 - -Internal changes ----------------- - -* ``utils.py`` has been turned into a Python package containing the mocules ``constants``, ``functions``, and - ``frictionless``. -* Not using the ``frac`` alias for ``fractions.Fraction`` anymore. -* The version number is not manually stored as a constant, instead it is automatically written into ``_version.py`` - upon initialization. - -Other ------ - -This version contains the final version of the paper *A parser for MuseScore 3 files and data factory for annotated -music corpora* -for publication in the Journal of Open Source Software (JOSS). - -Version 1.2.12 -============== - -This last version of ms3 1.x uses the _version.py file introduced in 8f40b16. - -Version 1.2.11 -============== - -* stops writing the version of ms3 into the `.warnings` files to avoid merge conflicts -* bugfixes for - * handling IGNORED_WARNINGS - * ms3 review command - * overview table written to README - -Version 1.2.10 -============== - -* merges old_tests with new_tests -* correct handling of ``labels_cfg`` -* refrains from calling ``logging.basicConfig()`` -* unknown TSV types now default to ``labels`` -* ``conti`` now recognized as abbreviation for "continuation idea" -* suppresses warnings about multiple "Fingering_text" values - - -Version 1.2.9 -============= - -* when updating ``README.md``: - - * make 2nd-level heading ``## Overview`` (instead of first-level) - * don't output ms3 version (to avoid merge conflicts) - -* small bugfixes in ``ms3 review`` command - -Version 1.2.8 -============= - -* operations.insert_labels_into_score() filters pieces exactly one facet to be inserted (e.g. ``labels``), - not a fuzzy regex (e.g., which would include ``form_labels`` in the filter) - -Version 1.2.7 -============= - -* warning files omit system-dependend information from warning headers (6764476) -* bugfixes - -Version 1.2.6 -============= - - -* changes the behaviour of the ``ms3 review`` command - * after coloring out-of-label notes, issue one warning per dubious label - * rather than one `warnings.log` file per corpus, create one `.warnings` file per piece in the `reviewed` folder -* makes ``ms3 empty`` work under the new CLI (d8f661a) - -Version 1.2.5 -============= - -* :obj:`~ms3.Corpus` and :obj:`~ms3.Piece` come with the new method ``count_pieces()`` -* ``ms3 transform -D`` to concatenate only metadata works -* ``View.fnames_with_incomplete_facets = False`` enforces selected facets if some have been excluded - -Version 1.2.4 -============= - -* segment_by_criterion warns if not IntervalIndex is present d2602617 -* adds missing arguments 'unfold' and 'interval_index' to Piece.get_parsed() 71f8c3e4 -* when iterating through pieces, skip fnames that don't have any files under the current view fdce948f - - -Version 1.2.3 -============= - -**ms3 requires Python 3.10** - -* Piece.get_facet() gets parameter 'force' which defaults to False (analogous to the other methods), - in order to avoid unsolicited score parsing. -* improves ``ms3 transform``: - * parse only facets to be concatenated (rather than all TSV files) - * do not accidentally output metadata if not requested -* prevents including 'volta_mcs' in metadata of pieces that don't have voltas - -Version 1.2.2 -============= - -**ms3 requires Python 3.10** - -* removes deprecated elements from tab completion -* enables view settings when adding new corpora to Parse object -* small stuff - -Version 1.2.1 -============= - -**ms3 requires Python 3.10** - -* enables hiding the info prints in operations.insert_labels_into_score() -* adds `filter_other_fnames` argument to Corpus.add_dir() - -Version 1.2.0 -============= - -**ms3 requires Python 3.10** - -Extraction of all lyrics ------------------------- - -This version enables the extraction of lyrics with all verses. Previously, only the last verse's syllable for any -given position was extracted. The lyrics now can be found in `lyrics_[verse]` columns in the chords facet, -where `lyrics_1` corresponds to the first or only verse. - -Extraction of figured bass --------------------------- - -Figured bass labels can now be found in the chords facet tables. Score that include at least one figure will have a -``thoroughbass_duration`` column and each layer of figures comes in a separate ``thoroughbass_layer_#`` column. -For example, if all stacks of figures have only layer, there will be only the column ``thoroughbass_layer_1``. - -Extraction of custom-named spanners ------------------------------------ - -Spanners with adjusted "Begin text" property get their own columns in the chords tables, containing the relevant subselection of IDs. -For example, if a score contains normal ``8va`` spanners and others where the "Begin text" has been set to ``custom``, -all IDs will be combined in the column ``Ottava:8va`` as before, but the subset pertaining to the custom spanners is -additionally shown in the column ``Ottava:8va_custom``. - -Including and excluding paths ------------------------------ - -It is now possible to specify specific directories to be included or excluded from a view, not only folder names. - -New methods and properties --------------------------- - -* ``Parse.get_facet()`` (singular) -* ``Corpus.fnames`` -* ``Corpus.add_dir()`` -* first version of ``utils.merge_chords_and_notes()`` - - -Version 1.1.2 -============= - -**ms3 requires Python 3.10** - -* Refines the new "writing score headers" functionality and makes it non-default. User needs to - set ``ms3 metadata --prelims`` which replaces the flag ``--ignore`` that had been introduced in 1.1.1. -* A couple of bug fixes, including a very important one regarding conversion of fifths introduced with b0ce8a1d - -Version 1.1.1 -============= - -**ms3 requires Python 3.10** - -* enables updating score headers from the respective `metadata.tsv` columns - (`title_text`, `subtitle_text`, `composer_text`, `lyricist_text`, and `part_name_text`) -* Parse, Corpus, and Piece now come with the method keys() - -Version 1.1.0 -============= - -**ms3 requires Python 3.10** - -This version does not throw errors when trying to parse files created by MuseScore 4. Parsing these files has not -sufficiently been tested but so far it was looking good. The fact that MuseScore 3 is able to read such files shows -that not much has changed in the file format itself. - -The command ``ms3 convert`` has been updated to support MuseScore 4 executables. With the current MuseScore 4.0.0 this -is not quite straightforward because conversion to ``.mscz`` via the commandline isn't currently working and conversion -to ``.mscx``, if it works at all, deletes the contents of the target directory -(`issue #15367 `__). The new function -``utils.convert_to_ms4()`` offers a workaround that creates temporary directories to store the -"Uncompressed MuseScore folder" and then copies the ``.mscx`` file to the target directory (default) or zips the -temporary directory into an ``.mscz`` file (parameter ``--format mscz``). For all other target formats, the output -will correspond to what the MuseScore 4 executable yields. - -Version 1.0.4 -============= - -**ms3 requires Python 3.10** - -ms3 has gotten a makeover and does not quite like it did before. The major changes are: - -* The library is now optimized for one particular folder structure, namely ``[meta-corpus ->] corpus -> piece``. -* ms3 now comes with a full-fledged "views" feature which lets you subselect files in manifold ways. -* The TSV outputs have gained additional columns. In particular, all TSV files now come with the column ``quarterbeats`` - reflecting each event's offset from the piece's beginning. -* Warnings concerning irregularities, e.g. wrong measure numbering due to a cadenza, can now be sanctioned by copying - them into an IGNORED_WARNINGS file. - - -New features ------------- - -* Each object that the user interacts with, ``Parse, Corpus, and Piece``, comes with at least two views, called "default" - and "all". The "default" view disregards review files, scores in convertible formats, and scores that are not listed - in the top-level ``metadata.tsv`` file. -* ``metadata.tsv`` files, by the virtue of their first column ``fname``, now serve as authority on what is - included in the corpus and what belongs together. This column is always unique and supposed to be used as index. -* Suffixed ``metadata_.tsv`` files are loaded as available views based on the column ``fname`` (other columns - are disregarded). -* The Parse object now detects if the passed directory contains individual corpora or if it is a corpus itself. -* Parse objects perform operations by iterating over Corpus objects. -* Corpus objects perform operations by iterating over Piece objects. -* Corpus objects reflect exactly one folder, the ``corpus_path``, and always discover all present files (which can be - filtered before the actual parsing). Default output paths are derived from it. -* Piece objects unite the various files pertaining to the same ``fname`` and are able to keep multiple versions of the - same type apart (e.g., scores or annotation files) and pick one automatically, if necessary, or ask for - user input. -* The command ``ms3 review`` combines the functionalities of ``ms3 check``, ``ms3 extract``, and ``ms3 compare``, and is - now the only command used in the new ``dcml_corpus_workflow`` action. For each score that has DCML harmony labels, - it stores another score and TSV file with the suffix ``_reviewed``, in the folder ``reviewed``. - - * The score has all out-of-label tones colored in red and - * the TSV file contains a report on this coloring procedure. Both files are stored in the folder - ``reviewed`` on the top level of the corpus. - * **(1.0.2)** In addition, if any warnings pop up, they are stored in the top-level ``warnings.log`` file. - -* Inserting labels into scores is accomplished using the new method ``load_facet_into_scores()`` which comes with the - optional parameter ``git_revision`` which allows loading TSVs from a specific commit. -* Therefore, ``ms3 compare`` (and hence, ``ms3 review``) is now able to compare the labels in a score with those in a TSV file - from an older git revision. -* ``ms3 extract -F`` extracts form labels and expands them into a tree-like view in the output TSV. - -Changes to the interface ------------------------- - -* Many things have been renamed for the benefit of a more homogeneous user interface. - - * Methods previously beginning with ``output_`` were renamed to ``store_``. - * Parse.parse_mscx() => Parse.parse_scores() - -* The properties for retrieving DataFrames from ``Score`` objects: - - * are now methods and accept the parameters ``unfold`` and ``interval_index``. - * return None when a facet is not available. - -* Parsed scores and dataframes are always returned with File object that identifies the parsed file in question. This - is particularly relevant when using the ``get_facet()`` methods that may return facets from parsed TSV files or - extract them from the scores, according to availability. -* Gets rid of the argument ``simulate`` except for writing files. -* logger_cfg now as **kwargs -* **(1.0.3)** Currently the ``-d/--dir`` argument to ``ms3`` commands accepts only one directory, not several. - - - -Changes to the outputs ----------------------- - -* **(1.0.1)** When unfolding repeats, add the column ``mn_playthrough`` with disambiguated measure Numbers ('1a', '12b', etc.). -* The column ``label_type`` has been replaced and disambiguated into ``harmony_layer`` (0-3, text, Roman numeral, Nashville, - guitar chord) and ``regex_match`` (containing the name of the regular expression that matched first). -* Notes tables now come with the two additional columns ``name`` (e.g. "E#4") and ``octave``. For unpitched instruments, - such as drumset, the column ``name`` displays the designated instrument name (which the user can modify in MuseScore), - and have no value in the ``octave`` columns. -* For pieces that don't have first and second endings, the TSVs come without a ``volta`` column. -* Extracted metadata - - * **(1.0.1)** come with the new columns last_mc_unfolded, last_mn_unfolded, volta_mcs, guitar_chord_count, - form_label_count, ms3_version, has_drumset - * uses the column ``fname`` as index - * comes with a modified column order - * renames the previous column ``rel_paths`` to subdir, whereas the new column ``rel_path`` contains - * include the text fields included in a score. Columns are ``composer_text``, ``title_text``, - ``subtitle_text``, ``lyricist_text``, ``part_name_text``. - -* Upon a full parse (i.e. if the view has default settings), each facet folder gets a ``csv-metadata.json`` file following - the CSVW standard. This file indicates the version of ms3 that was used to extract the facets. The version is also - included in the last row of the README. - -Other changes -------------- - -Many, many bugs have died on the way. Also: - -* Most functions and methods now come with type hints. -* New unittest suite that makes use of the DCMLab/unittest_metacorpus repo and enforces it to be at the correct commit. -* The parser is now more robust against user-induced strangeness in MuseScore files. -* **(1.0.1)** Repetitions are unfolded for checking the integrity of DCML phrase annotations in order to deal with voltas correctly. -* **(1.0.3)** Pedal notes that have multiple (volta) endings, although still not being correctly propagated into each ending, - get propagated into the first ending, and don't cause propagation nor the integrity check to fail anymore - - -Version 1.0.3 -============= - -See above, version 1.0.4 - -Version 1.0.2 -============= - -See above, version 1.0.4 - -Version 1.0.1 -============= - -See above, version 1.0.4 - - -Version 1.0.0 -============= - -See above, version 1.0.4 - - -Version 0.5.3 -============= - -* recognizes metadata fields ``reviewers`` and ``annotators`` also in their singular forms -* adds column ``n_onset_positions`` to metadata.tsv -* interval index levels renamed from 'iv' => 'interval' -* gets rid of pandas deprecation warnings -* bug fixes & log messages - -Version 0.5.2 -============= - -* the ``View`` on a ``Parse`` object can now be subscripted with a filename to obtain a ``Piece`` object, allowing - for better access to the various files belonging to the same piece (based on their file names). These new objects - facilitate access to the information which previously was available in one row of tge ``View.pieces()`` DataFrame. -* adds command ``ms3 empty`` to remove harmony annotations from scores -* adds command ``ms3 add`` to add harmony annotations from TSV files to scores -* re-factored ``ms3 compare`` to use new methods added to ``View`` objects -* methods based on ``View.iter()`` now accept the parameter ``fnames`` to filter out file names not included in the list -* while adding labels, use fallback values ``staff=-1`` and ``voice=1`` if not specified - -Version 0.5.1 -============= - -* changes to ``iter`` methods for iterating through DataFrames and metadata belonging together: - - * supressed the second item: instead of ``(metadata, paths, df1, df2...)`` yield ``(metadata, df1, df2...)`` where the - metadata dict contains the paths - * added methods ``iter_transformed()`` and ``iter_notes()`` to ``Parse`` and ``View`` objects - -* added command ``ms3 transform`` - - * used to concatenate all parsed TSVs of a certain type into one file including the option to unfold and add quarterbeats - * stores them with prefix ``concatenated_``; ms3 now ignores all files beginning with this prefix - -* changes in default TSV columns - - * ``metadata.tsv`` includes the new columns - - * ``length_qb``: a scores length in quarterbeats (including all voltas) - * ``length_qb_unfolded``: the same but with unfolded repeats, if any - * ``all_notes_qb``: the sum of all note durations in quarterbeats - * ``n_onsets``: the number of all onsets - - * no empty ``volta`` columns are included (except for measures) when no voltas are present - -Version 0.5.0 -============= - -* considerable changes to ``Parse`` objects (bugs might still be abundant, please report them) - * abolished custom DataFrame indices - * behaviour shaped towards ms3's standard corpus structure - * automatic detection of corpora and generation of keys - * this enables better matching of files that belong together through ``View`` objects (access via ``p['key']``) - * new method ``iter()`` for iterating through metadata and files that belong together - * all JSON files passed under the ``paths`` argument are now scanned for a contained list of file paths to be extracted - (as opposed to before where the JSON file had to be passed as a single path) - * new iterator ``p.annotation_objects()`` -* new module ``transformations`` - * just as ``utils``, members can be imported directly via ``from ms3 import`` - * includes a couple of functions that were previously part of ``utils`` or ``expand_dcml`` - * includes a couple of new functions: - * get_chord_sequences() - * group_annotations_by_features() - * make_gantt_data() - * transform_annotations() - * transform_multiple() -* handling hierarchical localkeys and pedals (i.e. we can modulate to the key of ``V/III``) -* Renamed column 'durations_quarterbeats' to 'duration_qb' -* You can now set ``interval_index = True`` to add quarterbeat columns **and** an index with quarterbeat intervals -* New behaviour of the ``folder_re`` argument: It now gets to all paths matching the regEx rather than stopping at a - higher level that doesn't match. Effectively, this allows, for example, to do ``Parse(path, folder_re='notes')`` to - select all files from folders called notes. -* bug fixes (e.g. failing less on incoherent repeat structures) - -Version 0.4.10 -============== - -* Enabled extraction of score labels. -* Made the use of ``labels_cfg`` more consistent. -* improved chord lists: - * include system and tempo texts - * new algorithm for correct spanner IDs (i.e. for Slurs, Pedal, HairPins, Ottava) - * lyrics: still extracts only the last verse but now in the corresponding column, e.g. ``lyrics:3`` for verse 3. -* new feature (still in beta): extraction of form labels - * ``Score.mscx.form_labels`` - * ``Parse.form_labels()`` - * added ``form_labels`` -related parameters to ``Parse.get_lists()`` and ``Parse.store_lists()`` - * added ``utils.expand_form_labels()`` for hierarchical display of form labels - -Version 0.4.9 -============= - - -* enabled ``import from ms3`` for all utils -* new command ``ms3 update`` for converting files and moving annotations to the Roman Numeral Analysis layer -* new command ``ms3 metadata`` for writing manually changed information from ``metadata.tsv`` to the metadata fields of the corresponding MuseScore files -* improved the ``ms3 extract`` command: - * added option ``-D`` for extracting and updating ``metadata.tsv`` and ``README.md`` - * added option ``-q`` for adding 'quarterbeats' and 'durations_quarterbeats' columns - * included default paths for the capital-letter parameters -* improved the ``ms3 compare`` command: - * now works with 'expanded' TSVs, too (not only with 'labels') - * allows 'label' column to include NaN values -* improvements to Parse() objects: - * attempts to parse scores that need file conversion (e.g. XML, MIDI) - * ``get_lists()`` method now allows for adding the columns ``quarterbeats`` and ``durations_quarterbeats``, even without unfolding repeats - * adding 'quarterbeats' without unfolding repeats excludes voltas - * new method ``get_tsvs()`` for retrieving and concatenating parsed TSV files - * Parse() now recognizes ``metadata.tsv`` files, expanded TSVs, and TSVs containing cadence labels only - * parsed ``metadata.tsv`` files can be retrieved/included via the method ``metadata()`` - * new method ``update_metadata()`` for the new ``ms3 metadata`` command - * decided on standard index levels ``rel_paths`` and ``fnames`` - * improved matching of corresponding score and TSV files -* improvements to Score() objects: - * new property Score.mscx.volta_structure for retrieving information on first and second endings -* improvements to Annotations() objects: - * correct propagation of ``localkey`` for voltas -* improvements to commandline interface: - * added parameter ``-o`` for specifying output directory - * harmonized the interface of the ``ms3 convert`` command - * parameter ``exclude_re`` now also filters paths passed via ``-f`` -* changed logging behaviours: - * write only WARNINGs to log file - * combine loggers for filenames independently of file extensions -* improved extraction of instrument names for metadata -* improved ``ms3 compare`` functionality -* restructured code architecture -* renamed master branch to 'main' -* many bug fixes - -Version 0.4.8 -============= - -* now reads DCML labels with cadence annotations -* unified command-line interface file options and included ``-f file.json`` -* Parse got more options for creating DataFrame index levels -* Parse.measures property for convenience -* bug fixes for better GitHub workflows - -Version 0.4.7 -============= - -* Labels can be attached to MuseScore's Roman Numeral Analysis (RNA) layer - * parameter `label_type=1` in both `Score.attach_labels()` and `Parse.attach_labels()` - * `Annotations.remove_initial_dots()` before inserting into the RNA layer - * `Annotations.add_initial_dots()` before inserting into the absolute chord layer -* interpret all `#vii` in major contexts as `vii` when computing chord tones -* code cosmetics and bug fixes - -Version 0.4.6 -============= - -* ms3 extract and Parse.store_lists() now have the option unfold to account for repeats -* minor bug fixes - -Version 0.4.5 -============= - -* added 'ms3 compare' command -* support for parsing cap, capx, midi, musicxml, mxl, and xml files through temporary conversion -* support for parsing MuseScore 2 files through temporary conversion - -Version 0.4.3 -============= - -* added 'ms3 check' command -* support of coloured labels -* write coloured labels to score comparing attached and detached labels to each other -* better interface for defining log file paths (more options, now conforming to the Parse.store_lists() interface) -* fixed erroneous separation of alternative labels - - -Version 0.4.2 -============= - -* small bug fixes -* correct computation of chord tones for new DCML syntax elements ``+M``, ``-``, ``^``, and ``v`` - -Version 0.4.1 -============= - -* ms3 0.4.1 supports parsing (but not storing) compressed MuseScore files (.mscz) -* Installs "ms3 convert" command to your system for batch conversion using your local MuseScore installation -* "ms3 extract" command now supports creation of log files -* take ``labels_cfg`` into account when creating expanded chord tables - -Version 0.4.0 -============= - -* The standard column 'onset' has been renamed to 'mc_onset' and 'mn_onset' has been added as an additional standard column. -* Parse TSV files as Annotations objects -* Parse.attach_labels() for inserting annotations into MuseScore files -* Prepare detached labels so that they can actually be attached -* Install "ms3 extract" command to the system -* Including da capo, dal segno, fine, and coda for calculating 'next' column in measures tables (for correct unfolding of repeats) -* Simulate parsing and table extraction -* Passing labels_cfg to Score/Parse to control the format of annotation lists -* Easy access to individual parsed files through Parse[ID] or Parse[ix] -* parse annotation files with diverging column names - -Version 0.3.0 -============= - -* Parse.detach_levels() for emptying all parsed scores from annotations -* Parse.store_mscx() for storing altered (e.g. emptied) score objects as MuseScore files -* Parse.metadata() to return a DataFrame with all parsed pieces' metadata -* Parse.get_labels() to retrieve labels of a particular kind -* Parse.info() has improved the information that objects return about themselves -* Parse.key for a quick overview of the files of a given key -* Parse can be used with a custom index instead of IDs [an ID is an (key, i) tuple] -* Score.store_list() for easily storing TSVs -* renamed Score.output_mscx() to store_mscx() for consistency. -* improved expansion of DCML harmony labels - -Version 0.2.0 -============= - -Beta stage: - -* attaching and detaching labels -* parsing multiple pieces at once -* extraction of metadata from scores -* inclusion of staff text, dynamics and articulation in chord lists, added 'auto' mode -* conversion of MuseScore's encoding of absolute chords -* first version of docs - -Version 0.1.3 -============= - -At this stage, the library can parse MuseScore 3 files to different types of lists: - -* measures -* chords (= groups of notes) - * including slurs and spanners such as pedal, 8va or hairpin markings - * including lyrics -* notes -* harmonies - -and also some basic metadata. - -Version 0.1.0 -============= - -- Basic parser implemented -- Logging -- Measure lists diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md new file mode 100644 index 00000000..de410731 --- /dev/null +++ b/docs/CHANGELOG.md @@ -0,0 +1,951 @@ +# Changelog + +## Version 2.4.0 + +- adds `git_revision` and `git_tag` to frictionless JSON descriptors + whenever the git repo is clean (5b76a815) + - This includes the new property `Corpus.repo` that makes the + `git.Repo` object available if applicable. +- adds `--force` to `ms3 compare` and `ms3 review` commands, allowing + to output comparison files (potentially including the + `compared_against` metadata key) even if no differences were found + (5b76a815) + +## Version 2.3.1 + +Ignoring pandas 2.1.0 FutureWarning which cause some intimidating output +when using the ms3 precommit hook. + +## Version 2.3.0 + +- Adds 'ms3 precommit' and makes the repo usable as a hook by + \@johentsch in + - The new `ms3 precommit` command is simply a wrapper around + `ms3 review` that accepts the `--files` arguments as positional + arguments. This is required for the command to be useable as an + entry point for a [Git pre-commit](https://pre-commit.com/), + which passes the paths of modified or added files as positional + arguments. In addition, the command executes `git add -A` after + the review so that all changed files are included. + - This is to work in the first version of the new, localized, DCML + annotation workflow that runs on the annotator's machine before + committing, rather than on a GitHub runner after pushing. Things + that might be changed in the future: + - The `ms3 precommit` command could convert the positional + arguments into a regular expression to be passed to + `-i/--include` instead of using the deprecated `--files`. + - At some point a mechanism might be needed that makes it + possible for the hook to ignore warnings that were already + there, i.e., which are not caused/added by the current + commit. Currently one would have to remove `--fail` from the + repo's args configuration but that would let all warnings + pass and would be besides the point. + - New method `score.mscx.update_metadata()` to facilitate (manual) + updating of the key-value pairs. + - Comparison files come with the metadata key + `compared_against=` when the comparison has been + performed against a particular git revision. + - `"LATEST_VERSION"` is now accepted as argument to `git_revision` + and resolves to the latest version tag (falling back to the + current HEAD if the repo has no tags) +- Extended excerpting functionality by \@leobruneau in + + - It is now possible to replace head and tail of an excerpt with + rests. This does not look pretty but it is an easy way to create + audio excerpts starting and ending at the given points in time. + - It is now possible to set an arbitrary tempo by inserting an + invisible metronome mark at the beginning of excerpts. + - `score.mscx.store_phrase_excerpts()` makes use of this to omit + notes before and after the actual phrase + - new methods accessible via `score.mscx`: + - `store_measures()` + - `store_within_phrase_excerpts()` + - `store_phrase_endings()` + - `store_random_excerpts()` + +**Full Changelog**: +\...v2.3.0 + +## Version 2.2.1 + +- Form label columns by \@johentsch in + [https://github.com/johentsch/ms3/pull/98]{.title-ref}\_\_ + - catches exception when resource descriptor cannot be generated + - creates IntervalIndex based on the `quarterbeats_all_endings` + column + - always stores form_labels with a single column level instead of + MultiIndex + +**Full Changelog**: +\...v2.2.1 + +## Version 2.2.0 + +### What's Changed + +- Changing the instrumentation to "Drumset" by \@arinaLozhkina in + [https://github.com/johentsch/ms3/pull/84]{.title-ref}\_\_ + - More robust updating of score instrumentation by modifying + `metadata.tsv` and calling `ms3 metadata --instrumentation` + - Ensures playback with the correct MIDI instrument + - Handles a change to `Drumset` correctly in terms of changing + clef, removing key signature, and playback +- MSCX class API for creating score excerpts by \@leobruneau in + [https://github.com/johentsch/ms3/pull/91]{.title-ref}\_\_ + - score excerpts can now be stored using + `score.mscx.store_excerpt()` + - batch excerpt creation via `MSCX.store_phrase_excerpts()` and + `MSCX.store_random_excerpts()` +- Improved algorithm for computing `mc_offset` including bugfix by + \@johentsch in + [https://github.com/johentsch/ms3/pull/95]{.title-ref}\_\_ +- Updated schema mechanism following the first trial by \@johentsch in + [https://github.com/johentsch/ms3/pull/97]{.title-ref}\_\_ + - `quarterbeats_all_endings` column now added to all facet + dataframes by default + - schema URLs now use the dedicated + [DCMLab/frictionless_schemas](https://github.com/DCMLab/frictionless_schemas/) + and the amount of required schemas was reduced drastically + - no schemas are stored for `events` anymore + - `rests` and `notes_and_rests` do not include non-sensical + empty columns anymore + - `chords` is the only remaining facet where the abundance of + schemas due to high combinatoriality of column names is + (somewhat) justified. + - Renamed columns: + - in unfolded dataframes, `quarterbeats` is now called + `quarterbeats_playthrough` + - in the `chords` facet, `metronome_visible` is now called + `tempo_visible` +- documentation now hosted at + [https://ms3.readthedocs.io/]{.title-ref}\_\_ + +### New Contributors + +- \@leobruneau made their first contribution in + [https://github.com/johentsch/ms3/pull/91]{.title-ref}\_\_ + +**Full Changelog**: +[https://github.com/johentsch/ms3/compare/v2.1.1...v2.2.0]{.title-ref}\_\_ + +## Version 2.1.1 + +- Message headers in `.warnings` files now come without trailing `--`. +- This version is able to correctly IGNORED_WARNINGS even if the + header ends on a trailing `--` (copied from a `.warnings` file + generated by an older version of ms3). +- adds the low-level function + `ms3.bs4_parser._MSCX_bs4.make_excerpt`{.interpreted-text + role="meth"} that returns the new object type + `ms3.bs4_parser.Excerpt`. High-level API in preparation (#91). + +## Version 2.1.0 + +This update includes a few minor bug fixes but some heavy updating of +the code internals: + +- pandas\>=2.0.0 is now supported +- the `@function_logger` decorator has been removed and replaced with + a function argument that defaults to the `module_logger` +- all modules which have seen a commit since the previous tag have + been fully linted using pre-commit hooks +- the filelock problem that made a couple of test fail under Windows + since the early days has been resolved (by using pytest\'s + `tmp_path` fixture instad of `NamedTemporaryFile`). +- `make_ml()` (responsible for creating measure tables) was refactored + and should be much more legible (and easier to adapt and extend in + the future) + +**Full Changelog**: +[https://github.com/johentsch/ms3/compare/v2.0.1\...v2.1.0]{.title-ref}\_\_ + +## Version 2.0.1 + +- Allow metronome mark to appear in MC 2 + +## Version 2.0.0 + +### Breaking changes + +- Renamed MultiIndex levels: + - The column `fname` has been renamed to `piece`. This concerns + especially `metadata.tsv` where it is used as index, but also + the MultiIndex of concatenated facets such as those output by + `Parse.get_facet()` or `ms3 transform`. + - The last (right-most) index level, which used to be called + `_i` in some cases, is now consistently called `i`. +- When extracting TSV files: + - The possibility to assign custom suffixes to the extracted + facets has been replaced by default suffixes separated by a full + stop. For example, the notes for the MuseScore file + `MS3/filename.mscx` will be extracted to + `notes/filename.notes.tsv` by default. + - Every extracted TSV file comes with a JSON descriptor file + following the [frictionless + specification](https://specs.frictionlessdata.io/) for metadata. + This replaces the `csv-metadata.json` files that were following + the [CSV on the Web](https://csvw.org/) specification. + - The frictionless schemas used in the JSON descriptor files are + stored in the `schemas` folder of the ms3 package in YAML + format. Their filenames are truncated hashes computed from the + included column/field names and they are stored in a folder + pertaining to the facet in question. This comes with the + advantage that schemas do not have to be written out in every + descriptor: Instead, the `schema` field contains the URL of the + schema file, allowing to update the schema specifications at a + later point, e.g. with added or more elaborate descriptions. + - Validation errors are written into `.errors` files stored next + to the resource descriptor in question. +- The command `ms3 transform`, by default, outputs the concatenated + facets as a single ZIP file that comes with a [frictionless + DataPackage descriptor](https://specs.frictionlessdata.io/) (for the + parameters added to the command, see below). The concatenated files + are now named `..tsv` (previously + `concatenated_.tsv`). + +### New features + +- It is now possible to batch-edit the instrumentation in many scores + at once by changing the relevant column(s) in `metadata.tsv` and + calling `ms3 metadata --instrumentation`. +- Since `ms3 transform` now outputs zipped [frictionless + DataPackages](https://specs.frictionlessdata.io/) by default + (meaning that all concatenated facets are described in the same + package descriptor JSON file), it comes with additional parameters: + - `--unzipped` to output the package as uncompressed TSV files + rather than as single ZIP file. + - `--resources` to create a frictionless resource descriptor per + concatenated facet instead of a package descriptor. + - `--safe` to prevent overwriting existing files. +- The `ms3 extract` command now has a `--corpuswise` option allowing + to parse and extract one corpus after the other, avoiding the need + to parse all scores at once and keep them in memory before beginning + the extraction. +- The parser throws a warning if a score does not have a metronome + mark at the beginning (which can be hidden). This is to encourage + the inclusion of information on the basic beat unit (in 6/8 meter, + e.g., the metronome unit is typically a dotted quarter) and pace to + every score for better comparability. + +### Bugfixes + +- For the `IGNORED_WARNINGS` file. +- For the `--threshold` argument of the `ms3 review` command. +- Writing and reading the `volta_mcs` column of `metadata.tsv`. +- #60, #63, #78, #79 + +### Internal changes + +- `utils.py` has been turned into a Python package containing the + mocules `constants`, `functions`, and `frictionless`. +- Not using the `frac` alias for `fractions.Fraction` anymore. +- The version number is not manually stored as a constant, instead it + is automatically written into `_version.py` upon initialization. + +### Other + +This version contains the final version of the paper *A parser for +MuseScore 3 files and data factory for annotated music corpora* for +publication in the Journal of Open Source Software (JOSS). + +## Version 1.2.12 + +This last version of ms3 1.x uses the \_version.py file introduced in +8f40b16. + +## Version 1.2.11 + +- stops writing the version of ms3 into the [.warnings]{.title-ref} + files to avoid merge conflicts +- bugfixes for + - handling IGNORED_WARNINGS + - ms3 review command + - overview table written to README + +## Version 1.2.10 + +- merges old_tests with new_tests +- correct handling of `labels_cfg` +- refrains from calling `logging.basicConfig()` +- unknown TSV types now default to `labels` +- `conti` now recognized as abbreviation for \"continuation idea\" +- suppresses warnings about multiple \"Fingering_text\" values + +## Version 1.2.9 + +- when updating `README.md`: + - make 2nd-level heading `## Overview` (instead of first-level) + - don\'t output ms3 version (to avoid merge conflicts) +- small bugfixes in `ms3 review` command + +## Version 1.2.8 + +- operations.insert_labels_into_score() filters pieces exactly one + facet to be inserted (e.g. `labels`), not a fuzzy regex (e.g., which + would include `form_labels` in the filter) + +## Version 1.2.7 + +- warning files omit system-dependend information from warning headers + (6764476) +- bugfixes + +## Version 1.2.6 + +- changes the behaviour of the `ms3 review` command + - after coloring out-of-label notes, issue one warning per dubious + label + - rather than one [warnings.log]{.title-ref} file per corpus, + create one [\.warnings]{.title-ref} file per piece in + the [reviewed]{.title-ref} folder +- makes `ms3 empty` work under the new CLI (d8f661a) + +## Version 1.2.5 + +- `~ms3.Corpus`{.interpreted-text role="obj"} and + `~ms3.Piece`{.interpreted-text role="obj"} come with the new method + `count_pieces()` +- `ms3 transform -D` to concatenate only metadata works +- `View.fnames_with_incomplete_facets = False` enforces selected + facets if some have been excluded + +## Version 1.2.4 + +- segment_by_criterion warns if not IntervalIndex is present d2602617 +- adds missing arguments \'unfold\' and \'interval_index\' to + Piece.get_parsed() 71f8c3e4 +- when iterating through pieces, skip fnames that don\'t have any + files under the current view fdce948f + +## Version 1.2.3 + +**ms3 requires Python 3.10** + +- Piece.get_facet() gets parameter \'force\' which defaults to False + (analogous to the other methods), in order to avoid unsolicited + score parsing. +- improves `ms3 transform`: + - parse only facets to be concatenated (rather than all TSV files) + - do not accidentally output metadata if not requested +- prevents including \'volta_mcs\' in metadata of pieces that don\'t + have voltas + +## Version 1.2.2 + +**ms3 requires Python 3.10** + +- removes deprecated elements from tab completion +- enables view settings when adding new corpora to Parse object +- small stuff + +## Version 1.2.1 + +**ms3 requires Python 3.10** + +- enables hiding the info prints in + operations.insert_labels_into_score() +- adds [filter_other_fnames]{.title-ref} argument to Corpus.add_dir() + +## Version 1.2.0 + +**ms3 requires Python 3.10** + +### Extraction of all lyrics + +This version enables the extraction of lyrics with all verses. +Previously, only the last verse\'s syllable for any given position was +extracted. The lyrics now can be found in +[lyrics\_\[verse\]]{.title-ref} columns in the chords facet, where +[lyrics_1]{.title-ref} corresponds to the first or only verse. + +### Extraction of figured bass + +Figured bass labels can now be found in the chords facet tables. Score +that include at least one figure will have a `thoroughbass_duration` +column and each layer of figures comes in a separate +`thoroughbass_layer_#` column. For example, if all stacks of figures +have only layer, there will be only the column `thoroughbass_layer_1`. + +### Extraction of custom-named spanners + +Spanners with adjusted \"Begin text\" property get their own columns in +the chords tables, containing the relevant subselection of IDs. For +example, if a score contains normal `8va` spanners and others where the +\"Begin text\" has been set to `custom`, all IDs will be combined in the +column `Ottava:8va` as before, but the subset pertaining to the custom +spanners is additionally shown in the column `Ottava:8va_custom`. + +### Including and excluding paths + +It is now possible to specify specific directories to be included or +excluded from a view, not only folder names. + +### New methods and properties + +- `Parse.get_facet()` (singular) +- `Corpus.fnames` +- `Corpus.add_dir()` +- first version of `utils.merge_chords_and_notes()` + +## Version 1.1.2 + +**ms3 requires Python 3.10** + +- Refines the new \"writing score headers\" functionality and makes it + non-default. User needs to set `ms3 metadata --prelims` which + replaces the flag `--ignore` that had been introduced in 1.1.1. +- A couple of bug fixes, including a very important one regarding + conversion of fifths introduced with b0ce8a1d + +## Version 1.1.1 + +**ms3 requires Python 3.10** + +- enables updating score headers from the respective + [metadata.tsv]{.title-ref} columns ([title_text]{.title-ref}, + [subtitle_text]{.title-ref}, [composer_text]{.title-ref}, + [lyricist_text]{.title-ref}, and [part_name_text]{.title-ref}) +- Parse, Corpus, and Piece now come with the method keys() + +## Version 1.1.0 + +**ms3 requires Python 3.10** + +This version does not throw errors when trying to parse files created by +MuseScore 4. Parsing these files has not sufficiently been tested but so +far it was looking good. The fact that MuseScore 3 is able to read such +files shows that not much has changed in the file format itself. + +The command `ms3 convert` has been updated to support MuseScore 4 +executables. With the current MuseScore 4.0.0 this is not quite +straightforward because conversion to `.mscz` via the commandline isn\'t +currently working and conversion to `.mscx`, if it works at all, deletes +the contents of the target directory ([issue +#15367](https://github.com/musescore/MuseScore/issues/15367#issuecomment-1369783686)). +The new function `utils.convert_to_ms4()` offers a workaround that +creates temporary directories to store the \"Uncompressed MuseScore +folder\" and then copies the `.mscx` file to the target directory +(default) or zips the temporary directory into an `.mscz` file +(parameter `--format mscz`). For all other target formats, the output +will correspond to what the MuseScore 4 executable yields. + +## Version 1.0.4 + +**ms3 requires Python 3.10** + +ms3 has gotten a makeover and does not quite like it did before. The +major changes are: + +- The library is now optimized for one particular folder structure, + namely `[meta-corpus ->] corpus -> piece`. +- ms3 now comes with a full-fledged \"views\" feature which lets you + subselect files in manifold ways. +- The TSV outputs have gained additional columns. In particular, all + TSV files now come with the column `quarterbeats` reflecting each + event\'s offset from the piece\'s beginning. +- Warnings concerning irregularities, e.g. wrong measure numbering due + to a cadenza, can now be sanctioned by copying them into an + IGNORED_WARNINGS file. + +### New features + +- Each object that the user interacts with, + `Parse, Corpus, and Piece`, comes with at least two views, called + \"default\" and \"all\". The \"default\" view disregards review + files, scores in convertible formats, and scores that are not listed + in the top-level `metadata.tsv` file. +- `metadata.tsv` files, by the virtue of their first column `fname`, + now serve as authority on what is included in the corpus and what + belongs together. This column is always unique and supposed to be + used as index. +- Suffixed `metadata_.tsv` files are loaded as available views + based on the column `fname` (other columns are disregarded). +- The Parse object now detects if the passed directory contains + individual corpora or if it is a corpus itself. +- Parse objects perform operations by iterating over Corpus objects. +- Corpus objects perform operations by iterating over Piece objects. +- Corpus objects reflect exactly one folder, the `corpus_path`, and + always discover all present files (which can be filtered before the + actual parsing). Default output paths are derived from it. +- Piece objects unite the various files pertaining to the same `fname` + and are able to keep multiple versions of the same type apart (e.g., + scores or annotation files) and pick one automatically, if + necessary, or ask for user input. +- The command `ms3 review` combines the functionalities of + `ms3 check`, `ms3 extract`, and `ms3 compare`, and is now the only + command used in the new `dcml_corpus_workflow` action. For each + score that has DCML harmony labels, it stores another score and TSV + file with the suffix `_reviewed`, in the folder `reviewed`. + - The score has all out-of-label tones colored in red and + - the TSV file contains a report on this coloring procedure. Both + files are stored in the folder `reviewed` on the top level of + the corpus. + - **(1.0.2)** In addition, if any warnings pop up, they are stored + in the top-level `warnings.log` file. +- Inserting labels into scores is accomplished using the new method + `load_facet_into_scores()` which comes with the optional parameter + `git_revision` which allows loading TSVs from a specific commit. +- Therefore, `ms3 compare` (and hence, `ms3 review`) is now able to + compare the labels in a score with those in a TSV file from an older + git revision. +- `ms3 extract -F` extracts form labels and expands them into a + tree-like view in the output TSV. + +### Changes to the interface + +- Many things have been renamed for the benefit of a more homogeneous + user interface. + - Methods previously beginning with `output_` were renamed to + `store_`. + - Parse.parse_mscx() =\> Parse.parse_scores() +- The properties for retrieving DataFrames from `Score` objects: + - are now methods and accept the parameters `unfold` and + `interval_index`. + - return None when a facet is not available. +- Parsed scores and dataframes are always returned with File object + that identifies the parsed file in question. This is particularly + relevant when using the `get_facet()` methods that may return facets + from parsed TSV files or extract them from the scores, according to + availability. +- Gets rid of the argument `simulate` except for writing files. +- logger_cfg now as \*\*kwargs +- **(1.0.3)** Currently the `-d/--dir` argument to `ms3` commands + accepts only one directory, not several. + +### Changes to the outputs + +- **(1.0.1)** When unfolding repeats, add the column `mn_playthrough` + with disambiguated measure Numbers (\'1a\', \'12b\', etc.). +- The column `label_type` has been replaced and disambiguated into + `harmony_layer` (0-3, text, Roman numeral, Nashville, guitar chord) + and `regex_match` (containing the name of the regular expression + that matched first). +- Notes tables now come with the two additional columns `name` (e.g. + \"E#4\") and `octave`. For unpitched instruments, such as drumset, + the column `name` displays the designated instrument name (which the + user can modify in MuseScore), and have no value in the `octave` + columns. +- For pieces that don\'t have first and second endings, the TSVs come + without a `volta` column. +- Extracted metadata + - **(1.0.1)** come with the new columns last_mc_unfolded, + last_mn_unfolded, volta_mcs, guitar_chord_count, + form_label_count, ms3_version, has_drumset + - uses the column `fname` as index + - comes with a modified column order + - renames the previous column `rel_paths` to subdir, whereas the + new column `rel_path` contains + - include the text fields included in a score. Columns are + `composer_text`, `title_text`, `subtitle_text`, `lyricist_text`, + `part_name_text`. +- Upon a full parse (i.e. if the view has default settings), each + facet folder gets a `csv-metadata.json` file following the CSVW + standard. This file indicates the version of ms3 that was used to + extract the facets. The version is also included in the last row of + the README. + +### Other changes + +Many, many bugs have died on the way. Also: + +- Most functions and methods now come with type hints. +- New unittest suite that makes use of the DCMLab/unittest_metacorpus + repo and enforces it to be at the correct commit. +- The parser is now more robust against user-induced strangeness in + MuseScore files. +- **(1.0.1)** Repetitions are unfolded for checking the integrity of + DCML phrase annotations in order to deal with voltas correctly. +- **(1.0.3)** Pedal notes that have multiple (volta) endings, although + still not being correctly propagated into each ending, get + propagated into the first ending, and don\'t cause propagation nor + the integrity check to fail anymore + +## Version 1.0.3 + +See above, version 1.0.4 + +## Version 1.0.2 + +See above, version 1.0.4 + +## Version 1.0.1 + +See above, version 1.0.4 + +## Version 1.0.0 + +See above, version 1.0.4 + +## Version 0.5.3 + +- recognizes metadata fields `reviewers` and `annotators` also in + their singular forms +- adds column `n_onset_positions` to metadata.tsv +- interval index levels renamed from \'iv\' =\> \'interval\' +- gets rid of pandas deprecation warnings +- bug fixes & log messages + +## Version 0.5.2 + +- the `View` on a `Parse` object can now be subscripted with a + filename to obtain a `Piece` object, allowing for better access to + the various files belonging to the same piece (based on their file + names). These new objects facilitate access to the information which + previously was available in one row of tge `View.pieces()` + DataFrame. +- adds command `ms3 empty` to remove harmony annotations from scores +- adds command `ms3 add` to add harmony annotations from TSV files to + scores +- re-factored `ms3 compare` to use new methods added to `View` objects +- methods based on `View.iter()` now accept the parameter `fnames` to + filter out file names not included in the list +- while adding labels, use fallback values `staff=-1` and `voice=1` if + not specified + +## Version 0.5.1 + +- changes to `iter` methods for iterating through DataFrames and + metadata belonging together: + - supressed the second item: instead of + `(metadata, paths, df1, df2...)` yield `(metadata, df1, df2...)` + where the metadata dict contains the paths + - added methods `iter_transformed()` and `iter_notes()` to `Parse` + and `View` objects +- added command `ms3 transform` + - used to concatenate all parsed TSVs of a certain type into one + file including the option to unfold and add quarterbeats + - stores them with prefix `concatenated_`; ms3 now ignores all + files beginning with this prefix +- changes in default TSV columns + - `metadata.tsv` includes the new columns + - `length_qb`: a scores length in quarterbeats (including all + voltas) + - `length_qb_unfolded`: the same but with unfolded repeats, if + any + - `all_notes_qb`: the sum of all note durations in + quarterbeats + - `n_onsets`: the number of all onsets + - no empty `volta` columns are included (except for measures) when + no voltas are present + +## Version 0.5.0 + +- + + considerable changes to `Parse` objects (bugs might still be abundant, please report them) + + : - abolished custom DataFrame indices + + - + + behaviour shaped towards ms3\'s standard corpus structure + + : - automatic detection of corpora and generation of + keys + - this enables better matching of files that belong + together through `View` objects (access via + `p['key']`) + - new method `iter()` for iterating through metadata + and files that belong together + + - all JSON files passed under the `paths` argument are now + scanned for a contained list of file paths to be extracted + (as opposed to before where the JSON file had to be passed + as a single path) + + - new iterator `p.annotation_objects()` + +- + + new module `transformations` + + : - just as `utils`, members can be imported directly via + `from ms3 import` + + - includes a couple of functions that were previously part of + `utils` or `expand_dcml` + + - + + includes a couple of new functions: + + : - get_chord_sequences() + - group_annotations_by_features() + - make_gantt_data() + - transform_annotations() + - transform_multiple() + +- handling hierarchical localkeys and pedals (i.e. we can modulate to + the key of `V/III`) + +- Renamed column \'durations_quarterbeats\' to \'duration_qb\' + +- You can now set `interval_index = True` to add quarterbeat columns + **and** an index with quarterbeat intervals + +- New behaviour of the `folder_re` argument: It now gets to all paths + matching the regEx rather than stopping at a higher level that + doesn\'t match. Effectively, this allows, for example, to do + `Parse(path, folder_re='notes')` to select all files from folders + called notes. + +- bug fixes (e.g. failing less on incoherent repeat structures) + +## Version 0.4.10 + +- Enabled extraction of score labels. + +- Made the use of `labels_cfg` more consistent. + +- + + improved chord lists: + + : - include system and tempo texts + - new algorithm for correct spanner IDs (i.e. for Slurs, + Pedal, HairPins, Ottava) + - lyrics: still extracts only the last verse but now in the + corresponding column, e.g. `lyrics:3` for verse 3. + +- + + new feature (still in beta): extraction of form labels + + : - `Score.mscx.form_labels` + - `Parse.form_labels()` + - added `form_labels` -related parameters to + `Parse.get_lists()` and `Parse.store_lists()` + - added `utils.expand_form_labels()` for hierarchical display + of form labels + +## Version 0.4.9 + +- enabled `import from ms3` for all utils + +- new command `ms3 update` for converting files and moving annotations + to the Roman Numeral Analysis layer + +- new command `ms3 metadata` for writing manually changed information + from `metadata.tsv` to the metadata fields of the corresponding + MuseScore files + +- + + improved the `ms3 extract` command: + + : - added option `-D` for extracting and updating `metadata.tsv` + and `README.md` + - added option `-q` for adding \'quarterbeats\' and + \'durations_quarterbeats\' columns + - included default paths for the capital-letter parameters + +- + + improved the `ms3 compare` command: + + : - now works with \'expanded\' TSVs, too (not only with + \'labels\') + - allows \'label\' column to include NaN values + +- + + improvements to Parse() objects: + + : - attempts to parse scores that need file conversion (e.g. + XML, MIDI) + - `get_lists()` method now allows for adding the columns + `quarterbeats` and `durations_quarterbeats`, even without + unfolding repeats + - adding \'quarterbeats\' without unfolding repeats excludes + voltas + - new method `get_tsvs()` for retrieving and concatenating + parsed TSV files + - Parse() now recognizes `metadata.tsv` files, expanded TSVs, + and TSVs containing cadence labels only + - parsed `metadata.tsv` files can be retrieved/included via + the method `metadata()` + - new method `update_metadata()` for the new `ms3 metadata` + command + - decided on standard index levels `rel_paths` and `fnames` + - improved matching of corresponding score and TSV files + +- + + improvements to Score() objects: + + : - new property Score.mscx.volta_structure for retrieving + information on first and second endings + +- + + improvements to Annotations() objects: + + : - correct propagation of `localkey` for voltas + +- + + improvements to commandline interface: + + : - added parameter `-o` for specifying output directory + - harmonized the interface of the `ms3 convert` command + - parameter `exclude_re` now also filters paths passed via + `-f` + +- + + changed logging behaviours: + + : - write only WARNINGs to log file + - combine loggers for filenames independently of file + extensions + +- improved extraction of instrument names for metadata + +- improved `ms3 compare` functionality + +- restructured code architecture + +- renamed master branch to \'main\' + +- many bug fixes + +## Version 0.4.8 + +- now reads DCML labels with cadence annotations +- unified command-line interface file options and included + `-f file.json` +- Parse got more options for creating DataFrame index levels +- Parse.measures property for convenience +- bug fixes for better GitHub workflows + +## Version 0.4.7 + +- + + Labels can be attached to MuseScore\'s Roman Numeral Analysis (RNA) layer + + : - parameter [label_type=1]{.title-ref} in both + [Score.attach_labels()]{.title-ref} and + [Parse.attach_labels()]{.title-ref} + - [Annotations.remove_initial_dots()]{.title-ref} before + inserting into the RNA layer + - [Annotations.add_initial_dots()]{.title-ref} before + inserting into the absolute chord layer + +- interpret all [#vii]{.title-ref} in major contexts as + [vii]{.title-ref} when computing chord tones + +- code cosmetics and bug fixes + +## Version 0.4.6 + +- ms3 extract and Parse.store_lists() now have the option unfold to + account for repeats +- minor bug fixes + +## Version 0.4.5 + +- added \'ms3 compare\' command +- support for parsing cap, capx, midi, musicxml, mxl, and xml files + through temporary conversion +- support for parsing MuseScore 2 files through temporary conversion + +## Version 0.4.3 + +- added \'ms3 check\' command +- support of coloured labels +- write coloured labels to score comparing attached and detached + labels to each other +- better interface for defining log file paths (more options, now + conforming to the Parse.store_lists() interface) +- fixed erroneous separation of alternative labels + +## Version 0.4.2 + +- small bug fixes +- correct computation of chord tones for new DCML syntax elements + `+M`, `-`, `^`, and `v` + +## Version 0.4.1 + +- ms3 0.4.1 supports parsing (but not storing) compressed MuseScore + files (.mscz) +- Installs \"ms3 convert\" command to your system for batch conversion + using your local MuseScore installation +- \"ms3 extract\" command now supports creation of log files +- take `labels_cfg` into account when creating expanded chord tables + +## Version 0.4.0 + +- The standard column \'onset\' has been renamed to \'mc_onset\' and + \'mn_onset\' has been added as an additional standard column. +- Parse TSV files as Annotations objects +- Parse.attach_labels() for inserting annotations into MuseScore files +- Prepare detached labels so that they can actually be attached +- Install \"ms3 extract\" command to the system +- Including da capo, dal segno, fine, and coda for calculating + \'next\' column in measures tables (for correct unfolding of + repeats) +- Simulate parsing and table extraction +- Passing labels_cfg to Score/Parse to control the format of + annotation lists +- Easy access to individual parsed files through Parse\[ID\] or + Parse\[ix\] +- parse annotation files with diverging column names + +## Version 0.3.0 + +- Parse.detach_levels() for emptying all parsed scores from + annotations +- Parse.store_mscx() for storing altered (e.g. emptied) score objects + as MuseScore files +- Parse.metadata() to return a DataFrame with all parsed pieces\' + metadata +- Parse.get_labels() to retrieve labels of a particular kind +- Parse.info() has improved the information that objects return about + themselves +- Parse.key for a quick overview of the files of a given key +- Parse can be used with a custom index instead of IDs \[an ID is an + (key, i) tuple\] +- Score.store_list() for easily storing TSVs +- renamed Score.output_mscx() to store_mscx() for consistency. +- improved expansion of DCML harmony labels + +## Version 0.2.0 + +Beta stage: + +- attaching and detaching labels +- parsing multiple pieces at once +- extraction of metadata from scores +- inclusion of staff text, dynamics and articulation in chord lists, + added \'auto\' mode +- conversion of MuseScore\'s encoding of absolute chords +- first version of docs + +## Version 0.1.3 + +At this stage, the library can parse MuseScore 3 files to different +types of lists: + +- measures + +- + + chords (= groups of notes) + + : - including slurs and spanners such as pedal, 8va or hairpin + markings + - including lyrics + +- notes + +- harmonies + +and also some basic metadata. + +## Version 0.1.0 + +- Basic parser implemented +- Logging +- Measure lists diff --git a/docs/index.rst b/docs/index.rst index 878b0530..4990a2dc 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -14,7 +14,7 @@ Table of Contents Contributions & Help License Authors - Changelog + Changelog .. Module Reference