Audio-TinySoundFont
view release on metacpan or search on metacpan
lib/Audio/TinySoundFont/Preset.pm view on Meta::CPAN
package Audio::TinySoundFont::Preset;
use v5.14;
use warnings;
our $VERSION = '0.12';
use autodie;
use Carp;
use Try::Tiny;
use Moo;
use Types::Standard qw/Int Str InstanceOf/;
has soundfont => (
is => 'ro',
isa => InstanceOf ['Audio::TinySoundFont'],
required => 1,
);
has index => (
is => 'ro',
isa => Int,
required => 1,
);
has name => (
is => 'ro',
isa => Str,
lazy => 1,
builder => sub
{
my $self = shift;
$self->soundfont->_tsf->get_presetname( $self->index ) // '';
},
);
sub render
{
my $self = shift;
my %args = @_;
my $tsf = $self->soundfont->_tsf;
croak "Cannot render a preset when TinySoundFont is active"
if $tsf->active_voices;
my $SR = $tsf->SAMPLE_RATE;
my $seconds = $args{seconds} // 0;
my $samples = ( $seconds * $SR ) || $args{samples} // $SR;
my $note = $args{note} // 60;
my $vel = $args{vel} // 0.5;
my $vol = $args{volume} // $self->soundfont->db_to_vol( $args{db} );
my $old_vol;
if ( defined $vol )
{
$old_vol = $self->soundfont->volume;
$self->soundfont->volume($vol);
}
my $vel_msg = qq{Velocity of "$vel" should be between 0 and 1};
if ( $vel < 0 )
{
carp qq{$vel_msg, setting to 0};
$vel = 0;
}
if ( $vel > 1 )
{
carp qq{$vel_msg, setting to 1};
( run in 3.688 seconds using v1.01-cache-2.11-cpan-75ffa21a3d4 )