wiki:lessons/LilyPondGuitar

Version 14 (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 }
  #})

Чтобы воспользоваться им, надо там, где начинается обозначение струны, дать команду \stringNumberSpanner "3", а после первой ноты в группе поставить команду \startTextSpan. Окончание группы отмечается командой \stopTextSpan.

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

Агафошин, пример 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.

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

Во втором такте обозначения левой руки тоже пересекаются со штилями нот. Это не очень красиво, добавим поддержку отслеживания штилей и к номерам пальцев в первом аккорде с помощью команды \override Fingering #'add-stem-support = ##t.

Вот что получается в итоге:

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

Вы можете скачать получившийся исходник.

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

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

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

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


Назад в раздел "Учебные материалы"

Назад на главную страницу

Attachments (10)

Download all attachments as: .zip