tblswvs 0.22.0 → 0.23.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 (84) hide show
  1. package/lib/{es5 → esnext}/helpers.d.ts +1 -0
  2. package/lib/{es6 → esnext}/helpers.js +1 -0
  3. package/lib/esnext/helpers.js.map +1 -0
  4. package/lib/esnext/key.js +189 -0
  5. package/lib/esnext/key.js.map +1 -0
  6. package/lib/{es6 → esnext}/lindenmayer_system.js +3 -0
  7. package/lib/esnext/lindenmayer_system.js.map +1 -0
  8. package/lib/{es6 → esnext}/markov_chain.js +2 -0
  9. package/lib/esnext/markov_chain.js.map +1 -0
  10. package/lib/{es6 → esnext}/melodic_vector.js +4 -4
  11. package/lib/esnext/melodic_vector.js.map +1 -0
  12. package/lib/{es5 → esnext}/melody.d.ts +8 -3
  13. package/lib/{es6 → esnext}/melody.js +62 -33
  14. package/lib/esnext/melody.js.map +1 -0
  15. package/lib/esnext/mode.js +99 -0
  16. package/lib/esnext/mode.js.map +1 -0
  17. package/lib/{es6 → esnext}/mutation.js +12 -12
  18. package/lib/esnext/mutation.js.map +1 -0
  19. package/lib/{es6 → esnext}/rhythm.js +3 -0
  20. package/lib/esnext/rhythm.js.map +1 -0
  21. package/lib/esnext/shift_register.js +72 -0
  22. package/lib/esnext/shift_register.js.map +1 -0
  23. package/package.json +3 -3
  24. package/lib/es5/helpers.js +0 -61
  25. package/lib/es5/helpers.js.map +0 -1
  26. package/lib/es5/index.js +0 -28
  27. package/lib/es5/index.js.map +0 -1
  28. package/lib/es5/key.js +0 -181
  29. package/lib/es5/key.js.map +0 -1
  30. package/lib/es5/lindenmayer_system.js +0 -94
  31. package/lib/es5/lindenmayer_system.js.map +0 -1
  32. package/lib/es5/markov_chain.js +0 -28
  33. package/lib/es5/markov_chain.js.map +0 -1
  34. package/lib/es5/melodic_vector.js +0 -71
  35. package/lib/es5/melodic_vector.js.map +0 -1
  36. package/lib/es5/melody.js +0 -185
  37. package/lib/es5/melody.js.map +0 -1
  38. package/lib/es5/mode.js +0 -104
  39. package/lib/es5/mode.js.map +0 -1
  40. package/lib/es5/mutation.js +0 -96
  41. package/lib/es5/mutation.js.map +0 -1
  42. package/lib/es5/note_data.js +0 -717
  43. package/lib/es5/note_data.js.map +0 -1
  44. package/lib/es5/rhythm.js +0 -68
  45. package/lib/es5/rhythm.js.map +0 -1
  46. package/lib/es5/shift_register.js +0 -89
  47. package/lib/es5/shift_register.js.map +0 -1
  48. package/lib/es5/tblswvs_error.js +0 -12
  49. package/lib/es5/tblswvs_error.js.map +0 -1
  50. package/lib/es5/transformation.js +0 -3
  51. package/lib/es6/helpers.js.map +0 -1
  52. package/lib/es6/key.js +0 -177
  53. package/lib/es6/key.js.map +0 -1
  54. package/lib/es6/lindenmayer_system.js.map +0 -1
  55. package/lib/es6/markov_chain.js.map +0 -1
  56. package/lib/es6/melodic_vector.js.map +0 -1
  57. package/lib/es6/melody.js.map +0 -1
  58. package/lib/es6/mode.js +0 -100
  59. package/lib/es6/mode.js.map +0 -1
  60. package/lib/es6/mutation.js.map +0 -1
  61. package/lib/es6/rhythm.js.map +0 -1
  62. package/lib/es6/shift_register.js +0 -85
  63. package/lib/es6/shift_register.js.map +0 -1
  64. package/lib/es6/transformation.js.map +0 -1
  65. /package/lib/{es5 → esnext}/index.d.ts +0 -0
  66. /package/lib/{es6 → esnext}/index.js +0 -0
  67. /package/lib/{es6 → esnext}/index.js.map +0 -0
  68. /package/lib/{es5 → esnext}/key.d.ts +0 -0
  69. /package/lib/{es5 → esnext}/lindenmayer_system.d.ts +0 -0
  70. /package/lib/{es5 → esnext}/markov_chain.d.ts +0 -0
  71. /package/lib/{es5 → esnext}/melodic_vector.d.ts +0 -0
  72. /package/lib/{es5 → esnext}/mode.d.ts +0 -0
  73. /package/lib/{es5 → esnext}/mutation.d.ts +0 -0
  74. /package/lib/{es5 → esnext}/note_data.d.ts +0 -0
  75. /package/lib/{es6 → esnext}/note_data.js +0 -0
  76. /package/lib/{es6 → esnext}/note_data.js.map +0 -0
  77. /package/lib/{es5 → esnext}/rhythm.d.ts +0 -0
  78. /package/lib/{es5 → esnext}/shift_register.d.ts +0 -0
  79. /package/lib/{es5 → esnext}/tblswvs_error.d.ts +0 -0
  80. /package/lib/{es6 → esnext}/tblswvs_error.js +0 -0
  81. /package/lib/{es6 → esnext}/tblswvs_error.js.map +0 -0
  82. /package/lib/{es5 → esnext}/transformation.d.ts +0 -0
  83. /package/lib/{es6 → esnext}/transformation.js +0 -0
  84. /package/lib/{es5 → esnext}/transformation.js.map +0 -0
