Autor Thema: [Gelöst] Einzelne Percussion-Sounds auf der Gitarre  (Gelesen 2193 mal)

Pida

  • Member
[Gelöst] Einzelne Percussion-Sounds auf der Gitarre
« am: Montag, 23. September 2013, 13:30 »
Hallo zusammen,

ich habe bisher nur einige Schnippsel mit LilyPond und früher mit MuseScore gesetzt. Jetzt versuche ich mich an einem komplexeren Stück, in dem u.a. Gitarre mit einfachen perkussiven Elementen vorkommt.

Viele Takte sehen vereinfacht so aus:
1 - Bassnote
2 - Schlag auf die Saiten
3 - Bassnote
4 - Schlag auf die Saiten

Ich habe die Gitarre zweistimmig notiert:

<<
{ Melodie } \\
{ Bass und Percussion }
>>

Jetzt möchte ich eben den Percussion-Sound hinzufügen. Die Darstellung (Notenkopf als Kreuz) ist kein Problem. Dazu habe ich zwei Variablen \dr und \norm definiert, in der eine Änderung der Darstellung des Notenkopfs gespeichert ist.

<<
{ Melodie } \\
{ c \dr c \norm c}
>>


Ich möchte aber auch einen passenden MIDI-Sound: Irgendwas ohne definierte Tonhöhe. Ich kenne nur eine Möglichkeit zur Angabe des MIDI-Instruments, nämlich Staff.midiInstrument. Dieser Variablen kann man auch innerhalb eines Systems immer wieder ein neues Instrument zuweisen, das hier funktioniert also:

<<
{ Melodie }
{ c \set Staff.midiInstrument = #"woodblock" \dr c \norm \set Staff.midiInstrument = #"acoustic grand" c}
>>

Allerdings ist das unfassbar viel Schreib- bzw. Kopierarbeit und produziert extrem unleserlichen Code.

Daher meine Frage: Geht es irgendwie einfacher?

Ich habe übrigens versucht, die Zuweisungen an Staff.midiInstrument in die Variablen \dr und \norm zu packen, aber das führt zu verschiedenen Fehlermeldungen.

Danke
Pida

EDIT: Ich habe eine Lösung gefunden. Mir haben in meinem ersten Ansatz nur die geschweiften Klammern gefehlt:

dr = { \override NoteHead #'style = #'cross \set Staff.midiInstrument = #"woodblock" }
norm = { \revert NoteHead #'style \set Staff.midiInstrument = #"acoustic guitar (steel)" }
« Letzte Änderung: Freitag, 4. Oktober 2013, 20:59 von Pida »

harm6

  • Member
Re: Einzelne Percussion-Sounds auf der Gitarre
« Antwort #1 am: Dienstag, 24. September 2013, 23:16 »
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



Pida

  • Member
Re: Einzelne Percussion-Sounds auf der Gitarre
« Antwort #2 am: Donnerstag, 26. September 2013, 00:40 »
[Edit: sorry, ich hatte versehentlich eine halbfertige Version abgeschickt]

Danke Harm!

Hier ein Beispiel; ich benutze Lilypond 2.16.2:

chord = \override NoteHead #'style = #'slash
dr = \override NoteHead #'style = #'cross
norm = \revert NoteHead #'style

vocals = { 
  c''2 c''2


guitar = {
  <<
  { s8 <bes' ees''>8 s4. <d'' g''>8 } \\
{ c'4
    \set Staff.midiInstrument = #"woodblock" \dr c'''4 \norm \set Staff.midiInstrument = #"acoustic grand" \norm
  ees'4 \set Staff.midiInstrument = #"woodblock" \dr c''4
}
>>
}

\score {
<<
\new Staff \vocals
  \new Staff \guitar
  >>
  \layout { }
  \midi { }
}

\version "2.16.2"

Ich verstehe nur wenig von deinem Code. Könnte ich den Vorschlag mit der Liste so umgestalten, dass eine Note (da würde ich was nehmen, was im Song nicht vorkommt) mit einem Percussion-Klang, der Rest aber anders (mit Gitarre oder Piano) belegt ist?

Ideal wäre auch das nicht (es könnte keine 'freie' Note für den Percussion-Klang geben), aber sicher praktikabel für fast alle Stücke.

Gruß
Pida
« Letzte Änderung: Donnerstag, 26. September 2013, 00:56 von Pida »

harm6

  • Member
Re: Einzelne Percussion-Sounds auf der Gitarre
« Antwort #3 am: Donnerstag, 26. September 2013, 00:45 »
Zitat
Danke Harm!

Hier ein Beispiel; ich benutze Lilypond 2.16.2:
[...]

Nichts zu danken.

Ich sehe jetzt was Du gemacht hast, allein, es stellt sich die Frage: Kommst Du mit meinem Vorschlag zurecht oder nicht?

Gruß,
  Harm

Pida

  • Member
Re: Einzelne Percussion-Sounds auf der Gitarre
« Antwort #4 am: Donnerstag, 26. September 2013, 00:56 »
[edit]

Ich konnte deinen Vorschlag leider nicht umsetzen. Mein Anliegen geht eher in die Richtung deiner ersten MIDI-Variante . Allerdings bräuchte ich abwechselnd normale Töne und Percussion-Klänge auf der Gitarre, während in deinem Beispiel die obere Stimme nur aus Percussion besteht.

Um das umzusetzen, habe ich versucht, hihat, bassdrum usw. durch einen anderen Klang zu ersetzen, aber anscheinend sind hier nur Drumsounds zulässig.

Außerdem habe ich die Liste gekürzt, so dass nur noch 3 . maracas drinstand. Das geht zwar ohne Fehlermeldung, allerdings bleibt diese Stimme dann bei der MIDI-Ausgabe stumm.

Gibt es noch eine Möglichkeit?

Danke
Pida
« Letzte Änderung: Freitag, 27. September 2013, 08:35 von Pida »

Pida

  • Member
Re: Einzelne Percussion-Sounds auf der Gitarre
« Antwort #5 am: Donnerstag, 3. Oktober 2013, 09:57 »
Ich bringe das Thema mal hoch, da ich meinen letzten Beitrag editiert hatte und dabei - wie ich später gesehen habe - das Datum in der Liste der Beiträge nicht aktualisiert wird. Vielleicht hat ja noch jemand einen Tip.