wiki:lessons/LilyPondGuitar

Version 8 (modified by uri, 15 years ago) (diff)

Дописал

Набор гитарных нот в LilyPond

О чём этот урок

В этом уроке я расскажу, как можно добавлять к нотам обозначения гитарной аппликатуры: пальцы правой и левой руки, номера струн, позиции.

В отличие от средств нотного набора, устроенных по технологии WYSIWYG, в которых господствует принцип "простые вещи нужно делать одним и тем же способом, сложные — никак", LilyPond реализует классический принцип: "простые вещи делать просто, сложные — возможно". Поэтому не пугайтесь, если в каких-то местах синтаксис покажется вам пугающим: изощрённость исходника вполне пропорциональна сложности решаемых задач. После того, как вы усвоите базовые принципы, вы поймёте, что LilyPond — это не только мощное, но и очень логично управляемое средство нотного набора. Впрочем, вполне возможно, что какие-то вещи из примера ниже можно было бы сделать проще и изящнее.

В качестве примера мы возьмём упражнение 189 из классического учебника Петра Спиридоновича Агафошина "Школа игры на шестиструнной гитаре". В учебнике ноты выглядят вот так:

Агафошин, пример 189 --- исходные ноты в книжке

Сам нотный текст

Наберём сами ноты. Это несложно, надо только обратить внимание на направление штилей в третьем такте и вид некоторых тактовых черт:

\version "2.12.1"

% European system (A B H C D E F G)
\include "deutsch.ly"

global = {
  \key d \major
  \time 2/4
}

One = \new Voice {\relative c'' {
  \voiceOne
  a16 h cis d e fis g a
  h8 <d, fis a> <d fis a> r
  \bar "||"
  \stemDown
  c'16 a fis e dis fis dis h
  \stemUp
  c a fis e dis fis dis h
  \bar "|."
}}

Two = \new Voice {\relative c' {
  \voiceTwo
  a4 a
  d2.
}}

\score {
  \new Staff
  <<
    \global
    \One
    \\
    \Two
  >>
  \layout{}
  \midi{}
}

Должно получиться что-то примерно такое:

Агафошин, пример 189 --- сам нотный текст

Пальцы левой руки

Теперь начнём добавлять аппликатурные обозначения. Начнём с самого простого — указания пальцев левой руки. Для этого достаточно после каждой ноты поставить дефис и номер пальца, вот так:

...
One = \new Voice {\relative c'' {
  \voiceOne
  a16-2 h-4 cis-1 d-2 e-4 fis-1 g-2 a-4
  h8-4 <d,-3 fis-2 a-1> <d fis a> r
  \bar "||"
  \stemDown
  c'16-2 a-4 fis-1 e-3 dis-2 fis-1 dis h-3
  \stemUp
  c-4 a-1 fis-4 e-2 dis-1 fis-4 dis h-2
  \bar "|."
}}
...

Выглядеть это станет вот так:

Агафошин, пример 189 --- добавлены обозначения пальцев левой руки

Обозначения позиций

Теперь добавим обозначения позиции. Так как мы хотим, чтобы (как и в исходных нотах, набранных вручную) вдоль нот, которые надо играть в указанной позиции, тянулся пунктир, нам придётся переопределить стандартное значение переменной TextSpanner. Делается это совсем просто: там, где нужно расположить указание позиции, даём команду \override TextSpanner #'(bound-details left text) = "II ", где II — это номер нужной позиции; после ноты, с которой должен начинаться пунктир, даём команду \startTextSpan, а после ноты, на которой пунктир должен закончиться — команду \stopTextSpan.

Пунктир, предлагаемый LilyPond по умолчанию, показался мне крупноватым, и я сделал его более мелким командой \override TextSpanner #'dash-period = #2. Кроме того, в книжке он выровнен вертикально по центру римской цифры, обозначающей позицию; добиться того же в LilyPond можно командой \override TextSpanner #'(bound-details left stencil-align-dir-y) = #CENTER.

В результате соответствующий фрагмент исходника приобретает следующий вид:

...
One = \new Voice {\relative c'' {
  \voiceOne
  a16-2 h-4 cis-1 d-2 e-4 fis-1 g-2 a-4
  h8-4 <d,-3 fis-2 a-1> <d fis a> r
  \bar "||"
  \stemDown
  \textSpannerUp
  \override TextSpanner #'dash-period = #2
  \override TextSpanner #'(bound-details left stencil-align-dir-y) = #CENTER
  \override TextSpanner #'(bound-details left text) = "VII "
  c'16-2\startTextSpan a-4 fis-1 e-3 dis-2 fis-1 dis h-3
  \stemUp
  c-4\stopTextSpan a-1
  \override TextSpanner #'(bound-details left text) = "VI "
  fis-4\startTextSpan e-2 dis-1 fis-4 dis h-2\stopTextSpan
  \bar "|."
...
}}

