@libraz/libcantus 0.9.3 → 0.9.4

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 (198) hide show
  1. package/README.md +2 -2
  2. package/dist/analyze/index.cjs +39 -1947
  3. package/dist/analyze/index.cjs.map +1 -1
  4. package/dist/analyze/index.d.cts +197 -37
  5. package/dist/analyze/index.d.ts +197 -37
  6. package/dist/analyze/index.js +19 -8
  7. package/dist/chunk-36N73KZ3.cjs +246 -0
  8. package/dist/chunk-36N73KZ3.cjs.map +1 -0
  9. package/dist/chunk-4HLLZPXT.cjs +3077 -0
  10. package/dist/chunk-4HLLZPXT.cjs.map +1 -0
  11. package/dist/chunk-7MGZ7D62.cjs +498 -0
  12. package/dist/chunk-7MGZ7D62.cjs.map +1 -0
  13. package/dist/{chunk-4MHA432G.js → chunk-7NKDPF74.js} +403 -180
  14. package/dist/chunk-7NKDPF74.js.map +1 -0
  15. package/dist/chunk-CAN76NCU.cjs +679 -0
  16. package/dist/chunk-CAN76NCU.cjs.map +1 -0
  17. package/dist/{chunk-MIWO425M.js → chunk-D2FAJBYL.js} +101 -34
  18. package/dist/chunk-D2FAJBYL.js.map +1 -0
  19. package/dist/{chunk-SGU7SPLK.js → chunk-EHVEBWM5.js} +1056 -531
  20. package/dist/chunk-EHVEBWM5.js.map +1 -0
  21. package/dist/chunk-FCANXBAT.cjs +30 -0
  22. package/dist/chunk-FCANXBAT.cjs.map +1 -0
  23. package/dist/chunk-FNDWXRRI.cjs +479 -0
  24. package/dist/chunk-FNDWXRRI.cjs.map +1 -0
  25. package/dist/{chunk-IT2O4XFE.js → chunk-GQSGS2N4.js} +43 -24
  26. package/dist/chunk-GQSGS2N4.js.map +1 -0
  27. package/dist/{chunk-62QZKCJQ.js → chunk-HKGYCQ34.js} +10 -6
  28. package/dist/chunk-HKGYCQ34.js.map +1 -0
  29. package/dist/{chunk-AKLYPWIN.js → chunk-I24MV65U.js} +29 -6
  30. package/dist/chunk-I24MV65U.js.map +1 -0
  31. package/dist/{chunk-CHMXELDS.js → chunk-KMHOICIY.js} +311 -181
  32. package/dist/chunk-KMHOICIY.js.map +1 -0
  33. package/dist/chunk-LW53AHQU.cjs +1117 -0
  34. package/dist/chunk-LW53AHQU.cjs.map +1 -0
  35. package/dist/{chunk-2ZWMSJH6.js → chunk-NKIBQ6PT.js} +2 -2
  36. package/dist/chunk-NKIBQ6PT.js.map +1 -0
  37. package/dist/chunk-NP4NA2FB.cjs +106 -0
  38. package/dist/chunk-NP4NA2FB.cjs.map +1 -0
  39. package/dist/chunk-NVE34YGZ.cjs +1449 -0
  40. package/dist/chunk-NVE34YGZ.cjs.map +1 -0
  41. package/dist/{chunk-EH6EM37U.js → chunk-NYYWMV2C.js} +61 -49
  42. package/dist/chunk-NYYWMV2C.js.map +1 -0
  43. package/dist/{chunk-GOAW4VYL.js → chunk-Q2XUP227.js} +243 -117
  44. package/dist/chunk-Q2XUP227.js.map +1 -0
  45. package/dist/chunk-Q6OP4U43.cjs +327 -0
  46. package/dist/chunk-Q6OP4U43.cjs.map +1 -0
  47. package/dist/chunk-RC6GBMCD.cjs +845 -0
  48. package/dist/chunk-RC6GBMCD.cjs.map +1 -0
  49. package/dist/{chunk-C5XYKUVG.js → chunk-RK35RIN7.js} +370 -157
  50. package/dist/chunk-RK35RIN7.js.map +1 -0
  51. package/dist/chunk-RUMU3UA6.cjs +53 -0
  52. package/dist/chunk-RUMU3UA6.cjs.map +1 -0
  53. package/dist/chunk-T64C7ZD7.cjs +1 -0
  54. package/dist/chunk-T64C7ZD7.cjs.map +1 -0
  55. package/dist/chunk-XEBG3G53.js +498 -0
  56. package/dist/chunk-XEBG3G53.js.map +1 -0
  57. package/dist/{chunk-I5R7ZBJS.js → chunk-YLEMGEFH.js} +103 -59
  58. package/dist/chunk-YLEMGEFH.js.map +1 -0
  59. package/dist/chunk-ZEJR4TKL.cjs +173 -0
  60. package/dist/chunk-ZEJR4TKL.cjs.map +1 -0
  61. package/dist/core/index.cjs +130 -647
  62. package/dist/core/index.cjs.map +1 -1
  63. package/dist/core/index.d.cts +301 -39
  64. package/dist/core/index.d.ts +301 -39
  65. package/dist/core/index.js +54 -16
  66. package/dist/{function-DYt4iKsn.d.cts → function-BtiZb9i9.d.ts} +28 -7
  67. package/dist/{function-DVH4Eusr.d.ts → function-DNugAOrt.d.cts} +28 -7
  68. package/dist/generate/index.cjs +28 -4085
  69. package/dist/generate/index.cjs.map +1 -1
  70. package/dist/generate/index.d.cts +370 -62
  71. package/dist/generate/index.d.ts +370 -62
  72. package/dist/generate/index.js +23 -9
  73. package/dist/{index-CxqBQtH1.d.cts → index-6VR8-kit.d.ts} +19 -4
  74. package/dist/index-70p168VM.d.ts +192 -0
  75. package/dist/{index-CpOsP1y9.d.cts → index-Be74mcon.d.cts} +18 -17
  76. package/dist/index-BtXT6UQ0.d.cts +192 -0
  77. package/dist/{index-DxvARIP2.d.ts → index-C5UBbQ4G.d.ts} +18 -17
  78. package/dist/{index-Bt4tOUD9.d.ts → index-C83mZI1P.d.ts} +93 -8
  79. package/dist/{index-Bg5dYMmZ.d.ts → index-D6b6na69.d.cts} +14 -11
  80. package/dist/{index-Cl7mhOFM.d.cts → index-DXd9JikN.d.cts} +92 -10
  81. package/dist/{index-Cl7mhOFM.d.ts → index-DXd9JikN.d.ts} +92 -10
  82. package/dist/index-OG65ocOr.d.cts +272 -0
  83. package/dist/index-OG65ocOr.d.ts +272 -0
  84. package/dist/{index-Jc0Ryi79.d.ts → index-tJhkmQgE.d.cts} +19 -4
  85. package/dist/{index-Dikst44v.d.cts → index-tSQh-xwY.d.ts} +14 -11
  86. package/dist/{index-BNlGP86A.d.cts → index-y_ak9_Hi.d.cts} +93 -8
  87. package/dist/index.cjs +419 -7383
  88. package/dist/index.cjs.map +1 -1
  89. package/dist/index.d.cts +14 -14
  90. package/dist/index.d.ts +14 -14
  91. package/dist/index.js +111 -27
  92. package/dist/model/index.cjs +8 -2562
  93. package/dist/model/index.cjs.map +1 -1
  94. package/dist/model/index.d.cts +433 -75
  95. package/dist/model/index.d.ts +433 -75
  96. package/dist/model/index.js +6 -7
  97. package/dist/styled-DIRkk9Uz.d.ts +506 -0
  98. package/dist/styled-DJbkJQfj.d.cts +506 -0
  99. package/dist/theory/index.cjs +172 -1822
  100. package/dist/theory/index.cjs.map +1 -1
  101. package/dist/theory/index.d.cts +151 -233
  102. package/dist/theory/index.d.ts +151 -233
  103. package/dist/theory/index.js +30 -7
  104. package/dist/{types-MGP29r3t.d.cts → types-BN6_Q9Kl.d.cts} +11 -2
  105. package/dist/{types-MGP29r3t.d.ts → types-BN6_Q9Kl.d.ts} +11 -2
  106. package/package.json +24 -6
  107. package/dist/chunk-2ZWMSJH6.js.map +0 -1
  108. package/dist/chunk-4MHA432G.js.map +0 -1
  109. package/dist/chunk-62QZKCJQ.js.map +0 -1
  110. package/dist/chunk-AKLYPWIN.js.map +0 -1
  111. package/dist/chunk-C5XYKUVG.js.map +0 -1
  112. package/dist/chunk-CHMXELDS.js.map +0 -1
  113. package/dist/chunk-DYWFNC4A.js +0 -152
  114. package/dist/chunk-DYWFNC4A.js.map +0 -1
  115. package/dist/chunk-EH6EM37U.js.map +0 -1
  116. package/dist/chunk-FBQK3ZQN.js +0 -131
  117. package/dist/chunk-FBQK3ZQN.js.map +0 -1
  118. package/dist/chunk-GOAW4VYL.js.map +0 -1
  119. package/dist/chunk-I5R7ZBJS.js.map +0 -1
  120. package/dist/chunk-IT2O4XFE.js.map +0 -1
  121. package/dist/chunk-MIWO425M.js.map +0 -1
  122. package/dist/chunk-SGU7SPLK.js.map +0 -1
  123. package/dist/index-CGMZNCx6.d.cts +0 -140
  124. package/dist/index-CGMZNCx6.d.ts +0 -140
  125. package/dist/index-CnZCo29u.d.cts +0 -108
  126. package/dist/index-JnF4v9bx.d.ts +0 -108
  127. package/dist/styled-DZ7GjShb.d.ts +0 -282
  128. package/dist/styled-ZTbdaVFM.d.cts +0 -282
  129. package/src/analyze/arrange/index.ts +0 -21
  130. package/src/analyze/arrange/internal.ts +0 -127
  131. package/src/analyze/arrange/tension.ts +0 -199
  132. package/src/analyze/arrange/tracks.ts +0 -312
  133. package/src/analyze/detect/index.ts +0 -272
  134. package/src/analyze/functional/borrowed.ts +0 -84
  135. package/src/analyze/functional/cadence.ts +0 -66
  136. package/src/analyze/functional/function.ts +0 -184
  137. package/src/analyze/functional/index.ts +0 -23
  138. package/src/analyze/functional/internal.ts +0 -29
  139. package/src/analyze/functional/roman.ts +0 -402
  140. package/src/analyze/index.ts +0 -49
  141. package/src/analyze/timeline/index.ts +0 -451
  142. package/src/analyze/voice/index.ts +0 -339
  143. package/src/core/event-index/index.ts +0 -104
  144. package/src/core/index.ts +0 -61
  145. package/src/core/interval/index.ts +0 -81
  146. package/src/core/meter/index.ts +0 -302
  147. package/src/core/pitch/index.ts +0 -311
  148. package/src/core/random/index.ts +0 -76
  149. package/src/core/tuning/index.ts +0 -186
  150. package/src/core/types.ts +0 -29
  151. package/src/core/validation/index.ts +0 -119
  152. package/src/generate/bass/index.ts +0 -373
  153. package/src/generate/countermelody/index.ts +0 -470
  154. package/src/generate/drums/beat.ts +0 -266
  155. package/src/generate/drums/euclid.ts +0 -65
  156. package/src/generate/drums/fills.ts +0 -356
  157. package/src/generate/drums/ghost.ts +0 -119
  158. package/src/generate/drums/hihat.ts +0 -285
  159. package/src/generate/drums/hit.ts +0 -31
  160. package/src/generate/drums/index.ts +0 -361
  161. package/src/generate/drums/internal.ts +0 -257
  162. package/src/generate/drums/kick.ts +0 -160
  163. package/src/generate/drums/percussion.ts +0 -121
  164. package/src/generate/drums/rng.ts +0 -7
  165. package/src/generate/drums/swing.ts +0 -71
  166. package/src/generate/groove/index.ts +0 -351
  167. package/src/generate/harmonize/index.ts +0 -451
  168. package/src/generate/index.ts +0 -58
  169. package/src/generate/motif/index.ts +0 -422
  170. package/src/generate/progression/index.ts +0 -362
  171. package/src/generate/reharmony/index.ts +0 -323
  172. package/src/generate/rhythm/index.ts +0 -175
  173. package/src/index.ts +0 -13
  174. package/src/model/chord.ts +0 -442
  175. package/src/model/index.ts +0 -15
  176. package/src/model/interval.ts +0 -82
  177. package/src/model/key.ts +0 -266
  178. package/src/model/note.ts +0 -176
  179. package/src/model/progression.ts +0 -161
  180. package/src/model/shared.ts +0 -12
  181. package/src/theory/chord/index.ts +0 -375
  182. package/src/theory/chordscale/index.ts +0 -374
  183. package/src/theory/counterpoint/index.ts +0 -230
  184. package/src/theory/harmony/index.ts +0 -77
  185. package/src/theory/index.ts +0 -112
  186. package/src/theory/safety/index.ts +0 -488
  187. package/src/theory/scale/degrees.ts +0 -123
  188. package/src/theory/scale/index.ts +0 -28
  189. package/src/theory/scale/key.ts +0 -56
  190. package/src/theory/scale/masks.ts +0 -153
  191. package/src/theory/spelling/index.ts +0 -249
  192. package/src/theory/symbol/index.ts +0 -268
  193. package/src/theory/voicing/index.ts +0 -5
  194. package/src/theory/voicing/internal.ts +0 -168
  195. package/src/theory/voicing/leading.ts +0 -112
  196. package/src/theory/voicing/satb.ts +0 -216
  197. package/src/theory/voicing/styled.ts +0 -199
  198. package/tsconfig.json +0 -23
