diff --git a/src/importer/MusicXmlImporter.ts b/src/importer/MusicXmlImporter.ts index bd47f226a..929edbb8a 100644 --- a/src/importer/MusicXmlImporter.ts +++ b/src/importer/MusicXmlImporter.ts @@ -1396,8 +1396,11 @@ export class MusicXmlImporter extends ScoreImporter { case 'midi-program': track.playbackInfo.program = parseInt(c.innerText); break; - case 'midi-volume': - track.playbackInfo.volume = parseInt(c.innerText); + case 'volume': + track.playbackInfo.volume = Math.floor((parseInt(c.innerText) / 100) * 16); + break; + case 'pan': + track.playbackInfo.balance = Math.max(0, Math.min(16, Math.floor(((parseInt(c.innerText) + 90) / 180) * 16))); break; } } diff --git a/test-data/musicxml3/track-volume-balance.musicxml b/test-data/musicxml3/track-volume-balance.musicxml new file mode 100644 index 000000000..929a52e3a --- /dev/null +++ b/test-data/musicxml3/track-volume-balance.musicxml @@ -0,0 +1,518 @@ + + + + + Title + + + Composer + + MuseScore 3.5.2 + 2020-12-14 + + + + + + + + + + 7.05556 + 40 + + + 1584 + 1224 + + 56.6929 + 56.6929 + 56.6929 + 113.386 + + + 56.6929 + 56.6929 + 56.6929 + 113.386 + + + + + + + title + Title + + + composer + Composer + + + + none + + + Piano + Pno. + + Piano + + + + 1 + 1 + 100 + -90 + + + + + brace + + + Piano + Pno. + + Piano + + + + 2 + 1 + 78.7402 + -44 + + + + brace + + + Piano + Pno. + + Piano + + + + 3 + 1 + 52.7559 + 0 + + + + + brace + + + Piano + Pno. + + Piano + + + + 4 + 1 + 30.7087 + 46 + + + + + Piano + Pno. + + Piano + + + + 5 + 1 + 0 + 90 + + + + + + + + + + 85.00 + -0.00 + + 170.00 + + + 65.00 + + + + 1 + + 0 + + + 2 + + G + 2 + + + F + 4 + + + + + F + 4 + + 1 + 1 + quarter + up + 1 + + + + 1 + 1 + quarter + 1 + + + + 1 + 1 + quarter + 1 + + + + 1 + 1 + quarter + 1 + + + 4 + + + + F + 3 + + 1 + 5 + quarter + down + 2 + + + + 1 + 5 + quarter + 2 + + + + 1 + 5 + quarter + 2 + + + + 1 + 5 + quarter + 2 + + + + + + 4 + 1 + 1 + + + 4 + + + + 4 + 5 + 2 + + + light-heavy + + + + + + + + 65.00 + + + + 1 + + 0 + + + + G + 2 + + + + + 1 + 1 + quarter + + + + F + 4 + + 1 + 1 + quarter + up + + + + 1 + 1 + quarter + + + + 1 + 1 + quarter + + + + + + 4 + 1 + + + light-heavy + + + + + + + + 65.00 + + + + 1 + + 0 + + + + G + 2 + + + + + 1 + 1 + quarter + + + + 1 + 1 + quarter + + + + F + 4 + + 1 + 1 + quarter + up + + + + 1 + 1 + quarter + + + + + + 4 + 1 + + + light-heavy + + + + + + + + 65.00 + + + + 1 + + 0 + + + + G + 2 + + + + + 1 + 1 + quarter + + + + 1 + 1 + quarter + + + + 1 + 1 + quarter + + + + F + 4 + + 1 + 1 + quarter + up + + + + + + 4 + 1 + + + light-heavy + + + + + + + + 65.00 + + + + 1 + + 0 + + + + G + 2 + + + + + 1 + 1 + quarter + + + + 1 + 1 + quarter + + + + 1 + 1 + quarter + + + + 1 + 1 + quarter + + + + + + F + 4 + + 1 + 1 + quarter + up + + + + 1 + 1 + quarter + + + + 2 + 1 + half + + + light-heavy + + + + diff --git a/test/importer/MusicXmlImporterTestSuite.test.ts b/test/importer/MusicXmlImporterTestSuite.test.ts index 4316c960f..29ef946ca 100644 --- a/test/importer/MusicXmlImporterTestSuite.test.ts +++ b/test/importer/MusicXmlImporterTestSuite.test.ts @@ -1,4 +1,5 @@ import { MusicXmlImporterTestHelper } from '@test/importer/MusicXmlImporterTestHelper'; +import { Score } from '@src/model/Score'; describe('MusicXmlImporterTestSuiteTests', () => { it('01a_Pitches_Pitches', async () => { @@ -606,4 +607,28 @@ describe('MusicXmlImporterTestSuiteTests', () => { 'test-data/musicxml-testsuite/99b-Lyrics-BeamsMelismata-IgnoreBeams.xml' ); }); + + it('Track_Volume', async () => { + let score: Score = await MusicXmlImporterTestHelper.testReferenceFile( + 'test-data/musicxml3/track-volume-balance.musicxml' + ); + + expect(score.tracks[0].playbackInfo.volume).toBe(16); + expect(score.tracks[1].playbackInfo.volume).toBe(12); + expect(score.tracks[2].playbackInfo.volume).toBe(8); + expect(score.tracks[3].playbackInfo.volume).toBe(4); + expect(score.tracks[4].playbackInfo.volume).toBe(0); + }); + + it('Track_Balance', async () => { + let score: Score = await MusicXmlImporterTestHelper.testReferenceFile( + 'test-data/musicxml3/track-volume-balance.musicxml' + ); + + 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); + }); });