100番煎じの音楽記述言語で音楽を作成・演奏しよう

javascript
自作言語
Lismo

こんにちは。今回の内容は、音楽記述言語Lismoについてです。 Lismoは非常に単純な自作音楽記述言語で、 これを使用することでテキストベースで音楽を記述し、ブラウザで演奏することができます。 (前回もですが、割と新しいバージョンのブラウザしか対応していないので動かない場合はアップデートが必要かもしれません。) まず本体とサンプルコード、それから文法(今回は少ないので詳細つき)をおいておきます。 ”ドレミ...”と書いていくだけで音が鳴らせるのでぜひ遊んでいってください。

注意

このページで紹介されているのは古いバージョンのLismoです。

新しいLismoはコチラ

Interpriter

SampleCode

Hello,World

まずはあの挨拶のやつ

code

[ $hello_world ]

hello_world{ 休; [ド;ミ;ソ;ド>2;] [レ;ファ;ソ;シ2;] [ド;ミ;ソ;ド>5;] }

きらきら星

両手でメタ設定あり

code

[
    $right(tempo:90, oct:5, decay:lin)
    $left(tempo:45, decay:lin, volume:0.3)
]

right{
    $r1 $r2 $r3 $r3 $r1 $r2
}
r1{
    C; C; G; G; A; A; G2;
}
r2{
    F; F; E; E; D; D; C2;
}
r3{
    G; G; F; F; E; E; D2;
}

left{
    $l1 $l2 $l3 $l3 $l1 $l2
}
l1{
    [C; E; G;] [C; E; G;] [C; F; A;] [C; E; G;]
}
l2{
    [B<; D; G;] [C; E; G;] [B<; D; G;] [C; E; G;]
}
l3{
    [C; E; G;] [B<; D; G;] [C; E; G;] [B<; D; G;]
}

君が代

ovtrateをいじっている例

code

[ 
    $right(ovtrate:[5,1,2], oct:3, decay:lin) 
    $left(ovtrate:[5,1,2], oct:2, decay:lin, volume:0.3)
]

right{
    //君が代は
    レ; ド; レ; ミ; ソ; ミ; レ2;

    //千代に八千代に
    ミ; ソ; ラ; ソ0.5; ラ0.5; レ>; シ; ラ; ソ;

    //さざれ石の
    ミ; ソ; ラ2; [ファ;レ>;] [ミ;ド>;] [ファ;レ>2;]

    //巌となりて
    ミ; ソ; ラ; ソ; ミ1.5; ソ0.5; レ2;
    
    //苔のむすまで
    [ファ;ラ;] [ファ;ラ;ド>;] [ファ;ラ;レ>2;] ド>; レ>; ラ; ソ; ラ; ソ0.5; ミ0.5; レ2;
}

left{
    //君が代は
    レ; ド; レ; ミ; ソ; ミ; レ2;

    //千代に八千代に
    ド; ミ; ファ; ミ0.5; ファ0.5; ファ+; ソ; レ0.5; レ0.5; ミ;

    //さざれ石の
    ド; ミ; ファ2; レ; ラ<; レ2;

    //巌となりて
    ド; ミ; ファ; ミ; ド; ミ; ソ<; ソ;
    
    //苔のむすまで
    ファ; ファ; ファ2; ラ<; レ; ラ; ソ; ラ; ソ0.5; ミ0.5; レ2;
}

Lemon

わかりにくいけどブロック内で別のブロックを呼んだり

code

[ $main(tempo: 360, volume:0.5, decay:exp) ]

main{
    $sub1 $sub2 $sub1 $sub3 休6; $sub1 $sub2 $sub1 $sub3
    $sub4 $sub5 $sub5 $sub6 $sub5 $sub7 $sub9 $sub10
}

sub1{
    シ; ド>+; レ>+2; シ; ソ+3; 
    ド>+2; ラ+2; ファ+; レ+3;
    ラ+2; ソ+2; ファ+; シ<3; ファ+2; レ+4; 休2;
}

sub2{
    ド+; レ+; ミ4; シ2; ラ+; シ; ファ+4; ミ2; レ+; ミ; ファ3;
    ファ; シ2; ラ+; ソ+; ソ4; 休2;
}

sub3{
    ド+; レ+; ミ4; ファ+2; ミ; ファ+; レ+2; ファ+2; シ2; レ>+2;
    ド>+3; ド>+; ド>+; シ2; シ; シ8;
}

sub4{
    ソ+2; 休; ラ+; シ2; ラ+; ソ+; ファ+2; レ>+2; レ>+4;
    ド>+3; レ>+; ミ>2; レ>+; ド>+; シ2; ド>+2; ファ+4;
    ミ3; ファ+; ソ+2; ファ+; ミ; レ+2; シ2; シ2; シ2; ラ+4; ソ+2; ラ+2; シ4;
}

