@coderline/alphatab 1.9.0-alpha.1852 → 1.9.0-alpha.1853

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/alphaTab.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * alphaTab v1.9.0-alpha.1852 (develop, build 1852)
2
+ * alphaTab v1.9.0-alpha.1853 (develop, build 1853)
3
3
  *
4
4
  * Copyright © 2026, Daniel Kuschny and Contributors, All rights reserved.
5
5
  *
@@ -190,9 +190,9 @@
190
190
  * @internal
191
191
  */
192
192
  var VersionInfo = class VersionInfo {
193
- static version = "1.9.0-alpha.1852";
194
- static date = "2026-07-03T04:02:23.351Z";
195
- static commit = "b053b63f5a438ad410d9b45fc8eca85cf5bc84ae";
193
+ static version = "1.9.0-alpha.1853";
194
+ static date = "2026-07-04T03:56:00.242Z";
195
+ static commit = "770d9e5f9fa71e92e08bdeb8b27a7144b1ef1418";
196
196
  static print(print) {
197
197
  print(`alphaTab ${VersionInfo.version}`);
198
198
  print(`commit: ${VersionInfo.commit}`);
@@ -5769,7 +5769,7 @@
5769
5769
  for (const a of PercussionMapper.instrumentArticulations.values()) if (!articulationsByOutputNumber.has(a.outputMidiNumber)) articulationsByOutputNumber.set(a.outputMidiNumber, a);
5770
5770
  PercussionMapper._articulationsByOutputNumber = articulationsByOutputNumber;
5771
5771
  }
5772
- return articulationsByOutputNumber.has(articulation.outputMidiNumber) ? articulationsByOutputNumber.get(articulation.outputMidiNumber).id : -1;
5772
+ return articulationsByOutputNumber.has(articulation.outputMidiNumber) ? articulationsByOutputNumber.get(articulation.outputMidiNumber).id : NaN;
5773
5773
  }
5774
5774
  static _instrumentArticulationsByUniqueId;
5775
5775
  static getInstrumentArticulationByUniqueId(uniqueId) {
@@ -5951,36 +5951,36 @@
5951
5951
  return this.bendPoints !== null && this.bendType !== BendType.None;
5952
5952
  }
5953
5953
  get isStringed() {
5954
- return this.string >= 0;
5954
+ return !Number.isNaN(this.string) && !Number.isNaN(this.fret);
5955
5955
  }
5956
5956
  /**
5957
5957
  * Gets or sets the fret on which this note is played on the instrument.
5958
5958
  * 0 is the nut.
5959
5959
  */
5960
- fret = -1;
5960
+ fret = NaN;
5961
5961
  /**
5962
5962
  * Gets or sets the string number where the note is placed.
5963
5963
  * 1 is the lowest string on the guitar and the bottom line on the tablature.
5964
5964
  * It then increases the the number of strings on available on the track.
5965
5965
  */
5966
- string = -1;
5966
+ string = NaN;
5967
5967
  /**
5968
5968
  * Gets or sets whether the string number for this note should be shown.
5969
5969
  */
5970
5970
  showStringNumber = false;
5971
5971
  get isPiano() {
5972
- return !this.isStringed && this.octave >= 0 && this.tone >= 0;
5972
+ return !this.isStringed && !Number.isNaN(this.octave) && !Number.isNaN(this.tone);
5973
5973
  }
5974
5974
  /**
5975
5975
  * Gets or sets the octave on which this note is played.
5976
5976
  */
5977
- octave = -1;
5977
+ octave = NaN;
5978
5978
  /**
5979
5979
  * Gets or sets the tone of this note within the octave.
5980
5980
  */
5981
- tone = -1;
5981
+ tone = NaN;
5982
5982
  get isPercussion() {
5983
- return !this.isStringed && this.percussionArticulation >= 0;
5983
+ return !Number.isNaN(this.percussionArticulation);
5984
5984
  }
5985
5985
  /**
5986
5986
  * Gets or sets the percusson element.
@@ -6095,7 +6095,7 @@
6095
6095
  * - 126 Ride (middle)
6096
6096
  * - 127 Ride (bell)
6097
6097
  */
6098
- percussionArticulation = -1;
6098
+ percussionArticulation = NaN;
6099
6099
  /**
6100
6100
  * Gets or sets whether this note is visible on the music sheet.
6101
6101
  */
@@ -6320,7 +6320,7 @@
6320
6320
  return this.beat.voice.bar.staff.capo + Note.getStringTuning(this.beat.voice.bar.staff, this.string);
6321
6321
  }
6322
6322
  static getStringTuning(staff, noteString) {
6323
- if (staff.tuning.length > 0) return staff.tuning[staff.tuning.length - (noteString - 1) - 1];
6323
+ if (staff.tuning.length > 0 && noteString >= 0) return staff.tuning[staff.tuning.length - (noteString - 1) - 1];
6324
6324
  return 0;
6325
6325
  }
