The cmtools
score_gen command parses MusicXML score files and generates a text file
which allows the score to be clarified and additional information to
be added. This is the first step in creating a ‘machine readable
score’ based on the ‘human readable score’.
This step is necessary because we need a way to efficiently append additional information to the score which cannot be entered directly by the score editing program (e.g. Sibelius, Dorico, Finale). In practice we use Sibelius 6 as our primary score editor.
Likewise there are certain limitations to the generated MusicXML which need to be worked around. The primary problem being that dynamic markings are not tied to specific notes. This is important for purposes of score analysis as well as audio rendering.
The overall approach to adding this addtional information is as follows:
Add as much auxilliary information as possible from within Sibelius. This entails using colored note heads, and carefully placed text strings.
Generate the MusicXML file using the Dolet 6 Sibelius plug-in. The resulting MusicXML file is run through score_gen and parsed to find any invalid structures such as damper up events not preceeded by damper down events, or tied notes with no ending note. These problems are cleared by careful re-editing of the score within Sibelius until all the problematic structures are fixed.
As a side effect of step 2 a template ‘edit’ file is generated. This text file has all the relavant ‘machine score’ information from the XML score as a time tagged list. In this step edit information is manually added by entering codes at the end of each line. The codes are cryptic but they are also succinct and allow for relatively painless editing.
Once the addition information is entered xscore_gen is run again to generate three output files:
cmtools --score_gen -x GUTIM_20200803_utf8.xml -d edit0.txt -c score.csv -m score.mid -s score_svg.html -r report.txt
As with step 2 this step may need to be iterated several times to clear syntactic errors in the edit data.
Generate the time line marker information, into temp/time_line_temp.txt
like this:
cmtest -F
This calls cmMidiScoreFollowMain()
in app\cmMidiScoreFollow.c.
Then paste temp\time_line_temp.txt
into kc/src/kc/data/round1.js.
Note color is used to assign notes to groups. These groups may later be used to indicate certain processes which will be performed on these notes during performance.
There are currently three defined groups ‘even’,‘dynamics’ and ‘tempo’.
Description | Number | Color |
---|---|---|
Even | #0000FF | blue |
Tempo | #00FF00 | green |
Dyn | #FF0000 | red |
Tempo + Even | #00FFFF | green + blue (turquoise) |
Dyn + Even | #FF00FF | red + blue |
Dyn + Tempo | #FF7F00 | red + green (brown) |
Tempo + Even + Dyn | #996633 | purple |
Decrement color by one (i.e. 0xFE) to indicate the last note in a group of measured notes. Note that a decremented color stops all active measures not just the measurement associated with the decremented color.
Rectangles around a number indicate sections numbers. Sections are used to aggregate measurements and to indicate where particular transforms will be applied in the electronic score.
TODO: Show screen shot
xscore_gen is known to work with the MusicXML files produced by the [Dolet 6 Sibelius plug-in]https://www.musicxml.com/
After generating the file it is necessary to do some minor pre-processing before submitting it to xscore_gen
iconv -f UTF-16 -t UTF-8 -o score-utf16.xml score-utf8.xml
On the first line of score-utf8.xml change:
<?xml version='1.0' encoding='UTF-16' standalone='no'?>
to
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
Note that naively opening score-utf8.xml
with emacs will
crash emacs because the stated XML file encoding encoding='UTF-16'
will not match the actual file encoding (UTF-8). Work around
this problem by editing the first line with vi
.
cmtools --score_gen -x myscore.xml -d myedit.txt {--damper}
Here’s a snippet of a typical ‘edit’ file.
Part:P1
1 : div:768 beat:4 beat-type:4 (3072)
idx voc loc tick durtn rval flags
--- --- ----- ------- ----- ---- --- ---------------
0 0 2 0 0 0.0 |--------------
1 0 0 0 54 4.0 --------------- 54 bpm
2 1 0 0 3072 1.0 -R-------------
3 5 0 0 2304 2.0 -R-.-----------
4 0 0 996 0 0.0 --------V------
5 0 0 1920 0 0.0 --------^------
6 5 0 2304 341 8.0 -R-------------
7 0 0 2643 0 0.0 --------V------
8 5 0 2645 85 32.0 -R-------------
9 5 3 2730 85 32.0 F 5 --------------*
10 5 4 2815 85 32.0 Ab2 --------------*
11 5 5 2900 85 32.0 C 3 --------------*
12 5 6 2985 87 32.0 F 6 --------------*
13 1 0 3072 768 4.0 -R-------------
14 5 0 3072 768 4.0 -R------------- 3840
Column | Description |
---|---|
idx | event index |
voc | voice index |
tick | MIDI tick |
durtn | duration in MIDI ticks |
rval | rythmic value |
pitch | scientific pitch |
flags | event attributes |
Event attribute symbols used in the edit file:
Desc | Flag | |
---|---|---|
Bar | ||
Rest | R | Rest event |
Grace | G | Grace note event |
Dot | . | note is dotted |
Chord | C | note is part of a chord |
Even | e | note is part of an ‘even’ group |
Dyn | d | note is part of a ‘dynamics’ group |
Tempo | t | note is part of a ‘tempo’ group |
DampDn | V | damper down event |
DampUp | ^ | damper up event |
DampUpDn | X | damper up/down event |
SostDn | { | sostenuto down event |
Section | S | section boundary |
SostUp | } | sostenuto up event |
Heel | H | heel event |
Tie Begin | T | begin of a tied note |
Tie End | _ | end of a tied note |
Onset | * | note onset |
!<dyn_mark> Assign dynamics
!(<dyn_mark>) - less uncertain dynamic mark
!<upper-case-dyn-mark> - begin of dynamic fork (See note below regarding dynamic forks)
!!<upper-case-dyn-mark> - end of dynamic fork
~<mark> Insert or remove event (See pedal marks below.)
@<new_tick_value> Move event to a new time position
%<grace_note_flag> Flag note as a grace note
%%<grace_note_flag> -last note in grace note sequence
$<sci_pitch> Assign a note a new pitch
<grace_note_flag>
b (begin grace)
a (add grace and end grace)
s (subtract grace and end grace)
g (grace note)
A (after first)
N (soon after first)
Note: The first non-grace note in a grace note sequence is marked with a %b. The last non-grace note in a grace note sequence is marked with a %s or %a.
Where: %s = steal time from the note marked with %b.
%a = insert time prior to the note marked with %a.
The last (by row number) note (grace or non-grace) in the the sequence is marked with %%# where # is replaced with a,b,s,or g.
It is only necessary to mark the tick number of grace notes in order to give the time sequence of the notes. A single grace note therefore does not require an explict tick mark notation (i.e. @####)
Mark | Note |
---|---|
d | sostenuto down just after note onset |
u | sostenuto up just before this event |
x | sostenuto up just before this event and down just after it |
D | damper pedal down after this event |
U | damper pedal up before this event |
_ | set tie end flag |
& | skip this event |
s (silent note)
pppp-
pppp
pppp+
ppp-
ppp
ppp+
pp-
pp
pp+
p-
p
p+
mp-
mp
mp+
mf-
mf
mf+
f-
f
f+
ff
ff+
fff
Use upper case dynamic letters to indicate forks in the dynamics which should be filled automatically. Note that all notes in the voice assigned to the first note in the fork will be included in the dynamic change. To exclude a note from the fork assign it a lower case mark.
The tied C#3 in measure 13 (tick:198460) was not terminated.
The tied Bb3 in measure 12 marked as a tied note but is also marked to sound.
Damper down not preceded by damper up in measure:10.
Damper up not preceded by damper down in measure:23.
Damper up/down not preceded by damper down in measure:%34.
A shorten/shift operation was done to reconcile two overlapped D4 (ticks:1651523 1651983) notes in measure 335.
A time embedded note (bar=350 A5) was removed even though it overlapped with a note in the same voice.