Version 15 (modified by uri, 15 years ago) (diff) |
---|
Набор гитарных нот в LilyPond
О чём этот урок
В этом уроке я расскажу, как можно добавлять к нотам обозначения гитарной аппликатуры: пальцы правой и левой руки, номера струн, позиции.
В отличие от средств нотного набора, устроенных по технологии WYSIWYG, в которых простые вещи программа делает сама тем способом, который разработчики сочли нужным, а сложные вещи сделать вообще нельзя, LilyPond реализует классический принцип: "простые вещи делать просто, сложные — возможно". Поэтому не пугайтесь, если в каких-то местах синтаксис покажется вам сложноватым: изощрённость исходника вполне пропорциональна нетривиальности решаемых задач. После того, как вы усвоите базовые принципы, вы поймёте, что LilyPond — это не только мощное, но и очень удобное средство нотного набора.
В качестве примера мы возьмём упражнение 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{} }
Должно получиться что-то примерно такое:
Пальцы левой руки
Теперь начнём добавлять аппликатурные обозначения. Начнём с самого простого — указания пальцев левой руки. Для этого достаточно после каждой ноты поставить дефис и номер пальца:
... 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 "|." }} ...
Выглядеть это станет вот так:
Обозначения позиций
Теперь добавим обозначения позиции. Так как мы хотим, чтобы, как и в книжке, с которой мы набираем, после обозначения позиции вдоль нот тянулся пунктир, нам придётся изменить стандартное значение одного из полей объекта 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 "|." ... }}
А на выходе получится вот что:
Номера струн
Добавить одиночные обозначения струн (там, где они указаны в книжке — к аккорду во втором такте) совсем несложно: для этого достаточно написать номер струны после ноты через обратный слеш:
... <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.
Добавим обозначения струн в первых двух тактах (про третий и четвёртый такты у нас будет отдельный разговор):
Совмещение обозначения струн с обозначением позиций
Дальше будет чуть веселее. Добавить растянутые на несколько нот обозначения струн "в лоб" нам не удастся: и ноты, и позиции мы обозначаем с помощью объекта 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 будет выдавать предупреждения, и это правильно — как правило, ноты накладываются друг на друга из-за ошибки пользователя, и об этом действительно надо предупреждать. Мы-то как раз дублируем ноты сознательно, однако сейчас и правда кое-что пошло не так. У нас получилось вот что:
Там, где струна указана для одиночной ноты, номера струн наехали на номера пальцев. Но это легко исправить, явно задав, где именно надо располагать номера струн с помощью команды \set stringNumberOrientations = #'(down). Теперь всё почти хорошо. Осталась единственная крупная проблема: в двух местах номера струн наезжают на нотные штили.
К счастью, в LilyPond есть средство исправить эту проблему автоматически. Для этого надо дать команду \override StringNumber #'add-stem-support = ##t.
Во втором такте обозначения левой руки тоже пересекаются со штилями нот. Это не очень красиво, добавим поддержку отслеживания штилей и к номерам пальцев в первом аккорде с помощью команды \override Fingering #'add-stem-support = ##t.
Вот что получается в итоге:
Вы можете скачать получившийся исходник.
Чего я не стал делать
Теперь ноты выглядят почти так же, как и в книжке, за исключением нескольких мелочей:
- в первом такте обозначения струн вынесены с нотоносца; мне кажется, выбранный наборщиками бумажной книжки вариант некрасив и не очень читаем;
- на границе первого и второго такта глиссандо поставлено между нотами, а не между обозначениями аппликатуры; это можно поменять, но в данном случае непонятно, зачем;
- номера струн возле аккорда во втором такте расставлены с разных сторон; расстановку их слева можно было бы задать с помощью команды \set stringNumberOrientations = #'(left), но при выбранном шрифте это бы смотрелось не очень красиво. Однако, желающие поэкспериментировать с выравниванием и размером обозначений струн могут сделать это, вооружившись руководством по внутреннему устройству объекта StringNumber.
Я не стал здесь использовать обозначения пальцев правой руки — их нет у Агафошина, и это бы переусложнило и без того плотный нотный текст. Обозначения пальцев правой руки вводят, добавляя после ноты команду \rightHandFinger, аргумент которой — номер нужного пальца в фортепианных обозначениях. Часто удобно определить для команды \rightHandFinger какой-нибудь короткий синоним, скажем, \RH:
#(define RH rightHandFinger)
Кроме того, я не стал заканчивать уголком линии, обозначающие струну и позицию (как это делается, можно посмотреть в примере на сайте LilyPond), поскольку этого не сделано в книжке.
Подробнее о гитарных обозначениях можно прочитать в официальном руководстве LilyPond.
Attachments (10)
-
Agafoshin189-source.jpeg
(25.3 KB) -
added by uri 15 years ago.
Агафошин, пример 189 --- исходные ноты в книжке
-
Agafoshin189-initial.png
(11.9 KB) -
added by uri 15 years ago.
Агафошин, пример 189 --- сам нотный текст
-
Agafoshin189-left-fingers.png
(13.9 KB) -
added by uri 15 years ago.
Агафошин, пример 189 --- добавлены обозначения пальцев левой руки
-
Agafoshin189-positions.png
(21.5 KB) -
added by uri 15 years ago.
Агафошин, пример 189 --- добавлены обозначения позиций
-
Agafoshin189-without-string-lines.png
(15.6 KB) -
added by uri 15 years ago.
Агафошин, пример 189 --- добавлены одиночные обозначения струн
-
Agafoshin189-with-string-lines.png
(15.5 KB) -
added by uri 15 years ago.
Агафошин, пример 189 --- добавлены обозначения струн для групп нот
-
Agafoshin189-collisions.png
(19.5 KB) -
added by uri 15 years ago.
Агафошин, пример 189 --- добавлены обозначения струн в третьем и четвёртом тактах
-
Agafoshin189.png
(19.2 KB) -
added by uri 15 years ago.
Агафошин, пример 189 --- добавлен готовый нотный пример
-
Agafoshin189-stem-support.png
(16.9 KB) -
added by uri 15 years ago.
Агафошин, пример 189 --- обозначения струн больше не наезжают на нотные штили
-
Agafoshin189.ly
(2.3 KB) -
added by uri 15 years ago.
Агафошин, пример 189 --- исходник
Download all attachments as: .zip