パワーを貯める時の音を作る(1)

今、作ってるゲームのドックフーディングがてら、
実践編ということで、パワーを貯める時の音を作ってみます。

use v5.14;
use strict;
use warnings;

use Cassis;
use constant SAMPLING_RATE => 44100;

my $osc = Cassis::Osc::Tri->new( fs => SAMPLING_RATE, freq => 120 );
my $filter = Cassis::Iir2::LPF->new( cutoff => 0.2, q => 1.0 );

my $eg1 = Cassis::EG->new(
    fs      => SAMPLING_RATE,
    adsr    => [ 0.8, 0.0, 1.0, 0.01 ],
    curve   => 1.3
);

my $eg2 = Cassis::EG->new(
    fs      => SAMPLING_RATE,
    adsr    => [ 1.0, 0.0, 1.0, 0.01 ],
    curve   => 1.0
);

foreach my $freq ( 120, 140, 160 ) {
    $osc->set_freq( $freq );

    my $eg_out1 = $eg1->one_shot( gatetime => 0.8 );

    $eg2->trigger( gatetime => 0.8 );
    my $eg_out2 = $eg2->exec( num => scalar(@{$eg_out1}) );

    my $osc_out = $osc->exec(
        num => scalar(@{$eg_out1}),
        mod_freq => {
            src => $eg_out2,
            depth => 0.8
        }
    );

    my $amp = Cassis::Amp->new();
    my $amp_out = $amp->exec(
        src => $filter->exec(
            src => $osc_out,
            mod_cutoff => {
                src => $eg_out2,
                depth => 0.2
            }
        ),
        mod_volume => {
            src => $eg_out1,
            depth => 1.0
        }
    );

    Cassis::File::write(
        file => sprintf( 'boooooon_%d.wav', $freq ),
        fs => SAMPLING_RATE, channels => [ $amp_out ] );
}

音量と音程に変化を付ければなんとかなると思ったら、
案の定、だいたいうまくいきました。
でも、せっかくフィルターもあるので、
少しずつフィルターを開いてみました。

Cassisを使うメリットは、
こんな感じで簡単にバリエーションを増やせて、
しかも、カットする必要がないところですね。

他にも作り方はあると思いますが、今日のところはこんな感じで。

おしまい。

Leave a Comment