# ##### BEGIN GPL LICENSE BLOCK ##### # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # ##### END GPL LICENSE BLOCK ##### # import bpy from bpy.types import Operator from bpy.props import IntProperty class SequencerCrossfadeSounds(Operator): """Do cross-fading volume animation of two selected sound strips""" bl_idname = "sequencer.crossfade_sounds" bl_label = "Crossfade sounds" bl_options = {'REGISTER', 'UNDO'} @classmethod def poll(cls, context): if context.scene and context.scene.sequence_editor and context.scene.sequence_editor.active_strip: return context.scene.sequence_editor.active_strip.type == 'SOUND' else: return False def execute(self, context): seq1 = None seq2 = None for s in context.scene.sequence_editor.sequences: if s.select and s.type == 'SOUND': if seq1 is None: seq1 = s elif seq2 is None: seq2 = s else: seq2 = None break if seq2 is None: self.report({'ERROR'}, "Select 2 sound strips") return {'CANCELLED'} if seq1.frame_final_start > seq2.frame_final_start: s = seq1 seq1 = seq2 seq2 = s if seq1.frame_final_end > seq2.frame_final_start: tempcfra = context.scene.frame_current context.scene.frame_current = seq2.frame_final_start seq1.keyframe_insert("volume") context.scene.frame_current = seq1.frame_final_end seq1.volume = 0 seq1.keyframe_insert("volume") seq2.keyframe_insert("volume") context.scene.frame_current = seq2.frame_final_start seq2.volume = 0 seq2.keyframe_insert("volume") context.scene.frame_current = tempcfra return {'FINISHED'} else: self.report({'ERROR'}, "The selected strips don't overlap") return {'CANCELLED'} class SequencerCutMulticam(Operator): """Cut multi-cam strip and select camera""" bl_idname = "sequencer.cut_multicam" bl_label = "Cut multicam" bl_options = {'REGISTER', 'UNDO'} camera = IntProperty( name="Camera", min=1, max=32, soft_min=1, soft_max=32, default=1, ) @classmethod def poll(cls, context): if context.scene and context.scene.sequence_editor and context.scene.sequence_editor.active_strip: return context.scene.sequence_editor.active_strip.type == 'MULTICAM' else: return False def execute(self, context): camera = self.camera s = context.scene.sequence_editor.active_strip if s.multicam_source == camera or camera >= s.channel: return {'FINISHED'} if not s.select: s.select = True cfra = context.scene.frame_current bpy.ops.sequencer.cut(frame=cfra, type='SOFT', side='RIGHT') for s in context.scene.sequence_editor.sequences_all: if s.select and s.type == 'MULTICAM' and s.frame_final_start <= cfra and cfra < s.frame_final_end: context.scene.sequence_editor.active_strip = s context.scene.sequence_editor.active_strip.multicam_source = camera return {'FINISHED'} class SequencerDeinterlaceSelectedMovies(Operator): """Deinterlace all selected movie sources""" bl_idname = "sequencer.deinterlace_selected_movies" bl_label = "Deinterlace Movies" bl_options = {'REGISTER', 'UNDO'} @classmethod def poll(cls, context): return (context.scene and context.scene.sequence_editor) def execute(self, context): for s in context.scene.sequence_editor.sequences_all: if s.select and s.type == 'MOVIE': s.use_deinterlace = True return {'FINISHED'} classes = ( SequencerCrossfadeSounds, SequencerCutMulticam, SequencerDeinterlaceSelectedMovies, )