You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
2.0 KiB

  1. import re
  2. from assets import notes,inotes,sign
  3. from math import log
  4. pat = r'(?P<note>[a-gA-G]{1})(?P<mod>[♭#]*)(?P<octave>\d*)'
  5. pat = re.compile(pat)
  6. tuning_a = 440
  7. def num_note(n):
  8. rpat = r'[^A-Ga-g#♭\d]'
  9. n = re.sub(rpat,'',n).upper()
  10. n = pat.match(n).groupdict()
  11. note = inotes[n['note']]
  12. mod = n['mod']
  13. octave = n['octave']
  14. if octave:
  15. octave = int(octave)
  16. else:
  17. octave = 0
  18. if mod:
  19. change = sign[mod[0]]*len(mod)
  20. else:
  21. change = 0
  22. return 12*octave+change+note
  23. def simple_note_name(n,notation = 'flats'):
  24. if notation not in ('sharps','flats'):
  25. raise ValueError('Notation flag is either "sharps" or "flats."')
  26. octave = str(n//12)
  27. n %= 12
  28. if n in notes.keys():
  29. note = notes[n]
  30. mod = ''
  31. elif notation == 'flats':
  32. note = notes[(n+1)%12]
  33. mod = ''
  34. elif notation == 'sharps':
  35. note = notes[(n-1)%12]
  36. mod = '#'
  37. return note+mod+octave
  38. def complex_note_name(n,note,notation='auto',overkill= False):
  39. if notation not in ('sharps','flats','auto'):
  40. raise ValueError('Notation flag is either "sharps","auto" or "flats."')
  41. if type(note) == str:
  42. note = note.upper()
  43. d_n = inotes[note]
  44. else:
  45. d_n = note
  46. note = notes[note]
  47. octave = n//12
  48. modify_n = (n-d_n)%12
  49. #complex bit
  50. if notation == 'flats':
  51. modify_n_new = modify_n%(-12)
  52. if modify_n != modify_n_new:
  53. octave += 1
  54. modify_n = modify_n_new
  55. elif notation == 'sharps':
  56. modify_n_new = modify_n%(12)
  57. if modify_n != modify_n_new:
  58. octave -= 1
  59. modify_n = modify_n_new
  60. else:
  61. if modify_n > 7:
  62. modify_n %= -12
  63. #just formating from here on out
  64. if modify_n < 0:
  65. mod = ''*abs(modify_n)
  66. elif modify_n > 0:
  67. mod = '#'*modify_n
  68. else:
  69. if overkill:
  70. mod = ''
  71. else:
  72. mod = ''
  73. octave = str(octave)
  74. return note+mod+octave