Prof.Dr.Godfried-Willem RAES

<GMT> & Harmony Library Reference Manual: Module 3: Fuzzy Harmony Functions



CHAPTER 3: HARM_FUZ

Harmony functions and procedures based on Fuzzy-sets:

Files: source code now all included in g_mus.dll. Declarations for Power Basic are in g_mus.bi

These functions do not always use the binary shepard chord description. Here the octave position of notes in chords is a parameter in the calculation of the dissonance property. Thus 12,97 is less dissonant then 60,61. Under binary shepard reduction, this would not be the case. The functions and procedures contained herein make use of a data file containing expert data that form the base for the assignment of properties to harmonic and melodic intervals. This data file should never be renamed and should always be present in the same directory as the library and the applications main module.

Alphabetical list of Subs and functions in the module HARM_FUZ:

FUNCTION Cons% (crd%)
FUNCTION DisHar! (note1%, note2%)
FUNCTION DisHar3! (note1%, note2%, note3%)
FUNCTION Dismel! (note1%, note2%)
FUNCTION Flue!(note1%, note2%, note3%)
FUNCTION FuzFrameVar! (Chordnumberarray%(), framesize%)
SUB GetFuzzyData (FuzInt!())
SUB GetFuzzyMelo (FuzMel!())
FUNCTION HarForce (note1%, note2%) AS SINGLE
FUNCTION HarmFrameQual! (Chordnumberarray%(), framesize%)
FUNCTION HarmQual! (Chordnumberarray%())
FUNCTION MelForce (note1%, note2%) AS SINGLE
FUNCTION MelFrameQual! (MelodyArray%(), framesize%)
FUNCTION MeloQual! (Melodyarray%())
FUNCTION MelQualWeight! (Melodyarray%())
FUNCTION SecSolveQual! (Chordnumber1%, Chordnumber2%)
FUNCTION TritSolveQual! (Chordnumber1%, Chordnumber2%)

Users guide for fuzzy procedures and functions:

SUB GetFuzzyMelo (FuzMel!())

reads the lookup tables for melody fuzzyfication from a data-file on disk. This data file should be called gmt.ini and contains a section with relevant data. The user is free to change or modify the data for his own purposes. A call to this procedure is required prior to using any function related to melody in this library. In software versions older then V3.7 this data file was called "fuz-har.dat". If there is no data section in your gmt.ini file, the library will use our default.

SUB GetFuzzyData (FuzInt!())

reads the lookup tables for harmony fuzzification from the "gmt.ini" data-file on disk. A call to this procedure is required prior to using any function related to harmony in this library. In software versions older then V3.7 the data file used was called "fuz_har.dat". If there is no data section in your gmt.ini file, the library will use our default.

FUNCTION Dishar! (b1%, b2%)

Function returning a normalized value for the degree of dissonance of an harmonic interval consisting of 2 notes passed as midi values in b1% and b2%. The parameters must be midi note values.

FUNCTION Dishar3! (b1%, b2%, b3%)

Function returning a normalized value for the degree of dissonance in a 3-note chord. The parameters must be midi note values.

FUNCTION Dismel! (b1%, b2%)

Function returning a normalized value for the dissonance of a melodic interval. If b1% and b2% are the same, the function returns 0. The result depends on the data in the fuzzy data file.

FUNCTION Flue! (b1%, b2%, b3%)

Function returning a normalized value for the degree of fluency of a succesion of three notes passed as midi-numbers in b1%,b2%,b3%.

FUNCTION MeloQual! (Ml%())

Function returning a normalized value for the melodic quality of an arbitrary sequence of notes. The sequences should be passed to the function as a one-dimensional array. The returned value is not weighted.

FUNCTION MelQualWeight! (Ml%())

Function returning a normalized value for the melodic quality of an arbitrary sequence of notes. The sequence should be passed to the function as a one-dimensional array. The returned values is weighted over the complete size of the array.

FUNCTION MelFrameQual! (Ml%(), size%)

Function returning a normalized value for the melodic quality of an arbitrary sequence of notes. The sequence should be passed to the function as a one-dimensional array. The returned values is weighted over the last number of notes specified in size%. Size% should note be larger than the size of the array passed to the function.

FUNCTION HarmQual! (Hm%())

