

# Oppgave 8a, pyton-del. Kjetil S. Matheussen
# Kopier denne til scripts-folderen.


import pyext


# 'intervals' en en liste av noter hvor grunntonen er 0.
# F.eks vil [4,7] gi dur (returnere ingenting) og [3,7] gi moll (returnere "m").
def findChord(intervals):
    ret=""
    intervals=filter(lambda x:x!=0,intervals)
    intervals.sort()
    
    if intervals==[3,6,9]: return "dim"
    if intervals==[3,6]: return "dim"
    if intervals==[6,9]: return "dim"
    if intervals==[4,8]: return "+"

    if intervals.count(3)>0: ret="m"

    for i in intervals:
        ret+={1:"-lite sekund-",
              2:"9",
              3:"",
              4:"",
              5:"-kvart-",
              6:"-tritonus-",
              7:"",
              8:"-liten sekst-",
              9:"6",
              10:"7",
              11:"Maj7"
              }[i]
    return ret



class NoteStatistikk:
    def __init__(self):
        self.notes=map(lambda x:0,range(128))
        self.notes2=map(lambda x:0,range(12))
        self.num_notes=0
        
    def checkChord(self):
        if self.num_notes<3: return
        chord=[]
        for i in range(128):
            if self.notes[i]>0:
                chord.append(i)
        chord.sort()
        grunntone=chord[0]%12
        for i in range(12):
            if self.notes2[i]>self.notes2[grunntone]:
                grunntone=i
        return ["C","C#","D","D#","E","F","F#","G","G#","A","B","H"
                ][grunntone
                  ]+findChord(map(lambda x2:(x2-grunntone)%12,
                                  chord))
    
    def addNote(self,note,num=1):
        self.notes[note]+=num
        self.notes2[note%12]+=num
        self.num_notes+=num
        return self.checkChord()
        
    def removeNote(self,note):
        return self.addNote(note,-1)


class ns(pyext._class):
    _inlets=4
    _outlets=1
    def __init__(self,*args):
        self.notestatistikk=NoteStatistikk()
        self.vol=0

    def float_1(self,f):
        ret=self.notestatistikk.addNote(int(f))
        if ret!=None:
            self._outlet(1,ret)
        
    def float_2(self,f):
        ret=self.notestatistikk.removeNote(int(f))
        if ret!=None:
            self._outlet(1,ret)

    def float_3(self,f):
        if self.vol==0:
            self.float_2(f)
        else:
            self.float_1(f)

    def float_4(self,f):
        self.vol=int(f)


