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 )