Herman Haverkort > Recursive tilings and space-filling curves > Sound of space-filling curves > Sound of space-filling curves II > Proximity mapping details
I am exploring different approaches to make sonifications or music of space-filling curves. One of these approaches is proximity mapping. For an introduction and examples of proximity mapping, please check out the main page first. Below, I provide more details of the mapping, and some additional examples that may be interesting.
For ease of description, consider a d-dimensional self-similar space-filling curve f: [0,1] → [0,1]d (however, the approach below can also be applied, mutatis mutandis, to non-continuous traversals). We traverse the curve, that is, the values f(t), from t=0 to t=1, sampling it at a set T⊂[0,1] of n uniformly spaced values of t. When we are at a specific value of t, we generate a tone for each other point f(t′) with t′∈T, generating louder tones for points that, together with f(t), define pairs for which the space-filling curve does not preserve locality well. So in total, we generate roughly |T|² tones: there are |T| time steps t, and in each step, we superimpose |T|−1 tones, one for each pair (t,t′) with t≠t′.
Frequency: with a typical mapping, the generated tone for the pair (t,t′) would be 24·sin(½π(t−t′)) semitones above C♯4 (so it will be between C♯2 and C♯6). However, for many sound tracks, I use a different mapping—as long as it is a non-increasing or non-decreasing function of t-t′.
Amplitude: let r be the Euclidean distance between f(t) and f(t′), and let V be the volume of a d-dimensional sphere with radius r. One could argue that in a hypothetical ideal locality-preserving space-filling curve, all points of that sphere would be covered by the curve section from f(t−½V) to f(t+½V). Therefore, we can say that f(t′) is “too far away” along the curve by a factor |t−t′| ⁄ (½V); we denote this factor by s. We now map this factor to an amplitude of, in principle, 0.01·cap(αs²), where α is a parameter that controls the sensitivity of the mapping (in practice, I used α values between 0.001 and 0.05), and cap(x) = x ⁄ (1+x) is a function that dampens higher values so that the amplitude stays below 0.01. However, within distance r, there will be a number of points proportional to rd that generate waves of similar frequency and amplitude, and, unless they are somehow in phase, they will add up to a sound with an effective amplitude that is a sublinear but still rising function of rd. If we would not compensate for that, points farther away would completely dominate the sound track due to their sheer number. Therefore, for each point f(t′), we divide the amplitude by rβd, for a suitable parameter β. So far, for the three- to seven-dimensional cube grids, I got best results with β values between 1/2 and 1/3. (A value of 1/2 makes sense theoretically, since the standard deviation of rd independent signals with standard deviation 1 is equal to rd/2, but sometimes lower values work better in practice; I believe it might have something to do with how we perceive the loudness of mixtures of different frequencies.). For the permutation traversal orders, I used β=4.
Phase: to prevent unintended interferences, a random phase shift is applied to each tone.
A showcase of nice tracks can be found here. Below is an additional set of five six-dimensional traversals (46 points at 60 points per second, α=0.005). These do not sound nice, but they might be interesting to compare. They are roughly ordered from smoothly (and quite boring) rising sound at the top to less-smoothly rising and melodically more interesting sound at the bottom. Does this correspond to an ordering by locality-preserving properties? All space-filling curves and traversals are described in my manuscript on higher-dimensional curves.
|Beta Hilbert, 6D|
|Base-camp Hilbert, 6D|
|Inside-out traversal, 6D|
|Z-order traversal, 6D|