もう少しエンベロープについて

あのcurveは、何者かって話ですね。

use v5.14;
use strict;
use warnings;

use Cassis;
use constant SAMPLING_RATE => 44100;

my $eg = Cassis::EG->new(
    fs => SAMPLING_RATE, # sampling-rate
    adsr => [
        3.0,     # Attack : time(sec)
        0.0,     # Decay  : time(sec)
        1.0,     # Sustain: gain
        3.0      # Release: time(sec)
    ],
    curve => 1.0 # default: 1.0 / exp(1.0)
);

my @pitch_table = (
    -9 / 12, # C
    -7 / 12, # D
    -5 / 12, # E
    -4 / 12, # F
    -2 / 12, # G
     0 / 12, # A
     2 / 12, # B
    (-9 / 12) + 1.0, # C(ここから1オクターブ上がる)
    (-7 / 12) + 1.0, # D
    (-5 / 12) + 1.0, # E
    (-4 / 12) + 1.0, # F
    (-2 / 12) + 1.0, # G
    ( 0 / 12) + 1.0, # A
    ( 2 / 12) + 1.0, # B
    (-9 / 12) + 2.0  # C(ここから2オクターブ上がる)
);

foreach my $curve ( 0.7, 1.0, 2.0 ) {
    $eg->set_curve( $curve );
    my $eg_out = $eg->one_shot( gatetime => 3.5 );

    my @steps = map {
        $pitch_table[int( $_ * (scalar(@pitch_table) - 1) )];
    } @{$eg_out};

    my $dco = Cassis::DCO::Tri->new( fs => SAMPLING_RATE, pitch => 4.0 );
    my $wav = $dco->exec(
        num => scalar(@steps),
        mod_pitch => {
            src => \@steps,
            depth => 1.0
        }
    );

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

なんとなく分かって頂ければ良いのですが・・・。

基本的に、デフォルト値のままで良い気がしてて、
でも、用途に応じてcurveもいじってみるのも良いかなーって思います。

おしまい。

Leave a Comment