エンベロープを使ってみる
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