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

前回に引き続き、違う方法を思いついたので試してみた。

use v5.14;
use strict;
use warnings;

use Cassis;
use constant SAMPLING_RATE => 44100;

my $dco = Cassis::DCO::Tri->new( fs => SAMPLING_RATE );
my $eg = Cassis::EG->new(
    fs      => SAMPLING_RATE,
    adsr    => [ 0.9, 0.0, 1.0, 0.01 ],
    curve   => 1.3
);

foreach my $pitch ( 2.0, 2.5, 3.0 ) {
    my $eg_out = $eg->one_shot( gatetime => 1.0 );

    my @wav = ();
    my $n = scalar(@{$eg_out});
    my $step = 3000;
    while ( scalar(@wav) < $n ) {
        my $tmp = (scalar(@wav) / $n) ** 1.4;
        $dco->set_pitch( $pitch + ($tmp * 1.8) );
        my $dco_out = $dco->exec(
            num => $n < (scalar(@wav) + $step) ? ($n - scalar(@wav)) : $step
        );
        push @wav, @{$dco_out};
    }

    my $amp = Cassis::Amp->new();
    my $amp_out = $amp->exec(
        src => \@wav,
        mod_volume => {
            src => $eg_out,
            depth => 1.0
        }
    );

    Cassis::File::write(
        file => sprintf( 'bubububububu_%.1f.wav', $pitch ),
        fs => SAMPLING_RATE, channels => [ $amp_out ] );
}

今回は、階段状に音程を上げていく方法で、
ファミコンとかでありがちな感じに仕上がってると思う。

こうやって使ってみると、いろいろ不満が出てきたので、
少しissueを投げて、改修してみようと思う。

おしまい。

Leave a Comment