@@ -1,648 +1,131 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/core/index.ts
21
- var core_exports = {};
22
- __export(core_exports, {
23
- DEFAULT_GENERATION_BUDGET: () => DEFAULT_GENERATION_BUDGET,
24
- IntervalQuality: () => IntervalQuality,
25
- JUST_RATIOS: () => JUST_RATIOS,
26
- TWELVE_TET: () => TWELVE_TET,
27
- assertFiniteNumber: () => assertFiniteNumber,
28
- assertGenerationBudget: () => assertGenerationBudget,
29
- assertInteger: () => assertInteger,
30
- assertNoteEvent: () => assertNoteEvent,
31
- assertNoteEvents: () => assertNoteEvents,
32
- assertPositiveInt: () => assertPositiveInt,
33
- assertRange: () => assertRange,
34
- assertTimeSignature: () => assertTimeSignature,
35
- barPositionToBeat: () => barPositionToBeat,
36
- beatToBarPosition: () => beatToBarPosition,
37
- beatsPerBar: () => beatsPerBar,
38
- centsBetweenFreq: () => centsBetweenFreq,
39
- centsOfSteps: () => centsOfSteps,
40
- classifyInterval: () => classifyInterval,
41
- createNoteEventIndex: () => createNoteEventIndex,
42
- createRng: () => createRng,
43
- edo: () => edo,
44
- formatNote: () => formatNote,
45
- formatTimeSignature: () => formatTimeSignature,
46
- frequencyOf: () => frequencyOf,
47
- isCompound: () => isCompound,
48
- isConsonantInterval: () => isConsonantInterval,
49
- isPerfectInterval: () => isPerfectInterval,
50
- isStrongBeat: () => isStrongBeat,
51
- justDeviationCents: () => justDeviationCents,
52
- metricWeight: () => metricWeight,
53
- midiToNote: () => midiToNote,
54
- nearestStep: () => nearestStep,
55
- noteToMidi: () => noteToMidi,
56
- noteToPitchClass: () => noteToPitchClass,
57
- parseNote: () => parseNote,
58
- parseTimeSignature: () => parseTimeSignature,
59
- pulsesPerBar: () => pulsesPerBar,
60
- ratioToCents: () => ratioToCents,
61
- spelledInterval: () => spelledInterval,
62
- tuplet: () => tuplet
63
- });
64
- module.exports = __toCommonJS(core_exports);
65
-
66
- // src/core/validation/index.ts
67
- var DEFAULT_GENERATION_BUDGET = 1e6;
68
- function assertFiniteNumber(value, name) {
69
- if (!Number.isFinite(value)) {
70
- throw new RangeError(`${name} must be finite; received ${value}`);
71
- }
72
- return value;
73
- }
74
- function assertInteger(value, name, min = Number.MIN_SAFE_INTEGER, max = Number.MAX_SAFE_INTEGER) {
75
- assertFiniteNumber(value, name);
76
- if (!Number.isSafeInteger(value) || value < min || value > max) {
77
- throw new RangeError(`${name} must be an integer in [${min}, ${max}]; received ${value}`);
78
- }
79
- return value;
80
- }
81
- function assertPositiveInt(value, name, max = DEFAULT_GENERATION_BUDGET) {
82
- return assertInteger(value, name, 1, max);
83
- }
84
- function assertRange(value, min, max, name) {
85
- assertFiniteNumber(value, name);
86
- if (value < min || value > max) {
87
- throw new RangeError(`${name} must be in [${min}, ${max}]; received ${value}`);
88
- }
89
- return value;
90
- }
91
- function assertGenerationBudget(estimated, name, limit = DEFAULT_GENERATION_BUDGET) {
92
- assertFiniteNumber(estimated, name);
93
- assertPositiveInt(limit, `${name} limit`, Number.MAX_SAFE_INTEGER);
94
- if (estimated < 0 || estimated > limit) {
95
- throw new RangeError(`${name} exceeds the generation budget ${limit}; received ${estimated}`);
96
- }
97
- return estimated;
98
- }
99
- function assertTimeSignature(ts, name = "time signature") {
100
- assertPositiveInt(ts.numerator, `${name}.numerator`);
101
- assertPositiveInt(ts.denominator, `${name}.denominator`);
102
- if (ts.grouping !== void 0) {
103
- if (ts.grouping.length === 0) {
104
- throw new RangeError(`${name}.grouping must not be empty`);
105
- }
106
- let sum = 0;
107
- for (let index = 0; index < ts.grouping.length; index += 1) {
108
- sum += assertPositiveInt(ts.grouping[index] ?? Number.NaN, `${name}.grouping[${index}]`);
109
- }
110
- const compound = ts.numerator % 3 === 0 && ts.numerator > 3;
111
- const pulses = compound ? ts.numerator / 3 : ts.numerator;
112
- if (sum !== pulses) {
113
- throw new RangeError(`${name}.grouping must sum to ${pulses}; received ${sum}`);
114
- }
115
- }
116
- return ts;
117
- }
118
- function assertNoteEvent(event, name = "note event", options = {}) {
119
- assertFiniteNumber(event.pitch, `${name}.pitch`);
120
- assertRange(event.startBeat, 0, Number.MAX_SAFE_INTEGER, `${name}.startBeat`);
121
- assertRange(
122
- event.durationBeat,
123
- options.allowNonPositiveDuration ? -Number.MAX_SAFE_INTEGER : Number.MIN_VALUE,
124
- Number.MAX_SAFE_INTEGER,
125
- `${name}.durationBeat`
126
- );
127
- if (!options.allowNonPositiveDuration && event.durationBeat <= 0) {
128
- throw new RangeError(`${name}.durationBeat must be positive; received ${event.durationBeat}`);
129
- }
130
- if (event.velocity !== void 0) {
131
- assertRange(event.velocity, 0, 127, `${name}.velocity`);
132
- }
133
- return event;
134
- }
135
- function assertNoteEvents(events, name = "note events", options = {}) {
136
- assertGenerationBudget(events.length, `${name} count`, options.budget);
137
- for (let index = 0; index < events.length; index += 1) {
138
- const event = events[index];
139
- if (event !== void 0) {
140
- assertNoteEvent(event, `${name}[${index}]`, options);
141
- }
142
- }
143
- return events;
144
- }
145
-
146
- // src/core/event-index/index.ts
147
- var EPS = 1e-9;
148
- function upperBound(values, beat) {
149
- let low = 0;
150
- let high = values.length;
151
- while (low < high) {
152
- const middle = Math.floor((low + high) / 2);
153
- if ((values[middle]?.note.startBeat ?? Number.POSITIVE_INFINITY) <= beat) {
154
- low = middle + 1;
155
- } else {
156
- high = middle;
157
- }
158
- }
159
- return low;
160
- }
161
- function createNoteEventIndex(events, options = {}) {
162
- assertNoteEvents(events, "note events", options);
163
- const notes = events.map((note, originalIndex) => ({
164
- note,
165
- originalIndex,
166
- endBeat: note.startBeat + note.durationBeat
167
- })).sort((a, b) => a.note.startBeat - b.note.startBeat || a.originalIndex - b.originalIndex);
168
- const prefixMaxEnd = [];
169
- let maxEnd = Number.NEGATIVE_INFINITY;
170
- for (const indexed of notes) {
171
- maxEnd = Math.max(maxEnd, indexed.endBeat);
172
- prefixMaxEnd.push(maxEnd);
173
- }
174
- return {
175
- notes,
176
- at(beat) {
177
- let index = upperBound(notes, beat + EPS) - 1;
178
- while (index >= 0) {
179
- if ((prefixMaxEnd[index] ?? Number.NEGATIVE_INFINITY) <= beat + EPS) {
180
- return void 0;
181
- }
182
- const indexed = notes[index];
183
- if (indexed && indexed.note.durationBeat > 0 && indexed.note.startBeat - EPS <= beat && beat < indexed.endBeat - EPS) {
184
- return indexed;
185
- }
186
- index -= 1;
187
- }
188
- return void 0;
189
- },
190
- attacksAt(beat) {
191
- const firstAfter = upperBound(notes, beat + EPS);
192
- const candidate = notes[firstAfter - 1];
193
- return candidate !== void 0 && Math.abs(candidate.note.startBeat - beat) < EPS;
194
- },
195
- onsetsBetween(startBeat, endBeat) {
196
- const result = [];
197
- let index = upperBound(notes, startBeat + EPS);
198
- while (index < notes.length) {
199
- const onset = notes[index]?.note.startBeat;
200
- if (onset === void 0 || onset >= endBeat - EPS) {
201
- break;
202
- }
203
- if (result[result.length - 1] !== onset) {
204
- result.push(onset);
205
- }
206
- index += 1;
207
- }
208
- return result;
209
- }
210
- };
211
- }
212
-
213
- // src/core/interval/index.ts
214
- var IntervalQuality = /* @__PURE__ */ ((IntervalQuality2) => {
215
- IntervalQuality2[IntervalQuality2["PerfectConsonance"] = 0] = "PerfectConsonance";
216
- IntervalQuality2[IntervalQuality2["ImperfectConsonance"] = 1] = "ImperfectConsonance";
217
- IntervalQuality2[IntervalQuality2["Dissonance"] = 2] = "Dissonance";
218
- return IntervalQuality2;
219
- })(IntervalQuality || {});
220
- function simpleInterval(semitones) {
221
- return Math.abs(semitones) % 12;
222
- }
223
- function classifyInterval(semitones, twoVoice = true) {
224
- const pc = simpleInterval(semitones);
225
- if (pc === 0 || pc === 7) {
226
- return 0 /* PerfectConsonance */;
227
- }
228
- if (pc === 3 || pc === 4 || pc === 8 || pc === 9) {
229
- return 1 /* ImperfectConsonance */;
230
- }
231
- if (pc === 5) {
232
- return twoVoice ? 2 /* Dissonance */ : 1 /* ImperfectConsonance */;
233
- }
234
- return 2 /* Dissonance */;
235
- }
236
- function isPerfectInterval(semitones) {
237
- const pc = simpleInterval(semitones);
238
- return pc === 0 || pc === 7;
239
- }
240
- function isConsonantInterval(semitones, twoVoice = true) {
241
- const pc = simpleInterval(semitones);
242
- if (pc === 5) {
243
- return !twoVoice;
244
- }
245
- return pc === 0 || pc === 3 || pc === 4 || pc === 7 || pc === 8 || pc === 9;
246
- }
247
-
248
- // src/core/meter/index.ts
249
- var EPS2 = 1e-9;
250
- function isMultiple(value, unit) {
251
- if (unit === 0) {
252
- return false;
253
- }
254
- const ratio = value / unit;
255
- return Math.abs(ratio - Math.round(ratio)) < EPS2;
256
- }
257
- function parseTimeSignature(text) {
258
- const match = /^\s*(\d+)\s*\/\s*(\d+)\s*$/.exec(text);
259
- if (!match) {
260
- throw new Error(`Invalid time signature: ${text}`);
261
- }
262
- const numerator = Number.parseInt(match[1] ?? "", 10);
263
- const denominator = Number.parseInt(match[2] ?? "", 10);
264
- if (!Number.isSafeInteger(numerator) || !Number.isSafeInteger(denominator) || numerator <= 0 || denominator <= 0) {
265
- throw new Error(`Invalid time signature: ${text}`);
266
- }
267
- return { numerator, denominator };
268
- }
269
- function formatTimeSignature(ts) {
270
- assertTimeSignature(ts);
271
- return `${ts.numerator}/${ts.denominator}`;
272
- }
273
- function isCompound(ts) {
274
- assertTimeSignature(ts);
275
- return ts.numerator % 3 === 0 && ts.numerator > 3;
276
- }
277
- function unitBeats(ts) {
278
- return 4 / ts.denominator;
279
- }
280
- function beatsPerBar(ts) {
281
- assertTimeSignature(ts);
282
- return ts.numerator * unitBeats(ts);
283
- }
284
- function pulseBeats(ts) {
285
- return isCompound(ts) ? 3 * unitBeats(ts) : unitBeats(ts);
286
- }
287
- function pulsesPerBar(ts) {
288
- return beatsPerBar(ts) / pulseBeats(ts);
289
- }
290
- function isValidGrouping(grouping, pulses) {
291
- if (grouping.length === 0) {
292
- return false;
293
- }
294
- let sum = 0;
295
- for (const g of grouping) {
296
- if (!Number.isInteger(g) || g <= 0) {
297
- return false;
298
- }
299
- sum += g;
300
- }
301
- return sum === pulses;
302
- }
303
- function isGroupHead(grouping, pulseIndex) {
304
- let acc = 0;
305
- for (const g of grouping) {
306
- if (acc === pulseIndex) {
307
- return true;
308
- }
309
- acc += g;
310
- }
311
- return false;
312
- }
313
- function beatToBarPosition(beatInQuarters, ts) {
314
- assertFiniteNumber(beatInQuarters, "beat");
315
- const barLen = beatsPerBar(ts);
316
- const bar = Math.floor(beatInQuarters / barLen);
317
- return { bar, beat: beatInQuarters - bar * barLen };
318
- }
319
- function barPositionToBeat(pos, ts) {
320
- assertInteger(pos.bar, "bar position bar");
321
- assertFiniteNumber(pos.beat, "bar position beat");
322
- return pos.bar * beatsPerBar(ts) + pos.beat;
323
- }
324
- function metricWeight(beatInQuarters, ts) {
325
- assertFiniteNumber(beatInQuarters, "beat");
326
- assertTimeSignature(ts);
327
- const { beat } = beatToBarPosition(beatInQuarters, ts);
328
- const pulse = pulseBeats(ts);
329
- if (!isMultiple(beat, pulse)) {
330
- return 0;
331
- }
332
- const pulses = pulsesPerBar(ts);
333
- const pulseIndex = Math.round(beat / pulse) % pulses;
334
- if (pulseIndex === 0) {
335
- return 3;
336
- }
337
- const grouping = ts.grouping;
338
- if (grouping !== void 0) {
339
- if (!isValidGrouping(grouping, pulses)) {
340
- throw new Error(
341
- `Invalid grouping [${grouping.join(", ")}] for ${formatTimeSignature(ts)}: entries must be positive integers summing to ${pulses}`
342
- );
343
- }
344
- return isGroupHead(grouping, pulseIndex) ? 2 : 1;
345
- }
346
- if (pulses % 2 === 0 && pulseIndex === pulses / 2) {
347
- return 2;
348
- }
349
- return 1;
350
- }
351
- function isStrongBeat(beatInQuarters, ts) {
352
- return metricWeight(beatInQuarters, ts) >= 2;
353
- }
354
- function tuplet(totalBeats, count) {
355
- assertRange(totalBeats, 0, Number.MAX_SAFE_INTEGER, "tuplet total beats");
356
- assertPositiveInt(count, "tuplet count");
357
- return new Array(count).fill(totalBeats / count);
358
- }
359
-
360
- // src/core/pitch/index.ts
361
- var LETTER_SEMITONES = [0, 2, 4, 5, 7, 9, 11];
362
- var LETTER_NAMES = ["C", "D", "E", "F", "G", "A", "B"];
363
- function mod12(n) {
364
- return (n % 12 + 12) % 12;
365
- }
366
- function mod7(n) {
367
- return (n % 7 + 7) % 7;
368
- }
369
- function parseNote(text) {
370
- const match = /^([A-Ga-g])([#x]*|b*)(-?\d+)?$/.exec(text.trim());
371
- if (!match) {
372
- throw new Error(`Invalid note: ${text}`);
373
- }
374
- const letterGlyph = (match[1] ?? "").toUpperCase();
375
- const letter = LETTER_NAMES.indexOf(letterGlyph);
376
- let alter = 0;
377
- for (const ch of match[2] ?? "") {
378
- if (ch === "#") {
379
- alter += 1;
380
- } else if (ch === "x") {
381
- alter += 2;
382
- } else if (ch === "b") {
383
- alter -= 1;
384
- }
385
- }
386
- const note = { letter, alter };
387
- if (match[3] !== void 0) {
388
- note.octave = Number.parseInt(match[3], 10);
389
- }
390
- return note;
391
- }
392
- function formatAlter(alter) {
393
- if (alter > 0) {
394
- return "#".repeat(alter);
395
- }
396
- if (alter < 0) {
397
- return "b".repeat(-alter);
398
- }
399
- return "";
400
- }
401
- function formatNote(note) {
402
- const glyph = LETTER_NAMES[mod7(note.letter)] ?? "C";
403
- const octave = note.octave === void 0 ? "" : String(note.octave);
404
- return `${glyph}${formatAlter(note.alter)}${octave}`;
405
- }
406
- function noteToPitchClass(note) {
407
- const natural = LETTER_SEMITONES[mod7(note.letter)] ?? 0;
408
- return mod12(natural + note.alter);
409
- }
410
- function noteToMidi(note) {
411
- if (note.octave === void 0) {
412
- throw new Error("noteToMidi requires an octave");
413
- }
414
- const natural = LETTER_SEMITONES[mod7(note.letter)] ?? 0;
415
- return (note.octave + 1) * 12 + natural + note.alter;
416
- }
417
- var SHARP_SPELLING = [
418
- [0, 0],
419
- [0, 1],
420
- [1, 0],
421
- [1, 1],
422
- [2, 0],
423
- [3, 0],
424
- [3, 1],
425
- [4, 0],
426
- [4, 1],
427
- [5, 0],
428
- [5, 1],
429
- [6, 0]
430
- ];
431
- var FLAT_SPELLING = [
432
- [0, 0],
433
- [1, -1],
434
- [1, 0],
435
- [2, -1],
436
- [2, 0],
437
- [3, 0],
438
- [4, -1],
439
- [4, 0],
440
- [5, -1],
441
- [5, 0],
442
- [6, -1],
443
- [6, 0]
444
- ];
445
- function midiToNote(midi, spelling = "sharp") {
446
- const rounded = Math.round(midi);
447
- const pc = mod12(rounded);
448
- const octave = Math.floor(rounded / 12) - 1;
449
- const table = spelling === "sharp" ? SHARP_SPELLING : FLAT_SPELLING;
450
- const entry = table[pc] ?? [0, 0];
451
- return { letter: entry[0], alter: entry[1], octave };
452
- }
453
- var SIMPLE_REFERENCE = [0, 0, 2, 4, 5, 7, 9, 11];
454
- function isPerfectNumber(simpleNumber) {
455
- return simpleNumber === 1 || simpleNumber === 4 || simpleNumber === 5;
456
- }
457
- function qualityFromSpan(numberValue, semitones) {
458
- const octaves = Math.floor((numberValue - 1) / 7);
459
- const simple = numberValue - 7 * octaves;
460
- const reference = (SIMPLE_REFERENCE[simple] ?? 0) + 12 * octaves;
461
- const delta = semitones - reference;
462
- if (isPerfectNumber(simple)) {
463
- if (delta === 0) {
464
- return "P";
465
- }
466
- return delta > 0 ? "A".repeat(delta) : "d".repeat(-delta);
467
- }
468
- if (delta === 0) {
469
- return "M";
470
- }
471
- if (delta === -1) {
472
- return "m";
473
- }
474
- return delta > 0 ? "A".repeat(delta) : "d".repeat(-delta - 1);
475
- }
476
- function diatonicIndex(note) {
477
- return mod7(note.letter) + 7 * (note.octave ?? 0);
478
- }
479
- function spelledInterval(a, b) {
480
- const octaved = a.octave !== void 0 && b.octave !== void 0;
481
- let letterSteps;
482
- let semitones;
483
- if (octaved) {
484
- letterSteps = diatonicIndex(b) - diatonicIndex(a);
485
- semitones = noteToMidi(b) - noteToMidi(a);
486
- } else {
487
- letterSteps = mod7(b.letter - a.letter);
488
- let rawSemis = mod12(noteToPitchClass(b) - noteToPitchClass(a));
489
- const reference = SIMPLE_REFERENCE[letterSteps + 1] ?? 0;
490
- if (reference - rawSemis > 6) {
491
- rawSemis += 12;
492
- } else if (rawSemis - reference > 6) {
493
- rawSemis -= 12;
494
- }
495
- semitones = rawSemis;
496
- }
497
- const absSteps = Math.abs(letterSteps);
498
- const number = absSteps + 1;
499
- const quality = qualityFromSpan(number, Math.abs(semitones));
500
- return { number, quality, semitones };
501
- }
502
-
503
- // src/core/random/index.ts
504
- function createRng(seed) {
505
- assertFiniteNumber(seed, "seed");
506
- let state = seed >>> 0;
507
- const next = () => {
508
- state = state + 1831565813 >>> 0;
509
- let t = state;
510
- t = Math.imul(t ^ t >>> 15, t | 1);
511
- t ^= t + Math.imul(t ^ t >>> 7, t | 61);
512
- return ((t ^ t >>> 14) >>> 0) / 4294967296;
513
- };
514
- return {
515
- next,
516
- prob: (p) => next() < assertRange(p, 0, 1, "probability"),
517
- range: (lo, hi) => {
518
- assertInteger(lo, "range lower bound");
519
- assertInteger(hi, "range upper bound");
520
- if (lo > hi) {
521
- throw new RangeError(
522
- `range lower bound must not exceed upper bound; received ${lo} > ${hi}`
523
- );
524
- }
525
- assertInteger(hi - lo, "range span", 0);
526
- return lo + Math.floor(next() * (hi - lo + 1));
527
- },
528
- float: (lo, hi) => {
529
- assertFiniteNumber(lo, "float lower bound");
530
- assertFiniteNumber(hi, "float upper bound");
531
- if (lo > hi) {
532
- throw new RangeError(
533
- `float lower bound must not exceed upper bound; received ${lo} > ${hi}`
534
- );
535
- }
536
- assertFiniteNumber(hi - lo, "float span");
537
- return lo + next() * (hi - lo);
538
- }
539
- };
540
- }
541
-
542
- // src/core/tuning/index.ts
543
- var TWELVE_TET = { refStep: 69, refFreq: 440, divisions: 12 };
544
- function assertTuning(tuning) {
545
- assertFiniteNumber(tuning.refStep, "tuning.refStep");
546
- assertRange(tuning.refFreq, Number.MIN_VALUE, Number.MAX_VALUE, "tuning.refFreq");
547
- assertPositiveInt(tuning.divisions, "tuning.divisions");
548
- return tuning;
549
- }
550
- function edo(n, refFreq = 440, refStep = 69) {
551
- assertPositiveInt(n, "EDO divisions");
552
- assertRange(refFreq, Number.MIN_VALUE, Number.MAX_VALUE, "reference frequency");
553
- assertFiniteNumber(refStep, "reference step");
554
- return { refStep, refFreq, divisions: n };
555
- }
556
- function frequencyOf(step, tuning = TWELVE_TET) {
557
- assertFiniteNumber(step, "step");
558
- assertTuning(tuning);
559
- const result = tuning.refFreq * 2 ** ((step - tuning.refStep) / tuning.divisions);
560
- return assertRange(result, Number.MIN_VALUE, Number.MAX_VALUE, "frequency result");
561
- }
562
- function nearestStep(freq, tuning = TWELVE_TET) {
563
- assertRange(freq, Number.MIN_VALUE, Number.MAX_VALUE, "frequency");
564
- assertTuning(tuning);
565
- return Math.round(tuning.refStep + tuning.divisions * Math.log2(freq / tuning.refFreq));
566
- }
567
- function centsBetweenFreq(a, b) {
568
- assertRange(a, Number.MIN_VALUE, Number.MAX_VALUE, "first frequency");
569
- assertRange(b, Number.MIN_VALUE, Number.MAX_VALUE, "second frequency");
570
- return 1200 * (Math.log2(b) - Math.log2(a));
571
- }
572
- function centsOfSteps(steps, tuning = TWELVE_TET) {
573
- assertFiniteNumber(steps, "steps");
574
- assertTuning(tuning);
575
- return assertFiniteNumber(steps * 1200 / tuning.divisions, "cents result");
576
- }
577
- function ratioToCents(numerator, denominator) {
578
- assertRange(numerator, Number.MIN_VALUE, Number.MAX_VALUE, "ratio numerator");
579
- assertRange(denominator, Number.MIN_VALUE, Number.MAX_VALUE, "ratio denominator");
580
- return 1200 * (Math.log2(numerator) - Math.log2(denominator));
581
- }
582
- var JUST_RATIOS = {
583
- 0: [1, 1],
584
- 1: [16, 15],
585
- 2: [9, 8],
586
- 3: [6, 5],
587
- 4: [5, 4],
588
- 5: [4, 3],
589
- 6: [45, 32],
590
- 7: [3, 2],
591
- 8: [8, 5],
592
- 9: [5, 3],
593
- 10: [9, 5],
594
- 11: [15, 8],
595
- 12: [2, 1]
596
- };
597
- function justDeviationCents(semitoneClass) {
598
- assertInteger(semitoneClass, "semitone class", 0, 12);
599
- const ratio = JUST_RATIOS[semitoneClass];
600
- if (!ratio) {
601
- throw new RangeError(`semitone class has no just ratio: ${semitoneClass}`);
602
- }
603
- return ratioToCents(ratio[0], ratio[1]) - semitoneClass * 100;
604
- }
605
- // Annotate the CommonJS export names for ESM import in node:
606
- 0 && (module.exports = {
607
- DEFAULT_GENERATION_BUDGET,
608
- IntervalQuality,
609
- JUST_RATIOS,
610
- TWELVE_TET,
611
- assertFiniteNumber,
612
- assertGenerationBudget,
613
- assertInteger,
614
- assertNoteEvent,
615
- assertNoteEvents,
616
- assertPositiveInt,
617
- assertRange,
618
- assertTimeSignature,
619
- barPositionToBeat,
620
- beatToBarPosition,
621
- beatsPerBar,
622
- centsBetweenFreq,
623
- centsOfSteps,
624
- classifyInterval,
625
- createNoteEventIndex,
626
- createRng,
627
- edo,
628
- formatNote,
629
- formatTimeSignature,
630
- frequencyOf,
631
- isCompound,
632
- isConsonantInterval,
633
- isPerfectInterval,
634
- isStrongBeat,
635
- justDeviationCents,
636
- metricWeight,
637
- midiToNote,
638
- nearestStep,
639
- noteToMidi,
640
- noteToPitchClass,
641
- parseNote,
642
- parseTimeSignature,
643
- pulsesPerBar,
644
- ratioToCents,
645
- spelledInterval,
646
- tuplet
647
- });
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+ var _chunkNP4NA2FBcjs = require('../chunk-NP4NA2FB.cjs');
16
+
17
+
18
+ var _chunkRUMU3UA6cjs = require('../chunk-RUMU3UA6.cjs');
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+ var _chunk36N73KZ3cjs = require('../chunk-36N73KZ3.cjs');
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+ var _chunk7MGZ7D62cjs = require('../chunk-7MGZ7D62.cjs');
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+
80
+
81
+
82
+
83
+
84
+
85
+
86
+
87
+
88
+
89
+
90
+
91
+
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+
104
+
105
+
106
+
107
+
108
+
109
+
110
+
111
+
112
+
113
+
114
+
115
+
116
+
117
+
118
+
119
+
120
+
121
+
122
+
123
+
124
+
125
+
126
+
127
+
128
+
129
+
130
+ exports.BudgetExceededError = _chunk7MGZ7D62cjs.BudgetExceededError; exports.ConsonanceClass = _chunk7MGZ7D62cjs.ConsonanceClass; exports.DEFAULT_GENERATION_BUDGET = _chunk7MGZ7D62cjs.DEFAULT_GENERATION_BUDGET; exports.InvalidInputError = _chunk7MGZ7D62cjs.InvalidInputError; exports.JUST_RATIOS = _chunkNP4NA2FBcjs.JUST_RATIOS; exports.NoSolutionError = _chunk7MGZ7D62cjs.NoSolutionError; exports.TWELVE_TET = _chunkNP4NA2FBcjs.TWELVE_TET; exports.assertFiniteNumber = _chunk7MGZ7D62cjs.assertFiniteNumber; exports.assertGenerationBudget = _chunk7MGZ7D62cjs.assertGenerationBudget; exports.assertInteger = _chunk7MGZ7D62cjs.assertInteger; exports.assertNoteEvent = _chunk7MGZ7D62cjs.assertNoteEvent; exports.assertNoteEvents = _chunk7MGZ7D62cjs.assertNoteEvents; exports.assertOneOf = _chunk7MGZ7D62cjs.assertOneOf; exports.assertPositiveInt = _chunk7MGZ7D62cjs.assertPositiveInt; exports.assertRange = _chunk7MGZ7D62cjs.assertRange; exports.assertTimeSignature = _chunk7MGZ7D62cjs.assertTimeSignature; exports.barPositionToBeat = _chunk36N73KZ3cjs.barPositionToBeat; exports.barPositionToPulse = _chunk36N73KZ3cjs.barPositionToPulse; exports.beatToBarPosition = _chunk36N73KZ3cjs.beatToBarPosition; exports.beatsPerBar = _chunk36N73KZ3cjs.beatsPerBar; exports.centsBetweenFreq = _chunkNP4NA2FBcjs.centsBetweenFreq; exports.centsFromNearestStep = _chunkNP4NA2FBcjs.centsFromNearestStep; exports.centsOfSteps = _chunkNP4NA2FBcjs.centsOfSteps; exports.centsToRatio = _chunkNP4NA2FBcjs.centsToRatio; exports.classifyInterval = _chunk7MGZ7D62cjs.classifyInterval; exports.createNoteEventIndex = _chunk36N73KZ3cjs.createNoteEventIndex; exports.createRng = _chunkRUMU3UA6cjs.createRng; exports.diatonicLetterOf = _chunk7MGZ7D62cjs.diatonicLetterOf; exports.dropSilentNotes = _chunk7MGZ7D62cjs.dropSilentNotes; exports.edo = _chunkNP4NA2FBcjs.edo; exports.formatBarPosition = _chunk36N73KZ3cjs.formatBarPosition; exports.formatNote = _chunk7MGZ7D62cjs.formatNote; exports.formatTimeSignature = _chunk36N73KZ3cjs.formatTimeSignature; exports.frequencyOf = _chunkNP4NA2FBcjs.frequencyOf; exports.intervalSemitones = _chunk7MGZ7D62cjs.intervalSemitones; exports.isCompound = _chunk36N73KZ3cjs.isCompound; exports.isConsonantInterval = _chunk7MGZ7D62cjs.isConsonantInterval; exports.isLibcantusError = _chunk7MGZ7D62cjs.isLibcantusError; exports.isPerfectInterval = _chunk7MGZ7D62cjs.isPerfectInterval; exports.isStrongBeat = _chunk36N73KZ3cjs.isStrongBeat; exports.justDeviationCents = _chunkNP4NA2FBcjs.justDeviationCents; exports.metricWeight = _chunk36N73KZ3cjs.metricWeight; exports.midiToNote = _chunk7MGZ7D62cjs.midiToNote; exports.naturalPitchClassOf = _chunk7MGZ7D62cjs.naturalPitchClassOf; exports.nearestStep = _chunkNP4NA2FBcjs.nearestStep; exports.noteToMidi = _chunk7MGZ7D62cjs.noteToMidi; exports.noteToPitchClass = _chunk7MGZ7D62cjs.noteToPitchClass; exports.parseInterval = _chunk7MGZ7D62cjs.parseInterval; exports.parseNote = _chunk7MGZ7D62cjs.parseNote; exports.parseTimeSignature = _chunk36N73KZ3cjs.parseTimeSignature; exports.pitchClassOf = _chunk7MGZ7D62cjs.pitchClassOf; exports.pulseBeats = _chunk36N73KZ3cjs.pulseBeats; exports.pulsesPerBar = _chunk36N73KZ3cjs.pulsesPerBar; exports.ratioToCents = _chunkNP4NA2FBcjs.ratioToCents; exports.spelledInterval = _chunk7MGZ7D62cjs.spelledInterval; exports.stepOf = _chunkNP4NA2FBcjs.stepOf; exports.stepsOfCents = _chunkNP4NA2FBcjs.stepsOfCents; exports.transposeByInterval = _chunk7MGZ7D62cjs.transposeByInterval; exports.transposeNote = _chunk7MGZ7D62cjs.transposeNote; exports.tuplet = _chunk36N73KZ3cjs.tuplet;
648
131
  //# sourceMappingURL=index.cjs.map