App-Music-ChordPro

 view release on metacpan or  search on metacpan

lib/ChordPro/Chords/Parser.pm  view on Meta::CPAN

	$info->{root_canon} = $info->{root} =
	  $p->root_canon( $info->{root_ord},
			  $dir > 0,
			  $info->{qual_canon} eq "-" );
    }
    if ( $self->{bass} && $self->{bass} ne "" && $self->{bass} !~ /^\d+$/ ) {
	$info->{bass_ord} = ( $self->{bass_ord} + $xpose ) % $p->intervals;
	$info->{bass_canon} = $info->{bass} =
	  $p->root_canon( $info->{bass_ord}, $xpose > 0 );
	$info->{bass_mod} = $dodir->( $info->{bass_ord}, $dir );
    }
    $info->{root_mod} = $dodir->( $info->{root_ord}, $dir );
    $info->{name} = $info->{name_canon} = $info->canonical;

    delete $info->{$_} for qw( copy base frets fingers keys display );

    return $info;
}

sub transcode ( $self, $xcode, $key_ord = 0 ) {
    return $self unless $xcode;
    return $self unless $self->is_chord;
    return $self if $self->{system} eq $xcode;
    my $info = $self->dclone;
#warn("_>_XCODE = $xcode, _SELF = $self->{system}, CHORD = $info->{name}");
    $info->{system} = $xcode;
    my $p = $self->{parser}->get_parser($xcode);
    die("OOPS ", $p->{system}, " $xcode") unless $p->{system} eq $xcode;
    $info->{parser} = $p;
    if ( $key_ord && $p->movable ) {
	$info->{root_ord} -= $key_ord % $p->intervals;
    }
#    $info->{$_} = $p->{$_} for qw( ns_tbl nf_tbl ns_canon nf_canon );
    unless ( $self->{rootless} ) {
	$info->{root_canon} = $info->{root} =
	  $p->root_canon( $info->{root_ord},
			  $info->{root_mod} >= 0,
			  $info->{qual_canon} eq "-" );
    }
    if ( $p->{system} eq "roman" && $info->{qual_canon} eq "-" ) {
	# Minor quality is in the root name.
	$info->{qual_canon} = $info->{qual} = "";
    }
    if ( $self->{bass} && $self->{bass} ne "" ) {
	if ( $key_ord && $p->movable ) {
	    $info->{bass_ord} -= $key_ord % $p->intervals;
	}
	$info->{bass_canon} = $info->{bass} =
	  $p->root_canon( $info->{bass_ord}, $info->{bass_mod} >= 0 );
    }
    $info->{name} = $info->{name_canon} = $info->canonical;
    $info->{system} = $p->{system};
    bless $info => $p->{target};
#    ::dump($info);
#warn("_<_XCODE = $xcode, CHORD = ", $info->canonical);
    return $info;
}

sub chord_display ( $self ) {

    $self->SUPER::chord_display
      ( $::config->{"chord-formats"}->{common}
	// $::config->{settings}->{"chord-format"}
	// "%{name}" );
}

################ Chord objects: Nashville ################

package ChordPro::Chord::Nashville;

our @ISA = 'ChordPro::Chord::Base';

sub transpose ( $self, $dummy1, $dummy2=0 ) { $self }

sub show {
    Carp::croak("call canonical instead of show");
}

sub canonical ( $self ) {
    my $res = $self->{root_canon} . $self->{qual} . $self->{ext};
    if ( $self->{bass} && $self->{bass} ne "" ) {
	$res .= "/" . lc($self->{bass});
    }
    return $res;
}

sub chord_display ( $self ) {

    $self->SUPER::chord_display
      ( $::config->{"chord-formats"}->{nashville}
	// "%{name}" );
}

# Key name.
sub keyname( $k ) {
    return $k->{parser}->root_canon( $k->{root_ord} ) .
      ( $k->{qual_canon} eq '-' ? "m" : "" );
}

################ Chord objects: Roman ################

package ChordPro::Chord::Roman;

our @ISA = 'ChordPro::Chord::Base';

sub transpose ( $self, $dummy1, $dummy2=0 ) { $self }

sub show {
    Carp::croak("call canonical instead of show");
}

sub canonical ( $self ) {
    my $res = $self->{root_canon} . $self->{qual} . $self->{ext};
    if ( $self->{bass} && $self->{bass} ne "" ) {
	$res .= "/" . lc($self->{bass});
    }
    return $res;
}

sub chord_display ( $self ) {

    $self->SUPER::chord_display
      ( $::config->{"chord-formats"}->{roman}
	// "%{name}" );
}

# Key name.
sub keyname( $k ) {
    return $k->{parser}->root_canon( $k->{root_canon}, 0, $k->{qual_canon} eq '-' );
}

################ Chord objects: Annotations ################

package ChordPro::Chord::Annotation;

use String::Interpolate::Named;

our @ISA = 'ChordPro::Chord::Base';

sub transpose ( $self, $dummy1, $dummy2=0 ) { $self }
sub transcode ( $self, $dummy1, $dummy2=0 ) { $self }

sub canonical ( $self ) {
    my $res = $self->{text};
    return $res;
}

sub chord_display ( $self ) {
    return interpolate( { args => $self }, $self->{text} );
}

# For convenience.
sub is_chord      ( $self ) { 0 };
sub is_annotation ( $self ) { 1 };

################ Chord objects: Strums ################

package ChordPro::Chord::Strum;

# Special 'chord'-like objects for strums in grids.
#
# Main purpose is to show an arrow from the ChordProSymbols font.

our @ISA = 'ChordPro::Chord::Base';

use ChordPro::Symbols qw( strum );

sub new( $pkg, $data ) {
    my $self = $pkg->SUPER::new( $data );
    my $fmt = strum( $data->{name} );
    unless ( defined $fmt ) {
	warn("Unknown strum: $data->{name}\n");
	$self->{format} = "";
    }
    else {
	$self->{format} = $fmt;
    }
    return $self;
}

sub chord_display ( $self, $default = undef ) {
    $self->{format};
}

sub transpose ( $self, $dummy1, $dummy2=0 ) { $self }
sub transcode ( $self, $dummy1, $dummy2=0 ) { $self }

sub canonical ( $self ) {
    my $res = $self->{text};
    return $res;
}

# For convenience.
sub is_chord      ( $self ) { 0 };
sub is_annotation ( $self ) { 1 };
sub is_nc         ( $self ) { 1 };
sub is_xpxc       ( $self ) { 0 };
sub has_diagram   ( $self ) { 0 };
sub is_gridstrum  ( $self ) { 1 };

################ Chord objects: NC ################

package ChordPro::Chord::NC;

use String::Interpolate::Named;

our @ISA = 'ChordPro::Chord::Base';

sub transpose ( $self, $dummy1, $dummy2=0 ) { $self }
sub transcode ( $self, $dummy1, $dummy2=0 ) { $self }

sub canonical ( $self ) {
    my $res = $self->{name};
    return $res;
}

sub chord_display ( $self ) {
    return interpolate( { args => $self }, $self->{name} );
}

# For convenience.
sub is_nc         ( $self ) { 1 };
sub is_chord      ( $self ) { 0 };
sub is_annotation ( $self ) { 0 };
sub has_diagram   ( $self ) { 0 };

################ Testing ################

package main;



( run in 1.228 second using v1.01-cache-2.11-cpan-5735350b133 )