エンベロープを使ってみる

EGとは、Envelope Generatorのことですね。
これに該当するのはCassis::EGです。

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 => [
        1.0,     # Attack : time(sec)
        1.0,     # Decay  : time(sec)
        0.5,     # Sustain: gain
        1.0      # Release: time(sec)
    ],
    curve => 1.0 # default: 1.0 / exp(1.0)
);

my $dco = Cassis::DCO::Sin->new( fs => SAMPLING_RATE, pitch => 4.0 );

foreach my $gatetime ( 0.5, 1.0, 2.0, 3.0, 4.0 ) {
    my $eg_out = $eg->one_shot( gatetime => $gatetime );
    my $wav = $dco->exec(
        num => scalar(@{$eg_out}),
        mod_pitch => {
            src => $eg_out,
            depth => 1.0
        }
    );

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

エンベロープはADSRを採用しました。
やっぱ、ADSRでしょ!みたいのをずっと思ってたので、
これはこれで良かったのですが、実はcurveの値が肝でして、
線形補間だと微妙だったので非線形にもできるようにしました。

ほんとは音量に対してエンベロープを適用したかったんだけど、
それは次回のお楽しみということで。

pitchを変化させる場合は、こんな感じに書くことが出来ます。

おしまい。

Leave a Comment