vexflow
Version:
A JavaScript library for rendering music notation and guitar tablature
352 lines (301 loc) • 9.54 kB
JavaScript
/**
* VexFlow - Key Signature Tests
* Copyright Mohit Muthanna 2010 <mohit@muthanna.com>
*/
VF.Test.KeySignature = (function() {
function catchError(spec) {
try {
VF.keySignature(spec);
} catch (e) {
equal(e.code, 'BadKeySignature', e.message);
}
}
KeySignature = {
MAJOR_KEYS: [
'C',
'F',
'Bb',
'Eb',
'Ab',
'Db',
'Gb',
'Cb',
'G',
'D',
'A',
'E',
'B',
'F#',
'C#',
],
MINOR_KEYS: [
'Am',
'Dm',
'Gm',
'Cm',
'Fm',
'Bbm',
'Ebm',
'Abm',
'Em',
'Bm',
'F#m',
'C#m',
'G#m',
'D#m',
'A#m',
],
Start: function() {
QUnit.module('KeySignature');
test('Key Parser Test', VF.Test.KeySignature.parser);
VF.Test.runTests('Major Key Test', VF.Test.KeySignature.majorKeys);
VF.Test.runTests('Minor Key Test', VF.Test.KeySignature.minorKeys);
VF.Test.runTests('Stave Helper', VF.Test.KeySignature.staveHelper);
VF.Test.runTests('Cancelled key test', VF.Test.KeySignature.majorKeysCanceled);
VF.Test.runTests('Cancelled key (for each clef) test', VF.Test.KeySignature.keysCanceledForEachClef);
VF.Test.runTests('Altered key test', VF.Test.KeySignature.majorKeysAltered);
VF.Test.runTests('End key with clef test', VF.Test.KeySignature.endKeyWithClef);
VF.Test.runTests('Key Signature Change test', VF.Test.KeySignature.changeKey);
},
parser: function() {
expect(11);
catchError('asdf');
catchError('D!');
catchError('E#');
catchError('D#');
catchError('#');
catchError('b');
catchError('Kb');
catchError('Fb');
catchError('Ab');
catchError('Dbm');
catchError('B#m');
VF.keySignature('B');
VF.keySignature('C');
VF.keySignature('Fm');
VF.keySignature('Ab');
VF.keySignature('Abm');
VF.keySignature('F#');
VF.keySignature('G#m');
ok(true, 'all pass');
},
majorKeys: function(options, contextBuilder) {
var ctx = new contextBuilder(options.elementId, 400, 240);
var stave = new VF.Stave(10, 10, 350);
var stave2 = new VF.Stave(10, 90, 350);
var keys = VF.Test.KeySignature.MAJOR_KEYS;
var keySig = null;
for (var i = 0; i < 8; ++i) {
keySig = new VF.KeySignature(keys[i]);
keySig.addToStave(stave);
}
for (var n = 8; n < keys.length; ++n) {
keySig = new VF.KeySignature(keys[n]);
keySig.addToStave(stave2);
}
stave.setContext(ctx);
stave.draw();
stave2.setContext(ctx);
stave2.draw();
ok(true, 'all pass');
},
majorKeysCanceled: function(options, contextBuilder) {
var ctx = new contextBuilder(options.elementId, 780, 500);
ctx.scale(0.9, 0.9);
var stave = new VF.Stave(10, 10, 750).addTrebleGlyph();
var stave2 = new VF.Stave(10, 90, 750).addTrebleGlyph();
var stave3 = new VF.Stave(10, 170, 750).addTrebleGlyph();
var stave4 = new VF.Stave(10, 250, 750).addTrebleGlyph();
var keys = VF.Test.KeySignature.MAJOR_KEYS;
var keySig = null;
var i;
var n;
for (i = 0; i < 8; ++i) {
keySig = new VF.KeySignature(keys[i]);
keySig.cancelKey('Cb');
keySig.padding = 18;
keySig.addToStave(stave);
}
for (n = 8; n < keys.length; ++n) {
keySig = new VF.KeySignature(keys[n]);
keySig.cancelKey('C#');
keySig.padding = 20;
keySig.addToStave(stave2);
}
for (i = 0; i < 8; ++i) {
keySig = new VF.KeySignature(keys[i]);
keySig.cancelKey('E');
keySig.padding = 18;
keySig.addToStave(stave3);
}
for (n = 8; n < keys.length; ++n) {
keySig = new VF.KeySignature(keys[n]);
keySig.cancelKey('Ab');
keySig.padding = 20;
keySig.addToStave(stave4);
}
stave.setContext(ctx);
stave.draw();
stave2.setContext(ctx);
stave2.draw();
stave3.setContext(ctx);
stave3.draw();
stave4.setContext(ctx);
stave4.draw();
ok(true, 'all pass');
},
keysCanceledForEachClef: function(options, contextBuilder) {
var ctx = new contextBuilder(options.elementId, 600, 380);
ctx.scale(0.8, 0.8);
var keys = [
'C#',
'Cb'
];
var x = 20;
var y = 20;
var tx = x;
['bass', 'tenor', 'soprano', 'mezzo-soprano', 'baritone-f'].forEach(function(clef) {
keys.forEach(function(key) {
var cancelKey = key === keys[0] ? keys[1] : keys[0];
var vStave = new Vex.Flow.Stave(tx, y, 350);
vStave.setClef(clef);
vStave.addKeySignature(cancelKey);
vStave.addKeySignature(key, cancelKey);
vStave.addKeySignature(key);
vStave.setContext(ctx).draw();
tx += 350;
});
tx = x;
y += 80;
});
ok(true, 'all pass');
},
majorKeysAltered: function(options, contextBuilder) {
var ctx = new contextBuilder(options.elementId, 780, 500);
ctx.scale(0.9, 0.9);
var stave = new VF.Stave(10, 10, 750).addTrebleGlyph();
var stave2 = new VF.Stave(10, 90, 750).addTrebleGlyph();
var stave3 = new VF.Stave(10, 170, 750).addTrebleGlyph();
var stave4 = new VF.Stave(10, 250, 750).addTrebleGlyph();
var keys = VF.Test.KeySignature.MAJOR_KEYS;
var keySig = null;
var i;
var n;
for (i = 0; i < 8; ++i) {
keySig = new VF.KeySignature(keys[i]);
keySig.alterKey(['bs', 'bs']);
keySig.padding = 18;
keySig.addToStave(stave);
}
for (n = 8; n < keys.length; ++n) {
keySig = new VF.KeySignature(keys[n]);
keySig.alterKey(['+', '+', '+']);
keySig.padding = 20;
keySig.addToStave(stave2);
}
for (i = 0; i < 8; ++i) {
keySig = new VF.KeySignature(keys[i]);
keySig.alterKey(['n', 'bs', 'bb']);
keySig.padding = 18;
keySig.addToStave(stave3);
}
for (n = 8; n < keys.length; ++n) {
keySig = new VF.KeySignature(keys[n]);
keySig.alterKey(['++', '+', 'n', '+']);
keySig.padding = 20;
keySig.addToStave(stave4);
}
stave.setContext(ctx);
stave.draw();
stave2.setContext(ctx);
stave2.draw();
stave3.setContext(ctx);
stave3.draw();
stave4.setContext(ctx);
stave4.draw();
ok(true, 'all pass');
},
minorKeys: function(options, contextBuilder) {
var ctx = new contextBuilder(options.elementId, 400, 240);
var stave = new VF.Stave(10, 10, 350);
var stave2 = new VF.Stave(10, 90, 350);
var keys = VF.Test.KeySignature.MINOR_KEYS;
var keySig = null;
for (var i = 0; i < 8; ++i) {
keySig = new VF.KeySignature(keys[i]);
keySig.addToStave(stave);
}
for (var n = 8; n < keys.length; ++n) {
keySig = new VF.KeySignature(keys[n]);
keySig.addToStave(stave2);
}
stave.setContext(ctx);
stave.draw();
stave2.setContext(ctx);
stave2.draw();
ok(true, 'all pass');
},
endKeyWithClef: function(options, contextBuilder) {
var ctx = new contextBuilder(options.elementId, 400, 200);
ctx.scale(0.9, 0.9);
var stave1 = new VF.Stave(10, 10, 350);
stave1.setKeySignature('G')
.setBegBarType(VF.Barline.type.REPEAT_BEGIN)
.setEndBarType(VF.Barline.type.REPEAT_END)
.setClef('treble')
.addTimeSignature('4/4')
.setEndClef('bass')
.setEndKeySignature('Cb');
var stave2 = new VF.Stave(10, 90, 350);
stave2.setKeySignature('Cb')
.setClef('bass')
.setEndClef('treble')
.setEndKeySignature('G');
stave1.setContext(ctx).draw();
stave2.setContext(ctx).draw();
ok(true, 'all pass');
},
staveHelper: function(options, contextBuilder) {
var ctx = new contextBuilder(options.elementId, 400, 240);
var stave = new VF.Stave(10, 10, 350);
var stave2 = new VF.Stave(10, 90, 350);
var keys = VF.Test.KeySignature.MAJOR_KEYS;
for (var i = 0; i < 8; ++i) {
stave.addKeySignature(keys[i]);
}
for (var n = 8; n < keys.length; ++n) {
stave2.addKeySignature(keys[n]);
}
stave.setContext(ctx);
stave.draw();
stave2.setContext(ctx);
stave2.draw();
ok(true, 'all pass');
},
changeKey: function(options) {
var vf = VF.Test.makeFactory(options, 900);
var stave = vf.Stave(10, 10, 800)
.addClef('treble')
.addTimeSignature('C|');
var voice = vf.Voice().setStrict(false).addTickables([
vf.KeySigNote({ key: 'Bb' }),
vf.StaveNote({ keys: ['c/4'], duration: '1' }),
vf.BarNote(),
vf.KeySigNote({ key: 'D', cancelKey: 'Bb' }),
vf.StaveNote({ keys: ['c/4'], duration: '1' }),
vf.BarNote(),
vf.KeySigNote({ key: 'Bb' }),
vf.StaveNote({ keys: ['c/4'], duration: '1' }),
vf.BarNote(),
vf.KeySigNote({ key: 'D', alterKey: ['b', 'n'] }),
vf.StaveNote({ keys: ['c/4'], duration: '1' }),
]);
vf.Formatter()
.joinVoices([voice])
.formatToStave([voice], stave);
vf.draw();
ok(true, 'all pass');
}
};
return KeySignature;
}());