@@ -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
0 commit comments