+ elsif($cmd eq 'control')
+ {
+ my $tracks = $opus->tracks_r();
+ my ($track, $channel, $control, $value) = @arg;
+ for(($track eq '*') ? (0..@$tracks-1) : $track)
+ {
+ my @events = ();
+ my $added = 0;
+ for(abstime $tracks->[$_]->events())
+ {
+ my $p = $chanpos{$_->[0]};
+ if(defined $p)
+ {
+ my $c = $_->[$p] + 1;
+ if($channel eq '*' || $c == $channel)
+ {
+ next
+ if $_->[0] eq 'control_change' && $_->[3] == $control;
+ if(!$added)
+ {
+ push @events, ['control_change', $_->[1], $c-1, $control, $value]
+ if $value ne '';
+ $added = 1;
+ }
+ }
+ }
+ push @events, $_;
+ }
+ $tracks->[$_]->events_r([reltime @events]);
+ }
+ }