Commit 2610a3bd authored by Reinhold Kainhofer's avatar Reinhold Kainhofer
Browse files

Add -f cmd-line param to distinguish RISM files and pure P&E files (without...

Add -f cmd-line param to distinguish RISM files and pure P&E files (without any metadata, just incipits)
parent a44f5d1c
......@@ -18,6 +18,9 @@ our $version = "1.0";
# import module
use Getopt::Long;
use File::Basename;
our $format = 'rism';
sub print_help {
print 'pae2xml.pl [OPTIONS...] FILE
......@@ -26,6 +29,9 @@ sub print_help {
Possible options:
-h, --help Prints out this help message
--format=FORMAT, -f FORMAT
Interprets input file as FORMAT. Possible values are
rism, pae (default: rism)
-v, -- version Prints out version information
';
}
......@@ -38,7 +44,7 @@ sub print_version {
sub handle_options {
my $print_help = 0;
my $print_version = 0;
my $result = GetOptions ("help|h" => \$print_help, "version|v" => \$print_version);
my $result = GetOptions ("f|format=s" => \$format, "help|h" => \$print_help, "version|v" => \$print_version);
if ($print_version) {
print_version ();
exit 0;
......@@ -64,36 +70,49 @@ $TIE = 0;
foreach $a (@ARGV) {
$p = read_file($a);
$toprint = "";
$p =~ s/\s*\=\=+\s*(.*?)\s*\=\=+\s*/$1/sg;
$p =~ s/\s*included.*?-------------*\s*(.*?)\s*/$1/s;
if ($format eq "rism") {
$p =~ s/\s*\=\=+\s*(.*?)\s*\=\=+\s*/$1/sg;
$p =~ s/\s*included.*?-------------*\s*(.*?)\s*/$1/s;
($q, $r) = ($p, $p);
if ($q !~ /^.*1\.1\.1.*$/gsx && $r =~ /^.*plain.*$/gsx) {
print_error("$a contains 'plain', but not 1.1.1!\n");
} else {
if ($p =~ /^\s*([^\n]+)\n(.*?)\n((\d+\.\d+\.\d.*?plain.*?\n)+)(.*?)\n?([^\n]+)\n([^\n]+)\s*$/gs) {
my ($comp, $title, $incipits, $sonst, $libsig, $rismsig) = ($1, $2, $3, $5, $6, $7);
($q, $r) = ($p, $p);
if ($q !~ /^.*1\.1\.1.*$/gsx && $r =~ /^.*plain.*$/gsx) {
print_error("$a contains 'plain', but not 1.1.1!\n");
} else {
if ($p =~ /^\s*([^\n]+)\n(.*?)\n((\d+\.\d+\.\d.*?plain.*?\n)+)(.*?)\n?([^\n]+)\n([^\n]+)\s*$/gs) {
my ($comp, $title, $incipits, $sonst, $libsig, $rismsig) = ($1, $2, $3, $5, $6, $7);
$toprint .= "
$toprint .= "
COMPOSER: $comp
TITLE: $title
INCIPIT(S): $incipits
OTHER INFO: $sonst
LIB. SIGN.: $libsig
RISM SIGN.: $rismsig\n\n";
parse_incipits($incipits, $comp, $title, $sonst, $libsig, $rismsig);
}
else {
if (index($p,"plain&easy") > -1) {
print_error("Ignoring the following text:\n\n\n$p\n\n\n");
parse_rism_incipits($incipits, $comp, $title, $sonst, $libsig, $rismsig);
}
else {
if (index($p,"plain&easy") > -1) {
print_error("Ignoring the following text:\n\n\n$p\n\n\n");
}
}
}
} else {
# Just a plaine & easie snippet, without any further RISM fields
if ($a eq "-") {
$filename = "out.xml";
} else {
$filename = basename ($a, ".pae") . ".xml";
}
parse_pe ($filename, $p, "", "", "", "", "", "", "");
}
}
##############################################################################
### RISM file parsing
##############################################################################
sub parse_incipits {
sub parse_rism_incipits {
my ($incipits, $comp, $title, $sonst, $libsig, $rismsig) = @_;
$toprint .= "parsing: $incipits\n";
......@@ -101,24 +120,50 @@ sub parse_incipits {
while ($incipits =~ /^(\d+\.\d+\..+?)(\d+\.\d+\..*)$/gs) {
my ($inc1) = $1;
$incipits = $2;
parse_pe($inc1, $comp, $title, $sonst, $libsig, $rismsig);
parse_rism_incipit($inc1, $comp, $title, $sonst, $libsig, $rismsig);
}
parse_pe($incipits, $comp, $title, $sonst, $libsig, $rismsig);
parse_rism_incipit($incipits, $comp, $title, $sonst, $libsig, $rismsig);
}
sub parse_pe {
sub parse_rism_incipit {
my ($pe, $comp, $title, $sonst, $libsig, $rismsig) = @_;
if ($pe =~ /^\s*(\d+\.\d+\.\d)(\.|:)\s*(.*?)\nplain&easy:\s*(.*)$/gs) {
my ($inr, $instr, $pecode) = ($1, $3, $4);
my $filename="$rismsig-$inr.xml";
$filename =~ s/RISM\s*A\/II\s*:?\s*//gs;
foreach $_ ($rismsig,$title,$inr,$instr,$comp,$libsig,$sonst)
{
s/
//;
}
$toprint .= "
INCIPIT NO.: $inr
INSTR.: $instr\n";
parse_pe ($filename, $pecode, $inr, $instr, $comp, $title, $sonst, $libsig, $rismsig);
} else {
print_error("could not parse $pe\n");
}
}
##############################################################################
### pure Plaine & Easie data parsing
##############################################################################
sub parse_pe {
my ($filename, $pe, $inr, $instr, $comp, $title, $sonst, $libsig, $rismsig) = @_;
$pe =~ s/@/@0/gs; # make missing time signature explicit
while ($pe =~ s/([^\-])(\d+)(\'|\,)(A|B|C|D|E|F|G)/$1$3$2$4/gs) {}; # octave first, then duration. Truly global.
if ($pe =~ /^\s*(\d+\.\d+\.\d)(\.|:)\s*(.*?)\nplain&easy:\s*(%([\w\-\d]+))?(@([\d\w\/]+))?\s*&?\s*(\$([^]+))?(.*)$/gs) {
my ($inr, $instr, $clef, $timesig, $keysig, $rest) = ($1, $3, $5, $7, $9, $10);
if ($pe =~ /\s*(%([\w\-\d]+))?(@([\d\w\/]+))?\s*&?\s*(\$([^]+))?(.*)$/gs) {
my ($clef, $timesig, $keysig, $rest) = ($2, $4, $6, $7);
my $filename="$rismsig-$inr.xml";
$filename =~ s/RISM\s*A\/II\s*:?\s*//gs;
print "Writing $filename...\n";
open(OUT, ">$filename");
if ($clef =~ /^(\w)\-(\d)$/) {
......@@ -138,28 +183,25 @@ sub parse_pe {
print_error("Strange key signature '$keysig'.\n");
}
foreach $_ ($rismsig,$title,$inr,$instr,$comp,$encoding_date,$libsig,$sonst)
{
s/
//;
}
print OUT '<?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
<!DOCTYPE score-partwise PUBLIC "-//Recordare//DTD MusicXML 2.0 Partwise//EN" "http://www.musicxml.org/dtds/partwise.dtd">
<score-partwise>
<work>
<work-number>'.$rismsig.'</work-number>
<work-title>'.$title.'</work-title>
</work>
<movement-number>'.$inr.'</movement-number>
<movement-title>'.$instr.'</movement-title>
<identification>
<creator type="composer">'.$comp.'</creator>
<encoding>
';
print OUT " <work>\n" if ($rismsig || $title);
print OUT " <work-number>$rismsig</work-number>\n" if ($rismsig);
print OUT " <work-title>$title</work-title>\n" if ($title);
print OUT " </work>\n" if ($rismsig || $title);
print OUT " <movement-number>$inr</movement-number>\n" if ($inr);
print OUT " <movement-title>$instr</movement-title>\n" if ($instr);
print OUT " <identification>\n";
print OUT " <creator type=\"composer\">$comp</creator>\n" if ($comp);
print OUT ' <encoding>
<software>pae2xml by R. Typke</software>
<encoding-date>'.$encoding_date.'</encoding-date>
</encoding>
<source>'.$libsig.'</source>
</identification>
';
print OUT " <source>$libsig</source>\n" if ($libsig);
print OUT ' </identification>
<part-list>
<score-part id="P1">
<part-name>'.$sonst.'</part-name>
......@@ -182,8 +224,6 @@ sub parse_pe {
$toprint .= "
INCIPIT NO.: $inr
INSTR.: $instr
CLEF: $clef
KEY SIG.: $keysig
TIME SIG.: $timesig
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment