Autor Thema: notennamen auslesen  (Gelesen 3877 mal)

erich

  • Gast
notennamen auslesen
« am: Freitag, 28. März 2014, 15:55 »
Guten Tag

Ich erhalte durch eine Anweisung der Form (write (ly:music-property musik 'pitch)) als Ausgabe beispielsweise #<Pitch cis' > ;
Wie muss ich den Ausdruck (ly:music-property musik 'pitch) weiter behandeln, um daraus den Notennamen cis' als reinen Text zu erhalten?

Vielen Dank fürs Nachdenken und Antworten
Erich

fugenkomponist

  • Gast
Re: notennamen auslesen
« Antwort #1 am: Freitag, 28. März 2014, 16:02 »
Hallo Erich,

hast du mal ein kompilierbares Minimalbeispiel mit Angabe deiner LilyPond-Version? Ich habe nämlich ehrlich gesagt keine Ahnung, in welchem Kontext diese Anweisung auftauchen soll, was musik ist, und wohin die Ausgabe geht (in ein markup? nach stdout? …)

Gruß,
Malte

erich

  • Gast
Re: notennamen auslesen
« Antwort #2 am: Freitag, 28. März 2014, 16:24 »
Hallo Malte

musik soll ein Ausdruck sein, für den (write (ly:music? musik) ) #t  ergibt.

Gruß
Erich

harm6

  • Gast
Re: notennamen auslesen
« Antwort #3 am: Samstag, 29. März 2014, 10:53 »
Hallo erich,

Zitat von: erich
Ich erhalte durch eine Anweisung der Form (write (ly:music-property musik 'pitch)) als Ausgabe beispielsweise #<Pitch cis' > ;
Wie muss ich den Ausdruck (ly:music-property musik 'pitch) weiter behandeln, um daraus den Notennamen cis' als reinen Text zu erhalten?

musik soll ein Ausdruck sein, für den (write (ly:music? musik) ) #t  ergibt.

Malte's Frage nach einem Minimalbeispiel ist durchaus sinnvoll. Denn Deine weitere Erläuterung greift zu kurz:

musik = { cis }
#(write (ly:music? musik))
Ergibt #t

Aber
musik = { cis }
#(write (ly:music-property musik 'pitch))
ergibt: ()
!

Nichtsdestotrotz habe ich mich mal mit dem Problem beschäftigt.
Meines Wissens nach gibt es keine procedure die den Notennamen als Buchstaben/Zeichenfolge zurückgibt. Es ist auch nicht besonders sinnvoll "cis" zu haben, wenn man dieses "cis" intern weiterverarbeiten möchte, insbesondere wenn man bedenkt, daß ja auch andere Sprachen ins Spiel kommen können.
Der Notenname und die Oktave werden intern als ganze Zahlen verarbeitet, die möglichen Alterationen als Brüche.

Aber man kann es selber machen.
Da Du uns ein kompilierbares Beispiel vorenthalten hast, mußt Du jetzt mit meinem Coding leben.
Zahlreiche Kommentare im Code.

\version "2.18.0"

%% nicer output
#(use-modules (ice-9 pretty-print))

%% Define the language, if you want, needs to be a string:
which-language = "deutsch"

#(define which-language
;; tests whether 'which-language' is defined already and if 'which-language' is
;; part of 'language-pitch-names', see define-note-names.scm
;; if not, use 'default-language' (netherlands), see declarations-init.ly
 (if (defined? 'which-language)
     (let ((possible-languages (map car language-pitch-names)))
       ;(write possible-languages)
       (if (member (string->symbol which-language) possible-languages)
           which-language
           (ly:error "specified language, \"~a\", does not exist"
                     which-language)))
     default-language))
 
\language \which-language

#(define used-notenames
;; returns a subset of 'language-pitch-names', specified by which-language.
;; key and value are exchanged
;; i.e. the alist is from type '((pitch . name) ... )
  (map
    (lambda (e) (reverse-interval e))
    (assoc-get
      (string->symbol which-language)
          language-pitch-names)))

%#(pretty-print used-notenames)
 
display-note-names =
#(define-music-function (parser loction music)(ly:music?)
"
 Returns the unchanged music, writing the absolute notenames in terminal.
"
    (music-map
       (lambda (mus)
         (if (music-is-of-type? mus 'note-event)
             (begin
               (let* ((pitch (ly:music-property mus 'pitch))
                      (pitch-octaves (ly:pitch-octave pitch))
                      (pitch-notename (ly:pitch-notename pitch))
                      (pitch-alteration (ly:pitch-alteration pitch))
                      ;; create a pitch with alteration, name and
                      ;; octave set to -1
                      ;; this ensures the possibility to look it up in
                      ;; 'used-notenames'
                      (p (ly:make-pitch -1 pitch-notename pitch-alteration))
                      (pitch-name-strg
                         (symbol->string (assoc-get p used-notenames)))
                      ;; recreate the octave-notation
                      (octave-sign
                        (cond ((< pitch-octaves 0)
                               (string-concatenate
                                 (make-list (1- (abs pitch-octaves)) ",")))
                              ((= pitch-octaves 0) "'")
                              ((> pitch-octaves 0)
                               (string-concatenate
                                 (make-list (1+ (abs pitch-octaves)) "'")))))
                      (absolute-pitch-name
                        (string-append pitch-name-strg octave-sign)))
               (newline)
               (write pitch)
               (format #t "\t~a" absolute-pitch-name)
               mus))
             mus))
       music)
 
  music)
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXAMPLE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\display-note-names
\relative c' {
c, cis d dis e f fis g gis a ais h c
cis d dis e f fis g gis a ais h c
cis d dis e f fis g gis a ais h c
h b a as g ges f e es d des c
\transpose c cis <c e g>
}

Ergibt folgenden Terminaloutput:
#<Pitch c > c
#<Pitch cis > cis
#<Pitch d > d
#<Pitch dis > dis
#<Pitch e > e
#<Pitch f > f
#<Pitch fis > fis
#<Pitch g > g
#<Pitch gis > gis
#<Pitch a > a
#<Pitch ais > ais
#<Pitch b > h
#<Pitch c' > c'
#<Pitch cis' > cis'
#<Pitch d' > d'
#<Pitch dis' > dis'
#<Pitch e' > e'
#<Pitch f' > f'
#<Pitch fis' > fis'
#<Pitch g' > g'
#<Pitch gis' > gis'
#<Pitch a' > a'
#<Pitch ais' > ais'
#<Pitch b' > h'
#<Pitch c'' > c''
#<Pitch cis'' > cis''
#<Pitch d'' > d''
#<Pitch dis'' > dis''
#<Pitch e'' > e''
#<Pitch f'' > f''
#<Pitch fis'' > fis''
#<Pitch g'' > g''
#<Pitch gis'' > gis''
#<Pitch a'' > a''
#<Pitch ais'' > ais''
#<Pitch b'' > h''
#<Pitch c''' > c'''
#<Pitch b'' > h''
#<Pitch bes'' > b''
#<Pitch a'' > a''
#<Pitch aes'' > as''
#<Pitch g'' > g''
#<Pitch ges'' > ges''
#<Pitch f'' > f''
#<Pitch e'' > e''
#<Pitch ees'' > es''
#<Pitch d'' > d''
#<Pitch des'' > des''
#<Pitch c'' > c''
#<Pitch cis > cis
#<Pitch eis > eis
#<Pitch gis > gis

HTH,
  Harm

erich

  • Gast
Re: notennamen auslesen
« Antwort #4 am: Sonntag, 30. März 2014, 12:21 »
Danke Harm

Unter Verwendung der drei Definitionen

#(define used-notenames
  (map
    (lambda (e) (reverse-interval e))
    (assoc-get
      (string->symbol "twintet")
          language-pitch-names)))

#(define (pitch-name pitch)
     (symbol->string (assoc-get
                      (ly:make-pitch -1 (ly:pitch-notename pitch) (ly:pitch-alteration pitch))
                      used-notenames)))

#(define (add-text-script m x)
    (set! (ly:music-property m 'elements)
          (append! (ly:music-property m 'elements)
                   (list (make-music 'TextScriptEvent 'direction DOWN 'text x))))
m)

kam ich zum Ziel.

Hier ein Beispiel, was das Ganze bei mir soll:
« Letzte Änderung: Sonntag, 30. März 2014, 17:01 von erich »

erich

  • Gast
Re: notennamen auslesen
« Antwort #5 am: Sonntag, 30. März 2014, 12:34 »
Twintet ist eine von mir entworfene Notation, bei der z.B. Notenlinien immer im Abstand einer großen Terz zu verstehen sind. Man kann daraus unmittelbar die Intervalle ablesen und leicht berechnen, wie oben geschehen.

Der Notenschlüssel erinnert daran, wo das C notiert ist, er ist jedoch nicht unbedingt notwending.

Auf der obersten und untersten Linie wird immer ein E notiert; die beiden unteren Linien sind ein unvollständiges System, das nach unten um zwei Linie fortzusetzen wäre.
Auf der oberen wäre wieder E zu notieren. Der tiefste Ton des Beispiels ist ein F, denn über der obersten Linie und im ersten Zwischenraum wird ein Fis notiert, da ein b vorgezeichnet ist, ist es also ein F.

Die Bezifferung unter den Akkorden stellt eine abstrakte Akkordnotation dar, da sie keine Funktionalität präjudiziert.