コード例 #1
0
 def record_live(self):
     """
     record -- but get this -- live!
     """
     section_head("Record mode")
     device_ind, device_name = sd_select_device()
     p("Enter recording duration (in seconds)")
     record_time = inpt('beatsec')
     p('Choose sample rate to record at, in samples per second. Hit enter to use default 44100')
     rate = inpt('int', required=False)
     if rate == '':
         rate = 44100
     self.rate = Units.rate(rate)
     print("  Press Enter to begin recording, or 'q' to quit: ", end="")
     inpt("none", required=False)
     time.sleep(0.05)
     section_head("Recording at input {0} ({1}) for {2}".format(device_ind, \
         device_name, record_time))
     sd.default.channels = 2
     recording = sd.rec(
         ind(record_time * self.rate), 
         self.rate.magnitude, 
         device=device_name)
     sd.wait()
     info_block("Finished recording")
     self.arr = recording
     if len(self.arr.shape) < 2:
         transpose = self.arr.reshape(-1, 1)
         self.arr = np.hstack((transpose, transpose))
     self.source_block = {
         'live recording': "input '{0}'".format(device_name)
     }
コード例 #2
0
    def playback(self, duration=5, start=0, first_time=True):
        """
        cat: info
        desc: playback this recording's audio
        args:
            [duration: beats/seconds. default 5]
            [start: beat/seconds to start at. defualts to beginning]
        """
        duration = inpt_validate(duration, 'beatsec')
        start = inpt_validate(start, 'beatsec')
        section_head("Playback of '{0}'".format(self.name))

        print("  preparing...")
        start_ind = ind(start)
        if duration <= 0:
            end_ind = self.size_samps()
        else:
            end_ind = start_ind + ind(duration * self.rate)
        arr = self.arr[start_ind : end_ind]
        arr = self.get_panned_rec(arr)

        print("  playing...")
        rate = self.rate.to_rate().round().magnitude
        try:
            sd.play(arr, rate)
            sd.wait()
        except TypeError as e:
            if first_time:
                retry = True
                err_mess("Error playing back. Trying again")
                self.arr = [[float(i), float(j)] for i,j in self.arr]
                self.playback(duration, start, False)
            else:
                raise e
        print("  finished playback")
コード例 #3
0
ファイル: process.py プロジェクト: JRice15/relativism
def process(obj):
    """
    process an object.
    'self.name', 'self.reltype' required.
    """
    section_head("Processing {0} '{1}'".format(obj.reltype, obj.name))

    while True:

        try:
            obj.process_message()
        except AttributeError:
            pass

        with style("cyan, bold"):
            print("\n{0} ".format(RelGlobals.get_process_num()), end="")
        p("What process to run on {0} '{1}'?".format(obj.reltype, obj.name),
          h=True,
          o="'o' to view process options",
          indent=0,
          hang=4,
          leading_newline=False)

        try:
            command = inpt(mode='split',
                           split_modes='arg',
                           help_callback=processes_help)
            if process_validate(command, obj):
                do_command(command, obj)
        except Cancel:
            return
コード例 #4
0
ファイル: sampler.py プロジェクト: JRice15/relativism
 def info(self):
     """
     cat: info
     """
     section_head("{0} '{1}'".format(self.reltype, self.name))
     info_line("{0} samples".format(len(self.smps)))
     info_line("{0} rhythms".format(len(self.rhythms)))
     info_line("{0} active pairs".format(len(self.active)))
     info_line("(use list_samples/rhythms/active to view them)")
コード例 #5
0
    def __init__(self, filename, path, rel_instance):
        section_head("Loading '{0}'".format(filename))
        self.proj_file_dir = path
        self.current_path = path
        self.filename = filename
        self.rel_instance = rel_instance

        # because leaf children loaded before the root, need to add parents retroactively
        self.need_parent = []
        self.project = None
コード例 #6
0
 def undo(self):
     """
     cat: save
     desc: reverts to previous state (maximum of 5 times)
     """
     section_head("Undoing...")
     if len(self.recents) != 0:
         self.arr = self.recents.pop(0)
     else:
         err_mess("No history to revert to!")
コード例 #7
0
ファイル: relativism.py プロジェクト: JRice15/relativism
    def __init__(self, reldata_dir, proj_filename):
        section_head("Initializing Program")

        RelGlobals.set_rel_instance(self)

        self.relfile_path = join_path(reldata_dir, proj_filename)

        # set default output
        self.output = "Built-in Output"
        self.reltype = "Program"

        # maps name : path to that proj's datafile
        self.projects = self.read_proj_file()
        self.current_open_proj = None
コード例 #8
0
ファイル: relativism.py プロジェクト: JRice15/relativism
    def open_proj(self):
        """
        desc: open a project
        """
        section_head("Opening Project")

        self.list_projects()
        p("Enter name of project you want to open, or 'see <name>' to see info about that project"
          )
        name_input = inpt("split", "obj")
        see = False
        if name_input[0] == "see":
            try:
                proj_name = name_input[1]
            except IndexError:
                err_mess("No name provided to 'see'")
                self.open_proj()
                return
            see = True
        else:
            proj_name = name_input[0]

        try:
            proj_path = self.projects[proj_name]
        except KeyError:
            try:
                proj_name = autofill(proj_name, self.projects.keys(), "name")
            except AutofillError as e:
                err_mess("No project matches name '{0}'".format(e.word))
                return
            proj_path = self.projects[proj_name]

        if proj_path == "None":
            err_mess("Project {0} is missing".format(proj_name))
            self.handle_missing_proj(proj_name)
            return

        if see:
            self.see_proj(proj_name, proj_path)
            self.open_proj()
            return

        try:
            loader = ProjectLoader("{0}.Project".format(proj_name), proj_path,
                                   self)
            self.current_open_proj = loader.get_proj()
        except FileNotFoundError as e:
            err_mess("File Not Found: '{0}'".format(e.filename))
            self.handle_missing_proj(proj_name)
            return
