Parcourir la source

Set sheet override on UI tempo change:
Due to some updates to the tempo API, need to set tempo on each source measure when user overrides tempo.

Justin Litten il y a 2 ans
Parent
commit
1340d06981

+ 1 - 1
src/Common/Interfaces/IPlaybackParametersListener.ts

@@ -1,5 +1,5 @@
 export interface IPlaybackParametersListener {
-    bpmChanged(newBpm: number): void;
+    bpmChanged(newBpm: number, sheetOverride: boolean): void;
     volumeChanged(instrumentId: number, newVolume: number): void;
     volumeMute(instrumentId: number): void;
     volumeUnmute(instrumentId: number): void;

+ 9 - 2
src/Playback/PlaybackManager.ts

@@ -41,6 +41,7 @@ export class PlaybackManager implements IPlaybackParametersListener {
     protected loopTriggeredReset: boolean;
     protected tempoUserFactor: number;
     protected currentBPM: number;
+    protected overrideBPM: number = undefined;
     protected listeners: IPlaybackListener[] = [];
     public addListener(listener: IPlaybackListener): void {
         this.listeners.push(listener);
@@ -616,7 +617,7 @@ export class PlaybackManager implements IPlaybackParametersListener {
                         const currentMeasureBPM: number = this.currentMeasure.TempoInBPM;
                         if (currentMeasureBPM !== this.currentBPM && currentMeasureBPM > 0) {
                             // TODO the default value for measure.TempoInBPM is 0, probably not a good default setup. But we also catch it in bpmChanged().
-                            this.bpmChanged(currentMeasureBPM); // update playback speed/bpm
+                            this.bpmChanged(currentMeasureBPM, false); // update playback speed/bpm
                         }
 
                         // calculate which beat is next:
@@ -1225,13 +1226,19 @@ export class PlaybackManager implements IPlaybackParametersListener {
         }
     }
 
-    public bpmChanged(newBpm: number): void {
+    public bpmChanged(newBpm: number, sheetOverride: boolean): void {
         if (!(newBpm > 0)) {
             // only accept valid bpm (> 0)
             //   TODO one sample has bpm 0 for measure 5: love again - dua lipa
             log.info("invalid bpm set: " + newBpm + ". Ignoring.");
             return;
         }
+        if(sheetOverride && this.musicPartManager?.MusicSheet.SourceMeasures?.length > 0){
+            this.overrideBPM = newBpm;
+            this.musicPartManager.MusicSheet.SourceMeasures.forEach(measure => {
+                measure.TempoInBPM = newBpm;
+            });
+        }
         this.currentBPM = newBpm;
         this.timingSource.setBpm(newBpm);
     }

+ 3 - 3
src/Playback/UIComponents/ControlPanel/ControlPanel.ts

@@ -18,7 +18,7 @@ export class ControlPanel extends AUIController<IPlaybackParametersListener> imp
     public volumeUnmute(instrument: number): void {
         throw new Error("Method not implemented.");
     }
-    public bpmChanged(newNpm: number): void {
+    public bpmChanged(newNpm: number, sheetOverride: boolean): void {
         this.bpmValue = newNpm;
         if (this.bpmSlider) {
             this.bpmSlider.value = this.bpmValue;
@@ -155,7 +155,7 @@ export class ControlPanel extends AUIController<IPlaybackParametersListener> imp
                     self.bpmSlider.listen("MDCSlider:input", () => {
                         self.bpmValue = self.bpmSlider.value;
                         for (const listener of self.eventListeners) {
-                            listener.bpmChanged(self.bpmValue);
+                            listener.bpmChanged(self.bpmValue, true);
                         }
                     });
                     self.titleContentElement.innerText = "Tempo (BPM)";
@@ -209,7 +209,7 @@ export class ControlPanel extends AUIController<IPlaybackParametersListener> imp
             this.bpmSlider.listen("MDCSlider:input", () => {
                 this.bpmValue = self.bpmSlider.value;
                 for (const listener of self.eventListeners) {
-                    listener.bpmChanged(self.bpmSlider.value);
+                    listener.bpmChanged(self.bpmSlider.value, true);
                 }
             });
         }