音程を変更してみる
前回、ちょっと触れた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