Function returning a normalized value for the harmonic quality of an arbitrary sequence of chords, given as an array of chordnumbers. The sequence should be passed to the function as a one-dimensional array. The function returns a fuzzy value for the global 'quality' of a harmonic sequence of chords, using shepard formatted chordnumbers. The result is weighted over history. The integration frame depends on the lenght of Ch%. Equal time distribution is assumed. An improved version would also take into account objective timing information in the weighting procedure, requiring the passing of a 2-dimensional array or a typed variable. Functions taking into account the amplitude relationships of individual notes in the chord are provided in the library section Harm_Psy

FUNCTION HarmQualWeight! (Hm%())

This function functions like HarmQual! but also performs integration over time. The chords passed to it as chordnumbers in the inputarray are assumed to be in order and equally distributed over time. The weighting takes place over the entire array.

FUNCTION HarmFrameQual! (ch%(), size%)

This function returns a normalised value for a chord sequence passed as a chordnumber array ch%() integrated over and limited in size% Thus the integration will take place only over a number of chords passed in size%. This function is an application of HarmQual! and makes use of its code.

FUNCTION Cons% (crd%)

This function returns 1 for consonants only. It is binary, for allother chords it returns 0. The function thus returns 1 for all consonant triads and duals. Single notes and 0 notes will be returned as consonant as well. The function makes internal use of a series of binary constants. Make sure the constant declaration is in your application program. (d0=1, d1=2, d3=4...)
This is a very classical function. We use it internally in other code in this library to speed up the calculations in HarmQual! and its derived functions (fuzzy library).
Only the following 7 chords (on C) can be consonants, if we consider chords containing seconds and/or tritons as dissonant.

I. 0000 1000 1001 classic minor chord [12 rotations]

II. 0001 0000 1001 major chord on Tc% + 8 = rotation nr.9 of III

III. 0000 1001 0001 classic major chord [12 rotations]

IV. 0001 0001 0001 beautiful symmetric chord (5+ major) [ 4 rotations]

V. 0010 0001 0001 minor chord on Tc% - 3 = rotation nr.10 of I

VI. 0001 0010 0001 minor chord on Tc% + 5 = rotation nr. 6 of I

VII. 0010 0010 0001 major chord on Tc% + 5 = rotation nr.6 of III

after removal of the redundant chords (chords appearing as rotations of another chord) it appears we have enough with only 3 types of triad in twelve-tone harmony. It also follows that no four-note-chord can be a consonant. This brief analysis reveals that we can have a maximum of 12+12+4 =28 consonant triads.

FUNCTION FuzFrameVar! (Hm%(), size%)

This function returns a normalized fuzzy value for the amount of harmonic (chordal) variation in a chord sequence passed to the function as an array of chordnumbers. If all chords are different, the function returns 1. If all chords are the same, it will return 0. The function considers only the last number of chords as specified in the parameter size%. There is no weighting over time in this function.

FUNCTION SecSolveQual! (crd1%, crd2%)

This function returns a vectorized value for the quality of the solution of minor or major seconds contained in crd1% into crd2%. crd1% and crd% constitute the chord sequence passed to it. The harmonic rules are: Minor seconds in crd1% should solve by enlargement to minor thirds in crd2%.Major seconds in crd2% should solve by enlargement to major thirds in crd2% However, this is not a tonal function! It does not make use of tonality context in the value returned.

FUNCTION TritSolveQual! (crd1%, crd2%)

This function returns a normalized value for the quality of the solution for eventual tritons present in the harmonic connection from crd1% into crd2% If no tritons are found in chord crd1% the function returns 1. For perfect solutions the result will be 1 also. The harmonic rules are: Tritons solve by either chromatic enlargement of its intervals, or by chromatic diminution of its intervals. Partial solutions (such as diatonic steps) yield 'imperfect' results.

FUNCTION HarForce (n1%, n2%) AS SINGLE

This function returns a normalized value for the harmonic force of a diad, following the theory of Paul Hindemith as expressed in Ludus Tonalis.

FUNCTION MelForce (n1%, n2%) AS SINGLE

This function returns a normalized value for the melodic force of a note couple, following the theory of Paul Hindemith as expressed in Ludus Tonalis.

Filedate: 970320- last update: 2004-11-02

 Naar homepage dr.Godfried-Willem RAES