Ver Fonte

refactor: merge some changes from audio player to facilitate future merges

sschmid há 4 anos atrás
pai
commit
2d3ab26261

+ 5 - 0
src/MusicalScore/Interfaces/IVoiceMeasureReadPlugin.ts

@@ -0,0 +1,5 @@
+import { VoiceEntry, RhythmInstruction, KeyInstruction } from "../VoiceData";
+
+export interface IVoiceMeasureReadPlugin {
+    measureReadCalculations(measureVoiceEntries: VoiceEntry[], activeKey: KeyInstruction, activeRhythm: RhythmInstruction): void;
+}

+ 1 - 0
src/MusicalScore/Interfaces/index.ts

@@ -6,3 +6,4 @@ export * from "./IQualityFeedbackTone";
 export * from "./ITextMeasurer";
 export * from "./ITextTranslation";
 export * from "./ITransposeCalculator";
+export * from "./IVoiceMeasureReadPlugin";

+ 7 - 3
src/MusicalScore/ScoreIO/InstrumentReader.ts

@@ -26,6 +26,7 @@ import {SlurReader} from "./MusicSymbolModules/SlurReader";
 import {StemDirectionType} from "../VoiceData/VoiceEntry";
 import {NoteType, NoteTypeHandler} from "../VoiceData/NoteType";
 import { SystemLinesEnumHelper } from "../Graphical/SystemLinesEnum";
+import { ReaderPluginManager } from "./ReaderPluginManager";
 // import {Dictionary} from "typescript-collections";
 
 // FIXME: The following classes are missing
