Skip to content

Instantly share code, notes, and snippets.

@bvisness
Created April 7, 2017 03:04
Show Gist options
  • Save bvisness/e0ca52e07df92f7d8eff184fbabf5d9a to your computer and use it in GitHub Desktop.
Save bvisness/e0ca52e07df92f7d8eff184fbabf5d9a to your computer and use it in GitHub Desktop.
Music note to its frequency
import re
def frequency(note):
aFreqs = {
-1: 13.75,
0: 27.5,
1: 55.0,
2: 110.0,
3: 220.0,
4: 440.0,
5: 880.0,
6: 1760.0,
7: 3520.0,
8: 7040.0,
}
sharpable = ['A', 'C', 'D', 'F', 'G']
step = 2 ** (1.0 / 12)
pattern = re.compile(r'([A-G])(#|b)?([0-8])')
match = pattern.match(note)
if match is None:
return -1
letter, modifier, number = match.group(1, 2, 3)
number = int(number)
if 'C' <= letter and letter <= 'G':
number -= 1
currentFreq = aFreqs[number]
currentLetter = 'A'
isSharped = False
while currentLetter != letter:
currentFreq *= step
if not isSharped and currentLetter in sharpable:
isSharped = True
else:
currentLetter = chr(ord(currentLetter) + 1)
isSharped = False
if modifier == '#':
return currentFreq * step
elif modifier == 'b':
return currentFreq / step
else:
return currentFreq
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment