The scoring-up script takes a finite number of Mensural MEI files, each of which only contains one part (i.e., voice) from a mensural piece and merge them into just one Mensural MEI file in which all the parts are lined up into a score. The alignment of the parts is a complex issue in mensural notation, since the same note-shape can have different durational values (perfect / imperfect / altered) depending on the context.
This scoring-up script consists in two modules: merge and apel. The merge module merges the various Mensural MEI files encoding each part into a single Mensural MEI file that encodes the whole piece in a "quasiscore" format (i.e., without any vertical alignment of the parts). The apel module deals with the context-dependent nature of the notation to determine the durational value of the notes by implementing Apel's / Franco's principles of imperfection and alteration. In addition to Apel's principles, this module includes functions for: distinguishing between dots of division and dots of augmentation, handling hemiola coloration, and dealing with the simultaneous use of perfect mensurations at different note levels.
- The LibMEI library. The wiki contains instructions on both the installation of the LibMEI C++ library, and the installation of the python bindings.
The main program is contained in the score_up.py
file. This program takes a list of Mensural MEI files that encode each of the individual parts (i.e., voices) of the piece and scores them up by running the following steps:
- Merging the Mensural MEI files that encode each part into a single Mensural MEI file (encoding a sort of 'quasi-score')
- Finding out the duration of each note in the 'quasi-score' MEI file. This completes the scoring up process.
You can run the whole "scoring_up" script or you could run one of its two steps individually. If you want to run the whole scoring-up process, use the command python score_up.py
followed by the list of files encoding each of the parts and the filepath in which you want to store the output score. For example, to score-up a four-voice mensural piece use:
$ python3 score_up.py <filepath of part 1> <filepath of part 2> <filepath of part 3> <filepath of part 4> <filepath for score>
If, on the other hand, you want to run only one of the two steps of the scoring-up process, either merging or note-duration finding, use the following flags:
-
-merge
Use this flag to merge all the Mensural MEI files into a single Mensural MEI file.
Example:
$ python3 score_up.py -merge <filepath of part 1> <filepath of part 2> <filepath of part 3> <filepath of part 4> <filepath for quasi-score>
-
-apel
Use this flag to find out the durational value of each note in a single Mensural MEI file (regardless of whether this file is encoding one or multiple parts).
Example:
$ python3 score_up.py -apel <input file> <output file>
You have an additional third flag that you can use to evaluate the results of the scoring-up tool if you happen to have a ground truth Mensural MEI file:
-
-compare
Use this flag to compare the output of the
scoring_up
process, or just the output of the second part of it (-apel
), against a ground truth file.Example:
$ python3 score_up.py <filepath of part 1> <filepath of part 2> <filepath of part 3> <filepath of part 4> <filepath for score> -compare <filepath of ground truth>
The algorithm is tested on a small set of fourteenth-century Ars Nova pieces from the Ivrea Codex1 and fifteenth-century pieces from Du Fay and Ockeghem2. The files involved in this experiment are distributed in the Files directory as follows:
- The ground truth Mensural MEI files are in the Files/GroundTruth/mensural-mei directory and their modern transcriptions in CMN MEI are at Files/GroundTruth/cmn-mei
- The output of the scoring-up tool is found in Files/Output_ScUp. Here you can find the Mensural MEI score for each piece as well as a text file that lists all the notes (with their ids and voice number) that were misclassified as perect / imperfect / altered by the algorithm. This information is at the bottom of the text file, here it is an example of how it is presented:
NOT EQUAL: the NOTE m-213 in voice 1
In GROUND TRUTH: SEMIBREVIS, with 1 x default value
In APEL OUTPUT: SEMIBREVIS, with 2/3 x default value
This means that the note in voice 1 with id m-213 was imperfected (i.e., multiplied by 2/3) when, according to the ground truth, it should not. Regular imperfections are represented by 2/3 x default value, alterations are represented by 2 x default value, and augmentations are represented by 3/2 x default value. (Note: the 5/6 fraction that appears in the second voice of Duf22518, Duf3025, and Iv004 represents a partial imperfection, which is a feature yet to be implemented in the scoring-up tool.)
For more details regarding the pieces, the algorithm behind the scoring-up tool, and the results of this experiment, please consult Chapters 3 and 4 of the thesis Automatic Scoring Up of Mensural Music Using Perfect Mensurations, 1300–1550. A summary of all misclassified notes for all the pieces can be found at Summary_of_results/comparison.csv. The Measure Number and the Position in Measure refer to the modern transcriptions found in Files/GroundTruth/cmn-mei. A summary of all the notes that were subject to some kind of modification in their durational value (due to imperfection, alteration, the presence of a dot, or coloration) is shown in Summary_of_results/mutable_notes.csv.
1: The Ars Nova pieces were obtained from the Measuring Polyphony Project.
2: Du Fay's and Ockeghem's pieces were obtained by using modern transcriptions provided in the Josquin Research Project, converted them into CMN MEI files through the Sibelius' SibMEI plugin, and translate these CMN MEI files into Mensural MEI by using the Mensural MEI Translator.