X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=misc%2Ftools%2Fmidichannels.pl;h=5462bbb8ed97cdbe434d76a05e2911de207dc6ec;hb=64d24e80a3dd10cb78bf18a730c138cb9a1c6bae;hp=4df6978be9bb2cb790d4d5523d80feed46b7979d;hpb=8a946096009455bec30aa79c51b4c2877646a779;p=xonotic%2Fxonotic.git diff --git a/misc/tools/midichannels.pl b/misc/tools/midichannels.pl index 4df6978b..5462bbb8 100755 --- a/misc/tools/midichannels.pl +++ b/misc/tools/midichannels.pl @@ -62,7 +62,11 @@ while() my @arg = 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())]) @@ -112,8 +116,8 @@ while() elsif($cmd eq 'program') { my $tracks = $opus->tracks_r(); - my ($channel, $program) = @arg; - for(0..@$tracks-1) + my ($track, $channel, $program) = @arg; + for(($track eq '*') ? (0..@$tracks-1) : $track) { my @events = (); my $added = 0; @@ -123,7 +127,7 @@ while() if(defined $p) { my $c = $_->[$p] + 1; - if($c == $channel) + if($channel eq '*' || $c == $channel) { next if $_->[0] eq 'patch_change'; @@ -152,7 +156,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') { @@ -163,11 +167,39 @@ while() } } } + elsif($cmd eq 'channel') + { + my $tracks = $opus->tracks_r(); + my ($track, %chanmap) = @arg; + for(($track eq '*') ? (0..@$tracks-1) : $track) + { + my @events = (); + for(abstime $tracks->[$_]->events()) + { + my $p = $chanpos{$_->[0]}; + if(!defined $p) + { + 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 + my @copy = @$_; + $copy[$p] = $c - 1; + push @events, \@copy; + } + } + $tracks->[$_]->events_r([reltime @events]); + } + } elsif($cmd eq 'percussion') { my $tracks = $opus->tracks_r(); - my %map = @arg; - for(0..@$tracks-1) + my ($track, $channel, %map) = @arg; + for(($track eq '*') ? (0..@$tracks-1) : $track) { my @events = (); for(abstime $tracks->[$_]->events()) @@ -176,7 +208,7 @@ while() if(defined $p) { my $c = $_->[$p] + 1; - if($c == 10) + if($channel eq '*' || $c == $channel) { if($_->[0] eq 'note_on' || $_->[0] eq 'note_off') { @@ -227,6 +259,8 @@ while() my %notehash = (); my $t = 0; my $events = 0; + my $min = undef; + my $max = undef; for($tracks->[$_]->events()) { ++$events; @@ -246,6 +280,11 @@ while() $notehash{$_->[2]}{$_->[3]} = $t if $_->[0] eq 'note_on'; $notehash{$_->[2]}{$_->[3]} = undef if $_->[0] eq 'note_off'; $name = $_->[2] if $_->[0] eq 'track_name'; + if($_->[0] eq 'note_on') + { + $min = $_->[3] if !defined $min || $_->[3] < $min; + $max = $_->[3] if !defined $max || $_->[3] > $max; + } } my $channels = join " ", map { sprintf "%s(%s)", $_, join ",", sort { $a <=> $b } keys %{$channels{$_}} } sort { $a <=> $b } keys %channels; my @stuck = (); @@ -260,7 +299,7 @@ while() print " $name" if defined $name; print " (channel $channels)" if $channels ne ""; print " ($events events)" if $events; - print " ($notes notes)" if $notes; + print " ($notes notes [$min-$max])" if $notes; print " (notes @stuck stuck)" if @stuck; print "\n"; } @@ -277,9 +316,10 @@ while() print " dump\n"; print " ticks [value]\n"; print " retrack\n"; - print " program \n"; + print " program \n"; print " transpose \n"; - print " percussion [ ...]\n"; + print " channel [ ...]\n"; + print " percussion [ ...]\n"; print " tracks [trackno] [trackno] ...\n"; } print "Done with: $cmd @arg\n";