Browse Source

fix(Playback): don't play first note of invisible measure when maxmeasuretodraw set

fixes the first note that is outside of the current measures
rendered being played back at the end, before playback stops
sschmidTU 3 years ago
parent
commit
117a73e466

+ 1 - 0
src/MusicalScore/Graphical/MusicSheetDrawer.ts

@@ -379,6 +379,7 @@ export abstract class MusicSheetDrawer {
     protected drawStaffLine(staffLine: StaffLine): void {
         for (const measure of staffLine.Measures) {
             this.drawMeasure(measure);
+            measure.parentSourceMeasure.WasRendered = true; // simplification
         }
 
         if (this.rules.RenderLyrics) {

+ 1 - 0
src/MusicalScore/VoiceData/SourceMeasure.ts

@@ -95,6 +95,7 @@ export class SourceMeasure {
     private rules: EngravingRules;
     private tempoInBPM: number;
     private verticalMeasureList: GraphicalMeasure[]; // useful, see GraphicalMusicSheet.GetGraphicalFromSourceStaffEntry
+    public WasRendered: boolean = false;
 
     public get MeasureNumber(): number {
         return this.measureNumber;

+ 4 - 0
src/OpenSheetMusicDisplay/OpenSheetMusicDisplay.ts

@@ -325,6 +325,10 @@ export class OpenSheetMusicDisplay {
         }
 
         this.drawer.setZoom(this.zoom);
+
+        for (const measure of this.sheet.SourceMeasures) {
+            measure.WasRendered = false;
+        }
         // Finally, draw
         this.drawer.drawSheet(this.graphic);
 

+ 6 - 0
src/Playback/PlaybackManager.ts

@@ -576,6 +576,9 @@ export class PlaybackManager implements IPlaybackParametersListener {
             // console.log("TS ms: " + this.timingSource.getCurrentTimeInMs());
             // console.log("TS ts: " + this.currentTimestamp);
             endHasBeenReached = this.cursorIterator.EndReached;
+            if (!this.cursorIterator.CurrentMeasure.WasRendered) {
+                endHasBeenReached = true;
+            }
 
             /**********************************************/
             // handle the currently pending instructions:
@@ -666,6 +669,9 @@ export class PlaybackManager implements IPlaybackParametersListener {
                         const playbackedNotes: PlaybackNote[] = [];
 
                         for (const entry of dueEntries) {
+                            if (!entry.playbackEntry.ParentVoiceEntry.ParentSourceStaffEntry.VerticalContainerParent.ParentMeasure.WasRendered) {
+                                continue; // don't play back entry that isn't visible. (e.g. first note in measure after maxMeasureToDraw)
+                            }
                             const playbackEntry: PlaybackEntry = entry.playbackEntry;
                             const voiceEntry: VoiceEntry = playbackEntry.ParentVoiceEntry;
                             if (playbackEntry.Notes.length === 0) {