Audio-Nama
view release on metacpan or search on metacpan
lib/Audio/Nama/TrackEffect.pm view on Meta::CPAN
package Audio::Nama::TrackEffect;
use v5.36;
our $VERSION = 1.0;
use Role::Tiny;
use Audio::Nama::Effect qw(fxn);
use Audio::Nama::Globals qw($project);
use Try::Tiny;
use List::MoreUtils qw(first_index);
# current operator and current parameter for the track
sub op { $project->{current_op}->{$_[0]->name} //= $_[0]->{ops}->[-1] }
sub param { $project->{current_param}->{$_[0]->op} //= 1 }
sub stepsize {
$project->{current_stepsize}->{$_[0]->op}->[$_[0]->param] //= 0.01
# TODO use hint if available
}
sub pos {
my $track = shift;
my $op = $track->op;
my $index = first_index {$_ eq $op } @{$track->ops};
return($index || 0);
}
sub user_ops_o {
my $track = shift;
map{ fxn($_) } $track->user_ops();
}
sub channel_ops {
my $track = shift;
grep{ $_->is_channel_op } $track->ops_o;
}
sub audio_ops {
my $track = shift;
grep{
! $_->is_channel_op
and ! $_->is_controller
} $track->ops_o;
}
sub ops_ecasound_order {
my $track = shift;
$track->channel_ops, $track->audio_ops
}
sub ecasound_dynamic_apply_list { # audio ops and their controllers
my $track = shift;
grep{ ! $_->is_channel_op } $track->ops_o;
}
sub ops_o {
my $track = shift;
map{ Audio::Nama::fxn($_) } @{ $track->ops }
}
sub apply_ops {
my $track = shift;
$_->apply_op for $track->ecasound_dynamic_apply_list;
}
sub user_ops {
my $track = shift;
my @skip = grep {fxn($_)} # must exist
map { $track->{$_} } qw(vol pan fader latency_op );
# make a dictionary of ops to exclude
# that includes utility ops and their controllers
my %skip;
map{ $skip{$_}++ } @skip, Audio::Nama::expanded_ops_list(@skip);
( run in 1.569 second using v1.01-cache-2.11-cpan-fe3c2283af0 )