Архив рубрики: LilyPond

Как добавить обозначение инструмента не перед первым нотным станом

LilyPond умеет, как и многие другие попадавшиеся мне нотные редакторы, указывать название инструмента либо голоса слева от нотного стана. Доступны два варианта именования нотного стана: полный, задаваемый параметром instrumentName применяется у самого верхнего нотного стана в партитуре (или у их группы), сокращённый shortInstrumentName — у всех остальных. В отечественных хоровых нотах нередко ставят только сокращённые наименования партий возле верхней группы нотных станов (если вообще ставят), а возле остальных групп не ставят ничего.

Если хоровое произведение, набранное в лилипонде, начинается с занимающих целую строку нескольких тактов, где поёт только одна партия, и нам хочется скрыть остальных, кто молчит, получится странная ситуация, если мы отметим партии как сказано выше (первая группа нотных станов — кратко, остальные — никак) — солирующая партия будет обозначена, остальные — нет. Это может привести к путанице.

Однако можно сменить название партии в любой момент, не только при описании нотного стана (\new Staff), но и в произвольном месте:

% 25
\voiceOne
\set Staff.shortInstrumentName = "Б."
e4 e8 f f f
\set Staff.shortInstrumentName = ""

Результат:

Ноты — смена обозначения партии

Задание собственных обозначений для тактовых черт

Набирал ноты с репризой и двумя обычными тактовыми чертами — написал код \bar ":||" — не получил желаемое. Более того — тактовая черта вообще пропала. Похоже, в лилипонде нет такого сочетания тактовых черт (что странно — там же есть и двойные черты, и сочетания знака репризы с тонкой и толстой чертой). Не беда — можно нужный знак определить и потом его использовать:

\defineBarLine ":||" #'(":||" "" " ||")
% ...
\bar ":||"

Результат:

Двойная тактовая черта с репризой

