Home  |  Linux  | Mysql  | PHP  | XML
From:peter.billam@dpiw.tas.gov.au Date:Sun Oct  8 21:16:03 2006
Subject:Re: Transforming midi note numbers
Marcus wrote:

> I need a perl script that given an input midi file writes a new file
> with notes transformed (for example, transposed by +3 note numbers).

One possibilty (not much tested) follows after .sig, usage:
 miditranspose -3 fn.mid > fn_low.mid    # transposes down 3 semtiones
 miditranspose +5 fn.mid > fn_high.mid   # transposes up 3 semtiones

Regards, Peter

AUS/TAS/DPIW/CIT/Servers hbt/lnd/l8   6233 3061   http://www.pjb.com.au
Pasaré, pasarémos    dice el agua    y canta la verdad contra la piedra
 -- Pablo Neruda
------------------------------------------------------------------

#! /usr/bin/perl

eval 'require MIDI'; if ($@) {
	die "you'll need to install the MIDI::Perl module from www.cpan.org\n";
}
import MIDI;
my $Version     = '1.0';

# check format of options args...
$amount = shift;
if ($amount !~ /[+-]?\d+/ || $amount < -25 || $amount > +25) {
	die "improbable transposition by $amount semitones\n";
}
$amount = 0 + $amount;

my $opus = MIDI::Opus->new({ 'from_file' => $ARGV[$[] || '-'});

foreach my $track ($opus->tracks()) {  # there will usually be only one
	my $events_r = $track->events_r();

	foreach my $event (@{$events_r}) {
		# varnames are only accurate for note_on and note_off events:
		my ($evtype, $dticks, $cha, $note, $vol) = @$event;
		if ($evtype eq 'note_on' | $evtype eq 'note_off') {
			if ($cha != 9) { ${$event}[$[+3] += $amount; }
		}
	}
}
$opus->write_to_file( '>-' );

__END__

=pod

=head1 NAME

miditranspose - Simulates the old tape-loop delay transpose on MIDI files

=head1 SYNOPSIS

 miditranspose -3 fn.mid > fn_low.mid    # transposes down 3 semtiones
 miditranspose +5 fn.mid > fn_high.mid   # transposes up 3 semtiones

=head1 DESCRIPTION

By default, MIDI channel 9 (or 10, if you're counting 1..16)
is left unchanged as, in General MIDI, it's the percussion channel.

=head1 OPTIONS

These options are currently unimplemented :-)

=over 3

=item I<-a>

All channels are transposed, i.e. including channel 9.

=item I<-n 3,4,6,9,12>

Channels 3,4,6,9 and 12 will Not be transposed.
The default is I<-n 9>

=back

=head1 AUTHOR

Peter J Billam  http://www.pjb.com.au/comp/contact.html

=head1 CREDITS

Based on Sean Burke's MIDI::Perl CPAN module.

=head1 SEE ALSO

 http://search.cpan.org/~sburke
 http://www.pjb.com.au/muscript
 http://www.pjb.com.au/midi

=cut

Navigate in group perl.midi at sever nntp.perl.org
Previous Next




  
© No Copyright
You are free to use Anything
Site Maintained by PHP Developer
Powered By PHP Consultants