NAME

Music::ModalFunction - Inspect musical modal functions

VERSION

version 0.0502

SYNOPSIS

use Music::ModalFunction ();

# What chords do C major and A minor have in common?
my $m = Music::ModalFunction->new(
  mode_note    => 'c',
  mode         => 'ionian',
  key_note     => 'a',
  key          => 'aeolian',
);
my $results = $m->pivot_chord_keys; # 7 common chords

# What chords do C major and F♯ (G♭) major have in common?
$m = Music::ModalFunction->new(
  mode_note    => 'c',
  mode         => 'ionian',
  key_note     => 'gb',
  key          => 'ionian',
);
$results = $m->pivot_chord_keys; # No chords in common!

# What modes can have a Dmaj dominant chord?
$m = Music::ModalFunction->new(
  chord_note   => 'd',
  chord        => 'maj',
  key_function => 'dominant',
);
$results = $m->chord_key;
# [[ 'chord_key', 'd', 'maj', 'g', 'ionian', 'dominant', 'r_V' ],
#  [ 'chord_key', 'd', 'maj', 'g', 'lydian', 'dominant', 'r_V' ]]
# So the answers are G Ionian and G Lydian.

# In what modes can a Gmaj chord function as a subdominant pivot chord?
$m = Music::ModalFunction->new(
  chord_note   => 'g',
  chord        => 'maj',
  key_function => 'subdominant',
  hash_results => 1,
);
$results = $m->pivot_chord_keys;
# [{ method => 'pivot_chord_keys', chord_note => 'g', chord => 'maj', mode_note => 'c', mode => 'ionian', mode_function => 'dominant', mode_roman => 'r_V', key_note => 'd', key => 'dorian', key_function => 'subdominant', key_roman => 'r_IV' },
#  { method => 'pivot_chord_keys', chord_note => 'g', chord => 'maj', mode_note => 'c', mode => 'ionian', mode_function => 'dominant', mode_roman => 'r_V', key_note => 'd', key => 'ionian', key_function => 'subdominant', key_roman => 'r_IV' },
#  { method => 'pivot_chord_keys', chord_note => 'g', chord => 'maj', mode_note => 'c', mode => 'ionian', mode_function => 'dominant', mode_roman => 'r_V', key_note => 'd', key => 'mixolydian', key_function => 'subdominant', key_roman => 'r_IV' },
#  ... ]
# Inspecting all the results, we see that the answers are D Dorian, D Ionian, and D Mixolydian.

# compare non-modal scales
$m = Music::ModalFunction->new(
    mode_note  => 'c',
    mode       => 'diminished',
    key_note   => 'c',
    key        => 'harmonic_minor',
    use_scales => 1,
);
$results = $m->pivot_chord_keys;
# [ 'pivot_chord_keys', 'd', 'dim', 'c', 'diminished', 'flat2', 'r_bII', 'c', 'harmonic_minor', 'supertonic', 'r_ii' ],
# [ 'pivot_chord_keys', 'b', 'dim', 'c', 'diminished', 'leading_tone', 'r_vii', 'c', 'harmonic_minor', 'subtonic', 'r_vii' ],

DESCRIPTION

Music::ModalFunction allows querying of a musical database of Prolog facts and rules that bind notes, chords, modes/scales, keys and diatonic functionality. In this database, the facts are all called chord_key and the rules are pivot_chord_keys and roman_key.

Wikipedia puts it this way, "A common chord, in the theory of harmony, is a chord that is diatonic to more than one key or, in other words, is common to (shared by) two keys."

To bind a value to a fact or rule argument, declare it in the object constructor. Unbound arguments will return all the possible values that make the query true.

The essential question is, "Can a chord in one key function in a second?" Any parts of this open-ended question may be unbound, thereby resulting in all possible truths.

nb: The names "mode" (and "scale"), and "key" below, are both used to mean modes (or scales) 1 and 2, respectively. But for some reason I chose to use "key" even though that is confusing. Argh! :|

ATTRIBUTES

chord_note

c, db, d, eb, e, f, gb, g, ab, a, bb, or b

* Sharps are not used - only flats.

chord

maj, min, or dim

mode_note

c, db, d, eb, e, f, gb, g, ab, a, bb, or b

mode

ionian, dorian, phrygian, lydian, mixolydian, aeolian, or locrian

mode_function

tonic, supertonic, mediant, subdominant, dominant, submediant, leading_tone, or subtonic

mode_roman

r_I, r_ii, r_iii, r_IV, r_V, r_vi, or r_vii

key_note

c, db, d, eb, e, f, gb, g, ab, a, bb, or b

key

ionian, dorian, phrygian, lydian, mixolydian, aeolian, or locrian

key_function

tonic, supertonic, mediant, subdominant, dominant, submediant, leading_tone, or subtonic

key_roman

r_I, r_ii, r_iii, r_IV, r_V, r_vi, or r_vii

hash_results

Return the query results as a list of named hash references.

Default: 0

use_scales

Use alternative scales instead of modes.

Default: 0

scales

augmented, blues, diminished, harmonic_minor, melodic_minor, pentatonic, or pentatonic_minor

verbose

Default: 0

METHODS

new

$m = Music::ModalFunction->new(%args);

Create a new Music::ModalFunction object.

If defined, argument values will be bound to a variable. Otherwise an unbound variable is used for the queries detailed below.

chord_key

$results = $m->chord_key;

Ask the database a question about what chords are in what keys.

Constructor arguments:

chord_note, chord, key_note, key, key_function, key_roman

Here, chord_note and chord together are the named chord defined within the context of the key_note and key. The chord's function in the key is the key_function and basically indicates the relative scale position. The key_roman argument serves as an indicator of both the chord quality and the position in the scale.

pivot_chord_keys

$results = $m->pivot_chord_keys;

Ask the database a question about what chords share common keys.

Constructor arguments:

chord_note, chord, mode_note, mode, mode_function, mode_roman, key_note, key, key_function, key_roman

Here, chord_note and chord together are the named chord defined within the context of the mode_note and mode. The chord's function in the mode is the mode_function and basically indicates the relative scale position. The mode_roman argument serves as an indicator of both the chord quality and the position in the scale. The key_note and key are the final "destination" of the query transformation (often a pivot). The function of the chord in the "destination" is key_function. As with mode_roman, key_roman is the resulting chord quality and scale position.

roman_key

$results = $m->roman_key;

Ask the database a question about what Roman numeral functional chords share common keys.

Constructor arguments:

mode, mode_roman, key, key_roman

SEE ALSO

The t/01-methods.t and eg/* files in this distribution

Moo

AI::Prolog

MIDI::Util

Music::Note

Music::Scales

https://en.wikipedia.org/wiki/Prolog

https://en.wikipedia.org/wiki/Common_chord_(music)

https://en.wikipedia.org/wiki/Closely_related_key

https://ology.github.io/2023/06/05/querying-a-music-theory-database/ is the write-up about using this module

AUTHOR

Gene Boggs <gene@cpan.org>

COPYRIGHT AND LICENSE

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

This is free software, licensed under:

The Artistic License 2.0 (GPL Compatible)