@libraz/libcantus 0.9.3 → 0.9.5

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 (201) hide show
  1. package/README.md +29 -20
  2. package/README_ja.md +268 -0
  3. package/dist/analyze/index.cjs +39 -1947
  4. package/dist/analyze/index.cjs.map +1 -1
  5. package/dist/analyze/index.d.cts +161 -91
  6. package/dist/analyze/index.d.ts +161 -91
  7. package/dist/analyze/index.js +19 -8
  8. package/dist/chunk-2A2QMA74.cjs +261 -0
  9. package/dist/chunk-2A2QMA74.cjs.map +1 -0
  10. package/dist/chunk-2PTFGVD7.js +261 -0
  11. package/dist/chunk-2PTFGVD7.js.map +1 -0
  12. package/dist/chunk-357ZDPVU.cjs +162 -0
  13. package/dist/chunk-357ZDPVU.cjs.map +1 -0
  14. package/dist/chunk-3KX76RLG.js +1548 -0
  15. package/dist/chunk-3KX76RLG.js.map +1 -0
  16. package/dist/chunk-4VZ5MZAM.cjs +889 -0
  17. package/dist/chunk-4VZ5MZAM.cjs.map +1 -0
  18. package/dist/{chunk-C5XYKUVG.js → chunk-7EONYVI5.js} +471 -171
  19. package/dist/chunk-7EONYVI5.js.map +1 -0
  20. package/dist/{chunk-IT2O4XFE.js → chunk-7JEP3MFY.js} +42 -34
  21. package/dist/chunk-7JEP3MFY.js.map +1 -0
  22. package/dist/{chunk-4MHA432G.js → chunk-AID75RN3.js} +572 -250
  23. package/dist/chunk-AID75RN3.js.map +1 -0
  24. package/dist/chunk-BSLTLGM3.cjs +497 -0
  25. package/dist/chunk-BSLTLGM3.cjs.map +1 -0
  26. package/dist/chunk-CU6VG2YM.cjs +109 -0
  27. package/dist/chunk-CU6VG2YM.cjs.map +1 -0
  28. package/dist/{chunk-EH6EM37U.js → chunk-DZMHIGI4.js} +81 -59
  29. package/dist/chunk-DZMHIGI4.js.map +1 -0
  30. package/dist/{chunk-AKLYPWIN.js → chunk-EDOTEABK.js} +45 -19
  31. package/dist/chunk-EDOTEABK.js.map +1 -0
  32. package/dist/{chunk-2ZWMSJH6.js → chunk-HN2OEUN2.js} +7 -4
  33. package/dist/chunk-HN2OEUN2.js.map +1 -0
  34. package/dist/{chunk-MIWO425M.js → chunk-KBTTEX7Q.js} +128 -43
  35. package/dist/chunk-KBTTEX7Q.js.map +1 -0
  36. package/dist/chunk-KQN2ZYND.cjs +724 -0
  37. package/dist/chunk-KQN2ZYND.cjs.map +1 -0
  38. package/dist/chunk-MPTVJIVG.cjs +3176 -0
  39. package/dist/chunk-MPTVJIVG.cjs.map +1 -0
  40. package/dist/chunk-MTMZTMWM.cjs +53 -0
  41. package/dist/chunk-MTMZTMWM.cjs.map +1 -0
  42. package/dist/{chunk-CHMXELDS.js → chunk-NNB67XA2.js} +372 -197
  43. package/dist/chunk-NNB67XA2.js.map +1 -0
  44. package/dist/chunk-OL3IHHSJ.cjs +1204 -0
  45. package/dist/chunk-OL3IHHSJ.cjs.map +1 -0
  46. package/dist/chunk-PI3UXRWK.cjs +528 -0
  47. package/dist/chunk-PI3UXRWK.cjs.map +1 -0
  48. package/dist/chunk-R2VVFAIN.js +528 -0
  49. package/dist/chunk-R2VVFAIN.js.map +1 -0
  50. package/dist/chunk-T64C7ZD7.cjs +1 -0
  51. package/dist/chunk-T64C7ZD7.cjs.map +1 -0
  52. package/dist/chunk-WFDXOLUB.cjs +337 -0
  53. package/dist/chunk-WFDXOLUB.cjs.map +1 -0
  54. package/dist/chunk-WTAN4ACG.cjs +1548 -0
  55. package/dist/chunk-WTAN4ACG.cjs.map +1 -0
  56. package/dist/chunk-YFJXS3AU.cjs +33 -0
  57. package/dist/chunk-YFJXS3AU.cjs.map +1 -0
  58. package/dist/{chunk-GOAW4VYL.js → chunk-YUE6TJ4M.js} +315 -145
  59. package/dist/chunk-YUE6TJ4M.js.map +1 -0
  60. package/dist/{chunk-62QZKCJQ.js → chunk-ZGLJM4A4.js} +10 -6
  61. package/dist/chunk-ZGLJM4A4.js.map +1 -0
  62. package/dist/core/index.cjs +140 -647
  63. package/dist/core/index.cjs.map +1 -1
  64. package/dist/core/index.d.cts +313 -41
  65. package/dist/core/index.d.ts +313 -41
  66. package/dist/core/index.js +64 -16
  67. package/dist/{function-DVH4Eusr.d.ts → function-CxixTB02.d.cts} +122 -10
  68. package/dist/{function-DYt4iKsn.d.cts → function-DTCt675z.d.ts} +122 -10
  69. package/dist/generate/index.cjs +28 -4085
  70. package/dist/generate/index.cjs.map +1 -1
  71. package/dist/generate/index.d.cts +374 -66
  72. package/dist/generate/index.d.ts +374 -66
  73. package/dist/generate/index.js +23 -9
  74. package/dist/{index-Jc0Ryi79.d.ts → index-B2Ulxxpo.d.cts} +21 -5
  75. package/dist/{index-CpOsP1y9.d.cts → index-BkYJ0xMq.d.cts} +18 -17
  76. package/dist/{index-CxqBQtH1.d.cts → index-BuaB-ypt.d.ts} +21 -5
  77. package/dist/index-CAN7v-kw.d.ts +199 -0
  78. package/dist/{index-Bt4tOUD9.d.ts → index-COw1Ky9g.d.ts} +93 -8
  79. package/dist/{index-Dikst44v.d.cts → index-Cfx8xgH0.d.ts} +14 -11
  80. package/dist/{index-DxvARIP2.d.ts → index-DRtIhlJj.d.ts} +18 -17
  81. package/dist/{index-Cl7mhOFM.d.cts → index-DXd9JikN.d.cts} +92 -10
  82. package/dist/{index-Cl7mhOFM.d.ts → index-DXd9JikN.d.ts} +92 -10
  83. package/dist/index-alrRninU.d.cts +199 -0
  84. package/dist/{index-BNlGP86A.d.cts → index-oTQbYYIs.d.cts} +93 -8
  85. package/dist/index-tR9jTn26.d.cts +275 -0
  86. package/dist/index-tR9jTn26.d.ts +275 -0
  87. package/dist/{index-Bg5dYMmZ.d.ts → index-x2vcsduE.d.cts} +14 -11
  88. package/dist/index.cjs +429 -7383
  89. package/dist/index.cjs.map +1 -1
  90. package/dist/index.d.cts +15 -15
  91. package/dist/index.d.ts +15 -15
  92. package/dist/index.js +121 -27
  93. package/dist/model/index.cjs +8 -2562
  94. package/dist/model/index.cjs.map +1 -1
  95. package/dist/model/index.d.cts +471 -81
  96. package/dist/model/index.d.ts +471 -81
  97. package/dist/model/index.js +6 -7
  98. package/dist/styled-Bl0ZK28h.d.ts +543 -0
  99. package/dist/styled-Crv6SA4S.d.cts +543 -0
  100. package/dist/theory/index.cjs +172 -1822
  101. package/dist/theory/index.cjs.map +1 -1
  102. package/dist/theory/index.d.cts +151 -233
  103. package/dist/theory/index.d.ts +151 -233
  104. package/dist/theory/index.js +30 -7
  105. package/dist/{types-MGP29r3t.d.cts → types-BN6_Q9Kl.d.cts} +11 -2
  106. package/dist/{types-MGP29r3t.d.ts → types-BN6_Q9Kl.d.ts} +11 -2
  107. package/package.json +34 -13
  108. package/dist/chunk-2ZWMSJH6.js.map +0 -1
  109. package/dist/chunk-4MHA432G.js.map +0 -1
  110. package/dist/chunk-62QZKCJQ.js.map +0 -1
  111. package/dist/chunk-AKLYPWIN.js.map +0 -1
  112. package/dist/chunk-C5XYKUVG.js.map +0 -1
  113. package/dist/chunk-CHMXELDS.js.map +0 -1
  114. package/dist/chunk-DYWFNC4A.js +0 -152
  115. package/dist/chunk-DYWFNC4A.js.map +0 -1
  116. package/dist/chunk-EH6EM37U.js.map +0 -1
  117. package/dist/chunk-FBQK3ZQN.js +0 -131
  118. package/dist/chunk-FBQK3ZQN.js.map +0 -1
  119. package/dist/chunk-GOAW4VYL.js.map +0 -1
  120. package/dist/chunk-I5R7ZBJS.js +0 -202
  121. package/dist/chunk-I5R7ZBJS.js.map +0 -1
  122. package/dist/chunk-IT2O4XFE.js.map +0 -1
  123. package/dist/chunk-MIWO425M.js.map +0 -1
  124. package/dist/chunk-SGU7SPLK.js +0 -924
  125. package/dist/chunk-SGU7SPLK.js.map +0 -1
  126. package/dist/index-CGMZNCx6.d.cts +0 -140
  127. package/dist/index-CGMZNCx6.d.ts +0 -140
  128. package/dist/index-CnZCo29u.d.cts +0 -108
  129. package/dist/index-JnF4v9bx.d.ts +0 -108
  130. package/dist/styled-DZ7GjShb.d.ts +0 -282
  131. package/dist/styled-ZTbdaVFM.d.cts +0 -282
  132. package/src/analyze/arrange/index.ts +0 -21
  133. package/src/analyze/arrange/internal.ts +0 -127
  134. package/src/analyze/arrange/tension.ts +0 -199
  135. package/src/analyze/arrange/tracks.ts +0 -312
  136. package/src/analyze/detect/index.ts +0 -272
  137. package/src/analyze/functional/borrowed.ts +0 -84
  138. package/src/analyze/functional/cadence.ts +0 -66
  139. package/src/analyze/functional/function.ts +0 -184
  140. package/src/analyze/functional/index.ts +0 -23
  141. package/src/analyze/functional/internal.ts +0 -29
  142. package/src/analyze/functional/roman.ts +0 -402
  143. package/src/analyze/index.ts +0 -49
  144. package/src/analyze/timeline/index.ts +0 -451
  145. package/src/analyze/voice/index.ts +0 -339
  146. package/src/core/event-index/index.ts +0 -104
  147. package/src/core/index.ts +0 -61
  148. package/src/core/interval/index.ts +0 -81
  149. package/src/core/meter/index.ts +0 -302
  150. package/src/core/pitch/index.ts +0 -311
  151. package/src/core/random/index.ts +0 -76
  152. package/src/core/tuning/index.ts +0 -186
  153. package/src/core/types.ts +0 -29
  154. package/src/core/validation/index.ts +0 -119
  155. package/src/generate/bass/index.ts +0 -373
  156. package/src/generate/countermelody/index.ts +0 -470
  157. package/src/generate/drums/beat.ts +0 -266
  158. package/src/generate/drums/euclid.ts +0 -65
  159. package/src/generate/drums/fills.ts +0 -356
  160. package/src/generate/drums/ghost.ts +0 -119
  161. package/src/generate/drums/hihat.ts +0 -285
  162. package/src/generate/drums/hit.ts +0 -31
  163. package/src/generate/drums/index.ts +0 -361
  164. package/src/generate/drums/internal.ts +0 -257
  165. package/src/generate/drums/kick.ts +0 -160
  166. package/src/generate/drums/percussion.ts +0 -121
  167. package/src/generate/drums/rng.ts +0 -7
  168. package/src/generate/drums/swing.ts +0 -71
  169. package/src/generate/groove/index.ts +0 -351
  170. package/src/generate/harmonize/index.ts +0 -451
  171. package/src/generate/index.ts +0 -58
  172. package/src/generate/motif/index.ts +0 -422
  173. package/src/generate/progression/index.ts +0 -362
  174. package/src/generate/reharmony/index.ts +0 -323
  175. package/src/generate/rhythm/index.ts +0 -175
  176. package/src/index.ts +0 -13
  177. package/src/model/chord.ts +0 -442
  178. package/src/model/index.ts +0 -15
  179. package/src/model/interval.ts +0 -82
  180. package/src/model/key.ts +0 -266
  181. package/src/model/note.ts +0 -176
  182. package/src/model/progression.ts +0 -161
  183. package/src/model/shared.ts +0 -12
  184. package/src/theory/chord/index.ts +0 -375
  185. package/src/theory/chordscale/index.ts +0 -374
  186. package/src/theory/counterpoint/index.ts +0 -230
  187. package/src/theory/harmony/index.ts +0 -77
  188. package/src/theory/index.ts +0 -112
  189. package/src/theory/safety/index.ts +0 -488
  190. package/src/theory/scale/degrees.ts +0 -123
  191. package/src/theory/scale/index.ts +0 -28
  192. package/src/theory/scale/key.ts +0 -56
  193. package/src/theory/scale/masks.ts +0 -153
  194. package/src/theory/spelling/index.ts +0 -249
  195. package/src/theory/symbol/index.ts +0 -268
  196. package/src/theory/voicing/index.ts +0 -5
  197. package/src/theory/voicing/internal.ts +0 -168
  198. package/src/theory/voicing/leading.ts +0 -112
  199. package/src/theory/voicing/satb.ts +0 -216
  200. package/src/theory/voicing/styled.ts +0 -199
  201. package/tsconfig.json +0 -23
