Procházet zdrojové kódy

Merge osmd-public: add instrument transpose, null check

sschmidTU před 3 roky
rodič
revize
923aa3eaf8

+ 9 - 0
src/MusicalScore/Graphical/GraphicalMeasure.ts

@@ -381,5 +381,14 @@ export abstract class GraphicalMeasure extends GraphicalObject {
         }
         return sourceMeasure.endsWithWordRepetition();
     }
+
+    public getTransposedHalftones(): number {
+        const transposeHalftones: number = this.parentStaff.ParentInstrument.GetMusicSheet.Transpose +
+            this.parentStaff.ParentInstrument.Transpose;
+        // if (!transposeHalftones) {
+        //     transposeHalftones = this.parentStaff.ParentInstrument.Transpose;
+        // }
+        return transposeHalftones;
+    }
 }
 

+ 7 - 5
src/MusicalScore/Graphical/MusicSheetCalculator.ts

@@ -2311,10 +2311,12 @@ export abstract class MusicSheetCalculator {
                 const instruction: AbstractNotationInstruction = sourceMeasure.FirstInstructionsStaffEntries[staffIndex].Instructions[idx];
                 if (instruction instanceof KeyInstruction) {
                     const key: KeyInstruction = KeyInstruction.copy(instruction);
-                    if (measure.ParentStaff.ParentInstrument.MidiInstrumentId !== MidiInstrument.Percussion &&
+                    const transposeHalftones: number = measure.getTransposedHalftones();
+                    if (transposeHalftones !== 0 &&
+                        measure.ParentStaff.ParentInstrument.MidiInstrumentId !== MidiInstrument.Percussion &&
                         MusicSheetCalculator.transposeCalculator) {
                         MusicSheetCalculator.transposeCalculator.transposeKey(
-                            key, this.graphicalMusicSheet.ParentMusicSheet.Transpose
+                            key, transposeHalftones
                         );
                     }
                     accidentalCalculator.ActiveKeyInstruction = key;
@@ -2484,10 +2486,10 @@ export abstract class MusicSheetCalculator {
     private checkNoteForAccidental(graphicalNote: GraphicalNote, accidentalCalculator: AccidentalCalculator, activeClef: ClefInstruction,
                                    octaveEnum: OctaveEnum): void {
         let pitch: Pitch = graphicalNote.sourceNote.Pitch;
-        const transpose: number = this.graphicalMusicSheet.ParentMusicSheet.Transpose;
-        if (transpose !== 0 && graphicalNote.sourceNote.ParentStaffEntry.ParentStaff.ParentInstrument.MidiInstrumentId !== MidiInstrument.Percussion) {
+        const transposeHalftones: number = graphicalNote.parentVoiceEntry.parentStaffEntry.parentMeasure.getTransposedHalftones();
+        if (transposeHalftones !== 0 && graphicalNote.sourceNote.ParentStaffEntry.ParentStaff.ParentInstrument.MidiInstrumentId !== MidiInstrument.Percussion) {
             pitch = graphicalNote.Transpose(
-                accidentalCalculator.ActiveKeyInstruction, activeClef, transpose, octaveEnum
+                accidentalCalculator.ActiveKeyInstruction, activeClef, transposeHalftones, octaveEnum
             );
         }
         graphicalNote.sourceNote.halfTone = pitch.getHalfTone();

+ 3 - 2
src/MusicalScore/Graphical/MusicSystemBuilder.ts

@@ -412,13 +412,14 @@ export class MusicSystemBuilder {
     }
 
     protected transposeKeyInstruction(keyInstruction: KeyInstruction, graphicalMeasure: GraphicalMeasure): KeyInstruction {
-        if (this.graphicalMusicSheet.ParentMusicSheet.Transpose !== keyInstruction.isTransposedBy
+        const transposeHalftones: number = graphicalMeasure.getTransposedHalftones();
+        if (transposeHalftones !== keyInstruction.isTransposedBy
             && graphicalMeasure.ParentStaff.ParentInstrument.MidiInstrumentId !== MidiInstrument.Percussion
             && MusicSheetCalculator.transposeCalculator !== undefined
         ) {
             MusicSheetCalculator.transposeCalculator.transposeKey(
                 keyInstruction,
-                this.graphicalMusicSheet.ParentMusicSheet.Transpose
+                transposeHalftones
             );
         }
         return keyInstruction;

+ 5 - 3
src/MusicalScore/Graphical/VexFlow/VexFlowMusicSheetCalculator.ts

@@ -783,7 +783,7 @@ export class VexFlowMusicSheetCalculator extends MusicSheetCalculator {
       // }
       // console.log('max skyline: ' + maxSkylineBeginning);
     }
-    const skyline: number[] = this.graphicalMusicSheet.MeasureList[0][0].ParentStaffLine.SkyLine;
+    const skyline: number[] = this.graphicalMusicSheet.MeasureList[0][0].ParentStaffLine?.SkyLine;
     vfStave.setTempo(
       {
           bpm: metronomeExpression.TempoInBpm,
@@ -797,8 +797,10 @@ export class VexFlowMusicSheetCalculator extends MusicSheetCalculator {
     (<any>vfStave.getModifiers()[vfStave.getModifiers().length - 1]).setShiftX(
       xShift
     );
-    // TODO calculate bounding box of metronome mark instead of hacking skyline to fix lyricist collision
-    skyline[0] = Math.min(skyline[0], -4.5 + yShift);
+    if (skyline) {
+      // TODO calculate bounding box of metronome mark instead of hacking skyline to fix lyricist collision
+      skyline[0] = Math.min(skyline[0], -4.5 + yShift);
+    }
     // somehow this is called repeatedly in Clementi, so skyline[0] = Math.min instead of -=
   }
 

+ 4 - 1
src/MusicalScore/Instrument.ts

@@ -15,7 +15,10 @@ export class Instrument extends InstrumentalGroup {
         this.nameLabel = new Label(idString);
     }
 
-    public transpose: number = 0;
+    /** Transposition halftones for this instrument only.
+     * You need to call osmd.updateGraphic() before the next render() (assuming this is set after load()).
+     */
+    public Transpose: number = 0;
     public highlight: boolean;
 
     private voices: Voice[] = [];