diff --git a/src/app/input/staff-select/staff-select.component.ts b/src/app/input/staff-select/staff-select.component.ts index cb46e25..605b768 100644 --- a/src/app/input/staff-select/staff-select.component.ts +++ b/src/app/input/staff-select/staff-select.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit, HostListener, ViewChild, ElementRef } from '@angular/core'; import { FormControl, FormGroup } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; -import { PitchClass, NoteItem, RestItem, Accid, LigStatus, PlicaStatus, ColorStatus } from '../../utils/MusicItem'; +import { PitchClass, NoteItem, RestItem, Accid, LigStatus, PlicaStatus, ColorStatus, BarlineItem } from '../../utils/MusicItem'; import { StateService } from '../../state-service.service'; import { InputService } from '../input.service'; import { vrvToolkit } from '../../utils/verovio'; @@ -235,6 +235,12 @@ export class StaffSelectComponent implements OnInit { this.processColor(event.key); event.preventDefault(); break; + case '=': + case '|': + case '/': + musicList.addBarline(event.key); + event.preventDefault(); + break; case 'r': case 'R': if (!musicList.hasOpenLigature()) { diff --git a/src/app/utils/MusicItem.ts b/src/app/utils/MusicItem.ts index 53f975a..4a502e2 100644 --- a/src/app/utils/MusicItem.ts +++ b/src/app/utils/MusicItem.ts @@ -457,6 +457,55 @@ export class NoteItem implements MusicItem { } } +export class BarlineItem implements MusicItem { + readonly m_type = "barLine"; + m_line = -1; + m_id: string; + m_barline: string; + + constructor (bar?: string) { + if (bar !== undefined) { + this.m_barline = bar; + } + } + + getHumdrumLine (): string { + let output = ""; + switch (this.m_barline) { + case "/": output += "=|"; break; // single barline (@form = single in mei) + case "|": output += "=||"; break; // double barline (@form = dbl in mei) + case "=": output += "=="; break; // final barline (@form = end in mei) + default: output += ""; break; + } + output += "\t."; + return output; + } + + static parseXML(element: Element): BarlineItem { + let barline = new BarlineItem(); + if (element.hasAttribute("xml:id")) { + barline.m_id = element.getAttribute("xml:id"); + } + if (element.hasAttribute("form")) { + switch(element.getAttribute("form")) { + case "single": + barline.m_barline = "=|"; + break; + case "dbl": + barline.m_barline = "=||"; + break; + case "end": + barline.m_barline = "=="; + break; + default: + barline.m_barline = "=."; // probably an error, so we are marking it as a dotted barline + break; + } + } + return barline; + } +} + export class MusicList { m_list: Array = []; m_index = -1; @@ -568,6 +617,11 @@ export class MusicList { this.runNotationCallback(); } + addBarline (bar: string) { + this.m_list.push(new BarlineItem(bar)); + this.runNotationCallback(); + } + getLastNote(): NoteItem | null { for (let i = this.m_list.length - 1; i >= 0; i--) { if (this.m_list[i].m_type === "note") { diff --git a/src/app/utils/mei.ts b/src/app/utils/mei.ts index 5463de1..9a409de 100644 --- a/src/app/utils/mei.ts +++ b/src/app/utils/mei.ts @@ -1,6 +1,6 @@ import { Part, Tenor } from './part'; import { System, Pb, Sb } from './system'; -import { ClefItem, NoteItem, RestItem, MensurItem } from './MusicItem'; +import { ClefItem, NoteItem, RestItem, MensurItem, BarlineItem } from './MusicItem'; import { Voice, Mensuration, Contributor, Sign } from './definitions'; import { IRI } from './definitions'; @@ -260,6 +260,9 @@ export class MEIDocument { } else if (child.tagName === "mensur") { let mensur = MensurItem.parseXML(child); activeSystem.contents.m_list.push(mensur); + } else if (child.tagName === "barLine") { + let barline = BarlineItem.parseXML(child); + activeSystem.contents.m_list.push(barline); } } }