midichannels.pl: fix program or control change on more than one channel

The previous code emitted only a MIDI event for the first channel - but
we need one for all.
This commit is contained in:
Rudolf Polzer 2018-03-21 17:15:46 -07:00
parent 2a99f526b5
commit 8bd4153e3a

View File

@ -118,11 +118,11 @@ while(<STDIN>)
{ {
my $tracks = $opus->tracks_r(); my $tracks = $opus->tracks_r();
my ($track, $channel, $program) = @arg; my ($track, $channel, $program) = @arg;
for(($track eq '*') ? (0..@$tracks-1) : $track) for my $t(($track eq '*') ? (0..@$tracks-1) : $track)
{ {
my @events = (); my @events = ();
my $added = 0; my %added = ();
for(abstime $tracks->[$_]->events()) for(abstime $tracks->[$t]->events())
{ {
my $p = $chanpos{$_->[0]}; my $p = $chanpos{$_->[0]};
if(defined $p) if(defined $p)
@ -132,28 +132,28 @@ while(<STDIN>)
{ {
next next
if $_->[0] eq 'patch_change'; if $_->[0] eq 'patch_change';
if(!$added) if(!$added{$t}{$c})
{ {
push @events, ['patch_change', $_->[1], $c-1, $program-1] push @events, ['patch_change', $_->[1], $c-1, $program-1]
if $program; if $program;
$added = 1; $added{$t}{$c} = 1;
} }
} }
} }
push @events, $_; push @events, $_;
} }
$tracks->[$_]->events_r([reltime @events]); $tracks->[$t]->events_r([reltime @events]);
} }
} }
elsif($cmd eq 'control') elsif($cmd eq 'control')
{ {
my $tracks = $opus->tracks_r(); my $tracks = $opus->tracks_r();
my ($track, $channel, $control, $value) = @arg; my ($track, $channel, $control, $value) = @arg;
for(($track eq '*') ? (0..@$tracks-1) : $track) for my $t(($track eq '*') ? (0..@$tracks-1) : $track)
{ {
my @events = (); my @events = ();
my $added = 0; my %added = ();
for(abstime $tracks->[$_]->events()) for(abstime $tracks->[$t]->events())
{ {
my $p = $chanpos{$_->[0]}; my $p = $chanpos{$_->[0]};
if(defined $p) if(defined $p)
@ -163,17 +163,17 @@ while(<STDIN>)
{ {
next next
if $_->[0] eq 'control_change' && $_->[3] == $control; if $_->[0] eq 'control_change' && $_->[3] == $control;
if(!$added) if(!$added{$t}{$c})
{ {
push @events, ['control_change', $_->[1], $c-1, $control, $value] push @events, ['control_change', $_->[1], $c-1, $control, $value]
if $value ne ''; if $value ne '';
$added = 1; $added{$t}{$c} = 1;
} }
} }
} }
push @events, $_; push @events, $_;
} }
$tracks->[$_]->events_r([reltime @events]); $tracks->[$t]->events_r([reltime @events]);
} }
} }
elsif($cmd eq 'transpose') elsif($cmd eq 'transpose')