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