[Gelöst] Slashnotation (Rhyth.) mit korrektem Midi?

Begonnen von Mjchael, Donnerstag, 4. Juli 2019, 06:23

« vorheriges - nächstes »

Mjchael

Mein erster Post, und gleich ein Spezialthema, wo ich mit der Onlinehilfe nicht weiter komme.

Ich möchte für Gitarristen Rhythmus-Notation auf den Wikibooks darstellen, das auch ein passendes Midi liefert.


So soll es aussehen.







<score midi="1" vorbis="1">
<<
  \new ChordNames {
  \chordmode {
  c1 f g c
  }
  }

  \new Voice \with {
  \consists "Pitch_squash_engraver"
  } \relative c'' {
  \improvisationOn
  c4 c8 c c4 c8 c
  f4 f8 f f4 f8 f
  g4 g8 g g4 g8 g
  c4 c8 c c4 c8 c
  }
>>
</score>

Aber es sollen Akkorde erklingen, und nicht nur einzelne Noten.
Wenn ich aber versuche Akkorde unten einzufügen, dann sieht das Notenbild konfus aus.



Das war mein Chode-Versuch

<score midi="1" vorbis="1">
<<
  \new ChordNames {
  \chordmode {
  c1 f g c
  }
  }

\new Voice \with {
  \consists "Pitch_squash_engraver"
  }{
  \improvisationOn
  <c e g c' e'>4 <c e g c' e'>8 <c e g c' e'>8 <c e g c' e'>4 <c e g c' e'>8 <c e g c' e'>8
  <f a c' f'>4 <f a c' f'>8 <f a c' f'>8 <f a c' f'>4 <f a c' f'>8 <f a c' f'>8
  <g, b, d g b g'>4 <g, b, d g b g'>8 <g, b, d g b g'>8 <g, b, d g b g'>4 <g, b, d g b g'>8 <g, b, d g b g'>8
  <c e g c' e'>4 <c e g c' e'>8 <c e g c' e'>8 <c e g c' e'>4 <c e g c' e'>8 <c e g c' e'>8
  }
>>
</score>


Man hört zwar halbwegs richtig den Anschlag (zwar nur für Klavier, aber erstmal egal)
Dass ich den jeweils zweiten Notenwert nicht nochmal wiederholen müsste weiß ich, aber das hat eh nichts mit dem Darstellungsfehler zu tun.

https://de.wikibooks.org/wiki/Benutzer:Mjchael/_Spielweise#Rhyhtmusnotation_mit_Lilypond

Wer kennt sich gut genug mit Lilypond aus, um diesen Code zu optimieren?

Ich beabsichtige ein Rhythmus-Tutorial für Gitarristen zu erstellen
Meine Durchhalteparole:
Das sollst du nicht können!
Das sollst du lernen!

Malte

Hallo Mjchael,

willkommen im Forum! Bitte gib bei jeder Frage außer einem möglichst kleinen Codebeispiel immer auch deine verwendete LilyPond-Version an (entweder im Text oder als \version-Angabe im Code). Die Zeilen
<score midi="1" vorbis="1">
</score>

gehören übrigens nicht zum LilyPond-Code dazu, die sind von der Wiki-Software.