@@ -3,6 +3,7 @@ export declare const SELF_SIMILARITY_REQUIRES_COPRIMES: string;
3
3
  export declare const SCALE_DEGREE_ERROR = "Scale degrees must be negative or positive, but not 0";
4
4
  export declare const SCALE_DEGREE_SHIFTS_REQUIRE_KEY = "Melodic vectors with shift mode 'scale' can only operate on a Melody with a Key";
5
5
  export declare const KEY_REQUIRED_FOR_MUTATION = "Mutations require a Melody object with a key";
6
+ export declare const RANGE_ERROR = "Range must contain two numbers with min (index 0) smaller than max (index 1)";
6
7
  export declare const unique: (value: any, index: number, self: any) => boolean;
7
8
  export declare const areCoprime: (num1: number, num2: number) => boolean;
8
9
  export declare const rotate: (arr: any[], offset: number) => any[];
@@ -5,6 +5,7 @@ export const SELF_SIMILARITY_REQUIRES_COPRIMES = "A self-similar melody can only
5
5
  export const SCALE_DEGREE_ERROR = "Scale degrees must be negative or positive, but not 0";
6
6
  export const SCALE_DEGREE_SHIFTS_REQUIRE_KEY = "Melodic vectors with shift mode 'scale' can only operate on a Melody with a Key";
7
7
  export const KEY_REQUIRED_FOR_MUTATION = "Mutations require a Melody object with a key";
8
+ export const RANGE_ERROR = "Range must contain two numbers with min (index 0) smaller than max (index 1)";
8
9
  export const unique = (value, index, self) => {
9
10
  return self.indexOf(value) === index;
10
11
  };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,189 @@
