// Optimize a musical scale to find the optimal number of notes in an octave. // Key frequency ratios to evaluate at // These numbers are the Farey series between 1 and 2, in order of generation. points= [[3/2, 1], [4/3, 1/2], [5/3, 1/2], [5/4, 1/4], [7/5, 1/4], [8/5, 1/4], [7/4, 1/4]] /* [6/5, 1/8], [9/7, 1/8], [11/8, 1/8], [10/7, 1/8], [11/7, 1/8], [13/8, 1/8], [12/7, 1/8], [9/5, 1/8]] */ bestError = 1000 for root = 2 to million { // print["$root\t"] ratio = 2^(1/root) sum = 0 for [point, weight] = points { // Find optimal number of steps optSteps = log[point]/log[ratio] // Error between steps and closest note in this scale error = abs[(optSteps-round[optSteps])/optSteps] // We're going to take RMS error sum = sum + error^2 * weight^2 // println["$point\t$error"] } e = sqrt[sum] * root // print[format[e,1,6]] // Best so far? if (e < bestError) { // print["\t*"] println["$root\t$e\t*"] bestError = e } // println[] }