Skip to content

Commit 6fcd84a

Browse files
authored
fix: Wrong transpositions (#1907)
1 parent 311ecd3 commit 6fcd84a

File tree

5 files changed

+63
-10
lines changed

5 files changed

+63
-10
lines changed

src.kotlin/alphaTab/android/src/test/java/alphaTab/core/TestGlobals.kt

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,25 +43,35 @@ class Expector<T>(private val actual: T) {
4343
val to
4444
get() = this
4545
val not
46-
get() = NotExpector<T>(actual)
46+
get() = NotExpector(actual)
4747

4848
val be
4949
get() = this
5050
val have
5151
get() = this
5252

5353
fun equal(expected: Any?, message: String? = null) {
54+
var actualToCheck = actual
5455
var expectedTyped: Any? = expected
5556

56-
if (expected is Int && actual is Double) {
57+
if (expected is Int && actualToCheck is Double) {
5758
expectedTyped = expected.toDouble();
5859
}
5960

60-
if (expected is Double && actual is Int) {
61+
if (expected is Double && actualToCheck is Int) {
6162
expectedTyped = expected.toInt();
6263
}
6364

64-
Assert.assertEquals(message, expectedTyped, actual as Any?)
65+
if(expected is Double && expected == 0.0 &&
66+
actualToCheck is Double) {
67+
val d = actualToCheck as Double;
68+
if (d == -0.0) {
69+
@Suppress("UNCHECKED_CAST")
70+
actualToCheck = 0.0 as T
71+
}
72+
}
73+
74+
Assert.assertEquals(message, expectedTyped, actualToCheck as Any?)
6575
}
6676

6777
fun greaterThan(expected: Double) {

src/importer/AlphaTexImporter.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1216,7 +1216,7 @@ export class AlphaTexImporter extends ScoreImporter {
12161216
this._allowNegatives = true;
12171217
this._sy = this.newSy();
12181218
if (this._sy === AlphaTexSymbols.Number) {
1219-
this._currentStaff.displayTranspositionPitch = this._syData as number;
1219+
this._currentStaff.displayTranspositionPitch = (this._syData as number) * -1;
12201220
this._staffHasExplicitDisplayTransposition = true;
12211221
} else {
12221222
this.error('displaytranspose', AlphaTexSymbols.Number, true);
@@ -1228,7 +1228,7 @@ export class AlphaTexImporter extends ScoreImporter {
12281228
this._allowNegatives = true;
12291229
this._sy = this.newSy();
12301230
if (this._sy === AlphaTexSymbols.Number) {
1231-
this._currentStaff.transpositionPitch = this._syData as number;
1231+
this._currentStaff.transpositionPitch = (this._syData as number) * -1;
12321232
} else {
12331233
this.error('transpose', AlphaTexSymbols.Number, true);
12341234
}

src/midi/MidiFileGenerator.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ export class MidiFileGenerator {
179179
const transpositionPitch =
180180
track.index < settings.notation.transpositionPitches.length
181181
? settings.notation.transpositionPitches[track.index]
182-
: 0;
182+
: -track.staves[0].transpositionPitch;
183183
transpositionPitches.set(track.playbackInfo.primaryChannel, transpositionPitch);
184184
transpositionPitches.set(track.playbackInfo.secondaryChannel, transpositionPitch);
185185
}
@@ -190,7 +190,7 @@ export class MidiFileGenerator {
190190
const transpositionPitch =
191191
track.index < this._settings.notation.transpositionPitches.length
192192
? this._settings.notation.transpositionPitches[track.index]
193-
: 0;
193+
: -track.staves[0].transpositionPitch;
194194
this.transpositionPitches.set(channel, transpositionPitch);
195195

196196
let volume: number = MidiFileGenerator.toChannelShort(playbackInfo.volume);

test/audio/MidiFileGenerator.test.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1763,4 +1763,47 @@ describe('MidiFileGeneratorTest', () => {
17631763

17641764
expect(actualTimers.join(',')).to.equal(expectedTimers.join(','));
17651765
});
1766+
1767+
it('transpose', ()=>{
1768+
const score = parseTex(`
1769+
\\track \\staff \\instrument piano
1770+
C4.4| r.1
1771+
\\track \\staff \\instrument piano
1772+
\\displayTranspose 12
1773+
r.1 | C4.4 | r.1
1774+
\\track \\staff \\instrument piano
1775+
\\transpose 12
1776+
r.1 | r.1 | C4.4
1777+
`);
1778+
expect(score.tracks[0].staves[0].displayTranspositionPitch).to.equal(0);
1779+
expect(score.tracks[0].staves[0].transpositionPitch).to.equal(0);
1780+
1781+
expect(score.tracks[1].staves[0].displayTranspositionPitch).to.equal(-12);
1782+
expect(score.tracks[1].staves[0].transpositionPitch).to.equal(0);
1783+
1784+
expect(score.tracks[2].staves[0].displayTranspositionPitch).to.equal(0);
1785+
expect(score.tracks[2].staves[0].transpositionPitch).to.equal(-12);
1786+
1787+
const handler: FlatMidiEventGenerator = new FlatMidiEventGenerator();
1788+
const generator: MidiFileGenerator = new MidiFileGenerator(score, null, handler);
1789+
generator.generate();
1790+
1791+
expect(generator.transpositionPitches.has(0)).to.be.true;
1792+
expect(generator.transpositionPitches.get(0)!).to.equal(0);
1793+
1794+
expect(generator.transpositionPitches.has(1)).to.be.true;
1795+
expect(generator.transpositionPitches.get(1)!).to.equal(0);
1796+
1797+
expect(generator.transpositionPitches.has(2)).to.be.true;
1798+
expect(generator.transpositionPitches.get(2)!).to.equal(0);
1799+
1800+
expect(generator.transpositionPitches.has(3)).to.be.true;
1801+
expect(generator.transpositionPitches.get(3)!).to.equal(0);
1802+
1803+
expect(generator.transpositionPitches.has(4)).to.be.true;
1804+
expect(generator.transpositionPitches.get(4)!).to.equal(12);
1805+
1806+
expect(generator.transpositionPitches.has(5)).to.be.true;
1807+
expect(generator.transpositionPitches.get(5)!).to.equal(12);
1808+
})
17661809
});

test/importer/AlphaTexImporter.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1503,8 +1503,8 @@ describe('AlphaTexImporterTest', () => {
15031503
it('transpose', () => {
15041504
let score = parseTex(`
15051505
\\staff
1506-
\\displaytranspose -12
1507-
\\transpose -6
1506+
\\displaytranspose 12
1507+
\\transpose 6
15081508
.
15091509
`);
15101510
expect(score.tracks[0].staves[0].displayTranspositionPitch).to.equal(-12);

0 commit comments

Comments
 (0)