Copyright | Data from Kircher 1650; implementation (c) 2022 Andrew A. Cashner |
---|---|
Stability | Experimental |
Safe Haskell | None |
Language | Haskell2010 |
Arca musarithmica Athanasii Kircheri Societatis Iesu MDCL.
This module builds Kircher's ark as a Haskell data structure, using the types
and methods defined in the Aedifico
module (see that module for detailed
description of the ark's structure and implementation.)
Like Kircher's physical implementation, this module is the container for the data grouped by syntagma, each of which holds a group of pinakes (rods with data tables).
So far we have implemented only Syntagma 1, simple note-against-note counterpoint.
Synopsis
- arca :: Arca
- _vocalRanges :: VoiceRanges
- _toneSystems :: ToneSystem
- _toneList :: ToneList
- _allTones :: [Tone]
- listExclude :: (Foldable t, Eq a) => t a -> [a] -> [a]
- allTonesExcept :: [Tone] -> [Tone]
- _pinaxTones :: PinaxToneList
Build the ark
To build the whole ark (arca
), take the syntagma data entered as a
nested list and convert it to an Arca
(which is a vector of vectors down
to the Column
level).
arca = fromList [s0] :: Arca
How sub-elements are built
To build the syntagma, convert the pinakes from lists to vectors. s0' has
two pinakes: one for long penultimate syllables (s0p0
) and one for short
(s0p1
).
s0 = fromList [s0p0, s0p1] :: Syntagma
We build the each Pinax
from Column
s.
The first one (s0p0
) is for phrases with a long penultimate syllable.
There are five columns (c0
... c4
). All the columns are a 2-tuple of a
Vperm
and an Rperm
:
c0 = (c0v, c0r) :: Column
The first element (c0v
) is a VpermTable
with the pitch numbers:
c0v :: VpermTable c0v = fromList2D [ [ -- 0 [5, 5], [7, 8], [2, 3], [5, 1] ], [ -- 1 [5, 5], [7, 7], [2, 2], [5, 5] ], ... ]
The second element (c0r
) is an RpermTable
with matching rhythm
permutations in the three metrical categories:
c0r :: RpermTable c0r = fromList2D [ [ -- duple [Sb, Sb], [Mn, Mn], [Sm, Sm], [Fs, Fs], [SbD, Mn], [MnD, Sm], [SmD, Fs] ], [ -- triple major [Br, Sb], [BrD, BrD] ], [ -- triple minor [Sb, Mn] ] ]
The other columns are constructed similarly with the data from Kircher.
The arca also includes Kircher's list of notes in each tone with their accidentals, a list indicating which tones are cantus durus (all naturals in the signature) or cantus mollis (one B flat in the signature), a list of which tones are acceptable in each pinax, and a list of the acceptable ranges for each voice based on the most conventional clef combination.
Voice ranges
_vocalRanges :: VoiceRanges Source #
Range for each voice, based on SATB C-clef ranges, generally up to one ledger line above and below the staff (Cantus C1, alto C3, tenor C4, bass f4 clefs), as shown on the front of the ark in Iconismus XIV. We are using the untransposed ranges. These are notably different from those of a modern mixed choir, as Kircher as all-male choirs in mind and the alto clef gives a much lower range.
NB (unimplemented part of specification):
Kircher says that if a voice goes out of range, one option to fix it
is to switch to the transposing set of clefs shown on the ark. We are not
implementing this, because (1) nobody ever switched to transposing clefs
for a single phrase and then back, (2) we have a better algorithm for
setting the melodies within range than the incomplete specification
provided by Kircher (Cogito.Musarithmia.stepwiseVoiceInRange
).
Tones
_toneList :: ToneList Source #
Notes in the scale for each tone, with accidentals:
Kircher includes suggested flats and sharps on notes likely to be altered in musica ficta practice; in his tone tables he omits the B flats that would always be added in tones in cantus mollis
We include both here, and elsewhere in the program we determine whether the B flat is from the signature or should be treated as ficta.
The tones on p. 51 and on the Iconismus illustration do not agree. We follow the (presumably later) version on the Iconismus, which corrects errors in the mensa tonographica of p. 51.
Appropriate tones for each pinax
listExclude :: (Foldable t, Eq a) => t a -> [a] -> [a] Source #
Exclude elements of list in arg1 from list in arg2
allTonesExcept :: [Tone] -> [Tone] Source #
Create a list of tones, excluding blacklist from _allTones
_pinaxTones :: PinaxToneList Source #
Tones appropriate for each pinax