W dniu 1 sierpnia 2011 16:47 użytkownik Wols Lists
<antli...@youngman.org.uk> napisał:
> On 31/07/11 23:35, Carl Sorensen wrote:
>> Do we need four bars?  Why not just do three bars -- one with capoPitch '(),
>> another with capoPitch set, and a third with capoVertical?
>>
>> We like to get examples and regtests as simple as can be.
>>
> New modified regtest attached. I've cut it down to one line, two bars
> per section so six in total. (I know you want minimal, but cutting it
> down to one note per section feels a bit two much, and two minims looked
> naff.) The other thing is, the new regtest doesn't have N/C, which
> doesn't seem to matter, but that was almost the first thing I thought
> needed checking when I first saw the chord-mode documentation I based my
> sample and reg-test on.
>
> Personally I prefer my longer version, but I'm quite happy to leave it
> to you which version you actually go for (this second patch should apply
> *instead* *of* the first).

Done and uploaded to Rietveld. http://codereview.appspot.com/4800051/
I have a small suggestion: change g major chord into a minor chord.
This way we'll have more variety, so there'll be less chance of a
regression going unnoticed.
I attach your patches updated in a way that they can be applied to
current git master (i.e. they don't run into problems because of
recent style formatting changes), this may save you some trouble.

cheers,
Janek
From edfefae7c6575b190b4737effb0985bee1e0218a Mon Sep 17 00:00:00 2001
From: Wol <anth...@youngman.org.uk>
Date: Fri, 29 Jul 2011 22:43:13 +0100
Subject: [PATCH 1/3] Modify chord handling to handle guitar capos

chord-name-engraver now calls a shim between it and the chord formatter
in order to print capo chords

chord-name-scm has had capo-handler added. If requested it prints both
the original chord, and the transposed chord.

define-context-properties adds the properties capoPitch to declare the
capo transposition, and capoVertical to make the chords print in column
rather than row form.
---
 lily/chord-name-engraver.cc       |    4 ++--
 scm/chord-name.scm                |   28 ++++++++++++++++++++++++++++
 scm/define-context-properties.scm |    2 ++
 3 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/lily/chord-name-engraver.cc b/lily/chord-name-engraver.cc
index e228140..b55668b 100644
--- a/lily/chord-name-engraver.cc
+++ b/lily/chord-name-engraver.cc
@@ -124,8 +124,8 @@ Chord_name_engraver::process_music ()
 
       pitches = scm_sort_list (pitches, Pitch::less_p_proc);
 
