Humdrum lab 8
Update
Update Humdrum extras by going to the humdrum-tools directory and typing:
make update make
chorck
Chorck is a Humdrum Extras tool for checking the part-writing syntax of chorales. documentation for the chork tool
Eight syntax rules are checked by the program, as defined in the music-theory textbook: . Tonal Harmony with an Introduction to Twentieth-Century Music by Stefan Kostka and Dorthy Payne:
- Parallel 5ths between two voices when moving to different pitch classes.
- Parallel Octaves between two voices when moving to different pitch classes.
- Contrary parallel 5ths -- when two voices move in parallel 5ths displaced by an octave. (such as an octave and a fifth going to a fifth)
- Unequal 5ths -- when the bass part and another voice move from dim 5ths to perfect 5ths or vice versa.
- Hidden 5ths -- when the soprano moves in similar motion with another voice and the soprano leaps to a perfect 5th with that voice.
- Hidden 8va -- when the soprano moves in similar motion with another voice and the soprano leaps to a perfect octave with that voice.
- Voice crossing -- when an inner voice goes above the soprano voice or below the bass voice.
- Open spacing -- when the interval between successive voices other than the bass exceeds an octave.
How many times does Bach violate the rules?
chorck chor*.krn -w | wc -l
List of the rule violations by type
chorck *.krn -w | sed 's/between.*//' | sortcount 647 7. Voice crossing 491 5. Hidden 5th 441 8. Open spacing 243 6. Hidden octave 93 4. Unequal 5th 61 3. Contrary parallel 5th 36 1. Parallel 5th 6 2. Parallel octave
List of the rule violations by voice pairs
chorck *.krn -w | sed 's/on line.*//' | sortcount 338 8. Open spacing between alto and tenor 329 7. Voice crossing between tenor and bass 202 5. Hidden 5th between soprano and alto 191 5. Hidden 5th between soprano and tenor 174 6. Hidden octave between soprano and tenor 156 7. Voice crossing between soprano and alto 103 8. Open spacing between soprano and alto 98 5. Hidden 5th between soprano and bass 84 7. Voice crossing between alto and bass 78 7. Voice crossing between soprano and tenor 46 6. Hidden octave between soprano and bass 37 4. Unequal 5th between bass and soprano 32 4. Unequal 5th between bass and alto 24 4. Unequal 5th between bass and tenor 23 6. Hidden octave between soprano and alto 19 3. Contrary parallel 5th between bass and alto 18 3. Contrary parallel 5th between tenor and soprano 14 1. Parallel 5th between tenor and soprano 12 1. Parallel 5th between tenor and alto 11 3. Contrary parallel 5th between bass and tenor 7 3. Contrary parallel 5th between bass and soprano 6 3. Contrary parallel 5th between tenor and alto 4 1. Parallel 5th between bass and soprano 3 1. Parallel 5th between bass and tenor 3 2. Parallel octave between bass and alto 2 2. Parallel octave between bass and tenor 2 1. Parallel 5th between bass and alto 1 2. Parallel octave between tenor and soprano 1 1. Parallel 5th between alto and soprano
Which files contain parallel octaves?
chorck -wfr 2 chor*.krn 2. Parallel octave between bass and tenor on line 57 (chor078.krn) 2. Parallel octave between bass and tenor on line 52 (chor114.krn) 2. Parallel octave between bass and alto on line 65 (chor164.krn) 2. Parallel octave between bass and alto on line 94 (chor226.krn) 2. Parallel octave between tenor and soprano on line 34 (chor270.krn) 2. Parallel octave between bass and alto on line 45 (chor334.krn)
Looking at the rule violations in VHV
chorck -r 2 chor078.krn | pbcopy
Then paste into VHV:
Is a parallel octave at a phrase boundary a rule violation?
cint
cint is a tool that extract counterpoint modules from polyphonic music. documentation for cint
It is a generalized tool related to chorck, which is a specialized tool.
Getting a list of counterpoint modules in a piece
cint --raw chor001.krn | head -n 10 10 8 3 12 8 5 15 8 8 3 1 3 6 1 6 4 1 4 3 -3 6 5 -3 8 8 -3 10 3 2 3
The most common modules in Bach chorales:
cint --raw *.krn | sortcount | head -n 10 3500 5 -2 6 3354 6 2 5 2867 3 -2 4 2838 4 -2 5 2735 6 -2 6 2579 5 1 6 2498 3 -2 3 2479 3 1 4 2436 3 2 3 2414 10 2 10
The -O option will collapse compound intervals such as "10 2 10" into "3 2 3" (10th is an octave plus a 3rd).
cint -O --raw *.krn | sortcount | head -n 10 5070 3 2 3 5033 6 2 5 4746 3 -2 4 4394 5 -2 6 4213 5 2 3 4088 3 -2 3 3943 2 -2 3 3833 4 -2 5 3346 3 1 4 3335 6 -2 6
The most common module in Bach chorales is a rising parallel 3rd "3 2 3"
parallel thirds
The three-interval counterpoint module for stepwise rising parallel thirds is "3 2 3". this can be done as a filter in VHV:
!!!filter: cint -O --search "3 2 3"
The -O option collapses intervals greater than an octave to less than an octave, such as 10th (an octave plus a 3rd) being transposed to 3rds.
Josquin modules
What about in Josquin's music:
cint -R -O --raw h://jrp/Jos | sortcount | head -n 10 23123 3 1 3 19880 6 1 5 19517 4 1 3 19515 3 -2 3 18545 3 2 3 16389 3 -2 4 15812 5 -2 6 15784 5 1 6 15772 5 1 5 15625 8 1 8
The most common is a repeated 3rd.
Renaissance music is more polyphonic than Bach chorales, so it is better to indicate if the notes are attacked or sustained at each point in the module:
oznin:chorales css$ cint -R -O -x --raw h://jrp/Jos | sortcount | head -n 10
13912 3xx -2 3xx 13343 3xx 2 3xx 8782 6sx -2 8xx 7779 4sx 1 3sx 7402 7xs 1 6sx 7374 3xx 1 4sx 7315 4xs 1 3sx 6932 3xx -2 4xs 6878 6sx 1 5sx 6537 6xx 1 5sx
With respect to note attacks/sustains, a falling parallel 3rd is the most common, followed by a rising parallel 3rd.
Regular expressions
All parallel thirds in a chorale:
cint --raw chor001.krn | grep "3 .* 3" | sortcount 10 3 -2 3 10 3 2 3 3 3 1 3 1 3 4 3 1 3 3 3
Remove repeated note cases:
cint -U --raw chor001.krn | grep "3 .* 3" | sortcount 10 3 2 3 10 3 -2 3 1 3 4 3 1 3 3 3
With note attack information
cint -U -x --raw chor001.krn | grep "3[sx]* .* 3[sx]*" | sortcount 7 3xx -2 3xx 7 3xx 2 3xx 3 3xs 2 3xx 2 3sx -2 3xx 1 3xx 3 3xx 1 3xs -2 3xx 1 3xx 4 3xx
Highlight modules which are parallel 3rds without repeats where both notes attack on the thirds:
!!!filter: cint -U -x --search "3[sx]* .* 3[sx]*"