@libraz/libcantus 0.9.4 → 1.0.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.
- package/README.md +61 -261
- package/README_ja.md +115 -0
- package/dist/analyze/index.cjs +54 -7
- package/dist/analyze/index.cjs.map +1 -1
- package/dist/analyze/index.d.cts +213 -456
- package/dist/analyze/index.d.ts +213 -456
- package/dist/analyze/index.js +56 -9
- package/dist/chunk-3JXCW6DX.cjs +3220 -0
- package/dist/chunk-3JXCW6DX.cjs.map +1 -0
- package/dist/chunk-4A2RMUCC.js +7647 -0
- package/dist/chunk-4A2RMUCC.js.map +1 -0
- package/dist/chunk-6XPTBE7Y.cjs +49 -0
- package/dist/chunk-6XPTBE7Y.cjs.map +1 -0
- package/dist/chunk-AFM2ULJH.cjs +5121 -0
- package/dist/chunk-AFM2ULJH.cjs.map +1 -0
- package/dist/chunk-E3F4AHAH.cjs +690 -0
- package/dist/chunk-E3F4AHAH.cjs.map +1 -0
- package/dist/chunk-ELCTZUJJ.js +379 -0
- package/dist/chunk-ELCTZUJJ.js.map +1 -0
- package/dist/chunk-FVSI36UV.js +690 -0
- package/dist/chunk-FVSI36UV.js.map +1 -0
- package/dist/chunk-GEDTJHAC.cjs +1 -0
- package/dist/chunk-GEDTJHAC.cjs.map +1 -0
- package/dist/chunk-GOZG57ER.js +3220 -0
- package/dist/chunk-GOZG57ER.js.map +1 -0
- package/dist/chunk-H3VORETI.js +2243 -0
- package/dist/chunk-H3VORETI.js.map +1 -0
- package/dist/chunk-H42UHPYW.js +1577 -0
- package/dist/chunk-H42UHPYW.js.map +1 -0
- package/dist/chunk-HFPS7JFD.js +1 -0
- package/dist/chunk-INHVXP6Z.js +3053 -0
- package/dist/chunk-INHVXP6Z.js.map +1 -0
- package/dist/chunk-K4ZJUGF4.cjs +379 -0
- package/dist/chunk-K4ZJUGF4.cjs.map +1 -0
- package/dist/chunk-KNJEKLKV.js +49 -0
- package/dist/chunk-KNJEKLKV.js.map +1 -0
- package/dist/chunk-M4CWTJWJ.cjs +7647 -0
- package/dist/chunk-M4CWTJWJ.cjs.map +1 -0
- package/dist/chunk-MXO72PLY.cjs +211 -0
- package/dist/chunk-MXO72PLY.cjs.map +1 -0
- package/dist/chunk-NLEU4QSE.cjs +360 -0
- package/dist/chunk-NLEU4QSE.cjs.map +1 -0
- package/dist/chunk-OE6WK2Y2.cjs +1577 -0
- package/dist/chunk-OE6WK2Y2.cjs.map +1 -0
- package/dist/chunk-Q2WGKJNN.cjs +1064 -0
- package/dist/chunk-Q2WGKJNN.cjs.map +1 -0
- package/dist/chunk-QYQQ5J6E.js +1 -0
- package/dist/chunk-QYQQ5J6E.js.map +1 -0
- package/dist/chunk-RHIJ3S4I.cjs +1 -0
- package/dist/chunk-RHIJ3S4I.cjs.map +1 -0
- package/dist/chunk-TTCLJX6D.js +211 -0
- package/dist/chunk-TTCLJX6D.js.map +1 -0
- package/dist/chunk-UADYAYAT.cjs +3053 -0
- package/dist/chunk-UADYAYAT.cjs.map +1 -0
- package/dist/chunk-VOHZB45S.js +5121 -0
- package/dist/chunk-VOHZB45S.js.map +1 -0
- package/dist/chunk-VTI6FOLB.js +1064 -0
- package/dist/chunk-VTI6FOLB.js.map +1 -0
- package/dist/chunk-WWURE4XT.cjs +2243 -0
- package/dist/chunk-WWURE4XT.cjs.map +1 -0
- package/dist/chunk-YH3BIKHH.js +360 -0
- package/dist/chunk-YH3BIKHH.js.map +1 -0
- package/dist/core/index.cjs +103 -6
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.cts +96 -345
- package/dist/core/index.d.ts +96 -345
- package/dist/core/index.js +104 -7
- package/dist/generate/index.cjs +89 -10
- package/dist/generate/index.cjs.map +1 -1
- package/dist/generate/index.d.cts +437 -1095
- package/dist/generate/index.d.ts +437 -1095
- package/dist/generate/index.js +94 -15
- package/dist/index-9wcMhG73.d.ts +1095 -0
- package/dist/{index-D6b6na69.d.cts → index-B4o55NDr.d.cts} +13 -9
- package/dist/index-B9MNZboQ.d.cts +770 -0
- package/dist/index-B9MNZboQ.d.ts +770 -0
- package/dist/index-BGFW-8P2.d.cts +2307 -0
- package/dist/index-BO6xE9YU.d.cts +1804 -0
- package/dist/index-BkGmlyI3.d.cts +470 -0
- package/dist/index-CCNJRG-P.d.cts +1095 -0
- package/dist/index-CGpRv5sl.d.cts +643 -0
- package/dist/index-C_8o--VE.d.cts +1242 -0
- package/dist/index-CgHqxdps.d.ts +2307 -0
- package/dist/index-Chbst3Jx.d.ts +1343 -0
- package/dist/index-Cj49F892.d.ts +470 -0
- package/dist/{index-tSQh-xwY.d.ts → index-CunYKLiu.d.ts} +13 -9
- package/dist/index-D57QRbVn.d.ts +1804 -0
- package/dist/index-DInQqT8Q.d.cts +66 -0
- package/dist/index-DInQqT8Q.d.ts +66 -0
- package/dist/index-Dzr13q3d.d.cts +1343 -0
- package/dist/index-G1uwGGWQ.d.ts +643 -0
- package/dist/index-szBv3496.d.ts +1242 -0
- package/dist/index.cjs +358 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +17 -15
- package/dist/index.d.ts +17 -15
- package/dist/index.js +407 -64
- package/dist/masks-DYbE485J.d.cts +445 -0
- package/dist/masks-DYbE485J.d.ts +445 -0
- package/dist/model/index.cjs +39 -7
- package/dist/model/index.cjs.map +1 -1
- package/dist/model/index.d.cts +4685 -243
- package/dist/model/index.d.ts +4685 -243
- package/dist/model/index.js +40 -8
- package/dist/positional-Cptlj-xs.d.ts +287 -0
- package/dist/positional-DvH_sd8u.d.cts +287 -0
- package/dist/theory/index.cjs +101 -7
- package/dist/theory/index.cjs.map +1 -1
- package/dist/theory/index.d.cts +513 -173
- package/dist/theory/index.d.ts +513 -173
- package/dist/theory/index.js +118 -24
- package/package.json +16 -11
- package/dist/chunk-36N73KZ3.cjs +0 -246
- package/dist/chunk-36N73KZ3.cjs.map +0 -1
- package/dist/chunk-4HLLZPXT.cjs +0 -3077
- package/dist/chunk-4HLLZPXT.cjs.map +0 -1
- package/dist/chunk-7MGZ7D62.cjs +0 -498
- package/dist/chunk-7MGZ7D62.cjs.map +0 -1
- package/dist/chunk-7NKDPF74.js +0 -3077
- package/dist/chunk-7NKDPF74.js.map +0 -1
- package/dist/chunk-CAN76NCU.cjs +0 -679
- package/dist/chunk-CAN76NCU.cjs.map +0 -1
- package/dist/chunk-D2FAJBYL.js +0 -479
- package/dist/chunk-D2FAJBYL.js.map +0 -1
- package/dist/chunk-EHVEBWM5.js +0 -1449
- package/dist/chunk-EHVEBWM5.js.map +0 -1
- package/dist/chunk-FCANXBAT.cjs +0 -30
- package/dist/chunk-FCANXBAT.cjs.map +0 -1
- package/dist/chunk-FNDWXRRI.cjs +0 -479
- package/dist/chunk-FNDWXRRI.cjs.map +0 -1
- package/dist/chunk-GQSGS2N4.js +0 -173
- package/dist/chunk-GQSGS2N4.js.map +0 -1
- package/dist/chunk-HKGYCQ34.js +0 -53
- package/dist/chunk-HKGYCQ34.js.map +0 -1
- package/dist/chunk-I24MV65U.js +0 -106
- package/dist/chunk-I24MV65U.js.map +0 -1
- package/dist/chunk-KMHOICIY.js +0 -679
- package/dist/chunk-KMHOICIY.js.map +0 -1
- package/dist/chunk-LW53AHQU.cjs +0 -1117
- package/dist/chunk-LW53AHQU.cjs.map +0 -1
- package/dist/chunk-N6IHQUOX.js +0 -1
- package/dist/chunk-NKIBQ6PT.js +0 -30
- package/dist/chunk-NKIBQ6PT.js.map +0 -1
- package/dist/chunk-NP4NA2FB.cjs +0 -106
- package/dist/chunk-NP4NA2FB.cjs.map +0 -1
- package/dist/chunk-NVE34YGZ.cjs +0 -1449
- package/dist/chunk-NVE34YGZ.cjs.map +0 -1
- package/dist/chunk-NYYWMV2C.js +0 -327
- package/dist/chunk-NYYWMV2C.js.map +0 -1
- package/dist/chunk-Q2XUP227.js +0 -845
- package/dist/chunk-Q2XUP227.js.map +0 -1
- package/dist/chunk-Q6OP4U43.cjs +0 -327
- package/dist/chunk-Q6OP4U43.cjs.map +0 -1
- package/dist/chunk-RC6GBMCD.cjs +0 -845
- package/dist/chunk-RC6GBMCD.cjs.map +0 -1
- package/dist/chunk-RK35RIN7.js +0 -1117
- package/dist/chunk-RK35RIN7.js.map +0 -1
- package/dist/chunk-RUMU3UA6.cjs +0 -53
- package/dist/chunk-RUMU3UA6.cjs.map +0 -1
- package/dist/chunk-T64C7ZD7.cjs +0 -1
- package/dist/chunk-T64C7ZD7.cjs.map +0 -1
- package/dist/chunk-XEBG3G53.js +0 -498
- package/dist/chunk-XEBG3G53.js.map +0 -1
- package/dist/chunk-YLEMGEFH.js +0 -246
- package/dist/chunk-YLEMGEFH.js.map +0 -1
- package/dist/chunk-ZEJR4TKL.cjs +0 -173
- package/dist/chunk-ZEJR4TKL.cjs.map +0 -1
- package/dist/function-BtiZb9i9.d.ts +0 -208
- package/dist/function-DNugAOrt.d.cts +0 -208
- package/dist/index-6VR8-kit.d.ts +0 -143
- package/dist/index-70p168VM.d.ts +0 -192
- package/dist/index-Be74mcon.d.cts +0 -152
- package/dist/index-BtXT6UQ0.d.cts +0 -192
- package/dist/index-C5UBbQ4G.d.ts +0 -152
- package/dist/index-C83mZI1P.d.ts +0 -242
- package/dist/index-DXd9JikN.d.cts +0 -246
- package/dist/index-DXd9JikN.d.ts +0 -246
- package/dist/index-OG65ocOr.d.cts +0 -272
- package/dist/index-OG65ocOr.d.ts +0 -272
- package/dist/index-tJhkmQgE.d.cts +0 -143
- package/dist/index-y_ak9_Hi.d.cts +0 -242
- package/dist/styled-DIRkk9Uz.d.ts +0 -506
- package/dist/styled-DJbkJQfj.d.cts +0 -506
- package/dist/types-BN6_Q9Kl.d.cts +0 -39
- package/dist/types-BN6_Q9Kl.d.ts +0 -39
- /package/dist/{chunk-N6IHQUOX.js.map → chunk-HFPS7JFD.js.map} +0 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
var _chunkUADYAYATcjs = require('./chunk-UADYAYAT.cjs');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
var _chunkQ2WGKJNNcjs = require('./chunk-Q2WGKJNN.cjs');
|
|
9
|
+
|
|
10
|
+
// src/theory/harmony/index.ts
|
|
11
|
+
function suspendedIntervalOf(chord) {
|
|
12
|
+
const sounds = (ic) => chord.intervals.some((interval) => _chunkQ2WGKJNNcjs.pitchClassOf.call(void 0, interval) === ic);
|
|
13
|
+
if (sounds(3) || sounds(4)) {
|
|
14
|
+
return void 0;
|
|
15
|
+
}
|
|
16
|
+
const spec = _chunkUADYAYATcjs.chordSpecOf.call(void 0, chord);
|
|
17
|
+
if (spec.base === "sus4") {
|
|
18
|
+
return sounds(5) ? 5 : void 0;
|
|
19
|
+
}
|
|
20
|
+
if (spec.base === "sus2") {
|
|
21
|
+
return sounds(2) ? 2 : void 0;
|
|
22
|
+
}
|
|
23
|
+
return spec.omissions.includes(3) && sounds(5) ? 5 : void 0;
|
|
24
|
+
}
|
|
25
|
+
function roleOf(pitch, chord, chordId = 0) {
|
|
26
|
+
const data = _chunkUADYAYATcjs.toChordData.call(void 0, chord);
|
|
27
|
+
const interval = (_chunkQ2WGKJNNcjs.pitchClassOf.call(void 0, pitch) - _chunkQ2WGKJNNcjs.pitchClassOf.call(void 0, data.rootPc) + 12) % 12;
|
|
28
|
+
const suspended = suspendedIntervalOf(data);
|
|
29
|
+
const isSuspendedTone = suspended !== void 0 && interval === suspended;
|
|
30
|
+
const chordRole = _chunkUADYAYATcjs.chordToneRole.call(void 0, pitch, data);
|
|
31
|
+
let role;
|
|
32
|
+
let lock;
|
|
33
|
+
if (isSuspendedTone) {
|
|
34
|
+
role = "third";
|
|
35
|
+
lock = "quality";
|
|
36
|
+
} else if (chordRole !== null) {
|
|
37
|
+
role = chordRole;
|
|
38
|
+
lock = chordRole === "root" ? "identity" : chordRole === "third" ? "quality" : "voicing";
|
|
39
|
+
} else {
|
|
40
|
+
role = "tension";
|
|
41
|
+
lock = "voicing";
|
|
42
|
+
}
|
|
43
|
+
return { role, lock, belongsToChordId: chordId };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
exports.roleOf = roleOf;
|
|
49
|
+
//# sourceMappingURL=chunk-6XPTBE7Y.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/libcantus/libcantus/dist/chunk-6XPTBE7Y.cjs","../src/theory/harmony/index.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACkCA,SAAS,mBAAA,CAAoB,KAAA,EAAkC;AAC7D,EAAA,MAAM,OAAA,EAAS,CAAC,EAAA,EAAA,GACd,KAAA,CAAM,SAAA,CAAU,IAAA,CAAK,CAAC,QAAA,EAAA,GAAa,4CAAA,QAAqB,EAAA,IAAM,EAAE,CAAA;AAClE,EAAA,GAAA,CAAI,MAAA,CAAO,CAAC,EAAA,GAAK,MAAA,CAAO,CAAC,CAAA,EAAG;AAC1B,IAAA,OAAO,KAAA,CAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,EAAO,2CAAA,KAAiB,CAAA;AAC9B,EAAA,GAAA,CAAI,IAAA,CAAK,KAAA,IAAS,MAAA,EAAQ;AACxB,IAAA,OAAO,MAAA,CAAO,CAAC,EAAA,EAAI,EAAA,EAAI,KAAA,CAAA;AAAA,EACzB;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,KAAA,IAAS,MAAA,EAAQ;AACxB,IAAA,OAAO,MAAA,CAAO,CAAC,EAAA,EAAI,EAAA,EAAI,KAAA,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,CAAC,EAAA,GAAK,MAAA,CAAO,CAAC,EAAA,EAAI,EAAA,EAAI,KAAA,CAAA;AACvD;AAkCO,SAAS,MAAA,CAAO,KAAA,EAAe,KAAA,EAAkB,QAAA,EAAU,CAAA,EAAe;AAC/E,EAAA,MAAM,KAAA,EAAO,2CAAA,KAAiB,CAAA;AAC9B,EAAA,MAAM,SAAA,EAAA,CAAY,4CAAA,KAAkB,EAAA,EAAI,4CAAA,IAAa,CAAK,MAAM,EAAA,EAAI,EAAA,EAAA,EAAM,EAAA;AAC1E,EAAA,MAAM,UAAA,EAAY,mBAAA,CAAoB,IAAI,CAAA;AAC1C,EAAA,MAAM,gBAAA,EAAkB,UAAA,IAAc,KAAA,EAAA,GAAa,SAAA,IAAa,SAAA;AAChE,EAAA,MAAM,UAAA,EAAY,6CAAA,KAAc,EAAO,IAAI,CAAA;AAC3C,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,IAAA;AACJ,EAAA,GAAA,CAAI,eAAA,EAAiB;AACnB,IAAA,KAAA,EAAO,OAAA;AACP,IAAA,KAAA,EAAO,SAAA;AAAA,EACT,EAAA,KAAA,GAAA,CAAW,UAAA,IAAc,IAAA,EAAM;AAC7B,IAAA,KAAA,EAAO,SAAA;AACP,IAAA,KAAA,EAAO,UAAA,IAAc,OAAA,EAAS,WAAA,EAAa,UAAA,IAAc,QAAA,EAAU,UAAA,EAAY,SAAA;AAAA,EACjF,EAAA,KAAO;AACL,IAAA,KAAA,EAAO,SAAA;AACP,IAAA,KAAA,EAAO,SAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,gBAAA,EAAkB,QAAQ,CAAA;AACjD;ADlEA;AACA;AACE;AACF,wBAAC","file":"/home/runner/work/libcantus/libcantus/dist/chunk-6XPTBE7Y.cjs","sourcesContent":[null,"import { pitchClassOf } from '../../core/pitch/index.js';\nimport { type Chord, type ChordToneRole, chordSpecOf, chordToneRole } from '../chord/index.js';\nimport { type ChordLike, toChordData } from '../symbol/index.js';\n\n/**\n * Harmonic role a pitch plays within a chord.\n *\n * @category Functional Harmony\n */\nexport type HarmonyRole = ChordToneRole | 'tension' | 'doubling';\n\n/**\n * How firmly a pitch is locked to the chord's identity.\n *\n * - `identity`: moving it produces a different chord (the root).\n * - `quality`: moving it flips the chord quality (the third).\n * - `voicing`: it can move freely without changing chord identity or quality.\n *\n * @category Functional Harmony\n */\nexport type LockLevel = 'identity' | 'quality' | 'voicing';\n\n/**\n * A pitch's role, lock level, and owning chord.\n *\n * @category Functional Harmony\n */\nexport type VoicedRole = {\n role: HarmonyRole;\n lock: LockLevel;\n belongsToChordId: number;\n};\n\n/**\n * The one interval class standing in for a chord's absent third, if any.\n *\n * Read from the chord's structure rather than from its sounding pitch classes:\n * an eleventh chord's tensions fold onto 2 and 5 in pitch-class space, so a set\n * of folded intervals cannot say which of them replaced the third — and both\n * would answer, leaving one chord with two quality-defining tones. The\n * suspension a `sus4` or `sus2` names is its fourth or its second; an eleventh\n * chord's is the eleventh, the tone its omitted third gave way to.\n */\nfunction suspendedIntervalOf(chord: Chord): number | undefined {\n const sounds = (ic: number): boolean =>\n chord.intervals.some((interval) => pitchClassOf(interval) === ic);\n if (sounds(3) || sounds(4)) {\n return undefined;\n }\n const spec = chordSpecOf(chord);\n if (spec.base === 'sus4') {\n return sounds(5) ? 5 : undefined;\n }\n if (spec.base === 'sus2') {\n return sounds(2) ? 2 : undefined;\n }\n return spec.omissions.includes(3) && sounds(5) ? 5 : undefined;\n}\n\n/**\n * Classify a pitch's harmonic role and lock level within a chord.\n *\n * The role comes from the pitch's interval class above the chord root, read\n * against the chord's own template: root (0), third (3/4), fifth (6/7/8),\n * sixth or seventh (9/10/11). Every pitch the template does not claim is\n * `'tension'` — including one that is simply foreign to the chord, which this\n * single-pitch query cannot tell from a colour tone. The root locks the chord\n * identity, the third locks its quality, and everything else is free voicing.\n * Where a chord has no third, the tone standing in its place — the fourth of a\n * `sus4`, the second of a `sus2`, the eleventh of an eleventh chord — takes the\n * third's slot and is locked to `quality`, since moving it changes the chord.\n * At most one interval class of a chord is ever reported as its third, so a\n * consumer reading `lock: 'quality'` as \"this tone identifies the chord\" gets\n * one answer rather than two. Detecting an octave doubling requires the\n * surrounding voicing, which this query does not carry, so `'doubling'` is part\n * of the type — the shared vocabulary of harmonic roles — but is never returned\n * here.\n *\n * @param pitch MIDI pitch or bare pitch class.\n * @param chord The chord providing the root reference, as a chord symbol, chord\n * data, or a `Chord`.\n * @param chordId Identifier stored on the result (defaults to 0).\n * @returns The pitch's role, lock level, and owning chord id.\n * @example\n * ```ts\n * import { roleOf, makeChord } from '@libraz/libcantus';\n * roleOf(64, makeChord(0, 'maj')); // E over C major\n * // { role: 'third', lock: 'quality', belongsToChordId: 0 }\n * ```\n * @category Functional Harmony\n */\nexport function roleOf(pitch: number, chord: ChordLike, chordId = 0): VoicedRole {\n const data = toChordData(chord);\n const interval = (pitchClassOf(pitch) - pitchClassOf(data.rootPc) + 12) % 12;\n const suspended = suspendedIntervalOf(data);\n const isSuspendedTone = suspended !== undefined && interval === suspended;\n const chordRole = chordToneRole(pitch, data);\n let role: HarmonyRole;\n let lock: LockLevel;\n if (isSuspendedTone) {\n role = 'third'; // suspended tone occupies the third's quality-defining slot\n lock = 'quality';\n } else if (chordRole !== null) {\n role = chordRole;\n lock = chordRole === 'root' ? 'identity' : chordRole === 'third' ? 'quality' : 'voicing';\n } else {\n role = 'tension';\n lock = 'voicing';\n }\n return { role, lock, belongsToChordId: chordId };\n}\n"]}
|