1
+ import { Mode, Scale } from "./mode";
2
+ import * as noteData from "./note_data";
3
+ import * as helpers from "./helpers";
4
+ import { TblswvsError } from "./tblswvs_error";
5
+ export class Key {
6
+ scale;
7
+ scaleName;
8
+ name;
9
+ mode;
10
+ tonic;
11
+ midiTonic;
12
+ octave;
13
+ scaleNotes;
14
+ inversions;
15
+ inversionMin;
16
+ inversionMax;
17
+ constructor(tonic, scale) {
18
+ this.scale = scale;
19
+ this.mode = new Mode(scale);
20
+ if (typeof tonic == "string") {
21
+ this.tonic = tonic;
22
+ this.midiTonic = noteData.chromaticScale.indexOf(tonic);
23
+ this.octave = 1;
24
+ }
25
+ else {
26
+ this.tonic = noteData.chromaticScale[tonic % 12];
27
+ this.midiTonic = tonic % 12;
28
+ this.octave = noteData.noteData[tonic].octave;
29
+ }
30
+ this.scaleName = Scale[scale];
31
+ this.name = `${this.tonic} ${this.scaleName}`;
32
+ this.scaleNotes = this.#calculateScaleNotes();
33
+ this.inversions = this.#calculateInversions();
34
+ const inversionRange = Array.from(this.inversions.keys()).sort((a, b) => a - b);
35
+ this.inversionMin = inversionRange[0];
36
+ this.inversionMax = inversionRange[inversionRange.length - 1];
37
+ }
38
+ degree(d, octaveTranspose) {
39
+ if (d == 0)
40
+ throw new TblswvsError(helpers.SCALE_DEGREE_ERROR);
41
+ if (d < 0)
42
+ return this.#negativeDegree(d, octaveTranspose);
43
+ // The degree octave may start higher than the current key's octave (e.g., the 9th in a diatonic scale)
44
+ let degreeOctave = this.octave + Math.floor((d - 1) / this.scaleNotes.length);
45
+ const noteIndex = this.mode.scaleOffsets[(d - 1) % this.scaleNotes.length] + this.midiTonic + (degreeOctave * 12) + 24;
46
+ let degree = { ...noteData.noteData[noteIndex] };
47
+ // Reset the generic note to the scale notes to correctly identify when a scale degree should be a flat, rather than
48
+ // the default sharp for noteData.
49
+ degree.note = this.scaleNotes[(d - 1) % this.scaleNotes.length];
50
+ degree.scaleDegree = d;
51
+ if (octaveTranspose != undefined) {
52
+ degree.octave += octaveTranspose;
53
+ degree.midi += (octaveTranspose * 12);
54
+ }
55
+ return degree;
56
+ }
57
+ #negativeDegree(d, octaveTranspose) {
58
+ // For negative indices, start by getting the step offsets in reverse order...
59
+ let revCopy = this.mode.stepOffsets.slice().reverse();
60
+ // Then determine how many copies of the array are needed to index the current scale degree
61
+ // (e.g., -8 for C Major would be the second B, so copies should be 2)
62
+ let copies = Math.ceil(-d / revCopy.length);
63
+ // Create a version of the reversed step offsets that can reach the scale degree needed.
64
+ let expanded = new Array(copies).fill(revCopy).flat();
65
+ // Finally, subtract negative offsets from the current Key's root and correct the default sharps to flats as needed.
66
+ const noteIndex = this.octave * 12 + this.midiTonic + 24 - expanded.slice(0, -d).reduce((total, offset) => total += offset, 0);
67
+ let degree = { ...noteData.noteData[noteIndex] };
68
+ degree.note = this.scaleNotes.at(d % this.scaleNotes.length);
69
+ degree.scaleDegree = d;
70
+ if (octaveTranspose != undefined) {
71
+ degree.octave += octaveTranspose;
72
+ degree.midi += (octaveTranspose * 12);
73
+ }
74
+ return degree;
75
+ }
76
+ chord(degree, type, octaveTransposition) {
77
+ if (degree == 0)
78
+ throw new TblswvsError(helpers.SCALE_DEGREE_ERROR);
79
+ let midi;
80
+ switch (type) {
81
+ case "oct":
82
+ midi = [this.degree(degree).midi, this.degree(degree).midi + 12];
83
+ break;
84
+ case "pow":
85
+ midi = [this.degree(degree).midi, this.degree(degree).midi + 7];
86
+ break;
87
+ default:
88
+ let chordDegrees = noteData.chordTypes[type].intervals.map(interval => degree + interval);
89
+ // Accommodate negative scale degrees and no 0th degree.
90
+ let zeroCrossing = false;
91
+ chordDegrees = chordDegrees.map((chordDegree, i, arr) => {
92
+ if (i > 0 && Math.sign(chordDegree) !== Math.sign(arr[i - 1]))
93
+ zeroCrossing = true;
94
+ return chordDegree === 0 || zeroCrossing ? chordDegree + 1 : chordDegree;
95
+ });
96
+ midi = chordDegrees.map(scaleDegree => this.degree(scaleDegree).midi);
97
+ }
98
+ const chordInterval = noteData.chordIntervalMap[midi.sort().map((noteNumber, _, arr) => noteNumber % arr[0]).join(":")];
99
+ const quality = chordInterval ? chordInterval.quality : "-";
100
+ return {
101
+ midi: midi.map(noteNumber => noteNumber + (12 * (octaveTransposition ? octaveTransposition : 0))),
102
+ quality: quality,
103
+ root: this.degree(degree).note,
104
+ degree: this.#calculateChordDegree(quality, degree)
105
+ };
106
+ }
107
+ #calculateChordDegree(quality, degree) {
108
+ let absDegree = (degree < 0) ?
109
+ [...new Array(this.mode.stepOffsets.length)]
110
+ .map((_, i) => i + 1)
111
+ .reverse()[(Math.abs(degree) - 1) % this.mode.stepOffsets.length] :
112
+ degree;
113
+ // Note the conversion to/from 1 based indexing with scale degrees, to the 0 based indexing assumed by modulo
114
+ if (absDegree > this.mode.stepOffsets.length)
115
+ absDegree = (absDegree - 1) % this.mode.stepOffsets.length + 1;
116
+ if (quality.startsWith("M")) {
117
+ return quality.replace("M", noteData.chordNumeralsMap[absDegree]);
118
+ }
119
+ else if (quality.startsWith("m")) {
120
+ return quality.replace("m", noteData.chordNumeralsMap[absDegree].toLowerCase());
121
+ }
122
+ else if (quality.startsWith("aug")) {
123
+ return quality.replace("aug", noteData.chordNumeralsMap[absDegree]) + "+";
124
+ }
125
+ else if (quality.startsWith("dim")) {
126
+ return quality.replace("dim", noteData.chordNumeralsMap[absDegree]).toLowerCase() + "o";
127
+ }
128
+ else if (quality.startsWith("sus2")) {
129
+ return noteData.chordNumeralsMap[absDegree] + quality;
130
+ }
131
+ else if (quality.startsWith("sus4")) {
132
+ return quality.replace("sus2", noteData.chordNumeralsMap[absDegree]) + "sus4";
133
+ }
134
+ else if (quality.startsWith("WT")) {
135
+ return quality.replace("WT", noteData.chordNumeralsMap[absDegree]).toLowerCase() + "WT";
136
+ }
137
+ else {
138
+ return absDegree.toString();
139
+ }
140
+ }
141
+ midi2note(midiNoteNumber) {
142
+ const normalizedNumber = midiNoteNumber % 12 - this.midiTonic;
143
+ const normalizedIndex = this.mode.scaleOffsets.indexOf(normalizedNumber);
144
+ if (normalizedIndex != -1) {
145
+ return this.scaleNotes[normalizedIndex] + noteData.noteData[midiNoteNumber].octave;
146
+ }
147
+ else {
148
+ let note = noteData.noteData[midiNoteNumber].note;
149
+ const nearestNote = this.scaleNotes.find(n => n[0] == note[0]);
150
+ note += (nearestNote != undefined && nearestNote.length == 2) ? "♮" : "";
151
+ return note + noteData.noteData[midiNoteNumber].octave;
152
+ }
153
+ }
154
+ #calculateScaleNotes() {
155
+ const rotatedAbsolute = helpers.rotate(noteData.scaleNoteCandidates, -noteData.scaleNoteCandidates.findIndex(n => n.includes(this.tonic)));
156
+ let scaleAbcNotes = helpers.rotate(noteData.abcNotesMidiOrder, -noteData.abcNotesMidiOrder.indexOf(this.tonic[0]));
157
+ if (this.mode.scaleDegreeMapping.length != 0) {
158
+ scaleAbcNotes = this.mode.scaleDegreeMapping.map(d => scaleAbcNotes[Math.floor(d) - 1]);
159
+ }
160
+ return scaleAbcNotes.map((n, i) => {
161
+ const absoluteIndex = this.mode.scaleOffsets[i];
162
+ return rotatedAbsolute[absoluteIndex].find((sn) => sn[0] == n);
163
+ });
164
+ }
165
+ degreeInversion(scaleDegree) {
166
+ if (scaleDegree < this.inversionMin)
167
+ scaleDegree = this.inversionMin;
168
+ else if (scaleDegree > this.inversionMax)
169
+ scaleDegree = this.inversionMax;
170
+ const invertedScaleDegree = this.inversions.get(scaleDegree);
171
+ if (invertedScaleDegree == undefined)
172
+ return { octave: -3, note: "", midi: -1 };
173
+ else
174
+ return this.degree(invertedScaleDegree);
175
+ }
176
+ /**
177
+ * Will generate a scale degree inversion map for the current key. Will included an octave above and below.
178
+ *
179
+ * @returns Map of inversion numbers
180
+ */
181
+ #calculateInversions() {
182
+ const positiveDegrees = [...new Array(this.mode.stepOffsets.length * 2 + 1).keys()].map(d => d + 1);
183
+ const negativeDegrees = positiveDegrees.slice(0, this.mode.stepOffsets.length).reverse().map(d => d * -1);
184
+ this.inversionMin = negativeDegrees[0];
185
+ this.inversionMax = positiveDegrees[positiveDegrees.length - 1];
186
+ return helpers.inversionMap(negativeDegrees.concat(positiveDegrees));
187
+ }
188
+ }
189
+ //# sourceMappingURL=key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key.js","sourceRoot":"","sources":["../../../src/key.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,9 @@
8
8
  * to be translated into a 2-dimensional matrix.
