vexflow
Version:
A JavaScript library for rendering music notation and guitar tablature
422 lines (348 loc) • 13.7 kB
JavaScript
/**
* VexFlow - Auto-beaming Tests
* Copyright Mohit Muthanna 2010 <mohit@muthanna.com>
*/
var VF = Vex.Flow;
VF.Test.BachDemo = (function() {
function concat(a, b) { return a.concat(b); }
var BachDemo = {
Start: function() {
var runTests = VF.Test.runTests;
QUnit.module('Bach Demo');
runTests('Minuet 1', BachDemo.minuet1);
},
minuet1: function(options) {
var registry = new VF.Registry();
VF.Registry.enableDefaultRegistry(registry);
var vf = VF.Test.makeFactory(options, 1100, 900);
var score = vf.EasyScore({ throwOnError: true });
var voice = score.voice.bind(score);
var notes = score.notes.bind(score);
var beam = score.beam.bind(score);
var x = 120;
var y = 80;
function makeSystem(width) {
var system = vf.System({ x: x, y: y, width: width, spaceBetweenStaves: 10 });
x += width;
return system;
}
function id(id) { return registry.getElementById(id); }
score.set({ time: '3/4' });
/* Measure 1 */
var system = makeSystem(220);
system.addStave({
voices: [
voice([
notes('D5/q[id="m1a"]'),
beam(notes('G4/8, A4, B4, C5', { stem: 'up' })),
].reduce(concat)),
voice([vf.TextDynamics({ text: 'p', duration: 'h', dots: 1, line: 9 })]),
],
})
.addClef('treble')
.addKeySignature('G')
.addTimeSignature('3/4')
.setTempo({ name: 'Allegretto', duration: 'h', dots: 1, bpm: 66 }, -30);
system.addStave({ voices: [voice(notes('(G3 B3 D4)/h, A3/q', { clef: 'bass' }))] })
.addClef('bass').addKeySignature('G').addTimeSignature('3/4');
system.addConnector('brace');
system.addConnector('singleRight');
system.addConnector('singleLeft');
id('m1a').addModifier(0, vf.Fingering({ number: '5' }));
/* Measure 2 */
system = makeSystem(150);
system.addStave({ voices: [voice(notes('D5/q[id="m2a"], G4[id="m2b"], G4[id="m2c"]'))] });
system.addStave({ voices: [voice(notes('B3/h.', { clef: 'bass' }))] });
system.addConnector('singleRight');
id('m2a').addModifier(0, vf.Articulation({ type: 'a.', position: 'above' }));
id('m2b').addModifier(0, vf.Articulation({ type: 'a.', position: 'below' }));
id('m2c').addModifier(0, vf.Articulation({ type: 'a.', position: 'below' }));
vf.Curve({
from: id('m1a'),
to: id('m2a'),
options: { cps: [{ x: 0, y: 40 }, { x: 0, y: 40 }] },
});
/* Measure 3 */
system = makeSystem(150);
system.addStave({
voices: [
voice([
notes('E5/q[id="m3a"]'),
beam(notes('C5/8, D5, E5, F5', { stem: 'down' })),
].reduce(concat)),
],
});
id('m3a').addModifier(0, vf.Fingering({ number: '3', position: 'above' }));
system.addStave({ voices: [voice(notes('C4/h.', { clef: 'bass' }))] });
system.addConnector('singleRight');
/* Measure 4 */
system = makeSystem(150);
system.addStave({ voices: [voice(notes('G5/q[id="m4a"], G4[id="m4b"], G4[id="m4c"]'))] });
system.addStave({ voices: [voice(notes('B3/h.', { clef: 'bass' }))] });
system.addConnector('singleRight');
id('m4a').addModifier(0, vf.Articulation({ type: 'a.', position: 'above' }));
id('m4b').addModifier(0, vf.Articulation({ type: 'a.', position: 'below' }));
id('m4c').addModifier(0, vf.Articulation({ type: 'a.', position: 'below' }));
vf.Curve({
from: id('m3a'),
to: id('m4a'),
options: { cps: [{ x: 0, y: 20 }, { x: 0, y: 20 }] },
});
/* Measure 5 */
system = makeSystem(150);
system.addStave({
voices: [
voice([
notes('C5/q[id="m5a"]'),
beam(notes('D5/8, C5, B4, A4', { stem: 'down' })),
].reduce(concat)),
],
});
id('m5a').addModifier(0, vf.Fingering({ number: '4', position: 'above' }));
system.addStave({ voices: [voice(notes('A3/h.', { clef: 'bass' }))] });
system.addConnector('singleRight');
/* Measure 6 */
system = makeSystem(150);
system.addStave({
voices: [
voice([
notes('B4/q'),
beam(notes('C5/8, B4, A4, G4[id="m6a"]', { stem: 'up' })),
].reduce(concat)),
],
});
system.addStave({ voices: [voice(notes('G3/h.', { clef: 'bass' }))] });
system.addConnector('singleRight');
vf.Curve({
from: id('m5a'),
to: id('m6a'),
options: {
cps: [{ x: 0, y: 20 }, { x: 0, y: 20 }],
invert: true,
position_end: 'nearTop',
y_shift: 20,
},
});
/* Measure 7 (New system) */
x = 20;
y += 230;
system = makeSystem(220);
system.addStave({
voices: [
voice([
notes('F4/q[id="m7a"]'),
beam(notes('G4/8[id="m7b"], A4, B4, G4', { stem: 'up' })),
].reduce(concat)),
],
}).addClef('treble').addKeySignature('G');
system.addStave({ voices: [voice(notes('D4/q, B3[id="m7c"], G3', { clef: 'bass' }))] })
.addClef('bass').addKeySignature('G');
system.addConnector('brace');
system.addConnector('singleRight');
system.addConnector('singleLeft');
id('m7a').addModifier(0, vf.Fingering({ number: '2', position: 'below' }));
id('m7b').addModifier(0, vf.Fingering({ number: '1' }));
id('m7c').addModifier(0, vf.Fingering({ number: '3', position: 'above' }));
/* Measure 8 */
system = makeSystem(180);
var grace = vf.GraceNote({ keys: ['d/3'], clef: 'bass', duration: '8', slash: true });
system.addStave({ voices: [voice(notes('A4/h.[id="m8c"]'))] });
system.addStave({
voices: [
score.set({ clef: 'bass' }).voice([
notes('D4/q[id="m8a"]'),
beam(notes('D3/8, C4, B3[id="m8b"], A3', { stem: 'down' })),
].reduce(concat)),
],
});
system.addConnector('singleRight');
id('m8b').addModifier(0, vf.Fingering({ number: '1', position: 'above' }));
id('m8c').addModifier(0, vf.GraceNoteGroup({ notes: [grace] }));
vf.Curve({
from: id('m7a'),
to: id('m8c'),
options: {
cps: [{ x: 0, y: 20 }, { x: 0, y: 20 }],
invert: true,
position: 'nearTop',
position_end: 'nearTop',
},
});
vf.StaveTie({ from: grace, to: id('m8c') });
/* Measure 9 */
system = makeSystem(180);
system.addStave({
voices: [
score.set({ clef: 'treble' }).voice([
notes('D5/q[id="m9a"]'),
beam(notes('G4/8, A4, B4, C5', { stem: 'up' })),
].reduce(concat)),
],
});
system.addStave({ voices: [voice(notes('B3/h, A3/q', { clef: 'bass' }))] });
system.addConnector('singleRight');
id('m9a').addModifier(0, vf.Fingering({ number: '5' }));
/* Measure 10 */
system = makeSystem(170);
system.addStave({ voices: [voice(notes('D5/q[id="m10a"], G4[id="m10b"], G4[id="m10c"]'))] });
system.addStave({ voices: [voice(notes('G3/q[id="m10d"], B3, G3', { clef: 'bass' }))] });
system.addConnector('singleRight');
id('m10a').addModifier(0, vf.Articulation({ type: 'a.', position: 'above' }));
id('m10b').addModifier(0, vf.Articulation({ type: 'a.', position: 'below' }));
id('m10c').addModifier(0, vf.Articulation({ type: 'a.', position: 'below' }));
id('m10d').addModifier(0, vf.Fingering({ number: '4' }));
vf.Curve({
from: id('m9a'),
to: id('m10a'),
options: { cps: [{ x: 0, y: 40 }, { x: 0, y: 40 }] },
});
/* Measure 11 */
system = makeSystem(150);
system.addStave({
voices: [
voice([
notes('E5/q[id="m11a"]'),
beam(notes('C5/8, D5, E5, F5', { stem: 'down' })),
].reduce(concat)),
],
});
id('m11a').addModifier(0, vf.Fingering({ number: '3', position: 'above' }));
system.addStave({ voices: [voice(notes('C4/h.', { clef: 'bass' }))] });
system.addConnector('singleRight');
/* Measure 12 */
system = makeSystem(170);
system.addStave({ voices: [voice(notes('G5/q[id="m12a"], G4[id="m12b"], G4[id="m12c"]'))] });
system.addStave({
voices: [
score.set({ clef: 'bass' }).voice([
notes('B3/q[id="m12d"]'),
beam(notes('C4/8, B3, A3, G3[id="m12e"]', { stem: 'down' })),
].reduce(concat)),
],
});
system.addConnector('singleRight');
id('m12a').addModifier(0, vf.Articulation({ type: 'a.', position: 'above' }));
id('m12b').addModifier(0, vf.Articulation({ type: 'a.', position: 'below' }));
id('m12c').addModifier(0, vf.Articulation({ type: 'a.', position: 'below' }));
id('m12d').addModifier(0, vf.Fingering({ number: '2', position: 'above' }));
id('m12e').addModifier(0, vf.Fingering({ number: '4', position: 'above' }));
vf.Curve({
from: id('m11a'),
to: id('m12a'),
options: { cps: [{ x: 0, y: 20 }, { x: 0, y: 20 }] },
});
/* Measure 13 (New system) */
x = 20;
y += 230;
system = makeSystem(220);
system.addStave({
voices: [
score.set({ clef: 'treble' }).voice([
notes('c5/q[id="m13a"]'),
beam(notes('d5/8, c5, b4, a4', { stem: 'down' })),
].reduce(concat)),
],
}).addClef('treble').addKeySignature('G');
system.addStave({ voices: [voice(notes('a3/h[id="m13b"], f3/q[id="m13c"]', { clef: 'bass' }))] })
.addClef('bass').addKeySignature('G');
system.addConnector('brace');
system.addConnector('singleRight');
system.addConnector('singleLeft');
id('m13a').addModifier(0, vf.Fingering({ number: '4', position: 'above' }));
id('m13b').addModifier(0, vf.Fingering({ number: '1' }));
id('m13c').addModifier(0, vf.Fingering({ number: '3', position: 'above' }));
/* Measure 14 */
system = makeSystem(180);
system.addStave({
voices: [
score.set({ clef: 'treble' }).voice([
notes('B4/q'),
beam(notes('C5/8, b4, a4, g4', { stem: 'up' })),
].reduce(concat)),
],
});
system.addStave({ voices: [voice(notes('g3/h[id="m14a"], b3/q[id="m14b"]', { clef: 'bass' }))] });
system.addConnector('singleRight');
id('m14a').addModifier(0, vf.Fingering({ number: '2' }));
id('m14b').addModifier(0, vf.Fingering({ number: '1' }));
/* Measure 15 */
system = makeSystem(180);
system.addStave({
voices: [
score.set({ clef: 'treble' }).voice([
notes('a4/q'),
beam(notes('b4/8, a4, g4, f4[id="m15a"]', { stem: 'up' })),
].reduce(concat)),
],
});
system.addStave({ voices: [voice(notes('c4/q[id="m15b"], d4, d3', { clef: 'bass' }))] });
system.addConnector('singleRight');
id('m15a').addModifier(0, vf.Fingering({ number: '2' }));
id('m15b').addModifier(0, vf.Fingering({ number: '2' }));
/* Measure 16 */
system = makeSystem(130);
system.addStave({
voices: [
score.set({ clef: 'treble' }).voice([
notes('g4/h.[id="m16a"]'),
].reduce(concat)),
],
}).setEndBarType(VF.Barline.type.REPEAT_END);
system.addStave({ voices: [voice(notes('g3/h[id="m16b"], g2/q', { clef: 'bass' }))] })
.setEndBarType(VF.Barline.type.REPEAT_END);
system.addConnector('boldDoubleRight');
id('m16a').addModifier(0, vf.Fingering({ number: '1' }));
id('m16b').addModifier(0, vf.Fingering({ number: '1' }));
vf.Curve({
from: id('m13a'),
to: id('m16a'),
options: {
cps: [{ x: 0, y: 50 }, { x: 0, y: 20 }],
invert: true,
position_end: 'nearTop',
},
});
/* Measure 17 */
system = makeSystem(180);
system.addStave({
voices: [
score.set({ clef: 'treble' }).voice([
notes('b5/q[id="m17a"]'),
beam(notes('g5/8, a5, b5, g5', { stem: 'down' })),
].reduce(concat)),
voice([vf.TextDynamics({ text: 'mf', duration: 'h', dots: 1, line: 10 })]),
],
}).setBegBarType(VF.Barline.type.REPEAT_BEGIN);
system.addStave({ voices: [voice(notes('g3/h.', { clef: 'bass' }))] })
.setBegBarType(VF.Barline.type.REPEAT_BEGIN);
system.addConnector('boldDoubleLeft');
system.addConnector('singleRight');
id('m17a').addModifier(0, vf.Fingering({ number: '5', position: 'above' }));
/* Measure 18 */
system = makeSystem(180);
system.addStave({
voices: [
score.set({ clef: 'treble' }).voice([
notes('a5/q[id="m18a"]'),
beam(notes('d5/8, e5, f5, d5[id="m18b"]', { stem: 'down' })),
].reduce(concat)),
],
});
system.addStave({ voices: [voice(notes('f3/h.', { clef: 'bass' }))] });
system.addConnector('singleRight');
id('m18a').addModifier(0, vf.Fingering({ number: '4', position: 'above' }));
vf.Curve({
from: id('m17a'),
to: id('m18b'),
options: {
cps: [{ x: 0, y: 20 }, { x: 0, y: 30 }],
},
});
/* Done */
vf.draw();
VF.Registry.disableDefaultRegistry();
ok(true, 'Bach Minuet 1');
},
};
return BachDemo;
})();