シンタックスシュガー
シンタックスシュガー(糖衣構文)というのは、もともとはKnuthが、摂取しすぎると人間が糖分を摂取しすぎた時のごとくに言語仕様が肥大するというダブルミーニングをこめて名付けたものなのだが、それを知る人は少ない。
とかってもっともらしい通俗知識(でまかせ)をWikipediaに書いて独り歩きをし始めたら面白いな。
さて、前回symfonion
の記事を書いていて、随分昔に作ったシンタックスシュガーのことを思い出した。
ちなみに、MacOSX用のインストール手順はこちら、UbuntuやFedoraの場合のインストール手順はこちらを見て欲しい。Windows用の手順も近々用意する。申し訳ないが少々お待ちいただきたい。
前回のポストで、
"$body":[ {"$notes":"Db>++", "$length":"4"}, {"$notes":"", "$length":"4"}, {"$notes":"", "$length":"8"}, {"$notes":"BbDb>", "$length":"8"}, {"$notes":"DbGb>", "$length":"8"}, {"$notes":"GbDb>", "$length":"8"}, {"$notes":"DbAb>+", "$length":"1"} ],
とある部分、これがまさに「音符」に当たる部分なのだが、たとえば「高いレフラットの四分音符」を表現するためだけに
{"$notes":"Db>++", "$length":"4"},
こんなにたくさんタイプしたくない。 実はこの部分、以下のように省略して書ける。
"Db>++4",
このテクニックを使うと、上の"$body"はこう書き直せる。
"$body":[ "Db>++4", "r8", "r8", "BbDb>8", "DbGb>8", "GbDb>8", "DbAb>+1", ],
だいぶ、すっきりしてきた。
このカンマ(',')で区切られた各文字列は、symfonion
ではStroke
(ストローク)と呼ばれる単位だ。手を一回動かしていっぺんになる音のあつまり、ぐらいの意味だと思って欲しい。
(以下の機能がバージョン、0.9.1で使えるようになりました。)
さて、このストロークをひとつの文字列の中に書くこともできる。 その場合、';'(セミコロン)を使えばいい。
"$body":[ "Db>++4;r8;r8;BbDb>8;DbGb>8;GbDb>8;DbAb>+1" ],
こうやって、一行にすることができる。 しかし、この配列には一個の要素しか無い。ならば配列である必要もない。 そこで、
"$body":"Db>++4;r8;r8;BbDb>8;DbGb>8;GbDb>8;DbAb>+1",
このように書き改めることもできる。
この辺の規則については形式的にまとめることもできるのだが、少々複雑なので、別の場所で論じることにしたい。
ともかく、以上をまとめると冒頭に掲げたsymfonion
ソースは以下のようにも書ける。
{ "$settings":{ }, "$parts":{ "piano":{"$channel":0, "$volume":120 } }, "$patterns":{ "acoustic":{ "$body":"Db>++4;r4;r8;BbDb>8;DbGb>8;GbDb>8;DbAb>+1", "$velocitybase":120 } }, "$sequence":[ { "$beats":"8/4", "$patterns":{ "piano":["acoustic"] } } ] }
ちなみにこの音符部分、
"Db>++4;r4;r8;BbDb>8;DbGb>8;GbDb>8;DbAb>+1",
これを見て「懐かしさ」を感じた人のためにsymfonion
は設計されたと言っても過言ではない。かも知れない。
あるCPUメーカーのサウンドロゴ。
インテル(TM)、入ってる♪
今では音響商標というものが登録できるそうで、EUでは以下の楽譜がインテルの商標として登録されているそうだ。(欧州共同体商標登録第4610986号)
さて、これのacoustic
のパートをsymfonionで表現してみよう。ファイル名はintel.jsとでもつけて欲しい。
{ "$settings":{ }, "$parts":{ "piano":{"$channel":0, "$volume":120 } }, "$patterns":{ "acoustic":{ "$body":[ {"$notes":"Db>++", "$length":"4"}, {"$notes":"", "$length":"4"}, {"$notes":"", "$length":"8"}, {"$notes":"BbDb>", "$length":"8"}, {"$notes":"DbGb>", "$length":"8"}, {"$notes":"GbDb>", "$length":"8"}, {"$notes":"DbAb>+", "$length":"1"} ], "$velocitybase":120 } }, "$sequence":[ { "$beats":"8/4", "$patterns":{ "piano":["acoustic"] } } ] }
演奏は例によって以下の感じ。
$ symfonion intel.js
今回少しだけ気をつけて欲しいのは、$sequence
の下にある$beats
の部分。値が8/4
となっている。
$sequence
は、配列内の要素を順々に演奏していくためのキーワードだが、各要素の長さがそれぞれ何拍子分演奏されるかは$beats
で指定されるのだ。ここには8/4
と書かれているので、四分音符が8個分演奏されることになる。4/4
とかって書いてしまうと、演奏されるべき楽譜が2小節分(=四分音符が8個分)あるので、途中で切れてしまうのだ。
Installing symfonion on MacOSX
Symfonion is a JSON based language to create music works. It takes a JSON file as input and outputs a midi file or plays it on the fly.
Today, I installed it on my Macbook Air and would like to share the steps.
1. Install Java
Download Java from here And follow the steps described here if you don't have it yet.
2. Install symfonion binary
Download symfonion binary from here
Place it under /opt/local/bin
.
$ sudo mv symfonion-0.8.10.jar /opt/local/bin/
3. Create a shell to run symfonion
Create a file named /opt/local/bin/symfonion
.
#!/bin/bash java -jar /opt/local/bin/symfonion-0.8.10.jar $@
And change the permission to 755
.
$ sudo chmod 755 /opt/local/bin/symfonion
4. Done!
If you have installed symfonion
successfully, you will see the output below when you type symfonion
from a shell.
nikephoros:Music hiroshi$ symfonion usage: SYNTAX -c,--compile <arg> compile the specified file to a standard midi file. -h,--help print the command line usage. -I <arg> specify midi in port. -l,--list list the available midi devices. -o <arg> specify a file to which a compiled standard midi file is output. -O <arg> specify midi out port. -p,--play <arg> play the specifiled file. -r,--route run a midi patch bay. -V,--version print the version information. nikephoros:Music hiroshi$
デデーン!
去年の暮れの「笑ってはいけない」には涙がでるほど笑い転げたのだが、最近、こんなものを見つけた。
さて、せっかく作曲用の言語symfonion
なんてものを作っているのだから、このサウンドロゴ?をそれで再現してみようと思った。
ちなみに、symfonion
のインストール手順は、Linux系のOSを使っているならREADME.mdを見れば分かると思う。
.debファイルも作っておいたので、Ubuntuなどdebian系のOSを使っている人なら簡単だと思う。FedoraとかWindowsを使っているひとは、ちょっとだけ面倒だけど、自分でshellかbatを作ってほしい。ごめんなさい。
MacOSXならば英語だがここに。日本語版が欲しい人がいたら言って欲しい。
インストールが終わったら以下の内容のファイルをdede-n.js
というファイル名で作って見よう。
{ "$settings":{ }, "$parts":{ "piano":{"$channel":0, "$volume":120 } }, "$patterns":{ "right":{ "$body":[ {"$notes":"FGbAC>F>", "$length":"8"}, {"$notes":"EFG#B#E>", "$length":"1"} ], "$velocitybase":120 }, "left":{ "$body":[ {"$notes":"Gb<<Gb<<<", "$length":"8"}, {"$notes":"F<<F<<<", "$length":"1"} ], "$velocitybase":120 } }, "$sequence":[ { "$beats":"4/4", "$patterns":{ "piano":["right", "left"] } } ] }
さて、このファイルをsymfonion
を使って演奏してみよう。
nikephoros:Music hiroshi$ symfonion dede-n.js Now compiling... bar:<0> part:<piano>[.....|.....|][..|..|] Compilation finished. Start playing on null(1392828003193) Finished playing. nikephoros:Music hiroshi$
デデーン。
ちなみに、-c
オプションを付けると、演奏する代わりに.midiファイル(スタンダードMIDIファイル)を作る。出力先のファイル名は-o
で指定できるが、省略するとa.midi
ファイルに出力される。
つまり、こうすると
$ symfonion -c dede-n.js -o dede-n.midi
dede-n.midi
ファイルに、デデーン。が出力される。ダブルクリックとかして試してほしい。