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 )