lilypond-0.1.13
[lilypond.git] / bin / convert-mudela.in
blob530e7818f20b54bffe87c46736b3861046c42a65
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?
10     
11 =cut    
16 # version of "supporting" engine, not mudela conversions.
17
22 $convert_mudela_version = "0.1.2";
24 use Getopt::Long;
27 sub version_compare
29     local ($a,$b)=@_;
30     return &cmpver;
32     
34 sub  cmpver 
35 {       
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]);
41         }
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;
63   
64 sub convert_0_0_54_to_0_0_55
66     s/%{/% {/g;
69   
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;
106    
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 sub convert_0_1_4_to_0_1_5
124     s/([<{]) *\\id "Piano" (.+);/\\type Grandstaff = $3 $1/;    
125     s/([<{]) *\\id (.+) (.+);/\\type $2 = $3 $1/;
128 ###############################################################
130 sub    last_conversion
132     my @v = &versions;
133     return pop @v;
135 sub identify
137     
138     print STDERR "This is convert-mudela " . $convert_mudela_version . 
139         " (up to mudela version ", last_conversion,     ")\n";
141   
142   
143  sub usage
144   {
145      print STDERR "Usage: convert-mudela [options] [mudela-file]...\n"
146      . "Convert old mudela source from mudela-file or stdin\n\n"
147      . "Options:\n"
148      . "  -e, --edit             perform in-place conversion\n"
149      . "  -f, --from=PATHLEVEL   use source version 0.0.PATCHLEVEL\n"
150      . "  -h, --help             print this help\n"
151      . "  -o, --output=FILE      name output file\n"
152      . "  -s, --show-rules       print all known conversion rules\n"
153      . "  -t, --to=VERSION       convert to version VERSION\n"
154   }
155       
157 my %minor_conversions = ("0.0.50" => \&no_conv,
158                          "0.0.52" => \&convert_0_0_50_to_0_0_52,
159                          "0.0.53" => \&convert_0_0_52_to_0_0_53,
160                          "0.0.54" => \&convert_0_0_53_to_0_0_54,
161                          "0.0.55" => \&convert_0_0_54_to_0_0_55,
162                          "0.0.56" => \&convert_0_0_55_to_0_0_56,
163                          "0.0.57" => \&convert_0_0_56_to_0_0_57,
164                          "0.0.58" => \&convert_0_0_57_to_0_0_58,
165                          "0.0.59" => \&convert_0_0_58_to_0_0_59,
166                          "0.0.60" => \&convert_0_0_59_to_0_0_60,
167                          "0.0.61" => \&convert_0_0_60_to_0_0_61,
168                          "0.1.1" => \&convert_0_1_0_to_0_1_1,
169                          "0.1.2" => \&no_conv,
170                          "0.1.3" => \&convert_0_1_2_to_0_1_3,
171                          "0.1.4" => \&no_conv,
172                          "0.1.5" => \&convert_0_1_4_to_0_1_5
173                          );
176 sub versions 
178     return (sort { cmpver; } (keys %minor_conversions));
180     
182 sub show_rules
184     my (@v) = versions;
186     print "Rules: ", join(", ", @v), "\n";
187     
190 sub do_conversion
192     my ($from,$to) = @_;
194     my @applicable_conversion;
195     my @mudela_levels;
196     
197     my @v = versions;
198     foreach $ver (@v) {
199         if (version_compare($ver, $from) > 0 && version_compare($ver,$to) <= 0 ){ 
200             push @applicable_conversion, $minor_conversions{$ver};
201             push @mudela_levels, $ver;
202         }
203     }
204     
205     print STDERR "Applying following rules: ", join(", ", @mudela_levels) , "\n";
207     while (<INLY>) {
208         foreach $subroutine (@applicable_conversion) {
209         
210             &$subroutine;
211             
212         }
213         version_string_conv $from, $to;
214         print OUTLY;
215     }
218 sub get_auto_from
220     my ($fn)=@_;
221     my ($ver);
222     open INLY, $fn || die "Can't open";
224     while (<INLY>) {
225         s/^.*\\version \"([^\"]*)\".*$//;
226         if (defined ($1)) {
227             print STDERR "Guessing version: ", $1, ".. ";
228             $ver = $1;
229             last;
230         }
231     }
232     if (!defined($ver)){
233         print STDERR "can't determine mudela version in $fn.\n";
234         my $u;
235         return $u;
236     }
237     close INLY;
238     return $ver;
239 }   
241 sub  set_files 
243     $infile = "-";
244     $outfile = "-";
245     $outfile = $opt_output if (defined($opt_output));
247     if ($ARGV [0])  {
248         $infile = $ARGV[0];
249     } 
250     if (( ! -f $infile) && (! $infile =~ /\\.ly$/s ) ){
251         $infile .= ".ly";
252         
254     }
255     if ($opt_edit && $infile ne "-") {
256         $opt_edit = 1;
257         $outfile = "$infile.NEW";
258         $infile = "$infile";
259     }
260     print STDERR "Input ", (($infile eq "-") ?"STDIN" : $infile), " .. ";
264 sub do_one_arg
266     set_files;
268     local ($from_version, $to_version);
269     $from_version = $opt_from;
270     $to_version = $opt_to;
271     
272     ($from_version = get_auto_from $infile) unless defined($opt_from);
273     return if (!defined($from_version));
274     
275     ($to_version =  last_conversion) unless (defined($opt_to));
277     die "can't open \`$infile\'" unless open INLY,$infile ;
278     die "can't open \`$outfile\'" unless open OUTLY, ">$outfile";
279     
280     do_conversion $from_version, $to_version;
281     close INLY;
282     close OUTLY;
284     if ($opt_edit) {
285         rename $infile, "$infile~";
286         rename $outfile, "$infile";
287     }
290 ## "main"
292 identify;
295 GetOptions ("help", "output=s", "from=i", "to=i", "minor=i", "edit", "show-rules");
297 if ($opt_help) {
298     usage();
299     $opt_help = 0;      # to extinguish typo check.
300     exit 0;
303 if ($opt_show_rules) { 
304     show_rules ;
305     $opt_show_rules = 0;        # to extinguish typo check.
306     exit 0;
309 local ( $infile,$outfile);
310 my $processed_one=0;
312 while (defined($ARGV[0])) {
313     do_one_arg;
314     shift @ARGV;
315     $processed_one = 1;
317 do_one_arg unless ($processed_one);
319