smoosic 1.0.8 → 1.0.10

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 (55) hide show
  1. package/build/html/loading-unittest.html +2 -4
  2. package/build/html/smoosic.html +0 -1
  3. package/build/smoosic.js +19 -19
  4. package/package.json +2 -3
  5. package/release/smoosic.js +19 -19
  6. package/src/application/exports.ts +3 -2
  7. package/{build → src/common}/midi-parser.js +1 -1
  8. package/src/render/sui/scoreView.ts +8 -0
  9. package/src/render/vex/vxMeasure.ts +1 -1
  10. package/src/smo/data/measure.ts +8 -3
  11. package/src/smo/data/noteModifiers.ts +3 -3
  12. package/src/smo/data/score.ts +6 -0
  13. package/src/ui/dialogs/fileDialogs.ts +1 -1
  14. package/src/ui/dialogs/preferences.ts +8 -2
  15. package/types/src/application/exports.d.ts +526 -525
  16. package/types/src/application/exports.d.ts.map +1 -1
  17. package/types/src/common/midi-parser.d.ts +39 -0
  18. package/types/src/common/midi-parser.d.ts.map +1 -0
  19. package/types/src/common/vex.d.ts +2 -0
  20. package/types/src/common/vex.d.ts.map +1 -1
  21. package/types/src/render/sui/scoreViewOperations.d.ts +3 -3
  22. package/types/src/render/sui/scoreViewOperations.d.ts.map +1 -1
  23. package/types/src/render/vex/smoAdapter.d.ts +46 -46
  24. package/types/src/render/vex/vxMeasure.d.ts.map +1 -1
  25. package/types/src/smo/data/measure.d.ts +1 -0
  26. package/types/src/smo/data/measure.d.ts.map +1 -1
  27. package/types/src/smo/data/tuplet.d.ts.map +1 -1
  28. package/types/src/smo/xform/copypaste.d.ts.map +1 -1
  29. package/types/src/smo/xform/operations.d.ts +7 -1
  30. package/types/src/smo/xform/operations.d.ts.map +1 -1
  31. package/types/src/smo/xform/tickDuration.d.ts +6 -0
  32. package/types/src/smo/xform/tickDuration.d.ts.map +1 -1
  33. package/types/src/smo/xform/undo.d.ts.map +1 -1
  34. package/types/src/ui/dialogs/components/baseComponent.d.ts +4 -0
  35. package/types/src/ui/dialogs/components/baseComponent.d.ts.map +1 -1
  36. package/types/src/ui/dialogs/components/rocker.d.ts +4 -0
  37. package/types/src/ui/dialogs/components/rocker.d.ts.map +1 -1
  38. package/types/src/ui/dialogs/customTuplets.d.ts +26 -0
  39. package/types/src/ui/dialogs/customTuplets.d.ts.map +1 -0
  40. package/types/src/ui/menus/beams.d.ts.map +1 -1
  41. package/types/src/ui/menus/manager.d.ts.map +1 -1
  42. package/types/src/ui/menus/menu.d.ts +136 -136
  43. package/types/src/ui/menus/tuplets.d.ts +14 -0
  44. package/types/src/ui/menus/tuplets.d.ts.map +1 -0
  45. package/types/src/ui/ribbonLayout/default/defaultRibbon.d.ts.map +1 -1
  46. package/types/tests/file-load.d.ts +1 -1
  47. package/types/tests/file-load.d.ts.map +1 -1
  48. package/build/html/penLoadFile.html +0 -50
  49. package/build/html/penLoadXml.html +0 -51
  50. package/release/html/asyncPen.html +0 -230
  51. package/release/html/penLoadFile.html +0 -50
  52. package/release/html/penLoadXml.html +0 -51
  53. package/release/html/syncPen.html +0 -149
  54. package/tests/file-load.ts +0 -62
  55. package/tests/types/qunit.d.ts +0 -76
@@ -4,6 +4,7 @@
4
4
  // vexflow interface
5
5
  import { TextFormatter } from '../common/textformatter';
6
6
  import { VexFlow } from '../common/vex';
7
+ import { parseMidi } from '../common/midi-parser';
7
8
  import { SuiApplication } from './application';
8
9
  import { SuiEventHandler } from './eventHandler';
9
10
  import { SuiExceptionHandler } from '../ui/exceptions';
@@ -134,7 +135,6 @@ import { SmoScore, engravingFontTypes, isEngravingFont } from '../smo/data/score
134
135
  import { UndoBuffer } from '../smo/xform/undo';
135
136
  import { SmoNote } from '../smo/data/note';