Wenn du im folgenden Code mal \improvisationOn auskommentierst und dafür den darauffolgenden \set-Befehl mit reinnimmst (der nur einen Teil von \improvisationOn, nämlich das ,,Quetschen" auf eine bestimmte Tonhöhe übernimmt), dann siehst du, wo das Problem liegt: Jeder Ton des Akkords wird auf diese Tonhöhe gedrückt, wodurch Akkorde mit mehreren gleichen Tönen entstehen; zwei davon können auf den beiden Seiten des Halses dargestellt werden, die anderen werden mehrfach übereinandergedruckt und sind deshalb nicht weiter sichtbar.

Du kannst aber dafür sorgen, daß alle fünf Notenköpfe auf die selbe Seite gedruckt werden; das macht der \override in der darauffolgenden Zeile:
\version "2.19.83"

\new Voice \with {
  \consists "Pitch_squash_engraver"
}{
  \improvisationOn
  %\set squashedPosition = 0
  %\override NoteHead.X-offset = 0
  <c e g c' e'>4 <c e g c' e'>8 <c e g c' e'>8
}

Viele Grüße
Malte

Mjchael

\override NoteHead.X-offset = 0

eingefügt und es klappt.  :D
Danke für den Hinweis.

<score midi="1" vorbis="1">
hatte ich mit Absicht dazugeschrieben, da es sich ja auch um ein Wiki-Bug hätte handeln können.

Die Versionsnummer der Wiki-Version weiß ich (noch) nicht.

Jetzt suche ich noch den 'Midi=Gitarre'-Syntax heraus,
und eine Möglichkeit die Ubstrokes und Downstrokes zu notieren,
dann kann der Workshop losgehen.

Bis hier hin vielen Dank und schönes Wochenende! :D
Gruß Mjchael
Meine Durchhalteparole:
Das sollst du nicht können!
Das sollst du lernen!

Malte

Off-topic:

Zitat von: Mjchael am Freitag,  5. Juli 2019, 19:13
Jetzt suche ich noch den 'Midi=Gitarre'-Syntax heraus,
und eine Möglichkeit die Ubstrokes und Downstrokes zu notieren,
dann kann der Workshop losgehen.

\override Staff.midiInstrument = "acoustic guitar (nylon)"
Andere Instrumente siehe Anhang 6 der Notationsreferenz.

c'\upbow c'\downbow
Das wärs für Streicher und auch für Gitarren hab ich es schon gesehen, ich weiß aber, daß es da auch andere Zeichen für gibt ...

Mjchael

Danke! :D
Darf ich fich noch fragen, wohin ich es Eintragen muss? Meine Versuche ergeben Syntax-Error.

Ich bin in Lilipond eher ein Newbee.
Den Versuch mit der Hilfe klarzukommen, stellt sich schwerer als gedacht raus.
Und entsprechende Tutorials habe ich noch keine gefunden.

ps.
Sind das die Pfeile, oder die übliche Notation (so ähnlich wie. n nv n nv)
Letztere habe ich zumindest über die Suchen auf zig Seiten nicht gefunden. 

Meine Durchhalteparole:
Das sollst du nicht können!
Das sollst du lernen!

Malte

Hm ... eigentlich hätten wir für diese neuen Fragen ein neues Thema aufmachen sollen. Naja, meine Schuld, ich hab ja nachgehakt.
\version "2.19.83"

\new Voice \with {
  \consists "Pitch_squash_engraver"
}{
  \set Staff.midiInstrument = "acoustic guitar (nylon)"
  \improvisationOn
  \override NoteHead.X-offset = 0
  <c e g c' e'>4\downbow <c e g c' e'>8\downbow <c e g c' e'>8\upbow
}

Die \set- und \override-Befehle könnten auch an anderer Stelle stehen, aber so lang du nur ein System mit einer Voice hast, sind diese Alternativen aufwendiger. Für größere Partituren oder Projekte mit mehreren Stücken in einer Datei etc. wär das anders.

Mjchael

#6
:D

Jetzt sieht es so aus, und klingt auch so, wie es sein soll.
Ich hatte es in die falsche Klammer gesetzt.

https://de.wikibooks.org/wiki/Benutzer:Mjchael/_Spielweise#L%C3%B6sung



Ich werde mich noch ein wenig mit Quellcode-Optimierung auseinandersetzen, dann kann die Umsetzung starten.
Ich poste hier nochmal rein, wo ich das Gelernte einsetzen werde!
Zudem werde ich (sobald ich Zeit finde) ein Tutorial (Schlagmuster-Beispiele betreffend) für Wiki-Autoren scheiben, das ich auch hier hinein posten werde. (Wie schon für die ABC-Notation gemacht.)

Nochmals vielen Dank für deine Hilfen!

Gruß Mjchael
Meine Durchhalteparole:
Das sollst du nicht können!
Das sollst du lernen!

harm6

Ich würde das Ganze noch effizienter angehen.

Warum die Akkorde mehrfach schreiben? Wieder verwenden! Im Staff \reduceChords dazuschalten.
Rhythmische Templates schaffen mittels http://lsr.di.unimi.it/LSR/Item?id=465
Engraver und performer nach Wunsch verändern. Alles in \layout bzw \midi {} ...

Evtl eine Funktion, die den fertigen Score raushaut, anstatt immer alles neu zu schreiben.


\version "2.19.82"

rhythmTemplate =
#(define-scheme-function (parser location pattern) (ly:music?)
   (define-music-function (parser location chord) (ly:music?)
     (make-relative (chord) chord
       (map-some-music
(lambda (m)
  (and (music-is-of-type? m 'skip-event)
       (let ((dur (ly:music-property m 'duration))
     (art (ly:music-property m 'articulations))
     (res (ly:music-deep-copy chord)))
;; transfer duration of skip to all elements with duration
(for-some-music
  (lambda (c)
    (and (ly:duration? (ly:music-property c 'duration))
(begin
   (set! (ly:music-property c 'duration) dur)
   #t)))
  res)
;; transfer articulations of skip to all relevant targets
(for-some-music
  (lambda (c)
    (let ((prop
   (cond ((music-is-of-type? c 'event-chord) 'elements)
((music-is-of-type? c 'rhythmic-event) 'articulations)
(else #f))))
      (and prop
   (begin
     (set! (ly:music-property c prop)
   (append (ly:music-property c prop)
   art))
     #t))))
  res)
res)))
(ly:music-deep-copy pattern)))))


rhya =
\rhythmTemplate {
  s4\downbow s8\downbow s8\upbow s4\downbow s8\downbow s8\upbow
}
 
chrds =
\chordmode {
  \rhya c
  \rhya f
  \rhya g
  \rhya c
}

\paper { indent = 0 }

%%%% manuell:

\score {
  <<
    \new ChordNames \chrds
    \new Voice
      {
        \improvisationOn
        \reduceChords \chrds
      }
  >>
  \layout {
    \context {
      \ChordNames
      chordChanges = ##t
      noChordSymbol = ""
    }
    \context {
      \Voice
      \consists "Pitch_squash_engraver"
    }
  }
  \midi {
    \context {
      \Staff
      \remove "Staff_performer"
    }
    \context {
      \ChordNames
      midiInstrument = "acoustic guitar (nylon)"
    }
  }
}

%%%% function:

my-score =
#(define-void-function (mus)(ly:music?)
  (add-score
    #{
      \score {
        <<
          \new ChordNames $mus
          \new Voice
            {
              \improvisationOn
              \reduceChords $mus
            }
        >>
        \layout {
          \context {
            \ChordNames
            chordChanges = ##t
            noChordSymbol = ""
          }
          \context {
            \Voice
            \consists "Pitch_squash_engraver"
          }
        }
        \midi {
          \context {
            \Staff
            \remove "Staff_performer"
          }
          \context {
            \ChordNames
            midiInstrument = "acoustic guitar (nylon)"
          }
        }
      }
    #}))

rhyb =
\rhythmTemplate {
  s4\downbow s8\downbow s8\upbow r8 s8\upbow s4\downbow
}
 
chrds-II =
\chordmode {
  \rhyb a:m
  \rhyb d:m
  \rhyb e:7
  \rhyb a:m
}

\my-score \chrds-II


HTH,
  Harm

Mjchael

Das mit dem effizienter gestalten, ist mir natürlich bewusst,
sonst hätte ich wohl nicht geschrieben, dass ich mich mit der Quellcode-Optimierung auseinandersetzen will.

Auf den Wikibooks kann ich allerdings nicht mit importierten Dateien arbeiten.
Da muss alles in einen Quellcode rein.

Und ich weiß noch nicht, was alles mit dem Wiki-Pluggin möglich ist, muss mich allerdings mit den Gegebenheiten arangieren.

Das ist ein Grund, das ich
<score midi="1" vorbis="1">
</score>
mit angegeben habe.

Allerdings bin ich es gewohnt mit Variablen bzw. Definitionen zu arbeiten.
Nur sollen die nicht größer als das eigentliche Stück werden.

Die Akkorde sollen so klingen wie die Gitarrenakkorde, nicht wie Standard-Klavier-Akkorde mit Gitarrensound.

Weiterhin muss ich mich erst mal nach und nach in die Skriptsprache einarbeiten.
Ein Lied mit Akkorden bekomme ich hin, extrem verschachtelte Quellcodes durchschaue ich noch nicht.

Dann soll der Quellcode so einfach werden, dass andere Autoren, die sich noch nicht mit Lilypond auskennen, diesen nachvollziehen, und selbst anwenden können. 

Aber im Augenblick ist mein Problem, dass Frescobaldi keine Vorschau anzeigt, doch das ist kein Thema für diesen Thread.

Gruß Mjchael
Meine Durchhalteparole:
Das sollst du nicht können!
Das sollst du lernen!