@leafo/lml 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/song.js CHANGED
@@ -1,8 +1,18 @@
1
- import { parseNote, noteName, MIDDLE_C_PITCH } from "./music.js";
2
- // note: C4, D#5, etc...
3
- // start: when note begins in beats
4
- // duration: how long note is in beats
1
+ import { parseNote, noteName, MIDDLE_C_PITCH, transposeKeySignature } from "./music.js";
2
+ /**
3
+ * Represents a single musical note with pitch, timing, and duration.
4
+ * @example
5
+ * const note = new SongNote("C4", 0, 1) // Middle C at beat 0, duration 1 beat
6
+ * const note2 = new SongNote("D#5", 4, 0.5) // D#5 at beat 4, half beat duration
7
+ */
5
8
  export class SongNote {
9
+ /**
10
+ * Creates a new SongNote.
11
+ * @param note - Note name with octave (e.g., "C4", "D#5")
12
+ * @param start - Start position in beats
13
+ * @param duration - Duration in beats
14
+ * @param sourceLocation - Optional source location in LML text [startOffset, endOffset]
15
+ */
6
16
  constructor(note, start, duration, sourceLocation) {
7
17
  this.id = Symbol();
8
18
  this.note = note;
@@ -10,10 +20,20 @@ export class SongNote {
10
20
  this.duration = duration;
11
21
  this.sourceLocation = sourceLocation;
12
22
  }
23
+ /**
24
+ * Creates a copy of this note.
25
+ * @returns A new SongNote with the same properties
26
+ */
13
27
  clone() {
14
28
  const cloned = new SongNote(this.note, this.start, this.duration, this.sourceLocation);
15
29
  return cloned;
16
30
  }
31
+ /**
32
+ * Checks if this note overlaps with a time range.
33
+ * @param min - Start of the range in beats
34
+ * @param max - End of the range in beats
35
+ * @returns True if the note overlaps with the range
36
+ */
17
37
  inRange(min, max) {
18
38
  const stop = this.start + this.duration;
19
39
  if (min >= stop) {
@@ -24,28 +44,61 @@ export class SongNote {
24
44
  }
25
45
  return true;
26
46
  }
47
+ /**
48
+ * Creates a new note transposed by a number of semitones.
49
+ * @param semitones - Number of semitones to transpose (positive = up, negative = down)
50
+ * @returns A new SongNote with the transposed pitch
51
+ * @example
52
+ * const c4 = new SongNote("C4", 0, 1)
53
+ * const d4 = c4.transpose(2) // D4
54
+ * const b3 = c4.transpose(-1) // B3
55
+ */
27
56
  transpose(semitones) {
28
57
  return new SongNote(noteName(parseNote(this.note) + semitones), this.start, this.duration, this.sourceLocation);
29
58
  }
59
+ /** Returns the start position in beats. */
30
60
  getStart() {
31
61
  return this.start;
32
62
  }
63
+ /** Returns the end position in beats (start + duration). */
33
64
  getStop() {
34
65
  return this.start + this.duration;
35
66
  }
67
+ /** Returns the end position for rendering purposes. */
36
68
  getRenderStop() {
37
69
  return this.start + this.duration;
38
70
  }
71
+ /** Returns a string representation of the note. */
39
72
  toString() {
40
73
  return `${this.note},${this.start},${this.duration}`;
41
74
  }
42
75
  }
43
- // like note list but notes in time
76
+ /**
77
+ * A list of notes representing a song or track, with associated metadata.
78
+ * Extends Array<SongNote> to allow direct indexing and array methods.
79
+ * @example
80
+ * const song = SongNoteList.newSong([
81
+ * ["C4", 0, 1],
82
+ * ["E4", 1, 1],
83
+ * ["G4", 2, 1],
84
+ * ])
85
+ * song.transpose(2) // Transpose up a whole step
86
+ */
44
87
  export class SongNoteList extends Array {
45
88
  constructor() {
46
89
  super();
47
90
  Object.setPrototypeOf(this, SongNoteList.prototype);
48
91
  }
92
+ /**
93
+ * Creates a new SongNoteList from an array of note tuples.
94
+ * @param noteTuples - Array of [note, start, duration] tuples
95
+ * @returns A new SongNoteList containing the notes
96
+ * @example
97
+ * const song = SongNoteList.newSong([
98
+ * ["C4", 0, 1],
99
+ * ["D4", 1, 1],
100
+ * ])
101
+ */
49
102
  static newSong(noteTuples) {
50
103
  const notes = noteTuples.map(([note, start, duration]) => new SongNote(note, start, duration));
51
104
  const song = new SongNoteList();
@@ -54,27 +107,84 @@ export class SongNoteList extends Array {
54
107
  }
55
108
  return song;
56
109
  }
110
+ /**
111
+ * Creates a deep copy of this song (notes are cloned).
112
+ * @returns A new SongNoteList with cloned notes
113
+ */
57
114
  clone() {
58
115
  const song = new SongNoteList();
59
116
  this.forEach(note => song.push(note.clone()));
60
117
  return song;
61
118
  }
119
+ /**
120
+ * Clears the spatial index cache. Call this after modifying notes.
121
+ */
62
122
  clearCache() {
63
123
  delete this.buckets;
64
124
  }
125
+ /**
126
+ * Creates a new song with all notes and key signatures transposed.
127
+ * Uses circle of fifths for key signature transposition.
128
+ * Returns `this` if amount is 0.
129
+ * @param amount - Number of semitones to transpose (positive = up, negative = down)
130
+ * @returns A new SongNoteList with transposed notes, or `this` if amount is 0
131
+ * @example
132
+ * const song = parser.compile(parser.parse("ks0 c d e"))
133
+ * const transposed = song.transpose(1) // Transposes to Db major
134
+ * // transposed.metadata.keySignature === -5
135
+ */
65
136
  transpose(amount = 0) {
66
137
  if (amount == 0) {
67
138
  return this;
68
139
  }
69
- const song = new SongNoteList();
70
- this.forEach(note => song.push(note.transpose(amount)));
140
+ const song = new this.constructor();
141
+ this.transposeNotesInto(song, amount);
142
+ // Copy metadata, transposing key signature
143
+ if (this.metadata) {
144
+ song.metadata = {
145
+ ...this.metadata,
146
+ keySignature: this.metadata.keySignature !== undefined
147
+ ? transposeKeySignature(this.metadata.keySignature, amount)
148
+ : undefined
149
+ };
150
+ }
151
+ // Transpose key signatures array
152
+ if (this.keySignatures) {
153
+ song.keySignatures = this.keySignatures.map(([beat, count, loc]) => [beat, transposeKeySignature(count, amount), loc]);
154
+ }
155
+ // Reuse references to unchanged properties
156
+ song.timeSignatures = this.timeSignatures;
157
+ song.clefs = this.clefs;
158
+ song.strings = this.strings;
159
+ song.autoChords = this.autoChords;
160
+ song.trackName = this.trackName;
71
161
  return song;
72
162
  }
73
- // find the notes that fall in the time range
163
+ /**
164
+ * Transposes notes from this song into the target song.
165
+ * Override in subclasses for custom note handling (e.g., multi-track).
166
+ * @param target - The song to add transposed notes to
167
+ * @param amount - Number of semitones to transpose
168
+ */
169
+ transposeNotesInto(target, amount) {
170
+ this.forEach(note => target.push(note.transpose(amount)));
171
+ }
172
+ /**
173
+ * Finds all notes that overlap with a time range.
174
+ * @param start - Start of the range in beats
175
+ * @param stop - End of the range in beats
176
+ * @returns Array of notes that overlap with the range
177
+ */
74
178
  notesInRange(start, stop) {
75
179
  return [...this.filter((n) => n.inRange(start, stop))];
76
180
  }
77
- // find note indices that overlap with the given source position range
181
+ /**
182
+ * Finds indices of notes whose source location overlaps with a text selection.
183
+ * Used for editor features like transposition of selected notes.
184
+ * @param start - Start offset in source text
185
+ * @param end - End offset in source text
186
+ * @returns Set of note indices that overlap with the selection
187
+ */
78
188
  findNotesForSelection(start, end) {
79
189
  const result = new Set();
80
190
  this.forEach((note, index) => {
@@ -87,18 +197,42 @@ export class SongNoteList extends Array {
87
197
  });
88
198
  return result;
89
199
  }
200
+ /**
201
+ * Finds key signatures whose source location overlaps with a text selection.
202
+ * Used for editor features like transposition of selected key signatures.
203
+ * @param start - Start offset in source text
204
+ * @param end - End offset in source text
205
+ * @returns Array of key signature entries that overlap with the selection
206
+ */
207
+ findKeySignaturesForSelection(start, end) {
208
+ if (!this.keySignatures)
209
+ return [];
210
+ return this.keySignatures.filter(([, , [ksStart, ksEnd]]) => start <= ksEnd && end >= ksStart);
211
+ }
212
+ /**
213
+ * Returns the end position of the last note in beats.
214
+ * @returns End position in beats, or 0 if empty
215
+ */
90
216
  getStopInBeats() {
91
217
  if (this.length == 0) {
92
218
  return 0;
93
219
  }
94
220
  return Math.max.apply(null, this.map((n) => n.getStop()));
95
221
  }
222
+ /**
223
+ * Returns the start position of the first note in beats.
224
+ * @returns Start position in beats, or 0 if empty
225
+ */
96
226
  getStartInBeats() {
97
227
  if (this.length == 0) {
98
228
  return 0;
99
229
  }
100
230
  return Math.min.apply(null, this.map((n) => n.getStart()));
101
231
  }
232
+ /**
233
+ * Calculates measure boundaries based on time signatures.
234
+ * @returns Array of measure objects with start position and beat count
235
+ */
102
236
  getMeasures() {
103
237
  const measures = [];
104
238
  const songEnd = this.getStopInBeats();
@@ -120,6 +254,10 @@ export class SongNoteList extends Array {
120
254
  }
121
255
  return measures;
122
256
  }
257
+ /**
258
+ * Returns the pitch range of all notes in the song.
259
+ * @returns Tuple of [lowest, highest] note names, or undefined if empty
260
+ */
123
261
  noteRange() {
124
262
  if (!this.length) {
125
263
  return undefined;
@@ -137,6 +275,10 @@ export class SongNoteList extends Array {
137
275
  }
138
276
  return [noteName(min), noteName(max)];
139
277
  }
278
+ /**
279
+ * Determines the best staff type for displaying this song.
280
+ * @returns "treble", "bass", or "grand" based on note range and clef settings
281
+ */
140
282
  fittingStaff() {
141
283
  if (this.clefs && this.clefs.length == 1) {
142
284
  const firstNote = this[0];
@@ -174,12 +316,14 @@ export class SongNoteList extends Array {
174
316
  return "treble";
175
317
  }
176
318
  }
319
+ /** Calculates the bucket range for a time span. */
177
320
  getBucketRange(start, stop) {
178
321
  const bucketSize = SongNoteList.bucketSize;
179
322
  const left = Math.floor(start / bucketSize);
180
323
  const right = Math.ceil(stop / bucketSize);
181
324
  return [left, right];
182
325
  }
326
+ /** Builds the spatial index buckets for fast note lookup. */
183
327
  buildBuckets() {
184
328
  const buckets = {};
185
329
  this.forEach((songNote, idx) => {
@@ -192,16 +336,26 @@ export class SongNoteList extends Array {
192
336
  });
193
337
  return buckets;
194
338
  }
195
- // get the buckets to scan to match notes for beat
339
+ /** Gets the buckets to scan when matching notes near a beat. */
196
340
  adjacentBuckets(beat) {
197
341
  return this.getBucketRange(beat - 1, beat + 1);
198
342
  }
343
+ /** Gets or builds the spatial index buckets. */
199
344
  getBuckets() {
200
345
  if (!this.buckets) {
201
346
  this.buckets = this.buildBuckets();
202
347
  }
203
348
  return this.buckets;
204
349
  }
350
+ /**
351
+ * Finds the note closest to a beat position using spatial indexing.
352
+ * Faster than matchNote for large songs.
353
+ * @param findNote - Note name to search for (e.g., "C4")
354
+ * @param beat - Beat position to search near
355
+ * @param wrapRight - Optional right boundary for wrap-around search
356
+ * @param wrapLeft - Optional left boundary for wrap-around search
357
+ * @returns Index of the matching note, or null if not found
358
+ */
205
359
  matchNoteFast(findNote, beat, wrapRight, wrapLeft) {
206
360
  const buckets = this.getBuckets();
207
361
  const [left, right] = this.adjacentBuckets(beat);
@@ -249,7 +403,13 @@ export class SongNoteList extends Array {
249
403
  }
250
404
  return foundIdx;
251
405
  }
252
- // see if we're hitting a valid note
406
+ /**
407
+ * Finds the note closest to a beat position using linear search.
408
+ * Use matchNoteFast for better performance on large songs.
409
+ * @param findNote - Note name to search for (e.g., "C4")
410
+ * @param beat - Beat position to search near
411
+ * @returns Index of the matching note, or null if not found
412
+ */
253
413
  matchNote(findNote, beat) {
254
414
  let foundIdx = null;
255
415
  for (let idx = 0; idx < this.length; idx++) {
@@ -270,28 +430,68 @@ export class SongNoteList extends Array {
270
430
  return foundIdx;
271
431
  }
272
432
  }
273
- SongNoteList.bucketSize = 8; // bucket size in beats
433
+ /** Bucket size in beats for spatial indexing optimization */
434
+ SongNoteList.bucketSize = 8;
435
+ /**
436
+ * A song containing multiple tracks, where each track is a SongNoteList.
437
+ * Notes are stored both in the main list and in their respective tracks.
438
+ * @example
439
+ * const song = new MultiTrackSong()
440
+ * song.pushWithTrack(new SongNote("C4", 0, 1), 0) // Track 0
441
+ * song.pushWithTrack(new SongNote("E4", 0, 1), 1) // Track 1
442
+ */
274
443
  export class MultiTrackSong extends SongNoteList {
275
444
  constructor() {
276
445
  super();
446
+ /** Array of individual tracks */
277
447
  this.tracks = [];
278
448
  Object.setPrototypeOf(this, MultiTrackSong.prototype);
279
449
  }
450
+ /**
451
+ * Adds a note to both the main song and a specific track.
452
+ * @param note - The note to add
453
+ * @param trackIdx - The track index to add the note to
454
+ * @returns The added note
455
+ */
280
456
  pushWithTrack(note, trackIdx) {
281
457
  this.push(note);
282
458
  const track = this.getTrack(trackIdx);
283
459
  track.push(note);
284
460
  return note;
285
461
  }
286
- // find an empty track to put autochords in
462
+ /**
463
+ * Finds an unused track index for auto-generated content like chords.
464
+ * @returns The next available track index
465
+ */
287
466
  findEmptyTrackIdx() {
288
467
  return this.tracks.length + 1;
289
468
  }
469
+ /**
470
+ * Gets a track by index, creating it if it doesn't exist.
471
+ * @param idx - The track index
472
+ * @returns The SongNoteList for the track
473
+ */
290
474
  getTrack(idx) {
291
475
  if (!this.tracks[idx]) {
292
476
  this.tracks[idx] = new SongNoteList();
293
477
  }
294
478
  return this.tracks[idx];
295
479
  }
480
+ /**
481
+ * Transposes notes from this song into the target song, handling tracks.
482
+ * Notes are transposed per-track and added to both the track and main list.
483
+ * @param target - The MultiTrackSong to add transposed notes to
484
+ * @param amount - Number of semitones to transpose
485
+ */
486
+ transposeNotesInto(target, amount) {
487
+ const multiTarget = target;
488
+ this.tracks.forEach((track, idx) => {
489
+ if (track) {
490
+ const transposedTrack = track.transpose(amount);
491
+ multiTarget.tracks[idx] = transposedTrack;
492
+ transposedTrack.forEach(note => multiTarget.push(note));
493
+ }
494
+ });
495
+ }
296
496
  }
297
497
  //# sourceMappingURL=song.js.map
package/dist/song.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"song.js","sourceRoot":"","sources":["../src/song.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"song.js","sourceRoot":"","sources":["../src/song.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leafo/lml",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "LML (Leaf's Music Language) parser and music theory library",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -22,11 +22,14 @@
22
22
  "clean": "rm -rf dist src/grammar.js",
23
23
  "test": "node --import tsx --test 'test/**/*.test.ts'",
24
24
  "regenerate-expected": "node --import tsx scripts/regenerate-expected.ts",
25
- "editor": "npm run dev --prefix editor"
25
+ "editor": "npm run dev --prefix editor",
26
+ "docs": "typedoc",
27
+ "docs:watch": "typedoc --watch"
26
28
  },
27
29
  "devDependencies": {
28
30
  "peggy": "^5.0.6",
29
31
  "tsx": "^4.21.0",
32
+ "typedoc": "^0.27.6",
30
33
  "typescript": "^5.3.0"
31
34
  },
32
35
  "keywords": [