2024年05月05日

LilyPond いろいろ

 久しぶりに LilyPond を引っ張り出して、昔の自作曲の清書をしています。久しぶりに使うと、いろいろ問題が発生します。

1. Point and Click が効かない

 以前 Emacs で ly ファイルを編集していた時、"Point-and-Click" を実装しました。スコアの PDF に埋め込まれた textedit://... というリンクをクリックすると、対応するエディタが開く、という便利なものです。その後、mi での編集に移行しました。拙作 "LilyRunner" で、"Script to respond to click on PDF" のボックスに下のように記述します。

#!/bin/sh
# $1 = file, $2 = line, $3 = column
/usr/bin/osascript <<EOF
tell application "mi"
  open ("$1" as POSIX file)
  activate
  tell paragraph $2 of document 1 to select character $3
end tell
EOF

 これで mi で Lilypond ファイルを編集して、たいへん快適に使っていたはずなのですが、今回久しぶりに引っ張り出すと、クリックで mi を立ち上げる機能が効かない。わりと直近に編集してたはずだけど、どうやってたんだっけ? いろいろ試行錯誤して、PDF をプレビュー.app ではなくて Safari で開けばよい、ということを思い出しました。

20240505-1.jpg

2. 違うバージョンの LilyPond って共存できるんか?

 ずっと LilyPond 2.12.3 という超古いバージョンを使っていたのですが、最近のバージョンと共存できるんかな? 実は、2.12.3 は MIDI 出力の時にアーティキュレーション(スタッカートなど)をサポートしてない、という問題点があって、その時だけでも新しいバージョンを使いたいな、と思っていたのです。

 最新の 2.24 は 10.14 Mojave では動かないため、2.22 をダウンロードして、試してみました。LilyRunner で 2.22 のアプリケーションパッケージを指定すると、ちゃんと動いた! 微妙に縦方向のスペーシングが違うのがおわかりでしょうか。

20240505-2.jpg

 これで、「ガチガチに 2.12 で最適化した既存のコード」は 2.12 で、新しく書くコードは 2.22 で、と使い分けることができるようになりました。

3. Scheme コードの修正

 LilyPond 2.22 を使うと、2.12 で作成した ly ファイルは修正なしでもおおむね解釈してくれます(出力結果のレイアウトはかなり変わる)。しかし、Scheme コードでカスタマイズしていると、ちょっと厄介です。例えば、「スラーを調整する」というテクニックで、下のコードを使うのですが、これが 2.22 で動かない。

shapeSlur =
  #(define-music-function (parser location offsets) (list?)
    #{ \once \override Slur #'control-points = #(alter-curve $offsets) #})

#(define ((alter-curve offsets) grob)
   (let ((coords (ly:slur::calc-control-points grob)))
     (define (add-offsets coords offsets)
       (if (null? coords)
       '()
       (cons
     (cons (+ (caar coords) (car offsets))
           (+ (cdar coords) (cadr offsets)))
     (add-offsets (cdr coords) (cddr offsets)))))
     (add-offsets coords offsets)))

 これの修正は簡単で、$offsetoffset と書き直せばよいのですが、できれば 2.12 でも 2.22 でもコンパイルできるようにしておきたい。ちょっと試行錯誤しました。

  • LilyPond のマニュアル Usage の 2.6 に "Writing code to support multiple versions" という記述があります。ly:version? という関数を使えばよい、とあるのですが、その下に "This function has been introduced in LilyPond 2.21.80" と書いてあります。つまり、2.12 では使えない!
  • Internals Reference の 4. Scheme functions を探してみると、ly:version というのがあります。"Return the current lilypond version as a list, e.g., (1 3 127 uu1)." ということなので、これを使えばよさそう。この関数は 2.12 にもあります。
  • コンパイル中にメッセージを出して、いろいろ試してみたい。ly:message というのがあるのですが、説明が "A Scheme callable function to issue the message str. The message is formatted with format and rest." とあるだけで、なんだかよくわかりません。
  • LilyPond のアプリケーションパッケージの中を探索します。ly:message で grep したら何か手がかりが見つからんかな? いろいろ出てきました。
    $ cd /Applications/LilyPond.app/Contents/Resources/share
    $ grep ly:message `find . -name '*.scm'`
    ./lilypond/current/scm/documentation-lib.scm:  (ly:message (_ "Processing ~S...") name))
    ./lilypond/current/scm/documentation-lib.scm:  (ly:message (_ "Writing ~S...") x))
    ./lilypond/current/scm/stencil.scm:	  (ly:message "Writing ~a" outname)
    ./lilypond/current/scm/layout-page-dump.scm:    (ly:message "Writing page layout to ~a" name)
    ...
    
    試しに入力ファイルに #(ly:message "ly:version is ~a" (ly:version)) と書いてみると、LilyPond の出力に "ly:version is (2 22 2)" と表示されました。これでよさそうです。

 いろいろお試しコードを書いて試してみた結果、下のようになりました。これで、2.12 と 2.22 のどちらでも通ります。"2022" のところは、本来は文法が変更されたバージョンを特定して書くべきですが、手元には 2.12 と 2.22 しかないので、「2.22 以上」と指定しておけば事足ります。

