Hallo Pida,
willkommen im Forum.
Zunächst ein paar Bemerkungen:
Gib immer die benutzte LilyPond-Version an! Es gibt in manchen Bereichen sehr große Unterschiede.
Bitte poste immer ein
kompilierbares Beispiel. Es kommt doch sehr häufig auf die Details an, es würde mich zum Beispiel interessieren
wie Du \dr bzw \norm definiert hast. Vielleicht könnte man da etwas auf simple Art und Weise erweitern.
Im meinem Vorschlag unten konvertiere ich für das midi eine Stimme in einen DrumStaff, um Zugang zu den entsprechenden drum-sounds zu erhalten.
Dazu habe ich zwei Stimmen definiert.
Diese beiden Stimmen werden in einem Staff zusammengeführt und erzeugen dann den print-Ausdruck.
Soweit nichts neues.
In einem zweiten Score erzeuge ich dann das midi, indem die Stimmen eigenen Staffs zugewiesen werden. Wobei die Oberstimme mittels der Funktion \foo in eine DrumVoice umgewandelt wird.
Die Funktion kann zwei Arten von Argumenten verarbeiten:
- Ein symbol, z.B.: 'hihat
Das führt dazu, das alle Noten der Oberstimme als hihat ausgegeben werden.
- Oder eine Liste
Hier habe ich 'note->drums vordefiniert. Diese Liste weist den Notennamen verschiedene Percussioninstrumente zu.
Das heißt also, daß verschiedene Noten verschiedene Percussionklänge erzeugen.
Die Auswahl ist allerdings völlig willkürlich. Da mußt Du selbst schauen was Du haben willst.
Die Notennamen sind "simplfiziert", will heißen für d, des und dis wird derselbe Klang ausgegeben, auch findet keine Differenzierung nach Oktavlage statt (man könnte das machen, aber wozu?)
Die möglichen Setzungen für die Percussioninstrumente kann man u.a. in /scm/drumpitch-init.ly nachlesen
Im Beispiel sind beide Möglichkeiten gezeigt.
\version "2.16.2"
#(define note->drums
'(
(0 . hihat)
(1 . bassdrum)
(2 . cowbell)
(3 . maracas)
(4 . longwhistle)
(5 . cabasa)
(6 . triangle)
))
#(define-public (list-or-symbol? x)
(or (cheap-list? x) (symbol? x)))
foo =
#(define-music-function (parser location sound music)(list-or-symbol? ly:music?)
#{
\new DrumVoice
\drummode {
#(music-map
(lambda (m)
(if (music-is-of-type? m 'note-event)
(let* ((pitch (ly:pitch-notename (ly:music-property m 'pitch))))
(ly:music-set-property! m 'drum-type
(if (symbol? sound)
sound
(assoc-get pitch sound)))
(ly:music-set-property! m 'pitch '())
m)
m))
music)
}
#})
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% EXAMPLE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
frst = \relative c' { \repeat unfold 8 { \voiceOne r4 <g c e> } }
scnd = \relative c { \repeat unfold 8 { \voiceTwo c4 r } }
%% PDF
\score {
\new Staff <<
\new Voice { \clef "G_8" \frst }
\new Voice { \clef "G_8" \scnd }
>>
\layout { }
}
%% First MIDI
%% Notenames get different drum-sounds
\score {
<<
\new DrumStaff \foo #note->drums \frst
\new Staff { \clef "G_8" \scnd }
>>
\midi { \tempo 4 = 120 }
}
%% Second Midi
%% All notes get the same drum-sound, par example: 'hihat
\score {
<<
\new DrumStaff \foo #'hihat \frst
\new Staff { \clef "G_8" \scnd }
>>
\midi { \tempo 4 = 120 }
}
HTH,
Harm