lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Get the pitch as number


From: Henrik Frisk
Subject: Get the pitch as number
Date: Wed, 9 Feb 2011 17:34:33 +0100

Hi all,

I'm trying to write a couple of functions that will attach a given
text script to a note depending on the pitch. In the example below I
get the first item in the list, as expected if I run (get-text 1). If
I run (get-pitch msc) I get ((0)) and if I try to compile the file or
run (add-text-script) I get

transformer.ly:23:44: In procedure - in expression (- n 1):
transformer.ly:23:44: Wrong type argument in position 1: (0)

I'm a beginner in Scheme so I'm probably doing something stupid here.
It appears to me that I'm getting a list rather than an integer, but
if I run (get-text texts (ly:pitch-semitones (ly:make-pitch 0 1 0))) I
get the expected output. Why am I not getting an integer in my example
and/or how can I access the integer value in my call to
(ly:pitch-semitones)?

Thanks for any input!

/Henrik

\version "2.12.3"

#(define (make-text-script x)
(make-music 'TextScriptEvent
            'direction DOWN
            'text (get-text texts x)))

#(define (add-text-script m)
(if (equal? (ly:music-property m 'name) 'EventChord)
    (set! (ly:music-property m 'elements)
          (cons (make-text-script (get-pitch m))
                (ly:music-property m 'elements)))
    (let ((es (ly:music-property m 'elements))
          (e (ly:music-property m 'element)))
      (map (lambda (y) (add-text-script y)) es)
      (if (ly:music? e)
          (add-text-script e))))
m)

#(define get-text (lambda (ls n)
                    (if (eq? n 1)
                        (car ls)
                        (get-text (cdr ls) (- n 1)))))

#(define (get-pitch music)

   (let ((es (ly:music-property music 'elements))
         (e (ly:music-property music 'element))
         (p (ly:music-property music 'pitch)))
       (cond
           ((ly:pitch? p)
        (ly:pitch-semitones p))
           ((pair? es)
               (map (lambda (x) (get-pitch x)) es))
           ((ly:music? e)
               (get-pitch e)))))

#(define texts '("one" "two" "three" "four"))

#(define msc (make-music
  'SequentialMusic
  'elements
  (list (make-music
          'EventChord
          'elements
          (list (make-music
                  'NoteEvent
                  'duration
                  (ly:make-duration 2 0 1 1)
                  'pitch
                  (ly:make-pitch 0 0 0)))))))

addText = #(define-music-function
                 (parser location m)
                 (ly:music?) (add-text-script m))

music = \relative c' { d }

\score {
        \new Staff << {
    \addText { \music }
        } >>
}



reply via email to

[Prev in Thread] Current Thread [Next in Thread]