tonus 0.1.8 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/BIBLIOGRAPHY.md +132 -108
  2. package/CHANGELOG.md +598 -1
  3. package/LICENSE +133 -29
  4. package/README.md +106 -83
  5. package/dist/data/am.js +2666 -11196
  6. package/dist/data/ams.d.ts +5 -0
  7. package/dist/data/ams.js +122 -0
  8. package/dist/data/attestation.d.ts +19 -0
  9. package/dist/data/attestation.js +15716 -0
  10. package/dist/data/attestation.json +15711 -0
  11. package/dist/data/cadentiae.d.ts +43 -0
  12. package/dist/data/cadentiae.js +174 -0
  13. package/dist/data/cal.js +48 -0
  14. package/dist/data/census.d.ts +12 -0
  15. package/dist/data/census.js +36 -0
  16. package/dist/data/commune-office.d.ts +4 -0
  17. package/dist/data/commune-office.js +2371 -0
  18. package/dist/data/commune-office.json +2365 -0
  19. package/dist/data/commune.js +181 -11
  20. package/dist/data/corpus-overlap.d.ts +17 -0
  21. package/dist/data/corpus-overlap.js +299 -5
  22. package/dist/data/cot.d.ts +5 -0
  23. package/dist/data/cot.js +172 -0
  24. package/dist/data/cse.d.ts +5 -0
  25. package/dist/data/cse.js +122 -0
  26. package/dist/data/gabc-glyphs.d.ts +45 -0
  27. package/dist/data/gabc-glyphs.js +122 -0
  28. package/dist/data/gr.js +754 -6394
  29. package/dist/data/kyriale.js +116 -116
  30. package/dist/data/la.js +799 -13419
  31. package/dist/data/lh.js +113 -3473
  32. package/dist/data/lu.js +931 -17631
  33. package/dist/data/nocturnale-romanum.js +1659 -10411
  34. package/dist/data/office-ferial.d.ts +4 -0
  35. package/dist/data/office-ferial.js +396 -0
  36. package/dist/data/office-ferial.json +391 -0
  37. package/dist/data/office-monastic.d.ts +17 -1
  38. package/dist/data/office-monastic.js +1403 -466
  39. package/dist/data/office-psalms-monastic.d.ts +13 -1
  40. package/dist/data/office-psalms-monastic.js +9 -0
  41. package/dist/data/propers.js +1 -1
  42. package/dist/data/psalms.js +22919 -5
  43. package/dist/data/psm.d.ts +5 -0
  44. package/dist/data/psm.js +122 -0
  45. package/dist/data/seasonal-respbreve.d.ts +5 -0
  46. package/dist/data/seasonal-respbreve.js +41 -0
  47. package/dist/data/seasonal-respbreve.json +35 -0
  48. package/dist/data/smufl-glyphs.d.ts +17 -0
  49. package/dist/data/smufl-glyphs.js +1546 -0
  50. package/dist/data/smufl-glyphs.json +1530 -0
  51. package/dist/engines/cal/calendar.d.ts +3 -2
  52. package/dist/engines/cal/calendar.js +105 -29
  53. package/dist/engines/cal/data/eras.d.ts +35 -0
  54. package/dist/engines/cal/data/eras.js +128 -0
  55. package/dist/engines/cal/date.js +44 -0
  56. package/dist/engines/cal/types.d.ts +15 -3
  57. package/dist/engines/cal/types.js +5 -5
  58. package/dist/engines/census/census.d.ts +7 -0
  59. package/dist/engines/census/census.js +179 -0
  60. package/dist/engines/census/types.d.ts +55 -0
  61. package/dist/engines/census/types.js +8 -0
  62. package/dist/engines/chant/attest.d.ts +39 -0
  63. package/dist/engines/chant/attest.js +90 -0
  64. package/dist/engines/chant/chant.d.ts +16 -4
  65. package/dist/engines/chant/chant.js +220 -30
  66. package/dist/engines/chant/data/compline.js +2 -1
  67. package/dist/engines/chant/data/masses.d.ts +56 -4
  68. package/dist/engines/chant/data/masses.js +305 -80
  69. package/dist/engines/chant/data/prime.js +1 -1
  70. package/dist/engines/chant/hour.js +279 -58
  71. package/dist/engines/chant/ordinary.d.ts +2 -0
  72. package/dist/engines/chant/ordinary.js +336 -56
  73. package/dist/engines/chant/propers.js +55 -5
  74. package/dist/engines/chant/psalm.d.ts +4 -4
  75. package/dist/engines/chant/psalm.js +25 -11
  76. package/dist/engines/chant/syllabify.d.ts +1 -0
  77. package/dist/engines/chant/syllabify.js +90 -17
  78. package/dist/engines/chant/types.d.ts +115 -12
  79. package/dist/engines/chant/types.js +38 -3
  80. package/dist/engines/harmonia/api.js +4 -0
  81. package/dist/engines/harmonia/data/doctrines.js +3 -1
  82. package/dist/engines/harmonia/tabula.d.ts +3 -0
  83. package/dist/engines/harmonia/tabula.js +1 -0
  84. package/dist/engines/harmonia/voice.d.ts +4 -0
  85. package/dist/engines/harmonia/voice.js +8 -4
  86. package/dist/engines/imprint.js +14 -1
  87. package/dist/engines/planet/orbital.js +4 -4
  88. package/dist/engines/planet/planet.d.ts +10 -0
  89. package/dist/engines/planet/planet.js +30 -3
  90. package/dist/engines/planet/position.js +13 -10
  91. package/dist/engines/planet/types.d.ts +1 -0
  92. package/dist/engines/score/api.d.ts +2 -13
  93. package/dist/engines/score/api.js +21 -8
  94. package/dist/engines/score/articulation.js +2 -2
  95. package/dist/engines/score/cadence.d.ts +76 -0
  96. package/dist/engines/score/cadence.js +96 -0
  97. package/dist/engines/score/emitters/accidentals.d.ts +21 -0
  98. package/dist/engines/score/emitters/accidentals.js +88 -0
  99. package/dist/engines/score/emitters/atramentum.d.ts +107 -0
  100. package/dist/engines/score/emitters/atramentum.js +239 -0
  101. package/dist/engines/score/emitters/breaking.d.ts +62 -0
  102. package/dist/engines/score/emitters/breaking.js +80 -0
  103. package/dist/engines/score/emitters/moderna.d.ts +38 -0
  104. package/dist/engines/score/emitters/moderna.js +612 -0
  105. package/dist/engines/score/emitters/svg.d.ts +143 -0
  106. package/dist/engines/score/emitters/svg.js +1328 -0
  107. package/dist/engines/score/emitters/tracks.d.ts +104 -0
  108. package/dist/engines/score/emitters/tracks.js +728 -0
  109. package/dist/engines/score/infer.d.ts +3 -3
  110. package/dist/engines/score/infer.js +2 -2
  111. package/dist/engines/score/inscriptio.d.ts +69 -0
  112. package/dist/engines/score/inscriptio.js +138 -0
  113. package/dist/engines/score/ir.d.ts +2 -2
  114. package/dist/engines/score/ir.js +59 -12
  115. package/dist/engines/score/lyric.d.ts +23 -0
  116. package/dist/engines/score/lyric.js +234 -0
  117. package/dist/engines/score/meta.d.ts +2 -2
  118. package/dist/engines/score/modulation.d.ts +12 -0
  119. package/dist/engines/score/modulation.js +49 -0
  120. package/dist/engines/score/neume.js +35 -4
  121. package/dist/engines/score/parse.js +150 -9
  122. package/dist/engines/score/phrasing.js +4 -3
  123. package/dist/engines/score/prosody.d.ts +38 -0
  124. package/dist/engines/score/prosody.js +70 -6
  125. package/dist/engines/score/tabula.d.ts +37 -5
  126. package/dist/engines/score/tabula.js +18 -0
  127. package/dist/engines/score/types.d.ts +88 -1
  128. package/dist/engines/temper/api.d.ts +4 -1
  129. package/dist/engines/temper/api.js +28 -5
  130. package/dist/engines/temper/data/guido.js +6 -2
  131. package/dist/engines/temper/data/modes.d.ts +6 -0
  132. package/dist/engines/temper/data/modes.js +42 -0
  133. package/dist/engines/temper/data/tones.d.ts +1 -1
  134. package/dist/engines/temper/data/tones.js +20 -11
  135. package/dist/engines/temper/interval.js +4 -3
  136. package/dist/engines/temper/modality.d.ts +11 -2
  137. package/dist/engines/temper/modality.js +74 -2
  138. package/dist/engines/temper/modes.d.ts +1 -1
  139. package/dist/engines/temper/pitch.d.ts +1 -1
  140. package/dist/engines/temper/pitch.js +12 -2
  141. package/dist/engines/temper/scale.d.ts +53 -0
  142. package/dist/engines/temper/scale.js +107 -8
  143. package/dist/index.d.ts +26 -8
  144. package/dist/index.js +37 -4
  145. package/docs/api/calendar.md +279 -0
  146. package/docs/api/census.md +288 -0
  147. package/docs/api/chant.md +657 -0
  148. package/docs/api/heavens.md +346 -0
  149. package/docs/api/index.md +263 -0
  150. package/docs/api/score.md +873 -0
  151. package/docs/api/tuning.md +619 -0
  152. package/package.json +11 -5
  153. package/dist/data/office-matins-roman.d.ts +0 -19
  154. package/dist/data/office-matins-roman.js +0 -4383
  155. package/dist/data/office-psalms-roman.d.ts +0 -15
  156. package/dist/data/office-psalms-roman.js +0 -28
  157. package/dist/data/office-roman.d.ts +0 -19
  158. package/dist/data/office-roman.js +0 -13792
  159. package/dist/engines/chant/matutinum.d.ts +0 -33
  160. package/dist/engines/chant/matutinum.js +0 -81
  161. package/dist/engines/score/emitters/midi.d.ts +0 -65
  162. package/dist/engines/score/emitters/midi.js +0 -162
  163. package/dist/engines/score/emitters/musicxml.d.ts +0 -18
  164. package/dist/engines/score/emitters/musicxml.js +0 -166