-      SCM name_proc = get_property ("chordNameFunction");
-      markup = scm_call_4 (name_proc, pitches, bass, inversion,
+      SCM capo_proc = ly_lily_module_constant ("capo-handler");
+      markup = scm_call_4 (capo_proc, pitches, bass, inversion,
                            context ()->self_scm ());
     }
   /*
diff --git a/scm/chord-name.scm b/scm/chord-name.scm
index 79b0189..9c590be 100644
--- a/scm/chord-name.scm
+++ b/scm/chord-name.scm
@@ -170,3 +170,31 @@ FOOBAR-MARKUP) if OMIT-ROOT is given and non-false.
 	 (alist (map chord-to-exception-entry elts)))
     (filter (lambda (x) (cdr x)) alist)))
 
+(define-public (capo-handler pitches bass inversion context)
+  (let ((chord-function
+          (ly:context-property context 'chordNameFunction 'jazz-chord-names))
+        (capo-pitch (ly:context-property context 'capoPitch #f)))
+    (if (not capo-pitch)
+        (chord-function pitches bass inversion context)  ;; call the chordNameFunction as of old
+        (let* ((new-pitches   ;; else transpose the pitches and do the chord twice
+               (map (lambda (p)
+                       (ly:pitch-transpose p capo-pitch))
+                    pitches))
+               (new-bass
+                 (if (ly:pitch? bass)
+                     (ly:pitch-transpose bass capo-pitch)
+                     '()))
+               (new-inversion
+                 (if (ly:pitch? inversion)
+                     (ly:pitch-transpose inversion capo-pitch)
+                     '()))
+               (capo-markup
+                 (make-parenthesize-markup
+                   (chord-function new-pitches new-bass new-inversion context)))
+               (name-markup (chord-function pitches bass  inversion context))
+               (capo-vertical (ly:context-property context 'capoVertical #f)))
+          (if capo-vertical
+              (make-column-markup (list name-markup capo-markup))
+              (make-line-markup (list name-markup
+                                      (make-hspace-markup 1)
+                                      capo-markup)))))))
diff --git a/scm/define-context-properties.scm b/scm/define-context-properties.scm
index dab5211..d17f72f 100644
--- a/scm/define-context-properties.scm
+++ b/scm/define-context-properties.scm
@@ -135,6 +135,8 @@ that normally end on beats.")
      (beatStructure ,list? "List of @code{baseMoment}s that are combined
 to make beats.")
 
+     (capoPitch ,ly:pitch? "The pitch to transpose chords down by when using the capo.")
+     (capoVertical ,boolean? "Whether to display actual and transposed pitches above each other or not.")
      (chordChanges ,boolean? "Only show changes in chords scheme?")
      (chordNameExceptions ,list? "An alist of chord exceptions.
 Contains @code{(@var{chord} . @var{markup})} entries.")
-- 
1.7.0.4

From b55e5678509059effdd3973a2a0beb0af6445e4c Mon Sep 17 00:00:00 2001
From: Wol <anth...@youngman.org.uk>
Date: Sun, 31 Jul 2011 17:10:13 +0100
Subject: [PATCH 2/3] Document the use of the capoPitch and capoVertical properties

---
 Documentation/notation/chords.itely |   50 +++++++++++++++++++++++++++++++++++
 1 files changed, 50 insertions(+), 0 deletions(-)

diff --git a/Documentation/notation/chords.itely b/Documentation/notation/chords.itely
index 1109075..982ed4b 100644
--- a/Documentation/notation/chords.itely
+++ b/Documentation/notation/chords.itely
@@ -506,6 +506,56 @@ Rests passed to a @code{ChordNames} context will cause the
 }
 @end lilypond
 
+@cindex Transposing guitar chords for capo
+
+If the @code{capoPitch} property is set, then the chords will additionally be printed
+transposed for a guitar with the capo set appropriately. By default the chords are 
+printed on one line, but if the @code{capoVertical} property is set, the chords will be
+printed one above the other.
+
+In make-pitch, leave the first argument at 0, the second argument is the
+interval (-2 is a third), and the third argument adjusts it up or down a
+semitone.
+
+@lilypond[verbatim,quote,ragged-right]
+<<
+  \new ChordNames \chordmode {
+    c1
+    r1
+    g1
+    c1
+    \break
+    c1
+    r1
+    g1
+    c1
+    \break
+    c1
+    r1
+    g1
+    c1
+  }
+  \chordmode {
+    c1
+    r1
+    g1
+    c1
+    \break
+    \set ChordNames.capoPitch = #(ly:make-pitch 0 -2 -1/2)
+    c1
+    r1
+    g1
+    c1
+    \break
+    \set ChordNames.capoVertical = ##t
+    c1
+    r1
+    g1
+    c1
+  }
+>>
+@end lilypond
+
 @snippets
 
 @c Keep index entries with following snippet
-- 
1.7.0.4

From 2f92c51802e9f941289fd5bcb7b2df4c97ecce65 Mon Sep 17 00:00:00 2001
From: Wol <anth...@youngman.org.uk>
Date: Mon, 1 Aug 2011 15:19:46 +0100
Subject: [PATCH 3/3] Add regression test for guitar capos

---
 input/regression/chord-capo.ly |   28 ++++++++++++++++++++++++++++
 1 files changed, 28 insertions(+), 0 deletions(-)
 create mode 100644 input/regression/chord-capo.ly

diff --git a/input/regression/chord-capo.ly b/input/regression/chord-capo.ly
new file mode 100644
index 0000000..789f47d
--- /dev/null
+++ b/input/regression/chord-capo.ly
@@ -0,0 +1,28 @@
+\version "2.14.0"
+
+\header{
+  texidoc="Properties capoPitch, capoVertical: display chordnames, suitably 
+transposed for a guitar capo, either in a line or one above the other.
+"
+}
+
+<<
+  \new ChordNames \chordmode {
+    c1
+    g1
+    c1
+    g1
+    c1
+    g1
+  }
+  \chordmode {
+    c1
+    g1
+    \set ChordNames.capoPitch = #(ly:make-pitch 0 -2 -1/2)
+    c1
+    g1
+    \set ChordNames.capoVertical = ##t
+    c1
+    g1
+  }
+>>
-- 
1.7.0.4

_______________________________________________
lilypond-devel mailing list
lilypond-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-devel

Reply via email to