@@ -1,648 +1,141 @@
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 _chunkCU6VG2YMcjs = require('../chunk-CU6VG2YM.cjs');
16
+
17
+
18
+ var _chunkMTMZTMWMcjs = require('../chunk-MTMZTMWM.cjs');
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+ var _chunk2A2QMA74cjs = require('../chunk-2A2QMA74.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
+
69
+
70
+
71
+
72
+
73
+ var _chunkPI3UXRWKcjs = require('../chunk-PI3UXRWK.cjs');
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
+
131
+
132
+
133
+
134
+
135
+
136
+
137
+
138
+
139
+
140
+ exports.BudgetExceededError = _chunkPI3UXRWKcjs.BudgetExceededError; exports.ConsonanceClass = _chunkPI3UXRWKcjs.ConsonanceClass; exports.DEFAULT_GENERATION_BUDGET = _chunkPI3UXRWKcjs.DEFAULT_GENERATION_BUDGET; exports.InvalidInputError = _chunkPI3UXRWKcjs.InvalidInputError; exports.JUST_RATIOS = _chunkCU6VG2YMcjs.JUST_RATIOS; exports.NoSolutionError = _chunkPI3UXRWKcjs.NoSolutionError; exports.TWELVE_TET = _chunkCU6VG2YMcjs.TWELVE_TET; exports.assertDegree = _chunkPI3UXRWKcjs.assertDegree; exports.assertFiniteNumber = _chunkPI3UXRWKcjs.assertFiniteNumber; exports.assertFiniteSemitones = _chunkPI3UXRWKcjs.assertFiniteSemitones; exports.assertGenerationBudget = _chunkPI3UXRWKcjs.assertGenerationBudget; exports.assertInteger = _chunkPI3UXRWKcjs.assertInteger; exports.assertMidiPitch = _chunkPI3UXRWKcjs.assertMidiPitch; exports.assertNoteEvent = _chunkPI3UXRWKcjs.assertNoteEvent; exports.assertNoteEvents = _chunkPI3UXRWKcjs.assertNoteEvents; exports.assertOneOf = _chunkPI3UXRWKcjs.assertOneOf; exports.assertPositiveInt = _chunkPI3UXRWKcjs.assertPositiveInt; exports.assertRange = _chunkPI3UXRWKcjs.assertRange; exports.assertTimeSignature = _chunkPI3UXRWKcjs.assertTimeSignature; exports.barPositionToBeat = _chunk2A2QMA74cjs.barPositionToBeat; exports.barPositionToPulse = _chunk2A2QMA74cjs.barPositionToPulse; exports.beatToBarPosition = _chunk2A2QMA74cjs.beatToBarPosition; exports.beatsPerBar = _chunk2A2QMA74cjs.beatsPerBar; exports.centsBetweenFreq = _chunkCU6VG2YMcjs.centsBetweenFreq; exports.centsFromNearestStep = _chunkCU6VG2YMcjs.centsFromNearestStep; exports.centsOfSteps = _chunkCU6VG2YMcjs.centsOfSteps; exports.centsToRatio = _chunkCU6VG2YMcjs.centsToRatio; exports.clampToMidi = _chunkPI3UXRWKcjs.clampToMidi; exports.classifyInterval = _chunkPI3UXRWKcjs.classifyInterval; exports.createNoteEventIndex = _chunk2A2QMA74cjs.createNoteEventIndex; exports.createRng = _chunkMTMZTMWMcjs.createRng; exports.diatonicLetterOf = _chunkPI3UXRWKcjs.diatonicLetterOf; exports.dropSilentNotes = _chunkPI3UXRWKcjs.dropSilentNotes; exports.edo = _chunkCU6VG2YMcjs.edo; exports.formatBarPosition = _chunk2A2QMA74cjs.formatBarPosition; exports.formatNote = _chunkPI3UXRWKcjs.formatNote; exports.formatTimeSignature = _chunk2A2QMA74cjs.formatTimeSignature; exports.frequencyOf = _chunkCU6VG2YMcjs.frequencyOf; exports.intervalSemitones = _chunkPI3UXRWKcjs.intervalSemitones; exports.isCompound = _chunk2A2QMA74cjs.isCompound; exports.isConsonantInterval = _chunkPI3UXRWKcjs.isConsonantInterval; exports.isLibcantusError = _chunkPI3UXRWKcjs.isLibcantusError; exports.isPerfectInterval = _chunkPI3UXRWKcjs.isPerfectInterval; exports.isStrongBeat = _chunk2A2QMA74cjs.isStrongBeat; exports.justDeviationCents = _chunkCU6VG2YMcjs.justDeviationCents; exports.metricWeight = _chunk2A2QMA74cjs.metricWeight; exports.midiToNote = _chunkPI3UXRWKcjs.midiToNote; exports.naturalPitchClassOf = _chunkPI3UXRWKcjs.naturalPitchClassOf; exports.nearestStep = _chunkCU6VG2YMcjs.nearestStep; exports.noteToMidi = _chunkPI3UXRWKcjs.noteToMidi; exports.noteToPitchClass = _chunkPI3UXRWKcjs.noteToPitchClass; exports.parseInterval = _chunkPI3UXRWKcjs.parseInterval; exports.parseNote = _chunkPI3UXRWKcjs.parseNote; exports.parseTimeSignature = _chunk2A2QMA74cjs.parseTimeSignature; exports.pitchClassOf = _chunkPI3UXRWKcjs.pitchClassOf; exports.pulseBeats = _chunk2A2QMA74cjs.pulseBeats; exports.pulsesPerBar = _chunk2A2QMA74cjs.pulsesPerBar; exports.ratioToCents = _chunkCU6VG2YMcjs.ratioToCents; exports.soundingNotesOnly = _chunkPI3UXRWKcjs.soundingNotesOnly; exports.spelledInterval = _chunkPI3UXRWKcjs.spelledInterval; exports.stepOf = _chunkCU6VG2YMcjs.stepOf; exports.stepsOfCents = _chunkCU6VG2YMcjs.stepsOfCents; exports.transposeByInterval = _chunkPI3UXRWKcjs.transposeByInterval; exports.transposeNote = _chunkPI3UXRWKcjs.transposeNote; exports.tuplet = _chunk2A2QMA74cjs.tuplet;
648
141
  //# sourceMappingURL=index.cjs.map