Audio-Nama
view release on metacpan or search on metacpan
lib/Audio/Nama/Fade.pm view on Meta::CPAN
track => $track,
id => $reuseid,
parent => $track->fader,
type => 'klg', # Ecasound controller
params => [ 1, # modify first parameter of fader op
$off_level,
$on_level,
@pairs,
]
});
# set fader to correct initial value
# first fade is type 'in' : 0
# first fade is type 'out' : 100%
update_effect($track->fader,0, initial_level($track->name) * 100)
}
sub all_fades {
my $track_name = shift;
sort {
$Audio::Nama::Mark::by_name{$a->mark1}->{time} <=> $Audio::Nama::Mark::by_name{$b->mark1}->{time}
} grep { $_->track eq $track_name } values %by_index
}
sub fades {
# get fades within playable region
my $track_name = shift;
my $track = $tn{$track_name};
my @fades = all_fades($track_name);
return @fades if ! $mode->{offset_run};
# handle offset run mode
my @in_bounds;
my $play_end = Audio::Nama::play_end_time();
my $play_start_time = Audio::Nama::play_start_time();
my $length = $track->wav_length;
for my $fade (@fades){
my $play_end_time = $play_end ? min($play_end, $length) : $length;
my $time = $Audio::Nama::Mark::by_name{$fade->mark1}->{time};
push @in_bounds, $fade if $time >= $play_start_time and $time <= $play_end_time;
}
@in_bounds
}
# our envelope must include a straight segment from the
# beginning of the track (or region) to the fade
# start. Similarly, we need a straight segment
# from the last fade to the track (or region) end
# - If the first fade is a fade-in, the straight
# segment will be at zero-percent level
# (otherwise 100%)
#
# - If the last fade is fade-out, the straight
# segment will be at zero-percent level
# (otherwise 100%)
# although we can get the precise start and endpoints,
# I'm using 0 and $track->shifted_playat_time + track length
sub initial_level {
# return 0, 1 or undef
# 0: track starts silent
# 1: track starts at full volume
my $track_name = shift;
my @fades = fades($track_name) or return undef;
# if we fade in we'll hold level zero from beginning
(scalar @fades and $fades[0]->type eq 'in') ? 0 : 1
}
sub exit_level {
my $track_name = shift;
my @fades = fades($track_name) or return undef;
# if we fade out we'll hold level zero from end
(scalar @fades and $fades[-1]->type eq 'out') ? 0 : 1
}
sub initial_pair { # duration: zero to...
my $track_name = shift;
my $init_level = initial_level($track_name);
defined $init_level or return ();
(0, $init_level )
}
sub final_pair { # duration: .... to length
my $track_name = shift;
my $exit_level = exit_level($track_name);
defined $exit_level or return ();
my $track = $tn{$track_name};
(
$track->shifted_playat_time + $track->wav_length,
$exit_level
);
}
sub fader_envelope_pairs {
# return number_of_pairs, pos1, val1, pos2, val2,...
my $track = shift;
my @fades = fades($track->name);
my @specs;
for my $fade ( @fades ){
# calculate fades
my $marktime1 = Audio::Nama::Mark::mark_time($fade->mark1);
my $marktime2 = Audio::Nama::Mark::mark_time($fade->mark2);
if ($marktime2) {} # nothing to do
elsif( $fade->relation eq 'fade_from_mark')
{ $marktime2 = $marktime1 + $fade->duration }
elsif( $fade->relation eq 'fade_to_mark')
{
$marktime2 = $marktime1;
$marktime1 -= $fade->duration
}
else { $fade->dumpp; die "fade processing failed" }
logpkg(__FILE__,__LINE__,'debug',"marktime1: $marktime1, marktime2: $marktime2");
push @specs,
[ $marktime1,
$marktime2,
$fade->type,
( run in 0.810 second using v1.01-cache-2.11-cpan-5735350b133 )