@@ -54,6 +54,7 @@ import { Rasgueado } from '@src/model/Rasgueado';
5454import { Direction } from '@src/model/Direction' ;
5555import { ModelUtils } from '@src/model/ModelUtils' ;
5656import { BackingTrack } from '@src/model/BackingTrack' ;
57+ import { Tuning } from '@src/model/Tuning' ;
5758
5859/**
5960 * This structure represents a duration within a gpif
@@ -638,7 +639,7 @@ export class GpifParser {
638639 track . playbackInfo . isMute = state === 'Mute' ;
639640 break ;
640641 case 'PartSounding' :
641- this . parsePartSounding ( track , c ) ;
642+ this . parsePartSounding ( trackId , track , c ) ;
642643 break ;
643644 case 'Staves' :
644645 this . parseStaves ( track , c ) ;
@@ -1207,14 +1208,18 @@ export class GpifParser {
12071208 }
12081209 }
12091210
1210- private parsePartSounding ( track : Track , node : XmlNode ) : void {
1211+ private parsePartSounding ( trackId : string , track : Track , node : XmlNode ) : void {
12111212 for ( const c of node . childElements ( ) ) {
12121213 switch ( c . localName ) {
12131214 case 'TranspositionPitch' :
12141215 for ( const staff of track . staves ) {
12151216 staff . displayTranspositionPitch = GpifParser . parseIntSafe ( c . innerText , 0 ) ;
12161217 }
12171218 break ;
1219+ case 'NominalKey' :
1220+ const transposeIndex = Math . max ( 0 , Tuning . noteNames . indexOf ( c . innerText ) ) ;
1221+ this . _transposeKeySignaturePerTrack . set ( trackId , transposeIndex ) ;
1222+ break ;
12181223 }
12191224 }
12201225 }
@@ -1242,14 +1247,10 @@ export class GpifParser {
12421247
12431248 // the chromatic transpose also causes an alternative key signature to be adjusted
12441249 // In Guitar Pro this feature is hidden in the track properties (more -> Transposition tonality -> 'C played as:' ).
1245- const transposeIndex = GpifParser . flooredDivision ( pitch , 12 ) ;
1250+ const transposeIndex = ModelUtils . flooredDivision ( pitch , 12 ) ;
12461251 this . _transposeKeySignaturePerTrack . set ( trackId , transposeIndex ) ;
12471252 }
12481253
1249- private static flooredDivision ( a : number , b : number ) : number {
1250- return a - b * Math . floor ( a / b ) ;
1251- }
1252-
12531254 private parseRSE ( track : Track , node : XmlNode ) : void {
12541255 for ( const c of node . childElements ( ) ) {
12551256 switch ( c . localName ) {
@@ -2612,7 +2613,7 @@ export class GpifParser {
26122613 keySignature = [ KeySignature . C , KeySignatureType . Major ] ;
26132614 if ( this . _transposeKeySignaturePerTrack . has ( trackIndexToTrackId [ 0 ] ) ) {
26142615 keySignature = [
2615- GpifParser . transposeKey (
2616+ ModelUtils . transposeKey (
26162617 keySignature [ 0 ] ,
26172618 this . _transposeKeySignaturePerTrack . get ( trackIndexToTrackId [ 0 ] ) !
26182619 ) ,
@@ -2637,7 +2638,7 @@ export class GpifParser {
26372638 keySignature = this . _keySignatures . get ( masterBarIndex ) ! ;
26382639 if ( this . _transposeKeySignaturePerTrack . has ( trackIndexToTrackId [ trackIndex ] ) ) {
26392640 keySignature = [
2640- GpifParser . transposeKey (
2641+ ModelUtils . transposeKey (
26412642 keySignature [ 0 ] ,
26422643 this . _transposeKeySignaturePerTrack . get ( trackIndexToTrackId [ trackIndex ] ) !
26432644 ) ,
@@ -2718,7 +2719,7 @@ export class GpifParser {
27182719 keySignature = [ KeySignature . C , KeySignatureType . Major ] ;
27192720 if ( this . _transposeKeySignaturePerTrack . has ( trackIndexToTrackId [ trackIndex ] ) ) {
27202721 keySignature = [
2721- GpifParser . transposeKey (
2722+ ModelUtils . transposeKey (
27222723 keySignature [ 0 ] ,
27232724 this . _transposeKeySignaturePerTrack . get ( trackIndexToTrackId [ trackIndex ] ) !
27242725 ) ,
@@ -2804,55 +2805,4 @@ export class GpifParser {
28042805 }
28052806 }
28062807 }
2807-
2808- private static transposeKey ( keySignature : KeySignature , transpose : number ) : KeySignature {
2809- return GpifParser . keyTransposeTable [ transpose ] [ keySignature + 7 ] ;
2810- }
2811-
2812- // NOTE: haven't figured out yet what exact formula is applied when transposing key signatures
2813- // this table is simply created by checking the Guitar Pro behavior,
2814-
2815- // The table is organized as [<transpose>][<key signature>] to match the table above
2816- // it's also easier to read as we list every key signature per row, transposed by the same value
2817- // this gives typically just a shifted list according to the transpose (with some special treatments)
2818-
2819- private static readonly keyTransposeTable : KeySignature [ ] [ ] = GpifParser . translateKeyTransposeTable ( [
2820- /* Cb Gb Db Ab Eb Bb F C G D A E B F C# */
2821- /* C 0 */ [ '7b' , '6b' , '5b' , '4b' , '3b' , '2b' , '1b' , '0#' , '1#' , '2#' , '3#' , '4#' , '5#' , '6#' , '7#' ] ,
2822- /* Db 1 */ [ '2b' , '1b' , '0#' , '1#' , '2#' , '3#' , '4#' , '5#' , '6#' , '7#' , '4b' , '3b' , '2b' , '1b' , '0#' ] ,
2823- /* D 2 */ [ '3#' , '4#' , '7b' , '6b' , '5b' , '4b' , '3b' , '2b' , '1b' , '0#' , '1#' , '2#' , '3#' , '4#' , '5#' ] ,
2824- /* Eb 3 */ [ '4b' , '3b' , '2b' , '1b' , '0#' , '1#' , '2#' , '3#' , '4#' , '5#' , '6#' , '7#' , '4b' , '3b' , '2b' ] ,
2825- /* E 4 */ [ '1#' , '2#' , '3#' , '4#' , '7b' , '6b' , '5b' , '4b' , '3b' , '2b' , '1b' , '0#' , '1#' , '2#' , '3#' ] ,
2826- /* F 5 */ [ '6b' , '5b' , '4b' , '3b' , '2b' , '1b' , '0#' , '1#' , '2#' , '3#' , '4#' , '5#' , '6#' , '7#' , '4b' ] ,
2827- /* Gb 6 */ [ '1b' , '0#' , '1#' , '2#' , '3#' , '4#' , '7b' , '6#' , '7#' , '4b' , '3b' , '2b' , '1b' , '0#' , '1#' ] ,
2828- /* G 7 */ [ '4#' , '7b' , '6b' , '5b' , '4b' , '3b' , '2b' , '1b' , '0#' , '1#' , '2#' , '3#' , '4#' , '5#' , '6#' ] ,
2829- /* Ab 8 */ [ '3b' , '2b' , '1b' , '0#' , '1#' , '2#' , '3#' , '4#' , '5#' , '6#' , '7#' , '4b' , '3b' , '2b' , '1b' ] ,
2830- /* A 9 */ [ '2#' , '3#' , '4#' , '7b' , '6b' , '5b' , '4b' , '3b' , '2b' , '1b' , '0#' , '1#' , '2#' , '3#' , '4#' ] ,
2831- /* Bb 10 */ [ '5b' , '4b' , '3b' , '2b' , '1b' , '0#' , '1#' , '2#' , '3#' , '4#' , '5#' , '6#' , '7#' , '4b' , '3b' ] ,
2832- /* B 11 */ [ '0#' , '1#' , '2#' , '3#' , '4#' , '7b' , '6b' , '6#' , '4b' , '3b' , '2b' , '1b' , '0#' , '1#' , '2#' ]
2833- ] ) ;
2834-
2835- /**
2836- * Converts the key transpose table to actual key signatures.
2837- * @param texts An array where every item indicates the number of accidentals and which accidental
2838- * placed for the key signature.
2839- *
2840- * e.g. 3# is 3-sharps -> KeySignature.A
2841- */
2842- static translateKeyTransposeTable ( texts : string [ ] [ ] ) : KeySignature [ ] [ ] {
2843- const keySignatures : KeySignature [ ] [ ] = [ ] ;
2844- for ( const transpose of texts ) {
2845- const transposeValues : KeySignature [ ] = [ ] ;
2846- keySignatures . push ( transposeValues ) ;
2847- for ( const keySignatureText of transpose ) {
2848- transposeValues . push (
2849- // digit
2850- parseInt ( keySignatureText . charAt ( 0 ) ) *
2851- // b -> negative, # positive
2852- ( keySignatureText . charAt ( 1 ) === 'b' ? - 1 : 1 )
2853- ) ;
2854- }
2855- }
2856- return keySignatures ;
2857- }
28582808}
0 commit comments