= Набор гитарных нот в !LilyPond = == О чём этот урок == В этом уроке я расскажу, как можно добавлять к нотам обозначения гитарной аппликатуры: пальцы правой и левой руки, номера струн, позиции. В отличие от средств нотного набора, устроенных по технологии WYSIWYG, в которых господствует принцип "простые вещи нужно делать одним и тем же способом, сложные — никак", !LilyPond реализует классический принцип: "простые вещи делать просто, сложные — возможно". Поэтому не пугайтесь, если в каких-то местах синтаксис покажется вам пугающим: изощрённость исходника вполне пропорциональна сложности решаемых задач. После того, как вы усвоите базовые принципы, вы поймёте, что !LilyPond — это не только мощное, но и очень логично управляемое средство нотного набора. Впрочем, вполне возможно, что какие-то вещи из примера ниже можно было бы сделать проще и изящнее. В качестве примера мы возьмём упражнение 189 из классического учебника Петра Спиридоновича Агафошина "Школа игры на шестиструнной гитаре". В учебнике ноты выглядят вот так: [[Image(Agafoshin189-source.jpeg)]] == Сам нотный текст == Наберём сами ноты. Это несложно, надо только обратить внимание на направление штилей в третьем такте и вид некоторых тактовых черт: {{{ \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 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{} } }}} Должно получиться что-то примерно такое: [[Image(Agafoshin189-initial.png)]] == Пальцы левой руки == Теперь начнём добавлять аппликатурные обозначения. Начнём с самого простого — указания пальцев левой руки. Для этого достаточно после каждой ноты поставить дефис и номер пальца, вот так: {{{ ... One = \new Voice {\relative c'' { \voiceOne a16-2 h-4 cis-1 d-2 e-4 fis-1 g-2 a-4 h8-4 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 "|." }} ... }}} Выглядеть это станет вот так: [[Image(Agafoshin189-left-fingers.png)]] == Обозначения позиций == Теперь добавим обозначения позиции. Так как мы хотим, чтобы (как и в исходных нотах, набранных вручную) вдоль нот, которые надо играть в указанной позиции, тянулся пунктир, нам придётся переопределить стандартное значение переменной {{{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 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 "|." ... }} }}} В результате получается вот что: [[Image(Agafoshin189-positions.png)]] == Номера струн == Добавить одиночные обозначения струн (там, где они указаны в книжке — к аккорду во втором такте) совсем несложно: для этого достаточно написать номер струны после ноты через обратный слэш: {{{ ... ... }}} А вот с обозначениями струн, которые захватывают несколько нот, всё несколько хитрее. На данный момент (октябрь 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 } #}) }}} Добавим обозначения струн в первых двух тактах (про третий и четвёртый такты у нас будет отдельный разговор): [[Image(Agafoshin189-without-string-lines.png)]] == Совмещение обозначения струн с обозначением позиций == Дальше будет чуть веселее. Попытка добавить растянутые на несколько нот обозначения струн "в лоб" нам не удастся: и ноты, и позиции мы обозначаем с помощью объекта 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 16 \stringNumberSpanner "2" a\startTextSpan fis \stopTextSpan \stringNumberSpanner "3" e\startTextSpan dis \stopTextSpan dis \stringNumberSpanner "4" h\startTextSpan \stemUp c a \stopTextSpan \stringNumberSpanner "5" fis\startTextSpan e dis fis dis \stopTextSpan } >> }}} При компиляции этого куска !LilyPond будет выдавать предупреждения, и это хорошо — как правило, наложение нот друг на друга это результат ошибки, и пользователя действительно надо о нём предупреждать. Однако кое-что действительно пошло не так. У нас получилось вот что: [[Image(Agafoshin189-with-string-lines.png)]] Там, где струна указывается для одиночной ноты, номера струн наехали на номера пальцев. Но это легко исправить, явно задав, где именно надо располагать номера струн с помощью команды {{{\set stringNumberOrientations = #'(down)}}}. Теперь всё почти хорошо. Осталась единственная крупная проблема: в двух местах номера струн наезжают на нотные штили. [[Image(Agafoshin189-collisions.png)]] К счастью, в !LilyPond есть средство исправить эту проблему автоматически. Для этого надо дать команду {{{\override StringNumber #'add-stem-support = ##t}}}. [[Image(Agafoshin189-stem-support.png)]] Во втором такте обозначения левой руки тоже пересекаются со штилями нот. Это не очень красиво, добавим поддержку отслеживания стилей и к первому аккорду с помощью команды {{{\override Fingering #'add-stem-support = ##t}}}. Вот что получается в итоге: [[Image(Agafoshin189.png)]] == Чего я не стал делать == Теперь ноты выглядят почти так же, как исходные, за исключением нескольких мелочей: * в первом такте линии, обозначающие границу группы нот, играемых на одной струне, вынесены с нотоносца; мне кажется, выбранный наборщиком вариант некрасив и не очень читаем; * на границе первого и второго такта глиссандо поставлено между нотами, а не между обозначениями аппликатуры; это можно поменять, но в данном случае непонятно, зачем; * номера струн возле аккорда во втором такте расставлены с разных сторон; расстановку их слева можно было бы задать с помощью команды {{{\set stringNumberOrientations = #'(left)}}}, но при выбранном шрифте это бы смотрелось не очень красиво. Но желающие поэкспериментировать с выравниванием и размером обозначений струн могут сделать это, вооружившись [http://http://lilypond.org/doc/v2.9/Documentation/user/lilypond-internals/StringNumber#StringNumber руководством по внутреннему устройству объекта StringNumber]. Кроме того, я не стал заканчивать уголком линии, обозначающие струну и позицию (как это делается, можно посмотреть [http://lilypond.org/doc/v2.13/Documentation/snippets/Fretted-strings#bar-chords-notation-for-guitar--with-text-spanner.ly вот в этом примере]), поскольку этого не сделано в исходных нотах.