arca- A digital implementation of Athanasius Kircher's device for automatic music composition, the Arca musarithmica of 1650

CopyrightData from Kircher 1650; implementation (c) 2022 Andrew A. Cashner
Safe HaskellNone




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.


Build the ark

arca :: Arca Source #

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 Columns. 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).


_toneSystems :: ToneSystem Source #

Tone system (Durus, all naturals; or Mollis, one B flat) per tone

_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

_allTones :: [Tone] Source #

Set of all tone labels

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