@@ -0,0 +1,43 @@
1
+ /** One corpus cadence family: a (shape, arrival) pair with its statistics. */
2
+ export interface CadentiaFamilia {
3
+ /** "shape @arrival", e.g. "2,0,-2 @0" — joins mining/census artifacts. */
4
+ key: string;
5
+ /** Interval signature in semitones between the tail's consecutive notes. */
6
+ shape: number[];
7
+ /** Closing note minus the chant's own closing note (sounded final),
8
+ * in SIGNED semitones — not octave-reduced; see the arrival note above. */
9
+ arrival: number;
10
+ /** Corpus occurrences. */
11
+ n: number;
12
+ /** `n` over ALL phrase-ends (CADENTIAE_POPULATION.ends) — not over the
13
+ * tabled subset, which would flatter every family that cleared the floor. */
14
+ share: number;
15
+ /** Share of occurrences at a final close — the measured finality index. */
16
+ finality: number;
17
+ /** Occurrences by mode digit ("1".."8"; "?" = mode-less chants). */
18
+ modes: Record<string, number>;
19
+ }
20
+ /**
21
+ * The denominator behind every `share`: all phrase-ends in the sung corpus,
22
+ * and the same total per mode digit. Both are the FULL tally, never summed
23
+ * from the tabled families — a family's mode counts divided by the tabled
24
+ * subset would overstate every one of them.
25
+ *
26
+ * With `byMode`, a family's lift in a given mode is one division:
27
+ * `(modes[m] / byMode[m]) / share` — how much more (or less) that mode
28
+ * reaches for this close than the corpus at large. Baked as vocabulary, not
29
+ * as arithmetic: the ratio is the caller's to take.
30
+ */
31
+ export declare const CADENTIAE_POPULATION: {
32
+ readonly ends: number;
33
+ readonly byMode: Readonly<Record<string, number>>;
34
+ };
35
+ /** The cadence catalogue, most frequent family first. */
36
+ export declare const CADENTIAE: CadentiaFamilia[];
37
+ /**
38
+ * The catalogued family for a cadence signature, or undefined when the
39
+ * signature falls below the table's floor. Deferred: a caller who never asks
40
+ * does not pay for the Map.
41
+ */
42
+ export declare function cadentiaFamilia(key: string): CadentiaFamilia | undefined;
43
+ //# sourceMappingURL=cadentiae.d.ts.map
@@ -0,0 +1,174 @@
1
+ // AUTO-GENERATED by scripts/bake-cadentiae.mjs — do not edit manually
2
+ // (No timestamp by design: identical input must bake to an identical file,
3
+ // or every regeneration churns the diff. Git carries the dates.)
4
+ // ---------------------------------------------------------------------------
5
+ // data/cadentiae — the corpus-grounded cadence catalogue (CADENTIAE)
6
+ // ---------------------------------------------------------------------------
7
+ // Every phrase-end in the corpus tonus SHIPS (am, ams, cot, cse, gr, la, lh, lu, nr, psm — 26787
8
+ // ends), keyed by the last <=4 notes' interval signature in semitones (the
9
+ // shape — the gesture) and the closing note's offset from the CHANT'S OWN
10
+ // closing note (its sounded final — not the labeled mode's final), as a SIGNED
11
+ // semitone count (the arrival — the function).
12
+ //
13
+ // The arrival is deliberately not octave-reduced: the mod-12 fold pooled a
14
+ // fifth ABOVE the final with a fourth BELOW — measured, 3,499 of
15
+ // 27,985 phrase ends landed on @-5, of which 2,427 were really +7. Two
16
+ // opposite gestures under one key. Folding survives as a degree field on a live
17
+ // cadence event, where it is the scale degree and mode-theoretically real.
18
+ //
19
+ // The population is the SUNG corpus, not the printed books: this table and the
20
+ // census now count the same chants, which they never did before. No Latin
21
+ // arrival names ride the table, for the same reason no family names do:
22
+ // the key carries the arrival; the reader can count. Families with n >= 50 are tabled here (110 families,
23
+ // 56.8% of all phrase-ends); the full tally lives in the mining
24
+ // artifact. finality = share of a family's occurrences at a final close
25
+ // ("::" or chant end) — measured function, continuous, corpus-derived.
26
+ //
27
+ // This is inventa, not tradita: a computed catalogue with stated method and
28
+ // open code ("tonus catalogue, method §cadentiae"). Families are identified by
29
+ // their key alone — the shape and its arrival; no editorial names ride the
30
+ // table. Method + display doctrine: working/design-analysis-track.md §CADENTIAE.
31
+ /**
32
+ * The denominator behind every `share`: all phrase-ends in the sung corpus,
33
+ * and the same total per mode digit. Both are the FULL tally, never summed
34
+ * from the tabled families — a family's mode counts divided by the tabled
35
+ * subset would overstate every one of them.
36
+ *
37
+ * With `byMode`, a family's lift in a given mode is one division:
38
+ * `(modes[m] / byMode[m]) / share` — how much more (or less) that mode
39
+ * reaches for this close than the corpus at large. Baked as vocabulary, not
40
+ * as arithmetic: the ratio is the caller's to take.
41
+ */
42
+ export const CADENTIAE_POPULATION = Object.freeze({
43
+ ends: 26787,
44
+ byMode: Object.freeze({ "1": 5180, "2": 3704, "3": 2640, "4": 2700, "5": 2770, "6": 1597, "7": 3335, "8": 4610, "?": 251 }),
45
+ });
46
+ /** The cadence catalogue, most frequent family first. */
47
+ export const CADENTIAE = [
48
+ { "key": "2,0,-2 @0", "shape": [2, 0, -2], "arrival": 0, "n": 1116, "share": 0.0417, "finality": 0.43, "modes": { "1": 153, "2": 204, "3": 34, "4": 8, "5": 142, "6": 143, "7": 109, "8": 321, "?": 2 } },
49
+ { "key": "2,-2,0 @0", "shape": [2, -2, 0], "arrival": 0, "n": 785, "share": 0.0293, "finality": 0.397, "modes": { "1": 82, "2": 131, "3": 7, "4": 4, "5": 91, "6": 148, "7": 106, "8": 200, "?": 16 } },
50
+ { "key": "-2,0,-2 @0", "shape": [-2, 0, -2], "arrival": 0, "n": 581, "share": 0.0217, "finality": 0.685, "modes": { "1": 6, "2": 24, "3": 2, "4": 2, "5": 174, "6": 27, "7": 118, "8": 227, "?": 1 } },
51
+ { "key": "-2,2,0 @0", "shape": [-2, 2, 0], "arrival": 0, "n": 537, "share": 0.02, "finality": 0.436, "modes": { "1": 115, "2": 124, "3": 7, "4": 50, "7": 60, "8": 169, "?": 12 } },
52
+ { "key": "1,-1,-2 @0", "shape": [1, -1, -2], "arrival": 0, "n": 349, "share": 0.013, "finality": 0.484, "modes": { "1": 238, "2": 80, "3": 1, "4": 8, "5": 5, "7": 8, "8": 9 } },
53
+ { "key": "-2,2,-2 @0", "shape": [-2, 2, -2], "arrival": 0, "n": 341, "share": 0.0127, "finality": 0.302, "modes": { "1": 33, "2": 38, "3": 11, "4": 3, "5": 22, "6": 14, "7": 48, "8": 171, "?": 1 } },
54
+ { "key": "2,0,-2 @-2", "shape": [2, 0, -2], "arrival": -2, "n": 333, "share": 0.0124, "finality": 0.228, "modes": { "1": 63, "2": 51, "3": 50, "4": 13, "5": 36, "6": 6, "7": 22, "8": 74, "?": 18 } },
55
+ { "key": "2,-2,-2 @0", "shape": [2, -2, -2], "arrival": 0, "n": 277, "share": 0.0103, "finality": 0.498, "modes": { "1": 27, "2": 3, "3": 7, "5": 22, "6": 44, "7": 52, "8": 121, "?": 1 } },
56
+ { "key": "-2,0,-2 @-2", "shape": [-2, 0, -2], "arrival": -2, "n": 264, "share": 0.0099, "finality": 0.068, "modes": { "1": 78, "2": 68, "3": 1, "4": 2, "5": 2, "7": 13, "8": 100 } },
57
+ { "key": "2,2,-2 @0", "shape": [2, 2, -2], "arrival": 0, "n": 258, "share": 0.0096, "finality": 0.438, "modes": { "1": 48, "2": 121, "3": 8, "4": 2, "5": 1, "6": 6, "7": 18, "8": 54 } },
58
+ { "key": "2,0,-2 @3", "shape": [2, 0, -2], "arrival": 3, "n": 254, "share": 0.0095, "finality": 0.035, "modes": { "1": 48, "2": 53, "3": 32, "4": 53, "5": 39, "6": 3, "7": 8, "8": 12, "?": 6 } },
59
+ { "key": "-3,2,-2 @0", "shape": [-3, 2, -2], "arrival": 0, "n": 240, "share": 0.009, "finality": 0.292, "modes": { "1": 89, "2": 113, "3": 17, "4": 14, "5": 6, "7": 1 } },
60
+ { "key": "-2,-1,0 @0", "shape": [-2, -1, 0], "arrival": 0, "n": 229, "share": 0.0085, "finality": 0.69, "modes": { "3": 95, "4": 130, "6": 1, "?": 3 } },
61
+ { "key": "-1,-2,0 @0", "shape": [-1, -2, 0], "arrival": 0, "n": 227, "share": 0.0085, "finality": 0.59, "modes": { "1": 139, "2": 66, "3": 15, "7": 1, "8": 3, "?": 3 } },
62
+ { "key": "-2,-2,2 @0", "shape": [-2, -2, 2], "arrival": 0, "n": 220, "share": 0.0082, "finality": 0.441, "modes": { "1": 73, "2": 73, "3": 7, "4": 4, "5": 13, "7": 12, "8": 37, "?": 1 } },
63
+ { "key": "-2,-2,0 @0", "shape": [-2, -2, 0], "arrival": 0, "n": 220, "share": 0.0082, "finality": 0.536, "modes": { "1": 4, "4": 2, "5": 22, "6": 80, "7": 30, "8": 81, "?": 1 } },
64
+ { "key": "2,-4,2 @0", "shape": [2, -4, 2], "arrival": 0, "n": 212, "share": 0.0079, "finality": 0.689, "modes": { "1": 18, "2": 13, "3": 127, "4": 3, "7": 16, "8": 34, "?": 1 } },
65
+ { "key": "-2,2,-2 @-2", "shape": [-2, 2, -2], "arrival": -2, "n": 210, "share": 0.0078, "finality": 0.119, "modes": { "1": 22, "2": 48, "3": 11, "4": 53, "5": 1, "7": 24, "8": 45, "?": 6 } },
66
+ { "key": "2,-2,-2 @-2", "shape": [2, -2, -2], "arrival": -2, "n": 206, "share": 0.0077, "finality": 0.126, "modes": { "1": 57, "2": 74, "3": 7, "7": 11, "8": 56, "?": 1 } },
67
+ { "key": "0,-2,0 @0", "shape": [0, -2, 0], "arrival": 0, "n": 204, "share": 0.0076, "finality": 0.544, "modes": { "1": 33, "2": 11, "4": 1, "6": 49, "7": 14, "8": 93, "?": 3 } },
68
+ { "key": "2,1,-3 @0", "shape": [2, 1, -3], "arrival": 0, "n": 195, "share": 0.0073, "finality": 0.938, "modes": { "1": 67, "2": 125, "3": 2, "5": 1 } },
69
+ { "key": "1,-3,0 @0", "shape": [1, -3, 0], "arrival": 0, "n": 185, "share": 0.0069, "finality": 0.27, "modes": { "1": 99, "2": 62, "3": 1, "4": 14, "5": 8, "7": 1 } },
70
+ { "key": "0,0,-1 @0", "shape": [0, 0, -1], "arrival": 0, "n": 166, "share": 0.0062, "finality": 0.627, "modes": { "2": 2, "3": 53, "4": 103, "5": 3, "6": 1, "7": 1, "8": 3 } },
71
+ { "key": "-2,-1,-2 @0", "shape": [-2, -1, -2], "arrival": 0, "n": 163, "share": 0.0061, "finality": 0.325, "modes": { "1": 118, "2": 25, "5": 1, "7": 19 } },
72
+ { "key": "2,0,-2 @-4", "shape": [2, 0, -2], "arrival": -4, "n": 159, "share": 0.0059, "finality": 0.472, "modes": { "1": 21, "2": 5, "3": 17, "4": 6, "5": 35, "6": 14, "7": 33, "8": 21, "?": 7 } },
73
+ { "key": "0,0,0 @3", "shape": [0, 0, 0], "arrival": 3, "n": 153, "share": 0.0057, "finality": 0.392, "modes": { "1": 16, "2": 33, "3": 101, "5": 2, "6": 1 } },
74
+ { "key": "-1,-2,-2 @0", "shape": [-1, -2, -2], "arrival": 0, "n": 152, "share": 0.0057, "finality": 0.368, "modes": { "2": 2, "3": 1, "4": 1, "5": 19, "6": 24, "7": 14, "8": 90, "?": 1 } },
75
+ { "key": "2,0,-2 @5", "shape": [2, 0, -2], "arrival": 5, "n": 151, "share": 0.0056, "finality": 0.073, "modes": { "1": 39, "2": 41, "3": 7, "4": 12, "5": 21, "6": 2, "7": 5, "8": 23, "?": 1 } },
76
+ { "key": "0,2,-2 @0", "shape": [0, 2, -2], "arrival": 0, "n": 147, "share": 0.0055, "finality": 0.177, "modes": { "1": 14, "2": 22, "3": 3, "4": 2, "5": 14, "6": 32, "7": 9, "8": 51 } },
77
+ { "key": "2,-4,0 @0", "shape": [2, -4, 0], "arrival": 0, "n": 146, "share": 0.0055, "finality": 0.466, "modes": { "5": 33, "6": 58, "7": 15, "8": 40 } },
78
+ { "key": "-3,0,-2 @0", "shape": [-3, 0, -2], "arrival": 0, "n": 139, "share": 0.0052, "finality": 0.065, "modes": { "1": 3, "2": 28, "4": 2, "5": 9, "7": 8, "8": 89 } },
79
+ { "key": "2,0,-2 @2", "shape": [2, 0, -2], "arrival": 2, "n": 138, "share": 0.0052, "finality": 0.297, "modes": { "1": 9, "2": 16, "3": 14, "4": 2, "5": 14, "6": 45, "7": 13, "8": 21, "?": 4 } },
80
+ { "key": "-4,2,0 @0", "shape": [-4, 2, 0], "arrival": 0, "n": 134, "share": 0.005, "finality": 0.261, "modes": { "1": 66, "2": 32, "4": 1, "7": 10, "8": 25 } },
81
+ { "key": "-1,0,-2 @0", "shape": [-1, 0, -2], "arrival": 0, "n": 130, "share": 0.0049, "finality": 0.346, "modes": { "1": 54, "2": 40, "3": 1, "4": 1, "7": 27, "8": 7 } },
82
+ { "key": "2,1,-1 @4", "shape": [2, 1, -1], "arrival": 4, "n": 128, "share": 0.0048, "finality": 0.141, "modes": { "1": 14, "2": 1, "3": 3, "4": 4, "5": 12, "6": 54, "7": 15, "8": 25 } },
83
+ { "key": "-2,0,-1 @0", "shape": [-2, 0, -1], "arrival": 0, "n": 127, "share": 0.0047, "finality": 0.669, "modes": { "2": 1, "3": 41, "4": 73, "6": 6, "7": 4, "8": 2 } },
84
+ { "key": "2,0,-2 @7", "shape": [2, 0, -2], "arrival": 7, "n": 124, "share": 0.0046, "finality": 0.008, "modes": { "1": 10, "3": 1, "5": 72, "7": 38, "8": 3 } },
85
+ { "key": "2,0,-2 @-7", "shape": [2, 0, -2], "arrival": -7, "n": 124, "share": 0.0046, "finality": 0.306, "modes": { "1": 21, "2": 14, "3": 9, "4": 4, "5": 12, "6": 3, "7": 35, "8": 26 } },
86
+ { "key": "2,1,-1 @0", "shape": [2, 1, -1], "arrival": 0, "n": 123, "share": 0.0046, "finality": 0.293, "modes": { "1": 11, "2": 7, "3": 27, "4": 60, "5": 6, "6": 2, "7": 7, "8": 3 } },
87
+ { "key": "0,0,0 @7", "shape": [0, 0, 0], "arrival": 7, "n": 115, "share": 0.0043, "finality": 0.539, "modes": { "1": 29, "3": 2, "5": 18, "7": 66 } },
88
+ { "key": "-5,0,-2 @-2", "shape": [-5, 0, -2], "arrival": -2, "n": 114, "share": 0.0043, "finality": 0.035, "modes": { "1": 28, "2": 31, "3": 7, "7": 6, "8": 42 } },
89
+ { "key": "2,-2,0 @7", "shape": [2, -2, 0], "arrival": 7, "n": 113, "share": 0.0042, "finality": 0, "modes": { "1": 29, "5": 42, "6": 5, "7": 35, "8": 2 } },
90
+ { "key": "1,-3,-2 @0", "shape": [1, -3, -2], "arrival": 0, "n": 113, "share": 0.0042, "finality": 0.558, "modes": { "5": 11, "7": 21, "8": 80, "?": 1 } },
91
+ { "key": "2,-2,0 @3", "shape": [2, -2, 0], "arrival": 3, "n": 112, "share": 0.0042, "finality": 0, "modes": { "1": 37, "2": 46, "3": 6, "4": 15, "5": 3, "6": 2, "7": 1, "8": 1, "?": 1 } },
92
+ { "key": "-2,2,-2 @5", "shape": [-2, 2, -2], "arrival": 5, "n": 111, "share": 0.0041, "finality": 0.081, "modes": { "1": 35, "2": 2, "3": 3, "4": 17, "7": 7, "8": 47 } },
93
+ { "key": "-2,0,-3 @0", "shape": [-2, 0, -3], "arrival": 0, "n": 109, "share": 0.0041, "finality": 0.743, "modes": { "1": 21, "2": 10, "3": 50, "4": 18, "5": 3, "8": 7 } },
94
+ { "key": "-3,0,-2 @-2", "shape": [-3, 0, -2], "arrival": -2, "n": 106, "share": 0.004, "finality": 0, "modes": { "1": 40, "2": 35, "3": 8, "4": 2, "5": 3, "7": 3, "8": 15 } },
95
+ { "key": "2,0,0 @0", "shape": [2, 0, 0], "arrival": 0, "n": 102, "share": 0.0038, "finality": 0.451, "modes": { "1": 18, "2": 13, "3": 2, "4": 37, "8": 32 } },
96
+ { "key": "2,-2,-3 @0", "shape": [2, -2, -3], "arrival": 0, "n": 99, "share": 0.0037, "finality": 0.626, "modes": { "1": 25, "2": 8, "3": 15, "4": 44, "5": 3, "8": 4 } },
97
+ { "key": "2,-2,0 @5", "shape": [2, -2, 0], "arrival": 5, "n": 99, "share": 0.0037, "finality": 0.03, "modes": { "1": 13, "2": 20, "3": 2, "4": 9, "5": 2, "6": 3, "7": 20, "8": 27, "?": 3 } },
98
+ { "key": "-2,0,-2 @3", "shape": [-2, 0, -2], "arrival": 3, "n": 99, "share": 0.0037, "finality": 0.02, "modes": { "1": 32, "2": 7, "3": 48, "5": 2, "6": 1, "7": 2, "8": 7 } },
99
+ { "key": "2,0,-2 @-5", "shape": [2, 0, -2], "arrival": -5, "n": 97, "share": 0.0036, "finality": 0.258, "modes": { "1": 11, "2": 8, "3": 3, "4": 4, "5": 6, "6": 14, "7": 20, "8": 31 } },
100
+ { "key": "2,-2,-2 @3", "shape": [2, -2, -2], "arrival": 3, "n": 96, "share": 0.0036, "finality": 0.146, "modes": { "1": 39, "2": 36, "3": 17, "4": 2, "5": 1, "8": 1 } },
101
+ { "key": "0,-3,-2 @0", "shape": [0, -3, -2], "arrival": 0, "n": 96, "share": 0.0036, "finality": 0.854, "modes": { "6": 2, "7": 92, "8": 2 } },
102
+ { "key": "2,1,-1 @7", "shape": [2, 1, -1], "arrival": 7, "n": 96, "share": 0.0036, "finality": 0, "modes": { "1": 64, "2": 7, "3": 21, "4": 3, "8": 1 } },
103
+ { "key": "-2,2,-2 @3", "shape": [-2, 2, -2], "arrival": 3, "n": 93, "share": 0.0035, "finality": 0.065, "modes": { "1": 21, "2": 30, "3": 15, "4": 10, "5": 2, "7": 8, "8": 7 } },
104
+ { "key": "-2,-2,0 @-2", "shape": [-2, -2, 0], "arrival": -2, "n": 90, "share": 0.0034, "finality": 0.089, "modes": { "1": 16, "2": 24, "3": 4, "4": 1, "5": 1, "6": 8, "7": 4, "8": 31, "?": 1 } },
105
+ { "key": "-2,2,0 @7", "shape": [-2, 2, 0], "arrival": 7, "n": 89, "share": 0.0033, "finality": 0, "modes": { "1": 22, "2": 3, "3": 2, "7": 58, "8": 3, "?": 1 } },
106
+ { "key": "0,0,-3 @0", "shape": [0, 0, -3], "arrival": 0, "n": 88, "share": 0.0033, "finality": 0.568, "modes": { "1": 50, "2": 34, "3": 2, "4": 1, "5": 1 } },
107
+ { "key": "-2,0,-2 @-5", "shape": [-2, 0, -2], "arrival": -5, "n": 86, "share": 0.0032, "finality": 0.198, "modes": { "1": 6, "2": 23, "3": 1, "5": 25, "6": 4, "8": 27 } },
108
+ { "key": "2,-2,-2 @-4", "shape": [2, -2, -2], "arrival": -4, "n": 85, "share": 0.0032, "finality": 0.412, "modes": { "1": 21, "2": 2, "3": 1, "4": 26, "5": 3, "6": 14, "7": 2, "8": 2, "?": 14 } },
109
+ { "key": "1,0,-1 @0", "shape": [1, 0, -1], "arrival": 0, "n": 84, "share": 0.0031, "finality": 0.274, "modes": { "1": 6, "3": 5, "4": 42, "5": 21, "6": 1, "7": 9 } },
110
+ { "key": "2,2,-2 @2", "shape": [2, 2, -2], "arrival": 2, "n": 83, "share": 0.0031, "finality": 0, "modes": { "1": 10, "4": 2, "5": 14, "6": 8, "7": 12, "8": 37 } },
111
+ { "key": "0,0,0 @5", "shape": [0, 0, 0], "arrival": 5, "n": 82, "share": 0.0031, "finality": 0.22, "modes": { "2": 8, "4": 34, "5": 5, "7": 2, "8": 33 } },
112
+ { "key": "3,0,0 @3", "shape": [3, 0, 0], "arrival": 3, "n": 79, "share": 0.0029, "finality": 0.165, "modes": { "1": 2, "3": 63, "5": 13, "7": 1 } },
113
+ { "key": "3,2,-2 @0", "shape": [3, 2, -2], "arrival": 0, "n": 79, "share": 0.0029, "finality": 0.646, "modes": { "1": 3, "4": 6, "5": 10, "6": 48, "7": 2, "8": 10 } },
114
+ { "key": "2,2,0 @7", "shape": [2, 2, 0], "arrival": 7, "n": 76, "share": 0.0028, "finality": 0, "modes": { "1": 44, "2": 17, "3": 7, "8": 1, "?": 7 } },
115
+ { "key": "-2,2,-2 @2", "shape": [-2, 2, -2], "arrival": 2, "n": 75, "share": 0.0028, "finality": 0.16, "modes": { "1": 8, "2": 3, "3": 4, "4": 2, "5": 10, "6": 21, "7": 13, "8": 14 } },
116
+ { "key": "2,-4,0 @-2", "shape": [2, -4, 0], "arrival": -2, "n": 73, "share": 0.0027, "finality": 0.082, "modes": { "1": 2, "2": 29, "3": 1, "4": 2, "5": 2, "7": 15, "8": 22 } },
117
+ { "key": "-2,0,-2 @-4", "shape": [-2, 0, -2], "arrival": -4, "n": 73, "share": 0.0027, "finality": 0.151, "modes": { "2": 23, "3": 7, "4": 10, "5": 7, "6": 9, "7": 3, "8": 14 } },
118
+ { "key": "-2,2,-2 @-5", "shape": [-2, 2, -2], "arrival": -5, "n": 73, "share": 0.0027, "finality": 0.329, "modes": { "1": 1, "2": 5, "3": 2, "4": 10, "5": 2, "6": 7, "7": 11, "8": 35 } },
119
+ { "key": "4,-2,0 @0", "shape": [4, -2, 0], "arrival": 0, "n": 72, "share": 0.0027, "finality": 0.208, "modes": { "1": 12, "2": 30, "6": 2, "7": 9, "8": 19 } },
120
+ { "key": "3,-1,-2 @0", "shape": [3, -1, -2], "arrival": 0, "n": 71, "share": 0.0027, "finality": 0.296, "modes": { "1": 32, "2": 25, "3": 8, "7": 1, "8": 2, "?": 3 } },
121
+ { "key": "3,-1,-4 @0", "shape": [3, -1, -4], "arrival": 0, "n": 70, "share": 0.0026, "finality": 0.786, "modes": { "5": 59, "8": 11 } },
122
+ { "key": "0,2,-2 @7", "shape": [0, 2, -2], "arrival": 7, "n": 70, "share": 0.0026, "finality": 0, "modes": { "1": 11, "3": 1, "5": 46, "7": 10, "8": 2 } },
123
+ { "key": "-2,2,0 @2", "shape": [-2, 2, 0], "arrival": 2, "n": 70, "share": 0.0026, "finality": 0, "modes": { "1": 5, "2": 34, "5": 4, "6": 4, "7": 19, "8": 4 } },
124
+ { "key": "2,2,-2 @7", "shape": [2, 2, -2], "arrival": 7, "n": 70, "share": 0.0026, "finality": 0, "modes": { "1": 1, "2": 2, "6": 1, "7": 60, "8": 5, "?": 1 } },
125
+ { "key": "-4,2,-2 @0", "shape": [-4, 2, -2], "arrival": 0, "n": 69, "share": 0.0026, "finality": 0.551, "modes": { "3": 1, "5": 49, "6": 6, "7": 9, "8": 4 } },
126
+ { "key": "-1,-4,2 @0", "shape": [-1, -4, 2], "arrival": 0, "n": 69, "share": 0.0026, "finality": 0.362, "modes": { "1": 52, "2": 15, "4": 1, "7": 1 } },
127
+ { "key": "1,-3,-2 @-2", "shape": [1, -3, -2], "arrival": -2, "n": 68, "share": 0.0025, "finality": 0, "modes": { "1": 9, "2": 29, "8": 30 } },
128
+ { "key": "-3,1,-3 @0", "shape": [-3, 1, -3], "arrival": 0, "n": 68, "share": 0.0025, "finality": 0.456, "modes": { "1": 32, "2": 7, "5": 29 } },
129
+ { "key": "2,2,0 @2", "shape": [2, 2, 0], "arrival": 2, "n": 67, "share": 0.0025, "finality": 0.015, "modes": { "1": 22, "2": 12, "3": 7, "7": 5, "8": 21 } },
130
+ { "key": "1,0,-1 @2", "shape": [1, 0, -1], "arrival": 2, "n": 66, "share": 0.0025, "finality": 0.045, "modes": { "1": 7, "2": 37, "3": 8, "4": 3, "5": 7, "7": 3, "8": 1 } },
131
+ { "key": "4,0,-2 @0", "shape": [4, 0, -2], "arrival": 0, "n": 66, "share": 0.0025, "finality": 0.561, "modes": { "1": 29, "2": 20, "7": 16, "8": 1 } },
132
+ { "key": "-3,0,-2 @3", "shape": [-3, 0, -2], "arrival": 3, "n": 65, "share": 0.0024, "finality": 0, "modes": { "1": 14, "2": 17, "3": 26, "4": 5, "7": 1, "8": 2 } },
133
+ { "key": "-3,2,-2 @-2", "shape": [-3, 2, -2], "arrival": -2, "n": 64, "share": 0.0024, "finality": 0, "modes": { "3": 40, "4": 24 } },
134
+ { "key": "-1,-2,-2 @-2", "shape": [-1, -2, -2], "arrival": -2, "n": 64, "share": 0.0024, "finality": 0, "modes": { "1": 26, "2": 33, "3": 2, "6": 2, "7": 1 } },
135
+ { "key": "2,-2,0 @2", "shape": [2, -2, 0], "arrival": 2, "n": 64, "share": 0.0024, "finality": 0.062, "modes": { "1": 4, "2": 3, "5": 10, "6": 21, "7": 11, "8": 14, "?": 1 } },
136
+ { "key": "-2,-3,0 @0", "shape": [-2, -3, 0], "arrival": 0, "n": 63, "share": 0.0024, "finality": 0.175, "modes": { "1": 12, "2": 35, "3": 3, "4": 7, "5": 6 } },
137
+ { "key": "-1,1,-3 @0", "shape": [-1, 1, -3], "arrival": 0, "n": 61, "share": 0.0023, "finality": 0.279, "modes": { "1": 33, "2": 21, "3": 6, "5": 1 } },
138
+ { "key": "-2,-2,0 @3", "shape": [-2, -2, 0], "arrival": 3, "n": 60, "share": 0.0022, "finality": 0, "modes": { "1": 18, "2": 15, "3": 15, "4": 9, "5": 1, "7": 1, "8": 1 } },
139
+ { "key": " @0", "shape": [], "arrival": 0, "n": 60, "share": 0.0022, "finality": 1, "modes": { "1": 12, "2": 4, "3": 6, "4": 4, "5": 5, "6": 4, "7": 15, "8": 10 } },
140
+ { "key": "2,2,-2 @5", "shape": [2, 2, -2], "arrival": 5, "n": 59, "share": 0.0022, "finality": 0.017, "modes": { "1": 29, "2": 4, "3": 4, "4": 16, "5": 1, "7": 5 } },
141
+ { "key": "0,0,-1 @-5", "shape": [0, 0, -1], "arrival": -5, "n": 59, "share": 0.0022, "finality": 0.712, "modes": { "3": 45, "4": 14 } },
142
+ { "key": "1,-1,-2 @-5", "shape": [1, -1, -2], "arrival": -5, "n": 59, "share": 0.0022, "finality": 0.22, "modes": { "1": 15, "2": 2, "3": 1, "4": 6, "7": 5, "8": 30 } },
143
+ { "key": "-1,1,-1 @4", "shape": [-1, 1, -1], "arrival": 4, "n": 58, "share": 0.0022, "finality": 0.224, "modes": { "1": 2, "5": 2, "7": 52, "8": 2 } },
144
+ { "key": "-2,-1,0 @-5", "shape": [-2, -1, 0], "arrival": -5, "n": 58, "share": 0.0022, "finality": 1, "modes": { "3": 57, "4": 1 } },
145
+ { "key": "-2,2,-5 @-5", "shape": [-2, 2, -5], "arrival": -5, "n": 57, "share": 0.0021, "finality": 0, "modes": { "1": 11, "2": 22, "3": 6, "4": 9, "8": 9 } },
146
+ { "key": "2,-2,0 @-2", "shape": [2, -2, 0], "arrival": -2, "n": 57, "share": 0.0021, "finality": 0.105, "modes": { "1": 5, "2": 7, "3": 3, "4": 3, "5": 7, "6": 2, "7": 5, "8": 21, "?": 4 } },
147
+ { "key": "-1,1,2 @5", "shape": [-1, 1, 2], "arrival": 5, "n": 56, "share": 0.0021, "finality": 0.018, "modes": { "1": 25, "2": 30, "5": 1 } },
148
+ { "key": "2,-2,-1 @0", "shape": [2, -2, -1], "arrival": 0, "n": 56, "share": 0.0021, "finality": 0.411, "modes": { "1": 1, "3": 7, "4": 42, "5": 3, "7": 3 } },
149
+ { "key": "-5,0,-2 @0", "shape": [-5, 0, -2], "arrival": 0, "n": 56, "share": 0.0021, "finality": 0.054, "modes": { "4": 1, "5": 15, "6": 2, "7": 32, "8": 6 } },
150
+ { "key": "0,-1,-2 @0", "shape": [0, -1, -2], "arrival": 0, "n": 55, "share": 0.0021, "finality": 0.382, "modes": { "1": 12, "2": 21, "3": 4, "4": 13, "5": 4, "8": 1 } },
151
+ { "key": "0,0,-3 @4", "shape": [0, 0, -3], "arrival": 4, "n": 55, "share": 0.0021, "finality": 0, "modes": { "5": 55 } },
152
+ { "key": "-3,2,-2 @4", "shape": [-3, 2, -2], "arrival": 4, "n": 54, "share": 0.002, "finality": 0, "modes": { "1": 1, "5": 53 } },
153
+ { "key": "-3,-2,2 @0", "shape": [-3, -2, 2], "arrival": 0, "n": 53, "share": 0.002, "finality": 0.245, "modes": { "1": 2, "2": 32, "3": 2, "4": 2, "5": 1, "7": 1, "8": 12, "?": 1 } },
154
+ { "key": "0,2,-2 @3", "shape": [0, 2, -2], "arrival": 3, "n": 53, "share": 0.002, "finality": 0, "modes": { "1": 10, "2": 10, "3": 1, "4": 14, "5": 7, "7": 7, "8": 4 } },
155
+ { "key": "-2,0,-3 @4", "shape": [-2, 0, -3], "arrival": 4, "n": 52, "share": 0.0019, "finality": 0, "modes": { "5": 42, "7": 10 } },
156
+ { "key": "-2,2,0 @5", "shape": [-2, 2, 0], "arrival": 5, "n": 51, "share": 0.0019, "finality": 0, "modes": { "1": 7, "2": 6, "3": 4, "4": 26, "?": 8 } },
157
+ { "key": "0,-2,2 @0", "shape": [0, -2, 2], "arrival": 0, "n": 51, "share": 0.0019, "finality": 0.078, "modes": { "1": 5, "2": 6, "3": 6, "8": 34 } },
158
+ ];
159
+ // THE index, built once and shared. Every consumer joins on the family key, so
160
+ // each one that builds its own Map is a third copy of the same lookup — the
161
+ // renderer had one, the score builder needed one, and any caller wanting a
162
+ // family's statistics had to write a fourth.
163
+ let _index = null;
164
+ /**
165
+ * The catalogued family for a cadence signature, or undefined when the
166
+ * signature falls below the table's floor. Deferred: a caller who never asks
167
+ * does not pay for the Map.
168
+ */
169
+ export function cadentiaFamilia(key) {
170
+ if (!_index)
171
+ _index = new Map(CADENTIAE.map((f) => [f.key, f]));
172
+ return _index.get(key);
173
+ }
174
+ //# sourceMappingURL=cadentiae.js.map
package/dist/data/cal.js CHANGED
@@ -1533,6 +1533,12 @@ export const CAL_SANCTI = [
1533
1533
  "rank": 3,
1534
1534
  "ritus": "Semiduplex"
1535
1535
  },
