示例#1
0
    def __init__(self, *, channel_count=2):
        self._channel_count = channel_count
        self._scenes = SceneContainer()
        self._scenes._parent = self
        self._server = None
        self._soloed_tracks = set()

        self._transport = Transport()
        self._tracks = TrackContainer()
        self._return_tracks = TrackContainer(name="return track container")
        self._master_track = Track(
            device_types=(DeviceType.AUDIO, ),
            channel_count=channel_count,
            name="master track",
        )
        self._cue_track = Track(
            device_types=(DeviceType.AUDIO, ),
            channel_count=channel_count,
            name="cue track",
        )

        UniqueTreeTuple.__init__(
            self,
            children=[
                self._transport,
                self._tracks,
                self._return_tracks,
                self._master_track,
                self._cue_track,
            ],
        )
        self._node = Group(children=[_.node for _ in self], name="application")
示例#2
0
文件: servers.py 项目: inegm/supriya
 def recurse(query_tree_node, node):
     for query_tree_child in query_tree_node.children:
         if isinstance(query_tree_child, QueryTreeGroup):
             group = Group()
             group._register_with_local_server(
                 node_id=query_tree_child.node_id, server=self)
             node._children.append(group)
             recurse(query_tree_child, group)
         elif isinstance(query_tree_child, QueryTreeSynth):
             synth = Synth()
             synth._register_with_local_server(
                 node_id=query_tree_child.node_id, server=self)
             node._children.append(synth)
             for query_tree_control in query_tree_child.children:
                 pass
示例#3
0
 def recurse(query_tree_node, node):
     for query_tree_child in query_tree_node.children:
         if isinstance(query_tree_child, QueryTreeGroup):
             group = Group()
             group._register_with_local_server(
                 node_id=query_tree_child.node_id, server=self
             )
             node._children.append(group)
             recurse(query_tree_child, group)
         elif isinstance(query_tree_child, QueryTreeSynth):
             synth = Synth()
             synth._register_with_local_server(
                 node_id=query_tree_child.node_id, server=self
             )
             node._children.append(synth)
             for query_tree_control in query_tree_child.children:
                 pass
示例#4
0
 def _handle_node_info_response(self, response):
     from supriya.commands import NodeAction
     from supriya.realtime import Group, Synth
     with self._lock:
         node_id = response.node_id
         node = self._nodes.get(node_id)
         if node is not None:
             node._handle_response(response)
         elif response.action == NodeAction.NODE_CREATED:
             if response.is_group:
                 node = Group()
             else:
                 node = Synth()
             node._register_with_local_server(
                 server=self,
                 node_id=response.node_id,
                 )
             parent = self._nodes[response.parent_group_id]
             node._set_parent(parent)
             if response.previous_node_id:
                 previous_child = self._nodes[response.previous_node_id]
                 index = parent.index(previous_child)
                 parent._children.insert(index + 1, node)
             else:
                 parent._children.append(node)
示例#5
0
    def _apply_local(self, server):
        from supriya.realtime import Group, Node

        for item in self.items:
            if isinstance(item.node_id, Group):
                node_id = None
                group = item.node_id
            else:
                node_id = item.node_id
                group = Group()
            if isinstance(item.target_node_id, Node):
                target_node = item.target_node_id
            else:
                target_node = server._nodes[item.target_node_id]
            group._register_with_local_server(
                server,
                node_id=node_id,
                node_id_is_permanent=group.node_id_is_permanent)
            target_node._move_node(add_action=item.add_action, node=group)
示例#6
0
 def __init__(self, channel_count=2):
     RackDevice.__init__(self)
     self._levels = dict(output=None)
     self._osc_callbacks = dict(output=None)
     self._bus_group = BusGroup.audio(bus_count=channel_count)
     self._chains = ChainContainer(chain_class=AudioChain)
     self._receive = RackReceive()
     UniqueTreeTuple.__init__(self, children=[self.chains, self.receive])
     self._rack_output_synth = Synth(
         synthdef=build_rack_output_synthdef(channel_count), name="rack output"
     )
     self._node = Group(
         children=[self.chains.node, self.rack_output_synth], name="audio rack"
     )
示例#7
0
 def __init__(self, channel_count=2):
     Chain.__init__(self)
     self._levels = dict(prefader=None, postfader=None)
     self._osc_callbacks = dict(active=None, prefader=None, postfader=None)
     self._bus_group = BusGroup.audio(bus_count=channel_count)
     self._output_synth = Synth(synthdef=build_chain_output_synthdef(channel_count))
     self._sends = SendManager()
     self._mutate([self.devices, self.sends])
     self._node = Group(
         children=[
             self.devices.node,
             self.sends.pre_fader_group,
             self.output_synth,
             self.sends.post_fader_group,
         ],
         name="instrument chain",
     )
示例#8
0
    def __init__(self, *, device_types=None, channel_count=2, name=None):
        DawNode.__init__(self)
        self._device_types = device_types or (
            DeviceType.MIDI,
            DeviceType.INSTRUMENT,
            DeviceType.AUDIO,
        )

        self._bus_group = BusGroup.audio(bus_count=channel_count)
        self._devices = DeviceContainer(device_types=self.device_types)
        self._input_bus_group = BusGroup.audio(bus_count=channel_count)
        self._input_synth = Synth(
            synthdef=build_track_input_synthdef(channel_count))
        self._levels = dict(input=None, prefader=None, postfader=None)
        self._osc_callbacks = dict(input=None, prefader=None, postfader=None)
        self._output_synth = Synth(
            synthdef=build_track_output_synthdef(channel_count))
        self._receive = TrackReceive()
        self._sends = SendManager()
        self._slots = ClipSlotContainer()
        self._slots._parent = self

        self._is_active = True
        self._is_muted = False
        self._is_soloed = False
        self._soloed_tracks = set()

        UniqueTreeTuple.__init__(
            self, children=[self.receive, self.devices, self.sends])

        self._node = Group(
            children=[
                self.input_synth,
                self.devices.node,
                self.sends.pre_fader_group,
                self.output_synth,
                self.sends.post_fader_group,
            ],
            name=name
            or " ".join(_.lower() for _ in delimit_words(type(self).__name__)),
        )
