From 1bb58fc58f9c6eaa3ca2790215c54c76c1b971c1 Mon Sep 17 00:00:00 2001 From: AaronDavidNewman Date: Sun, 25 Feb 2024 14:36:41 -0600 Subject: [PATCH] clean up clefNote changes --- src/application/exports.ts | 4 ++-- src/render/vex/vxMeasure.ts | 4 +++- src/smo/data/measure.ts | 6 ++++++ src/smo/data/noteModifiers.ts | 4 ++-- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/application/exports.ts b/src/application/exports.ts index 51be600a..e359abcc 100644 --- a/src/application/exports.ts +++ b/src/application/exports.ts @@ -136,7 +136,7 @@ import { SmoMusic } from '../smo/data/music'; import { SmoAudioPitch } from '../smo/data/music'; import { SmoSelection, SmoSelector } from '../smo/xform/selections'; import { SmoOrnament, SmoArticulation, SmoDynamicText, SmoGraceNote, SmoMicrotone, SmoLyric, - SmoArpeggio } from '../smo/data/noteModifiers'; + SmoArpeggio, SmoClefChange } from '../smo/data/noteModifiers'; import { SmoSystemStaff } from '../smo/data/systemStaff'; import { SmoSystemGroup, SmoAudioPlayerSettings, SmoScorePreferences } from '../smo/data/scoreModifiers'; import { SmoTextGroup, SmoTextGroupParams } from '../smo/data/scoreText'; @@ -230,7 +230,7 @@ export const Smo = { SmoVolta, SmoMeasureText, SmoTempoText, TimeSignature, // note modifiers SmoOrnament, - SmoArticulation, SmoDynamicText, SmoGraceNote, SmoMicrotone, SmoLyric, SmoArpeggio, + SmoArticulation, SmoDynamicText, SmoGraceNote, SmoMicrotone, SmoLyric, SmoArpeggio, SmoClefChange, // Smo Transformers SmoSelection, SmoSelector, SmoDuration, UndoBuffer, SmoToVex, SmoOperation, // new score bootstrap diff --git a/src/render/vex/vxMeasure.ts b/src/render/vex/vxMeasure.ts index 64432417..a4d3bc4d 100644 --- a/src/render/vex/vxMeasure.ts +++ b/src/render/vex/vxMeasure.ts @@ -254,15 +254,17 @@ export class VxMeasure implements VxMeasureIf { let i = 0; this.voiceNotes = []; const voice = this.smoMeasure.voices[voiceIx]; + let clefNoteAdded = false; for (i = 0; i < voice.notes.length; ++i) { const smoNote = voice.notes[i]; const vexNote = this.createVexNote(smoNote, i, voiceIx); this.noteToVexMap[smoNote.attrs.id] = vexNote.noteData.staveNote; this.vexNotes.push(vexNote.noteData.staveNote); - if (vexNote.noteData.smoNote.clefNote) { + if (vexNote.noteData.smoNote.clefNote && !clefNoteAdded) { const cf = new VF.ClefNote(vexNote.noteData.smoNote.clefNote.clef, 'small'); this.voiceNotes.push(cf); + clefNoteAdded = true; // ignore 2nd in a measure } this.voiceNotes.push(vexNote.noteData.staveNote); if (isNaN(smoNote.ticks.numerator) || isNaN(smoNote.ticks.denominator) diff --git a/src/smo/data/measure.ts b/src/smo/data/measure.ts index b06a9ba0..d94b9c08 100644 --- a/src/smo/data/measure.ts +++ b/src/smo/data/measure.ts @@ -498,6 +498,12 @@ export class SmoMeasure implements SmoMeasureParams, TickMappable { if (curTick + noteTicks >= clefChangeTick) { smoNote.clef = clefChange; } + // Remove any redundant clef changes later in the measure + if (curTick + noteTicks > clefChangeTick) { + if (smoNote.clefNote && smoNote.clefNote.clef === clefChange) { + smoNote.clefNote = null; + } + } curTick += noteTicks; } } diff --git a/src/smo/data/noteModifiers.ts b/src/smo/data/noteModifiers.ts index 8536b79a..37c8b1a4 100644 --- a/src/smo/data/noteModifiers.ts +++ b/src/smo/data/noteModifiers.ts @@ -52,7 +52,7 @@ export abstract class SmoNoteModifierBase implements SmoModifierBase { } export function isClefChangeParamsSer(params: Partial): params is SmoClefChangeParamsSer { - if (typeof(params.clef) === 'string') { + if (typeof(params.clef) === 'string' && params.ctor === 'SmoClefChange') { return true; } return false; @@ -95,7 +95,7 @@ export class SmoClefChange extends SmoNoteModifierBase { } } serialize(): SmoClefChangeParamsSer { - const params: Partial = { ctor: 'SmoGraceNote' }; + const params: Partial = { ctor: 'SmoClefChange' }; params.clef = this.clef; if (!isClefChangeParamsSer(params)) { throw('corrupt clef change');