X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=misc%2Ftools%2Fmidichannels.pl;h=0223e82a3a5c39ac0046d98706746e47fefbc45c;hb=afe6a50f5f043559f4f55a5bcca6d45a279f1ead;hp=f86eae4db5e8212a15aa8d2ae0773a7512af4642;hpb=86b5ebb976d464c2a011e60cab169e22c632c446;p=xonotic%2Fxonotic.git diff --git a/misc/tools/midichannels.pl b/misc/tools/midichannels.pl index f86eae4d..0223e82a 100755 --- a/misc/tools/midichannels.pl +++ b/misc/tools/midichannels.pl @@ -2,8 +2,9 @@ use strict; use warnings; -use MIDI; +use MIDI::Event; use MIDI::Opus; +use MIDI::Track; my ($filename, @others) = @ARGV; my $opus = MIDI::Opus->new({from_file => $filename}); @@ -59,10 +60,14 @@ for(@others) while() { chomp; - my @arg = split /\s+/, $_; + my @arg = grep { $_ ne '' } split /\s+/, $_; my $cmd = shift @arg; print "Executing: $cmd @arg\n"; - if($cmd eq 'clean') + if($cmd eq '#') + { + # Just a comment. + } + elsif($cmd eq 'clean') { my $tracks = $opus->tracks_r(); $tracks->[$_]->events_r([clean($tracks->[$_]->events())]) @@ -113,11 +118,11 @@ while() { my $tracks = $opus->tracks_r(); my ($track, $channel, $program) = @arg; - for(($track eq '*') ? (0..@$tracks-1) : $track) + for my $t(($track eq '*') ? (0..@$tracks-1) : $track) { my @events = (); - my $added = 0; - for(abstime $tracks->[$_]->events()) + my %added = (); + for(abstime $tracks->[$t]->events()) { my $p = $chanpos{$_->[0]}; if(defined $p) @@ -127,17 +132,48 @@ while() { next if $_->[0] eq 'patch_change'; - if(!$added) + if(!$added{$t}{$c}) { push @events, ['patch_change', $_->[1], $c-1, $program-1] if $program; - $added = 1; + $added{$t}{$c} = 1; } } } push @events, $_; } - $tracks->[$_]->events_r([reltime @events]); + $tracks->[$t]->events_r([reltime @events]); + } + } + elsif($cmd eq 'control') + { + my $tracks = $opus->tracks_r(); + my ($track, $channel, $control, $value) = @arg; + for my $t(($track eq '*') ? (0..@$tracks-1) : $track) + { + my @events = (); + my %added = (); + for(abstime $tracks->[$t]->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{$t}{$c}) + { + push @events, ['control_change', $_->[1], $c-1, $control, $value] + if $value ne ''; + $added{$t}{$c} = 1; + } + } + } + push @events, $_; + } + $tracks->[$t]->events_r([reltime @events]); } } elsif($cmd eq 'transpose') @@ -152,7 +188,7 @@ while() if(defined $p) { my $c = $_->[$p] + 1; - if($channel eq '*' || $c == $channel) + if($channel eq '*' ? $c != 10 : $c == $channel) { if($_->[0] eq 'note_on' || $_->[0] eq 'note_off') { @@ -173,15 +209,20 @@ while() for(abstime $tracks->[$_]->events()) { my $p = $chanpos{$_->[0]}; - if(defined $p) + if(!defined $p) { - my $c = $_->[$p] + 1; - $c = $chanmap{$c} // $chanmap{'*'} // $c; + push @events, $_; + next; + } + my $c = $_->[$p] + 1; + my @c = split /,/, ($chanmap{$c} // $chanmap{'*'} // $c); + for my $c(@c) { next if $c == 0; # kill by setting channel to 0 - $_->[$p] = $c - 1; + my @copy = @$_; + $copy[$p] = $c - 1; + push @events, \@copy; } - push @events, $_; } $tracks->[$_]->events_r([reltime @events]); } @@ -308,10 +349,12 @@ while() print " ticks [value]\n"; print " retrack\n"; print " program \n"; + print " control \n"; print " transpose \n"; print " channel [ ...]\n"; print " percussion [ ...]\n"; print " tracks [trackno] [trackno] ...\n"; + print " save \n"; } print "Done with: $cmd @arg\n"; }