'''
Created on 15 juil. 2009

@author: Samuel Benveniste
'''
from gui.constants import *
import fluidsynth

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
        
        self.fs = fs = fluidsynth.Synth()
        fs.start()
        soundFont = r"C:\Documents and Settings\Administrator\My Documents\Telechargements\fluid-soundfont-3.1\FluidR3_GM.sf2"
        self.fsid = fsid = fs.sfload(soundFont)
        bank = 0
        preset = 0
        fs.program_select(0, fsid, bank, preset)

    def __del__(self) :
        self.fs.delete()
        
    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):
#        print 'playNote'
#        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):
        print 'playNoteByNumber'
        noteNumber = self.instrument.getNoteByNoteNumber(midiNoteNumber)
        fs = self.fs
        fs.noteon(0, noteNumber, velocity)
        
        return
        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):
#        print 'stopNote'
#        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):
        print 'stopNoteByNoteNumber'
        
        noteNumber = self.instrument.getNoteByNoteNumber(midiNoteNumber)
        fs = self.fs
        fs.noteoff(0, noteNumber)
        
        return
        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):
#        print 'allNoteOff'
#        CCHexCode = self.getCCHexCode()
#        self.port.write_short(CCHexCode,123,0)
