瀏覽代碼

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 年之前
父節點
當前提交
117a73e466

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

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

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

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

+ 4 - 0
src/OpenSheetMusicDisplay/OpenSheetMusicDisplay.ts

@@ -325,6 +325,10 @@ export class OpenSheetMusicDisplay {
         }
         }
 
 
         this.drawer.setZoom(this.zoom);
         this.drawer.setZoom(this.zoom);
+
+        for (const measure of this.sheet.SourceMeasures) {
+            measure.WasRendered = false;
+        }
         // Finally, draw
         // Finally, draw
         this.drawer.drawSheet(this.graphic);
         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 ms: " + this.timingSource.getCurrentTimeInMs());
             // console.log("TS ts: " + this.currentTimestamp);
             // console.log("TS ts: " + this.currentTimestamp);
             endHasBeenReached = this.cursorIterator.EndReached;
             endHasBeenReached = this.cursorIterator.EndReached;
+            if (!this.cursorIterator.CurrentMeasure.WasRendered) {
+                endHasBeenReached = true;
+            }
 
 
             /**********************************************/
             /**********************************************/
             // handle the currently pending instructions:
             // handle the currently pending instructions:
@@ -666,6 +669,9 @@ export class PlaybackManager implements IPlaybackParametersListener {
                         const playbackedNotes: PlaybackNote[] = [];
                         const playbackedNotes: PlaybackNote[] = [];
 
 
                         for (const entry of dueEntries) {
                         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 playbackEntry: PlaybackEntry = entry.playbackEntry;
                             const voiceEntry: VoiceEntry = playbackEntry.ParentVoiceEntry;
                             const voiceEntry: VoiceEntry = playbackEntry.ParentVoiceEntry;
                             if (playbackEntry.Notes.length === 0) {
                             if (playbackEntry.Notes.length === 0) {