В результате получается вот что:

Агафошин, пример 189 --- добавлены обозначения позиций

Номера струн

Добавить одиночные обозначения струн (там, где они указаны в книжке — к аккорду во втором такте) совсем несложно: для этого достаточно написать номер струны после ноты через обратный слэш:

...
<d\4 fis\3 a\2>
...

А вот с обозначениями струн, которые захватывают несколько нот, всё несколько хитрее. На данный момент (октябрь 2009 года, я использую версию 2.12.1) в LilyPond ещё не добавили для этого специальную команду, хотя такие разговоры ведутся. Поэтому нам придётся определить собственный макрос:

stringNumberSpanner =
#(define-music-function (parser location StringNumber) (string?)
  #{
    \override TextSpanner #'style = #'dashed-line
    \override TextSpanner #'dash-period = #1
    \override TextSpanner #'font-size = #-5
    \override TextSpanner #'(bound-details left stencil-align-dir-y) = #CENTER
    \override TextSpanner #'(bound-details left text) = \markup { \circle \number $StringNumber }
  #})

Добавим обозначения струн в первых двух тактах (про третий и четвёртый такты у нас будет отдельный разговор):

Агафошин, пример 189 --- добавлены одиночные обозначения струн

Совмещение обозначения струн с обозначением позиций

Дальше будет чуть веселее. Попытка добавить растянутые на несколько нот обозначения струн "в лоб" нам не удастся: и ноты, и позиции мы обозначаем с помощью объекта TextSpanner?, который только один на каждый голос. Поэтому нам придётся создать два отображения третьего и четвёртого тактов, к одному из которых мы подпишем обозначения струн, а к другому — обозначения пальцев левой руки. Соответствующий фрагмент исходника станет выглядеть так:

  % Some stuff is duplicated here
  << {
    \stemDown
    \textSpannerUp
    \override TextSpanner #'dash-period = #2
    \override TextSpanner #'(bound-details left stencil-align-dir-y) = #CENTER
    \override TextSpanner #'(bound-details left text) = "VII "
    c'16-2\startTextSpan
    a-4 fis-1
    e-3 dis-2 fis-1 dis h-3
    \stemUp
    c-4\stopTextSpan a-1
    \override TextSpanner #'(bound-details left text) = "VI "
    fis-4\startTextSpan e-2 dis-1 fis-4 dis h-2\stopTextSpan
  } \\ {
    \stemDown
    \textSpannerDown
    <c'' \1>16
    \stringNumberSpanner "2"
    a\startTextSpan
    fis
    \stopTextSpan
    \stringNumberSpanner "3"
    e\startTextSpan dis
    \stopTextSpan
    <fis\2> dis
    \stringNumberSpanner "4"
    h\startTextSpan
    \stemUp
    c a
    \stopTextSpan
    \stringNumberSpanner "5"
    fis\startTextSpan e dis fis dis
    \stopTextSpan
    <h\6>
  } >>

При компиляции этого куска LilyPond будет выдавать предупреждения, и это хорошо — как правило, наложение нот друг на друга это результат ошибки, и пользователя действительно надо о нём предупреждать. Однако кое-что действительно пошло не так. У нас получилось вот что:

Агафошин, пример 189 --- добавлены обозначения струн для групп нот

Там, где струна указывается для одиночной ноты, номера струн наехали на номера пальцев. Но это легко исправить, явно задав, где именно надо располагать номера струн с помощью команды \set stringNumberOrientations = #'(down). Теперь всё почти хорошо. Осталась единственная крупная проблема: в двух местах номера струн наезжают на нотные штили.

Агафошин, пример 189 --- добавлены обозначения струн в третьем и четвёртом тактах

К счастью, в LilyPond есть средство исправить эту проблему автоматически. Для этого надо дать команду \override StringNumber #'add-stem-support = ##t.

Чего я не стал делать

Теперь ноты выглядят почти так же, как исходные, за исключением нескольких мелочей:

  • в первом такте линии, обозначающие границу группы нот, играемых на одной струне, вынесены с нотоносца; мне кажется, выбранный наборщиком вариант некрасив и не очень читаем;
  • на границе первого и второго такта глиссандо поставлено между нотами, а не между обозначениями аппликатуры; это можно поменять, но в данном случае непонятно, зачем;
  • номера струн возле аккорда во втором такте расставлены с разных сторон; расстановку их слева можно было бы задать с помощью команды \set stringNumberOrientations = #'(left), но при выбранном шрифте это бы смотрелось не очень красиво. Но желающие поэкспериментировать с выравниванием и размером обозначений струн могут сделать это, вооружившись руководством по внутреннему устройству объекта StringNumber.

Кроме того, я не стал заканчивать уголком линии, обозначающие струну и позицию, поскольку этого не сделано в исходных нотах.

Attachments (10)

Download all attachments as: .zip