Если же в определении тактовой черты не указать параметр span (точнее, оставить его пустым — \defineBarLine ":||" #'(":||" "" "")), то тактовые черты будут идти только внутри нотного стана, не выходя за его пределы, даже если для группы нотных станов задано использование общих черт:

Двойная тактовая черта с репризой и разрывом

Темп над пустым тактом

Обнаружил глюк в лилипонде: он не даёт поставить изменение темпа над пустым тактом.

Ноты

Задача — поставить в нотах изменения темпа — ritenuto и какой-нибудь ещё. С каким-нибудь ещё проблем не возникает — LilyPond спокойно принимает команду

\tempo "Медленнее"

А вот с ритенуто такой способ не проходит: я пробовал менять способ записи паузы: вместо R8*9 писал s8 r1, пробовал сдвигать команду изменения темпа в фортепианную партию (это не должно влиять на то, где отображается темп — всегда сверху) — не помогает: в лучшем случае ритенуто пропадает, в худшем — часть нот сдвигается по горизонтали и в партитуре начинается хаос.

Решение оказалось простым — можно просто добавить к паузе обычную надпись и выделить её как темп — полужирным.

R8*9^\markup { \bold "riten." }

Такой способ работает.

Рисование глиссандо в лилипонде

LilyPond хорош, но, как и всё вокруг, неидеален.

Например, я неоднократно сталкивался с необходимостью изобразить глиссандо, соединяющее ноту с пустым местом. Казалось бы — что такого? Можно, например, в пустом месте нарисовать ноту с прятать её командой \hideNotes, однако это приведёт к сдвигу нот в соседний такт. Можно и сдвиг победить, отключив контроль размера командой \canenzaOn — именно такой метод описан в руководстве, результат должен быть таким:

Глиссандо в пустоту

Берём маленький пример — вроде, работает. Вставляем в большую партитуру — всё расползается. Не годится.

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

Что остаётся? Нарисовать. В лилипондовые файлы можно добавлять команды языка PostScript и таким образом рисовать то, что позволяет постскрипт. Хочет автор, чтоб было глиссандо где попало, да ещё и зигзагом — пожалуйста!

Пишем:

zigzagGlis = \markup {
  \postscript #"-0.8 0.2 rlineto 0.2 -0.8 rlineto -0.8 0.2 rlineto 0.2 -0.8 rlineto -0.8 0.2 rlineto 0.2 -0.8 rlineto -0.8 0.2 rlineto 0.2 -0.8 rlineto stroke"
}
% ...
a2.-- -\zigzagGlis ( \sf\>     | % 5
gis2.)\(  \pp
c2.-- -\zigzagGlis \)( \sf\>
b2)   \pp  r4

Получаем:Глиссандо

Простой способ учить песню на слух из лилипондовых нот

LilyPond умеет генерировать из одной партитуры кучу MIDI-файлов для разных партий, где одна партия звучит громче остальных и исполнена (если хочется) другим инструментом — это весьма полезно для разучивания нот хором на слух.

А Frescobaldi умеет вставлять в лилипондовый исходный файл код, который и включает эту красоту: Tools → Setup New Score… Ctrl+Shift+N,

Setup New Score

после чего в открывшемся окне на вкладке Parts надо поставить галочку у пункта Rehearsal MIDI files.

При компиляции файла filename.ly помимо файлов filename.pdf и filename.midi создаётся куча файлов с именами filenamevoicename.midi, в которых и находится нужный звук. А точнее — нужные MIDI-команды.

Без промежуточных шагов

Раньше при наборе лилипондовых нот я использовал различные костыли промежуточные нотные редакторы.

Пробовал Denemo — оно иногда падает и лилипондовый исходник выдаёт без использования команды \relative, то есть использует не относительное, а абсолютное указание используемых октав, что ведёт к избытку в исходном тексте запятых и апострофов (если только мы не пишем в малой октаве).

Пробовал MuseScore — в последнее время он стал достойнее выглядеть, и в нём уже́ можно работать. Видно, что на MuseScore оказал немалое влияние Sibelius, но пока в MuseScore ещё есть, что улучшить. Кроме того, практика показала, что MuseScore некорректно экспортирует ноты в лилипондовый формат, а вскоре вообще откажется от экспорта в LilyPond, сосредоточившись на MusicXML.

Видя такое положение, решил для эксперимента набрать ноты сразу в лилипондовом формате, без использования промежуточных редакторов. Эксперимент показал, что скорость набора изменилась несущественно. Конечно, у набора в виде исходного кода есть ряд недостатков: нельзя услышать и увидеть свеженабранную ноту, нужно постоянно помнить, какие ключевые знаки используются: даже нотах с одной тональностью я забывал поставить несколько диезов на страницу. Преимуществ у подобного прямого ввода я пока вижу всего три:

  • отсутствие необходимости помнить, как работать с посторонними программами;
  • более чистый исходный код: я в него добавляю лишь то, что мне надо, без ненужного мусора;
  • возможность использовать неанглийские обозначения нот: если в начало файла вставить команду \language "deutsch", то будут использоваться именно те буквы, что применяются в России: буква b будет обозначать си-бемоль, для обозначения ноты си будет использоваться буква h, а для ми-бемоля с ля-бемолем — es и as соответственно.

Бекары — слева, бемоли с диезами — справа

Прошлой зимой я изобретал хитрый способ заставить лилипонд выводить знаки при ключе по разные стороны тактовой черты в случае смены тональности: метод работал не совсем корректно, рисуя лишние бекары в случае уменьшения только лишь количества знаков.

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

By default, the accidentals used for key cancellations are placed adjacent to those for key signature changes. This behavior can be changed by overriding the ‘break-align-orders property of the BreakAlignment grob.

The value of ‘break-align-orders is a vector of length 3, with quoted lists of breakable items as elements. This example only modifies the second list, moving key-cancellation before staff-bar; by modifying the second list, break alignment behavior only changes in the middle of a system, not at the beginning or the end.

\new Staff {
  \override Score.BreakAlignment #'break-align-orders =
    #'#((left-edge ambitus breathing-sign clef staff-bar
                   key-cancellation key-signature time-signature custos)

        (left-edge ambitus breathing-sign clef key-cancellation
                   staff-bar key-signature time-signature custos)

        (left-edge ambitus breathing-sign clef key-cancellation
                   key-signature staff-bar time-signature custos))

  \key des \major
  c'1
  \bar "||"
  \key bes \major
  c'1
}

Ноты

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

Фрист

Набирал как-то ноты немецкой рождественской песни «Stille Nacht», решил добавить туда немецкий текст — мне видеть его как-то привычнее, чем русский перевод, к тому же неточный и с лишними слогами. Добавил — обнаружил странный глюк: написанное в исходном тексте слово Christ в скомпилированном листе с нотами преобразовалось в Phrist. Заменил латинскую C на похожую кириллическую С — стало выглядеть как надо. Кто такой Фрист — не нашёл.