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