Skip to content

Commit d872717

Browse files
committed
glypharticulation support
1 parent 678fc83 commit d872717

File tree

5 files changed

+125
-0
lines changed

5 files changed

+125
-0
lines changed

src/factory.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { Formatter, FormatterOptions } from './formatter';
1717
import { FretHandFinger } from './frethandfinger';
1818
import { GhostNote } from './ghostnote';
1919
import { Glyph } from './glyph';
20+
import { GlyphArticulation } from './glypharticulation';
2021
import { GlyphNote, GlyphNoteOptions } from './glyphnote';
2122
import { GraceNote, GraceNoteStruct } from './gracenote';
2223
import { GraceNoteGroup } from './gracenotegroup';
@@ -391,6 +392,19 @@ export class Factory {
391392
return chordSymbol;
392393
}
393394

395+
GlyphArticulation(code: string, params?: { between_lines?: boolean; position?: string | number }): Articulation {
396+
const p = {
397+
position: 'above',
398+
between_lines: false,
399+
...params,
400+
};
401+
402+
const articulation = new GlyphArticulation(code, p.between_lines);
403+
articulation.setPosition(p.position);
404+
articulation.setContext(this.context);
405+
return articulation;
406+
}
407+
394408
Articulation(params?: { type?: string; position?: string | number }): Articulation {
395409
const p = {
396410
type: 'a.',

src/glypharticulation.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.
2+
// MIT License
3+
4+
import { Articulation } from './articulation';
5+
import { Glyph } from './glyph';
6+
import { Category } from './typeguard';
7+
8+
export class GlyphArticulation extends Articulation {
9+
static get CATEGORY(): string {
10+
return Category.Articulation;
11+
}
12+
13+
constructor(code: string, between_lines = false) {
14+
super('glyph');
15+
this.articulation = { code, between_lines };
16+
this.glyph = new Glyph(code ?? '', this.render_options.font_scale);
17+
this.setWidth(this.glyph.getMetrics().width);
18+
}
19+
20+
protected reset(): void {
21+
// Do nothing.
22+
}
23+
}

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export * from './fraction';
2727
export * from './frethandfinger';
2828
export * from './ghostnote';
2929
export * from './glyph';
30+
export * from './glypharticulation';
3031
export * from './glyphnote';
3132
export * from './gracenote';
3233
export * from './gracenotegroup';

tests/glypharticulation_tests.ts

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
// [VexFlow](https://vexflow.com) - Copyright (c) Mohit Muthanna 2010.
2+
// MIT License
3+
//
4+
// Articulation Tests
5+
6+
import { TestOptions, VexFlowTests } from './vexflow_test_helpers';
7+
8+
import { Formatter } from '../src/formatter';
9+
import { GlyphArticulation } from '../src/glypharticulation';
10+
import { ModifierPosition } from '../src/modifier';
11+
import { ContextBuilder } from '../src/renderer';
12+
import { Stave } from '../src/stave';
13+
import { StaveNote, StaveNoteStruct } from '../src/stavenote';
14+
import { Stem } from '../src/stem';
15+
16+
const GlyphArticulationTests = {
17+
Start(): void {
18+
QUnit.module('GlyphArticulation');
19+
const run = VexFlowTests.runTests;
20+
run('GlyphArticulation - Vertical Placement', verticalPlacement);
21+
},
22+
};
23+
24+
function verticalPlacement(options: TestOptions, contextBuilder: ContextBuilder): void {
25+
const ctx = contextBuilder(options.elementId, 750, 300);
26+
27+
const staveNote = (noteStruct: StaveNoteStruct) => new StaveNote(noteStruct);
28+
const stave = new Stave(10, 50, 750).addClef('treble').setContext(ctx).draw();
29+
30+
const notes = [
31+
staveNote({ keys: ['f/4'], duration: 'q' })
32+
.addModifier(new GlyphArticulation('fermataBelow').setPosition(ModifierPosition.BELOW), 0)
33+
.addModifier(new GlyphArticulation('augmentationDot').setPosition(ModifierPosition.BELOW), 0)
34+
.addModifier(new GlyphArticulation('articTenutoBelow').setPosition(ModifierPosition.BELOW), 0),
35+
staveNote({ keys: ['g/4'], duration: 'q', stem_direction: Stem.DOWN })
36+
.addModifier(new GlyphArticulation('fermataBelow').setPosition(ModifierPosition.BELOW), 0)
37+
.addModifier(new GlyphArticulation('augmentationDot').setPosition(ModifierPosition.BELOW), 0)
38+
.addModifier(new GlyphArticulation('articTenutoBelow').setPosition(ModifierPosition.BELOW), 0),
39+
staveNote({ keys: ['c/5'], duration: 'q' })
40+
.addModifier(new GlyphArticulation('fermataBelow').setPosition(ModifierPosition.BELOW), 0)
41+
.addModifier(new GlyphArticulation('augmentationDot').setPosition(ModifierPosition.BELOW), 0)
42+
.addModifier(new GlyphArticulation('articTenutoBelow').setPosition(ModifierPosition.BELOW), 0),
43+
staveNote({ keys: ['f/4'], duration: 'q' })
44+
.addModifier(new GlyphArticulation('augmentationDot').setPosition(ModifierPosition.BELOW), 0)
45+
.addModifier(new GlyphArticulation('articTenutoBelow').setPosition(ModifierPosition.BELOW), 0)
46+
.addModifier(new GlyphArticulation('fermataBelow').setPosition(ModifierPosition.BELOW), 0),
47+
staveNote({ keys: ['g/4'], duration: 'q', stem_direction: Stem.DOWN })
48+
.addModifier(new GlyphArticulation('augmentationDot').setPosition(ModifierPosition.BELOW), 0)
49+
.addModifier(new GlyphArticulation('articTenutoBelow').setPosition(ModifierPosition.BELOW), 0)
50+
.addModifier(new GlyphArticulation('fermataBelow').setPosition(ModifierPosition.BELOW), 0),
51+
staveNote({ keys: ['c/5'], duration: 'q' })
52+
.addModifier(new GlyphArticulation('augmentationDot', true).setPosition(ModifierPosition.BELOW), 0)
53+
.addModifier(new GlyphArticulation('articTenutoBelow', true).setPosition(ModifierPosition.BELOW), 0)
54+
.addModifier(new GlyphArticulation('fermataBelow').setPosition(ModifierPosition.BELOW), 0),
55+
staveNote({ keys: ['a/5'], duration: 'q', stem_direction: Stem.DOWN })
56+
.addModifier(new GlyphArticulation('fermataAbove').setPosition(ModifierPosition.ABOVE), 0)
57+
.addModifier(new GlyphArticulation('augmentationDot').setPosition(ModifierPosition.ABOVE), 0)
58+
.addModifier(new GlyphArticulation('articTenutoAbove').setPosition(ModifierPosition.ABOVE), 0),
59+
staveNote({ keys: ['f/5'], duration: 'q' })
60+
.addModifier(new GlyphArticulation('fermataAbove').setPosition(ModifierPosition.ABOVE), 0)
61+
.addModifier(new GlyphArticulation('augmentationDot').setPosition(ModifierPosition.ABOVE), 0)
62+
.addModifier(new GlyphArticulation('articTenutoAbove').setPosition(ModifierPosition.ABOVE), 0),
63+
staveNote({ keys: ['b/4'], duration: 'q', stem_direction: Stem.DOWN })
64+
.addModifier(new GlyphArticulation('fermataAbove').setPosition(ModifierPosition.ABOVE), 0)
65+
.addModifier(new GlyphArticulation('augmentationDot').setPosition(ModifierPosition.ABOVE), 0)
66+
.addModifier(new GlyphArticulation('articTenutoAbove').setPosition(ModifierPosition.ABOVE), 0),
67+
staveNote({ keys: ['a/5'], duration: 'q', stem_direction: Stem.DOWN })
68+
.addModifier(new GlyphArticulation('augmentationDot').setPosition(ModifierPosition.ABOVE), 0)
69+
.addModifier(new GlyphArticulation('articTenutoAbove').setPosition(ModifierPosition.ABOVE), 0)
70+
.addModifier(new GlyphArticulation('fermataAbove').setPosition(ModifierPosition.ABOVE), 0),
71+
staveNote({ keys: ['f/5'], duration: 'q' })
72+
.addModifier(new GlyphArticulation('augmentationDot').setPosition(ModifierPosition.ABOVE), 0)
73+
.addModifier(new GlyphArticulation('articTenutoAbove').setPosition(ModifierPosition.ABOVE), 0)
74+
.addModifier(new GlyphArticulation('fermataAbove').setPosition(ModifierPosition.ABOVE), 0),
75+
staveNote({ keys: ['b/4'], duration: 'q', stem_direction: Stem.DOWN })
76+
.addModifier(new GlyphArticulation('augmentationDot', true).setPosition(ModifierPosition.ABOVE), 0)
77+
.addModifier(new GlyphArticulation('articTenutoAbove', true).setPosition(ModifierPosition.ABOVE), 0)
78+
.addModifier(new GlyphArticulation('fermataAbove').setPosition(ModifierPosition.ABOVE), 0),
79+
];
80+
81+
Formatter.FormatAndDraw(ctx, stave, notes);
82+
ok(true, ' Annotation Placement');
83+
}
84+
85+
VexFlowTests.register(GlyphArticulationTests);
86+
export { GlyphArticulationTests };

tests/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export * from './font_tests';
3636
export * from './formatter_tests';
3737
export * from './fraction_tests';
3838
export * from './ghostnote_tests';
39+
export * from './glypharticulation_tests';
3940
export * from './glyphnote_tests';
4041
export * from './gracenote_tests';
4142
export * from './gracetabnote_tests';

0 commit comments

Comments
 (0)