Sorry for all the ? replacing the tabs in my last post -
not sure which step made that transformation -
I try again after removing all the tabs

Jim

I have been using a perl regular expression to parse lilypond notes for my own 
application,
which handles guitar notes with possible right hand, left hand, plectrum, 
string, glissando markings.
Thus it only includes some of the features of lilypond notes.  It assumes 
english note names
(easily modified).

$noteRE = '
(?<original>
        (
                (
                        (<      # lilypond grouping
(?<pitch>                               # $-{pitch}[0]
                                        (?<name> [a-g](ss*|ff*)?\b)     # 
$-{name}[0]
                                        (?<octave> (,,*|\'\'*)?)        # 
$-{octave}[0]
                                )
                                (?<duration> (\d+\.*)?)                 # 
$-{duration}[0]
                                (
                                        ((\\\(?<string> [1-6]))?)       # 
$-{string}[0]
                                        |
                                        (((-(?<LH> [0-4])) | none )?)           
# $-{LH}[0]
                                        |
                                        (?<plectrum> \\\downbow|\\\upbow)       
# $-{plectrum}[0]
                                        |
                                        (?<PIMA> -?\\\(RH|rightHandFinger)\ 
\#[0-4]\ )  # $-{PIMA}[0]
                                )*
                        >)      # lilypond grouping
                        (

                                ((\\\(?<glissando> glissando))?)        # 
$-{glissando}[0]
                                |
                                (?<duration> (\d+\.*)?)         # 
$-{duration}[1]
                                |
                                (?<other> ([\\^_\-]"\S")?  | \S*) # other 
arbitrary constructs
                        )*
                )
                |
                (
                        (       # without lilypond grouping
(?<pitch>                               # $-{pitch}[1]
                                        (?<name> [a-g](ss*|ff*)?\b)     # 
$-{name}[1]
                                        (?<octave> (,,*|\'\'*)?)        # 
$-{octave}[1]
                                )
                                (?<duration> (\d+\.*)?)                 # 
$-{duration}[2]
                                (
                                        ((\\\(?<string> [1-6]))?)       # 
$-{string}[1]
                                        |
                                        (((-(?<LH> [0-4])) | none )?)           
# $-{LH}[1]
                                        |
                                        (?<plectrum> \\\downbow|\\\upbow)       
# $-{plectrum}[1]
                                        |
                                        (?<PIMA> -?\\\(RH|rightHandFinger)\ 
\#[0-4]\ )  # $-{PIMA}[1]
                                )*
                        )       # without lilypond grouping
                        (
                                (?<duration> (\d+\.*)?)         # 
$-{duration}[3]
                                |
                                ((\\\(?<glissando> glissando))?)        # 
$-{glissando}[1]
                                |
                                (?<other> ([\\^_\-]"\S")?  | \S*) # other 
arbitrary constructs
                        )*
                )
        )
        |
        (
                (?<pitch>                               # $-{pitch}[2]
                        (?<name> [rR])                  # $-{name}[2]
                )
                (?<duration> (\d+\.*)?)                 # $-{duration}[4]
        )
)
';



I use the regular expression $noteRE in the following parse function which 
creates a note object:

sub parsenote {
        my($self, $lilynote) = @_;

        # best used on new note: may reset e.g. duration
        # if called on pitch of existing note

        unless((defined $lilynote) and $lilynote) {
                Error(Trace("Cannot parse note: input lilynote is not 
defined"));
                return 0;
        }

        # simple case of name and octave
        if($lilynote =~ /^([ra-gA-G][sf]*)([,']*)$/) {
                $self->set_type('note');
                $self->set_pitch($lilynote);
                $self->set_name($1);
                $self->set_octave($2);
                return(1);
        }

        $lilynote =~ /$noteRE/x or return 0;

        $self->set_type('note');
        if(defined $-{pitch}[0]) {
                $self->set_pitch($-{pitch}[0]);
        }elsif(defined $-{pitch}[1]) {
                $self->set_pitch($-{pitch}[1]);
        }elsif(defined $-{pitch}[2]) {
                $self->set_pitch($-{pitch}[2]);
        }
        if(defined $-{name}[0]) {
                $self->set_name($-{name}[0]);
        }elsif(defined $-{name}[1]) {
                $self->set_name($-{name}[1]);
        }elsif(defined $-{name}[2]) {
                $self->set_name($-{name}[2]);
        }
        if(defined $-{octave}[0]) {
                $self->set_octave($-{octave}[0]);
        }elsif(defined $-{octave}[1]) {
                $self->set_octave($-{octave}[1]);
        }
        if(defined $-{duration}[0]) {
                $self->set_duration($-{duration}[0]);
        }elsif(defined $-{duration}[1]) {
                $self->set_duration($-{duration}[1]);
        }elsif(defined $-{duration}[2]) {
                $self->set_duration($-{duration}[2]);
        }elsif(defined $-{duration}[3]) {
                $self->set_duration($-{duration}[3]);
        }elsif(defined $-{duration}[4]) {
                $self->set_duration($-{duration}[4]);
        }
        if(defined $-{string}[0]) {
                $self->set_string($-{string}[0]);
        }elsif(defined $-{string}[1]) {
                $self->set_string($-{string}[1]);
        }
        if(defined $-{LH}[0]) {
                $self->set_LH($-{LH}[0]);
        }elsif(defined $-{LH}[1]) {
                $self->set_LH($-{LH}[1]);
        }
        if(defined $-{PIMA}[0]) {
                $self->set_PIMA($-{PIMA}[0]);
        }elsif(defined $-{PIMA}[1]) {
                $self->set_PIMA($-{PIMA}[1]);
        }
        if(defined $-{plectrum}[0]) {
                $self->set_plectrum($-{plectrum}[0]);
        }elsif(defined $-{plectrum}[1]) {
                $self->set_plectrum($-{plectrum}[1]);
        }
        if((defined $-{glissando}[0]) and $-{glissando}[0]) {
                my $j = "\\" . $-{glissando}[0];
                $self->set_glissando( $j );
        }elsif((defined $-{glissando}[1]) and $-{glissando}[1]) {
                my $j = "\\" . $-{glissando}[1];
                $self->set_glissando( $j );
        }

        if($lilynote eq $-{original}[0]) {
                # do not actually reset original, so you can use this parse
                # function to e.g. change the octave, without changing, say, 
gliss
                # $self->set_original($lilynote);
        }else{
                #die "parsenote: input $lilynote output ",$-{original}[0];
                Error(Trace("Cannot parse input $lilynote : only found 
",$-{original}[0]));
                return 0;
        }

        # fret is used in computation but not present in note format
        if( defined $self->get_string and $self->get_string and defined 
$self->get_pitch and $self->get_pitch ) {
                $self->set_fret( 
$stringAndPitch2Fret[$self->get_string]{$self->get_pitch} );
        }

        return 1;
}



_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to