Jim Tisdall <supp...@jimtisdall.com> writes:

> I need to display small graphics of a piano keyboard with selected
> notes indicated by color.
>
> It will be used similarly as the guitar fret diagrams and actually
> in conjunction with them (and with standard and tablature notation,
> and explanatory comments) as guitarists examine chord voicings.
>
> I've found a few things but thought I'd ask here if some lilypond user
> has developed such a graphic in the system.  Or, an expert advice on
> where to begin to develop one myself within lilypond, would be most
> appreciated.
>
> My wish list is parameters for range, width/height, and pressed keys;
> labels under the pressed keys would be a nice plus.

Here is something that is not a piano keyboard but has the advantage
that it works automatically.  You'll need to redo the graphics, of
course.

\version "2.18.0"

#(define (c-griff start end pressed)
   (define (add-circle prev n filled?)
     #{ \markup \combine #prev
	        \translate #(cons (- 3 (modulo n 3))
			          (- (/ n 3)))
	                   \draw-circle #0.35 #0.1 #filled? #})
   (let loop ((i start)
	      (m #{ \markup \null #})
	      (pressed (member start (sort pressed <) <=)))
     (if (> i end)
	 m
	 (loop (1+ i)
	       (add-circle m
			   (- i (- start (modulo start 3)))
			   (and (pair? pressed) (= (car pressed) i)))
	       (and pressed (member i pressed <))))))

Dia_engraver =
#(define-scheme-function ((parser location low hi) context)
   (ly:pitch? ly:pitch?)
     (let ((pitches '()) (cause #f))
       (make-engraver
	((start-translation-timestep engraver)
	 (set! pitches '())
	 (set! cause #f))
	(listeners
	 ((note-event engraver event)
	  (set! pitches (cons (ly:event-property event 'pitch) pitches))
	  (if (not cause)
	      (set! cause event))))
	((process-music engraver)
	 (if cause
	     (let ((g (ly:engraver-make-grob engraver 'LyricText cause)))
	       (set! (ly:grob-property g 'text)
		     (c-griff (ly:pitch-semitones low)
			      (ly:pitch-semitones hi)
			      (map ly:pitch-semitones pitches)))))))))

#(use-modules (scm accreg))

treble =
\relative {
  \tag full \clef "treble"  \discant "10"
  r8 s32 f'[ bes f] s e[ a e] s d[ g d] s16 e32[ a]
  \discant "121"
  << { r16 <f bes> r <e a> r <d g> } \tag full \\
     { d r a r bes r } >> |
  <cis e a>1
}

\new PianoStaff
<<
  \new Lyrics \with { \consists \Dia_engraver a b' }
              \removeWithTag full \treble
  \new Staff \treble
  \new Staff \relative
  { \clef "treble"  \freeBass "1"
    r8 d'32 s16. c32 s16. bes32 s16. a32[ cis] s16
    \clef "bass"  \stdBass "Master"
    << { r16 <f, bes d>^"b" r <e a c>^"am" r <d g bes>^"gm" |
         <e a cis>1^"a" } \\
       { d8_"D" c_"C" bes_"B" | a1_"A" }
    >>
  }
>>

-- 
David Kastrup
_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to