音程を変更してみる

前回、ちょっと触れた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