diff --git a/src/importer/GpifParser.ts b/src/importer/GpifParser.ts index 94a994f2c..347923fe7 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,40 @@ 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 { + 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 000000000..850174074 Binary files /dev/null and b/test-data/guitarpro7/track-balance.gp differ diff --git a/test-data/guitarpro7/track-volume.gp b/test-data/guitarpro7/track-volume.gp new file mode 100644 index 000000000..3c0d65811 Binary files /dev/null and b/test-data/guitarpro7/track-volume.gp differ 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..01f6d89c5 100644 --- a/test/importer/Gp7Importer.test.ts +++ b/test/importer/Gp7Importer.test.ts @@ -870,4 +870,27 @@ 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); + }); + + 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); + }); });