diff options
Diffstat (limited to 'Edit/rm/NoteView.py')
-rw-r--r-- | Edit/rm/NoteView.py | 253 |
1 files changed, 0 insertions, 253 deletions
diff --git a/Edit/rm/NoteView.py b/Edit/rm/NoteView.py deleted file mode 100644 index ac139a1..0000000 --- a/Edit/rm/NoteView.py +++ /dev/null @@ -1,253 +0,0 @@ -import pygtk -pygtk.require( '2.0' ) -import gtk - -from Framework.Constants import Constants -from Framework.CSound.CSoundConstants import CSoundConstants -from GUI.GUIConstants import GUIConstants -from GUI.Core.NoteParametersWindow import NoteParametersWindow - -from BackgroundView import SELECTNOTES - -#---------------------------------------------------------------------- -# TODO: currently we are only using CSoundNotes, -# - this should updated to handle generic Note objects -#---------------------------------------------------------------------- - -#---------------------------------------------------------------------- -# A view for the (CSound)Note class -#---------------------------------------------------------------------- -class NoteView: - #----------------------------------- - # initialization - # TODO: not sure if passing in beatsPerPageAdjustment is the best way to go about it - #----------------------------------- - def __init__( self, note, track, beatsPerPageAdjustment ): - self.note = note - - self.track = track - self.beatsPerPageAdjustment = beatsPerPageAdjustment - self.posOffset = (0,0) - - self.baseOnset = self.basePitch = self.baseDuration = self.lastDragX = self.lastDragY = self.lastDragW = 0 # note dragging properties - - self.sampleNote = None - - self.parentSize = False - - self.selected = False - self.potentialDeselect = False - - - def getNoteParameters( self ): - self.note.pitch = self.noteParameters.pitchAdjust.value - self.note.amplitude = self.noteParameters.amplitudeAdjust.value - self.note.pan = self.noteParameters.panAdjust.value - self.note.attack = self.noteParameters.attackAdjust.value - self.note.decay = self.noteParameters.decayAdjust.value - self.note.reverbSend = self.noteParameters.reverbSendAdjust.value - self.note.filterType = self.noteParameters.filterType - self.note.filterCutoff = self.noteParameters.filterCutoff - self.note.tied = self.noteParameters.tied - self.note.overlap = self.noteParameters.overlap - - def handleButtonPress( self, emitter, event ): - eX = event.x - self.x - eY = event.y - self.y - - if eX < 0 or eX > self.width \ - or eY < 0 or eY > self.height: - return False - - if event.button == 3: - self.noteParameters = NoteParametersWindow( self.note, self.getNoteParameters ) - return True - - if event.type == gtk.gdk._2BUTTON_PRESS: # select bar - self.potentialDeselect = False - emitter.selectNotesByBar( self.track.getID(), self.x, self.x+self.width ) - elif event.type == gtk.gdk._3BUTTON_PRESS: # select track - self.potentialDeselect = False - emitter.selectNotesByTrack( self.track.getID() ) - else: - if self.getSelected(): # we already selected, might want to delected - self.potentialDeselect = True - else: - emitter.selectNotes( { self.track.getID(): [ self ] } ) - self.updateSampleNote( self.note.pitch ) - - percent = eX/self.width - if percent < 0.3: emitter.setCurrentAction( "note-drag-onset", self ) - elif percent > 0.7: emitter.setCurrentAction( "note-drag-duration", self ) - else: emitter.setCurrentAction( "note-drag-pitch", self ) - - - emitter.dirty() - - return True - - def handleButtonRelease( self, emitter, event, buttonPressCount ): - - if self.potentialDeselect: - self.potentialDeselect = False - emitter.deselectNotes( { self.track.getID(): [ self ] } ) - - self.clearSampleNote() - - emitter.doneCurrentAction() - - return True - - def noteDrag( self, emitter, dx, dy, dw ): - self.potentialDeselect = False - - ticksPerPixel = (round( self.beatsPerPageAdjustment.value, 0 ) * Constants.TICKS_PER_BEAT) / self.parentSize[0] - stepPerPixel = (Constants.NUMBER_OF_POSSIBLE_PITCHES-1) / (self.parentSize[1] - self.height) - pitchPerStep = (Constants.MAXIMUM_PITCH-Constants.MINIMUM_PITCH)/(Constants.NUMBER_OF_POSSIBLE_PITCHES-1) - - if dx != self.lastDragX: - self.lastDragX = dx - self.note.onset = self.baseOnset + int(dx*ticksPerPixel) - - if dy != self.lastDragY: - self.lastDragY = dy - newPitch = self.basePitch + round(-dy*stepPerPixel)*pitchPerStep - self.note.pitch = newPitch - self.updateSampleNote( newPitch ) - - if dw != self.lastDragW: - self.lastDragW = dw - self.note.duration = self.baseDuration + int(dw*ticksPerPixel) - - self.updateTransform( False ) - - def doneNoteDrag( self, emitter ): - self.baseOnset = self.note.onset - self.basePitch = self.note.pitch - self.baseDuration = self.note.duration - - self.lastDragX = 0 - self.lastDragY = 0 - self.lastDragW = 0 - - self.clearSampleNote() - - - def handleMarqueeSelect( self, emitter, start, stop ): - intersectionY = [ max(start[1],self.y), min(stop[1],self.y+self.height) ] - if intersectionY[0] > intersectionY[1]: - return False - - intersectionX = [ max(start[0],self.x), min(stop[0],self.x+self.width) ] - if intersectionX[0] > intersectionX[1]: - return False - - return True - - #----------------------------------- - # draw - #----------------------------------- - - def setPositionOffset( self, offset ): - self.posOffset = offset - if self.parentSize: self.updateTransform( False ) - - def draw( self, context ): - lineW = GUIConstants.NOTE_BORDER_SIZE - lineWDIV2 = lineW/2.0 - context.set_line_width( lineW ) - - context.move_to( self.x + lineWDIV2, self.y + lineWDIV2 ) - context.rel_line_to( self.width - lineW, 0 ) - context.rel_line_to( 0, self.height - lineW ) - context.rel_line_to( -self.width + lineW, 0 ) - context.close_path() - - #background - colour = 1 - ( ( self.note.amplitude * 0.7 ) + 0.3 ) - context.set_source_rgb( colour, colour, colour ) - context.fill_preserve() - - #border - if self.selected: context.set_source_rgb( 1, 1, 1 ) - else: context.set_source_rgb( 0, 0, 0 ) - context.stroke() - - #----------------------------------- - # update - #----------------------------------- - - def updateTransform( self, parentSize ): - if parentSize: self.parentSize = parentSize - self.width = int( self.parentSize[0] * self.note.duration / (round( self.beatsPerPageAdjustment.value, 0 ) * Constants.TICKS_PER_BEAT) ) - self.height = round( max( GUIConstants.MINIMUM_NOTE_HEIGHT, self.parentSize[1] / (Constants.NUMBER_OF_POSSIBLE_PITCHES-1) ) ) - self.x = int( self.parentSize[0] * self.note.onset / (round( self.beatsPerPageAdjustment.value, 0 ) * Constants.TICKS_PER_BEAT) ) \ - + self.posOffset[0] - self.y = round( (self.parentSize[1]-self.height) * ( Constants.MAXIMUM_PITCH - self.note.pitch ) / (Constants.NUMBER_OF_POSSIBLE_PITCHES-1) ) \ - + self.posOffset[1] - - def checkX( self, startx, stopx ): - if self.x >= startx and self.x < stopx: return True - else: return False - - def getStartTick( self ): - return self.note.onset - - def getEndTick( self ): - return self.note.onset + self.note.duration - - def updateDragLimits( self, dragLimits, leftBound, rightBound, widthBound ): - pixelsPerTick = self.parentSize[0] / (round( self.beatsPerPageAdjustment.value, 0 ) * Constants.TICKS_PER_BEAT) - pixelsPerPitch = (self.parentSize[1] - self.height) / (Constants.MAXIMUM_PITCH - Constants.MINIMUM_PITCH) - left = (leftBound - self.note.onset) * pixelsPerTick - right = (rightBound - self.note.duration - self.note.onset) * pixelsPerTick - up = (self.note.pitch - Constants.MAXIMUM_PITCH) * pixelsPerPitch - down = (self.note.pitch - Constants.MINIMUM_PITCH) * pixelsPerPitch - short = (Constants.MINIMUM_NOTE_DURATION - self.note.duration) * pixelsPerTick - long = (widthBound - self.note.duration - self.note.onset) * pixelsPerTick - - if dragLimits[0][0] < left: dragLimits[0][0] = left - if dragLimits[0][1] > right: dragLimits[0][1] = right - if dragLimits[1][0] < up: dragLimits[1][0] = up - if dragLimits[1][1] > down: dragLimits[1][1] = down - if dragLimits[2][0] < short: dragLimits[2][0] = short - if dragLimits[2][1] > long: dragLimits[2][1] = long - - # store the current loc as a reference point - self.baseOnset = self.note.onset - self.basePitch = self.note.pitch - self.baseDuration = self.note.duration - - def updateSampleNote( self, pitch ): - if self.sampleNote == None: - self.sampleNote = self.note.clone() - #TODO clean this up: - if CSoundConstants.INSTRUMENTS[ self.sampleNote.instrumentFlag ].csoundInstrumentID == 103: - self.sampleNote.duration = 100 - else: - self.sampleNote.duration = -1 - self.sampleNote.play() - - elif self.sampleNote.pitch != pitch: - self.sampleNote.pitch = pitch - self.sampleNote.play() - - def clearSampleNote( self ): - if self.sampleNote != None: - self.sampleNote.duration = 0 - self.sampleNote.play() - del self.sampleNote - self.sampleNote = None - - #----------------------------------- - # Selection - #----------------------------------- - - def setSelected( self, state ): - if self.selected != state: - self.selected = state - return True # state changed - return False # state is the same - - def getSelected( self ): - return self.selected |