class AudioBar: def __init__(self,parent,frame,backend,audio_server_port=7007): self.parent = parent self.root = frame self.backend = backend self.current_song = Song('') self.backend.cur_song = self.current_song self.cur_rec = None self.cur_clip = self.current_song self.osc_client = ControlR(self,port=audio_server_port) self.osc_server = self.backend.osc_server self.cur_clip_pos = self.backend.cur_time self.control_frame = tk.Frame(self.root,padx=2) self.progress_frame = tk.Frame(self.root) self.progress_bar = RecordingBar(self,self.backend.cur_song,self.progress_frame,self.backend.record) def move_cue(i,x): self.osc_client.set_q(self.backend.cur_song,i,x) self.progress_bar.drag_release_action = move_cue self.progress_bar.rec_drag_release_action = self.backend.record.edit_clip_pos self.progress_frame.pack(side=tk.LEFT,fill=tk.X) self.control_frame.pack(side=tk.LEFT,anchor=tk.NE) self.setup_control() def start(self): self.osc_map() self.osc_client.build_n_send('/pyaud/querystatus',1) def refresh(self): self.vars['rec_layer'].set(str(self.backend.record.recording_layer)) if self.progress_bar.last_rec_popup is not None: self.progress_bar.last_rec_popup.update_vars_from_rec() def setup_control(self): self.audio_frame = tk.Frame(self.control_frame) self.audio_frame.pack() self.vars = {} self.vars['progress'] = tk.StringVar() self.vars['progress'].set("--:--") self.vars['rec_layer'] = tk.StringVar() self.vars['rec_layer'].set('0') # rec control def update_rec_layer(*args): self.backend.record.recording_layer = int(self.vars['rec_layer'].get()) self.vars['rec_layer'].trace('w',update_rec_layer) self.pb_on_off = tk.Button(self.audio_frame,text='plb',command=self.gen_updater(self.backend.record.toggle_playing),padx=5,pady=2) self.rec_on_off = tk.Button(self.audio_frame,text='rec',command=self.gen_updater(self.backend.record.toggle_recording),padx=5,pady=2) choices = [str(i) for i in range(C.NO_LAYERS)] self.rec_layer_chooser = tk.OptionMenu(self.audio_frame,self.vars['rec_layer'],*choices) self.pb_on_off.grid(row=0,column=0) self.rec_on_off.grid(row=0,column=1) self.rec_layer_chooser.grid(row=0,column=2) # loop control self.cue_buttons = [] def toggle_looping(): if self.backend.cur_song is not None: self.backend.cur_song.vars['loopon'] = not self.backend.cur_song.vars['loopon'] self.progress_bar.refresh() self.loop_on_off = tk.Button(self.audio_frame,text='loop',command=self.gen_updater(toggle_looping),padx=10,pady=6) self.loop_on_off.grid(row=1,column=2) def gen_activate(i): def tor(): new = self.osc_client.activate(self.backend.cur_song,i,scale=self.backend.cur_song.vars['total_len']) # add return value self.cue_buttons[i].config(relief='groove') if new: self.progress_bar.add_line(new,i) return tor def gen_deactivate(i): def tor(*args): self.osc_client.clear_q(self.backend.cur_song,i) self.cue_buttons[i].config(relief='flat') self.progress_bar.remove_line(i) return tor for i in range(2): but = tk.Button(self.audio_frame,text=str(i),padx=10,pady=10,relief='flat') but.config(command=gen_activate(i),state='active') but.bind("<ButtonPress-3>",gen_deactivate(i)) but.grid(row=1,column=i) self.cue_buttons.append(but) # audio control play = self.osc_client.build_msg('/pyaud/pps',1) pause = self.osc_client.build_msg('/pyaud/pps',0) stop = self.osc_client.build_msg('/pyaud/pps',-1) progress_time = tk.Label(self.audio_frame,textvariable=self.vars['progress'],relief='raised',pady=6,padx=10) def gen_osc_send(msg): def sender(): self.osc_client.send(msg) return sender self.playbut = tk.Button(self.audio_frame,text=">",padx=8,pady=4, command = gen_osc_send(play),state='disabled') self.pausebut = tk.Button(self.audio_frame,text="||",padx=8,pady=4, command = gen_osc_send(pause),state='disabled') self.playbut.grid(row=2,column=0) self.pausebut.grid(row=2,column=1) progress_time.grid(row=2,column=2) def gen_updater(self,fun): def fun_tor(): fun() self.update_rpl() return fun_tor def update_rpl(self): if self.backend.record.recording: self.rec_on_off.config(relief='sunken') else: self.rec_on_off.config(relief='raised') if self.backend.record.playing: self.pb_on_off.config(relief='sunken') else: self.pb_on_off.config(relief='raised') if self.backend.cur_song is not None: if self.backend.cur_song.vars['loopon']: self.loop_on_off.config(relief='sunken') else: self.loop_on_off.config(relief='raised') def buttons_enabler(self,_,osc_msg): if osc_msg == 'loaded': self.progress_bar.reload() self.playbut.config(state='normal') self.pausebut.config(state='disabled') elif osc_msg == 'paused': self.playbut.config(state='normal') self.pausebut.config(state='disabled') elif osc_msg == 'playing': self.playbut.config(state='disabled') self.pausebut.config(state='normal') elif osc_msg == 'stopped': self.playbut.config(state='disabled') self.pausebut.config(state='disabled') def osc_map(self): # osc mappings (inputs) def sec_to_str(_,osc_msg): try: time_sec = float(osc_msg) self.vars['progress'].set("%d:%02d" % (time_sec // 60.0 , time_sec % 60.0)) except: self.vars['progress'].set("--:--") def float_to_prog(_,osc_msg): try: float_perc = float(osc_msg) self.progress_bar.move_bar(float_perc*self.progress_bar.width) except: self.progress_bar.move_bar(0) self.osc_server.map("/pyaud/pos/sec",sec_to_str) self.progress_bar.map_osc('/pyaud/pos/float') self.osc_server.map("/pyaud/pos/float",float_to_prog) self.osc_server.map("/pyaud/status",self.buttons_enabler) ############################### !!!!! ################### self.backend.record.map_record(self.osc_client) def open_file(self,*args): filename = tkfd.askopenfilename(parent=self.root,title='Choose your wav file',defaultextension='.wav', filetypes=[('Wav file','*.wav')]) splitname = os.path.splitext(filename) if splitname[1] == '.wav' or splitname[1] == '.WAV': self.osc_client.build_n_send('/pyaud/open',filename) self.current_song.fname = filename else: tkmb.showerror("Bad file","please choose a proper .wav file")