'''
Created on 15 juil. 2009

@author: Samuel Benveniste
'''
from gui.constants import *

class Wiimote:
    '''
    Object representing a Wiimote
    
        number:
            The number of the Wiimote
        port:
            The pypm object representing the MIDI port on which the Wiimote emits
        instrument:
            The instrument associated with the Wiimote
        cursor:
            The cursor associated with the Wiimote
    '''

    def __init__(self, number, portNumber, port, instrument, cursor):
        '''
        Constructor
        
            number:
                The number of the Wiimote
            portNumber:
                The number of the port (as numbered by pypm) on which the wiimote emits
            port:
                The pypm object representing the MIDI port on which the Wiimote emits
            instrument:
                The instrument associated with the Wiimote
            cursor:
                The cursor associated with the Wiimote            
        '''
        
        self.number = number
        self.portNumber = portNumber
        self.port = port
        self.instrument = instrument
        self.cursor = cursor
        self.numberPlayed = 0
        
    def getNoteOnHexCode(self):
        return (0x90 + self.instrument.channel - 1)
    
    def getAftertouchHexCode(self):
        return (0xA0 + self.instrument.channel - 1)
    
    def getCCHexCode(self):
        return (0xB0 + self.instrument.channel - 1)
    
    def playNote(self, note, velocity):
        noteNumber = self.instrument.getNote(note)
        
        if noteNumber != None :
            noteOnHexCode = self.getNoteOnHexCode()
            CCHexCode = self.getCCHexCode()
        else :
            noteNumber = defaultInstrumentNote
            noteOnHexCode = defaultNoteOnHexCode
            CCHexCode = defaultCCHexCode
            
        self.port.write_short(noteOnHexCode, noteNumber , 127)
        self.port.write_short(CCHexCode, 07, velocity)

    def playNoteByNoteNumber(self, midiNoteNumber, velocity):
        noteNumber = self.instrument.getNoteByNoteNumber(midiNoteNumber)
        
        if noteNumber != None :
            noteOnHexCode = self.getNoteOnHexCode()
            CCHexCode = self.getCCHexCode()
        else :
            noteNumber = defaultInstrumentNote
            noteOnHexCode = defaultNoteOnHexCode
            CCHexCode = defaultCCHexCode
            
        self.port.write_short(noteOnHexCode, noteNumber , 127)
        self.port.write_short(CCHexCode, 07, velocity)
        
        self.numberPlayed += 1
        
    def stopNote(self, note):
        noteNumber = self.instrument.getNote(note)
        if noteNumber != None :
            noteOnHexCode = self.getNoteOnHexCode()
        else :
            noteNumber = defaultInstrumentNote
            noteOnHexCode = defaultNoteOnHexCode
            
        self.port.write_short(noteOnHexCode, noteNumber, 0)
        
    def stopNoteByNoteNumber(self, midiNoteNumber):
        noteNumber = self.instrument.getNoteByNoteNumber(midiNoteNumber)
        if noteNumber != None :
            noteOnHexCode = self.getNoteOnHexCode()
        else :
            noteNumber = defaultInstrumentNote
            noteOnHexCode = defaultNoteOnHexCode
            
        self.port.write_short(noteOnHexCode, noteNumber, 0)
        
    def allNotesOff(self):
        CCHexCode = self.getCCHexCode()
        self.port.write_short(CCHexCode,123,0)