示例#9
0
    def _handle_node_info_response(self, response):
        from supriya.realtime import Group, Synth

        with self._lock:
            node_id = response.node_id
            node = self._nodes.get(node_id)
            if node is not None:
                node._handle_response(response)
            elif response.action == NodeAction.NODE_CREATED:
                if response.is_group:
                    node = Group()
                else:
                    node = Synth()
                node._register_with_local_server(server=self, node_id=response.node_id)
                parent = self._nodes[response.parent_group_id]
                node._set_parent(parent)
                if response.previous_node_id:
                    previous_child = self._nodes[response.previous_node_id]
                    index = parent.index(previous_child)
                    parent._children.insert(index + 1, node)
                else:
                    parent._children.append(node)
示例#10
0
 def __init__(self):
     DawNode.__init__(self)
     UniqueTreeDict.__init__(self)
     self._pre_fader_group = Group(name="pre-fader sends")
     self._post_fader_group = Group(name="post-fader sends")
示例#11
0
 def __init__(self, *, channel_count=None, name=None):
     Device.__init__(self, channel_count=channel_count, name=name)
     self._node = Group(name=name or "audio device")
示例#12
0
 def __init__(self):
     Device.__init__(self)
     self._node = Group(name="instrument")
示例#13
0
 def __init__(self, chain_class, *, name=None):
     DawContainer.__init__(self)
     self._chain_class = chain_class
     self._node = Group(name=name or "chain container")
示例#14
0
 def __init__(self, device_types):
     DawContainer.__init__(self)
     self._device_types = tuple(device_types)
     self._node = Group(name="device container")
示例#15
0
 def __init__(self, name=None):
     DawContainer.__init__(self)
     self._pre_fader_group = Group(name="pre-fader sends")
     self._post_fader_group = Group(name="post-fader sends")
示例#16
0
 def __init__(self, name=None):
     DawContainer.__init__(self)
     self._node = Group(name=name or "track container")
     self._soloed_tracks = set()
示例#17
0
class Application(UniqueTreeTuple, MixerContext):
    """
    A DAW application.
    """

    ### INITIALIZER ###

    def __init__(self, *, channel_count=2):
        self._channel_count = channel_count
        self._scenes = SceneContainer()
        self._scenes._parent = self
        self._server = None
        self._soloed_tracks = set()

        self._transport = Transport()
        self._tracks = TrackContainer()
        self._return_tracks = TrackContainer(name="return track container")
        self._master_track = Track(
            device_types=(DeviceType.AUDIO, ),
            channel_count=channel_count,
            name="master track",
        )
        self._cue_track = Track(
            device_types=(DeviceType.AUDIO, ),
            channel_count=channel_count,
            name="cue track",
        )

        UniqueTreeTuple.__init__(
            self,
            children=[
                self._transport,
                self._tracks,
                self._return_tracks,
                self._master_track,
                self._cue_track,
            ],
        )
        self._node = Group(children=[_.node for _ in self], name="application")

    ### PUBLIC METHODS ###

    def add_scene(self):
        scene = self._scenes.add_scene()
        for child in self.depth_first():
            if isinstance(child, Track):
                child.slots.add_slot()
        return scene

    def add_track(self, channel_count=2, name=None) -> Track:
        """
        Add a track.
        """
        track = Track(channel_count=channel_count, name=name)
        self.tracks.append(track)
        track.add_send(Send.DEFAULT)
        return track

    def boot(self, server=None) -> None:
        """
        Boot the DAW application.
        """
        self._server = server or Server.default()
        if not self._server.is_running:
            self._server.boot()
        for alloc_node in reversed(list(self)):  # type: DawNode
            alloc_node._pre_allocate(self._server)
        self._node.allocate(target_node=self._server)
        for post_alloc_node in reversed(list(self)):  # type: DawNode
            post_alloc_node._post_allocate()

    def quit(self) -> None:
        """
        Quit the DAW application.
        """
        self._node.free()
        for node in reversed(list(self)):  # type: DawNode
            node._free()
        self._server.quit()
        self._server = None

    ### PUBLIC PROPERTIES ###

    @property
    def channel_count(self) -> int:
        """
        Get the application channel count.
        """
        return self._channel_count

    @property
    def cue_track(self) -> Track:
        """
        Get the application cue track.
        """
        return self._cue_track

    @property
    def node(self) -> Group:
        """
        Get the application's underlying server node.
        """
        return self._node

    @property
    def master_track(self) -> Track:
        """
        Get the application's master track.
        """
        return self._master_track

    @property
    def server(self) -> Optional[Server]:
        """
        Get the application's underlying server.
        """
        return self._server

    @property
    def return_tracks(self) -> TrackContainer:
        """
        Get the application's track container.
        """
        return self._return_tracks

    @property
    def tracks(self) -> TrackContainer:
        """
        Get the application's track container.
        """
        return self._tracks

    @property
    def transport(self) -> Transport:
        """
        Get the application's transport.
        """
        return self._transport