1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
from renardo_lib.Utils import modi
from renardo_lib.TimeVar import TimeVar
CHROMATIC_NOTES = ["C"," ","D"," ","E","F"," ","G"," ","A"," ","B"]
class Note:
def __init__(self, index):
self.char = None
self.num = None
self.set(index)
def __str__(self):
return str(self.num)
def __repr__(self):
return str(self.num)
def __float__(self):
return float(self.num)
def __int__(self):
return int(self.num)
def set(self, index):
if type(index) is str:
char = index.title()
if len(char) == 1:
mod = 0
elif len(char) == 2 and char[1] == "#":
mod = 1
elif len(char) == 2 and char[1] == "b":
mod = -1
else:
raise TypeError("Could not convert string '%s' to Note" % index)
self.char = char
self.num = (CHROMATIC_NOTES.index(char[0]) + mod) % len(CHROMATIC_NOTES)
if type(index) is int:
self.num = index
self.char = modi(CHROMATIC_NOTES, index)
if type(index) is float:
self.num = index
self.char = "<Micro-Tuned>"
if isinstance(index, TimeVar):
self.num = index
self.char = "<Time-Varying>"
def __iadd__(self, other):
self.num += other
def __isub__(self, other):
self.num -= other
def __add__(self, other):
return self.num + other
def __sub__(self, other):
return self.num - other
def __radd__(self, other):
return other + self.num
def __rsub__(self, other):
return other - self.num
def __call__(self, *args):
if len(args) > 0:
self.set(args[0])
return self
class __root__:
def __init__(self):
self.default = Note("C")
def __setattr__(self, key, value):
if key == "default" and key in vars(self):
self.default.set(value)
else:
self.__dict__[key] = value
return
def reset(self):
""" Sets the root to 0 """
self.default = 0
Root = __root__()
|