Audio-TinySoundFont
view release on metacpan or search on metacpan
t/021-render.t view on Meta::CPAN
use strict;
use Test::More;
use Try::Tiny;
use FindBin qw/$Bin/;
use List::Util qw/sum/;
use Audio::TinySoundFont;
my $tsf = Audio::TinySoundFont->new("$Bin/tiny.sf2");
isnt( $tsf, undef, 'Can create a new object' );
my $preset = $tsf->preset('');
isnt( $preset, undef, 'Can get a preset' );
my $snd = $preset->render( seconds => 5, note => 59, vel => 0.7, volume => .3 );
isnt( $snd, undef, 'Render works' );
note( 'Length of $snd: ' . length $snd );
cmp_ok( length($snd), '>=', 2 * 44_100 * 5, 'Rendering is over 5 seconds' );
cmp_ok(
length($snd), '<=', 2 * 44_100 * 6,
'Rendering is also under 6 seconds'
);
unlike( $snd, qr/^\0*$/, 'Sample was not empty' );
# Volume
{
my $ld_snd = $preset->render( seconds => 5, note => 59, vel => 0.7, volume => .5 );
is( length $ld_snd, length $snd, 'A rerender causes an identical length' );
unlike( $snd, qr/^\0*$/, 'Sample was not empty' );
my @snds = reverse sort unpack 's<*', $snd;
splice( @snds, int( @snds * .1 ) );
my $sndp10 = sum(@snds) / scalar(@snds);
my @ld_snds = reverse sort unpack 's<*', $ld_snd;
splice( @ld_snds, int( @ld_snds * .1 ) );
my $ld_sndp10 = sum(@ld_snds) / scalar(@ld_snds);
cmp_ok( $ld_sndp10, '>', $sndp10, 'A higher volume creates a louder render' );
$tsf->volume(0.5);
my $df_snd = $preset->render( seconds => 5, note => 59, vel => 0.7 );
ok( $df_snd eq $ld_snd, 'Using the main volume control works identically' );
}
# Amp and Volume
foreach ( [ 0.0, -110 ], [ 0.0, -100 ], [ 0.3, -10.457575 ], [ 0.97, -0.264565 ], [ 1.0, 0 ], [ 1.0, 10 ] )
{
my ( $vol, $db ) = @$_;
my $vol_snd = $preset->render( volume => $vol );
my $db_snd = $preset->render( db => $db );
ok( $vol_snd eq $db_snd, "volume $vol and db $db work correct" );
}
# Velocity and notes
{
local $SIG{__WARN__} = sub { ok( 0, 'Warning is not expected' ) || note $_[0]; };
my $vel_low_ib = $preset->render( vel => 0 );
my $vel_high_ib = $preset->render( vel => 1 );
my $note_low_ib = $preset->render( note => 0 );
my $note_high_ib = $preset->render( note => 127 );
1e-10;
local $SIG{__WARN__} = sub { like( $_[0], qr/^(Note|Velocity)/, 'Warning is one that is expected' ) || note $_[0]; };
( run in 1.563 second using v1.01-cache-2.11-cpan-5837b0d9d2c )