view release on metacpan or search on metacpan
lib/ChordPro/Output/LaTeX.pm view on Meta::CPAN
my $endlilypond_tag = "[% endlilypond_tag %]";
my $begingrid_tag = "[% begingrid_tag %]";
my $endgrid_tag = "[% endgrid_tag %]";
my $begintab_tag = "[% begintab_tag %]";
my $endtab_tag = "[% endtab_tag %]";
my $gchordstart_tag = "[% gchordstart_tag %]";
my $gchordend_tag = "[% gchordend_tag %]";
my $chorded_line = "[% chorded_line %]";
my $unchorded_line = "[% unchorded_line %]";
my $start_spaces_songline = "[% start_spaces_songline %]";
my $eol = "[% eol %]";
sub generate_songbook {
my ( $self, $sb ) = @_;
my @songs;
$gcfg = $::config->{latex};
$gtemplate = Template->new
({ INCLUDE_PATH => [@{$gcfg->{template_include_path}},
CP->findres("templates"), $CHORDPRO_LIBRARY],
INTERPOLATE => 1,
}) || die "$Template::ERROR\n";
lib/ChordPro/Output/LaTeX.pm view on Meta::CPAN
my $textline = $line;
my $nbsp = $start_spaces_songline; #unicode for nbsp sign # start_spaces_songline
if($empty =~ /^\s+/){ # starts with spaces
$empty =~ s/^(\s+).*$/$1/; # not the elegant solution - but working - replace all spaces in the beginning of a line
my $replaces = $empty; #with a nbsp symbol as the intend tend to be intentional
$replaces =~ s/\s+/$nbsp/g;
$textline =~ s/$empty/$replaces/;
}
$line = $textline;
if ($has_chord) { $line = $chorded_line . $line; } else { $line = $unchorded_line . $line; }
return $line.$eol;
}
$line_routines{line_songline} = \&line_songline;
sub line_newpage {
my ( $lineobject ) = @_;
return $newpage_tag;
}
$line_routines{line_newpage} = \&line_newpage;
sub line_empty {
lib/ChordPro/Output/LaTeX.pm view on Meta::CPAN
$line_routines{line_verse} = \&line_verse;
sub line_set { # potential comments in fe. Chorus or verse or .... complicated handling - potential contextsensitiv.
my ( $lineobject ) = @_;
return '';
}
$line_routines{line_set} = \&line_set;
sub line_tabline {
my ( $lineobject ) = @_;
return $lineobject->{text}.$eol;
}
$line_routines{line_tabline} = \&line_tabline;
sub line_tab {
my ( $lineobject ) = @_;
return $begintab_tag."\n".
elt_handler($lineobject->{body}) .
$endtab_tag ."\n";
}
$line_routines{line_tab} = \&line_tab;
lib/ChordPro/Output/LaTeX.pm view on Meta::CPAN
if ($token->{class} eq 'chord'){
$line .= $token->{chord}->key;
}
else {
$line .= $token->{symbol};
}
}
if(defined $lineobject->{comment}){
$line .= $lineobject->{comment}->{text};
}
return $line. $eol;
}
$line_routines{line_gridline} = \&line_gridline;
sub elt_handler {
my ( $elts ) = @_; # reference to array
my $cref; #command reference to subroutine
my $lines = "";
foreach my $elt (@{ $elts }) {
# Gang of Four-Style - sort of command pattern
lib/ChordPro/Wx/Editor.pm view on Meta::CPAN
if ( $prefs->{editorwrap} ) {
$stc->SetWrapMode(3); # wxSTC_WRAP_WHITESPACE );
$stc->SetWrapStartIndent( $prefs->{editorwrapindent} );
}
else {
$stc->SetWrapMode(0); # wxSTC_WRAP_NONE );
}
$self->style_text;
# Expert...
$stc->SetViewEOL( $state{vieweol} );
$stc->SetViewWhiteSpace( $state{viewws} );
$stc->SetViewLineNumbers(1);
# Free Ctrl-Shift-U for iBus input (doesn't work).
# $stc->CmdKeyClear( ord('U'), 3 ); # Ctrl-Shift-U
}
sub SetViewLineNumbers( $self, $b ) {
$self->SetMarginWidth( 0, $b ? 40 : 0 ); # TODO length
if ( $self->can("SetMarginBackground") ) { # wxPerl 3.005
lib/ChordPro/Wx/Main.pm view on Meta::CPAN
method OnHelp_Example($event) {
$self->select_mode("editor");
$self->{p_editor}->openfile( CP->findres( $preferences{expert}
? "mollymalone.cho"
: "swinglow.cho",
class => "examples" ),
1, " example.cho " );
}
method OnExpertLineEndings($event) {
$state{vieweol} = wxTheApp->GetTopWindow->GetMenuBar->FindItem($event->GetId)->IsChecked;
if ( $state{mode} eq "editor" ) {
$self->{p_editor}->{t_editor}->SetViewEOL($state{vieweol});
}
}
method OnExpertWhiteSpace($event) {
$state{viewws} = wxTheApp->GetTopWindow->GetMenuBar->FindItem($event->GetId)->IsChecked;
if ( $state{mode} eq "editor" ) {
$self->{p_editor}->{t_editor}->SetViewWhiteSpace($state{viewws});
}
}
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
"[]": "",
"|:": "[|:",
"|::": "[|::",
"|:::": "[|:::",
":|": ":|]",
"::|": "::|]",
":::|": ":::|]",
"::": ":][:"
},
breaklimit: .7,
breakoneoln: true,
cancelkey: true,
composerfont: { name: txt_ff, style: "italic", size: 14 },
composerspace: 6,
// contbarnb: false,
decoerr: true,
dynalign: true,
footerfont: { name: txt_ff, size: 16 },
fullsvg: '',
gchordfont: { name: "text,sans-serif", size: 12 },
gracespace: new Float32Array([6, 8, 11]), // left, inside, right
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
break
case "annotationbox":
case "gchordbox":
case "measurebox":
case "partsbox":
param_set_font(cmd.replace("box", "font"), // font
"* * " + (get_bool(param) ? "box" : "nobox"))
break
case "altchord":
case "bstemdown":
case "breakoneoln":
case "cancelkey":
case "checkbars":
case "contbarnb":
case "custos":
case "decoerr":
case "flatbeams":
case "graceslurs":
case "graceword":
case "hyphencont":
case "keywarn":
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
parse_sav.state = parse.state;
parse_sav.ckey = parse.ckey
parse = parse_sav;
include--
}
// parse ABC code
function tosvg(in_fname, // file name
file, // file content
bol, eof) { // beginning/end of file
var i, c, eol, end,
select,
line0, line1,
last_info, opt, text, a, b, s,
pscom,
txt_add = '\n' // for "+:"
// check if a tune is selected
function tune_selected() {
var re, res,
i = file.indexOf('K:', bol)
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
// syntax(1, "No K: in tune")
return false
}
i = file.indexOf('\n', i)
if (parse.select.test(file.slice(parse.bol, i)))
return true
re = /\n\w*\n/;
re.lastIndex = i;
res = re.exec(file)
if (res)
eol = re.lastIndex
else
eol = eof
return false
} // tune_selected()
// remove the comment at end of text
// if flag, handle the escape sequences
// if flag is 'w' (lyrics), keep the '\'s
function uncomment(src, flag) {
if (!src)
return src
var i = src.indexOf('%')
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
if (!parse.tune_v_opts)
parse.tune_v_opts = {};
opt = parse.tune_v_opts
} else {
if (!parse.voice_opts)
parse.voice_opts = {};
opt = parse.voice_opts
}
opt[select] = []
while (1) {
bol = ++eol
if (file[bol] != '%')
break
eol = file.indexOf('\n', eol);
if (file[bol + 1] != line1)
continue
bol += 2
if (eol < 0)
text = file.slice(bol)
else
text = file.slice(bol, eol);
a = text.match(/\S+/)
switch (a[0]) {
default:
opt[select].push(uncomment(text, true))
continue
case "score":
case "staves":
case "tune":
case "voice":
bol -= 2
break
}
break
}
eol = parse.eol = bol - 1
} // do_voice()
// apply the options to the current tune
function tune_filter() {
var o, opts, j, pc, h,
i = file.indexOf('K:', bol)
i = file.indexOf('\n', i);
h = file.slice(parse.bol, i) // tune header
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
parse.file = file; // used for errors
parse.fname = in_fname
// scan the file
if (bol == undefined)
bol = 0
if (!eof)
eof = file.length
if (file.slice(bol, bol + 5) == "%abc-")
cfmt["abc-version"] = /[1-9.]+/.exec(file.slice(bol + 5, bol + 10))
for ( ; bol < eof; bol = parse.eol + 1) {
eol = file.indexOf('\n', bol) // get a line
if (eol < 0 || eol > eof)
eol = eof;
parse.eol = eol
// remove the ending white spaces
while (1) {
eol--
switch (file[eol]) {
case ' ':
case '\t':
continue
}
break
}
eol++
if (eol == bol) { // empty line
if (parse.state == 1) {
parse.istart = bol;
syntax(1, "Empty line in tune header - ignored")
} else if (parse.state >= 2) {
end_tune()
parse.state = 0
if (parse.select) { // skip to next tune
eol = file.indexOf('\nX:', parse.eol)
if (eol < 0)
eol = eof
parse.eol = eol
}
}
continue
}
parse.istart = parse.bol = bol;
parse.iend = eol;
parse.line.index = 0;
// check if the line is a pseudo-comment or I:
line0 = file[bol];
line1 = file[bol + 1]
if ((line0 == 'I' && line1 == ':')
|| line0 == '%') {
if (line0 == '%' && parse.prefix.indexOf(line1) < 0)
continue // comment
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
line1 = file[bol + 1]
} else {
pscom = true
}
}
// pseudo-comments
if (pscom) {
pscom = false;
bol += 2 // skip %%/I:
text = file.slice(bol, eol)
a = text.match(/([^\s]+)\s*(.*)/)
if (!a || a[1][0] == '%')
continue
switch (a[1]) {
case "abcm2ps":
case "ss-pref":
parse.prefix = a[2] // may contain a '%'
continue
case "abc-include":
do_include(uncomment(a[2]))
continue
}
// beginxxx/endxxx
if (a[1].slice(0, 5) == 'begin') {
b = a[1].substr(5);
end = '\n' + line0 + line1 + "end" + b;
i = file.indexOf(end, eol)
if (i < 0) {
syntax(1, "No $1 after %%$2",
end.slice(1), a[1]);
parse.eol = eof
continue
}
self.do_begin_end(b, uncomment(a[2]),
file.slice(eol + 1, i)
.replace(/\n%[^%].*$/gm,'')
.replace(/^%%/gm,''))
parse.eol = file.indexOf('\n', i + 6)
if (parse.eol < 0)
parse.eol = eof
continue
}
switch (a[1]) {
case "show_source":
b = uncomment(a[2])
switch (b[0]) {
case '*':
i = file.indexOf('\n' + line0 + line1
+ "show_source", eol)
bol -= 2 // keep %%show_.. in the source
set_src(b, i)
user.img_out(sav.src)
// fall thru
case '0':
b = ""
// fall thru
default:
cfmt[a[1]] = b
// fall thru
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
if (select == "end")
continue // end of previous %%tune
if (!parse.tune_opts)
parse.tune_opts = {};
parse.tune_opts[select] = opt = {
t_opts: []
// v_opts: {}
};
while (1) {
bol = eol
if (file[bol + 1] != '%')
break
eol = file.indexOf('\n', eol + 1)
if (file[bol + 2] != line1)
continue
text = file.slice(bol + 3,
eol < 0 ? undefined : eol)
a = text.match(/([^\s]+)\s*(.*)/)
switch (a[1]) {
case "tune":
break
case "voice":
do_voice(uncomment(a[2],
true), true)
continue
default:
opt.t_opts.push(
uncomment(text, true))
continue
}
break
}
if (parse.tune_v_opts) {
opt.v_opts = parse.tune_v_opts;
parse.tune_v_opts = null
}
parse.eol = bol
continue
case "voice":
if (parse.state != 0) {
syntax(1, errs.not_in_tune, "%%voice")
continue
}
select = uncomment(a[2])
/* if void %%voice, free all voice options */
if (!select) {
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
}
self.do_pscom(uncomment(text, true))
continue
}
// music line (or free text)
if (line1 != ':' || !/[A-Za-z+]/.test(line0)) {
last_info = undefined;
if (parse.state < 2)
continue
parse.line.buffer = uncomment(file.slice(bol, eol))
if (parse.line.buffer)
parse_music_line()
continue
}
// information fields
bol += 2
while (1) {
switch (file[bol]) {
case ' ':
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
break
}
if (line0 == '+') {
if (!last_info) {
syntax(1, "+: without previous info field")
continue
}
txt_add = ' '; // concatenate
line0 = last_info
}
text = uncomment(file.slice(bol, eol), line0)
switch (line0) {
case 'X': // start of tune
if (parse.state != 0) {
syntax(1, errs.ignored, line0)
continue
}
if (parse.select
&& !tune_selected()) { // skip to the next tune
eol = file.indexOf('\nX:', parse.eol)
if (eol < 0)
eol = eof;
parse.eol = eol
continue
}
sav.cfmt = clone(cfmt);
sav.info = clone(info, 2) // (level 2 for info.V[])
sav.char_tb = clone(char_tb);
sav.glovar = clone(glovar);
sav.maps = clone(maps, 1);
sav.mac = clone(mac);
sav.maci = clone(maci);
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
t2 = '[|' + t[3]
} else {
// :][: -> :|] [|:
i = (t[2].length / 2) | 0
t1 = t[1] + '|' + t[2].slice(0, i)
t2 = t[2].slice(i) +'|' + t[3]
}
} // new_typ()
// change or add a bar for the voice in the previous line
function eol_bar(s, // bar |:
so, // start of new line
sst) { // first bar (for seqst)
var s1, s2, s3
// check if a bar in the previous line
for (s1 = so.ts_prev ; s1.time == s.time; s1 = s1.ts_prev) {
if (s1.v != s.v)
continue
if (s1.bar_type) {
if (s1.bar_type != '|')
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
for (s = s2.ts_next; !s.seqst; s = s.ts_next)
;
s2.shrink = s.shrink
s.shrink = s2.wr + s.wl
s2.space = s.space
s.space = 0
}
delete s2.part
}
s2.bar_type = "||"
} // eol_bar()
// check if there is a left repeat bar at start of the new line
s = so // start of new music line
while (s && s.time == so.time) {
if (s.bar_type && s.bar_type.slice(-1) == ':') {
s2 = s
break
}
s = s.ts_next
}
if (s2) {
s = s2
while (1) { // loop on all voices
eol_bar(s2, so, s)
s2 = s2.ts_next
if (!s2 || s2.seqst)
break
}
return so
}
s = so
while (s.ts_prev
&& s.ts_prev.time == so.time) {
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
do {
s1 = s1.ts_next
} while (!s1.seqst && !s1.bar_type)
if (s1.seqst)
break
}
return so
} // bardiv()
// set the start of line marker
function set_eol(s) {
if (cfmt.custos && voice_tb.length == 1)
custos_add(s)
s.nl = true
s = s.ts_prev
if (s.type != C.BAR)
add_end_bar(s)
} // set_eol()
// put the warning symbols
// the new symbols go in the previous line
function do_warn(s) { // start of next line
var s1, s2, s3, s4, w
// advance in the next line
for (s2 = s; s2 && s2.time == s.time; s2 = s2.ts_next) {
switch (s2.type) {
case C.KEY:
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
} // do_warn()
// divide the left repeat and variant bars
s = bardiv(s)
// add the warning symbols at the end of the previous line
do_warn(s)
/* if normal symbol, cut here */
if (s.ts_prev.type != C.STAVES) {
set_eol(s)
return s
}
/* go back to handle the staff breaks at end of line */
for (s = s.ts_prev; s; s = s.ts_prev) {
if (s.seqst && s.type != C.CLEF)
break
}
done = 0
ptyp = s.type
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
if (done)
break
continue
default:
if (!done || (s.prev && s.prev.type == C.GRACE))
continue
break
}
break
}
set_eol(s)
return s
}
/* get the width of the starting clef and key signature */
// return
// r[0] = width of clef and key signature
// r[1] = width of the meter
function get_ck_width() {
var r0, r1,
p_voice = voice_tb[0]
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
if (curvoice.norepbra
&& !curvoice.second)
s.norepbra = 1 //true
}
if (curvoice.ulen < 0) // L:auto
adjust_dur(s);
// merge ":| |:" into "::" and other cases
if ((bar_type == "[" || bar_type == "|:")
&& !curvoice.eoln
&& !s.a_gch && !s.invis) { // no annotation nor invisible
s2 = curvoice.last_sym
// if the previous symbol is also a bar
if (s2 && s2.type == C.BAR) {
// && !s2.a_gch && !s2.a_dd
// && !s.a_gch && !s.a_dd) {
// remove the invisible variant bars
// when no shift is needed
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
"d", "d", "d", "d", /* h i j k */
"d", "d", "d", "d", /* l m n o */
"d", "d", "d", "d", /* p q r s */
"d", "!upbow!",
"!downbow!", "d", /* t u v w */
"n", "n", "n", "{", /* x y z { */
"|", "}", "!gmark!", nil, /* | } ~ (del) */
] // char_tb[]
function parse_music_line() {
var grace, last_note_sav, a_dcn_sav, no_eol, s, tps,
tp = [],
tpn = -1,
sls = [],
line = parse.line
// check if a transposing macro matches a source sequence
// if yes return the base note
function check_mac(m) {
var i, j, b
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
s = curvoice.last_note
if (s) {
s.beam_end = true
if (grace)
grace.gr_shift = true
}
break
case '\n': // line break
if (cfmt.barsperstaff)
break
curvoice.eoln = true
break
case '&': // voice overlay
if (grace) {
syntax(1, errs.bad_grace)
break
}
c = line.next_char()
if (c == ')') {
get_vover(c) // full overlay stop
break
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
for (i = 0; i <= s.nhd; i++)
s.notes[i].dur *= 2;
s.dur *= 2;
s.dur_orig *= 2
}
curvoice.last_note = last_note_sav;
a_dcn = a_dcn_sav
break
case "\\":
if (!line.buffer[line.index + 1]) {
no_eol = true
break
}
// fall thru
default:
syntax(1, errs.bad_char, c)
break
}
line.index++
}
} // parse_seq()
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
}
if (sls.length)
syntax(1, "Start of slur without note")
if (grace) {
syntax(1, "No end of grace note sequence");
curvoice.last_sym = grace.prev;
curvoice.last_note = last_note_sav
if (grace.prev)
grace.prev.next = null
}
if (!no_eol && !cfmt.barsperstaff && !vover
&& char_tb['\n'.charCodeAt(0)] == '\n')
curvoice.eoln = true
if (curvoice.eoln && cfmt.breakoneoln && curvoice.last_note)
curvoice.last_note.beam_end = true
}
// abc2svg - subs.js - text output
//
// Copyright (C) 2014-2025 Jean-Francois Moine
//
// This file is part of abc2svg-core.
//
// abc2svg-core is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
if (cfmt.titlecaps)
return title.toUpperCase()
return title
}
// return the width of the music line
function get_lwidth() {
if (img.chg)
set_page()
return (img.width - img.lm - img.rm
- 2) // for bar thickness at eol
/ cfmt.scale
}
// header generation functions
function write_title(title, is_subtitle) {
var h, wh
if (!title)
return
set_page();
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
s.time = tim
if (s.dur && !s.grace)
curvoice.time += s.dur;
parse.ufmt = true
s.fmt = cfmt // global parameters
s.pos = curvoice.pos
if (curvoice.second)
s.second = true
if (curvoice.floating)
s.floating = true
if (curvoice.eoln) {
s.soln = true
curvoice.eoln = false
}
}
/* -- add a new symbol in a voice -- */
function sym_add(p_voice, type) {
var s = {
type:type,
dur:0
},
s2,
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
s.time = t;
t += d
}
}
s.dur = s.time + s.dur - t;
s.time = t
} // end set_feathered_beam()
// terminate voice cloning
if (curvoice && curvoice.clone) {
parse.istart = parse.eol
do_cloning()
}
// if only one voice and a time skip,
// fill the voice with the sequence "Z |" (multi-rest and bar)
if (par_sy.one_v) // if one voice
fill_mr_ba(voice_tb[par_sy.top_voice])
if (parse.pq_d)
ins_pq() // insert delayed P: and Q:
for (v = 0; v < voice_tb.length; v++) {
p_voice = voice_tb[v]
if (!sys_chg) { // if not %%score
delete p_voice.eoln
while (1) { // set the end of slurs
sl = p_voice.sls.shift()
if (!sl)
break
s = sl.ss
// error(1, s, "Lack of ending slur(s)")
if (!s.sls)
s.sls = []
sl.loc = 'o' // no slur end
s.sls.push(sl)
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
}
s = {
type: C.BLOCK,
subtype: "mc_" + param,
dur: 0
}
if (parse.state >= 2) {
if (curvoice.clone)
do_cloning()
curvoice = voice_tb[0]
curvoice.eoln = 1 //true
sym_link(s)
return
}
set_ref(s)
self.block_gen(s)
return
case "ottava":
if (parse.state != 3)
return
n = parseInt(param)
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
curvoice = p_v
sym_link(s)
sym_link(s2)
curvoice = p_v_sav
} // fill_mr_ba()
/* -- get staves definition (%%staves / %%score) -- */
function get_staves(cmd, parm) {
var s, p_voice, p_voice2, i, flags, v, vid, a_vf, eoln,
st, range,
nv = voice_tb.length,
maxtime = 0
// if sequence with many voices, load the other voices
if (curvoice && curvoice.clone) {
// i = parse.eol
// parse.eol = parse.bol // remove the %%staves line
do_cloning()
// parse.eol = i
}
if (parm) {
a_vf = parse_staves(parm) // => array of [vid, flags]
if (!a_vf)
return
} else if (staves_found < 0) {
syntax(1, errs.bad_val, '%%' + cmd)
return
}
/* create a new staff system */
for (v = 0; v < nv; v++) {
p_voice = voice_tb[v]
if (p_voice.eoln) {
eoln = 1
delete p_voice.eoln
}
if (p_voice.time > maxtime)
maxtime = p_voice.time
}
if (!maxtime) { // if first %%staves
par_sy.staves = []
par_sy.voices = []
} else {
// if (nv) // if many voices
self.voice_adj(1)
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
* the previous system - see sort_all
*/
if (!par_sy.voices[curvoice.v])
for (v = 0; v < par_sy.voices.length; v++) {
if (par_sy.voices[v]) {
curvoice = voice_tb[v]
break
}
}
curvoice.eoln = eoln
s = {
type: C.STAVES,
dur: 0
}
sym_link(s); // link the staves in this voice
par_sy.nstaff = nstaff;
// if no parameter, duplicate the current staff system
if (!parm) {
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
s3 = s2 // move before a measure bar
if (s3) {
s2 = curvoice.last_sym
curvoice.last_sym = s3.prev
sym_link(s)
s.next = s3
s3.prev = s
curvoice.last_sym = s2
if (s.soln) {
delete s.soln
curvoice.eoln = true
}
} else {
sym_link(s)
}
}
// treat K: (kp = key signature + parameters)
function get_key(parm) {
var v, p_voice,
// [s_key, a] = new_key(parm) // KO with nodejs
lib/ChordPro/res/abc/abc2svg/abc2svg-1.js view on Meta::CPAN
cross = {} // new cross voice decorations
}
// treat V: with many voices
function do_cloning() {
var i,
clone = curvoice.clone,
vs = clone.vs,
a = clone.a,
bol = clone.bol,
eol = parse.bol,
parse_sav = parse,
file = parse.file
delete curvoice.clone
if (file[eol - 1] == '[') // if stop on [V:xx]
eol--
// insert the music sequence in each voice
include++;
for (i = 0; i < vs.length; i++) {
parse = Object.create(parse_sav) // create a new parse context
parse.line = Object.create(parse_sav.line)
get_voice(vs[i] + ' ' + a.join(' '))
tosvg(parse.fname, file, bol, eol)
}
include--
parse = parse_sav // restore the parse context
}
// treat a 'V:' info
function get_voice(parm) {
var v, vs,
a = info_split(parm),
vid = a.shift()
lib/ChordPro/res/abc/abc2svg/fit2box-1.js view on Meta::CPAN
}
mus.tosvg(fn, f)
abc2svg.fit2box.on = 0
}, // do_fit()
tosvg: function(of, fn, file, bol, eof) {
var parse = this.get_parse()
parse.fname = fn
parse.file = bol ? file.slice(bol) : file
parse.eol = 0
abc2svg.fit2box.on = 1
abc2svg.fit2box.do_fit(this)
}, // tosvg()
// get a formatting parameter
set_fmt: function(of, cmd, parm) {
if (cmd != "fit2box")
return of(cmd, parm)
if (abc2svg.fit2box.on)
lib/ChordPro/res/abc/abc2svg/fit2box-1.js view on Meta::CPAN
// if no tune yet, change the generation function
if (f.indexOf("X:") < 0) {
if (!abc2svg.fit2box.otosvg) {
abc2svg.fit2box.otosvg = this.tosvg
this.tosvg = abc2svg.fit2box.tosvg.bind(this, this.tosvg)
}
return
}
// do the fit2box generation now
parse.file = parse.file.slice(parse.eol)
parse.eol = 0
abc2svg.fit2box.do_fit(this)
parse.file = f
parse.eol = parse.file.length - 2 // stop the current parsing in tosvg()
}, // set_fmt()
set_hooks: function(abc) {
abc.set_format = abc2svg.fit2box.set_fmt.bind(abc, abc.set_format)
} // set_hooks()
} // fit2box
if (!abc2svg.mhooks)
abc2svg.mhooks = {}
abc2svg.mhooks.fit2box = abc2svg.fit2box.set_hooks
lib/ChordPro/res/templates/guitar_songbook.tt view on Meta::CPAN
endlilypond_tag = "\\end{lilypond}"
begingrid_tag = "\\begin{singlespace*}\n\\begin{verbatim}"
endgrid_tag = "\\end{verbatim}\n\\end{singlespace*}"
begintab_tag = "\\begin{singlespace*}\n\\begin{verbatim}"
endtab_tag = "\\end{verbatim}\n\\end{singlespace*}"
gchordstart_tag = "\\guitarChord{"
gchordend_tag = "}"
chorded_line = "" # \\guitarAccord when using \begin{guitar}
unchorded_line = "" # \\guitarNoChord
start_spaces_songline = "\\hspace{0,5cm}" #if a songline starts with spaces it will be replaced by start_spaces_songline
eol = '\\\\' _ "\n" #sometimes this need to be to \\ or \newline
%]
% https://ftp.rrze.uni-erlangen.de/ctan/macros/latex/contrib/guitar/guitar.pdf
\documentclass[a4paper]{article}
\usepackage{guitar}
\usepackage[most]{tcolorbox}
\usepackage[TS1,T1]{fontenc}
\usepackage[bookmarks]{hyperref}
\usepackage{gchords}
\begin{document}
lib/ChordPro/res/templates/songbook.tt view on Meta::CPAN
endlilypond_tag = "\\end{lilypond}"
begingrid_tag = "\\begin{singlespace*}\n\\begin{verbatim}"
endgrid_tag = "\\end{verbatim}\n\\end{singlespace*}"
begintab_tag = "\\begin{singlespace*}\n\\begin{verbatim}"
endtab_tag = "\\end{verbatim}\n\\end{singlespace*}"
gchordstart_tag = "\\["
gchordend_tag = "]"
chorded_line = "\\chordson " # Songs-package require this to know when to switch
unchorded_line = "\\chordsoff " # chordlines off - it will be printed ahead of a song line
start_spaces_songline = "\\hspace{0,5cm}" #if a songline starts with spaces it will be replaced by start_spaces_songline
eol = "\n" #sometimes this need to be to \\ or \newline
%]
% http://songs.sourceforge.net/songsdoc/songs.html
\documentclass[a5paper]{book}
\usepackage{graphicx}
\usepackage[TS1,T1]{fontenc}
\usepackage[most]{tcolorbox}
\usepackage[bookmarks]{hyperref}
\usepackage{fancyhdr}
\usepackage[chorded]{songs}
t/latex/t_songbook.tt view on Meta::CPAN
endverse_tag = "endverse\n";
begingrid_tag = "begingrid\n";
endgrid_tag = "endgrid\n";
begintab_tag = "begintab\n";
endtab_tag = "endtab\n";
gchordstart_tag = "[";
gchordend_tag = "]";
chorded_line = "wc ";
unchorded_line = "";
start_spaces_songline = " ";
eol = "\n";
beginabc_tag = "begin_abc\n";
endabc_tag = "end_abc\n";
beginlilypond_tag = "begin_lilypond\n";
endlilypond_tag = "end_lilypond\n";
FOREACH song IN songs;
title; "\n";
FOREACH st IN song.subtitle;
st; "\n";
END;