The ContinuousFracture
transform divides the driver domain into equal-sized intervals and
permutes these intervals. For example if the permutation is (1 3 4 2 0) then ContinuousFracture
will divide the driver domain into five equal-sized intervals. Driver values ranging from 0.0 to 0.2 will shift to the range from 0.2 to 0.4.
Driver values ranging from 0.2 to 04 will shift to the range from 0.6 to 0.8, and so forth.
Since ContinuousFracture
maps the driver domain back onto itself, it can serve as a
decorator interposing between a driver and
a second transform. And unless the application specifically wants values from zero to unity, decoration
is exactly what will happen.
ContinuousFracture
introduces conspicuous discontinuities into the 'decorated' driver
stream, and it is definitely not something to do with a probabilistic driver
that is concerned with sample-to-sample proximity. By contrast, the chaotic drivers,
Logistic
and
Baker
, already jump around a lot. Their
flavor of dependence has to do with the way their attractors recur quasi-periodically.
Trouble is, once Logistic
gets going with a specific value of
lambda
, or Baker
gets going with a specific value of
mu
, then its always the same attractors recurring.
What ContinuousFracture
offers is the ability to substitute new recurrance points in place
of these out-of-the-box attractors.
The following two panels explore scenarios illustrating how ContinuousFracture
might be
used. Each panel has five rows, and each row graphs a source sequence on the left and its 'decorated' (permuted) counterpart on the right.
The source sequences are held fixed; only the 'decoration' changes.
Sequences were 75 samples in length, which was the largest number that would still fit before-and-after information into one horizontal row of graphs.
ContinuousFracture
reshapes the same
Logistic
sequence through five different permutations. Each row of graphs provides a histogram
of the unpermuted sequence (far left), a time-series graph of unpermuted samples (middle left), a line diagram showing how
equal-sized regions of the unpermuted domain map to expanded or contracted regions of the permuted domain (center), a time-series graph of
permuted samples (middle right), and a histogram of the permuted sequence (far right).
Scenario #1 appears in Figure 1 (a).
It draws a source sequence from the Logistic
driver with λ=3.6283 and starting value 0.7.
The source-sequence samples which occupy interval #3 (fourth from the bottom, ranging from from 0.3 to 0.4) shifts to interval #0 (ranging from 0.0 to 0.1) in the first permutation, to interval #9 (ranging from 0.9 to 1.0) in the second permutation, to interval #4 (ranging from 0.4 to 0.5) in the third permutation, to interval #7 (ranging from 0.7 to 0.8) in the fourth permutation, to interval #4 (ranging from 0.4 to 0.5) in the fifth permutation. Except for the shifts, the internal content remains the same: its the same pattern of recurrance and the same succession of relative ups and downs.
Things are a little more problematic with the values clustering around 0.9 in the source sequence. If I understand things correctly, values clustering near 0.9 are associated with the same attractor. Yet the recurrance pattern which is observed around 0.9 in the source sequence passes back and forth between two different intervals after permutation (except in the topmost example, where the stacking of intervals 7, 8, & 9 shifts as a bundle to intervals 2, 3, & 4).
To prevent situations like the one just described would require some way of isolating attractors through analysis of sequence values. I'm not convinced its worth the effort.
ContinuousFracture
reshapes the same
Baker
sequence through five different permutations. Each row of graphs provides a histogram
of the unpermuted sequence (far left), a time-series graph of unpermuted samples (middle left), a line diagram showing how
equal-sized regions of the unpermuted domain map to expanded or contracted regions of the permuted domain (center), a time-series graph of
permuted samples (middle right), and a histogram of the permuted sequence (far right).
Scenario #2 appears in Figure 1 (b).
It draws a source sequence from the Baker
driver with μ=0.8 and starting value 0.55. The sequence of permutations used for Scenario #1 is also used for Scenario #2.
Chaotic sequences will in general be compact, especially when the control parameters λ and μ are at low settings.
After processing through ContinuousFracture
, the resulting sequences cannot
help but being more widely across the driver domain than their chaotic sources.
ContinuousFracture
implementation class.
The type hierarchy for ContinuousFracture
is:
TransformBase<T
extends Number>
extends WriteableEntity
implements Transform<T>
ContinuousFracture
extends TransformBase<Double>
implements Transform.Continuous, Driver
The ContinuousFracture
transform satisfies the Transform
interface, in that it draws input from the driver domain; however it turns right around and maps
its output right back into the same domain. As such, the ContinuousFracture
transform also satisfies the
Driver
interface. So for example, one could pipe output from
Logistic
into ContinuousFracture
,
the pipe the ouput from ContinuousFracture
in turn into
DiscreteWeighted
, whose output could then serve
as indices to select, say, a pitch from a scale.
Unlike other classes implementing Transform.Continuous
,
ContinuousFracture
does not subclass
ContinuousDistributionTransform
.
There is no ContinuousDistribution
instance, and no quantile
function maps raw driver input values to 'decorated' output.
Rather, ContinuousFracture.permutation
holds an
embedded Permutation
instance.
The all-important convert()
method uses this permutation to remap
driver input. The length permutation.itemCount()
)
determines the number of driver-domain intervals, while the kth permutation element remaps interval
k.
Constructing a ContinuousFracture
instance extends past allocating the instance with the
new
operator to determining what permutation the instance will use. There are two
approaches:
ContinuousFracture.fillAscending(int itemCount)
to
specify the number of intervals. This creates the identity permutation,
which will map driver values to themselves. The next step in this approach is a call to
ContinuousFractureshuffle()
, which calls
permutation.shuffleMembers()
.
ContinuousFracturesetPermutation()
to populate permutation
. The
setPermutation(Permutation permutation)
flavor copies the content of the source permutation to the embedded instance. The other flavor offers variations upon a source permutation.
© Charles Ames | Page created: 2022-08-29 | Last updated: 2022-08-29 |