いものやま。

雑多な知識の寄せ集め

楽譜作成ソフトLilyPondをインストールしてみた。

年初に書いた、今年やっていきたいことの一つの「作曲、音楽理論」の研究。

ぶっちゃけ、ラモーの音楽理論の「不協和音の二重用法」がホントに意味不明で、ずっと止まってたんだけど、ちょっとずつ再開しようかなと。

そのうえでブログを書くときに必要になってくるのが、楽譜の作成。
それと、実際の響きを確認するための、音の作成。

調べてみると、楽譜作成ソフトのLilyPondで、楽譜の作成はもちろん、MIDIへの出力も出来るということだった。

これはよさそうということで、インストールしてみた。

LilyPondってどんなソフト?

すごく簡単にいうと、楽譜向けの \TeX
テキストファイルにコマンドで音符などを書いていき、楽譜やMIDIを出力させる。

ちなみに、楽譜向けの \TeXのマクロパッケージとしては、MusiXTeXというのもあるみたい。

ただ、LilyPondはそれとは別物で、昔こそバックエンドで \TeXを使っていたものの、今は直接PostScript(やPDF、PNG)を出力するようになってるみたい。
けど、その名残か、書き方はかなり \TeXに近い。

例えば、以下のような特徴がある:

  • コマンドは\(バックスラッシュ)で始まる
  • コメントは%(パーセント)で始まる

LilyPondのファイルの一例を挙げると、以下のような感じ:

\version "2.18.2"

% メリーさんの羊(冒頭)
% merry.ly

\header {
  title = "メリーさんの羊"
}

\score {
  <<
    \relative c' {
      \tempo 4 = 120
      e4. d8 c4 d | e4 e e r |
      d d d r | e g g r |
    }
    \addlyrics {
      メ リ さん の ひ つ じ
      ひ つ じ             
      ひ つ じ             
    }
  >>
  \layout { }
  \midi { }
}

これをコマンドにかけてやると、以下のような出力が得られる:

f:id:yamaimo0625:20170816180225p:plain

さらに、MIDIファイルも出力される。

ダウンロード

まずはダウンロードから。

公式HPの「ダウンロード」からダウンロードできる。

自分はMacなので、Mac OS Xのページからx86向けのバイナリ(lilypond-2.18.2-1.darwin-x86.tar.bz2)をダウンロードした。

ダウンロードしたものを解凍すると、LilyPond.appが出来るので、それをアプリケーションのフォルダ(/Applications)にコピー。

あとは、コピーしたLilyPond.appを実行すれば、LilyPond(GUI)が立ち上がる。
(※たぶんセキュリティで一回ブロックされるので、「システム環境設定」の「セキュリティとプライバシー」から実行許可を与える必要があることに注意)

README的な文章を一緒に表示されるので、まずはその手順に従ってみるといいと思う。
最初の一歩という感じで、簡単な楽譜が作れるんで。

コマンドラインからの実行

さて、そんなわけで、GUIからも一応ファイルの作成〜タイプセットまで出来るようにはなっているものの、実際には使い慣れたエディタを使いたいわけで、コマンドラインから実行できるに越したことはない。

ということで、コマンドラインから実行(タイプセット)が出来るようにした。

LilyPondの各コマンドは、LilyPond.app/Contents/Resources/bin以下に置かれている。
ここに直接PATHを通してもいいんだけど、いろいろコマンドが置かれてるんで、ヘルパースクリプトを用意して~/binとかに置き、そこにPATHを通した方がいいみたい。

以下のヘルパースクリプト~/bin/lilypondとして用意:

#!/bin/bash
exec /Applications/LilyPond.app/Contents/Resources/bin/lilypond "$@" 

そして、実行権限をつける:

$ chmod 755 ~/bin/lilypond

あとは、~/binにPATHを通してあげればいい。
(自分の場合、すでに~/binにPATHを通していたんで、特に何もしなかった)

コマンドの構文は、以下のとおり:

$ lilypond [OPTION]... FILE...

主なオプションは、以下:

