45 lines
1.2 KiB
Python
45 lines
1.2 KiB
Python
|
|
## File to generate equal-tempered scale for use with DDS
|
|
|
|
|
|
import math # because music is math
|
|
|
|
scale = ['C', 'Cx', 'D', 'Dx', 'E', 'F', 'Fx', 'G', 'Gx', 'A', 'Ax', 'B']
|
|
|
|
def octave(baseLength):
|
|
pitches = [baseLength * math.exp(x*math.log(2)/12) for x in range(0, 12)]
|
|
pitches = [int(round(x)) for x in pitches]
|
|
return( zip(scale, pitches) )
|
|
|
|
|
|
def writeScaleHeader(basePitch, octaves, filename="scale.h"):
|
|
outfile = open(filename, "w")
|
|
outfile.write('''/*
|
|
|
|
Scales for use with DDS synthesis.
|
|
|
|
Aimed roughly at having A2 be at 440Hz,
|
|
when the chip is clocked at 8MHz and
|
|
using 8-bit resolution on the PWM.
|
|
|
|
Tune it by tweaking basePitch.
|
|
|
|
*/
|
|
|
|
''')
|
|
for i in range(0, octaves):
|
|
for note, pitch in octave(basePitch * 2**i):
|
|
if pitch < 30000:
|
|
noteString = note + str(i)
|
|
print("#define {:<5}{:>6}").format(noteString, pitch)
|
|
outfile.write("#define {:<5}{:>6}\n".format(noteString, pitch))
|
|
outfile.close()
|
|
|
|
######################################################################
|
|
|
|
if __name__ == "__main__":
|
|
|
|
writeScaleHeader(basePitch=130, octaves=5)
|
|
|
|
|