Skip to content

Commit 98bb6b6

Browse files
authored
feat(musicxml): Improve beam and bar handling (#2035)
1 parent 5f27345 commit 98bb6b6

21 files changed

Lines changed: 39 additions & 81 deletions

src.compiler/csharp/CSharpAstTransformer.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4108,7 +4108,7 @@ export default class CSharpAstTransformer {
41084108
castExpression.type.parent = castExpression;
41094109
castExpression.expression.parent = castExpression;
41104110

4111-
return paren;
4111+
return this.makeTruthy(paren);
41124112
}
41134113

41144114
const isValueTypeNotNullSmartCast = this._context.isValueTypeNotNullSmartCast(expression);
@@ -4122,21 +4122,21 @@ export default class CSharpAstTransformer {
41224122
member: 'Value'
41234123
} as cs.MemberAccessExpression;
41244124
}
4125-
return {
4125+
return this.makeTruthy({
41264126
parent: parent,
41274127
nodeType: cs.SyntaxKind.NonNullExpression,
41284128
tsNode: expression,
41294129
expression: node
4130-
} as cs.NonNullExpression;
4130+
} as cs.NonNullExpression);
41314131
}
41324132

41334133
if (this._context.isNonNullSmartCast(expression)) {
4134-
return {
4134+
return this.makeTruthy({
41354135
parent: parent,
41364136
nodeType: cs.SyntaxKind.NonNullExpression,
41374137
tsNode: expression,
41384138
expression: node
4139-
} as cs.NonNullExpression;
4139+
} as cs.NonNullExpression);
41404140
}
41414141
}
41424142
}

src.compiler/csharp/CSharpEmitterContext.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -659,7 +659,6 @@ export default class CSharpEmitterContext {
659659
case cs.SyntaxKind.ArrayTupleNode:
660660
return true;
661661
}
662-
663662
}
664663
return false;
665664
}
@@ -1459,7 +1458,7 @@ export default class CSharpEmitterContext {
14591458
return false;
14601459
}
14611460

1462-
const contextualType = this.typeChecker.getContextualType(expression);
1461+
const contextualType = this.typeChecker.getTypeAtLocation(expression);
14631462
if (!contextualType) {
14641463
return false;
14651464
}
@@ -1479,12 +1478,7 @@ export default class CSharpEmitterContext {
14791478
symbol = this.typeChecker.getAliasedSymbol(symbol);
14801479
}
14811480

1482-
if (
1483-
symbol.flags & ts.SymbolFlags.Interface ||
1484-
symbol.flags & ts.SymbolFlags.Class ||
1485-
symbol.flags & ts.SymbolFlags.BlockScopedVariable ||
1486-
symbol.flags & ts.SymbolFlags.FunctionScopedVariable
1487-
) {
1481+
if (symbol.flags & ts.SymbolFlags.Interface || symbol.flags & ts.SymbolFlags.Class) {
14881482
return false;
14891483
}
14901484

@@ -1493,7 +1487,11 @@ export default class CSharpEmitterContext {
14931487
return false;
14941488
}
14951489

1496-
return contextualType === this.typeChecker.getNonNullableType(declaredType);
1490+
return (
1491+
this.typeChecker.getNonNullableType(declaredType) === this.typeChecker.getNonNullableType(contextualType) &&
1492+
this.isNullableType(declaredType) &&
1493+
!this.isNullableType(contextualType)
1494+
);
14971495
}
14981496