shapeSlur =
  #(define-music-function (parser location offsets) (list?)
    (if (>= (+ (* (car (ly:version)) 1000) (cadr (ly:version))) 2022)
      #{ \once \override Slur #'control-points = #(alter-curve offsets) #}
      #{ \once \override Slur #'control-points = #(alter-curve $offsets) #}))
タグ:Mac 音楽
Posted at 2024年05月05日 21:24:48

2024年05月03日

ミニトマト植え付け・シマトネリコ剪定

 ミニトマトをプランターに植え付けしました。少し斜めに植えているのは意図的です。

20240503-2.jpg

 こちらのプランターは寄せ植えします。ミニトマトの横にチャイブを植えているのですが、全く存在感がありません。ネギ属の栽培はいまいち苦手です。みんな「簡単だ」と言うんだけど、いつまでも細いままで、ちっとも大きくならないことが多いんですよね。何がいけないのかな。

20240503-1.jpg

 シマトネリコの剪定もやりました。これが剪定前。

20240503-3.jpg

 剪定後です。すっきりしました。左側はお隣にはみ出してしまうので、少し強く刈り込んでいます。

20240503-4.jpg

 剪定クズは、いつもは根元に集めてそのまま放置しているのですが、今回は積極的に堆肥化をやってみようと思います。5〜10センチぐらいに切って、集めます。

20240503-5.jpg

 自然応用科学の「まくだけで蘇る」を混ぜます。剪定クズに比べて量がいかにも少ないのですが、微生物が増えてくれればなんとかなるんじゃない?とアバウトにいきます。

20240503-6.jpg

 少し水をかけて、あとは放置プレイです。ここには粘土質の土を入れてないので、プランターにも使えるんじゃないか?という算段です。いろいろ実験してみるのが楽しいですね。

タグ:園芸
Posted at 2024年05月03日 23:37:16

2024年05月01日

「銃・病原菌・鉄」(ジャレド・ダイヤモンド著、倉骨 彰訳、草思社文庫)

 現代社会の「地域格差」の源を、先史時代に遡って解き明かそうとした大著です。なんて、今さら紹介するにも及びませんね。大ベストセラーになった本ですからね。

 プロローグとして、ニューギニアの聡明な政治家であるネリ氏が、生物の調査で訪れていた著者に対して発した疑問が紹介されています。「ニューギニアにやってきた白人は多くのものを持っている。我々ニューギニア人は、自分のものと呼べるものをほとんど持っていない。この違いはどこから来ているのか?」この根源的な問いに対して、筆者は「作物の栽培を始めたこと」と「家畜を飼い馴らしたこと」を2つの柱にして論を進めていきます。

 作物の栽培を始めたことで、人口が増加し、余剰食料を保管することができるようになる。家畜を飼い馴らしたことで、動物性タンパク質源を確保すると同時に、家畜の労働力によってより広い範囲を農地に変えることができ、より多くの人口を養うことができる。人口が多くなり、余剰食料の生産・保管ができるようになると、それを管理するための統治システムができ、情報を記録するための文字ができる。社会が複雑になり、余剰の富が蓄積するにつれて、職人や技術者などの専門職や、戦いに特化した軍人、統治システムを正当化するための宗教家などを擁することができるようになる。このようにして力をつけた社会は、周りの人間集団を侵略して勝利し、勢力を広げていく。

 さらに、家畜と共に暮らすことで、その社会は動物由来の病原菌にさらされ、やがて免疫を獲得する。そうすると、その社会が侵略者となったときに、被侵略者はそれまでに出会わなかった病原菌をも敵に回すことになる。歴史上、被侵略者が病気の蔓延で大打撃を受けた例が多くある。

 本書で特に興味深いのは、「作物の栽培」「動物の家畜化」について、大陸ごとに非常に異なる自然的要因があった、とする点です。作物の栽培については、栽培に適した野生種がどの大陸のどこに分布していたか。また、大陸が広がる方向(ユーラシア大陸は東西、アフリカと両アメリカ大陸は南北に広がる)によって、栽培種の広がる速度が大きく異なること。家畜化については、それに適した大型動物が、どの大陸のどこに分布していたか。一見似た動物種であっても、家畜化に適したものと適さないものがあること。つまり、ユーラシア大陸の人間が世界を席巻するようになったのは、ユーラシア大陸の自然環境によるところが大きいこと。ものすごく大きな意味で「実家が太かった」ということになるんですかねえ。なんだか切ない結論ですが。

 以上はめちゃめちゃ雑なまとめで、本書は実に大部な本です。なんか、こういう超分厚い本を一人で書き切ってしまうエネルギーに、まず感嘆してしまいます。

タグ:読書
Posted at 2024年05月01日 21:30:43
email.png