Преглед изворни кода

cherry-picked from Tab Branch

Matthias Uiberacker пре 7 година
родитељ
комит
941bda731c
2 измењених фајлова са 52 додато и 1 уклоњено
  1. 28 1
      src/MusicalScore/ScoreIO/VoiceGenerator.ts
  2. 24 0
      src/MusicalScore/VoiceData/TabNote.ts

+ 28 - 1
src/MusicalScore/ScoreIO/VoiceGenerator.ts

@@ -28,6 +28,7 @@ import { SlurReader } from "./MusicSymbolModules/SlurReader";
 import { Notehead } from "../VoiceData/Notehead";
 import { Arpeggio } from "../VoiceData/Arpeggio";
 import { NoteType } from "../VoiceData/NoteType";
+import { TabNote } from "../VoiceData/TabNote";
 
 export class VoiceGenerator {
   constructor(instrument: Instrument, voiceId: number, slurReader: SlurReader, mainVoice: Voice = undefined) {
@@ -436,7 +437,33 @@ export class VoiceGenerator {
     noteOctave -= Pitch.OctaveXmlDifference;
     const pitch: Pitch = new Pitch(noteStep, noteOctave, noteAccidental);
     const noteLength: Fraction = Fraction.createFromFraction(noteDuration);
-    const note: Note = new Note(this.currentVoiceEntry, this.currentStaffEntry, noteLength, pitch);
+    let note: Note = undefined;
+    let stringNumber: number = -1;
+    let fretNumber: number = -1;
+    // check for guitar tabs:
+    const notationNode: IXmlElement = node.element("notations");
+    if (notationNode !== undefined) {
+      const technicalNode: IXmlElement = notationNode.element("technical");
+      if (technicalNode !== undefined) {
+        const stringNode: IXmlElement = technicalNode.element("string");
+        if (stringNode !== undefined) {
+          stringNumber = parseInt(stringNode.value, 10);
+        }
+        const fretNode: IXmlElement = technicalNode.element("fret");
+        if (fretNode !== undefined) {
+          fretNumber = parseInt(fretNode.value, 10);
+        }
+      }
+    }
+
+    if (stringNumber < 0 || fretNumber < 0) {
+      // create normal Note
+      note = new Note(this.currentVoiceEntry, this.currentStaffEntry, noteLength, pitch);
+    } else {
+      // create TabNote
+      note = new TabNote(this.currentVoiceEntry, this.currentStaffEntry, noteLength, pitch, stringNumber, fretNumber);
+    }
+
     note.TypeLength = typeDuration;
     note.NoteTypeXml = noteTypeXml;
     note.NormalNotes = normalNotes;

+ 24 - 0
src/MusicalScore/VoiceData/TabNote.ts

@@ -0,0 +1,24 @@
+import { Note } from "./Note";
+import { Fraction } from "../../Common/DataObjects/Fraction";
+import { VoiceEntry } from "./VoiceEntry";
+import { SourceStaffEntry } from "./SourceStaffEntry";
+import { Pitch } from "../../Common/DataObjects/Pitch";
+
+export class TabNote extends Note {
+    constructor(voiceEntry: VoiceEntry, parentStaffEntry: SourceStaffEntry, length: Fraction, pitch: Pitch, stringNumber: number, fretNumber: number) {
+        super(voiceEntry, parentStaffEntry, length, pitch);
+        this.stringNumber = stringNumber;
+        this.fretNumber = fretNumber;
+    }
+
+    private stringNumber: number;
+    private fretNumber: number;
+
+    public get StringNumber(): number {
+        return this.stringNumber;
+    }
+
+    public get FretNumber(): number {
+        return this.fretNumber;
+    }
+}