14991497
public getSmartCastType(expression: ts.Expression): ts.Type | null {

src/importer/MusicXmlImporter.ts

Lines changed: 27 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class StaffContext {
5454
public tieStartIds!: Map<string, Note>;
5555
public slideOrigins: Map<string, Note> = new Map<string, Note>();
5656
public transpose: number = 0;
57+
public isExplicitlyBeamed = false;
5758

5859
constructor() {
5960
this.tieStarts = new Set<Note>();
@@ -177,8 +178,6 @@ export class MusicXmlImporter extends ScoreImporter {
177178
private _indexToTrackInfo: Map<number, TrackInfo> = new Map<number, TrackInfo>();
178179
private _staffToContext: Map<Staff, StaffContext> = new Map<Staff, StaffContext>();
179180

180-
private _previousMasterBarNumber = -1;
181-
private _implicitBars: number = 0;
182181
private _divisionsPerQuarterNote: number = 1;
183182
private _currentDynamics = DynamicValue.F;
184183

@@ -368,6 +367,7 @@ export class MusicXmlImporter extends ScoreImporter {
368367
}
369368

370369
private parseTimewise(element: XmlNode): void {
370+
let index = 0;
371371
for (const c of element.childElements()) {
372372
switch (c.localName) {
373373
case 'credit':
@@ -388,7 +388,8 @@ export class MusicXmlImporter extends ScoreImporter {
388388
this.parseWork(c);
389389
break;
390390
case 'measure':
391-
this.parseTimewiseMeasure(c);
391+
this.parseTimewiseMeasure(c, index);
392+
index++;
392393
break;
393394
}
394395
}
@@ -885,25 +886,24 @@ export class MusicXmlImporter extends ScoreImporter {
885886
return;
886887
}
887888
const track = this._idToTrackInfo.get(id)!.track;
888-
this._previousMasterBarNumber = -1;
889-
this._implicitBars = 0;
890-
889+
let index = 0;
891890
for (const c of element.childElements()) {
892891
switch (c.localName) {
893892
case 'measure':
894-
this.parsePartwiseMeasure(c, track);
893+
this.parsePartwiseMeasure(c, track, index);
894+
index++;
895895
break;
896896
}
897897
}
898898
}
899899

900-
private parsePartwiseMeasure(element: XmlNode, track: Track) {
901-
const masterBar = this.getOrCreateMasterBar(element);
900+
private parsePartwiseMeasure(element: XmlNode, track: Track, index: number) {
901+
const masterBar = this.getOrCreateMasterBar(element, index);
902902
this.parsePartMeasure(element, masterBar, track);
903903
}
904904

905-
private parseTimewiseMeasure(element: XmlNode) {
906-
const masterBar = this.getOrCreateMasterBar(element);
905+
private parseTimewiseMeasure(element: XmlNode, index: number) {
906+
const masterBar = this.getOrCreateMasterBar(element, index);
907907

908908
for (const c of element.childElements()) {
909909
switch (c.localName) {
@@ -914,32 +914,9 @@ export class MusicXmlImporter extends ScoreImporter {
914914
}
915915
}
916916

917-
private getOrCreateMasterBar(element: XmlNode) {
918-
let number = Number.parseInt(element.attributes.get('number')!);
919-
917+
private getOrCreateMasterBar(element: XmlNode, index: number) {
920918
const implicit = element.attributes.get('implicit') === 'yes';
921-
922-
// non-controlling="" Ignored
923-
// text="" Ignored
924-
// width="" Ignored (we cannot handle the unit 'tenths' yet - https://github.com/CoderLine/alphaTab/issues/1949)
925-
926-
// no number specified, assume its the "next" one
927-
if (Number.isNaN(number)) {
928-
if (this._previousMasterBarNumber === -1) {
929-
number = 1;
930-
} else {
931-
number = this._previousMasterBarNumber + 1;
932-
}
933-
this._implicitBars++;
934-
} else if (number === 0) {
935-
// anacrusis
936-
number++;
937-
this._implicitBars++;
938-
} else {
939-
number += this._implicitBars;
940-
}
941-
942-
while (this._score.masterBars.length < number) {
919+
while (this._score.masterBars.length <= index) {
943920
const newMasterBar = new MasterBar();
944921
if (implicit) {
945922
newMasterBar.isAnacrusis = true;
@@ -952,9 +929,7 @@ export class MusicXmlImporter extends ScoreImporter {
952929
}
953930
}
954931

955-
this._previousMasterBarNumber = number;
956-
const masterBar = this._score.masterBars[number - 1];
957-
932+
const masterBar = this._score.masterBars[index];
958933
return masterBar;
959934
}
960935

@@ -1984,8 +1959,8 @@ export class MusicXmlImporter extends ScoreImporter {
19841959
// remember for bars which will be created
19851960
this._keyAllStaves = [keySignature, keySignatureType];
19861961
// apply to potentially created bars
1987-
for(const s of track.staves) {
1988-
if(s.bars.length > masterBar.index) {
1962+
for (const s of track.staves) {
1963+
if (s.bars.length > masterBar.index) {
19891964
s.bars[masterBar.index].keySignature = keySignature;
19901965
s.bars[masterBar.index].keySignatureType = keySignatureType;
19911966
}
@@ -2352,7 +2327,7 @@ export class MusicXmlImporter extends ScoreImporter {
23522327
newBar.keySignatureType = newBar.previousBar!.keySignatureType;
23532328
}
23542329

2355-
if(this._keyAllStaves != null) {
2330+
if (this._keyAllStaves != null) {
23562331
newBar.keySignature = this._keyAllStaves![0];
23572332
newBar.keySignatureType = this._keyAllStaves![1];
23582333
}
@@ -2390,7 +2365,7 @@ export class MusicXmlImporter extends ScoreImporter {
23902365
let beat: Beat | null = null;
23912366
let graceType = GraceType.None;
23922367
let graceDurationInDivisions = 0;
2393-
let beamMode: BeatBeamingMode = BeatBeamingMode.ForceSplitToNext;
2368+
let beamMode: BeatBeamingMode | null = null;
23942369
// let graceTimeStealPrevious = 0;
23952370
// let graceTimeStealFollowing = 0;
23962371

@@ -2503,7 +2478,14 @@ export class MusicXmlImporter extends ScoreImporter {
25032478

25042479
const newBeat = new Beat();
25052480
beat = newBeat;
2506-
newBeat.beamingMode = beamMode;
2481+
if (beamMode === null) {
2482+
newBeat.beamingMode = this.getStaffContext(staff).isExplicitlyBeamed
2483+
? BeatBeamingMode.ForceSplitToNext
2484+
: BeatBeamingMode.Auto;
2485+
} else {
2486+
newBeat.beamingMode = beamMode;
2487+
this.getStaffContext(staff).isExplicitlyBeamed = true;
2488+
}
25072489
newBeat.isEmpty = false;
25082490
newBeat.dynamics = this._currentDynamics;
25092491
if (this._isBeatSlash) {
@@ -2626,11 +2608,7 @@ export class MusicXmlImporter extends ScoreImporter {
26262608
break;
26272609
// case 'tie': Ignored -> "tie" is sound, "tied" is notation
26282610
case 'instrument':
2629-
if (note === null) {
2630-
Logger.warning('MusicXML', 'Malformed MusicXML, missing pitch or unpitched for note');
2631-
} else {
2632-
instrumentId = c.getAttribute('id', '');
2633-
}
2611+
instrumentId = c.getAttribute('id', '');
26342612
break;
26352613

26362614
// case 'footnote': Ignored
-20.8 KB
Loading
347 Bytes
Loading
1.06 KB
Loading
531 Bytes
Loading
1.34 KB
Loading
-12.9 KB
Loading
-5.88 KB
Loading

0 commit comments

Comments
 (0)