vexflow
Version:
A JavaScript library for rendering music notation and guitar tablature.
107 lines (106 loc) • 4.2 kB
JavaScript
import { MAJOR_KEYS, MINOR_KEYS, VexFlowTests } from './vexflow_test_helpers.js';
import { Element } from '../src/element.js';
import { Glyphs } from '../src/glyphs.js';
import { KeySignature } from '../src/keysignature.js';
import { Stave } from '../src/stave.js';
const ClefKeySignatureTests = {
Start() {
QUnit.module('Clef Keys');
const run = VexFlowTests.runTests;
run('Major Key Clef Test', keys, { majorKeys: true });
run('Minor Key Clef Test', keys, { majorKeys: false });
run('Stave Helper', staveHelper);
},
};
const fontWidths = () => {
const sharpWidth = Element.measureWidth(Glyphs.accidentalSharp) + 1;
const flatWidth = Element.measureWidth(Glyphs.accidentalFlat) + 1;
const ksPadding = 10;
const naturalWidth = Element.measureWidth(Glyphs.accidentalNatural) + 2;
const clefWidth = Element.measureWidth(Glyphs.gClef);
return { sharpWidth, flatWidth, naturalWidth, clefWidth, ksPadding };
};
function keys(options, contextBuilder) {
const w = fontWidths();
const accidentalCount = 28;
const sharpTestWidth = accidentalCount * w.sharpWidth + w.clefWidth + Stave.defaultPadding + 6 * w.ksPadding;
const flatTestWidth = accidentalCount * w.flatWidth + w.clefWidth + Stave.defaultPadding + 6 * w.ksPadding;
const clefs = [
'treble',
'soprano',
'mezzo-soprano',
'alto',
'tenor',
'baritone-f',
'baritone-c',
'bass',
'french',
'subbass',
'percussion',
];
const ctx = contextBuilder(options.elementId, Math.max(sharpTestWidth, flatTestWidth) + 100, 20 + 80 * 2 * clefs.length);
const staves = [];
const keys = options.params.majorKeys ? MAJOR_KEYS : MINOR_KEYS;
let i;
let flat;
let sharp;
let keySig;
const yOffsetForFlatStaves = 10 + 80 * clefs.length;
for (i = 0; i < clefs.length; i++) {
staves[i] = new Stave(10, 10 + 80 * i, flatTestWidth);
staves[i].addClef(clefs[i]);
staves[i + clefs.length] = new Stave(10, yOffsetForFlatStaves + 10 + 80 * i, sharpTestWidth);
staves[i + clefs.length].addClef(clefs[i]);
for (flat = 0; flat < 8; flat++) {
keySig = new KeySignature(keys[flat]);
keySig.addToStave(staves[i]);
}
for (sharp = 8; sharp < keys.length; sharp++) {
keySig = new KeySignature(keys[sharp]);
keySig.addToStave(staves[i + clefs.length]);
}
}
Stave.formatBegModifiers(staves);
for (i = 0; i < clefs.length; i++) {
staves[i].setContext(ctx);
staves[i].drawWithStyle();
staves[i + clefs.length].setContext(ctx);
staves[i + clefs.length].drawWithStyle();
}
options.assert.ok(true, 'all pass');
}
function staveHelper(options, contextBuilder) {
const w = fontWidths();
const accidentalCount = 28;
const sharpTestWidth = accidentalCount * w.sharpWidth + w.clefWidth + Stave.defaultPadding + 7 * w.ksPadding;
const flatTestWidth = accidentalCount * w.flatWidth + w.clefWidth + Stave.defaultPadding + 7 * w.ksPadding;
const ctx = contextBuilder(options.elementId, Math.max(sharpTestWidth, flatTestWidth) + 100, 400);
const stave1 = new Stave(10, 10, flatTestWidth);
const stave2 = new Stave(10, 90, flatTestWidth);
const stave3 = new Stave(10, 170, sharpTestWidth);
const stave4 = new Stave(10, 260, sharpTestWidth);
const keys = MAJOR_KEYS;
stave1.addClef('treble');
stave2.addClef('bass');
stave3.addClef('alto');
stave4.addClef('tenor');
for (let n = 0; n < 8; ++n) {
stave1.addKeySignature(keys[n]);
stave2.addKeySignature(keys[n]);
}
for (let i = 8; i < keys.length; ++i) {
stave3.addKeySignature(keys[i]);
stave4.addKeySignature(keys[i]);
}
stave1.setContext(ctx);
stave1.drawWithStyle();
stave2.setContext(ctx);
stave2.drawWithStyle();
stave3.setContext(ctx);
stave3.drawWithStyle();
stave4.setContext(ctx);
stave4.drawWithStyle();
options.assert.ok(true, 'all pass');
}
VexFlowTests.register(ClefKeySignatureTests);
export { ClefKeySignatureTests };