@ -22,7 +22,7 @@
import fractions
import logging
from typing import cast , Any , Dict , Iterator, Sequence , List , Union # pylint: disable=unused-import
from typing import cast , Any , Dict , Set, Iterator, Sequence , List , Union # pylint: disable=unused-import
from google . protobuf import message as protobuf # pylint: disable=unused-import
@ -37,6 +37,8 @@ from . import clef as clef_lib
from . import key_signature as key_signature_lib
from . import time_signature as time_signature_lib
from . import pos2f
from . import sizef
from . import color
from . import model_base
from . import project_pb2
@ -76,7 +78,7 @@ class ProjectChild(ObjectBase):
class Sample ( ProjectChild ) :
class S pec( model_base . ObjectSpec ) :
class S ampleS pec( model_base . ObjectSpec ) :
proto_type = ' sample '
proto_ext = project_pb2 . sample # type: ignore
@ -89,7 +91,7 @@ class Sample(ProjectChild):
class PipelineGraphControlValue ( ProjectChild ) :
class Spec( model_base . ObjectSpec ) :
class PipelineGraphControlValue Spec( model_base . ObjectSpec ) :
proto_type = ' pipeline_graph_control_value '
proto_ext = project_pb2 . pipeline_graph_control_value # type: ignore
@ -104,11 +106,14 @@ class PipelineGraphControlValue(ProjectChild):
class BasePipelineGraphNode ( ProjectChild ) :
class Spec( model_base . ObjectSpec ) :
class BasePipelineGraphNode Spec( model_base . ObjectSpec ) :
proto_ext = project_pb2 . base_pipeline_graph_node # type: ignore
name = model_base . Property ( str )
graph_pos = model_base . WrappedProtoProperty ( pos2f . Pos2F )
graph_size = model_base . WrappedProtoProperty ( sizef . SizeF )
graph_color = model_base . WrappedProtoProperty (
color . Color , default = color . Color ( 0.8 , 0.8 , 0.8 , 1.0 ) )
control_values = model_base . ObjectListProperty ( PipelineGraphControlValue )
plugin_state = model_base . ProtoProperty ( audioproc . PluginState , allow_none = True )
@ -117,6 +122,8 @@ class BasePipelineGraphNode(ProjectChild):
self . name_changed = core . Callback [ model_base . PropertyChange [ str ] ] ( )
self . graph_pos_changed = core . Callback [ model_base . PropertyChange [ pos2f . Pos2F ] ] ( )
self . graph_size_changed = core . Callback [ model_base . PropertyChange [ sizef . SizeF ] ] ( )
self . graph_color_changed = core . Callback [ model_base . PropertyChange [ color . Color ] ] ( )
self . control_values_changed = \
core . Callback [ model_base . PropertyListChange [ PipelineGraphControlValue ] ] ( )
self . plugin_state_changed = \
@ -124,62 +131,140 @@ class BasePipelineGraphNode(ProjectChild):
@property
def removable ( self ) - > bool :
r aise NotImplementedError
r eturn True
@property
def description ( self ) - > node_db . NodeDescription :
raise NotImplementedError
def upstream_nodes ( self ) - > List [ ' BasePipelineGraphNode ' ] :
node_ids = set ( ) # type: Set[int]
self . __upstream_nodes ( node_ids )
return [ self . _pool [ node_id ] for node_id in sorted ( node_ids ) ]
def __upstream_nodes ( self , seen : Set [ int ] ) - > None :
for connection in self . project . get_property_value ( ' pipeline_graph_connections ' ) :
if connection . dest_node is self and connection . source_node . id not in seen :
seen . add ( connection . source_node . id )
connection . source_node . __upstream_nodes ( seen )
class PipelineGraphConnection ( ProjectChild ) :
class PipelineGraphConnectionSpec ( model_base . ObjectSpec ) :
proto_type = ' pipeline_graph_connection '
proto_ext = project_pb2 . pipeline_graph_connection # type: ignore
source_node = model_base . ObjectReferenceProperty ( BasePipelineGraphNode )
source_port = model_base . Property ( str )
dest_node = model_base . ObjectReferenceProperty ( BasePipelineGraphNode )
dest_port = model_base . Property ( str )
def __init__ ( self , * * kwargs : Any ) - > None :
super ( ) . __init__ ( * * kwargs )
self . source_node_changed = core . Callback [ model_base . PropertyChange [ BasePipelineGraphNode ] ] ( )
self . source_port_changed = core . Callback [ model_base . PropertyChange [ str ] ] ( )
self . dest_node_changed = core . Callback [ model_base . PropertyChange [ BasePipelineGraphNode ] ] ( )
self . dest_port_changed = core . Callback [ model_base . PropertyChange [ str ] ] ( )
class PipelineGraphNode ( BasePipelineGraphNode ) :
class PipelineGraphNodeSpec ( model_base . ObjectSpec ) :
proto_type = ' pipeline_graph_node '
proto_ext = project_pb2 . pipeline_graph_node # type: ignore
node_uri = model_base . Property ( str )
def __init__ ( self , * * kwargs : Any ) - > None :
super ( ) . __init__ ( * * kwargs )
self . node_uri_changed = core . Callback [ model_base . PropertyChange [ str ] ] ( )
@property
def node_uri ( self ) - > str :
return self . get_property_value ( ' node_uri ' )
@property
def description ( self ) - > node_db . NodeDescription :
return self . project . get_node_description ( self . node_uri )
class AudioOutPipelineGraphNode ( BasePipelineGraphNode ) :
class AudioOutPipelineGraphNodeSpec ( model_base . ObjectSpec ) :
proto_type = ' audio_out_pipeline_graph_node '
@property
def removable ( self ) - > bool :
return False
@property
def description ( self ) - > node_db . NodeDescription :
return node_db . Builtins . RealmSinkDescription
class Track ( ProjectChild ) :
class Spec ( model_base . ObjectSpec ) :
class InstrumentPipelineGraphNode ( BasePipelineGraphNode ) :
class InstrumentPipelineGraphNodeSpec ( model_base . ObjectSpec ) :
proto_type = ' instrument_pipeline_graph_node '
proto_ext = project_pb2 . instrument_pipeline_graph_node # type: ignore
instrument_uri = model_base . Property ( str )
def __init__ ( self , * * kwargs : Any ) - > None :
super ( ) . __init__ ( * * kwargs )
self . instrument_uri_changed = core . Callback [ model_base . PropertyChange [ str ] ] ( )
@property
def description ( self ) - > node_db . NodeDescription :
return instrument_db . parse_uri (
self . get_property_value ( ' instrument_uri ' ) , self . project . get_node_description )
class Track ( BasePipelineGraphNode ) : # pylint: disable=abstract-method
class TrackSpec ( model_base . ObjectSpec ) :
proto_ext = project_pb2 . track # type: ignore
name = model_base . Property ( str )
visible = model_base . Property ( bool , default = True )
muted = model_base . Property ( bool , default = False )
gain = model_base . Property ( float , default = 0.0 )
pan = model_base . Property ( float , default = 0.0 )
mixer_node = model_base . ObjectReferenceProperty ( BasePipelineGraphNode , allow_none = True )
list_position = model_base . Property ( int , default = 0 )
def __init__ ( self , * * kwargs : Any ) - > None :
super ( ) . __init__ ( * * kwargs )
self . name_changed = core . Callback [ model_base . PropertyChange [ str ] ] ( )
self . visible_changed = core . Callback [ model_base . PropertyChange [ bool ] ] ( )
self . muted_changed = core . Callback [ model_base . PropertyChange [ bool ] ] ( )
self . gain_changed = core . Callback [ model_base . PropertyChange [ float ] ] ( )
self . pan_changed = core . Callback [ model_base . PropertyChange [ float ] ] ( )
self . mixer_node_changed = core . Callback [ model_base . PropertyChange [ BasePipelineGraphNode ] ] ( )
self . list_position_changed = core . Callback [ model_base . PropertyChange [ int ] ] ( )
self . duration_changed = core . Callback [ None ] ( )
@property
def duration ( self ) - > audioproc . MusicalDuration :
return audioproc . MusicalDuration ( 1 , 1 )
@property
def is_master_group ( self ) - > bool :
return False
def walk_tracks ( self , groups : bool = False , tracks : bool = True ) - > Iterator [ ' Track ' ] :
if tracks :
yield self
class Measure ( ProjectChild ) :
class MeasureSpec ( model_base . ObjectSpec ) :
proto_ext = project_pb2 . measure # type: ignore
time_signature = model_base . WrappedProtoProperty (
time_signature_lib . TimeSignature ,
default = time_signature_lib . TimeSignature ( 4 , 4 ) )
def __init__ ( self , * * kwargs : Any ) - > None :
super ( ) . __init__ ( * * kwargs )
self . time_signature_changed = \
core . Callback [ model_base . PropertyChange [ time_signature_lib . TimeSignature ] ] ( )
class Measure ( ProjectChild ) :
@property
def track ( self ) - > Track :
return cast ( Track , self . parent )
@property
def duration ( self ) - > audioproc . MusicalDuration :
time_signature = self . project . get_time_signature ( self . index )
time_signature = self . get_property_value( ' time_signature ' )
return audioproc . MusicalDuration ( time_signature . upper , time_signature . lower )
class MeasureReference ( ProjectChild ) :
class Spec ( model_base . ObjectSpec ) :
class MeasureReference Spec( model_base . ObjectSpec ) :
proto_type = ' measure_reference '
proto_ext = project_pb2 . measure_reference # type: ignore
@ -207,8 +292,8 @@ class MeasureReference(ProjectChild):
return down_cast ( MeasureReference , super ( ) . next_sibling )
class MeasuredTrack ( Track ) :
class Spec( model_base . ObjectSpec ) :
class MeasuredTrack ( Track ) : # pylint: disable=abstract-method
class Measured Spec( model_base . ObjectSpec ) :
proto_ext = project_pb2 . measured_track # type: ignore
measure_list = model_base . ObjectListProperty ( MeasureReference )
@ -263,7 +348,7 @@ class MeasuredTrack(Track):
class Note ( ProjectChild ) :
class Spec( model_base . ObjectSpec ) :
class Note Spec( model_base . ObjectSpec ) :
proto_type = ' note '
proto_ext = project_pb2 . note # type: ignore
@ -338,205 +423,8 @@ class Note(ProjectChild):
self . measure . content_changed . call ( )
class TrackGroup ( Track ) :
class Spec ( model_base . ObjectSpec ) :
proto_type = ' track_group '
proto_ext = project_pb2 . track_group # type: ignore
tracks = model_base . ObjectListProperty ( Track )
def __init__ ( self , * * kwargs : Any ) - > None :
super ( ) . __init__ ( * * kwargs )
self . __listeners = { } # type: Dict[str, core.Listener]
self . tracks_changed = core . Callback [ model_base . PropertyListChange [ Track ] ] ( )
def setup ( self ) - > None :
super ( ) . setup ( )
for track in self . tracks :
self . __add_track ( track )
self . tracks_changed . add ( self . __tracks_changed )
def __tracks_changed ( self , change : model_base . PropertyListChange ) - > None :
if isinstance ( change , model_base . PropertyListInsert ) :
self . __add_track ( change . new_value )
elif isinstance ( change , model_base . PropertyListDelete ) :
self . __remove_track ( change . old_value )
else :
raise TypeError ( " Unsupported change type %s " % type ( change ) )
def __add_track ( self , track : Track ) - > None :
self . __listeners [ ' %s :duration_changed ' % track . id ] = track . duration_changed . add (
self . duration_changed . call )
self . duration_changed . call ( )
def __remove_track ( self , track : Track ) - > None :
self . __listeners . pop ( ' %s :duration_changed ' % track . id ) . remove ( )
self . duration_changed . call ( )
@property
def tracks ( self ) - > Sequence [ Track ] :
return self . get_property_value ( ' tracks ' )
@property
def duration ( self ) - > audioproc . MusicalDuration :
duration = audioproc . MusicalDuration ( )
for track in self . tracks :
duration = max ( duration , track . duration )
return duration
def walk_tracks ( self , groups : bool = False , tracks : bool = True ) - > Iterator [ Track ] :
if groups :
yield self
for track in self . tracks :
yield from track . walk_tracks ( groups , tracks )
class MasterTrackGroup ( TrackGroup ) :
class Spec ( model_base . ObjectSpec ) :
proto_type = ' master_track_group '
@property
def is_master_group ( self ) - > bool :
return True
class PropertyMeasure ( Measure ) :
class Spec ( model_base . ObjectSpec ) :
proto_type = ' property_measure '
proto_ext = project_pb2 . property_measure # type: ignore
time_signature = model_base . WrappedProtoProperty (
time_signature_lib . TimeSignature ,
default = time_signature_lib . TimeSignature ( 4 , 4 ) )
def __init__ ( self , * * kwargs : Any ) - > None :
super ( ) . __init__ ( * * kwargs )
self . time_signature_changed = \
core . Callback [ model_base . PropertyChange [ time_signature_lib . TimeSignature ] ] ( )
@property
def time_signature ( self ) - > time_signature_lib . TimeSignature :
return self . get_property_value ( ' time_signature ' )
class PropertyTrack ( MeasuredTrack ) :
class Spec ( model_base . ObjectSpec ) :
proto_type = ' property_track '
class PipelineGraphNode ( BasePipelineGraphNode ) :
class Spec ( model_base . ObjectSpec ) :
proto_type = ' pipeline_graph_node '
proto_ext = project_pb2 . pipeline_graph_node # type: ignore
node_uri = model_base . Property ( str )
def __init__ ( self , * * kwargs : Any ) - > None :
super ( ) . __init__ ( * * kwargs )
self . node_uri_changed = core . Callback [ model_base . PropertyChange [ str ] ] ( )
@property
def node_uri ( self ) - > str :
return self . get_property_value ( ' node_uri ' )
@property
def removable ( self ) - > bool :
return True
@property
def description ( self ) - > node_db . NodeDescription :
return self . project . get_node_description ( self . node_uri )
class AudioOutPipelineGraphNode ( BasePipelineGraphNode ) :
class Spec ( model_base . ObjectSpec ) :
proto_type = ' audio_out_pipeline_graph_node '
@property
def removable ( self ) - > bool :
return False
@property
def description ( self ) - > node_db . NodeDescription :
return node_db . Builtins . RealmSinkDescription
class TrackMixerPipelineGraphNode ( BasePipelineGraphNode ) :
class Spec ( model_base . ObjectSpec ) :
proto_type = ' track_mixer_pipeline_graph_node '
proto_ext = project_pb2 . track_mixer_pipeline_graph_node # type: ignore
track = model_base . ObjectReferenceProperty ( Track )
def __init__ ( self , * * kwargs : Any ) - > None :
super ( ) . __init__ ( * * kwargs )
self . track_changed = core . Callback [ model_base . PropertyChange [ Track ] ] ( )
@property
def removable ( self ) - > bool :
return False
@property
def description ( self ) - > node_db . NodeDescription :
return node_db . Builtins . TrackMixerDescription
class InstrumentPipelineGraphNode ( BasePipelineGraphNode ) :
class Spec ( model_base . ObjectSpec ) :
proto_type = ' instrument_pipeline_graph_node '
proto_ext = project_pb2 . instrument_pipeline_graph_node # type: ignore
track = model_base . ObjectReferenceProperty ( Track )
def __init__ ( self , * * kwargs : Any ) - > None :
super ( ) . __init__ ( * * kwargs )
self . track_changed = core . Callback [ model_base . PropertyChange [ Track ] ] ( )
@property
def track ( self ) - > Track :
return self . get_property_value ( ' track ' )
@property
def removable ( self ) - > bool :
return False
@property
def description ( self ) - > node_db . NodeDescription :
return instrument_db . parse_uri (
cast ( Union [ ScoreTrack , BeatTrack ] , self . track ) . instrument ,
self . project . get_node_description )
class PianoRollPipelineGraphNode ( BasePipelineGraphNode ) :
class Spec ( model_base . ObjectSpec ) :
proto_type = ' pianoroll_pipeline_graph_node '
proto_ext = project_pb2 . pianoroll_pipeline_graph_node # type: ignore
track = model_base . ObjectReferenceProperty ( Track )
def __init__ ( self , * * kwargs : Any ) - > None :
super ( ) . __init__ ( * * kwargs )
self . track_changed = core . Callback [ model_base . PropertyChange [ Track ] ] ( )
@property
def removable ( self ) - > bool :
return False
@property
def description ( self ) - > node_db . NodeDescription :
return node_db . Builtins . PianoRollDescription
class ScoreMeasure ( Measure ) :
class S pec( model_base . ObjectSpec ) :
class ScoreMeasureSpec ( model_base . ObjectSpec ) :
proto_type = ' score_measure '
proto_ext = project_pb2 . score_measure # type: ignore
@ -561,40 +449,26 @@ class ScoreMeasure(Measure):
self . notes_changed . add ( lambda _ : self . content_changed . call ( ) )
@property
def time_signature ( self ) - > time_signature_lib . TimeSignature :
return self . project . get_time_signature ( self . index )
class ScoreTrack ( MeasuredTrack ) :
class S pec( model_base . ObjectSpec ) :
class ScoreTrackSpec ( model_base . ObjectSpec ) :
proto_type = ' score_track '
proto_ext = project_pb2 . score_track # type: ignore
instrument = model_base . Property ( str )
transpose_octaves = model_base . Property ( int , default = 0 )
instrument_node = model_base . ObjectReferenceProperty (
InstrumentPipelineGraphNode , allow_none = True )
event_source_node = model_base . ObjectReferenceProperty (
PianoRollPipelineGraphNode , allow_none = True )
def __init__ ( self , * * kwargs : Any ) - > None :
super ( ) . __init__ ( * * kwargs )
self . instrument_changed = core . Callback [ model_base . PropertyChange [ str ] ] ( )
self . transpose_octaves_changed = core . Callback [ model_base . PropertyChange [ int ] ] ( )
self . instrument_node_changed = \
core . Callback [ model_base . PropertyChange [ InstrumentPipelineGraphNode ] ] ( )
self . event_source_node_changed = \
core . Callback [ model_base . PropertyChange [ PianoRollPipelineGraphNode ] ] ( )
@property
def instrument( self ) - > str :
return self . get_property_value ( ' instrument ' )
def description ( self ) - > node_db . NodeDescription :
return node_db . Builtins . ScoreTrackDescription
class Beat ( ProjectChild ) :
class Spec( model_base . ObjectSpec ) :
class Beat Spec( model_base . ObjectSpec ) :
proto_type = ' beat '
proto_ext = project_pb2 . beat # type: ignore
@ -619,7 +493,7 @@ class Beat(ProjectChild):
class BeatMeasure ( Measure ) :
class Spec( model_base . ObjectSpec ) :
class BeatMeasure Spec( model_base . ObjectSpec ) :
proto_type = ' beat_measure '
proto_ext = project_pb2 . beat_measure # type: ignore
@ -636,61 +510,26 @@ class BeatMeasure(Measure):
super ( ) . setup ( )
self . beats_changed . add ( lambda _ : self . content_changed . call ( ) )
@property
def time_signature ( self ) - > time_signature_lib . TimeSignature :
return self . project . get_time_signature ( self . index )
class BeatTrack ( MeasuredTrack ) :
class Spec( model_base . ObjectSpec ) :
class BeatTrackSpec ( model_base . ObjectSpec ) :
proto_type = ' beat_track '
proto_ext = project_pb2 . beat_track # type: ignore
instrument = model_base . Property ( str )
pitch = model_base . WrappedProtoProperty ( pitch_lib . Pitch )
instrument_node = model_base . ObjectReferenceProperty (
InstrumentPipelineGraphNode , allow_none = True )
event_source_node = model_base . ObjectReferenceProperty (
PianoRollPipelineGraphNode , allow_none = True )
def __init__ ( self , * * kwargs : Any ) - > None :
super ( ) . __init__ ( * * kwargs )
self . instrument_changed = core . Callback [ model_base . PropertyChange [ str ] ] ( )
self . pitch_changed = core . Callback [ model_base . PropertyChange [ pitch_lib . Pitch ] ] ( )
self . instrument_node_changed = \
core . Callback [ model_base . PropertyChange [ InstrumentPipelineGraphNode ] ] ( )
self . event_source_node_changed = \
core . Callback [ model_base . PropertyChange [ PianoRollPipelineGraphNode ] ] ( )
@property
def instrument ( self ) - > str :
return self . get_property_value ( ' instrument ' )
class CVGeneratorPipelineGraphNode ( BasePipelineGraphNode ) :
class Spec ( model_base . ObjectSpec ) :
proto_type = ' cvgenerator_pipeline_graph_node '
proto_ext = project_pb2 . cvgenerator_pipeline_graph_node # type: ignore
track = model_base . ObjectReferenceProperty ( Track )
def __init__ ( self , * * kwargs : Any ) - > None :
super ( ) . __init__ ( * * kwargs )
self . track_changed = core . Callback [ model_base . PropertyChange [ Track ] ] ( )
@property
def removable ( self ) - > bool :
return False
@property
def description ( self ) - > node_db . NodeDescription :
return node_db . Builtins . CVGenerator Description
return node_db . Builtins . BeatTrackDescription
class ControlPoint ( ProjectChild ) :
class Spec( model_base . ObjectSpec ) :
class ControlPointSpec ( model_base . ObjectSpec ) :
proto_type = ' control_point '
proto_ext = project_pb2 . control_point # type: ignore
@ -705,45 +544,24 @@ class ControlPoint(ProjectChild):
class ControlTrack ( Track ) :
class Spec( model_base . ObjectSpec ) :
class ControlTrack Spec( model_base . ObjectSpec ) :
proto_type = ' control_track '
proto_ext = project_pb2 . control_track # type: ignore
points = model_base . ObjectListProperty ( ControlPoint )
generator_node = model_base . ObjectReferenceProperty (
CVGeneratorPipelineGraphNode , allow_none = True )
def __init__ ( self , * * kwargs : Any ) - > None :
super ( ) . __init__ ( * * kwargs )
self . points_changed = core . Callback [ model_base . PropertyListChange [ ControlPoint ] ] ( )
self . generator_node_changed = \
core . Callback [ model_base . PropertyChange [ CVGeneratorPipelineGraphNode ] ] ( )
class SampleScriptPipelineGraphNode ( BasePipelineGraphNode ) :
class Spec ( model_base . ObjectSpec ) :