自作音楽言語Lismoがちょっと新しくなったので遊んでみて

typescript
Lismo

こんにちは。今回はLismoの機能追加についてです。 変更点に触れた後、Lismo2のインタプリタと使い方を紹介し、最後にサンプルコードをのせておきます。

注意

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

新しいLismoはコチラ

変更点

今回から自分でovtRate等を弄らなくても簡単に楽器みたいな音色が使える糖衣構文instが追加されました。 これは新しいmeta設定として使用でき、設定するとovtRate,ovtBaseIndex,adsrをそれっぽく設定してくれます。 (ただしクオリティは期待しないでください。) また、meta設定のdecayが廃止され、かわりにadsrが導入されました。 今までは用意された形から選ぶしかなかったですが、これで振幅の時間変化をある程度コントロールできます。 詳しくは 文法解説を御覧ください。

Interpriter

使い方

コードを黒いエディタ部分にコピペして、エディタの下のCompileボタンを押すだけです。 そうするとCompiledMusics以下にコンパイルされた音楽が新しい順に表示されます。 あとはプレイヤーの再生マークをクリックすれば再生されます。

また、プレイヤー下のリンクからダウンロードできます (プレイヤーを右クリックしてもダウンロードできますがブラウザによって若干異なります。)

文法については 文法解説を御覧ください。 文法解説は「ざっくり解説」と「詳しく解説」にわかれています。

本体

サンプルコード for ver2

君が代

kimigayo.lismo

[ 
    $right(inst:reed_organ) 
    $left(inst:reed_organ, oct:3)
]

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

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

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

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

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

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

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

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

Lemon

lemon.lismo

[ $main(tempo: 360, inst:glockenspiel, volume:0.5) ]

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;
}

きらきら星

kirakiraboshi.lismo

[
    $right(tempo:90, inst:horn)
    $left(tempo:45, inst:horn, volume:0.5, oct: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;]
}

あいうえお?

なんとなく人間がしゃべっているように聞こえる合成音声モドキもつくれます笑

aiueo.lismo

[ 
    //a
    $s1(ovtRate:[
        0.18245908864397134,
        0.44901874981264944,
        0.3906570312888306,
        1,
        0.3013238547712256,
        0.04739471713908576,
        0.021948970861846166,
        0,
        0,
        0,
        0,
        0.013414611507528564,
        0.01629169601505502
    ], oct:3) 

    //i
    $s2(ovtRate:[
        1,
        0.13506177657737153,
        0.34530792992327675,
        0.05495526869910172,
        0,
        0,
        0,
        0,
        0.02820819045255305,
        0.032832094083768415,
        0.028298619104760177,
        0.02834742484841182,
        0.03569143964284824,
        0.023063621872366914,
        0.020393657966646217,
        0.010314092814828629,
        0,
        0,
        0,
        0,
        0,
        0,
        0.010864904736314896,
        0.016544763812791335
    ], oct:3) 

    //u
    $s3(ovtRate:[
        1,
        0.3735118557762969,
        0.033716445526579666,
        0.06494248524383389,
        0.018253105187308154,
        0.06020085915631524,
        0.034174619179896844,
        0,
        0.016718658452081984,
        0.012295898933328284,
        0.030667530359074033,
        0.08678891596016515,
        0.017904699844521667,
        0.021226105989085267,
        0,
        0.010275356621977375,
        0,
        0,
        0,
        0,
        0,
        0.02695391844512529,
        0.013042400702882007,
        0.01168291547984886
    ], oct:3) 

    //e
    $s4(ovtRate:[
        0.2231376580995287,
        1,
        0.10157643066951016,
        0.06849384925006322,
        0.04549250732159946,
        0.02455853381708848,
        0.049699440061435875,
        0.05100202670732583,
        0.03402510255216882,
        0.02850425080911574,
        0.020040368406027968,
        0.012753873988916158
    ], oct:3) 

    //o
    $s5(ovtRate:[
        0.23187417242577457,
        1,
        0.17283853144079647,
        0.47617825123068813,
        0.16303146121911583,
        0.02190533048763821,
        0,
        0,
        0,
        0,
        0,
        0,
        0.01376972930946573,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0.010909710104368019
    ], oct:3) 
]

s1{休;ソ;}
s2{休;休;ソ;}
s3{休;休;休;ソ;}
s4{休;休;休;休;ソ;}
s5{休;休;休;休;休;ソ;}

おしまい

今回はこれでおしまいです。(2020/4/10)