Audio::PortAudio(実践編2)
たぶん、予想通りだと思うんだけど、
それだとつまらないので、cutoff
を変化させる波形を複雑にしてみた。
use strict; use warnings; use Cassis; use Audio::PortAudio; use constant SAMPLING_RATE => 44100; use constant INT16_MAX => 0x7FFF; play(); sub play { my ( $frames_per_buffer, $stream_flags ) = ( 512, undef ); my $api = Audio::PortAudio::default_host_api(); printf STDERR "Going to play via %s\nCtrl+c to stop...", $api->name; my $device = $api->default_output_device; my $stream = $device->open_write_stream( { channel_count => 1, # 1:mono, 2:stereo sample_format => 'int16' # 'float32', 'int16', 'int32', 'int24', 'int8', 'uint8' }, SAMPLING_RATE, $frames_per_buffer, $stream_flags, ); my $noise = Cassis::Noise->new( speed => 0.3 ); my $osc1 = Cassis::DCO::Sin->new( fs => SAMPLING_RATE, freq => 10.0 ); my $osc2 = Cassis::DCO::Sin->new( fs => SAMPLING_RATE, freq => 10.02 ); my $filter = Cassis::Iir2::LPF->new( cutoff => 0.25, q => 1.0 ); # Infinite loop... while ( 1 ) { my $wa = $stream->write_available; my $mixer_out = Cassis::Mixer::mix( { src => $osc1->exec( num => $wa ), volume => 0.5 }, { src => $osc2->exec( num => $wa ), volume => 0.5 } ); my $filter_out = $filter->exec( src => $noise->exec( num => $wa ), mod_cutoff => { src => $mixer_out, depth => 0.1 } ); my $buf = pack( 's*', map { int( (($_ < -1.0) ? -1 : ((1.0 < $_) ? +1 : $_)) * INT16_MAX ); } @{$filter_out} ); $stream->write( $buf ); } }
2つの微妙に周期が異なる波形を足し合わせると、
その微妙に差異によって、打ち消したり、増幅したりするのが、
なんとなく分かって貰えると思う。
長い周期でcutoff
を変化させて遊ぶのは本当に面白いですね!
おしまい。
Leave a Comment