Posted: Feb 06, 2016 5:21 pm
Now it's time to develop what amounts to the cockpit of my heuristic. This will provide input controls to how LickMaker goes about developing licks. Using Constructor Theory terminology, these are the counter-factuals, i.e. what is possible and what is not possible for licks. If a counter-factual prohibits a lick, then that lick will not be able to exist in lick space. However, Constructor theory has a concept that seems similar to imaginary numbers to me. It goes something like this: It may be true that a->a', and/or b->b' are not possible transformations, however a',b' ->c may be possible. This means that the "laws of nature" of a systems will obviously make impossible states (substrates) impossible, but the laws may also make it possible to transform a given impossible state (substrate) into a possible one. This presents a bit of an issue in deciding how to handle these substrates that the laws of nature of the system deem non-natural but can never-the-less effect change in nature by helping to transform another substrate, or be themselves transformed into another substrate. David Deutsch gives some examples of these impossible states doing possible things in his paper. I could give a guitar lick example if anyone is interested. I need a term for these impossible states, i.e. states that the laws of nature prohibit, calling them supernatural states seems appropriate.

In short, a supernatural state, (substrate - in my case - lick) is one that violates one or more counter-factuals yet may still effect the transformation (mutation) of another lick or be transformed itself to a state compatable with the laws of nature. i.e. a supernatural state can be made natural.

I'm going to start with a basic set of counter-factuals for lickmaker and add to them as the need arises or when I'm in a better position to take on more complexity, like dealing with alternate fret positions, chord types, etc. For now the counter-factuals are:

1) Entropy space. This is the 3D, pitch, rhythm, and vertical entropy space that I've been demonstrating. For a lick to exist in nature it must exist in one or more defined regions of entropy space. Many separate regions of entropy space may be defined and different regions may have different characteristics. The general format for defining these regions is:

lentropy= [
[ entropy region 0 ]
[ entropy region 1 ]
[ entropy region n ]
]

A dictionary of n entropy regions is defined, each entropy region has a definition for each of its 3 dimensions as follows:

entropy region n = [ [ pitch entropy specification ], [rhythm entropy specification], [vertical entropy specification]]

Each entropy region specification is defined in a similar way as follows:

pitch entropy specification = [ min pitch entropy, max pitch entropy, min pitch density, max pitch density, crystal fac, shape]

The min and max pitch entropy values define where in pitch entropy space this region is. The min and max pitch density set the desired min and max number of licks to inhabit that region/unit. The crystal fac sets how regular a lattice is desired for licks in the space (more on that later), and the shape is used to specify the contour of the region. More on that later also.

I'm finding this simple definition pretty powerful, rather than giving detailed examples of this now I think it best to list the other counter-factuals in this comment.

Similar to entropy space is another space with three dimensions, sweet n sour n tension space. It is defined in a way similar to entropy space.

lsnsnt= [
[ sweet n sour n tension region 0 ]
[ sweet n sour n tension region 1 ]
[ sweet n sour n tension region n ]

sweet n sour n tension region n = [ [sweetness specification ] [ sourness specification] [ tension specification ]]

An example of a counter-factual that specifies what is not allowed is

lcount_no ={
'+-t-l':0,
'a-t-l':0,
'+-t-al':0,
'a-t-al':0,
}

This makes triplets across a beat boundary non natural.

Similiary:

starting_tension_no={}

ending_tension_no={
'min2_nt':[1],
'Maj2_nt':[2],
'min3_nt':[3],
'dim5_nt':[6],
'min6_nt':[8],
'Maj7_nt':[11]
}

Specify non natural starting and ending tensions. the empty starting_tension_no dictionary allows all starting tensions.

A few more counter- factuals.

fretposition={0:0}

max_num_licks = 10000

That should be a fair introduction to the counter-factuals that I'm starting with and how they are used to guide the heuristic towards which licks to make.