UNPKG

abcjs

Version:

Renderer for abc music notation

57 lines (50 loc) 1.88 kB
var printPath = require('./print-path'); var roundNumber = require("./round-number"); function drawBeam(renderer, params) { if (params.beams.length === 0) return; var pathString = ""; for (var i = 0; i < params.beams.length; i++) { var beam = params.beams[i]; if (beam.split) { var slope = getSlope(renderer, beam.startX, beam.startY, beam.endX, beam.endY); var xes = []; for (var j = 0; j < beam.split.length; j += 2) { xes.push([beam.split[j], beam.split[j + 1]]); } for (j = 0; j < xes.length; j++) { var y1 = getY(beam.startX, beam.startY, slope, xes[j][0]); var y2 = getY(beam.startX, beam.startY, slope, xes[j][1]); pathString += draw(renderer, xes[j][0], y1, xes[j][1], y2, beam.dy); } } else pathString += draw(renderer, beam.startX, beam.startY, beam.endX, beam.endY, beam.dy); } var durationClass = ("abcjs-d" + params.duration).replace(/\./g, "-"); var klasses = renderer.controller.classes.generate('beam-elem ' + durationClass); var el = printPath(renderer, { path: pathString, stroke: "none", fill: renderer.foregroundColor, 'class': klasses }); return [el]; } function draw(renderer, startX, startY, endX, endY, dy) { // the X coordinates are actual coordinates, but the Y coordinates are in pitches. startY = roundNumber(renderer.calcY(startY)); endY = roundNumber(renderer.calcY(endY)); startX = roundNumber(startX); endX = roundNumber(endX); var startY2 = roundNumber(startY + dy); var endY2 = roundNumber(endY + dy); return "M" + startX + " " + startY + " L" + endX + " " + endY + "L" + endX + " " + endY2 + " L" + startX + " " + startY2 + "z"; } function getSlope(renderer, startX, startY, endX, endY) { return (endY - startY) / (endX - startX); } function getY(startX, startY, slope, currentX) { var x = currentX - startX; return startY + x * slope; } module.exports = drawBeam;