コード例 #9
0
ファイル: relativism.py プロジェクト: JRice15/relativism
 def main_menu(self):
     while True:
         section_head("Relativism Main Menu")
         p("Would you like to edit Projects (P), Settings (S), or get Help (H)?"
           )
         choice = inpt("letter", allowed="psh")
         try:
             if choice == "p":
                 self.projects_menu()
             elif choice == "s":
                 self.settings_menu()
             else:
                 self.help_menu()
         except Cancel:
             pass
コード例 #10
0
ファイル: relativism.py プロジェクト: JRice15/relativism
    def create_proj(self):
        """
        desc: create a new project
        """
        section_head("Creating New Project")
        while True:
            try:
                self.current_open_proj = Project(parent=self, mode="create")
                break
            except FileExistsError:
                err_mess(
                    "The directory already exists and cannot be overwritten. Choose another name or location"
                )

        self.projects[self.current_open_proj.
                      name] = self.current_open_proj.get_data_dir()
        self.write_proj_file()
コード例 #11
0
ファイル: rel_objects.py プロジェクト: JRice15/relativism
    def __init__(self, name, reltype, mode, **kwargs):

        super().__init__(name=name, reltype=reltype, **kwargs)

        if mode == "create":
            section_head("Initializing {0}".format(reltype))
        elif mode == "load":
            info_line("Loading {0} '{1}'".format(reltype, name))
        elif mode == "prop":
            # property
            pass
        else:
            raise UnexpectedIssue("Unknown mode '{0}'".format(mode))

        self.name = name
        self.reltype = reltype

        self._do_aliases()
コード例 #12
0
 def export_to_wav(self, outfile=None):
     """
     cat: save
     desc: save recording to wav file
     args:
         outfile: filename to save to. do not include '.wav' or any other extention
     """
     section_head("Writing to file")
     if outfile is None:
         print("  Enter output file name: ", end="")
         outfile = inpt("file")
     try:
         info_line("writing...")
         t1 = time.time()
         self.write_audio(outfile)
         t2 = time.time()
         info_line("written successfully in {0:.4f} seconds".format(t2 - t1))
     except TypeError as e:
         print("  > Failed to write to file '{0}': {1}".format(outfile, e))
コード例 #13
0
ファイル: globals.py プロジェクト: JRice15/relativism
 def process():
     section_head("Editing User Settings")
     method_strs = [func for func in dir(Settings) if "__" not in func and 
         is_public_process(getattr(Settings, func))]
     while True:
         info_title("Available processes:")
         info_list(method_strs)
         p("What process to run?")
         proc = inpt("alphanum")
         try:
             proc = autofill(proc, method_strs)
             method = getattr(Settings, proc)
             if is_public_process(method):
                 method()
             else:
                 raise AttributeError
         except AutofillError as e:
             err_mess("No process matches '{0}'!".format(e.word))
         except AttributeError:
             err_mess("No process matches '{0}'!".format(proc))
コード例 #14
0
ファイル: effects.py プロジェクト: JRice15/relativism
    def __init__(self,
                 rec,
                 size,
                 dampening=50,
                 wet=50,
                 dry=80,
                 roughness=50,
                 spread=50):
        """
        args:
            size: radius in meters of room
        """
        section_head("Reverb1")
        self.rec = rec
        self.size = inpt_validate(size, 'float', allowed=[1, None])
        self.dampening = inpt_validate(dampening, 'pcnt', allowed=[0, None
                                                                   ]) * 1 / 100
        self.wet = inpt_validate(wet, 'pcnt', allowed=[0, None])
        self.dry = inpt_validate(dry, 'pcnt', allowed=[0, None])
        self.rate = rec.rate
        self.spread = inpt_validate(spread, 'pcnt', allowed=[0, 200]) * 1 / 100

        self.nodes = []
        # self.add_node(0,size)
        self.add_node(size, 0)
        self.add_node(-size, 0)
        # self.add_node(0, -size)

        # source must init before set_other_nodes
        self.listener = Reverb1.Reverb1_Listener(self, 0, 0)
        self.source = Reverb1.Reverb1_Source(self, rec.arr, 0, size / 2)

        self.set_other_nodes()

        # do the reverb
        self.source.start()

        # clean up
        self.collect()
コード例 #15
0
ファイル: relativism.py プロジェクト: JRice15/relativism
    def projects_menu(self):
        """
        top menu for opening or creating projects
        """
        while True:
            section_head("Projects Menu")

            # choose open type: open or create
            while self.current_open_proj is None:
                if bool(self.projects):
                    p("Open existing project (O) or Create new (C)?")
                    open_or_create = inpt("letter", allowed="oc")

                    if open_or_create == 'c':
                        self.create_proj()
                    else:
                        self.open_proj()
                else:
                    info_block(
                        "No existing projects. Defaulting to create new")
                    self.create_proj()

            self.process_project()