diff --git a/pae2xml.pl b/pae2xml.pl index 4b7c940c1d069baf28ab063466eab6fe8cd74d1b..9158eae1feadd78aea4a025f9f111898e49027b3 100755 --- a/pae2xml.pl +++ b/pae2xml.pl @@ -62,6 +62,7 @@ $divisions = 960; $old_duration = $divisions; $old_type = ""; $old_octave = 4; +$BEAM = 0; # Store all alterations already used in the current measure, so that e.g. # xCC also detects the second note as a Cis! Needs to be reset at the @@ -244,7 +245,6 @@ sub parse_notes { } $notes =~ s/!([^!]*)!(f*)/repeat($1, length($2)+1)/gse; # write out repetitions - $notes =~ s/\{([^\}]*)\}/$1/gs; # ignore beamings while ( $notes =~ s/(:?\/+:?|^)([^\/:]*)(:?\/+:?)i(:?\/+:?)/$1$2$3$2$4/gs) {}; # replace whole-measure repeats (i notation) $notes =~ s/(\d+)\(([^;]+\))/\($1$2/gs; # pull note lengths into fermatas or triplets @@ -265,6 +265,12 @@ sub parse_notes { } elsif ($notes =~ /^r(.*)$/) { # End grace $notes = $1; $qq = 0; + } elsif ($notes =~ /^{(.*)$/) { # Begin beam + $notes = $1; + $BEAM = 1; + # Beam endings are handled by the last note of the beam, since + # we need to know for the last note that the <beam>end</beam> tag + # should be used! } elsif ($notes =~ /^\=(\d*)(\/.*)$/) { # multi-measure rests $measrest = $1; $notes = $2; @@ -300,16 +306,16 @@ sub parse_notes { } } } - } elsif ($notes =~ /^((\^)?(g|q)?(\,|\')*(x|xx|b|bb|n)?\d*\.*(\-|A|B|C|D|E|F|G)t?\+?)(.*)$/) { # a note + } elsif ($notes =~ /^((\^)?(g|q)?(\,|\')*(x|xx|b|bb|n)?\d*\.*(\-|A|B|C|D|E|F|G)t?\+?}?)(.*)$/) { # a note ($note, $notes) = ($1,$7); parse_note($note, $keysig, "", "", $qq); - } elsif ($notes =~ /^(\((g|q)?(\,|\')*(x|xx|b|bb|n)?\d*\.*(\-|A|B|C|D|E|F|G)[t\+]*\)[t\+]*)(.*)$/) { # one note with a fermata + } elsif ($notes =~ /^(\((g|q)?(\,|\')*(x|xx|b|bb|n)?\d*\.*(\-|A|B|C|D|E|F|G)[t\+]*\)[t\+}]*)(.*)$/) { # one note with a fermata ($note, $notes) = ($1,$6); parse_note($note, $keysig, "", "", $qq); - } elsif ($notes =~ /^(\(((\^)?(g|q)?(\,|\')*(x|xx|b|bb|n)?\d*\.*(\-|A|B|C|D|E|F|G)t?\+?){3}\))(.*)$/) { # a triplet + } elsif ($notes =~ /^(\(((\^)?(g|q)?(\,|\')*(x|xx|b|bb|n)?\d*\.*(\-|A|B|C|D|E|F|G)t?\+?}?){3}\))(.*)$/) { # a triplet ($triplet, $notes) = ($1,$8); # print "TRIPLET: ".$triplet." -> "; - $triplet =~ /^\(((\^)?(g|q)?(\,|\')*(x|xx|b|bb|n)?\d*\.*(\-|A|B|C|D|E|F|G)t?\+?)(.*)\)$/gs; + $triplet =~ /^\(((\^)?(g|q)?(\,|\')*(x|xx|b|bb|n)?\d*\.*(\-|A|B|C|D|E|F|G)t?\+?}?)(.*)\)$/gs; ($note, $triplet) = ($1,$7); #print "$note $triplet\n"; parse_note($note, $keysig, '<tuplet type="start"/>', ' <time-modification> @@ -327,10 +333,10 @@ sub parse_notes { <actual-notes>3</actual-notes> <normal-notes>2</normal-notes> </time-modification>', $qq); - } elsif ($notes =~ /^((\d+)\(((\^)?(g|q)?(\,|\')*(x|xx|b|bb|n)?\d*\.*(\-|A|B|C|D|E|F|G)t?\+?)+\;(\d+)\))(.*)$/) { # an n-tuplet + } elsif ($notes =~ /^((\d+)\(((\^)?(g|q)?(\,|\')*(x|xx|b|bb|n)?\d*\.*(\-|A|B|C|D|E|F|G)t?\+?}?)+\;(\d+)\))(.*)$/) { # an n-tuplet ($tuplet, $notes) = ($1,$10); # print "N-TUPLET: ".$tuplet." -> "; - $tuplet =~ /^(\d+)\(((\,|\')*(x|xx|b|bb|n)?\d*\.*(g|q)?(\-|A|B|C|D|E|F|G)t?\+?)(.*);(\d)\)$/gs; + $tuplet =~ /^(\d+)\(((\,|\')*(x|xx|b|bb|n)?\d*\.*(g|q)?(\-|A|B|C|D|E|F|G)t?\+?}?)(.*);(\d)\)$/gs; ($combdur, $note, $tuplet, $numval) = ($1,$2,$7,$8); #print "i=$combdur, n=$numval; $note / $tuplet\n"; my $ind_dur = duration($combdur)/$numval; @@ -340,7 +346,7 @@ sub parse_notes { <actual-notes>'.$act_notes.'</actual-notes> <normal-notes>1</normal-notes> </time-modification>', $qq); - while ($tuplet =~ /^((g|q)?(\,|\')*(x|xx|b|bb|n)?\d*\.*(\-|A|B|C|D|E|F|G)t?\+?)(.+)$/gs) { + while ($tuplet =~ /^((g|q)?(\,|\')*(x|xx|b|bb|n)?\d*\.*(\-|A|B|C|D|E|F|G)t?\+?}?)(.+)$/gs) { ($note, $tuplet) = ($1,$6); #print "$note / $tuplet\n"; parse_note($note, $keysig, '', ' <time-modification> @@ -440,7 +446,7 @@ sub parse_notes { </note> '; } - elsif ($notes =~ s/(\d+\.*)\(((g|q)?(\,|\')*(x|xx|b|bb|n)?\d*\.*(\-|A|B|C|D|E|F|G)t?\+?)\)/\($1$2\)/gs) { # pull duration into fermata parentheses + elsif ($notes =~ s/(\d+\.*)\(((g|q)?(\,|\')*(x|xx|b|bb|n)?\d*\.*(\-|A|B|C|D|E|F|G)t?\+?}?)\)/\($1$2\)/gs) { # pull duration into fermata parentheses # print "after replacement: $notes\n"; exit; } elsif ($notes =~ /^ +(.*)$/) { @@ -474,8 +480,8 @@ sub parse_note { $fermata = 1; } - $note =~ /^(\^)?(g|q)?((\,|\')*)(x|xx|b|bb|n)?(\d*)(\.*)(\-|A|B|C|D|E|F|G)(t?)(\+?)$/; - my ($chord, $gracecue, $oct, $acc, $dur, $dot, $pitch, $trill, $tie) = ($1, $2, $3, $5, $6, $7, $8, $9, $10); + $note =~ /^(\^)?(g|q)?((\,|\')*)(x|xx|b|bb|n)?(\d*)(\.*)(\-|A|B|C|D|E|F|G)(t?)(\+?)(}?)$/; + my ($chord, $gracecue, $oct, $acc, $dur, $dot, $pitch, $trill, $tie, $beamend) = ($1, $2, $3, $5, $6, $7, $8, $9, $10, $11); print OUT ' <note> '; @@ -534,8 +540,20 @@ sub parse_note { # If we have an explicit accidental on the note, print the <accidental> tag print OUT accidental_explicit ($acc); + # addition is typically empty or a time-modification tag print OUT $addition; + # print out beaming information if needed: + if ($BEAM == 1) { + print OUT " <beam>begin</beam>\n"; + $BEAM = 2; + } elsif (($BEAM > 0) && ($beamend eq "}")) { + print OUT " <beam>end</beam>\n"; + $BEAM = 0; + } elsif ($BEAM > 0) { + print OUT " <beam>continue</beam>\n"; + } + my $notationbracket = $fermata || $tienotation || ($trill eq "t") || ($notation ne ""); if ($notationbracket) { print OUT " <notations>\n"; diff --git a/sample_files/Beams.pae b/sample_files/Beams.pae new file mode 100644 index 0000000000000000000000000000000000000000..892342901f7e6a72d5a56840fe1690fcaf331daa --- /dev/null +++ b/sample_files/Beams.pae @@ -0,0 +1,7 @@ +Test Composer +Test case for beams +1.1.1: S beams +plain&easy: %G-2@4/4$bBEA� {''6E'B8G}{GA}-''C{'3B8..G}// + +Test Library +00000000 \ No newline at end of file