1// abc2svg - ABC to SVG translator 2// @source: https://chiselapp.com/user/moinejf/repository/abc2svg 3// Copyright (C) 2014-2019 Jean-Francois Moine - LGPL3+ 4//equalbars.js-module to set equal spaced measure bars 5abc2svg.equalbars={output_music:function(of){this.equalbars_d=0;of()},set_fmt:function(of,cmd,param){if(cmd=="equalbars") 6this.cfmt().equalbars=this.get_bool(param) 7else 8of(cmd,param)},set_sym_glue:function(of,width){var C=abc2svg.C,s,s2,w,i,n,x,g,t,t0,bars=[],tsfirst=this.get_tsfirst();of(width) 9if(!this.cfmt().equalbars) 10return 11for(s2=tsfirst;s2;s2=s2.ts_next){switch(s2.type){default:continue 12case C.GRACE:case C.MREST:case C.NOTE:case C.REST:case C.SPACE:break} 13break} 14if(!s2) 15return 16t0=t=s2.time 17for(s=s2;s.ts_next;s=s.ts_next){if(s.type==C.BAR&&s.seqst){bars.push([s,s.time-t]);t=s.time}} 18if(!s.invis||s.prev.type!=C.KEY) 19bars.push([s,s.time-t]) 20else 21bars[bars.length-1][0]=s 22width=s.x 23t=s.time 24if(s.dur) 25t+=s.dur;n=bars.length 26if(n<=1) 27return 28x=s2.type==C.GRACE?s2.extra.x:s2.x;if(this.equalbars_d<x) 29this.equalbars_d=x 30d=this.equalbars_d 31w=(width-d)/(t-t0) 32for(i=0;i<n;i++){s=bars[i][0];f=w*bars[i][1]/(s.x-x) 33for(;s2!=s;s2=s2.ts_next){if(s2.type==C.GRACE){for(g=s2.extra;g;g=g.next) 34g.x=d+(g.x-x)*f}else if(s2.x){s2.x=d+(s2.x-x)*f}} 35d+=w*bars[i][1];x=s2.x 36while(1){s2.x=d;s2=s2.ts_next 37if(!s2||s2.seqst) 38break} 39if(!s2) 40break}},set_hooks:function(abc){abc.output_music=abc2svg.equalbars.output_music.bind(abc,abc.output_music);abc.set_format=abc2svg.equalbars.set_fmt.bind(abc,abc.set_format);abc.set_sym_glue=abc2svg.equalbars.set_sym_glue.bind(abc,abc.set_sym_glue)}} 41abc2svg.modules.hooks.push(abc2svg.equalbars.set_hooks);abc2svg.modules.equalbars.loaded=true 42