UNPKG

vexflow

Version:

A JavaScript library for rendering music notation and guitar tablature

349 lines (271 loc) 14.5 kB
/** * VexFlow - Rest Tests * Copyright Mohit Muthanna 2010 <mohit@muthanna.com> * */ VF.Test.Rests = (function() { var Rests = { Start: function() { var run = VF.Test.runTests; QUnit.module('Rests'); run('Rests - Dotted', Rests.basic); run('Auto Align Rests - Beamed Notes Stems Up', Rests.beamsUp); run('Auto Align Rests - Beamed Notes Stems Down', Rests.beamsDown); run('Auto Align Rests - Tuplets Stems Up', Rests.tuplets); run('Auto Align Rests - Tuplets Stems Down', Rests.tupletsdown); run('Auto Align Rests - Single Voice (Default)', Rests.staveRests); run('Auto Align Rests - Single Voice (Align All)', Rests.staveRestsAll); run('Auto Align Rests - Multi Voice', Rests.multi); }, setupContext: function(options, contextBuilder, x, y) { var ctx = new contextBuilder(options.elementId, x || 350, y || 150); ctx.scale(0.9, 0.9); ctx.fillStyle = '#221'; ctx.strokeStyle = '#221'; ctx.font = ' 10pt Arial'; var stave = new VF.Stave(10, 30, x || 350) .addTrebleGlyph() .addTimeSignature('4/4') .setContext(ctx) .draw(); return { context: ctx, stave: stave, }; }, basic: function(options, contextBuilder) { var c = VF.Test.Rests.setupContext(options, contextBuilder, 700); var notes = [ new VF.StaveNote({ keys: ['b/4'], stem_direction: 1, duration: 'wr' }).addDotToAll(), new VF.StaveNote({ keys: ['b/4'], stem_direction: 1, duration: 'hr' }).addDotToAll(), new VF.StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '4r' }).addDotToAll(), new VF.StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '8r' }).addDotToAll(), new VF.StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '16r' }).addDotToAll(), new VF.StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '32r' }).addDotToAll(), new VF.StaveNote({ keys: ['b/4'], stem_direction: 1, duration: '64r' }).addDotToAll(), ]; VF.Formatter.FormatAndDraw(c.context, c.stave, notes); ok(true, 'Dotted Rest Test'); }, beamsUp: function(options, b) { var c = VF.Test.Rests.setupContext(options, b, 600, 160); function newNote(note_struct) { return new VF.StaveNote(note_struct); } var notes = [ newNote({ keys: ['e/5'], stem_direction: 1, duration: '8' }), newNote({ keys: ['b/4'], stem_direction: 1, duration: '8r' }), newNote({ keys: ['b/5'], stem_direction: 1, duration: '8' }), newNote({ keys: ['c/5'], stem_direction: 1, duration: '8' }), newNote({ keys: ['b/4', 'd/5', 'a/5'], stem_direction: 1, duration: '8' }), newNote({ keys: ['b/4'], stem_direction: 1, duration: '8r' }), newNote({ keys: ['b/4'], stem_direction: 1, duration: '8r' }), newNote({ keys: ['c/4'], stem_direction: 1, duration: '8' }), newNote({ keys: ['b/4', 'd/5', 'a/5'], stem_direction: 1, duration: '8' }), newNote({ keys: ['b/4'], stem_direction: 1, duration: '8' }), newNote({ keys: ['b/4'], stem_direction: 1, duration: '8r' }), newNote({ keys: ['c/4'], stem_direction: 1, duration: '8' }), ]; var beam1 = new VF.Beam(notes.slice(0, 4)); var beam2 = new VF.Beam(notes.slice(4, 8)); var beam3 = new VF.Beam(notes.slice(8, 12)); VF.Formatter.FormatAndDraw(c.context, c.stave, notes); beam1.setContext(c.context).draw(); beam2.setContext(c.context).draw(); beam3.setContext(c.context).draw(); ok(true, 'Auto Align Rests - Beams Up Test'); }, beamsDown: function(options, b) { var c = VF.Test.Rests.setupContext(options, b, 600, 160); function newNote(note_struct) { return new VF.StaveNote(note_struct); } var notes = [ newNote({ keys: ['a/5'], stem_direction: -1, duration: '8' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), newNote({ keys: ['b/5'], stem_direction: -1, duration: '8' }), newNote({ keys: ['c/5'], stem_direction: -1, duration: '8' }), newNote({ keys: ['b/4', 'd/5', 'a/5'], stem_direction: -1, duration: '8' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), newNote({ keys: ['e/4'], stem_direction: -1, duration: '8' }), newNote({ keys: ['b/4', 'd/5', 'a/5'], stem_direction: -1, duration: '8' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '8' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), newNote({ keys: ['e/4'], stem_direction: -1, duration: '8' }), ]; var beam1 = new VF.Beam(notes.slice(0, 4)); var beam2 = new VF.Beam(notes.slice(4, 8)); var beam3 = new VF.Beam(notes.slice(8, 12)); VF.Formatter.FormatAndDraw(c.context, c.stave, notes); beam1.setContext(c.context).draw(); beam2.setContext(c.context).draw(); beam3.setContext(c.context).draw(); ok(true, 'Auto Align Rests - Beams Down Test'); }, tuplets: function(options, b) { var c = VF.Test.Rests.setupContext(options, b, 600, 160); function newNote(note_struct) { return new VF.StaveNote(note_struct); } var notes = [ newNote({ keys: ['b/4'], stem_direction: 1, duration: '4' }), newNote({ keys: ['b/4'], stem_direction: 1, duration: '4' }), newNote({ keys: ['a/5'], stem_direction: 1, duration: '4r' }), newNote({ keys: ['a/5'], stem_direction: 1, duration: '4r' }), newNote({ keys: ['g/5'], stem_direction: 1, duration: '4r' }), newNote({ keys: ['b/5'], stem_direction: 1, duration: '4' }), newNote({ keys: ['a/5'], stem_direction: 1, duration: '4' }), newNote({ keys: ['g/5'], stem_direction: 1, duration: '4r' }), newNote({ keys: ['b/4'], stem_direction: 1, duration: '4' }), newNote({ keys: ['a/5'], stem_direction: 1, duration: '4' }), newNote({ keys: ['b/4'], stem_direction: 1, duration: '4r' }), newNote({ keys: ['b/4'], stem_direction: 1, duration: '4r' }), ]; var tuplet1 = new VF.Tuplet(notes.slice(0, 3)).setTupletLocation(VF.Tuplet.LOCATION_TOP); var tuplet2 = new VF.Tuplet(notes.slice(3, 6)).setTupletLocation(VF.Tuplet.LOCATION_TOP); var tuplet3 = new VF.Tuplet(notes.slice(6, 9)).setTupletLocation(VF.Tuplet.LOCATION_TOP); var tuplet4 = new VF.Tuplet(notes.slice(9, 12)).setTupletLocation(VF.Tuplet.LOCATION_TOP); VF.Formatter.FormatAndDraw(c.context, c.stave, notes); tuplet1.setContext(c.context).draw(); tuplet2.setContext(c.context).draw(); tuplet3.setContext(c.context).draw(); tuplet4.setContext(c.context).draw(); ok(true, 'Auto Align Rests - Tuplets Stem Up Test'); }, tupletsdown: function(options, b) { var c = VF.Test.Rests.setupContext(options, b, 600, 160); function newNote(note_struct) { return new VF.StaveNote(note_struct); } var notes = [ newNote({ keys: ['a/5'], stem_direction: -1, duration: '8r' }), newNote({ keys: ['g/5'], stem_direction: -1, duration: '8r' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '8' }), newNote({ keys: ['a/5'], stem_direction: -1, duration: '8r' }), newNote({ keys: ['g/5'], stem_direction: -1, duration: '8' }), newNote({ keys: ['b/5'], stem_direction: -1, duration: '8' }), newNote({ keys: ['a/5'], stem_direction: -1, duration: '8' }), newNote({ keys: ['g/5'], stem_direction: -1, duration: '8r' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '8' }), newNote({ keys: ['a/5'], stem_direction: -1, duration: '8' }), newNote({ keys: ['g/5'], stem_direction: -1, duration: '8r' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), ]; var beam1 = new VF.Beam(notes.slice(0, 3)); var beam2 = new VF.Beam(notes.slice(3, 6)); var beam3 = new VF.Beam(notes.slice(6, 9)); var beam4 = new VF.Beam(notes.slice(9, 12)); var tuplet1 = new VF.Tuplet(notes.slice(0, 3)) .setTupletLocation(VF.Tuplet.LOCATION_BOTTOM); var tuplet2 = new VF.Tuplet(notes.slice(3, 6)) .setTupletLocation(VF.Tuplet.LOCATION_BOTTOM); var tuplet3 = new VF.Tuplet(notes.slice(6, 9)) .setTupletLocation(VF.Tuplet.LOCATION_BOTTOM); var tuplet4 = new VF.Tuplet(notes.slice(9, 12)) .setTupletLocation(VF.Tuplet.LOCATION_BOTTOM); VF.Formatter.FormatAndDraw(c.context, c.stave, notes); tuplet1.setContext(c.context).draw(); tuplet2.setContext(c.context).draw(); tuplet3.setContext(c.context).draw(); tuplet4.setContext(c.context).draw(); beam1.setContext(c.context).draw(); beam2.setContext(c.context).draw(); beam3.setContext(c.context).draw(); beam4.setContext(c.context).draw(); ok(true, 'Auto Align Rests - Tuplets Stem Down Test'); }, staveRests: function(options, b) { var c = VF.Test.Rests.setupContext(options, b, 600, 160); function newNote(note_struct) { return new VF.StaveNote(note_struct); } var notes = [ newNote({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), newNote({ keys: ['f/4'], stem_direction: -1, duration: '4' }), newNote({ keys: ['e/5'], stem_direction: -1, duration: '8' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), newNote({ keys: ['a/5'], stem_direction: -1, duration: '8' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '8' }), newNote({ keys: ['e/5'], stem_direction: -1, duration: '8' }), newNote({ keys: ['a/5'], stem_direction: 1, duration: '4' }), newNote({ keys: ['b/4'], stem_direction: 1, duration: '4r' }), newNote({ keys: ['b/5'], stem_direction: 1, duration: '4' }), newNote({ keys: ['d/5'], stem_direction: -1, duration: '4' }), newNote({ keys: ['g/5'], stem_direction: -1, duration: '4' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), ]; var beam1 = new VF.Beam(notes.slice(5, 9)); var tuplet = new VF.Tuplet(notes.slice(9, 12)) .setTupletLocation(VF.Tuplet.LOCATION_TOP); VF.Formatter.FormatAndDraw(c.context, c.stave, notes); tuplet.setContext(c.context).draw(); beam1.setContext(c.context).draw(); ok(true, 'Auto Align Rests - Default Test'); }, staveRestsAll: function(options, b) { var c = VF.Test.Rests.setupContext(options, b, 600, 160); function newNote(note_struct) { return new VF.StaveNote(note_struct); } var notes = [ newNote({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), newNote({ keys: ['f/4'], stem_direction: -1, duration: '4' }), newNote({ keys: ['e/5'], stem_direction: -1, duration: '8' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), newNote({ keys: ['a/5'], stem_direction: -1, duration: '8' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '8' }), newNote({ keys: ['e/5'], stem_direction: -1, duration: '8' }), newNote({ keys: ['a/5'], stem_direction: 1, duration: '4' }), newNote({ keys: ['b/4'], stem_direction: 1, duration: '4r' }), newNote({ keys: ['b/5'], stem_direction: 1, duration: '4' }), newNote({ keys: ['d/5'], stem_direction: -1, duration: '4' }), newNote({ keys: ['g/5'], stem_direction: -1, duration: '4' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '4r' }), ]; var beam1 = new VF.Beam(notes.slice(5, 9)); var tuplet = new VF.Tuplet(notes.slice(9, 12)) .setTupletLocation(VF.Tuplet.LOCATION_TOP); // Set option to position rests near the notes in the voice VF.Formatter.FormatAndDraw(c.context, c.stave, notes, { align_rests: true }); tuplet.setContext(c.context).draw(); beam1.setContext(c.context).draw(); ok(true, 'Auto Align Rests - Align All Test'); }, multi: function(options, contextBuilder) { var ctx = new contextBuilder(options.elementId, 600, 200); var stave = new VF.Stave(50, 10, 500) .addClef('treble') .setContext(ctx) .addTimeSignature('4/4') .draw(); function newNote(note_struct) { return new VF.StaveNote(note_struct).setStave(stave); } var notes1 = [ newNote({ keys: ['c/4', 'e/4', 'g/4'], duration: '4' }), newNote({ keys: ['b/4'], duration: '4r' }), newNote({ keys: ['c/4', 'd/4', 'a/4'], duration: '4' }), newNote({ keys: ['b/4'], duration: '4r' }), ]; var notes2 = [ newNote({ keys: ['e/3'], stem_direction: -1, duration: '8' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), newNote({ keys: ['e/3'], stem_direction: -1, duration: '8' }), newNote({ keys: ['e/3'], stem_direction: -1, duration: '8' }), newNote({ keys: ['b/4'], stem_direction: -1, duration: '8r' }), newNote({ keys: ['e/3'], stem_direction: -1, duration: '8' }), newNote({ keys: ['e/3'], stem_direction: -1, duration: '8' }), ]; var voice = new VF.Voice(VF.Test.TIME4_4).addTickables(notes1); var voice2 = new VF.Voice(VF.Test.TIME4_4).addTickables(notes2); // Set option to position rests near the notes in each voice new VF.Formatter() .joinVoices([voice, voice2]) .formatToStave([voice, voice2], stave, { align_rests: true }); var beam2_1 = new VF.Beam(notes2.slice(0, 4)); var beam2_2 = new VF.Beam(notes2.slice(4, 8)); voice2.draw(ctx); voice.draw(ctx); beam2_1.setContext(ctx).draw(); beam2_2.setContext(ctx).draw(); ok(true, 'Strokes Test Multi Voice'); }, }; return Rests; })();