オプション 説明
-I<dir>,
--include=<dir>
<dir>を入力ファイルのサーチパスに追加する。
-o<file>,
--output=<file>
出力ファイル、もしくは、ディレクトリを指定する。
-l<level>,
--loglevel=<level>
コンソールの出力を設定する。
<level>は以下のいずれか:
  • NONE
  • ERROR
  • WARN
  • BASIC_PROGRESS
  • PROGRESS
  • INFO(デフォルト)
  • DEBUG
-f<format>,
--format=<format>
出力フォーマットを指定する。
<format>は以下のいずれか:
--ps PostScriptを出力。
--pdf PDFを出力。
--png PNGを出力。
-h,--help ヘルプを出力して終了。
-v,--version バージョンを出力して終了。
-V,--verbose 冗長出力する。

他にも、高度なオプションのための-dなどがあったりする。

パッチ

さて、これで問題なく動けばいいんだけど、自分の環境の場合、いくつか問題があったので、ローカルで修正を入れた。

まず、PNGを出力させようと--pngオプションを指定したら、次のようなエラーが出た:

Converting to PNG...dyld: Library not loaded: ./bin/../sobin/libgs.8.70.dylib
  Referenced from: /Applications/LilyPond.app/Contents/Resources/bin/../bin/gs
  Reason: image not found

調べてみると、PNGを出力させるのに内部的にGhostScript(コマンドはgs)を使っているっぽいのだけど、そのリンクすべき動的ライブラリのパスが間違っているっぽい。

$ cd /Applications/LilyPond.app/Contents/Resources/bin
$ otool -L gs  # リンクの確認
gs:
    ./bin/../sobin/libgs.8.70.dylib (compatibility version 0.0.0, current version 0.0.0)  # これが正しくない
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.1.2)

libgs.8.70.dylibは、LilyPond.app/Contents/Resources/lib/libgs.8.70.dylibにあるので、install_name_toolコマンドで以下のように修正:

$ install_name_tool -change ./bin/../sobin/libgs.8.70.dylib @executable_path/../lib/libgs.8.70.dylib gs

これでPNGの出力自体は出来るようになったんだけど、まだ以下のようなワーニングが出ていた:

Converting to PNG...
*** Warning: GenericResourceDir doesn't point to a valid resource directory.
               the -sGenericResourceDir=... option can be used to set this.

これは、GhostScriptのGenericResourceDirの設定が正しくないっぽい。

GenericResourceDirの設定は、LilyPond.app/Contents/Resources/share/ghostscript/8.70/Resource/Init/gs_res.psに書かれていたので、以下のように修正:

-   /GenericResourceDir () .resource_dir_name
+   /GenericResourceDir (/Applications/LilyPond.app/Contents/Resources/share/ghostscript/8.70/Resource/) .resource_dir_name

これでワーニングも出ないようになった。

Vimの設定

さらに、vimのLilyPond用の設定が用意されていたので、それも設定した。

~/.vimrcに、以下を追加:

filetype off
set runtimepath+=/Applications/LilyPond.app/Contents/Resources/share/lilypond/current/vim/
filetype on

これでLilyPondのファイルタイプが認識され、インデントや構文ハイライトが使えるようになった。

画像出力

ちなみに、そのまま出力すると、A4で出力されることになる。
それだと、ちょっとした画像を貼りたいときには、不便。

そんな場合には、以下のようにすればいいみたい:

まず、余計な余白を出さない設定を追加する:

\paper {
  indent=0\mm
  line-width=120\mm
  oddFooterMarkup=##f
  oddHeaderMarkup=##f
  bookTitleMarkup = ##f
  scoreTitleMarkup = ##f
}

そして、コマンドラインで以下のように高度なオプションを指定すればいい:

# PNG
$ lilypond -dbackend=eps -dno-gs-load-fonts -dinclude-eps-fonts --png (ファイル名)

# 透過PNG
$ lilypond -dbackend=eps -dno-gs-load-fonts -dinclude-eps-fonts -dpixmap-format=pngalpha --png (ファイル名)

これで出力すると、以下のようになる:

f:id:yamaimo0625:20170816194706p:plain

余白がなくて、いい感じ。

今日はここまで!