In [1]:
from functools import lru_cache

import ophis

In [2]:
@lru_cache(maxsize=None, typed=False)
class QualifiedInterval(ophis.oph_utils.IntegerComparisonMixin):
    
    def __init__(self, interval, octaves=0):
        self.interval = interval
        self.octaves = octaves
    
    def augmented(self, distance=1):
        if int(distance) == 0:
            return self

        try:
            octaves = distance.octaves
        except(AttributeError):
            octaves = 0
            

        interval = self.interval.augmented(distance)
        octaves = self.octaves + octaves
        if interval <= self.interval:
            octaves = octaves + 1
        
        
        return self.__class__(interval, octaves)
    
    def diminished(self, distance=1):
        if int(distance) > int(self):
            raise ValueError("Distance to diminish by is larger than interval.")
        if int(distance) == 0:
            return self
        
        try:
            octaves = distance.octaves
        except(AttributeError):
            octaves = 0
            

        interval = self.interval.diminished(distance)
        octaves = self.octaves - octaves
        if interval >= self.interval:
            octaves = octaves - 1
            
        return self.__class__(interval, octaves)
        
    
    def octv(self, octaves=1):
        return self.__class__(self.interval, (self.octaves + octaves))
    
    def __repr__(self):
        return self.__class__.__name__ + "(" + self.interval.name + ", " + str(self.octaves) + ")"
    
    def __int__(self):
        return int(self.interval) + self.octaves*int(ophis.P8)

In [ ]:


In [3]:
M9 = QualifiedInterval(ophis.M2, 1)

In [ ]:


In [4]:
M9


Out[4]:
QualifiedInterval(M2, 1)

In [ ]:


In [5]:
M9.augmented()


Out[5]:
QualifiedInterval(A2, 1)

In [ ]:


In [6]:
x = QualifiedInterval(ophis.Perfect(8), 0)
x.augmented(1)


Out[6]:
QualifiedInterval(m2, 1)

In [7]:
QualifiedInterval(ophis.M7, 2).augmented(QualifiedInterval(ophis.m3, 1))


Out[7]:
QualifiedInterval(M2, 4)

In [8]:
QualifiedInterval(ophis.M3,5).diminished(ophis.P4)


Out[8]:
QualifiedInterval(M7, 4)

In [9]:
QualifiedInterval(ophis.M7, 4) > QualifiedInterval(ophis.M3,5)


Out[9]:
False

In [10]:
ophis.M3^3


Out[10]:
Major(3)^3

In [11]:
ophis.DFLAT


Out[11]:
DFLAT

In [12]:
ophis.DSHARP.s9n


---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-12-b37af6b375f8> in <module>()
----> 1 ophis.DSHARP.s9n
      2 

AttributeError: 'Chroma' object has no attribute 's9n'

In [13]:
ophis.C.base_num


Out[13]:
0

In [15]:
ophis.C.base_value


Out[15]:
0

In [16]:
ophis.D.base_value


Out[16]:
2

In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]: