lilypond-0.1.42
[lilypond.git] / bin / convert-mudela.pl
blobe10af3b07777d4ee4aef28f0b155abc1d594b434
1 #!@PERL@ -w
2 # -*-perl-*-
4 =head1 TODO
6 detect \lyrics and \melodic, and do substitution accordingly.
7 count <> and {} ?
9 Ugh . Perl sux. Anybody for Python?
11 =cut
16 # version of "supporting" engine, not mudela conversions.
22 $convert_mudela_version = "0.1.2";
24 use Getopt::Long;
27 sub version_compare
29 local ($a,$b)=@_;
30 return &cmpver;
34 sub cmpver
36 my(@a)= split /\./,$a;
37 my(@b)= split /\./,$b;
39 for $i (0,1,2) {
40 return $a[$i] <=> $b[$i] if ($a[$i] != $b[$i]);
42 return $a cmp $b;
45 sub version_string_conv
47 my ($from_version, $to_version) = @_;
48 s/\version \"$from_version\"/\version \"$to_version\"/g;
51 ################################################################
53 sub no_conv
57 sub convert_0_0_52_to_0_0_53
60 s/include \"/$1\\include \"/g;
64 sub convert_0_0_54_to_0_0_55
66 s/%{/% {/g;
70 sub convert_0_0_53_to_0_0_54
72 print STDERR "Not smart enough to convert \\transpose\n" if (/\\transpose/) ;
75 # we-re not at 58 yet, but this is at least one of the rules
76 sub convert_0_0_55_to_0_0_56
78 s/\"\|\|\"/\"|.\"/g;
81 sub convert_0_0_56_to_0_0_57
83 s/\(([ \]\[|\t-\.>]|\\[<!>a-z]+)*\)/\~ $1/g;
86 sub convert_0_0_57_to_0_0_58
88 s/\[ *([^\[\]]*)\] *([1-9]*) *\/ *([1-9]*)/[$2\/$3 $1]1\/1/g;
91 sub convert_0_0_58_to_0_0_59
93 die "Not smart enough to convert 0.0.58 to 0.0.59\n";
96 sub convert_0_0_59_to_0_0_60
98 s/(\\unitspace [0-9.mcptin\\ ]+|\\geometric [0-9.]+|\\width [0-9.mcp\\tin]+)/$1;/g;
99 s/(\\output \"[^\"]+\")/$1;/;
100 s/(\\tempo [0-9: ]+)/$1;/;
103 sub convert_0_0_60_to_0_0_61
105 s/(\\unitspace|\\geometric|\\width)/$1=/g;
109 sub convert_0_1_0_to_0_1_1
111 s/\\tempo (.*):(.*);/\\tempo $1 = $2;/g
114 sub convert_0_1_2_to_0_1_3
116 s/\\stem *(\\up|1) *;/\\stemup/g;
117 s/\\stem *(\\down|-1) *;/\\stemdown/g;
118 s/\\stem *0 *;/\\stemboth/g;
119 s/\\hshift ([^;]+) *;/\\property Voice.hshift = $1/g;
122 my $header_b = 0;
124 sub generic_conversion_scan
126 if (/\\header *\{/)
128 $header_b = 1;
130 if ($header_b && /^ *\}/)
132 $header_b = 0;
135 sub convert_0_1_4_to_0_1_5
137 s/([<{]) *\\id "Piano" (.+);/\\type Grandstaff = $3 $1/;
138 s/([<{]) *\\id (.+) (.+);/\\type $2 = $3 $1/;
142 sub convert_0_1_5_to_0_1_6
144 s/< *\\multi (.*);/\\multi $1 </;
147 sub convert_0_1_6_to_0_1_7
149 if ($header_b)
151 s/^([a-zA-z]+)[ \t]+(.*)$/$1 =\t \"$2\";/;
152 s/^([ \t])+(.*)$/$1 \"$2\";/;
156 sub convert_0_1_7_to_0_1_8
158 s/\\plet *1 *\/ *1 *;/\\]/;
159 s/\\plet *([1-9][0-9]*) *\/ *([2-9][0-9]*) *;/\\[$1\/$2/;
162 ###############################################################
164 sub last_conversion
166 my @v = &versions;
167 return pop @v;
169 sub identify
172 print STDERR "This is convert-mudela " . $convert_mudela_version .
173 " (up to mudela version ", last_conversion, ")\n";
177 sub usage
179 print STDERR "Usage: convert-mudela [options] [mudela-file]...\n"
180 . "Convert old mudela source from mudela-file or stdin\n\n"
181 . "Options:\n"
182 . " -e, --edit perform in-place conversion\n"
183 . " -f, --from=PATHLEVEL use source version 0.0.PATCHLEVEL\n"
184 . " -h, --help print this help\n"
185 . " -o, --output=FILE name output file\n"
186 . " -s, --show-rules print all known conversion rules\n"
187 . " -t, --to=VERSION convert to version VERSION\n"
191 my %minor_conversions = ("0.0.50" => \&no_conv,
192 "0.0.52" => \&convert_0_0_50_to_0_0_52,
193 "0.0.53" => \&convert_0_0_52_to_0_0_53,
194 "0.0.54" => \&convert_0_0_53_to_0_0_54,
195 "0.0.55" => \&convert_0_0_54_to_0_0_55,
196 "0.0.56" => \&convert_0_0_55_to_0_0_56,
197 "0.0.57" => \&convert_0_0_56_to_0_0_57,
198 "0.0.58" => \&convert_0_0_57_to_0_0_58,
199 "0.0.59" => \&convert_0_0_58_to_0_0_59,
200 "0.0.60" => \&convert_0_0_59_to_0_0_60,
201 "0.0.61" => \&convert_0_0_60_to_0_0_61,
202 "0.1.1" => \&convert_0_1_0_to_0_1_1,
203 "0.1.2" => \&no_conv,
204 "0.1.3" => \&convert_0_1_2_to_0_1_3,
205 "0.1.4" => \&no_conv,
206 "0.1.5" => \&convert_0_1_4_to_0_1_5,
207 "0.1.6" => \&convert_0_1_5_to_0_1_6
208 ,"0.1.7" => \&convert_0_1_6_to_0_1_7
209 ,"0.1.8" => \&convert_0_1_7_to_0_1_8
214 sub versions
216 return (sort { cmpver; } (keys %minor_conversions));
220 sub show_rules
222 my (@v) = versions;
224 print "Rules: ", join(", ", @v), "\n";
228 sub do_conversion
230 my ($from,$to) = @_;
232 my @applicable_conversion;
233 my @mudela_levels;
235 my @v = versions;
236 foreach $ver (@v) {
237 if (version_compare($ver, $from) > 0 && version_compare($ver,$to) <= 0 ){
238 push @applicable_conversion, $minor_conversions{$ver};
239 push @mudela_levels, $ver;
243 print STDERR "Applying following rules: ", join(", ", @mudela_levels) , "\n";
245 while (<INLY>) {
246 generic_conversion_scan;
247 foreach $subroutine (@applicable_conversion) {
249 &$subroutine;
252 version_string_conv $from, $to;
253 print OUTLY;
257 sub get_auto_from
259 my ($fn)=@_;
260 my ($ver);
261 open INLY, $fn || die "Can't open";
263 while (<INLY>) {
264 s/^.*\\version \"([^\"]*)\".*$//;
265 if (defined ($1)) {
266 print STDERR "Guessing version: ", $1, ".. ";
267 $ver = $1;
268 last;
271 if (!defined($ver)){
272 print STDERR "can't determine mudela version in $fn.\n";
273 my $u;
274 return $u;
276 close INLY;
277 return $ver;
280 sub set_files
282 $infile = "-";
283 $outfile = "-";
284 $outfile = $opt_output if (defined($opt_output));
286 if ($ARGV [0]) {
287 $infile = $ARGV[0];
289 if (!(-f $infile) && !($infile =~ /\.ly$/s)) {
290 $infile .= ".ly";
292 if ($opt_edit && $infile ne "-") {
293 $opt_edit = 1;
294 $outfile = "$infile.NEW";
295 $infile = "$infile";
297 print STDERR "Input ", (($infile eq "-") ?"STDIN" : $infile), " .. ";
301 sub do_one_arg
303 set_files;
305 local ($from_version, $to_version);
306 $from_version = $opt_from;
307 $to_version = $opt_to;
309 ($from_version = get_auto_from $infile) unless defined($opt_from);
310 return if (!defined($from_version));
312 ($to_version = last_conversion) unless (defined($opt_to));
314 die "can't open \`$infile\'" unless open INLY,$infile ;
315 die "can't open \`$outfile\'" unless open OUTLY, ">$outfile";
317 do_conversion $from_version, $to_version;
318 close INLY;
319 close OUTLY;
321 if ($opt_edit) {
322 rename $infile, "$infile~";
323 rename $outfile, "$infile";
327 ## "main"
329 identify;
332 GetOptions ("help", "output=s", "from=i", "to=i", "minor=i", "edit", "show-rules");
334 if ($opt_help) {
335 usage();
336 $opt_help = 0; # to extinguish typo check.
337 exit 0;
340 if ($opt_show_rules) {
341 show_rules ;
342 $opt_show_rules = 0; # to extinguish typo check.
343 exit 0;
346 local ( $infile,$outfile);
347 my $processed_one=0;
349 while (defined($ARGV[0])) {
350 do_one_arg;
351 shift @ARGV;
352 $processed_one = 1;
354 do_one_arg unless ($processed_one);