9
9
  */
10
10
  export class LindenmayerSystem {
11
+ axiom;
12
+ string;
13
+ productionRules;
11
14
  /**
12
15
  * Create a new LindenmayerSystem object.
13
16
  *
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lindenmayer_system.js","sourceRoot":"","sources":["../../../src/lindenmayer_system.ts"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,MAAM,OAAO,iBAAiB;IAC1B,KAAK,CAAS;IACd,MAAM,CAAS;IACf,eAAe,CAA2B;IAG1C;;;;OAIG;IACH,YAAY,KAAa;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;IAC9B,CAAC;IAGD;;;;OAIG;IACH,GAAG,CAAC,IAAoB;QACpB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtD,CAAC;IAGD;;;;;OAKG;IACH,KAAK;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC7C,CAAC;IAGD;;;;;;;;;OASG;IACH,OAAO;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YAC9C,OAAO,MAAM,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAClF,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IAGD;;;;;;;;;OASG;IACH,MAAM;QACF,IAAI,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;QACzB,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,EAAE,iBAAiB,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEzE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACzC,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;gBAEhB,4FAA4F;gBAC5F,uEAAuE;gBACvE,iBAAiB,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACzC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;gBACzB,QAAQ,IAAI,CAAC,CAAC;YAElB,CAAC;iBAAM,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;gBAEvB,4EAA4E;gBAC5E,QAAQ,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;gBAChC,QAAQ,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;YAEpC,CAAC;iBAAM,CAAC;gBAEJ,8CAA8C;gBAC9C,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;gBACpC,QAAQ,IAAI,CAAC,CAAC;YAClB,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ"}
@@ -1,4 +1,6 @@
1
1
  export class MarkovChain {
2
+ input;
3
+ stateTransitionMatrix;
2
4
  constructor(input) {
3
5
  this.input = input;
4
6
  this.stateTransitionMatrix = this.generateStm();
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markov_chain.js","sourceRoot":"","sources":["../../../src/markov_chain.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,WAAW;IACpB,KAAK,CAAQ;IACb,qBAAqB,CAAmC;IAGxD,YAAY,KAAY;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACpD,CAAC;IAGD,GAAG,CAAC,QAAgB,EAAE,OAAe;QACjC,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,QAAQ,IAAI,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC;QAClF,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,CAAC;IAGO,WAAW;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE;YAC3C,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC9C,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC5B,MAAM,GAAG,GAAQ,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC;gBACvC,MAAM,MAAM,GAAK,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC;gBAC7C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACzB,CAAC;YACD,OAAO,GAAG,CAAC;QACf,CAAC,EAAE,IAAI,GAAgC,CAAC,CAAC;IAC7C,CAAC;CACJ"}
@@ -10,13 +10,14 @@ import { TblswvsError } from "./tblswvs_error";
10
10
  * it is expanded to the size of the Melody's steps.
11
11
  */
12
12
  export class MelodicVector {
13
+ steps;
14
+ shiftMode = "midi";
13
15
  /**
14
16
  * Create a new MelodicVector object.
15
17
  *
16
18
  * @param steps number[] the steps that represent the object's vector
17
19
  */
18
20
  constructor(steps, shiftMode) {
19
- this.shiftMode = "midi";
20
21
  this.steps = steps;
21
22
  if (shiftMode != undefined)
22
23
  this.shiftMode = shiftMode;
@@ -40,13 +41,12 @@ export class MelodicVector {
40
41
  // Then apply the vector addition.
41
42
  const transformedMelody = melody.clone();
42
43
  expandedSteps.forEach((step, i) => {
43
- var _a, _b, _c;
44
44
  if (melody.notes[i].note == "rest") {
45
45
  // Do Nothing
46
46
  }
47
47
  else if (this.shiftMode == "midi") {
48
48
  transformedMelody.notes[i].midi += step;
49
- const scaleNoteIndex = (_a = transformedMelody.key) === null || _a === void 0 ? void 0 : _a.scaleNotes.indexOf((_b = transformedMelody.key) === null || _b === void 0 ? void 0 : _b.midi2note(transformedMelody.notes[i].midi).replace(/\d+/, ""));
49
+ const scaleNoteIndex = transformedMelody.key?.scaleNotes.indexOf(transformedMelody.key?.midi2note(transformedMelody.notes[i].midi).replace(/\d+/, ""));
50
50
  if (scaleNoteIndex == undefined || scaleNoteIndex == -1)
51
51
  transformedMelody.notes[i].scaleDegree = undefined;
52
52
  else
@@ -55,7 +55,7 @@ export class MelodicVector {
55
55
  else {
56
56
  let transposedDegree = transformedMelody.notes[i].scaleDegree + step;
57
57
  transposedDegree = transposedDegree < 1 ? transposedDegree - 1 : transposedDegree;
58
- const newNote = (_c = transformedMelody.key) === null || _c === void 0 ? void 0 : _c.degree(transposedDegree);
58
+ const newNote = transformedMelody.key?.degree(transposedDegree);
59
59
  if (newNote != undefined)
60
60
  transformedMelody.notes[i] = newNote;
61
61
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"melodic_vector.js","sourceRoot":"","sources":["../../../src/melodic_vector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C;;;;;;;;GAQG;AACH,MAAM,OAAO,aAAa;IACtB,KAAK,CAAW;IAChB,SAAS,GAAqB,MAAM,CAAC;IAGrC;;;;OAIG;IACH,YAAY,KAAe,EAAE,SAA4B;QACrD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,SAAS,IAAI,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC3D,CAAC;IAGD;;;;;;OAMG;IACH,OAAO,CAAC,MAAc;QAClB,IAAI,MAAM,CAAC,GAAG,IAAI,SAAS,IAAI,IAAI,CAAC,SAAS,IAAI,OAAO,EAAE,CAAC;YACvD,MAAM,IAAI,YAAY,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACJ,wEAAwE;YACxE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAClE,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAE5F,0EAA0E;YAC1E,kCAAkC;YAClC,MAAM,iBAAiB,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;YACzC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;gBAE9B,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC;oBACjC,aAAa;gBACjB,CAAC;qBAAM,IAAI,IAAI,CAAC,SAAS,IAAI,MAAM,EAAE,CAAC;oBAClC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC;oBAExC,MAAM,cAAc,GAAG,iBAAiB,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;oBACvJ,IAAI,cAAc,IAAI,SAAS,IAAI,cAAc,IAAI,CAAC,CAAC;wBACnD,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,SAAS,CAAC;;wBAEnD,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,cAAc,GAAG,CAAC,CAAC;gBAEpE,CAAC;qBAAM,CAAC;oBACJ,IAAI,gBAAgB,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC;oBACrE,gBAAgB,GAAO,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;oBACtF,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;oBAChE,IAAI,OAAO,IAAI,SAAS;wBAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;gBACnE,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,OAAO,iBAAiB,CAAC;QAC7B,CAAC;IACL,CAAC;CACJ"}
@@ -68,10 +68,15 @@ export declare class Melody {
68
68
  *
69
69
  * @param seed the sequence's first two steps, defaults to 0, 1
70
70
  * @param size the length of the resulting Meldoy's steps, defaults to 16
71
- * @param offset offset in the returned sequence from which the sequence starts
72
- * @returns a Melody with the infinity series as its steps
71
+ * @param offset offset offset in the returned sequence from which the sequence starts
72
+ * @param center center number for the sequence starts (e.g., 60), or min and max boundaries of a number range (e.g., [36, 51])
73
+ * @returns a number array with the infinity series integers
73
74
  */
74
- static infinitySeries(seed?: number[], size?: number, offset?: number): number[];
75
+ static infinitySeries(seed?: number[], size?: number, offset?: number, center?: number | number[], boundaryMode?: string): number[];
76
+ static centerAndClamp(sequence: number[], rangeMin: number, rangeMax: number): number[];
77
+ static centerAndWrap(sequence: number[], rangeMin: number, rangeMax: number): number[];
78
+ static centerAndFold(sequence: number[], rangeMin: number, rangeMax: number): number[];
79
+ static generateCenteredSequence(sequence: number[], rangeMin: number, rangeMax: number): number[];
75
80
  /**
76
81
  * Returns the value for any index of the base infinity series sequence (0, 1 seed). This function enables
77
82
  * an efficient way to compute any arbitrary section of the infinity series without needing to compute
@@ -6,6 +6,8 @@ import { Rhythm } from "./rhythm";
6
6
  * a sequence of notes and rests.
7
7
  */
8
8
  export class Melody {
9
+ notes;
10
+ key;
9
11
  constructor(notes, key) {
10
12
  this.notes = notes;
11
13
  if (key != undefined) {
@@ -51,35 +53,18 @@ export class Melody {
51
53
  ratio = ratio === undefined ? 2 : ratio;
52
54
  if (!helpers.areCoprime(length, ratio))
53
55
  throw new TblswvsError(helpers.SELF_SIMILARITY_REQUIRES_COPRIMES);
54
- let sequence = new Array(length).fill(-1);
55
- sequence[0] = this.notes[0];
56
- sequence[1] = this.notes[1 % this.notes.length];
57
- let contiguousSequence, currentNote, stepAmount, nextNote;
58
- let nextEmpty = sequence.findIndex(note => note == -1), count = 2;
59
- // Build a self replicating melody by powers of 2 until all notes are filled.
60
- do {
61
- contiguousSequence = sequence.slice(0, nextEmpty);
62
- for (let noteIndex = 0; noteIndex < contiguousSequence.length; noteIndex++) {
63
- // For each note in the contiguous sequence...
64
- currentNote = contiguousSequence[noteIndex];
65
- // Determine the self replicating step amounts by computing the powers of 2 for
66
- // non-redundant step amounts based on the target length
67
- for (let power = 1; power <= Math.log2(length); power++) {
68
- stepAmount = Math.pow(ratio, power);
69
- // Fill in the melody's future step indices with the current replicating note.
70
- sequence[(noteIndex * stepAmount) % length] = currentNote;
71
- }
56
+ const sequence = new Array(length * ratio)
57
+ .fill(this.notes.map((_, i) => i))
58
+ .flat()
59
+ .slice(0, length);
60
+ for (let i = 0, j = 0; i < sequence.length; i++) {
61
+ if (i % ratio === 0) {
62
+ sequence[i] = sequence[j];
63
+ j++;
72
64
  }
73
- // If the sequence still has empty spots, find the first one and fill it with the next
74
- // note in the input note list.
75
- nextNote = this.notes[count % this.notes.length];
76
- nextEmpty = sequence.findIndex(note => note == -1);
77
- if (nextEmpty != -1)
78
- sequence[nextEmpty] = nextNote;
79
- count++;
80
- } while (nextEmpty != -1);
65
+ }
81
66
  let melody = this.clone();
82
- melody.notes = sequence;
67
+ melody.notes = sequence.map(index => this.notes[index]);
83
68
  return melody;
84
69
  }
85
70
  /**
@@ -139,16 +124,60 @@ export class Melody {
139
124
  *
140
125
  * @param seed the sequence's first two steps, defaults to 0, 1
141
126
  * @param size the length of the resulting Meldoy's steps, defaults to 16
142
- * @param offset offset in the returned sequence from which the sequence starts
143
- * @returns a Melody with the infinity series as its steps
127
+ * @param offset offset offset in the returned sequence from which the sequence starts
128
+ * @param center center number for the sequence starts (e.g., 60), or min and max boundaries of a number range (e.g., [36, 51])
129
+ * @returns a number array with the infinity series integers
144
130
  */
145
- static infinitySeries(seed = [0, 1], size = 16, offset = 0) {
146
- const root = seed[0];
131
+ static infinitySeries(seed = [0, 1], size = 16, offset = 0, center = 0, boundaryMode = "clamp") {
132
+ if (typeof center === "object" && (center.length < 2 || center[1] <= center[0]))
133
+ throw new TblswvsError(helpers.RANGE_ERROR);
134
+ const root = (typeof center === "number") ? center : seed[0];
147
135
  const step1 = seed[1];
148
- const seedInterval = step1 - root;
149
- return Array.from(new Array(size), (n, i) => i + offset).map(step => {
136
+ const seedInterval = step1 - seed[0];
137
+ const sequence = Array.from(new Array(size), (_, i) => i + (typeof offset === "number" ? offset : 0)).map(step => {
150
138
  return root + (Melody.norgardInteger(step) * seedInterval);
151
139
  });
140
+ if (typeof center === "number")
141
+ return sequence;
142
+ else if (boundaryMode === "wrap")
143
+ return Melody.centerAndWrap(sequence, center[0], center[1]);
144
+ else if (boundaryMode === "fold")
145
+ return Melody.centerAndFold(sequence, center[0], center[1]);
146
+ else
147
+ return Melody.centerAndClamp(sequence, center[0], center[1]);
148
+ }
149
+ static centerAndClamp(sequence, rangeMin, rangeMax) {
150
+ const centeredSequence = Melody.generateCenteredSequence(sequence, rangeMin, rangeMax);
151
+ return centeredSequence.map(index => {
152
+ if (index > rangeMax - rangeMin)
153
+ return rangeMax;
154
+ else if (index < 0)
155
+ return rangeMin;
156
+ return index + rangeMin;
157
+ });
158
+ }
159
+ static centerAndWrap(sequence, rangeMin, rangeMax) {
160
+ const centeredSequence = Melody.generateCenteredSequence(sequence, rangeMin, rangeMax);
161
+ return centeredSequence.map(offset => {
162
+ const index = offset % (rangeMax - rangeMin + 1);
163
+ return (index < 0 ? rangeMax - rangeMin + index + 1 : index) + rangeMin;
164
+ });
165
+ }
166
+ static centerAndFold(sequence, rangeMin, rangeMax) {
167
+ const centeredSequence = Melody.generateCenteredSequence(sequence, rangeMin, rangeMax);
168
+ const rangeIndexMax = rangeMax - rangeMin;
169
+ return centeredSequence.map(index => {
170
+ const direction = Math.floor(index / rangeIndexMax) % 2 === 0 ? 1 : -1;
171
+ const boundaryOffset = index % rangeIndexMax;
172
+ return (direction === 1 ? boundaryOffset : rangeIndexMax - Math.abs(boundaryOffset)) + rangeMin;
173
+ });
174
+ }
175
+ static generateCenteredSequence(sequence, rangeMin, rangeMax) {
176
+ const rangeIndices = [...new Array(rangeMax - rangeMin + 1).keys()];
177
+ const centerIndex = (rangeIndices.length % 2 === 0) ?
178
+ (rangeIndices.length / 2) :
179
+ ((rangeIndices.length + 1) / 2) - 1;
180
+ return sequence.map(n => n + centerIndex);
152
181
  }
153
182
  /**
154
183
  * Returns the value for any index of the base infinity series sequence (0, 1 seed). This function enables
@@ -0,0 +1 @@
1
+ {"version":3,"file":"melody.js","sourceRoot":"","sources":["../../../src/melody.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ import * as helpers from "./helpers";
2
+ export var Scale;
3
+ (function (Scale) {
4
+ Scale[Scale["Ionian"] = 0] = "Ionian";
5
+ Scale[Scale["Dorian"] = 1] = "Dorian";
6
+ Scale[Scale["Phrygian"] = 2] = "Phrygian";
7
+ Scale[Scale["Lydian"] = 3] = "Lydian";
8
+ Scale[Scale["Mixolydian"] = 4] = "Mixolydian";
9
+ Scale[Scale["Aeolian"] = 5] = "Aeolian";
10
+ Scale[Scale["Locrian"] = 6] = "Locrian";
11
+ Scale[Scale["Major"] = 7] = "Major";
12
+ Scale[Scale["Minor"] = 8] = "Minor";
13
+ Scale[Scale["MajPentatonic"] = 9] = "MajPentatonic";
14
+ Scale[Scale["MinPentatonic"] = 10] = "MinPentatonic";
15
+ Scale[Scale["WholeTone"] = 11] = "WholeTone";
16
+ Scale[Scale["Diminished"] = 12] = "Diminished";
17
+ Scale[Scale["Chromatic"] = 13] = "Chromatic";
18
+ Scale[Scale["GS"] = 14] = "GS";
19
+ })(Scale || (Scale = {}));
20
+ export class Mode {
21
+ scale;
22
+ name;
23
+ stepOffsets;
24
+ scaleOffsets;
25
+ chordQualities;
26
+ scaleDegreeMapping;
27
+ static MAJOR_STEP_OFFSETS = [2, 2, 1, 2, 2, 2, 1];
28
+ static WHOLE_TONE_OFFSETS = [2, 2, 2, 2, 2, 2];
29
+ static DIMINISHED_OFFSETS = [2, 1, 2, 1, 2, 1, 2, 1];
30
+ static CHROMATIC_OFFSETS = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
31
+ static GS_OFFSETS = [1, 2, 1, 1, 3, 1, 3];
32
+ static CHORD_INTERVAL_MAP = {
33
+ "4:3": "M",
34
+ "3:4": "m",
35
+ "3:3": "dim",
36
+ "4:4": "aug",
37
+ "4:5": "m/3",
38
+ "2:4": "sus25b",
39
+ "5:5": "sus2/2",
40
+ "5:4": "M/5",
41
+ "2:2": "WT",
42
+ "3:2": "m5bb"
43
+ };
44
+ constructor(scale) {
45
+ this.scale = scale;
46
+ this.name = Scale[scale];
47
+ [this.stepOffsets, this.scaleDegreeMapping] = this.#offsetsScaleDegreeMapping(scale);
48
+ this.scaleOffsets = Mode.cummulativeOffsets(this.stepOffsets);
49
+ this.chordQualities = Mode.chordQualities(this.stepOffsets);
50
+ }
51
+ #offsetsScaleDegreeMapping(scale) {
52
+ let _scale, stepOffsets, scaleDegreeMapping = new Array();
53
+ _scale = (scale == Scale.Major || scale == Scale.MajPentatonic) ? Scale.Ionian : scale;
54
+ _scale = (scale == Scale.Minor || scale == Scale.MinPentatonic) ? Scale.Aeolian : scale;
55
+ stepOffsets = helpers.rotate(Mode.MAJOR_STEP_OFFSETS, -_scale);
56
+ if (scale == Scale.MajPentatonic) {
57
+ stepOffsets.splice(2, 2, 3);
58
+ stepOffsets.splice(-2, 2, 3);
59
+ scaleDegreeMapping = [1, 2, 3, 5, 6];
60
+ }
61
+ else if (scale == Scale.MinPentatonic) {
62
+ stepOffsets.splice(0, 2, 3);
63
+ stepOffsets.splice(-3, 2, 3);
64
+ scaleDegreeMapping = [1, 3, 4, 5, 7];
65
+ }
66
+ else if (scale == Scale.WholeTone) {
67
+ stepOffsets = Mode.WHOLE_TONE_OFFSETS;
68
+ scaleDegreeMapping = [1, 2, 3, 4, 5, 6];
69
+ }
70
+ else if (scale == Scale.Diminished) {
71
+ stepOffsets = Mode.DIMINISHED_OFFSETS;
72
+ scaleDegreeMapping = [1, 2, 3, 4, 5, 5.5, 6, 7];
73
+ }
74
+ else if (scale == Scale.Chromatic) {
75
+ stepOffsets = Mode.CHROMATIC_OFFSETS;
76
+ scaleDegreeMapping = [1, 1.5, 2, 2.5, 3, 4, 4.5, 5, 5.5, 6, 6.5, 7];
77
+ }
78
+ else if (scale == Scale.GS) {
79
+ stepOffsets = Mode.GS_OFFSETS;
80
+ }
81
+ return [stepOffsets, scaleDegreeMapping];
82
+ }
83
+ static cummulativeOffsets(stepOffsets) {
84
+ return stepOffsets.reduce((cummulativeOffsets, _, i, arr) => {
85
+ cummulativeOffsets.push(arr.slice(0, i).reduce((sum, intv) => sum += intv, 0));
86
+ return cummulativeOffsets;
87
+ }, []);
88
+ }
89
+ static chordQualities(stepOffsets) {
90
+ return stepOffsets.reduce((chordSteps, _, i, arr) => {
91
+ const current = helpers.rotate(arr, -i);
92
+ const firstInterval = current.slice(0, 2).reduce((a, b) => a + b, 0);
93
+ const secondInterval = current.slice(2, 4).reduce((a, b) => a + b, 0);
94
+ chordSteps.push(Mode.CHORD_INTERVAL_MAP[[firstInterval, secondInterval].join(":")]);
95
+ return chordSteps;
96
+ }, []);
97
+ }
98
+ }
99
+ //# sourceMappingURL=mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode.js","sourceRoot":"","sources":["../../../src/mode.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,16 @@ import { TblswvsError } from "./tblswvs_error";
3
3
  import { MelodicVector } from "./melodic_vector";
4
4
  import { Melody } from "./melody";
5
5
  export class Mutation {
6
+ static functionMap = new Map([
7
+ ["transposeDown2", Mutation.transposeDown2],
8
+ ["reverse", Mutation.reverse],
9
+ ["rotateLeftThree", Mutation.rotateLeftThree],
10
+ ["sort", Mutation.sort],
11
+ ["reverseSort", Mutation.reverseSort],
12
+ ["invert", Mutation.invert],
13
+ ["invertReverse", Mutation.invertReverse],
14
+ ["bitFlip", Mutation.bitFlip]
15
+ ]);
6
16
  static random(inputMelody, algorithms) {
7
17
  if (algorithms == undefined)
8
18
  algorithms = Object.getOwnPropertyNames(Mutation).filter(func => !["length", "name", "prototype"].includes(func));
@@ -37,7 +47,7 @@ export class Mutation {
37
47
  // This should not be necessary because of the check for the input melody's key.
38
48
  // All melodies with a key have notes with scale degrees assigned.
39
49
  let scaleDegree = note.scaleDegree ? note.scaleDegree : 1;
40
- return Object.assign({}, key.degreeInversion(scaleDegree));
50
+ return { ...key.degreeInversion(scaleDegree) };
41
51
  }), key);
42
52
  }
43
53
  }
@@ -68,7 +78,7 @@ export class Mutation {
68
78
  // Return the new number based on the mutated gene. Note that a tblswvs scale degree may not equal 0.
69
79
  let newScaleDegree = parseInt(binaryDigits.join(""), 2) * sign;
70
80
  newScaleDegree = newScaleDegree == 0 ? -1 : newScaleDegree;
71
- let mutatedNoteData = Object.assign({}, key.degree(newScaleDegree));
81
+ let mutatedNoteData = { ...key.degree(newScaleDegree) };
72
82
  mutatedNoteData.midi += ((note.octave - key.octave) * 12);
73
83
  return mutatedNoteData;
74
84
  }
@@ -79,14 +89,4 @@ export class Mutation {
79
89
  }
80
90
  }
81
91
  }
82
- Mutation.functionMap = new Map([
83
- ["transposeDown2", Mutation.transposeDown2],
84
- ["reverse", Mutation.reverse],
85
- ["rotateLeftThree", Mutation.rotateLeftThree],
86
- ["sort", Mutation.sort],
87
- ["reverseSort", Mutation.reverseSort],
88
- ["invert", Mutation.invert],
89
- ["invertReverse", Mutation.invertReverse],
90
- ["bitFlip", Mutation.bitFlip]
91
- ]);
92
92
  //# sourceMappingURL=mutation.js.map