The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Music::Chord::Progression::NRO - Generate Neo-Riemann chord progressions

VERSION

version 0.0308

SYNOPSIS

  use MIDI::Util qw(setup_score midi_format);
  use Music::Chord::Progression::NRO ();

  my $nro = Music::Chord::Progression::NRO->new;
  my $chords = $nro->generate;
  $chords = $nro->circular;

  # render a midi file
  my $score = setup_score();
  $score->n('wn', midi_format(@$_)) for @$chords;
  $score->write_score('nro.mid');

DESCRIPTION

The Music::Chord::Progression::NRO module generates Neo-Riemann chord progressions.

ATTRIBUTES

base_note

  $base_note = $nro->base_note;

The initial isobase, capitalized note on which the progression starts.

Default: C

base_octave

  $base_octave = $nro->base_octave;

The initial note octave on which the progression starts.

Default: 4

base_scale

  $base_scale = $nro->base_scale;

The major or minor quality of the initial chord.

Default: major

base_chord

  $base_chord = $nro->base_chord;

The chord given by the base_note, base_octave, and the base_scale.

format

  $format = $nro->format;

The format of the returned results, as either named ISO notes or midinum integers.

Default: ISO

max

  $max = $nro->max;

The maximum number of circular transformations to make.

Default: 4

transform

  $transform = $nro->transform;

The array-reference of Neo-Riemann transformations that define the chord progression.

Please see the Music::NeoRiemannianTonnetz module for the allowed transformations.

This can also be given as an integer, which defines the number of random transformations to perform.

Additionally the "non-transformation", X is allowed to return the the initial chord.

Default: 4

verbose

  $verbose = $nro->verbose;

Show progress.

Default: 0

nrt

  $nrt = $nro->nrt;

The Music::NeoRiemannianTonnetz object.

METHODS

new

  $nro = Music::Chord::Progression::NRO->new; # use defaults

  $nro = Music::Chord::Progression::NRO->new( # override defaults
    base_note   => 'Bb',
    base_octave => 5,
    base_scale  => 'minor',
    format      => 'midinum',
    max         => 12,
    transform   => [qw(X PRL R L R L R)],
  );

Create a new Music::Chord::Progression::NRO object.

generate

  $chords = $nro->generate;

Generate a *linear* series of transformed chords.

circular

  $chords = $nro->circular;

Generate a series of transformed chords based on a circular list of transformations.

The eg/nro-chain program puts it this way:

"Use a circular list ("necklace") of Neo-Riemannian transformations, plus "X" meaning "make no transformation." Starting at position zero, move forward or backward along the necklace, transforming the current chord..."

SEE ALSO

The t/01-methods.t and eg/* files

Carp

Data::Dumper::Compact

Moo

Music::NeoRiemannianTonnetz

Music::Chord::Note

Music::Chord::Namer

https://viva.pressbooks.pub/openmusictheory/chapter/neo-riemannian-triadic-progressions/

AUTHOR

Gene Boggs <gene@cpan.org>

COPYRIGHT AND LICENSE

This software is Copyright (c) 2023 by Gene Boggs.

This is free software, licensed under:

  The Artistic License 2.0 (GPL Compatible)