On 2020-01-25 6:42 am, Kieren MacMillan wrote:
Having previously used
#(display
(map (lambda (n) (ly:make-pitch 0 n 0))
(map (lambda (l) (list-ref rowrefs l))
(map (lambda (m) (modulo m 12))
(map ly:pitch-semitones (music-pitches test))))))
I know that the scheme function is returning a set of pitches, and
they are the correct ones [based on how I want to manipulate the
"test" music]. The errors I got when I tried to create a music
function led me to find ly:make-music, which eliminated the errors.
But now I can’t display the pitches. How do I fix the row-staff-notes
function so that it displays pitches on a staff?
Perhaps the simplest option is to avoid ly:music and instead use
splicing to let the parser do the heavy lifting:
%%%%
\version "2.19.83"
\language "english"
rowrefs = #'(6 8 7 2 3 12 5 4 11 1 10 9)
test = { ef, fs' g d'' cs' }
row-staff-notes =
#(define-music-function (mus) (ly:music?)
#{ $@(map (lambda (pitch)
(let* ((semitone (ly:pitch-semitones pitch))
(index (modulo semitone (length rowrefs))))
(ly:make-pitch 0 (list-ref rowrefs index) 0)))
(music-pitches mus)) #})
{ <>8 \row-staff-notes \test }
%%%%
Note that I refactored your nested maps into a single one.
-- Aaron Hill