1536
+ {
1537
+ "id": "11-18",
1538
+ "name": "In Dedicatione Basilicarum Ss. Apostolorum Petri et Pauli",
1539
+ "rank": 2,
1540
+ "ritus": "Duplex majus"
1541
+ },
1536
1542
  {
1537
1543
  "id": "11-19",
1538
1544
  "name": "S. Elisabeth Viduæ",
@@ -2141,6 +2147,42 @@ export const CAL_TEMPORA = [
2141
2147
  "rank": 2,
2142
2148
  "ritus": "Duplex II classis"
2143
2149
  },
2150
+ {
2151
+ "id": "Nat26",
2152
+ "name": "Diei II infra Octavam Nativitatis",
2153
+ "rank": 3,
2154
+ "ritus": "Semiduplex"
2155
+ },
2156
+ {
2157
+ "id": "Nat27",
2158
+ "name": "Diei III infra Octavam Nativitatis",
2159
+ "rank": 3,
2160
+ "ritus": "Semiduplex"
2161
+ },
2162
+ {
2163
+ "id": "Nat28",
2164
+ "name": "Diei IV infra Octavam Nativitatis",
2165
+ "rank": 3,
2166
+ "ritus": "Semiduplex"
2167
+ },
2168
+ {
2169
+ "id": "Nat29",
2170
+ "name": "Diei V infra Octavam Nativitatis",
2171
+ "rank": 3,
2172
+ "ritus": "Semiduplex"
2173
+ },
2174
+ {
2175
+ "id": "Nat30",
2176
+ "name": "Diei VI infra Octavam Nativitatis",
2177
+ "rank": 3,
2178
+ "ritus": "Semiduplex"
2179
+ },
2180
+ {
2181
+ "id": "Nat31",
2182
+ "name": "Diei VII infra Octavam Nativitatis",
2183
+ "rank": 3,
2184
+ "ritus": "Semiduplex"
2185
+ },
2144
2186
  {
2145
2187
  "id": "Pasc0-0",
2146
2188
  "name": "Dominica Resurrectionis",
@@ -2423,6 +2465,12 @@ export const CAL_TEMPORA = [
2423
2465
  "rank": 2,
2424
2466
  "ritus": "Duplex majus"
2425
2467
  },
2468
+ {
2469
+ "id": "Pasc6-5",
2470
+ "name": "Feria VI post Octavam Ascensionis",
2471
+ "rank": 3,
2472
+ "ritus": "Semiduplex"
2473
+ },
2426
2474
  {
2427
2475
  "id": "Pasc6-6",
2428
2476
  "name": "Sabbato in Vigilia Pentecostes",