# Check how to install FoxDot here. Video content explained below.

This article is dedicated to my fellow Xenharmonic enthusiasts.

On the Xenharmonic wiki, there is a lot of resource invested on how to train one’s ear. One other nice medium I have found, is to code the right tunings and scales in a live coding environment such as FoxDot, then play them via a SynthDef. To perform that, we first need a function. Take care, as we work in python, the white spaces have their importance :

def cumulative(exp):
    if (isinstance(exp, list)):
        for index in range(len(exp)):
            if index != 0:
                exp[index] = exp[index-1]+exp[index]
        return exp
    else:
        return exp

This function can take care of the modes we often see on the Xenharmonic wiki, and turns them to scales.

Let’s try some should we ?

Say we want to discover the different heptatonic Mavila modes in ET11 or 11-EDO. First we can, for example, open a class called ET11, containing the tuning list (in cents/100 : 1 octave is 12), and all our modes :

class ET11:
    tuning = PRange(12)*12/11
    chromatic = PRange(12)
    mavilaC = cumulative([0,1,1,1,3,1,1])
    mavilaD = cumulative([0,1,1,3,1,1,3])
    mavilaE = cumulative([0,1,3,1,1,3,1])
    mavilaF = cumulative([0,3,1,1,3,1,1])
    mavilaG = cumulative([0,1,1,3,1,1,1])
    mavilaA = cumulative([0,1,3,1,1,1,3])
    mavilaB = cumulative([0,3,1,1,1,3,1])
# Prange generates a list of n-1 numbers, so a PRange of 12 it gives P[0,1,2,3,4,5,6,7,8,9,10,11]
# The Pattern P[] from FoxDot allow us to operate on each list item.
# Multiplying by 12/11 gives the exact values needed.

Then, I have taken every mode, and removed the last number. Indeed, when building a scale from a mode, we need the degree 0 to be there. Then the scale loops on the higher iteration (octive, tritave,…, you name it).

Example given for the first line of Mavila (let’s call it Mavila C) :

# 1 1 1 3 1 1 3
# removing last degree
# 0 1 1 1 3 1 1

# Applying cumulative function
print(cumulative([0,1,1,1,3,1,1]) # >>> [0,1,2,3,6,7,8] | 8+3 equals 11

We see that our tuning and our scale are well built, so now we need to give them as default Scale to play :

Scale.default.set(ET11.mavilaC, tuning=ET11.tuning)

Now, lets play this scale in a player, and let’s feel all the good sounds :

sc >> blip(PTri(8),dur=1/2)
# The PTri generates a pattern going up and down n-1, here P[0,1,2,3,4,5,6,7,6,5,4,3,2,1,0]
# dur=1/2 means we play notes 1/2 beat each

And with this method, my friends, we can virtually listen to any tuning or scale anyone ever has dreamt of.

Cheers !