6326
6326
  get realValue() {
@@ -6634,7 +6634,7 @@
6634
6634
  if (note.isStringed) {
6635
6635
  const noteOnString = previousBeat.getNoteOnString(note.string);
6636
6636
  if (noteOnString) return noteOnString;
6637
- } else if (note.octave === -1 && note.tone === -1) {
6637
+ } else if (Number.isNaN(note.octave) && Number.isNaN(note.tone)) {
6638
6638
  if (note.index < previousBeat.notes.length) return previousBeat.notes[note.index];
6639
6639
  } else {
6640
6640
  const noteWithValue = previousBeat.getNoteWithRealValue(note.realValue);
@@ -7356,14 +7356,14 @@
7356
7356
  deadSlapped = false;
7357
7357
  /**
7358
7358
  * Gets or sets the chromatic tone value (0–11) of the pitch at which this rest should be displayed.
7359
- * A value of -1 means use the default position formula.
7359
+ * A value of NaN means use the default position formula.
7360
7360
  */
7361
- restDisplayTone = -1;
7361
+ restDisplayTone = NaN;
7362
7362
  /**
7363
7363
  * Gets or sets the octave at which this rest should be displayed.
7364
- * Only relevant when {@link restDisplayTone} is set. -1 means use the default position formula.
7364
+ * Only relevant when {@link restDisplayTone} is set. NaN means use the default position formula.
7365
7365
  */
7366
- restDisplayOctave = -1;
7366
+ restDisplayOctave = NaN;
7367
7367
  /**
7368
7368
  * Gets or sets the brush type applied to the notes of this beat.
7369
7369
  */
@@ -7664,13 +7664,13 @@
7664
7664
  note.beat = this;
7665
7665
  note.index = this.notes.length;
7666
7666
  this.notes.push(note);
7667
- if (note.isStringed) this.noteStringLookup.set(note.string, note);
7667
+ if (note.string >= 0) this.noteStringLookup.set(note.string, note);
7668
7668
  }
7669
7669
  removeNote(note) {
7670
7670
  const index = this.notes.indexOf(note);
7671
7671
  if (index >= 0) {
7672
7672
  this.notes.splice(index, 1);
7673
- if (note.isStringed) this.noteStringLookup.delete(note.string);
7673
+ if (note.string >= 0) this.noteStringLookup.delete(note.string);
7674
7674
  }
7675
7675
  }
7676
7676
  getAutomation(type) {
@@ -8538,10 +8538,10 @@
8538
8538
  }
8539
8539
  static scoreMetaDataSignatures = AlphaTex1LanguageDefinitions._signatures([
8540
8540
  ["title", [[
8541
- [[17, 10], 0],
8542
- [[17], 1],
8541
+ [[107, 100], 0],
8542
+ [[107], 1],
8543
8543
  [
8544
- [10, 17],
8544
+ [100, 107],
8545
8545
  1,
8546
8546
  [
8547
8547
  "left",
@@ -8551,10 +8551,10 @@
8551
8551
  ]
8552
8552
  ]]],
8553
8553
  ["subtitle", [[
8554
- [[17, 10], 0],
8555
- [[17], 1],
8554
+ [[107, 100], 0],
8555
+ [[107], 1],
8556
8556
  [
8557
- [10, 17],
8557
+ [100, 107],
8558
8558
  1,
8559
8559
  [
8560
8560
  "left",
@@ -8564,10 +8564,10 @@
8564
8564
  ]
8565
8565
  ]]],
8566
8566
  ["artist", [[
8567
- [[17, 10], 0],
8568
- [[17], 1],
8567
+ [[107, 100], 0],
8568
+ [[107], 1],
8569
8569
  [
8570
- [10, 17],
8570
+ [100, 107],
8571
8571
  1,
8572
8572
  [
8573
8573
  "left",
@@ -8577,10 +8577,10 @@
8577
8577
  ]
8578
8578
  ]]],
8579
8579
  ["album", [[
8580
- [[17, 10], 0],
8581
- [[17], 1],
8580
+ [[107, 100], 0],
8581
+ [[107], 1],
8582
8582
  [
8583
- [10, 17],
8583
+ [100, 107],
8584
8584
  1,
8585
8585
  [
8586
8586
  "left",
@@ -8590,10 +8590,10 @@
8590
8590
  ]
8591
8591
  ]]],
8592
8592
  ["words", [[
8593
- [[17, 10], 0],
8594
- [[17], 1],
8593
+ [[107, 100], 0],
8594
+ [[107], 1],
8595
8595
  [
8596
- [10, 17],
8596
+ [100, 107],
8597
8597
  1,
8598
8598
  [
8599
8599
  "left",
@@ -8603,10 +8603,10 @@
8603
8603
  ]
8604
8604
  ]]],
8605
8605
  ["music", [[
8606
- [[17, 10], 0],
8607
- [[17], 1],
8606
+ [[107, 100], 0],
8607
+ [[107], 1],
8608
8608
  [
8609
- [10, 17],
8609
+ [100, 107],
8610
8610
  1,
8611
8611
  [
8612
8612
  "left",
@@ -8615,8 +8615,8 @@
8615
8615
  ]
8616
8616
  ]
8617
8617
  ]]],
8618
- ["wordsandmusic", [[[[17], 0], [
8619
- [10, 17],
8618
+ ["wordsandmusic", [[[[107], 0], [
8619
+ [100, 107],
8620
8620
  1,
8621
8621
  [
8622
8622
  "left",
@@ -8625,10 +8625,10 @@
8625
8625
  ]
8626
8626
  ]]]],
8627
8627
  ["copyright", [[
8628
- [[17, 10], 0],
8629
- [[17], 1],
8628
+ [[107, 100], 0],
8629
+ [[107], 1],
8630
8630
  [
8631
- [10, 17],
8631
+ [100, 107],
8632
8632
  1,
8633
8633
  [
8634
8634
  "left",
@@ -8637,8 +8637,8 @@
8637
8637
  ]
8638
8638
  ]
8639
8639
  ]]],
8640
- ["copyright2", [[[[17], 0], [
8641
- [10, 17],
8640
+ ["copyright2", [[[[107], 0], [
8641
+ [100, 107],
8642
8642
  1,
8643
8643
  [
8644
8644
  "left",
@@ -8646,13 +8646,13 @@
8646
8646
  "right"
8647
8647
  ]
8648
8648
  ]]]],
8649
- ["instructions", [[[[17, 10], 0]]]],
8650
- ["notices", [[[[17, 10], 0]]]],
8649
+ ["instructions", [[[[107, 100], 0]]]],
8650
+ ["notices", [[[[107, 100], 0]]]],
8651
8651
  ["tab", [[
8652
- [[17, 10], 0],
8653
- [[17], 1],
8652
+ [[107, 100], 0],
8653
+ [[107], 1],
8654
8654
  [
8655
- [10, 17],
8655
+ [100, 107],
8656
8656
  1,
8657
8657
  [
8658
8658
  "left",
@@ -8661,19 +8661,19 @@
8661
8661
  ]
8662
8662
  ]
8663
8663
  ]]],
8664
- ["systemslayout", [[[[16], 5]]]],
8665
- ["defaultsystemslayout", [[[[16], 0]]]],
8664
+ ["systemslayout", [[[[106], 5]]]],
8665
+ ["defaultsystemslayout", [[[[106], 0]]]],
8666
8666
  ["showdynamics", null],
8667
8667
  ["hidedynamics", null],
8668
8668
  ["usesystemsignseparator", null],
8669
8669
  ["tuningdisplaymode", [[[
8670
- [10, 17],
8670
+ [100, 107],
8671
8671
  0,
8672
8672
  ["score", "staff"]
8673
8673
  ]]]],
8674
8674
  ["multibarrest", null],
8675
8675
  ["bracketextendmode", [[[
8676
- [10, 17],
8676
+ [100, 107],
8677
8677
  0,
8678
8678
  [
8679
8679
  "nobrackets",
@@ -8682,7 +8682,7 @@
8682
8682
  ]
8683
8683
  ]]]],
8684
8684
  ["singletracktracknamepolicy", [[[
8685
- [10, 17],
8685
+ [100, 107],
8686
8686
  0,
8687
8687
  [
8688
8688
  "hidden",
@@ -8691,7 +8691,7 @@
8691
8691
  ]
8692
8692
  ]]]],
8693
8693
  ["multitracktracknamepolicy", [[[
8694
- [10, 17],
8694
+ [100, 107],
8695
8695
  0,
8696
8696
  [
8697
8697
  "hidden",
@@ -8700,28 +8700,28 @@
8700
8700
  ]
8701
8701
  ]]]],
8702
8702
  ["firstsystemtracknamemode", [[[
8703
- [10, 17],
8703
+ [100, 107],
8704
8704
  0,
8705
8705
  ["fullname", "shortname"]
8706
8706
  ]]]],
8707
8707
  ["othersystemstracknamemode", [[[
8708
- [10, 17],
8708
+ [100, 107],
8709
8709
  0,
8710
8710
  ["fullname", "shortname"]
8711
8711
  ]]]],
8712
8712
  ["firstsystemtracknameorientation", [[[
8713
- [10, 17],
8713
+ [100, 107],
8714
8714
  0,
8715
8715
  ["horizontal", "vertical"]
8716
8716
  ]]]],
8717
8717
  ["othersystemstracknameorientation", [[[
8718
- [10, 17],
8718
+ [100, 107],
8719
8719
  0,
8720
8720
  ["horizontal", "vertical"]
8721
8721
  ]]]],
8722
8722
  ["extendbarlines", null],
8723
8723
  ["chorddiagramsinscore", [[[
8724
- [10],
8724
+ [100],
8725
8725
  1,
8726
8726
  ["true", "false"]
8727
8727
  ]]]],
@@ -8729,7 +8729,7 @@
8729
8729
  ["hideemptystavesinfirstsystem", null],
8730
8730
  ["showsinglestaffbrackets", null],
8731
8731
  ["defaultbarnumberdisplay", [[[
8732
- [10, 17],
8732
+ [100, 107],
8733
8733
  0,
8734
8734
  [
8735
8735
  "allbars",
@@ -8740,54 +8740,54 @@
8740
8740
  ]);
8741
8741
  static staffMetaDataSignatures = AlphaTex1LanguageDefinitions._signatures([
8742
8742
  ["tuning", [[[
8743
- [10, 17],
8743
+ [100, 107],
8744
8744
  0,
8745
8745
  [
8746
8746
  "piano",
8747
8747
  "none",
8748
8748
  "voice"
8749
8749
  ]
8750
- ]], [[[10, 17], 5]]]],
8751
- ["chord", [[[[17, 10], 0], [[
8752
- 10,
8753
- 17,
8754
- 16
8750
+ ]], [[[100, 107], 5]]]],
8751
+ ["chord", [[[[107, 100], 0], [[
8752
+ 100,
8753
+ 107,
8754
+ 106
8755
8755
  ], 5]]]],
8756
- ["capo", [[[[16], 0]]]],
8757
- ["lyrics", [[[[17], 0]], [[[16], 0], [[17], 0]]]],
8756
+ ["capo", [[[[106], 0]]]],
8757
+ ["lyrics", [[[[107], 0]], [[[106], 0], [[107], 0]]]],
8758
8758
  ["articulation", [[[
8759
- [10],
8759
+ [100],
8760
8760
  0,
8761
8761
  ["defaults"]
8762
- ]], [[[17, 10], 0], [[16], 0]]]],
8763
- ["displaytranspose", [[[[16], 0]]]],
8764
- ["transpose", [[[[16], 0]]]],
8762
+ ]], [[[107, 100], 0], [[106], 0]]]],
8763
+ ["displaytranspose", [[[[106], 0]]]],
8764
+ ["transpose", [[[[106], 0]]]],
8765
8765
  ["instrument", [
8766
- [[[16], 0]],
8767
- [[[17, 10], 0]],
8766
+ [[[106], 0]],
8767
+ [[[107, 100], 0]],
8768
8768
  [[
8769
- [10],
8769
+ [100],
8770
8770
  0,
8771
8771
  ["percussion"]
8772
8772
  ]]
8773
8773
  ]]
8774
8774
  ]);
8775
8775
  static structuralMetaDataSignatures = AlphaTex1LanguageDefinitions._signatures([
8776
- ["track", [[[[17], 1], [[17], 1]]]],
8776
+ ["track", [[[[107], 1], [[107], 1]]]],
8777
8777
  ["staff", null],
8778
8778
  ["voice", null]
8779
8779
  ]);
8780
8780
  static barMetaDataSignatures = AlphaTex1LanguageDefinitions._signatures([
8781
8781
  ["ts", [[[
8782
- [10, 17],
8782
+ [100, 107],
8783
8783
  0,
8784
8784
  ["common"]
8785
- ]], [[[16], 0], [[16], 0]]]],
8785
+ ]], [[[106], 0], [[106], 0]]]],
8786
8786
  ["ro", null],
8787
- ["rc", [[[[16], 0]]]],
8788
- ["ae", [[[[16, 13], 4]]]],
8787
+ ["rc", [[[[106], 0]]]],
8788
+ ["ae", [[[[106, 103], 4]]]],
8789
8789
  ["ks", [[[
8790
- [10, 17],
8790
+ [100, 107],
8791
8791
  0,
8792
8792
  [
8793
8793
  "cb",
@@ -8841,9 +8841,9 @@
8841
8841
  ]]]],
8842
8842
  ["clef", [[[
8843
8843
  [
8844
- 10,
8845
- 16,
8846
- 17
8844
+ 100,
8845
+ 106,
8846
+ 107
8847
8847
  ],
8848
8848
  0,
8849
8849
  [
@@ -8860,7 +8860,7 @@
8860
8860
  ]
8861
8861
  ]]]],
8862
8862
  ["ottava", [[[
8863
- [10, 17],
8863
+ [100, 107],
8864
8864
  0,
8865
8865
  [
8866
8866
  "15ma",
@@ -8874,22 +8874,22 @@
8874
8874
  "15mb"
8875
8875
  ]
8876
8876
  ]]]],
8877
- ["tempo", [[[[16], 2], [[17], 1]], [
8877
+ ["tempo", [[[[106], 2], [[107], 1]], [
8878
8878
  null,
8879
- [[16], 2],
8880
- [[17], 0],
8881
- [[16], 1],
8879
+ [[106], 2],
8880
+ [[107], 0],
8881
+ [[106], 1],
8882
8882
  [
8883
- [10],
8883
+ [100],
8884
8884
  1,
8885
8885
  ["hide"]
8886
8886
  ]
8887
8887
  ]]],
8888
8888
  ["tf", [[[
8889
8889
  [
8890
- 10,
8891
- 16,
8892
- 17
8890
+ 100,
8891
+ 106,
8892
+ 107
8893
8893
  ],
8894
8894
  0,
8895
8895
  [
@@ -8918,8 +8918,8 @@
8918
8918
  ]
8919
8919
  ]]]],
8920
8920
  ["ac", null],
8921
- ["section", [[[[17, 10], 0]], [[[17, 10], 0], [
8922
- [17, 10],
8921
+ ["section", [[[[107, 100], 0]], [[[107, 100], 0], [
8922
+ [107, 100],
8923
8923
  0,
8924
8924
  null,
8925
8925
  [
@@ -8929,7 +8929,7 @@
8929
8929
  ]
8930
8930
  ]]]],
8931
8931
  ["jump", [[[
8932
- [10, 17],
8932
+ [100, 107],
8933
8933
  0,
8934
8934
  [
8935
8935
  "fine",
@@ -8955,7 +8955,7 @@
8955
8955
  ]]]],
8956
8956
  ["ft", null],
8957
8957
  ["simile", [[[
8958
- [10, 17],
8958
+ [100, 107],
8959
8959
  0,
8960
8960
  [
8961
8961
  "none",
@@ -8965,7 +8965,7 @@
8965
8965
  ]
8966
8966
  ]]]],
8967
8967
  ["barlineleft", [[[
8968
- [10, 17],
8968
+ [100, 107],
8969
8969
  0,
8970
8970
  [
8971
8971
  "automatic",
@@ -8983,7 +8983,7 @@
8983
8983
  ]
8984
8984
  ]]]],
8985
8985
  ["barlineright", [[[
8986
- [10, 17],
8986
+ [100, 107],
8987
8987
  0,
8988
8988
  [
8989
8989
  "automatic",
@@ -9000,30 +9000,30 @@
9000
9000
  "tick"
9001
9001
  ]
9002
9002
  ]]]],
9003
- ["scale", [[[[16], 2]]]],
9004
- ["width", [[[[16], 2]]]],
9003
+ ["scale", [[[[106], 2]]]],
9004
+ ["width", [[[[106], 2]]]],
9005
9005
  ["sync", [[
9006
- [[16], 0],
9007
- [[16], 0],
9008
- [[16], 0],
9009
- [[16], 3]
9006
+ [[106], 0],
9007
+ [[106], 0],
9008
+ [[106], 0],
9009
+ [[106], 3]
9010
9010
  ]]],
9011
9011
  ["accidentals", [[[
9012
- [10, 17],
9012
+ [100, 107],
9013
9013
  0,
9014
9014
  ["auto", "explicit"]
9015
9015
  ]]]],
9016
- ["spd", [[[[16], 2]]]],
9017
- ["sph", [[[[16], 2]]]],
9018
- ["spu", [[[[16], 2]]]],
9016
+ ["spd", [[[[106], 2]]]],
9017
+ ["sph", [[[[106], 2]]]],
9018
+ ["spu", [[[[106], 2]]]],
9019
9019
  ["db", null],
9020
9020
  ["voicemode", [[[
9021
- [10, 17],
9021
+ [100, 107],
9022
9022
  0,
9023
9023
  ["staffwise", "barwise"]
9024
9024
  ]]]],
9025
9025
  ["barnumberdisplay", [[[
9026
- [10, 17],
9026
+ [100, 107],
9027
9027
  0,
9028
9028
  [
9029
9029
  "allbars",
@@ -9031,31 +9031,31 @@
9031
9031
  "hide"
9032
9032
  ]
9033
9033
  ]]]],
9034
- ["beaming", [[[[16], 0], [[16], 5]]]]
9034
+ ["beaming", [[[[106], 0], [[106], 5]]]]
9035
9035
  ]);
9036
9036
  static metaDataProperties = AlphaTex1LanguageDefinitions._metaProps([
9037
9037
  ["track", [
9038
- ["color", [[[[17], 0]]]],
9039
- ["systemslayout", [[[[16], 5]]]],
9040
- ["defaultsystemslayout", [[[[16], 0]]]],
9038
+ ["color", [[[[107], 0]]]],
9039
+ ["systemslayout", [[[[106], 5]]]],
9040
+ ["defaultsystemslayout", [[[[106], 0]]]],
9041
9041
  ["solo", null],
9042
9042
  ["mute", null],
9043
- ["volume", [[[[16], 0]]]],
9044
- ["balance", [[[[16], 0]]]],
9043
+ ["volume", [[[[106], 0]]]],
9044
+ ["balance", [[[[106], 0]]]],
9045
9045
  ["instrument", [
9046
- [[[16], 0]],
9047
- [[[17, 10], 0]],
9046
+ [[[106], 0]],
9047
+ [[[107, 100], 0]],
9048
9048
  [[
9049
- [10],
9049
+ [100],
9050
9050
  0,
9051
9051
  ["percussion"]
9052
9052
  ]]
9053
9053
  ]],
9054
- ["bank", [[[[16], 0]]]],
9054
+ ["bank", [[[[106], 0]]]],
9055
9055
  ["multibarrest", null]
9056
9056
  ]],
9057
9057
  ["staff", [
9058
- ["score", [[[[16], 1]]]],
9058
+ ["score", [[[[106], 1]]]],
9059
9059
  ["tabs", null],
9060
9060
  ["slash", null],
9061
9061
  ["numbered", null]
@@ -9093,24 +9093,24 @@
9093
9093
  ["hideemptystavesinfirstsystem", null],
9094
9094
  ["showsinglestaffbrackets", null],
9095
9095
  ["defaultbarnumberdisplay", null],
9096
- ["tuning", [["hide", null], ["label", [[[[17], 0]]]]]],
9096
+ ["tuning", [["hide", null], ["label", [[[[107], 0]]]]]],
9097
9097
  ["chord", [
9098
- ["firstfret", [[[[16], 0]]]],
9099
- ["barre", [[[[16], 5]]]],
9098
+ ["firstfret", [[[[106], 0]]]],
9099
+ ["barre", [[[[106], 5]]]],
9100
9100
  ["showdiagram", [
9101
9101
  [],
9102
9102
  [[
9103
- [17],
9103
+ [107],
9104
9104
  0,
9105
9105
  ["true", "false"]
9106
9106
  ]],
9107
9107
  [[
9108
- [10],
9108
+ [100],
9109
9109
  0,
9110
9110
  ["true", "false"]
9111
9111
  ]],
9112
9112
  [[
9113
- [16],
9113
+ [106],
9114
9114
  0,
9115
9115
  ["1", "0"]
9116
9116
  ]]
@@ -9118,17 +9118,17 @@
9118
9118
  ["showfingering", [
9119
9119
  [],
9120
9120
  [[
9121
- [17],
9121
+ [107],
9122
9122
  0,
9123
9123
  ["true", "false"]
9124
9124
  ]],
9125
9125
  [[
9126
- [10],
9126
+ [100],
9127
9127
  0,
9128
9128
  ["true", "false"]
9129
9129
  ]],
9130
9130
  [[
9131
- [16],
9131
+ [106],
9132
9132
  0,
9133
9133
  ["1", "0"]
9134
9134
  ]]
@@ -9136,17 +9136,17 @@
9136
9136
  ["showname", [
9137
9137
  [],
9138
9138
  [[
9139
- [17],
9139
+ [107],
9140
9140
  0,
9141
9141
  ["true", "false"]
9142
9142
  ]],
9143
9143
  [[
9144
- [10],
9144
+ [100],
9145
9145
  0,
9146
9146
  ["true", "false"]
9147
9147
  ]],
9148
9148
  [[
9149
- [16],
9149
+ [106],
9150
9150
  0,
9151
9151
  ["1", "0"]
9152
9152
  ]]
@@ -9193,7 +9193,7 @@
9193
9193
  AlphaTex1LanguageDefinitions.barMetaDataSignatures
9194
9194
  ];
9195
9195
  static durationChangeProperties = AlphaTex1LanguageDefinitions._props([["tu", [[[
9196
- [16],
9196
+ [106],
9197
9197
  0,
9198
9198
  [
9199
9199
  "3",
@@ -9204,7 +9204,7 @@
9204
9204
  "10",
9205
9205
  "12"
9206
9206
  ]
9207
- ]], [[[16], 0], [[16], 0]]]]]);
9207
+ ]], [[[106], 0], [[106], 0]]]]]);
9208
9208
  static beatProperties = AlphaTex1LanguageDefinitions._props([
9209
9209
  ["f", null],
9210
9210
  ["fo", null],
@@ -9233,7 +9233,7 @@
9233
9233
  ["legatoorigin", null],
9234
9234
  ["timer", null],
9235
9235
  ["tu", [[[
9236
- [16],
9236
+ [106],
9237
9237
  0,
9238
9238
  [
9239
9239
  "3",
@@ -9244,14 +9244,13 @@
9244
9244
  "10",
9245
9245
  "12"
9246
9246
  ]
9247
- ]], [[[16], 0], [[16], 0]]]],
9248
- ["txt", [[[[17, 10], 0]]]],
9249
- ["restdisplaypitch", [[[[10, 17], 0]]]],
9250
- ["lyrics", [[[[17], 0]], [[[16], 0], [[17], 0]]]],
9247
+ ]], [[[106], 0], [[106], 0]]]],
9248
+ ["txt", [[[[107, 100], 0]]]],
9249
+ ["lyrics", [[[[107], 0]], [[[106], 0], [[107], 0]]]],
9251
9250
  ["tb", [
9252
- [[[16], 5]],
9251
+ [[[106], 5]],
9253
9252
  [[
9254
- [10, 17],
9253
+ [100, 107],
9255
9254
  0,
9256
9255
  [
9257
9256
  "custom",
@@ -9261,19 +9260,19 @@
9261
9260
  "predive",
9262
9261
  "predivedive"
9263
9262
  ]
9264
- ], [[16], 5]],
9263
+ ], [[106], 5]],
9265
9264
  [[
9266
- [10, 17],
9265
+ [100, 107],
9267
9266
  0,
9268
9267
  [
9269
9268
  "default",
9270
9269
  "gradual",
9271
9270
  "fast"
9272
9271
  ]
9273
- ], [[16], 5]],
9272
+ ], [[106], 5]],
9274
9273
  [
9275
9274
  [
9276
- [10, 17],
9275
+ [100, 107],
9277
9276
  0,
9278
9277
  [
9279
9278
  "custom",
@@ -9285,7 +9284,7 @@
9285
9284
  ]
9286
9285
  ],
9287
9286
  [
9288
- [10, 17],
9287
+ [100, 107],
9289
9288
  0,
9290
9289
  [
9291
9290
  "default",
@@ -9293,13 +9292,13 @@
9293
9292
  "fast"
9294
9293
  ]
9295
9294
  ],
9296
- [[16], 5]
9295
+ [[106], 5]
9297
9296
  ]
9298
9297
  ]],
9299
9298
  ["tbe", [
9300
- [[[16], 5]],
9299
+ [[[106], 5]],
9301
9300
  [[
9302
- [10, 17],
9301
+ [100, 107],
9303
9302
  0,
9304
9303
  [
9305
9304
  "custom",
@@ -9309,19 +9308,19 @@
9309
9308
  "predive",
9310
9309
  "predivedive"
9311
9310
  ]
9312
- ], [[16], 5]],
9311
+ ], [[106], 5]],
9313
9312
  [[
9314
- [10, 17],
9313
+ [100, 107],
9315
9314
  0,
9316
9315
  [
9317
9316
  "default",
9318
9317
  "gradual",
9319
9318
  "fast"
9320
9319
  ]
9321
- ], [[16], 5]],
9320
+ ], [[106], 5]],
9322
9321
  [
9323
9322
  [
9324
- [10, 17],
9323
+ [100, 107],
9325
9324
  0,
9326
9325
  [
9327
9326
  "custom",
@@ -9333,7 +9332,7 @@
9333
9332
  ]
9334
9333
  ],
9335
9334
  [
9336
- [10, 17],
9335
+ [100, 107],
9337
9336
  0,
9338
9337
  [
9339
9338
  "default",
@@ -9341,16 +9340,16 @@
9341
9340
  "fast"
9342
9341
  ]
9343
9342
  ],
9344
- [[16], 5]
9343
+ [[106], 5]
9345
9344
  ]
9346
9345
  ]],
9347
- ["bu", [[[[16], 1]]]],
9348
- ["bd", [[[[16], 1]]]],
9349
- ["au", [[[[16], 1]]]],
9350
- ["ad", [[[[16], 1]]]],
9351
- ["ch", [[[[17, 10], 0]]]],
9346
+ ["bu", [[[[106], 1]]]],
9347
+ ["bd", [[[[106], 1]]]],
9348
+ ["au", [[[[106], 1]]]],
9349
+ ["ad", [[[[106], 1]]]],
9350
+ ["ch", [[[[107, 100], 0]]]],
9352
9351
  ["gr", [[[
9353
- [10, 17],
9352
+ [100, 107],
9354
9353
  1,
9355
9354
  [
9356
9355
  "onbeat",
@@ -9362,7 +9361,7 @@
9362
9361
  ]
9363
9362
  ]]]],
9364
9363
  ["dy", [[[
9365
- [10, 17],
9364
+ [100, 107],
9366
9365
  0,
9367
9366
  [
9368
9367
  "ppp",
@@ -9393,33 +9392,33 @@
9393
9392
  "sfzp"
9394
9393
  ]
9395
9394
  ]]]],
9396
- ["tempo", [[[[16], 0], [
9397
- [10],
9395
+ ["tempo", [[[[106], 0], [
9396
+ [100],
9398
9397
  1,
9399
9398
  ["hide"]
9400
9399
  ]], [
9401
- [[16], 0],
9402
- [[17], 0],
9400
+ [[106], 0],
9401
+ [[107], 0],
9403
9402
  [
9404
- [10],
9403
+ [100],
9405
9404
  1,
9406
9405
  ["hide"]
9407
9406
  ]
9408
9407
  ]]],
9409
- ["volume", [[[[16], 0]]]],
9410
- ["balance", [[[[16], 0]]]],
9411
- ["tp", [[[[16], 0], [
9412
- [10, 17],
9408
+ ["volume", [[[[106], 0]]]],
9409
+ ["balance", [[[[106], 0]]]],
9410
+ ["tp", [[[[106], 0], [
9411
+ [100, 107],
9413
9412
  1,
9414
9413
  ["default", "buzzroll"]
9415
9414
  ]]]],
9416
- ["barre", [[[[16], 0], [
9417
- [10, 17],
9415
+ ["barre", [[[[106], 0], [
9416
+ [100, 107],
9418
9417
  1,
9419
9418
  ["full", "half"]
9420
9419
  ]]]],
9421
9420
  ["rasg", [[[
9422
- [10, 17],
9421
+ [100, 107],
9423
9422
  0,
9424
9423
  [
9425
9424
  "ii",
@@ -9443,7 +9442,7 @@
9443
9442
  ]
9444
9443
  ]]]],
9445
9444
  ["ot", [[[
9446
- [10, 17],
9445
+ [100, 107],
9447
9446
  0,
9448
9447
  [
9449
9448
  "15ma",
@@ -9458,26 +9457,26 @@
9458
9457
  ]
9459
9458
  ]]]],
9460
9459
  ["instrument", [
9461
- [[[16], 0]],
9462
- [[[17, 10], 0]],
9460
+ [[[106], 0]],
9461
+ [[[107, 100], 0]],
9463
9462
  [[
9464
- [10],
9463
+ [100],
9465
9464
  0,
9466
9465
  ["percussion"]
9467
9466
  ]]
9468
9467
  ]],
9469
- ["bank", [[[[16], 0]]]],
9468
+ ["bank", [[[[106], 0]]]],
9470
9469
  ["fermata", [[[
9471
- [10, 17],
9470
+ [100, 107],
9472
9471
  0,
9473
9472
  [
9474
9473
  "short",
9475
9474
  "medium",
9476
9475
  "long"
9477
9476
  ]
9478
- ], [[16], 3]]]],
9477
+ ], [[106], 3]]]],
9479
9478
  ["beam", [[[
9480
- [10, 17],
9479
+ [100, 107],
9481
9480
  0,
9482
9481
  [
9483
9482
  "invert",
@@ -9488,15 +9487,16 @@
9488
9487
  "merge",
9489
9488
  "splitsecondary"
9490
9489
  ]
9491
- ]]]]
9490
+ ]]]],
9491
+ ["restdisplaypitch", [[[[100], 0]]]]
9492
9492
  ]);
9493
9493
  static noteProperties = AlphaTex1LanguageDefinitions._props([
9494
9494
  ["nh", null],
9495
- ["ah", [[[[16], 1]]]],
9496
- ["th", [[[[16], 1]]]],
9497
- ["ph", [[[[16], 1]]]],
9498
- ["sh", [[[[16], 1]]]],
9499
- ["fh", [[[[16], 1]]]],
9495
+ ["ah", [[[[106], 1]]]],
9496
+ ["th", [[[[106], 1]]]],
9497
+ ["ph", [[[[106], 1]]]],
9498
+ ["sh", [[[[106], 1]]]],
9499
+ ["fh", [[[[106], 1]]]],
9500
9500
  ["v", null],
9501
9501
  ["vw", null],
9502
9502
  ["sl", null],
@@ -9513,8 +9513,8 @@
9513
9513
  ["ac", null],
9514
9514
  ["hac", null],
9515
9515
  ["ten", null],
9516
- ["tr", [[[[16], 0], [
9517
- [16],
9516
+ ["tr", [[[[106], 0], [
9517
+ [106],
9518
9518
  1,
9519
9519
  [
9520
9520
  "16",
@@ -9534,9 +9534,9 @@
9534
9534
  ["string", null],
9535
9535
  ["hide", null],
9536
9536
  ["b", [
9537
- [[[16], 5]],
9537
+ [[[106], 5]],
9538
9538
  [[
9539
- [10, 17],
9539
+ [100, 107],
9540
9540
  0,
9541
9541
  [
9542
9542
  "custom",
@@ -9548,19 +9548,19 @@
9548
9548
  "prebendbend",
9549
9549
  "prebendrelease"
9550
9550
  ]
9551
- ], [[16], 5]],
9551
+ ], [[106], 5]],
9552
9552
  [[
9553
- [10, 17],
9553
+ [100, 107],
9554
9554
  0,
9555
9555
  [
9556
9556
  "default",
9557
9557
  "gradual",
9558
9558
  "fast"
9559
9559
  ]
9560
- ], [[16], 5]],
9560
+ ], [[106], 5]],
9561
9561
  [
9562
9562
  [
9563
- [10, 17],
9563
+ [100, 107],
9564
9564
  0,
9565
9565
  [
9566
9566
  "custom",
@@ -9574,7 +9574,7 @@
9574
9574
  ]
9575
9575
  ],
9576
9576
  [
9577
- [10, 17],
9577
+ [100, 107],
9578
9578
  0,
9579
9579
  [
9580
9580
  "default",
@@ -9582,13 +9582,13 @@
9582
9582
  "fast"
9583
9583
  ]
9584
9584
  ],
9585
- [[16], 5]
9585
+ [[106], 5]
9586
9586
  ]
9587
9587
  ]],
9588
9588
  ["be", [
9589
- [[[16], 5]],
9589
+ [[[106], 5]],
9590
9590
  [[
9591
- [10, 17],
9591
+ [100, 107],
9592
9592
  0,
9593
9593
  [
9594
9594
  "custom",
@@ -9600,19 +9600,19 @@
9600
9600
  "prebendbend",
9601
9601
  "prebendrelease"
9602
9602
  ]
9603
- ], [[16], 5]],
9603
+ ], [[106], 5]],
9604
9604
  [[
9605
- [10, 17],
9605
+ [100, 107],
9606
9606
  0,
9607
9607
  [
9608
9608
  "default",
9609
9609
  "gradual",
9610
9610
  "fast"
9611
9611
  ]
9612
- ], [[16], 5]],
9612
+ ], [[106], 5]],
9613
9613
  [
9614
9614
  [
9615
- [10, 17],
9615
+ [100, 107],
9616
9616
  0,
9617
9617
  [
9618
9618
  "custom",
@@ -9626,7 +9626,7 @@
9626
9626
  ]
9627
9627
  ],
9628
9628
  [
9629
- [10, 17],
9629
+ [100, 107],
9630
9630
  0,
9631
9631
  [
9632
9632
  "default",
@@ -9634,11 +9634,11 @@
9634
9634
  "fast"
9635
9635
  ]
9636
9636
  ],
9637
- [[16], 5]
9637
+ [[106], 5]
9638
9638
  ]
9639
9639
  ]],
9640
9640
  ["lf", [[[
9641
- [16],
9641
+ [106],
9642
9642
  0,
9643
9643
  [
9644
9644
  "1",
@@ -9649,7 +9649,7 @@
9649
9649
  ]
9650
9650
  ]]]],
9651
9651
  ["rf", [[[
9652
- [16],
9652
+ [106],
9653
9653
  0,
9654
9654
  [
9655
9655
  "1",
@@ -9660,7 +9660,7 @@
9660
9660
  ]
9661
9661
  ]]]],
9662
9662
  ["acc", [[[
9663
- [10, 17],
9663
+ [100, 107],
9664
9664
  0,
9665
9665
  [
9666
9666
  "default",
@@ -9680,7 +9680,7 @@
9680
9680
  "bb"
9681
9681
  ]
9682
9682
  ]]]],
9683
- ["slur", [[[[17], 0]], [[[10], 0]]]],
9683
+ ["slur", [[[[107], 0]], [[[100], 0]]]],
9684
9684
  ["-", null]
9685
9685
  ]);
9686
9686
  };
@@ -9701,20 +9701,21 @@
9701
9701
  AlphaTexNodeType[AlphaTexNodeType["RParen"] = 7] = "RParen";
9702
9702
  AlphaTexNodeType[AlphaTexNodeType["Colon"] = 8] = "Colon";
9703
9703
  AlphaTexNodeType[AlphaTexNodeType["Asterisk"] = 9] = "Asterisk";
9704
- AlphaTexNodeType[AlphaTexNodeType["Ident"] = 10] = "Ident";
9705
- AlphaTexNodeType[AlphaTexNodeType["Tag"] = 11] = "Tag";
9706
- AlphaTexNodeType[AlphaTexNodeType["Meta"] = 12] = "Meta";
9707
- AlphaTexNodeType[AlphaTexNodeType["Arguments"] = 13] = "Arguments";
9708
- AlphaTexNodeType[AlphaTexNodeType["Props"] = 14] = "Props";
9709
- AlphaTexNodeType[AlphaTexNodeType["Prop"] = 15] = "Prop";
9710
- AlphaTexNodeType[AlphaTexNodeType["Number"] = 16] = "Number";
9711
- AlphaTexNodeType[AlphaTexNodeType["String"] = 17] = "String";
9712
- AlphaTexNodeType[AlphaTexNodeType["Score"] = 18] = "Score";
9713
- AlphaTexNodeType[AlphaTexNodeType["Bar"] = 19] = "Bar";
9714
- AlphaTexNodeType[AlphaTexNodeType["Beat"] = 20] = "Beat";
9715
- AlphaTexNodeType[AlphaTexNodeType["Duration"] = 21] = "Duration";
9716
- AlphaTexNodeType[AlphaTexNodeType["NoteList"] = 22] = "NoteList";
9717
- AlphaTexNodeType[AlphaTexNodeType["Note"] = 23] = "Note";
9704
+ AlphaTexNodeType[AlphaTexNodeType["At"] = 10] = "At";
9705
+ AlphaTexNodeType[AlphaTexNodeType["Ident"] = 100] = "Ident";
9706
+ AlphaTexNodeType[AlphaTexNodeType["Tag"] = 101] = "Tag";
9707
+ AlphaTexNodeType[AlphaTexNodeType["Meta"] = 102] = "Meta";
9708
+ AlphaTexNodeType[AlphaTexNodeType["Arguments"] = 103] = "Arguments";
9709
+ AlphaTexNodeType[AlphaTexNodeType["Props"] = 104] = "Props";
9710
+ AlphaTexNodeType[AlphaTexNodeType["Prop"] = 105] = "Prop";
9711
+ AlphaTexNodeType[AlphaTexNodeType["Number"] = 106] = "Number";
9712
+ AlphaTexNodeType[AlphaTexNodeType["String"] = 107] = "String";
9713
+ AlphaTexNodeType[AlphaTexNodeType["Score"] = 200] = "Score";
9714
+ AlphaTexNodeType[AlphaTexNodeType["Bar"] = 201] = "Bar";
9715
+ AlphaTexNodeType[AlphaTexNodeType["Beat"] = 202] = "Beat";
9716
+ AlphaTexNodeType[AlphaTexNodeType["Duration"] = 203] = "Duration";
9717
+ AlphaTexNodeType[AlphaTexNodeType["NoteList"] = 204] = "NoteList";
9718
+ AlphaTexNodeType[AlphaTexNodeType["Note"] = 205] = "Note";
9718
9719
  return AlphaTexNodeType;
9719
9720
  }({});
9720
9721
  //#endregion
@@ -10335,6 +10336,7 @@
10335
10336
  [125, (l) => l._token({ nodeType: AlphaTexNodeType.RBrace })],
10336
10337
  [124, (l) => l._token({ nodeType: AlphaTexNodeType.Pipe })],
10337
10338
  [42, (l) => l._token({ nodeType: AlphaTexNodeType.Asterisk })],
10339
+ [64, (l) => l._token({ nodeType: AlphaTexNodeType.At })],
10338
10340
  [92, (l) => l._metaCommand()],
10339
10341
  [9, (l) => l._whitespace()],
10340
10342
  [10, (l) => l._whitespace()],
@@ -10905,12 +10907,12 @@
10905
10907
  start: noteValue.start
10906
10908
  };
10907
10909
  try {
10908
- let canHaveString = false;
10910
+ let canHaveStringDot = false;
10909
10911
  switch (noteValue.nodeType) {
10910
10912
  case AlphaTexNodeType.Number:
10911
10913
  note.noteValue = noteValue;
10912
10914
  this.lexer.advance();
10913
- canHaveString = true;
10915
+ canHaveStringDot = true;
10914
10916
  break;
10915
10917
  case AlphaTexNodeType.String:
10916
10918
  note.noteValue = noteValue;
@@ -10918,7 +10920,7 @@
10918
10920
  switch (note.noteValue.text) {
10919
10921
  case "x":
10920
10922
  case "-":
10921
- canHaveString = true;
10923
+ canHaveStringDot = true;
10922
10924
  break;
10923
10925
  }
10924
10926
  break;
@@ -10928,7 +10930,7 @@
10928
10930
  switch (note.noteValue.text) {
10929
10931
  case "x":
10930
10932
  case "-":
10931
- canHaveString = true;
10933
+ canHaveStringDot = true;
10932
10934
  break;
10933
10935
  }
10934
10936
  break;
@@ -10940,25 +10942,23 @@
10940
10942
  ], true);
10941
10943
  return;
10942
10944
  }
10943
- if (canHaveString) {
10944
- const dot = this.lexer.peekToken();
10945
- if (dot?.nodeType === AlphaTexNodeType.Dot) {
10946
- const noteStringDot = dot;
10945
+ const separator = this.lexer.peekToken();
10946
+ if (canHaveStringDot && separator?.nodeType === AlphaTexNodeType.Dot || separator?.nodeType === AlphaTexNodeType.At) {
10947
+ const noteStringSeparator = separator;
10948
+ this.lexer.advance();
10949
+ const noteString = this.lexer.peekToken();
10950
+ if (!noteString) {
10951
+ this.unexpectedToken(noteString, [AlphaTexNodeType.Number], true);
10952
+ return;
10953
+ }
10954
+ if (noteString.nodeType === AlphaTexNodeType.Tag) return note;
10955
+ else if (noteString.nodeType === AlphaTexNodeType.Number) {
10956
+ note.noteStringSeparator = noteStringSeparator;
10957
+ note.noteString = noteString;
10947
10958
  this.lexer.advance();
10948
- const noteString = this.lexer.peekToken();
10949
- if (!noteString) {
10950
- this.unexpectedToken(noteString, [AlphaTexNodeType.Number], true);
10951
- return;
10952
- }
10953
- if (noteString.nodeType === AlphaTexNodeType.Tag) return note;
10954
- else if (noteString.nodeType === AlphaTexNodeType.Number) {
10955
- note.noteStringDot = noteStringDot;
10956
- note.noteString = noteString;
10957
- this.lexer.advance();
10958
- } else {
10959
- this.unexpectedToken(noteString, [AlphaTexNodeType.Number], true);
10960
- return;
10961
- }
10959
+ } else {
10960
+ this.unexpectedToken(noteString, [AlphaTexNodeType.Number], true);
10961
+ return;
10962
10962
  }
10963
10963
  }
10964
10964
  note.noteEffects = this._properties((property) => this._metaDataReader.readNotePropertyArguments(this, property));
@@ -12682,12 +12682,18 @@
12682
12682
  return this._filledVoices;
12683
12683
  }
12684
12684
  finish(settings, sharedDataBag = null) {
12685
+ this.stringTuning.finish();
12685
12686
  if (this.isPercussion) {
12686
- this.stringTuning.tunings = [];
12687
- this.showTablature = false;
12688
12687
  this.displayTranspositionPitch = 0;
12688
+ this.stringTuning.tunings = [
12689
+ 0,
12690
+ 0,
12691
+ 0,
12692
+ 0,
12693
+ 0,
12694
+ 0
12695
+ ];
12689
12696
  }
12690
- this.stringTuning.finish();
12691
12697
  if (this.stringTuning.tunings.length === 0) this.showTablature = false;
12692
12698
  for (let i = 0, j = this.bars.length; i < j; i++) {
12693
12699
  this.bars[i].finish(settings, sharedDataBag);
@@ -13677,7 +13683,10 @@
13677
13683
  case AlphaTexNodeType.String:
13678
13684
  const instrumentName = args.arguments[0].text.toLowerCase();
13679
13685
  if (instrumentName === "percussion") {
13680
- for (const staff of track.staves) importer.applyStaffNoteKind(staff, AlphaTexStaffNoteKind.Articulation);
13686
+ for (const staff of track.staves) {
13687
+ staff.showTablature = false;
13688
+ importer.applyStaffNoteKind(staff, AlphaTexStaffNoteKind.Articulation);
13689
+ }
13681
13690
  track.playbackInfo.primaryChannel = SynthConstants.PercussionChannel;
13682
13691
  track.playbackInfo.secondaryChannel = SynthConstants.PercussionChannel;
13683
13692
  } else track.playbackInfo.program = GeneralMidi.getValue(instrumentName);
@@ -15608,10 +15617,10 @@
15608
15617
  _note(beat, node) {
15609
15618
  let isDead = false;
15610
15619
  let isTie = false;
15611
- let numericValue = -1;
15620
+ let numericValue = NaN;
15612
15621
  let articulationValue = "";
15613
- let octave = -1;
15614
- let tone = -1;
15622
+ let octave = NaN;
15623
+ let tone = NaN;
15615
15624
  let accidentalMode = NoteAccidentalMode.Default;
15616
15625
  const noteValue = node.noteValue;
15617
15626
  let detectedNoteKind = void 0;
@@ -15629,7 +15638,7 @@
15629
15638
  isTie = str === "-";
15630
15639
  if (isTie || isDead) {
15631
15640
  numericValue = 0;
15632
- if (node.noteStringDot && node.noteString) detectedNoteKind = AlphaTexStaffNoteKind.Fretted;
15641
+ if (node.noteStringSeparator && node.noteString) detectedNoteKind = AlphaTexStaffNoteKind.Fretted;
15633
15642
  else detectedNoteKind = void 0;
15634
15643
  } else {
15635
15644
  const tuning = ModelUtils.parseTuning(str);
@@ -15697,18 +15706,18 @@
15697
15706
  });
15698
15707
  return;
15699
15708
  }
15700
- const noteString = node.noteString.value;
15701
- if (noteString < 1 || noteString > this._state.currentStaff.tuning.length) {
15709
+ const frettedNoteString = node.noteString.value;
15710
+ if (frettedNoteString < 1 || frettedNoteString > this._state.currentStaff.tuning.length) {
15702
15711
  this.addSemanticDiagnostic({
15703
15712
  code: AlphaTexDiagnosticCode.AT208,
15704
15713
  message: `Note string is out of range. Available range: 1-${this._state.currentStaff.tuning.length}`,
15705
15714
  severity: AlphaTexDiagnosticsSeverity.Error,
15706
- start: noteValue.end,
15707
- end: noteValue.end
15715
+ start: node.noteString.start,
15716
+ end: node.noteString.end
15708
15717
  });
15709
15718
  return;
15710
15719
  }
15711
- note.string = this._state.currentStaff.tuning.length - (noteString - 1);
15720
+ note.string = this._state.currentStaff.tuning.length - (frettedNoteString - 1);
15712
15721
  if (!isTie) note.fret = numericValue;
15713
15722
  break;
15714
15723
  case AlphaTexStaffNoteKind.Articulation:
@@ -15735,6 +15744,29 @@
15735
15744
  this._state.articulationUniqueIdToIndex.set(articulationValue, articulationIndex);
15736
15745
  }
15737
15746
  note.percussionArticulation = articulationIndex;
15747
+ if (node.noteString) {
15748
+ const percussionNoteString = node.noteString.value;
15749
+ if (percussionNoteString < 1 || percussionNoteString > this._state.currentStaff.tuning.length) {
15750
+ this.addSemanticDiagnostic({
15751
+ code: AlphaTexDiagnosticCode.AT208,
15752
+ message: `Note string is out of range. Available range: 1-${this._state.currentStaff.tuning.length}`,
15753
+ severity: AlphaTexDiagnosticsSeverity.Error,
15754
+ start: node.noteString.start,
15755
+ end: node.noteString.end
15756
+ });
15757
+ return;
15758
+ }
15759
+ note.string = this._state.currentStaff.tuning.length - (percussionNoteString - 1);
15760
+ } else {
15761
+ for (let i = 0; i < this._state.currentStaff.tuning.length; i++) {
15762
+ const s = this._state.currentStaff.tuning.length - i;
15763
+ if (!beat.noteStringLookup.has(s)) {
15764
+ note.string = s;
15765
+ break;
15766
+ }
15767
+ }
15768
+ if (Number.isNaN(note.string)) note.string = this._state.currentStaff.tuning.length;
15769
+ }
15738
15770
  break;
15739
15771
  }
15740
15772
  beat.addNote(note);
@@ -15752,6 +15784,7 @@
15752
15784
  switch (staffNoteKind) {
15753
15785
  case AlphaTexStaffNoteKind.Pitched:
15754
15786
  staff.isPercussion = false;
15787
+ staff.showTablature = false;
15755
15788
  staff.stringTuning.reset();
15756
15789
  if (!this._state.staffHasExplicitDisplayTransposition.has(staff)) staff.displayTranspositionPitch = 0;
15757
15790
  break;
@@ -15763,6 +15796,14 @@
15763
15796
  case AlphaTexStaffNoteKind.Articulation:
15764
15797
  staff.isPercussion = true;
15765
15798
  staff.stringTuning.reset();
15799
+ staff.stringTuning.tunings = [
15800
+ 0,
15801
+ 0,
15802
+ 0,
15803
+ 0,
15804
+ 0,
15805
+ 0
15806
+ ];
15766
15807
  if (!this._state.staffHasExplicitDisplayTransposition.has(staff)) staff.displayTranspositionPitch = 0;
15767
15808
  break;
15768
15809
  }
@@ -15799,7 +15840,15 @@
15799
15840
  const program = staff.track.playbackInfo.program;
15800
15841
  if (!this._state.staffTuningApplied.has(staff) && !this._state.staffHasExplicitTuning.has(staff)) {
15801
15842
  staff.stringTuning.reset();
15802
- if (program === 15) staff.stringTuning.tunings = Tuning.getDefaultTuningFor(6).tunings;
15843
+ if (staff.isPercussion) staff.stringTuning.tunings = [
15844
+ 0,
15845
+ 0,
15846
+ 0,
15847
+ 0,
15848
+ 0,
15849
+ 0
15850
+ ];
15851
+ else if (program === 15) staff.stringTuning.tunings = Tuning.getDefaultTuningFor(6).tunings;
15803
15852
  else if (program >= 24 && program <= 31) staff.stringTuning.tunings = Tuning.getDefaultTuningFor(6).tunings;
15804
15853
  else if (program >= 32 && program <= 39) {
15805
15854
  staff.stringTuning.tunings = [
@@ -15991,7 +16040,6 @@
15991
16040
  }
15992
16041
  applyPercussionStaff(staff) {
15993
16042
  staff.isPercussion = true;
15994
- staff.showTablature = false;
15995
16043
  staff.track.playbackInfo.program = 0;
15996
16044
  }
15997
16045
  startNewTrack() {
@@ -18821,8 +18869,7 @@
18821
18869
  if ((flags & 8) !== 0) this.readNoteEffects(track, voice, beat, newNote);
18822
18870
  if (bar.staff.isPercussion) {
18823
18871
  newNote.percussionArticulation = Gp3To5Importer._gp5PercussionInstrumentMap.has(newNote.fret) ? Gp3To5Importer._gp5PercussionInstrumentMap.get(newNote.fret) : newNote.fret;
18824
- newNote.string = -1;
18825
- newNote.fret = -1;
18872
+ newNote.fret = NaN;
18826
18873
  }
18827
18874
  if (swapAccidentals) {
18828
18875
  const accidental = ModelUtils.computeAccidental(bar.keySignature, NoteAccidentalMode.Default, newNote.realValueWithoutHarmonic, false);
@@ -20027,8 +20074,6 @@
20027
20074
  this._articulationByName = /* @__PURE__ */ new Map();
20028
20075
  const track = new Track();
20029
20076
  track.ensureStaveCount(1);
20030
- const staff = track.staves[0];
20031
- staff.showStandardNotation = true;
20032
20077
  const trackId = node.getAttribute("id");
20033
20078
  for (const c of node.childElements()) switch (c.localName) {
20034
20079
  case "Name":
@@ -20291,7 +20336,6 @@
20291
20336
  staff.stringTuning.name = c.innerText;
20292
20337
  break;
20293
20338
  }
20294
- if (!staff.isPercussion) staff.showTablature = true;
20295
20339
  break;
20296
20340
  case "DiagramCollection":
20297
20341
  case "ChordCollection":
@@ -20425,11 +20469,7 @@
20425
20469
  const tuningParts = GpifParser._splitSafe(node.findChildElement("Pitches")?.innerText);
20426
20470
  const tuning = new Array(tuningParts.length);
20427
20471
  for (let i = 0; i < tuning.length; i++) tuning[tuning.length - 1 - i] = GpifParser._parseIntSafe(tuningParts[i], 0);
20428
- for (const staff of track.staves) {
20429
- staff.stringTuning.tunings = tuning;
20430
- staff.showStandardNotation = true;
20431
- staff.showTablature = true;
20432
- }
20472
+ for (const staff of track.staves) staff.stringTuning.tunings = tuning;
20433
20473
  break;
20434
20474
  case "DiagramCollection":
20435
20475
  case "ChordCollection":
@@ -21449,7 +21489,7 @@
21449
21489
  break;
21450
21490
  case "Octave":
21451
21491
  note.octave = GpifParser._parseIntSafe(c.findChildElement("Number")?.innerText, 0);
21452
- if (note.tone === -1) note.tone = 0;
21492
+ if (Number.isNaN(note.tone)) note.tone = 0;
21453
21493
  break;
21454
21494
  case "Tone":
21455
21495
  note.tone = GpifParser._parseIntSafe(c.findChildElement("Step")?.innerText, 0);
@@ -21665,10 +21705,8 @@
21665
21705
  if (this._notesOfBeat.has(beatId)) {
21666
21706
  for (const noteId of this._notesOfBeat.get(beatId)) if (noteId !== GpifParser._invalidId) {
21667
21707
  const note = NoteCloner.clone(this._noteById.get(noteId));
21668
- if (staff.isPercussion) {
21669
- note.fret = -1;
21670
- note.string = -1;
21671
- } else note.percussionArticulation = -1;
21708
+ if (staff.isPercussion) note.fret = NaN;
21709
+ else note.percussionArticulation = NaN;
21672
21710
  beat.addNote(note);
21673
21711
  if (this._tappedNotes.has(noteId)) beat.tap = true;
21674
21712
  }
@@ -21768,7 +21806,7 @@
21768
21806
  if (trackIndex < score.tracks.length) {
21769
21807
  const track = score.tracks[trackIndex];
21770
21808
  for (const staff of track.staves) {
21771
- if (!staff.isPercussion) staff.showTablature = trackConfig.showTablature;
21809
+ staff.showTablature = trackConfig.showTablature;
21772
21810
  staff.showStandardNotation = trackConfig.showStandardNotation;
21773
21811
  staff.showSlash = trackConfig.showSlash;
21774
21812
  staff.showNumbered = trackConfig.showNumbered;
@@ -23732,7 +23770,10 @@
23732
23770
  break;
23733
23771
  case "percussion":
23734
23772
  bar.clef = Clef.Neutral;
23735
- if (bar.index === 0) bar.staff.isPercussion = true;
23773
+ if (bar.index === 0) {
23774
+ bar.staff.isPercussion = true;
23775
+ bar.staff.showTablature = false;
23776
+ }
23736
23777
  break;
23737
23778
  case "tab":
23738
23779
  bar.clef = Clef.G2;
@@ -58831,8 +58872,15 @@
58831
58872
  }
58832
58873
  doLayout() {
58833
58874
  const n = this._note;
58834
- let fret = n.fret - n.beat.voice.bar.staff.transpositionPitch;
58835
- if (n.harmonicType === HarmonicType.Natural && n.harmonicValue !== 0) fret = n.harmonicValue - n.beat.voice.bar.staff.transpositionPitch;
58875
+ let fret;
58876
+ if (n.isStringed) {
58877
+ fret = n.fret - n.beat.voice.bar.staff.transpositionPitch;
58878
+ if (n.harmonicType === HarmonicType.Natural && n.harmonicValue !== 0) fret = n.harmonicValue - n.beat.voice.bar.staff.transpositionPitch;
58879
+ } else {
58880
+ const articulation = PercussionMapper.getArticulation(n);
58881
+ if (articulation) fret = articulation.id;
58882
+ else fret = n.percussionArticulation;
58883
+ }
58836
58884
  if (!n.isTieDestination) {
58837
58885
  this._noteString = n.isDead ? "x" : fret.toString();
58838
58886
  if (n.isGhost) this._noteString = `(${this._noteString})`;
@@ -65768,7 +65816,7 @@
65768
65816
  const beat = this.container.beat;
65769
65817
  const lineCount = this.renderer.bar.staff.standardNotationLineCount;
65770
65818
  let steps;
65771
- if (beat.restDisplayTone !== -1 && beat.restDisplayOctave !== -1) steps = AccidentalHelper.calculateRestDisplaySteps(sr.bar, beat.restDisplayTone, beat.restDisplayOctave);
65819
+ if (!Number.isNaN(beat.restDisplayTone) && !Number.isNaN(beat.restDisplayOctave)) steps = AccidentalHelper.calculateRestDisplaySteps(sr.bar, beat.restDisplayTone, beat.restDisplayOctave);
65772
65820
  else {
65773
65821
  steps = Math.ceil((lineCount - 1) / 2) * 2;
65774
65822
  if (beat.duration === Duration.Whole && lineCount !== 1 && lineCount !== 3) steps -= 2;
@@ -67511,10 +67559,6 @@
67511
67559
  get cascadePriority() {
67512
67560
  return 1;
67513
67561
  }
67514
- constructor(effectBands) {
67515
- super(effectBands);
67516
- this.hideOnPercussionTrack = true;
67517
- }
67518
67562
  canCreate(track, staff) {
67519
67563
  return staff.showTablature && staff.tuning.length > 0 && super.canCreate(track, staff);
67520
67564
  }
@@ -68587,7 +68631,7 @@
68587
68631
  _writeNote(n) {
68588
68632
  this._writeComments(n.leadingComments);
68589
68633
  this._writeValue(n.noteValue);
68590
- this._writeToken(n.noteStringDot, false);
68634
+ this._writeToken(n.noteStringSeparator, false);
68591
68635
  this._writeValue(n.noteString);
68592
68636
  if (n.noteEffects) this._writeProperties(n.noteEffects, false);
68593
68637
  this._writeComments(n.trailingComments);
@@ -68731,6 +68775,9 @@
68731
68775
  case AlphaTexNodeType.Dot:
68732
68776
  this._writer.write(".");
68733
68777
  break;
68778
+ case AlphaTexNodeType.At:
68779
+ this._writer.write("@");
68780
+ break;
68734
68781
  case AlphaTexNodeType.Backslash:
68735
68782
  this._writer.write("\\");
68736
68783
  break;
@@ -68916,11 +68963,20 @@
68916
68963
  text: ""
68917
68964
  }
68918
68965
  };
68919
- if (data.isPercussion) note.noteValue = {
68920
- nodeType: AlphaTexNodeType.String,
68921
- text: PercussionMapper.getArticulationName(data)
68922
- };
68923
- else if (data.isPiano) note.noteValue = {
68966
+ if (data.isPercussion) {
68967
+ note.noteValue = {
68968
+ nodeType: AlphaTexNodeType.String,
68969
+ text: PercussionMapper.getArticulationName(data)
68970
+ };
68971
+ if (!Number.isNaN(data.string)) {
68972
+ note.noteStringSeparator = { nodeType: AlphaTexNodeType.At };
68973
+ const stringNumber = data.beat.voice.bar.staff.tuning.length - data.string + 1;
68974
+ note.noteString = {
68975
+ nodeType: AlphaTexNodeType.Number,
68976
+ value: stringNumber
68977
+ };
68978
+ }
68979
+ } else if (data.isPiano) note.noteValue = {
68924
68980
  nodeType: AlphaTexNodeType.Ident,
68925
68981
  text: Tuning.getTextForTuning(data.realValueWithoutHarmonic, true)
68926
68982
  };
@@ -68929,7 +68985,7 @@
68929
68985
  nodeType: AlphaTexNodeType.Number,
68930
68986
  value: data.fret
68931
68987
  };
68932
- note.noteStringDot = { nodeType: AlphaTexNodeType.Dot };
68988
+ note.noteStringSeparator = { nodeType: AlphaTexNodeType.Dot };
68933
68989
  const stringNumber = data.beat.voice.bar.staff.tuning.length - data.string + 1;
68934
68990
  note.noteString = {
68935
68991
  nodeType: AlphaTexNodeType.Number,
@@ -69501,6 +69557,7 @@
69501
69557
  this._writeSimplePropertyNode(properties, "Midi", "Number", note.realValue.toString());
69502
69558
  if (note.showStringNumber) this._writeSimplePropertyNode(properties, "ShowStringNumber", "Enable", null);
69503
69559
  }
69560
+ if (note.isPercussion) this._writeSimplePropertyNode(properties, "String", "String", (note.string - 1).toString());
69504
69561
  if (note.isPiano) {
69505
69562
  this._writeSimplePropertyNode(properties, "Octave", "Number", note.octave.toString());
69506
69563
  this._writeSimplePropertyNode(properties, "Tone", "Step", note.tone.toString());