音程を変更してみる
前回、ちょっと触れたpitchについて。
use v5.14;
use strict;
use warnings;
use Cassis;
use constant SAMPLING_RATE => 44100;
my %NOTE_TO_PITCH = (
C => -9 / 12,
D => -7 / 12,
E => -5 / 12,
F => -4 / 12,
G => -2 / 12,
A => 0 / 12,
B => 2 / 12
);
my $dco = Cassis::DCO::Sin->new( fs => SAMPLING_RATE );
my @wav = ();
foreach ( qw(C4 D4 E4 F4 G4 A4 B4 C5) ) {
if ( my ( $note, $octave ) = m/([\w])(-?\d)/i ) {
my $new_pitch = $octave + $NOTE_TO_PITCH{$note};
say "pitch: $new_pitch";
$dco->set_pitch( $new_pitch );
my $tmp = $dco->exec( num => SAMPLING_RATE * 0.5 );
push @wav, @{$tmp};
}
else {
warn 'cannot parse => ', $_;
}
}
Cassis::File::write(
file => 'abc.wav',
fs => SAMPLING_RATE, channels => [ \@wav ] );
音階を示すありがちな文字列をパースして、
それをset_pitchで設定してるんだけど、
見ての通り、周波数を計算する必要はない。
これは、後々、音程を揺らすような処理をする際に、
±1オクターブでモジュレーションとか、そういうのに使える。
あと、オリジナルのアルペジェレーターみたいのも、
これを使うと簡単にできる(はず)。
ちなみに、Cassis::Oscは周波数でしか設定できなくて、
±1オクターブみないなモジュレーションもできない。
(もちろん、特殊な波形を入力すれば別だけど。)
という訳で、今日はここまで!
おしまい。
Leave a Comment