From 6338aadf759b2f3ff9fe5f8ad361c24a6898add1 Mon Sep 17 00:00:00 2001 From: Jordan Drenth Date: Sun, 29 Nov 2020 18:34:15 +0100 Subject: [PATCH 1/4] Support Guitar Pro 7 track volume --- src/importer/GpifParser.ts | 42 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/importer/GpifParser.ts b/src/importer/GpifParser.ts index 94a994f2c..53a773d2b 100644 --- a/src/importer/GpifParser.ts +++ b/src/importer/GpifParser.ts @@ -414,6 +414,9 @@ export class GpifParser { case 'Transpose': this.parseTranspose(track, c); break; + case 'RSE': + this.parseRSE(track, c); + break; } } } @@ -977,6 +980,45 @@ export class GpifParser { } } + private parseRSE(track: Track, node: XmlNode): void { + for (let c of node.childNodes) { + if (c.nodeType === XmlNodeType.Element) { + switch (c.localName) { + case 'ChannelStrip': + this.parseChannelStrip(track, c); + break; + } + } + } + } + + private parseChannelStrip(track: Track, node: XmlNode): void { + for (let c of node.childNodes) { + if (c.nodeType === XmlNodeType.Element) { + switch (c.localName) { + case 'Parameters': + this.parseChannelStripParameters(track, c); + break; + } + } + } + } + + private parseChannelStripParameters(track: Track, node: XmlNode): void { + // track.playbackInfo.volume = Math.ceil(Math.random() * 15); + if (node.firstChild && node.firstChild.value) { + let parameters = node.firstChild.value.split(' '); + for (let i = 0; i < parameters.length; i++) { + let value: number = +parameters[i]; + switch (i) { + case 12: + track.playbackInfo.volume = value * 16; + break; + } + } + } + } + // // ... // From 6a62da5d97ca3d2f74fb29ff87c931eb12cf16c9 Mon Sep 17 00:00:00 2001 From: Jordan Drenth Date: Sun, 29 Nov 2020 19:30:19 +0100 Subject: [PATCH 2/4] Fixed C# compile error and rounded the volume value --- src/importer/GpifParser.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/importer/GpifParser.ts b/src/importer/GpifParser.ts index 53a773d2b..09f854ff5 100644 --- a/src/importer/GpifParser.ts +++ b/src/importer/GpifParser.ts @@ -1005,14 +1005,13 @@ export class GpifParser { } private parseChannelStripParameters(track: Track, node: XmlNode): void { - // track.playbackInfo.volume = Math.ceil(Math.random() * 15); if (node.firstChild && node.firstChild.value) { let parameters = node.firstChild.value.split(' '); for (let i = 0; i < parameters.length; i++) { - let value: number = +parameters[i]; + let value: number = parseInt(parameters[i]); switch (i) { case 12: - track.playbackInfo.volume = value * 16; + track.playbackInfo.volume = Math.floor(value * 16); break; } } From 39ce6b33d43705b7cc2894181557efc29fb0a86d Mon Sep 17 00:00:00 2001 From: Jordan Drenth Date: Mon, 30 Nov 2020 21:14:48 +0100 Subject: [PATCH 3/4] Simplified parser code, fixed Grace Beat test, and added new test and testfile for track volume --- src/importer/GpifParser.ts | 9 ++------- test-data/guitarpro7/track-volume.gp | Bin 0 -> 9975 bytes test/audio/MidiFileGenerator.test.ts | 4 ++-- test/importer/Gp7Importer.test.ts | 13 +++++++++++++ 4 files changed, 17 insertions(+), 9 deletions(-) create mode 100644 test-data/guitarpro7/track-volume.gp diff --git a/src/importer/GpifParser.ts b/src/importer/GpifParser.ts index 09f854ff5..61384012e 100644 --- a/src/importer/GpifParser.ts +++ b/src/importer/GpifParser.ts @@ -1007,13 +1007,8 @@ export class GpifParser { private parseChannelStripParameters(track: Track, node: XmlNode): void { if (node.firstChild && node.firstChild.value) { let parameters = node.firstChild.value.split(' '); - for (let i = 0; i < parameters.length; i++) { - let value: number = parseInt(parameters[i]); - switch (i) { - case 12: - track.playbackInfo.volume = Math.floor(value * 16); - break; - } + if (parameters.length >= 12) { + track.playbackInfo.volume = Math.floor(parseFloat(parameters[12]) * 16); } } } diff --git a/test-data/guitarpro7/track-volume.gp b/test-data/guitarpro7/track-volume.gp new file mode 100644 index 0000000000000000000000000000000000000000..3c0d6581132589a723fcaa855cd566a81863193b GIT binary patch literal 9975 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 literal 0 HcmV?d00001 diff --git a/test/audio/MidiFileGenerator.test.ts b/test/audio/MidiFileGenerator.test.ts index 5be20b3c3..75326de5b 100644 --- a/test/audio/MidiFileGenerator.test.ts +++ b/test/audio/MidiFileGenerator.test.ts @@ -198,7 +198,7 @@ describe('MidiFileGeneratorTest', () => { let info: PlaybackInformation = score.tracks[0].playbackInfo; let expectedEvents: FlatMidiEvent[] = [ // channel init - new ControlChangeEvent(0, 0, info.primaryChannel, ControllerType.VolumeCoarse, 120), + new ControlChangeEvent(0, 0, info.primaryChannel, ControllerType.VolumeCoarse, 96), new ControlChangeEvent(0, 0, info.primaryChannel, ControllerType.PanCoarse, 64), new ControlChangeEvent(0, 0, info.primaryChannel, ControllerType.ExpressionControllerCoarse, 127), new ControlChangeEvent(0, 0, info.primaryChannel, ControllerType.RegisteredParameterFine, 0), @@ -207,7 +207,7 @@ describe('MidiFileGeneratorTest', () => { new ControlChangeEvent(0, 0, info.primaryChannel, ControllerType.DataEntryCoarse, 16), new ProgramChangeEvent(0, 0, info.primaryChannel, info.program), - new ControlChangeEvent(0, 0, info.secondaryChannel, ControllerType.VolumeCoarse, 120), + new ControlChangeEvent(0, 0, info.secondaryChannel, ControllerType.VolumeCoarse, 96), new ControlChangeEvent(0, 0, info.secondaryChannel, ControllerType.PanCoarse, 64), new ControlChangeEvent(0, 0, info.secondaryChannel, ControllerType.ExpressionControllerCoarse, 127), new ControlChangeEvent(0, 0, info.secondaryChannel, ControllerType.RegisteredParameterFine, 0), diff --git a/test/importer/Gp7Importer.test.ts b/test/importer/Gp7Importer.test.ts index 8e70163cc..49865bae9 100644 --- a/test/importer/Gp7Importer.test.ts +++ b/test/importer/Gp7Importer.test.ts @@ -870,4 +870,17 @@ describe('Gp7ImporterTest', () => { expect(score.tracks[0].staves[0].bars[1].voices[0].beats[3].lyrics).toBe(null); }); + it('track-volume', async () => { + const reader = await prepareGp7ImporterWithFile('guitarpro7/track-volume.gp'); + let score: Score = reader.readScore(); + + expect(score.tracks[0].playbackInfo.volume).toBe(16); + expect(score.tracks[1].playbackInfo.volume).toBe(14); + expect(score.tracks[2].playbackInfo.volume).toBe(12); + expect(score.tracks[3].playbackInfo.volume).toBe(10); + expect(score.tracks[4].playbackInfo.volume).toBe(7); + expect(score.tracks[5].playbackInfo.volume).toBe(3); + expect(score.tracks[6].playbackInfo.volume).toBe(0); + + }); }); From f78f8e3a0e7f11c3b924f26907cd025312aecc93 Mon Sep 17 00:00:00 2001 From: Jordan Drenth Date: Tue, 1 Dec 2020 19:59:50 +0100 Subject: [PATCH 4/4] Added panning to the import and made a test for it --- src/importer/GpifParser.ts | 1 + test-data/guitarpro7/track-balance.gp | Bin 0 -> 9377 bytes test/importer/Gp7Importer.test.ts | 10 ++++++++++ 3 files changed, 11 insertions(+) create mode 100644 test-data/guitarpro7/track-balance.gp diff --git a/src/importer/GpifParser.ts b/src/importer/GpifParser.ts index 61384012e..347923fe7 100644 --- a/src/importer/GpifParser.ts +++ b/src/importer/GpifParser.ts @@ -1008,6 +1008,7 @@ export class GpifParser { if (node.firstChild && node.firstChild.value) { let parameters = node.firstChild.value.split(' '); if (parameters.length >= 12) { + track.playbackInfo.balance = Math.floor(parseFloat(parameters[11]) * 16); track.playbackInfo.volume = Math.floor(parseFloat(parameters[12]) * 16); } } diff --git a/test-data/guitarpro7/track-balance.gp b/test-data/guitarpro7/track-balance.gp new file mode 100644 index 0000000000000000000000000000000000000000..850174074386fa7b72f56a1a2dece0293e5269fe GIT binary patch literal 9377 zcmaKyWmFwam$q@Y;2PXrg1cLA3C_XY-CY9*2@>3c6Wrb1-8DfE?(&71m6>;*Z|2?I zwW@np)xE0M{im@(2lk%(pMm@5_3tcEOFMv* zr>cvmjj6MRsi{k$?zlbSFVAefm3Z<|PRmGi+IV!vNH(HDQ;8yBWe#-r2ckH#ZY`|_ zREdpsPj~my7l1c#M~9)11*@I9>;4a9o#Z$Oo28i1-sEu5*Z&|q-I9>;B)^(%KUu|_av z=EtwIKNAH$ngId?Ktw`PjsY{m3Y5lK*NJf1TMR-`jj+8wYvPs%p6>T_S}62;QimF; zI|{MEFJA>bL^a!5UXW_lhq%&*(Qc1#oU3jt6+^UCMPpndyxUnU3oMVaK(?;W3otSN;EEVy6~zIml<4} z-f;?iWZ`adLCY+mQ!2-^aG|c4tw|{@g@tmVrmN`a#ncwEwQ+YtPAX0zc?kKJ$JNkX z*TlNuy9ADBaE9RD_aB@bYD zkVr{_gu$86E$cB86FCNhzg<-gfBsd*KjRJ-@B{uAq+`>}>)TFSH_;Sv{S^!F{F}Su zvj3XRX(LKQ3Nt&`A-3*b!dZjr2FFXw+(%|cAs*i4%aqN%@UaqS&O~;?)QHCAa6B-E zObTe9G{94VM}+d3*l%HnE~cs(;XYOiC>Y?6ftXjSLyV}HA-bdCb-P8bxMx+_L6E2*I1>wTg`HKGqn8CQ#*G!-A(6<+*MS$lsr zD7J^NP(DN|UxeUC8p%!e#3cYvD{G7&Ws*hxc{Cc@63)av#u%ytIkmdyN07al3|-FJ z;0HK}{JUM;A15{eh1QJ{w~+QDB{d%d7h-oZS;n30D$?K{%Yi|A-xTb2^l=TqJoVwS z*91pN3AVt#`l1a`n2+HPl@lzt0`eYMZL-MXFF6(GbYasv$GJ}AI2hw~2EIgx?uVLU zC$c|t>ySkWTQ^4Mim>3baRD$nn)vM>_@yjdz-femzi#ECF5$DlD@r^_A0W zR(jTZ5-^V!w=?eO9loIzZjpxrFh#Pqnnzmolt_v22Z-&q%}HMhULAaW^?n0TLl0Tz zZj_#^qt#Tp%+luxq(&x!1)-1CCKjKBslG||~`ZiU| zz|Im-17HDvVb+`J1~!@Q<~-ah6-03YiLvuV(At`mUHHgwjm^-RVF84kfie(}c$K6M ztT@=zPAqm-O(+-%yU8`$?H2?Ql7a^uNM79j5b?53LL#LG224(~n|z5(X^%C};VZud zq|~Pr6)05&;Ient{Sx*w8lz^3gtJy589RtYdq!Mm+n=*R*o%FbV^GFRziWm5c%C+|8ZVNA@7nKk}AQJx~(gI48jB2 zVOp{yhS#@&QeH7PpdDZcB>#r}89tp`sGr+!PmB?6w4!3dh5_iDl}BrN_*aF zUnDaF%B!dr6H;4GMj+uRFxE&LWQvamqy4c?`ProwD9menCnuEEK!7egw~iU(=pgPS zAy_E{*1=pe79a_|F9I8p>yXJkqL4k0@I6ZouL1$!0@2@}QZ zfi=5008=2`K{x#N)h7L`O2HIHRAZgmbnx{mqFuwtXy$mQ@7cH(GHT*!6bCMt<84a;}_#-~P}SJDlC548&7jz)GY8IpxQn;dx9Uh_-Q_^~1T2 znWdn#k}M52%mS<8F=wNZ9}`C}nZe#qXwKjKgYD6Zl`!{;6Z6em^7TCmAwCEde2(_S zfzFGUhg3ov_{=dE+1-yNGeAC66dAAdW?7hrox?%B+wtX1wQDaubegpZzMBwXg3ew@ z#P^S}Tc4DBa@^AAknCsdA+*^79Me~+N9Cws8Xpa3^o8&a1)s;W8Hbeh8u4CFk*Cx9 zY|#x#<`_xUh>>9m^o|S_&3T<>L=jVKAc%ry1p6R9fv7y%%5=E)$E$A#+bJK}1=hEX z{r#OioebI(Z9QeG2!6C#dbb}>Ot2gpL(pL#^QDD5P?Khdaqq@pjTf?UNl2)s%94r@JU?E4a-YQ8I&Y!>#HwIlOQ|0{=i!|)kwdh@NJuUG zsVk$T^t)T!G>Xqdl#O`t46*DeBC+rFbU!^)IgIuI=g1)ybgalzm~iBc{8gKDiL1Wc z;gN;#y#CmJ9&xF*>V`VGnS3#GSVb+QS)rMB_wn{M7X-e?rUcg|P8H&khkuHTUr}4S ze~%UoT+$8$o=AI~GStv3iT8r@b&6zrU=z)<>?HlEu{3VRai&AB%%f zK!bd=(oS=Q4JGz*C`iQ6x}Cx9Bz+cAdMr=NgFt5MN;>UyeOr;qhJJ)o#B&`#U>p(# z;6+VMxbC?~^`aDun%kIm(@T2c0(#kjz zVPLjPQgt=Cl|ts^4Mho>ubNPR)uX|g60%v28UC>@OM`eu+TFlq3@w&A0Fb+Y0}e zTtg0}^Gi`^j-6dnS-fQZMK(rDo-c(SR=NgzmX~uhO(;=nA_1hDsC~nA>tESN$9aw= zd#rx8@`K==TVb;+s}OD3IM*OXjUX%EMn4o1p-WL97jc^lT8bZL45LMw)ph7x^w~zZ zxf;zV3Q$Yru&0qp!OOF`<(aX;=^HV zt{<{8#eHuoR{C)cU@$N+gdM}i!rhea2(i&?anBXD9o%Rhbveh;*jEo~T^V6{c#ovY zN2&|f7D8!Wr$ug_SFDp}nVkE4Q#=Rz&*0P9BjTYu_%PUQcAFsD zUZN^a)ut_0e0IK67rD5s!cL(w1F%%(tpNiUs&cR&skOTO3`b`XzTk>#n*Oe-qC0ZK zL99`jxKqk)C7t*XU?M0=1rhuv ziA-xmg5*7!xl|l>2p-|oe>pkE1haTwEZf^54Pn!e0f$QILAvv>vqi8vg>H*eNuHlI z(JUtTDNaaHxi!~>`CCeajO@MQ=)N;dDAW|7vZyrZ_9}&%#NrtUPocb!g~Y=w`bO+6 zx>UC-qY{Mca%5d1$rg@V6nmFSvMbgR#Dx0_{%*DsW|1Nfh0$z2%px%nSDT=+dk&^E zP3QOms5UXy;8Mb?o-=1q+d|5c+8r?UPTdVW2v#4@t>{~ft zVGl}sehI(C{lW=h_KmvDqtTuDsMAG;0O%2*jfkHmOpv)I$60PZcQ@+Zx?MMlZ(uWw zAnM2)zKm3bO=@PL`ZLuDQ0XjAe+*(=(eH94Z_r_=X7y)c=EC9^g<4H(H}Vkv&CdWy zZoQLd%DpO~w>6Tt$bws;Oz%Q z#y_>Hj%#I=zl1rk&Z0?`m(r^3E612SMZ1@VGz>c1CJFw78X z&3wC~rob+}Rhg>^ni*zw&upz+9`r8jY0p#>Z-JV1rFD0$b+!&4MxZECaI4Aoe~!$x z8ko)i@6TJZgpL7|;nAeqD<2VoU{LWI{AtKjBvH$dT2kP`HL7+zCiHbkJ7{8Q%fo-9 zwV=i1F2x>eza-BLM%7h~`lze$2b=U9`K6cC9)iyJDbZfEMx-dRyBvd##M83!@`yV^ zha_TGDO(5|;z3+?Db5W?xCuRhpD2L@r7vpoa+4?`Cp(6AwXPWx|J4PxB+IPsQ6dge z4F6m5@y3|f^88O)hh-|b12=$M@i1;W9~RAsE=2t_nM{W+?YJ{LhR-+X#)K&>D42jX6*|c{om1Z;i{cG) zmCjhD+2+jGg`E7VoI$lhNZxe0lSSwP&JDMLpwSOz2soUfcLWpdNN)OaeXVvd@*$$yDR1goB6OB9np0v9tP{xwO4Q+%Uk_sa&AS)kI$u zPG4m{9V6?+VlKKT7Vm~&z0%^kMkt6>rsm-dEu~iV?1CH_h!t`WGIfYeoWtD#lj1S(Ag>hXk zA{IP^p_LI&ZRnaLygj{kf(<J=k<}ni%dfr|FT_&`BwqV?*Wo z7F8q8$%aw0>t%M)3psR>$qYg|0KTj|o>3w<@qE?J6J#Y@h^5ZRaBTv}(3Kva=J*A8dUovVf>TAr%g z=tZS-@s&G?wV;eo5@Dy?+glhLzhm8s%1PbjKkhs32AdvOcH>Y1>M z^t9yHN+>9A2s#y2rgp}r&P-O$_I9>0od`WFXak%32XMm_CW%af0ZrLA+K@6# z9E+H=zV1~^-QA~87cV*@+{Q?kFrA{sDf*)1=a2)kF!%#n!*(zsD%+j8eTvY(xiz~P z40D9`PFEcl@NuaWV6(A8{m1Fl+$;_AL}`d7dG|738-z#w_$2)d+vxRZzcRZj+N}z@ z+xKF0{n>utzx@RCKcjz(xX#A*PNq!e4wh!8ddJSIoak?rok8>Rl?Dn$(ntHL04YBW zXSW^g3FFGyVI@qH+--V_RB?Cbx2IDGpOG4Q_E>^X7FHNvPIjtWznlOIOs-Oxv&wwP zl;t7cBy?7f8?bixx-%ZRm{;I+TqI8o%9B0aczE_xxPs>K)2x)c!{{#~jU*z6216uG zP}&dm^sFJf;rW60S6|KQ7~8I^qveqvxn%|!v4Aos;v6PJ4sP(qc2*WxCNzqfBxDZl zMPro753?Yt!QJBvkpDB_dua~1BHQX*MxxFEw-JY#^(pNK?RBl43N9z@Q6B>FE02oL zQ`!d-=&I&_9#opEg*N+CZLPmci8Mw19(VE$f+kw9pERS;)(jwN7>gvXrEyg9KTfRR zs2@uK&qvWRA1P+M`X6n#4w!7C@(@v~tE zN|0O-vdV(K)O5gRA3d}}bW0RwK61AK>s8gU6;Hpn(-s?r7l4TLxn$8 zanG-IJ1*m{iL57)z2!5JRW`AHw?kwb99SyFJU78Kb1AMl&`%Pd4dhNjlN+tBFI(!; zOj@Jyo+&e$Z1}oD2Qb?IU9T+WX1q zy7{{Hc=+aFn0<=v8bTJu|J#i-FyKbffcW({9j<|%V$q^d4a5Yhfx&ac@nZkuW=9Ke z*6Z%hjf<1obWl_`HaT;cmmfE2^4hP)Qov&~PHA?2{h?Yrka#<7$J|XH_mVdjs z1Ei+r?5>$aKFy@){fqp5%Kfsh#%J3lHm=P3jCvz)%iBy&@BSVB>a0p5$+r7chLb+i zU$=D9sq?{e4-*5WhO%>|=;{mpuz~J)O>gIG~ zxsnZebH8(`hNM&b-CeIa*ZKW2*l>i5Ch>vNRZ!S{zbN^Em#WIgsjkj9yD5bNear_R zgFBYWIm1qSWUCfd>@)o6oPcRa(+Hl$RIC%@RSuf5+=3DUhLp$-dl_?HNO6F5GZbHJ zv=L_)rRhY%Seb7)9_y()!uptb!<$H|M#VyZCNi~Sw1Y<3__UFydDq& z8o!3|sG?jr6R)Ah)4Usw=l&_11AM1>+(_44WbO6gU`PNSVYT#mKHe93XC zI^t6aWm&29MlV+tak$9X-3r@|<65_JG{V>j;Fj9RwF`CDC^}oYxgg?W31a?RSbt1= z;_H@%Zs`Z`tIggQTgQtI$V(5e;fKv#o|g)sj9~kC_+G>JLq*nF!1|RAV|q0=zC!R2 zsq^-a-*Ee0EjPR64#${i7l%Eubc0>Z0_10z@_AT9;fz;crLmbLk=^vOhB#&OQ-j~T zi2;i`KN@<2ET9qLny8ql1~CX-y&_6`5vRoWgEX1)w_uQrwokXqznbU8VOR|r_ zsMtjz?!-KXBH|5J$`0{a?A34xHqqx?W5maeBHpVmq|I3`hv-1R$5X}xNJ?z((7;A3 zcc$TI;I7|M6Hh7#3R-}WC0}wE%2FPYYIV%Ax?l*W* zRIID2r@alBY1lpl(Tn=M*pe72&EOBJ!!X7OvpJ>8dwq=}^kfamCJW9G1i>3^86S$V z7By>;a}RX(I$VI^NA}qYN!ZHN%sezI>A@WI+hvt0Ky^Ee3ul$qnA%CozGO5VQ5*Pb zVx;Q3>kjc{bW^!+jLNqPc{c4RBb*c?8(IYn$_@XSf0?7v>5QoX-V?Z^o6BV|IyUqz zqxLPMo5`gz0vbY=Tj6WHT@Bp~dQLJ!NB%3Th+G@9%JPID^yg>duaNLJfp082JvQ*Q zlw%v8Qw544Ys1maKn!Zhf3tp8sq3w~waf8+E9llb=+<)OFG}SVGC7Qa4NxoS79fhL zkMoZXZklALnG&PumU0D*@eSfDiotc!pc9PET$roD5yi|{h*(jw&;f)SQSNA)Y+5<= z4~4U|&SDP+P{`n4l6G+Ddj|HVP?I|pAgT=&$`PL?!Q2p-Q>J>j8;a!k5O&c~aIc1= zz|W8IDmtPz*`=ES54v&&La7rkdi@(9ryo1SB8%5qW+(2SUNh}6QfJ{B8Gs)^vikMP zvc%VHCEa2LkKffmq$;^Y#?;LtJ4o zKE_M`+06}cN&b2JcU@<^{R!7)%!_14_2v-QEy2UUt3XG*=1jp4AKkK~#EvG+%}}qs zgiu$Q-zhlfoDgrbSbBx|k#84fqK}IVGhe9_7aNAGKkeNxUV0&W8b`M&i*+y!`AI*oyY2~`z_=kr{&ndS7cGvX(w}|2tFxVMz3qMzow=Om%fsga=8h-TKK2j z&z70Pzwp)d+0l0xC|-np6$Dm3c2`Ofzktwv!+_23Cf6lZ_tVB? zl#dpCNWt#9SDyf&yJFAnr*@)EsE5-$8!QjTGh{5_5PcP)+bHVfqQ2x>QCN-S)vx6Z%>%+qWbw4IcQxGZsgLTB=tY2B(#Aka!{*xqVpTMH)H1R3}&?oo{3S8(} zcgJ(e-RFvo*8PQy`f3d?o%$Lx9}cJGg%ym|$KQ?`_2UbY7&^dL6`jQe**9yO3Zd!> zU}t+p`pL0hV{XNbRJE&Zg-=pN40XfJaARZrM&H7tfz|Pf_5+>HUDncq`Q~AVotHiV z(CAOj(&(6f9<$j|neN3_ehaNC=_PsT19?2!$R-EIv${wH-IvFyF%8ysx-jCl64{tU z0%o~XAY>8uy_wc4lC^R6fUhsMid8Pu&54tfRsAa}q1*(_c`z85InuuaH`qUjq9LK8 zDx;{tzQ_&+7LL(+1^Fij{U2Zh4gm)Ff1hIcGv!a9fxU^m_kTf0N$x*a{XNz4j->B6 z`i`aVO!qh50;&Ey{$2IYGcNyBdB@Oq1byGlJHGynx4_^(slO`!3(Wpg=p8=a!SfwJ z->LO)yamqxi_rhau>X{K2f%mu>-y9F=U35S{r7(U$*uoXdH3kupLd_$VexOg1s?y4 v%73HdKi9vz_3qTWWA9G>jkmy9vj6f`Ne&w3eE{~)H3$v{*7s)!4D9~_Id%q4 literal 0 HcmV?d00001 diff --git a/test/importer/Gp7Importer.test.ts b/test/importer/Gp7Importer.test.ts index 49865bae9..01f6d89c5 100644 --- a/test/importer/Gp7Importer.test.ts +++ b/test/importer/Gp7Importer.test.ts @@ -881,6 +881,16 @@ describe('Gp7ImporterTest', () => { expect(score.tracks[4].playbackInfo.volume).toBe(7); expect(score.tracks[5].playbackInfo.volume).toBe(3); expect(score.tracks[6].playbackInfo.volume).toBe(0); + }); + + it('track-balance', async () => { + const reader = await prepareGp7ImporterWithFile('guitarpro7/track-balance.gp'); + let score: Score = reader.readScore(); + expect(score.tracks[0].playbackInfo.balance).toBe(0); + expect(score.tracks[1].playbackInfo.balance).toBe(4); + expect(score.tracks[2].playbackInfo.balance).toBe(8); + expect(score.tracks[3].playbackInfo.balance).toBe(12); + expect(score.tracks[4].playbackInfo.balance).toBe(16); }); });