Subject: Fonction pour Ambitus

From: Ya Gloops <[email-masked]>
Date: Sat, 27 Aug 2022 14:19:04 +0000 (UTC)

Bonjour à tous!
J'aime imprimer systématiquement l'ambitus sur mes partitions, malheureusement lorsque celui-ci est inférieur à une tierce les notes se chevauchent...

\version "2.23.12"
\score {
  { <c' d'>}
  \layout {
    \context {\Staff \consists Ambitus_engraver}
  }
}

Y'a t'il possibilité de faire se décaler les notes trop proche, comme le fait la notation des accords?
Ou bien, moins séduisant mais pratique, d'annuler automatiquement l'impression de l'ambitus au cas ou celui-ci est inférieur à une tierce?

Musicalement Gilles

---

From: Jean Abou Samra <[email-masked]>
Date: Sun, 28 Aug 2022 00:15:32 +0200

> Ou bien, moins séduisant mais pratique, d'annuler automatiquement l'impression de l'ambitus au cas ou celui-ci est inférieur à une tierce?

Bonjour,

Les ambitus ne sont effectivement pas prévus pour des amplitudes
si courtes...

Une solution pour la première option :

\version "2.23.12"

\layout {
   #(use-modules (ice-9 match))
   \context {
     \Staff
     \override Ambitus.before-line-breaking =
       #(lambda (grob)
          (define (staff-position head)
            (ly:grob-property head 'staff-position))
          (match-let
                (((head-down head-up)
                  (sort
                   (filter (lambda (g)
                             (grob::has-interface g 'note-head-interface))
                           (ly:grob-array->list (ly:grob-object grob 
'elements)))
                   (comparator-from-key staff-position <))))
            (when (<= (- (staff-position head-up)
                         (staff-position head-down))
                      1)
              (let ((len (interval-length (ly:grob-extent head-up 
head-up X))))
                (ly:grob-translate-axis! head-up len X)))))
   }
}

\score {
   { <c' d'>}
   \layout {

Et pour la deuxième option :

\version "2.23.12"

\layout {
   #(use-modules (ice-9 match))
   \context {
     \Staff
     \override Ambitus.before-line-breaking =
       #(lambda (grob)
          (define (staff-position head)
            (ly:grob-property head 'staff-position))
          (match-let*
                ((elts (ly:grob-array->list (ly:grob-object grob 
'elements)))
                 ((head-down head-up)
                  (sort
                   (filter (lambda (g)
                             (grob::has-interface g 'note-head-interface))
                           elts)
                   (comparator-from-key staff-position <))))
            (when (<= (- (staff-position head-up)
                         (staff-position head-down))
                      1)
              (for-each ly:grob-suicide! elts)
              (ly:grob-suicide! grob))))
   }
}

\score {
   { <c' d'>}
   \layout {

Cordialement,
Jean

---

From: yagloops <[email-masked]>
Date: Sun, 28 Aug 2022 00:22:07 +0200

Wouaww ! Le beurre l’argent du beurre la crémière et la crémerie en plus… Énorme Jean !!!

---

From: Ya Gloops <[email-masked]>
Date: Sun, 28 Aug 2022 10:09:40 +0000 (UTC)

Mince ça créer une erreur lorsqu'il n'y a que des silences...

\layout {
                          (ly:grob-array->list (ly:grob-object grob 'elements)))
             (let ((len (interval-length (ly:grob-extent head-up head-up X))))

\score {
  { r }
  \layout {

Le dimanche 28 août 2022 à 00:22:25 UTC+2, yagloops <[email-masked]> a écrit :

---

From: Ya Gloops <[email-masked]>
Date: Sun, 28 Aug 2022 10:45:05 +0000 (UTC)

Et dernière petite chose!
Si il n'y à qu'une note ou seulement un unisson, n'afficher qu'une note au lieu de deux...

\layout {

\score {
  { c' }
  \layout {
  { c' c' }

Le dimanche 28 août 2022 à 12:09:40 UTC+2, Ya Gloops <[email-masked]> a écrit : 

\layout {

\score {
  { r }
  \layout {

---

From: Jean Abou Samra <[email-masked]>
Date: Mon, 29 Aug 2022 20:02:15 +0200

> Si il n'y à qu'une note ou seulement un unisson, n'afficher qu'une note au lieu de deux...

J'étais déjà surpris de l'ambitus à deux notes, je suis encore plus surpris
de l'ambitus unisson, mais pourquoi pas après tout…

Voilà une version qui le fait. J'ai aussi corrigé des problèmes avec les
altérations.

Cordialement,
Jean

\version "2.23.12"

\layout {
   #(use-modules (ice-9 match)
                 (srfi srfi-1))
   \context {
     \Staff
     \override Ambitus.before-line-breaking =
       #(lambda (grob)
          (let* ((elts (ly:grob-array->list (ly:grob-object grob 
'elements)))
                 (heads (filter (lambda (g)
                                  (grob::has-interface g 
'note-head-interface))
                                elts)))
            (match heads
              (()
               #f)
              ((head1 head2)
               (let* ((p1 (ly:grob-property head1 'staff-position))
                      (p2 (ly:grob-property head2 'staff-position))
                      (diff (abs (- p1 p2))))
                 (case diff
                   ((0)
                    (ly:grob-suicide! head2)
                    (for-each
                     (lambda (g)
                       (when (and (grob::has-interface g 
'accidental-interface)
                                  (eq? head2 (ly:grob-parent g Y)))
                         (ly:grob-suicide! g)
                         (let ((placement (find (lambda (h)
(grob::has-interface h 'accidental-placement-interface))
                                                elts)))
                           (when placement
                             (let* ((accidental-grobs (ly:grob-object 
placement 'accidental-grobs))
                                    (filtered (map (lambda (entry)
                                                     (cons (car entry)
                                                           (delete g 
(cdr entry))))
accidental-grobs)))
                               (ly:grob-set-object! placement 
'accidental-grobs filtered)))))
                       (when (eq? 'AmbitusLine (grob::name g))
                         (ly:grob-suicide! g)))
                     elts))
                   ((1)
                    (let* ((head-up (if (< p1 p2)
                                        head2
                                        head1))
                           (ext (ly:grob-extent head-up head-up X))
                           (len (interval-length ext)))
                      (ly:grob-translate-axis! head-up len X)))))))))
   }
}

\layout {
   \context {
     \Staff
     \consists Ambitus_engraver
   }
}

{ s }
{ c' }
{ cis' }
{ c' d' }
{ cis' dis' }
{ c' c'' }
{ cis' cis'' }

---

From: yagloops <[email-masked]>
Date: Mon, 29 Aug 2022 22:04:30 +0200

Un énorme merci Jean ! C’est magnifique…
En fait je disais que j’indique systématiquement l’ambitus et parfois dans certains cas une voix peut ne comporter qu’un seul son, ou voir aucun,  par exemple la voix de tenor ou d’alto ou de basse pour des pièces courtes …
Je comprends que ça n’est  pas très utile à beaucoup mais sait-on jamais…
Encore tout mes remerciements et ma gratitude !!! Gilles