浏览代码

fix(Playback): transposed notes play the correct transposed pitch now (#55)

fix #55 (private)

fix https://github.com/opensheetmusicdisplay/osmd-extended/issues/1
sschmid 4 年之前
父节点
当前提交
eecea8d478
共有 1 个文件被更改,包括 15 次插入12 次删除
  1. 15 12
      src/Playback/PlaybackManager.ts

+ 15 - 12
src/Playback/PlaybackManager.ts

@@ -83,7 +83,7 @@ export class PlaybackManager implements IPlaybackParametersListener {
     private isInitialized: boolean = false;     // make sure midi device gets opened only once
     private nextIteratorTimestamp: Fraction;
     private playNextMetronomeAt: Fraction;
-    private masterTranspose: number = 0;
+    // private masterTranspose: number = 0;
 
     private isPlaying: boolean = false;
     private metronome: MetronomeInstrument;
@@ -152,12 +152,12 @@ export class PlaybackManager implements IPlaybackParametersListener {
         this.metronomeOnlyBPM = value;
     }
 
-    public get Transpose(): number {
-        return this.masterTranspose;
-    }
-    public set Transpose(value: number) {
-        this.masterTranspose = value;
-    }
+    // public get Transpose(): number {
+    //     return this.masterTranspose;
+    // }
+    // public set Transpose(value: number) {
+    //     this.masterTranspose = value;
+    // }
 
     public get OriginalBpm(): number {
         return this.currentReferenceBPM;
@@ -191,15 +191,17 @@ export class PlaybackManager implements IPlaybackParametersListener {
                 const channel: number = this.instrumentToStaffToMidiChannelDict.getValue(ve.Notes[0].ParentStaff);
                 const instrument: Instrument = ve.ParentVoice.Parent;
                 const isPercussion: boolean = instrument.MidiInstrumentId === MidiInstrument.Percussion;
-                const instrumentPlaybackTranspose: number = ve.ParentVoice.Parent.PlaybackTranspose;
                 const volume: number = 0.8;
                 const notesToPlay: ChannelNote[] = [];
 
+                const transpose: number = this.musicPartManager.MusicSheet.Transpose;
+                const instrumentPlaybackTranspose: number = ve.ParentVoice.Parent.PlaybackTranspose;
+
                 for (const note of ve.MainPlaybackEntry.Notes.filter(n => n.MidiKey !== 0)) {
                     // play the note
                     let key: number = note.MidiKey;
                     if (!isPercussion) {
-                        key += instrumentPlaybackTranspose + this.masterTranspose;
+                        key += instrumentPlaybackTranspose + transpose;
                     }
                     if (note.ParentNote.PlaybackInstrumentId !== undefined) {
                         const notePlaybackInstrument: SubInstrument =
@@ -662,8 +664,6 @@ export class PlaybackManager implements IPlaybackParametersListener {
                                 }
                             }
 
-                            const instrumentPlaybackTranspose: number = instrument.PlaybackTranspose ?? 0;
-
                             // calculate volume from instrument volume, staff volume and voice volume:
                             let volume: number = instrument.Volume * staff.Volume * voiceEntry.ParentVoice.Volume;
 
@@ -681,11 +681,14 @@ export class PlaybackManager implements IPlaybackParametersListener {
                                 volume = Math.min(1, volume);
                             }
 
+                            const transpose: number = this.musicPartManager.MusicSheet.Transpose;
+                            const instrumentPlaybackTranspose: number = instrument.PlaybackTranspose ?? 0;
+
                             for (const note of playbackEntry.Notes.filter(n => n.MidiKey !== 0)) {
                                 // play the note
                                 let key: number = note.MidiKey;
                                 if (!isPercussion) {
-                                    key += instrumentPlaybackTranspose + this.masterTranspose;
+                                    key += instrumentPlaybackTranspose + transpose;
                                 }
 
                                 // if note has another explicitly given playback instrument: