I am trying add a feature to Lilypond but I have
looked through the code a fair amount and really have no idea what is
going on. I'm hoping someone may be able to give me some pointers (no
pun intended).
I am hoping to modify Lilypond so that a 'named destiation' pdfmark
may be included in the postscript ouptut for each bar number. The aim is
to be able to jump to any place in the music according to bar number.
ie. going to the named destination 'bar.12' would move the music to the
twelth bar.
From my very limited understanding of Lilypond and postscript I
think I would need to write out a pdfmark line to the postscript on the
correct page, and in that line I would need to include the bar number
and it's x and y coordinates.
Could someone maybe suggest which areas of the code I would need to
understand to achieve this, and how I might go about it?
I have
been unable to find a good description of how lilypond works internally
(at least in terms of laying out the music in postscript).
Any help would be appreciated, thanks.
Amiel
---------------------- Below
is a few notes about what I have seen and have been trying so far.
I
have been reading about pdfmarks and have added a new postscript
function to create the required pdfmark in music-drawing-routines.ps
(based on the mark_URI entry).
--------------- /mark_DEST_xy { /name exch def /left exch
def /top exch def [ /Dest name /View [ /XYZ x y
NULL ] /DEST pdfmark } bind def ----------------
I
see that a mark_URI line is created in ouput-ps.scm like:
---------------- (ly:format "~4f ~4f ~4f ~4f
(textedit://~a:~a:~a:~a) mark_URI\n" (+ (car offset)
(car x-ext)) (+ (cdr offset) (car y-ext))
(+ (car offset) (cdr x-ext))
(+ (cdr offset) (cdr y-ext))
;;
Backslashes are not valid ;; file URI path
separators. (ly:string-percent-encode
(ly:string-substitute "\\" "/" file))
(cadr location) (caddr
location) (cadddr location)) ----------------- So
from that I figure I will probably need to have some code in
output-ps.scm to create the pdfmark in the ps file such as:
(ly:format "~4f ~4f bar.~l mark_DEST_xy\n"
(<top>) (<left>)
(<current bar number>))
where the <vars> are replaced
by scheme which returns the relevent values.
I have no idea how to get these required values, or where to put
this code snippet.