sub5{
    ド>+; レ>+; ド>+; シ; ソ+; シ3; レ>+; ファ>+3; ド>+; シ3;
}

sub6{
    ド>+; レ>+; ド>+; シ; ソ+; シ3; レ>+; ファ>+2; ファ>+; ソ>+; ファ>+3;
    ファ>+; シ>3; ラ>+; ファ>+3; レ>+; ファ>+2; ド>+; ド>+4;
}

sub7{
    シ; ド>+; レ>+; ミ>; レ>+3; ド>+; ラ+3; シ4; 休2;
}

sub8{
    シ; ラ+; ソ+2; ラ+2; シ2; ド>+2; シ2; ファ+2;
}

sub9{
    $sub8 レ+; ファ+3; ソ+; ド>+3; ラ+; シ3; シ4; 休2;
}

sub10{
    $sub8 シ; ド>+3; レ>+; ミ>3; ド>+; シ3; シ4; 休4;
}

文法

lismoの最上位はひとつのエントリーと複数の名前付きブロックからなります。

エントリー

[$block1 $block2 $block3]のような形式で名前付きブロックを列挙します。 ここに列挙されたブロックが同時に再生されて曲になります。 例えば[$right $left]のように右手と左手の演奏を指定したり、楽器ごとにパートを分けたりします。

さらにエントリーでは以下のように丸括弧を付けて演奏時のスピードなどを指定するメタ設定を行うことができます。

[ $block1(tempo:90, decay:lin) ]

省略した場合は既定値が使用されます(メタ設定の段落で説明します)。

同時演奏を示す[ ]をブロックに対して使用できるのはエントリーのみです。通常は音符に対して用います。 また、エントリーは一つしか存在してはいけません。複数記述した場合は最後のもの以外無視されます。

名前付きブロック

名前つきブロックは名前{ }の形式で中括弧の中に1個以上の音符または名前つきブロック呼び出しを持ちます。名前には英小文字と`_`が使用できます。

名前つきブロック呼び出しとは、$ブロック名の形式で他の名前つきブロックを呼び出すことです。 エントリーと異なり、通常のブロック呼び出しではメタ設定や同時演奏はできません。

音符は後述する単一の音符です。 音符を[ ]の中に並べることで同時演奏できます。長さは一番長いものに合わせられます。

音符

音符は一つの音符です。基本は`音階;`の形式で記述し、必要に応じて音階と`;`の間に記号を挟むことでオクターブ上下や半音上げ下げ、長さの指定などができます。 例えば追加指定なしのドなら`ド;`や`C;`とかけますし、オクターブ上のド♯なら`ド+>;` `C+>;` `C > + ;`などの書き方ができます。(記号の意味は後述)

音階

音階は2パターンの記述法(カタカナorアルファベト大文字)があり、以下の=で結ばれた記号は同じ意味になります。(休は休符です)

ド=C レ=D ミ=E ファ=F ソ=G ラ=A シ=B 休=R

オクターブ上下

オクターブ上下では>一つにつき1オクターブ高く、<では低くします。例えば`C;`がC4の音と解釈される既定の状況で`C>>;`はC6の音になります。最終結果の範囲は0~9です。

半音上下

シャープまたはフラットはそれぞれ`+`、`-`の記号で記述し、半音上げ下げできます。

長さ

長さは数値で相対的な長さを指定します。範囲は0.1~10です。省略した場合は1になります。 1の長さはメタ設定のtempoで指定できます。長さ1の音符は一分間にtempo回再生されます。

メタ設定

メタ設定では曲の再生に関する属性を設定することができます。これはエントリー内の名前付きブロック呼び出しでのみ指定できます。各属性またはメタ設定全体を省略すると既定値が使用されます。

既定値
code
(tempo:60, decay:smooth2, oct:4, ovtrate:[1], volume:1 )
各属性について

tempo: 再生速度に関係します。長さ1の音符を1分間に何回再生できる速さかを意味します。

decay: 各音符の音を減衰させる関数を選ぶことができます。

  • none: 減衰なし
  • little: 少ししか減衰させない
  • exp: 指数関数
  • lin: 線形
  • smooth: 滑らかな左に偏った山なりの関数
  • smooth2: smoothの係数ちがいで、より急に大きくなる。

oct: ブロック全体の音の高さに関わります。既定(4)のままなら`A`は`A4`の音と解釈されます。範囲は0~9です。

ovtrate: 音色に関わります。倍音の割合を[6,3,1]のような形式で指定します。

volume: 音量を(0,1]の数値で調整します。 (0にすると1になります。鳴らしたくない場合はエントリーから外してください。)

その他

`//`以降は改行までコメントアウトになります。

おしまい

今回はこれでおしまいです。 ちなみに、もっと本格的なやつもいろいろあるようです。

テキスト音楽「サクラ」

MML

Sonic-pi.net