Hi Peter,

On Tue, Apr 22, 2025 at 11:42 PM Peter X <peterandu...@gmail.com> wrote:

> I’m trying to figure out how to print the MIDI number of each note in a
> score using a Scheme engraver — for example, I’d like c' to print as 60, d'
> as 62, etc., during compilation.
>
%< snip >%

> What is the proper or recommended way to extract and print the MIDI number
> of each note in a LilyPond score?


> I’d really appreciate any working examples or pointers. Thank you very
> much!


Engravers are something I never have been able to figure out - still
working my way through learning Scheme. However, I was able to put together
some code that runs in a NoteName context that comes pretty close to what
you asked for. Whether it's proper or recommended I doubt. But it works ...
more or less. The output is:


Starting lilypond 2.24.4 [test_midi_numberV2.ly]...

Processing `/home/michael/Downloads/test_midi_numberV2.ly'

Parsing...

Interpreting music...

🎵 Found Pitch: c3 → MIDI: 60

🎵 Found Pitch: d3 → MIDI: 62

🎵 Found Pitch: e3 → MIDI: 64

🎵 Found Pitch: f3 → MIDI: 65

🎵 Found Pitch: g3 → MIDI: 67

🎵 Found Pitch: a3 → MIDI: 69

🎵 Found Pitch: g3 → MIDI: 67

If that's close enough, then the code is:

\version "2.24.4"

simplePitchDebugTwo =
#(lambda (pitch ctx)
   (ly:message "🎵 Found Pitch: ~a~a → MIDI: ~a"
               (note-name->string pitch)
               ; Next line sets middle C to C3 - change 3 to 4 to get C4 as
middle C
               (+ (ly:pitch-octave pitch) 3)
               (+ (ly:pitch-semitones pitch) 60))
   ; LilyPond complains about missing markup list without the next line
   (markup #:null))


music = {
  \clef treble
  \key c \major
  \time 4/4
  c'4 d'4 e'4 f'4 |
  g'4 a'4 g'2 |
}

\score {
  \new Staff <<
    \new Voice {
      \music
    }
    \new NoteNames {
      \set noteNameFunction = #simplePitchDebugTwo
      \music
    }
  >>
}

Still trying to get my head wrapped around the whole engraver thing. Ah
well ... someday. Hopefully this'll be close enough to serve for now.
-- 
Michael

Reply via email to