@@ -54,7 +55,8 @@ import { SystemLinesEnumHelper } from "../Graphical/SystemLinesEnum";
  */
 export class InstrumentReader {
 
-  constructor(repetitionInstructionReader: RepetitionInstructionReader, xmlMeasureList: IXmlElement[], instrument: Instrument) {
+  constructor(pluginManager: ReaderPluginManager, repetitionInstructionReader: RepetitionInstructionReader,
+    xmlMeasureList: IXmlElement[], instrument: Instrument) {
       this.repetitionInstructionReader = repetitionInstructionReader;
       this.xmlMeasureList = xmlMeasureList;
       this.musicSheet = instrument.GetMusicSheet;
@@ -66,12 +68,14 @@ export class InstrumentReader {
       }
       this.createExpressionGenerators(instrument.Staves.length);
       this.slurReader = new SlurReader(this.musicSheet);
+      this.pluginManager = pluginManager;
   }
 
   private repetitionInstructionReader: RepetitionInstructionReader;
   private xmlMeasureList: IXmlElement[];
   private musicSheet: MusicSheet;
   private slurReader: SlurReader;
+  public pluginManager: ReaderPluginManager;
   private instrument: Instrument;
   private voiceGeneratorsDict: { [n: number]: VoiceGenerator } = {};
   private staffMainVoiceGeneratorDict: { [staffId: number]: VoiceGenerator } = {};
@@ -659,11 +663,11 @@ export class InstrumentReader {
     } else {
       const mainVoiceGenerator: VoiceGenerator = this.staffMainVoiceGeneratorDict[staffId];
       if (mainVoiceGenerator) {
-        voiceGenerator = new VoiceGenerator(this.instrument, voiceId, this.slurReader, mainVoiceGenerator.GetVoice);
+        voiceGenerator = new VoiceGenerator(this.pluginManager, staff, voiceId, this.slurReader, mainVoiceGenerator.GetVoice);
         staff.Voices.push(voiceGenerator.GetVoice);
         this.voiceGeneratorsDict[voiceId] = voiceGenerator;
       } else {
-        voiceGenerator = new VoiceGenerator(this.instrument, voiceId, this.slurReader);
+        voiceGenerator = new VoiceGenerator(this.pluginManager, staff, voiceId, this.slurReader);
         staff.Voices.push(voiceGenerator.GetVoice);
         this.voiceGeneratorsDict[voiceId] = voiceGenerator;
         this.staffMainVoiceGeneratorDict[staffId] = voiceGenerator;

+ 7 - 1
src/MusicalScore/ScoreIO/MusicSheetReader.ts

@@ -22,6 +22,7 @@ import {IAfterSheetReadingModule} from "../Interfaces/IAfterSheetReadingModule";
 import {RepetitionInstructionReader} from "./MusicSymbolModules/RepetitionInstructionReader";
 import {RepetitionCalculator} from "./MusicSymbolModules/RepetitionCalculator";
 import {EngravingRules} from "../Graphical/EngravingRules";
+import { ReaderPluginManager } from "./ReaderPluginManager";
 
 export class MusicSheetReader /*implements IMusicSheetReader*/ {
 
@@ -44,8 +45,13 @@ export class MusicSheetReader /*implements IMusicSheetReader*/ {
     private currentMeasure: SourceMeasure;
     private previousMeasure: SourceMeasure;
     private currentFraction: Fraction;
+    private pluginManager: ReaderPluginManager = new ReaderPluginManager();
     public rules: EngravingRules;
 
+    public get PluginManager(): ReaderPluginManager {
+        return this.pluginManager;
+    }
+
     public get CompleteNumberOfStaves(): number {
         return this.completeNumberOfStaves;
     }
@@ -223,7 +229,7 @@ export class MusicSheetReader /*implements IMusicSheetReader*/ {
                 }
 
                 currentInstrument.createStaves(instrumentNumberOfStaves);
-                instrumentReaders.push(new InstrumentReader(this.repetitionInstructionReader, xmlMeasureList, currentInstrument));
+                instrumentReaders.push(new InstrumentReader(this.pluginManager, this.repetitionInstructionReader, xmlMeasureList, currentInstrument));
                 if (this.repetitionInstructionReader) {
                     this.repetitionInstructionReader.xmlMeasureList[counter] = xmlMeasureList;
                 }

+ 20 - 0
src/MusicalScore/ScoreIO/ReaderPluginManager.ts

@@ -0,0 +1,20 @@
+import log from "loglevel";
+import { IVoiceMeasureReadPlugin } from "../Interfaces/IVoiceMeasureReadPlugin";
+import { VoiceEntry, RhythmInstruction, KeyInstruction } from "../VoiceData";
+
+export class ReaderPluginManager {
+    private voiceMeasureReadPlugins: IVoiceMeasureReadPlugin[] = [];
+    public addVoiceMeasureReadPlugin(plugin: IVoiceMeasureReadPlugin): void {
+        this.voiceMeasureReadPlugins.push(plugin);
+    }
+    public processVoiceMeasureReadPlugins(measureVoiceEntries: VoiceEntry[], activeKey: KeyInstruction, currentRhythm: RhythmInstruction): void {
+        for (const plugin of this.voiceMeasureReadPlugins) {
+            try {
+                plugin.measureReadCalculations(measureVoiceEntries, activeKey, currentRhythm);
+            } catch (ex) {
+                log.info("VoiceGenerator.addSingleNote: ", ex);
+            }
+
+        }
+    }
+}

+ 12 - 7
src/MusicalScore/ScoreIO/VoiceGenerator.ts

@@ -1,4 +1,3 @@
-import { Instrument } from "../Instrument";
 import { LinkedVoice } from "../VoiceData/LinkedVoice";
 import { Voice } from "../VoiceData/Voice";
 import { MusicSheet } from "../MusicSheet";
@@ -31,22 +30,27 @@ import { Arpeggio, ArpeggioType } from "../VoiceData/Arpeggio";
 import { NoteType, NoteTypeHandler } from "../VoiceData/NoteType";
 import { TabNote } from "../VoiceData/TabNote";
 import { PlacementEnum } from "../VoiceData/Expressions/AbstractExpression";
+import { ReaderPluginManager } from "./ReaderPluginManager";
+import { Instrument } from "../Instrument";
 
 export class VoiceGenerator {
-  constructor(instrument: Instrument, voiceId: number, slurReader: SlurReader, mainVoice: Voice = undefined) {
-    this.musicSheet = instrument.GetMusicSheet;
+  constructor(pluginManager: ReaderPluginManager, staff: Staff, voiceId: number, slurReader: SlurReader, mainVoice: Voice = undefined) {
+    this.staff = staff;
+    this.instrument = staff.ParentInstrument;
+    this.musicSheet = this.instrument.GetMusicSheet;
     this.slurReader = slurReader;
+    this.pluginManager = pluginManager;
     if (mainVoice) {
-      this.voice = new LinkedVoice(instrument, voiceId, mainVoice);
+      this.voice = new LinkedVoice(this.instrument, voiceId, mainVoice);
     } else {
-      this.voice = new Voice(instrument, voiceId);
+      this.voice = new Voice(this.instrument, voiceId);
     }
-    this.instrument = instrument;
-    this.instrument.Voices.push(this.voice);
+    this.staff.Voices.push(this.voice);
     this.lyricsReader = new LyricsReader(this.musicSheet);
     this.articulationReader = new ArticulationReader();
   }
 
+  public pluginManager: ReaderPluginManager; // currently only used in audio player
   private slurReader: SlurReader;
   private lyricsReader: LyricsReader;
   private articulationReader: ArticulationReader;
@@ -56,6 +60,7 @@ export class VoiceGenerator {
   private currentNote: Note;
   private currentMeasure: SourceMeasure;
   private currentStaffEntry: SourceStaffEntry;
+  private staff: Staff;
   private instrument: Instrument;
   // private lastBeamTag: string = "";
   private openBeams: Beam[] = []; // works like a stack, with push and pop

+ 1 - 0
src/MusicalScore/ScoreIO/index.ts

@@ -5,3 +5,4 @@ export * from "./MusicSheetReader";
 export * from "./MusicSymbolModuleFactory";
 export * from "./VoiceGenerator";
 export * from "./MusicSymbolModules";
+export * from "./ReaderPluginManager";