136
137
  // import { SmoDuration } from '../smo/xform/tickDuration';
137
- import { createLoadTests } from '../../tests/file-load';
138
138
  import { SmoStaffHairpin, StaffModifierBase, SmoInstrument, SmoSlur, SmoTie, SmoStaffTextBracket,
139
139
  SmoTabStave, SmoPedalMarking, staffModifierDynamicCtorInit
140
140
  } from '../smo/data/staffModifiers';
@@ -174,6 +174,7 @@ export * from './dynamicInit';
174
174
  export * from './dom';
175
175
  export * from './eventHandler';
176
176
  export * from './exports';
177
+ export * from '../common/midi-parser';
177
178
  export * from './generateVexTests';
178
179
  export * from './keyCommands';
179
180
  export * from '../common/htmlHelpers';
@@ -335,6 +336,7 @@ export const Smo = {
335
336
  SmoConfiguration,
336
337
  SuiApplication,
337
338
  dynamicCtorInit,
339
+ parseMidi,
338
340
  SuiDom, SuiEventHandler, SuiExceptionHandler,
339
341
  Qwerty, SuiHelp, SmoTranslationEditor, ModalEventHandler,
340
342
  // Ribbon buttons
@@ -415,7 +417,6 @@ SuiPitchComposite,
415
417
  cardBeamsAndStemsDirectionHtmlEn, cardBeamsAndStemsGroupingHtmlEn,
416
418
  cardMeasuresAddDeleteHtmlEn, cardVoicesCreateDeleteHtmlEn, cardPartAddDeleteHtmlEn,
417
419
  getClass,
418
- createLoadTests,
419
420
  // utilities
420
421
  buildDom, addFileLink, InputTrapper, draggable, closeDialogPromise, getDomContainer, createTopDomContainer,
421
422
  renderVexTests
@@ -2,7 +2,7 @@
2
2
  // Copyright (c) 2010, Matt Westcott & Ben Firshman
3
3
  // https://github.com/NHQ/midi-file-parser/
4
4
 
5
- function parseMidi(data) {
5
+ export function parseMidi(data) {
6
6
  var p = new Parser(data)
7
7
 
8
8
  var headerChunk = p.readChunk()
@@ -723,6 +723,14 @@ export abstract class SuiScoreView {
723
723
  serialized.keySignature = concertKey;
724
724
  const rmeasure = SmoMeasure.deserialize(serialized);
725
725
  rmeasure.svg = svg;
726
+ // If this is a tranposed score, the displayed score needs to be in 'C'.
727
+ // We do this step last since serialize/unserialize work in a pitch transposed
728
+ // for the instrument
729
+ if (this.score.preferences.transposingScore && !this.score.isPartExposed()) {
730
+ rmeasure.transposeToOffset(-1 * xpose, 'c');
731
+ rmeasure.keySignature = 'c';
732
+ rmeasure.transposeIndex = 0;
733
+ }
726
734
  const selector: SmoSelector = { staff: staffId, measure: i, voice: 0, tick: 0, pitches: [] };
727
735
  this.score.replaceMeasure(selector, rmeasure);
728
736
  });
@@ -378,7 +378,7 @@ export class VxMeasure implements VxMeasureIf {
378
378
  continue;
379
379
  }
380
380
  const traverseTupletTree = ( parentTuplet: SmoTuplet): void => {
381
- const vexNotes = [];
381
+ const vexNotes: Note[] = [];
382
382
  for (let smoNote of this.smoMeasure.tupletNotes(parentTuplet)) {
383
383
  vexNotes.push(this.noteToVexMap[smoNote.attrs.id]);
384
384
  }
@@ -667,7 +667,12 @@ export class SmoMeasure implements SmoMeasureParams, TickMappable {
667
667
  let startIndex: number | null = null;
668
668
  params.voices.forEach((voice) => {
669
669
  voice.notes.forEach((note, index) => {
670
- if (note.isTuplet && note.tupletId === tupJson.attrs.id) {
670
+ // backwards-compatibiliity, some scores don't have attrs on tuplet
671
+ if (typeof(tupJson.id) === 'string') {
672
+ tupJson.attrs = { type: 'SmoTuplet', id: tupJson.id };
673
+ }
674
+ const id = tupJson.attrs.id;
675
+ if (note.isTuplet && note.tupletId === id) {
671
676
  tupletNotes.push(note);
672
677
  //we cannot trust startIndex coming from legacy json
673
678
  //we need to count index of the first note in the tuplet
@@ -1562,8 +1567,8 @@ export class SmoMeasure implements SmoMeasureParams, TickMappable {
1562
1567
  }
1563
1568
 
1564
1569
  addNthEnding(ending: SmoVolta) {
1565
- const mods = [];
1566
- this.modifiers.forEach((modifier) => {
1570
+ const mods: SmoMeasureModifierBase[] = [];
1571
+ this.modifiers.forEach((modifier: SmoMeasureModifierBase) => {
1567
1572
  if (modifier.ctor !== 'SmoVolta' || (modifier as SmoVolta).startBar !== ending.startBar ||
1568
1573
  (modifier as SmoVolta).endBar !== ending.endBar) {
1569
1574
  mods.push(modifier);
@@ -973,9 +973,9 @@ export class SmoLyric extends SmoNoteModifierBase {
973
973
  // var str = this._text;
974
974
  const reg = /^([A-Z|a-z|0-9|]+)/g;
975
975
  let mmm = str.match(reg);
976
- let tokeType = '';
977
- let toke = '';
978
- const tokens = [];
976
+ let tokeType: string = '';
977
+ let toke: string = '';
978
+ const tokens: string[] = [];
979
979
  while (str.length) {
980
980
  if (!mmm) {
981
981
  tokeType = str[0];
@@ -667,6 +667,11 @@ export class SmoScore {
667
667
  params.audioSettings = SmoScoreModifierBase.deserialize(jsonObj.audioSettings);
668
668
  }
669
669
  params.preferences.transposingScore = params.preferences.transposingScore ?? false;
670
+ if (jsonObj.staves && jsonObj.staves.length === 1) {
671
+ // Ignore serialized tranpose of score if there is only a single part.
672
+ params.preferences.transposingScore = false;
673
+ }
674
+
670
675
  params.preferences.hideEmptyLines = params.preferences.hideEmptyLines ?? false;
671
676
  let renumberingMap: Record<number, number> = { 0: 0 };
672
677
  if (jsonObj.columnAttributeMap && jsonObj.columnAttributeMap.renumberingMap) {
@@ -1118,6 +1123,7 @@ export class SmoScore {
1118
1123
  // Need to do this since score serialization doesn't include TS in each measure
1119
1124
  jsonObj.timeSignature = measure.timeSignature.serialize();
1120
1125
  jsonObj.tempo = measure.tempo.serialize();
1126
+ jsonObj.tupletTrees = []; // assume no tuplets in a prototype measure
1121
1127
  let newMeasure = SmoMeasure.deserialize(jsonObj);
1122
1128
  newMeasure.measureNumber = measure.measureNumber;
1123
1129
  newMeasure.clef = parameters.measureInstrumentMap[0].clef as Clef;
@@ -12,9 +12,9 @@ import { SmoToMidi } from '../../smo/midi/smoToMidi';
12
12
  import { MidiToSmo } from '../../smo/midi/midiToSmo';
13
13
  import { PromiseHelpers } from '../../common/promiseHelpers';
14
14
  import { SmoToVex } from '../../render/vex/toVex';
15
+ import { parseMidi } from '../../common/midi-parser.js';
15
16
  declare var $: any;
16
17
  // declare var MidiParser: any;
17
- declare var parseMidi: any;
18
18
  declare var JSZip: any;
19
19
 
20
20
  /**
@@ -16,10 +16,12 @@ const deepCopy = (x: any) => JSON.parse(JSON.stringify(x));
16
16
  export class SuiScorePreferencesAdapter extends SuiComponentAdapter {
17
17
  preferences: SmoScorePreferences;
18
18
  backup: SmoScorePreferences;
19
+ originalTransposeScore: boolean;
19
20
  constructor(view: SuiScoreViewOperations) {
20
21
  super(view);
21
22
  this.preferences = new SmoScorePreferences(view.score.preferences);
22
23
  this.backup = JSON.parse(JSON.stringify(this.preferences));
24
+ this.originalTransposeScore = this.preferences.transposingScore;
23
25
  }
24
26
  get autoAdvance(): boolean {
25
27
  return this.preferences.autoAdvance;
@@ -77,8 +79,12 @@ export class SuiScorePreferencesAdapter extends SuiComponentAdapter {
77
79
  await this.view.updateScorePreferences(this.backup);
78
80
  }
79
81
  }
80
- commit() {
81
- return PromiseHelpers.emptyPromise();
82
+ async commit() {
83
+ if (this.originalTransposeScore !== this.preferences.transposingScore) {
84
+ await this.view.refreshViewport();
85
+ return;
86
+ }
87
+ return;
82
88
  }
83
89
  }
84
90
  /**