Now with 100% more classes

This commit is contained in:
Thomas Herrmann 2022-04-08 20:21:20 +02:00
parent a312e0540c
commit 0207f61739
1 changed files with 350 additions and 401 deletions

View File

@ -6,44 +6,141 @@ import pyaudio
import wave import wave
from tkinter import * from tkinter import *
from tkinter import filedialog as fd from tkinter import filedialog as fd
from tkinter import ttk
import time import time
import threading import threading
import os import os
device_list = []
op_device = [] class Midirecorder:
audio_device = [] def __init__(self):
loop_time = 0
inport = 0 self.window = Tk()
outport = 0 self.window.title('underbridge')
path = 0 self.window.resizable(width=False, height=False) #565A5E
folder = 0 self.window.tk_setPalette(background='#565A5E', foreground='black',activeBackground='#283867', activeForeground='black' )
pattern_nr = 0 #device_list = []
j = 0 self.op_device = []
mode_select=0 self.audio_device = []
addsec = 0 self.loop_time = 0
projectpath = 0 self.inport = 0
cancel = 0 self.outport = 0
RATE = 0 self.path = 0
mute_list =[0] * 14 #Midi mute selection of all 14 necessary channels self.folder = 0
self.pattern_nr = 0
self.j = 0
self.addsec = 0
self.projectpath = 0
self.cancel = 0
self.RATE = 0
self.mute_list =[0] * 14 #Midi mute selection of all 14 necessary channels
#modifier_dict = {"mod1": modifier1_va} #modifier_dict = {"mod1": modifier1_va}
def getMIDIDevice(): #GUI Main
global device_list self.buttonsize_x = 7
global op_device self.buttonsize_y = 2
self.mode_select = IntVar()
self.displaymsg = StringVar()
self.modifier1_value = IntVar()
self.modifier2_value = IntVar()
self.modifier3_value = IntVar()
self.modifier4_value = IntVar()
self.modifier5_value = IntVar()
self.modifier6_value = IntVar()
upperframe= LabelFrame(self.window, text= "Parameter",padx= 10, pady =2, fg = 'white')
upperframe.grid(row = 0, column = 0, padx =2, pady =2,)
lowerframe= Frame(self.window,padx= 10, pady =5)
lowerframe.grid(row = 2, column = 0, padx =2, pady =2)
modifiers = LabelFrame(self.window, text= "Exclude Modifiers",padx= 10, pady =2, fg = 'white')
modifiers.grid(row = 1, column = 0, padx =2, pady =2)
footer= Frame(self.window,padx= 15, pady =2)
footer. grid(row = 3, column = 0, padx =2, pady =2)
#Get_BPM = Button(upperframe, text="Get BPM",width = self.buttonsize_x, height = self.buttonsize_y, fg = 'lightgrey', command = getBPM)
Song = Radiobutton(lowerframe, text= 'Project', value = 2 , variable = self.mode_select, width = self.buttonsize_x, height = self.buttonsize_y , indicatoron = 0, bg= '#1b7d24' )
Pattern = Radiobutton(lowerframe, text= 'Pattern', value = 3 , variable = self.mode_select, width = self.buttonsize_x, height = self.buttonsize_y, indicatoron = 0,bg= '#1b7d24' )
Pattern.select()
self.bar_input = Scale(upperframe, from_ = 1, to = 4, orient = HORIZONTAL, label="Nr. Bars", sliderlength= 10, length= 75, fg = 'white')
self.patterns_input = Scale(upperframe, from_ = 1, to = 10, orient = HORIZONTAL, label="Patterns",sliderlength= 10, length= 75, fg = 'white')
self.patterns_input.set(value=10)
self.bpm_input = Entry(upperframe, width =10, text="BPM",bg= 'lightgrey', relief= FLAT)
self.bpm_input.insert(0, "BPM")
self.add_sec = Scale(upperframe, from_ = 0, to = 10, orient = HORIZONTAL, label="extra Sec", sliderlength= 10, length= 75, fg = 'white')
self.name_input = Entry(upperframe, width =10, text="Name",bg = 'lightgrey', relief= FLAT)
self.name_input.insert(0, "Name")
modifier1 = Checkbutton(modifiers, text="Send 1", variable=self.modifier1_value)
modifier1.grid(row = 0, column = 0, padx =5, pady =2)
modifier2 = Checkbutton(modifiers,text="Send 2", variable=self.modifier2_value)
modifier2.grid(row = 0, column = 1, padx =5, pady =2)
modifier3 = Checkbutton(modifiers,text="Tape",variable=self.modifier3_value )
modifier3.grid(row = 0, column = 2, padx =5, pady =2)
modifier4 = Checkbutton(modifiers,text="Master", variable= self.modifier4_value)
modifier4.grid(row = 0, column = 3, padx =5, pady =2)
modifier5 = Checkbutton(modifiers,text="Perform", variable= self.modifier5_value)
modifier5.grid(row = 0, column = 4, padx =5, pady =2)
modifier6 = Checkbutton(modifiers,text="Module", variable=self.modifier6_value)
modifier6.grid(row = 0, column = 5, padx =5, pady =2)
set_param = Button(lowerframe, text="Set Prmtr",width = self.buttonsize_x, height = self.buttonsize_y, fg = 'white',bg= '#0095FF', command = self.setParam)
set_path = Button(lowerframe, text="Directory",width = self.buttonsize_x, height = self.buttonsize_y,fg = 'white',bg= '#0095FF', command = self.setPath)
start_recording = Button(lowerframe, text="RECORD",width = self.buttonsize_x, height = self.buttonsize_y,fg = 'white', bg = '#FF2200', command = lambda:threading.Thread(target = self.sequenceMaster).start())
tutorial = Label(footer,text="Enter Parameter, then press set Param, choose directory and start recording", height = 2, bg ='grey',fg= 'white', relief = FLAT)
display = Label(lowerframe,textvariable= self.displaymsg,width = 60, height = self.buttonsize_y -1, bg ='lightgrey', relief = FLAT)
cancel = Button(lowerframe,text = "CANCEL" , width = self.buttonsize_x, height = self.buttonsize_y, bg ='#FFCC00', fg= 'white', command =self.cancelRec)
cancel.grid(row = 0, column = 6, padx =2, pady =2)
donate = Label(footer, text= "donate <3 @ https://link.raise-uav.com", height = 1)
donate.grid(row = 3, column = 4, padx =2, pady =10, columnspan=2)
Song.grid(row = 0, column = 1, padx =5, pady =2)
Pattern.grid(row = 0, column = 2, padx =5, pady =2)
self.name_input.grid(row = 0, column = 0, padx =5, pady =0)
self.bpm_input.grid(row = 0, column = 1, padx =5, pady =0)
self.bar_input.grid(row = 0, column = 3, padx =5, pady =2)
self.patterns_input.grid(row = 0, column = 4, padx =5, pady =2)
self.add_sec.grid(row = 0, column = 5, padx =5, pady =2)
set_param.grid(row = 0, column = 3, padx =5, pady =2)
set_path.grid(row = 0, column = 4, padx =5, pady =2)
start_recording.grid(row = 0, column = 5, padx =5, pady =2)
tutorial.grid(row = 1, column = 0, padx =5, pady =5, columnspan=5)
display.grid(row = 1, column = 0, padx =2, pady =10, columnspan= 7)
self.window.mainloop()
def getMIDIDevice(self):
#global device_list
#global op_device
device_list = mido.get_output_names() device_list = mido.get_output_names()
print (device_list) print (device_list)
try: try:
op_device = list(filter(lambda x: 'OP-Z' in x, device_list)) self.op_device = list(filter(lambda x: 'OP-Z' in x, device_list))
op_device = op_device[0] self.op_device = self.op_device[0]
print (op_device) print (self.op_device)
displaymsg.set("OP-Z found") self.displaymsg.set("OP-Z found")
except: except:
displaymsg.set("Can´t find OP-Z : MIDI Error.") self.displaymsg.set("Can´t find OP-Z : MIDI Error.")
def getAudioDevice(): def getAudioDevice(self):
global audio_device #global audio_device
global RATE #global RATE
p = pyaudio.PyAudio() p = pyaudio.PyAudio()
try: try:
info = p.get_host_api_info_by_index(0) info = p.get_host_api_info_by_index(0)
@ -54,175 +151,157 @@ def getAudioDevice():
for i in range(0, numdevices): for i in range(0, numdevices):
#audio_device = p.get_device_info_by_host_api_device_index(0, i).get('name') #audio_device = p.get_device_info_by_host_api_device_index(0, i).get('name')
if "OP-Z" in p.get_device_info_by_host_api_device_index(0, i).get('name') and (p.get_device_info_by_host_api_device_index(0, i).get('maxInputChannels')) > 0: if "OP-Z" in p.get_device_info_by_host_api_device_index(0, i).get('name') and (p.get_device_info_by_host_api_device_index(0, i).get('maxInputChannels')) > 0:
audio_device = i self.audio_device = i
#audio_device = 4 #audio_device = 4
print ("Detected OP-Z audio at Index:",audio_device, p.get_device_info_by_host_api_device_index(0, audio_device).get('name')) print ("Detected OP-Z audio at Index:",self.audio_device, p.get_device_info_by_host_api_device_index(0, self.audio_device).get('name'))
except: except:
displaymsg.set("OP-Z Audio Device not found.") self.displaymsg.set("OP-Z Audio Device not found.")
devinfo = p.get_device_info_by_index(audio_device) #devinfo = p.get_device_info_by_index(self.audio_device)
try: try:
devinfo = p.get_device_info_by_index(audio_device) devinfo = p.get_device_info_by_index(self.audio_device)
test = p.is_format_supported(48000, input_device=devinfo['index'], input_channels=devinfo['maxInputChannels'],input_format=pyaudio.paInt16) test = p.is_format_supported(48000, input_device=devinfo['index'], input_channels=devinfo['maxInputChannels'],input_format=pyaudio.paInt16)
RATE = 48000 self.RATE = 48000
print("48kHz") print("48kHz")
except: except:
RATE = 44100 self.RATE = 44100
print("44100kHz compatibility mode") print("44100kHz compatibility mode")
def getBPM(): def getBPM(self):
global op_device inport= mido.open_input(self.op_device)
inport= mido.open_input(op_device) msg = inport.poll(self)
msg = inport.poll()
#print(msg) #print(msg)
def setLoop(): def setLoop(self):
global loop_time
try: try:
bpm = bpm_input.get() bpm = self.bpm_input.get()
bar = bar_input.get() bar = self.bar_input.get()
addsec = add_sec.get() addsec = self.add_sec.get()
loop_time = (240 / int(bpm) * int(bar)) + int(addsec) self.loop_time = (240 / int(bpm) * int(bar)) + int(addsec)
print("Loop time set!") print("Loop time set!", self.loop_time)
displaymsg.set("BPM Set!") self.displaymsg.set("BPM Set!")
except: except:
displaymsg.set("Please enter accurate BPM.") self.displaymsg.set("Please enter accurate BPM.")
return time #return self.loop_time
def setParam(): def setParam(self):
setLoop() self.setLoop()
#mode = mode_select.get() #mode = mode_select.get()
#if mode == 2: #if mode == 2:
# projnr = project_input.get() # projnr = project_input.get()
# setProject(projnr) # setProject(projnr)
def openMidi(): def openMidi(self):
global outport #global outport
global op_device #global op_device
outport= mido.open_output(op_device) self.outport= mido.open_output(self.op_device)
#displaymsg.set("OP-Z MIDI not connected :(") #displaymsg.set("OP-Z MIDI not connected :(")
print(outport) print(self.outport)
def setProject(projnr): def setProject(self,projnr):
global outport msg= mido.Message('program_change',song= self.projnr, program = 1)
msg= mido.Message('program_change',song= projnr, program = 1) self.outport.send(msg)
outport.send(msg)
def muteAll(): def muteAll(self):
global mute_list
global outport
checkbutton_name = 0 checkbutton_name = 0
print(mute_list) print(self.mute_list)
for j in range (0,7): for j in range (0,7):
mute_list[j] = 1 self.mute_list[j] = 1
for i in range (1,7): for i in range (1,6):
checkbutton_name = 'modifier{}_value'.format(i) #'k{}'.format(i) checkbutton_name = 'self.modifier{}_value'.format(i) #checkbutton 1- 6
#print(checkbutton_name) self.mute_list[i+7] = eval(checkbutton_name).get() #9th position in mute list
mute_list[i+7] = eval(checkbutton_name).get()
for k in range (0,13): for k in range (0,13):
msg = mido.Message('control_change',control= 53, channel= k, value= mute_list[k]) msg = mido.Message('control_change',control= 53, channel= k, value= self.mute_list[k])
outport.send(msg) self.outport.send(msg)
print("Muted Channels",mute_list) print("Muted Channels",self.mute_list)
def setSolo(chn): def setSolo(self,chn):
global outport
msg = mido.Message('control_change',control= 53, channel= chn, value=0) msg = mido.Message('control_change',control= 53, channel= chn, value=0)
outport.send(msg) self.outport.send(msg)
def start_MIDI(): def start_MIDI(self):
global outport
msg = mido.Message('start') msg = mido.Message('start')
outport.send(msg) self.outport.send(msg)
displaymsg.set("Playback started") self.displaymsg.set("Playback started")
print("midi")
def stop_MIDI(): def stop_MIDI(self):
global outport
msg = mido.Message('stop') msg = mido.Message('stop')
outport.send(msg) self.outport.send(msg)
displaymsg.set("Playback stopped") self.displaymsg.set("Playback stopped")
def unmuteAll(): def unmuteAll(self):
global outport
for i in range (0,15): for i in range (0,15):
msg = mido.Message('control_change',control= 53, channel= i, value=0) msg = mido.Message('control_change',control= 53, channel= i, value=0)
outport.send(msg) self.outport.send(msg)
def nextPattern(): def nextPattern(self):
global outport
msg = mido.Message('control_change', control = 103, value = 16) msg = mido.Message('control_change', control = 103, value = 16)
outport.send(msg) self.outport.send(msg)
displaymsg.set("Next Pattern") self.displaymsg.set("Next Pattern")
def nextSong(): def nextSong(self):
pass pass
def closeMidi(): def closeMidi(self):
global outport self.outport.close()
outport.close() self.displaymsg.set("MIDI closed")
displaymsg.set("MIDI closed")
def setPath(): def setPath(self):
global path #global path
folder = name_input.get() folder = self.name_input.get()
path = fd.askdirectory() path = fd.askdirectory()
displaymsg.set("Directory set!") self.displaymsg.set("Directory set!")
makeDir() self.makeDir(path,folder)
def makeDir(): def makeDir(self,path,folder):
global folder #global folder
global projectpath #global projectpath
folder = name_input.get() #folder = name_input.get()
projectpath = path + '/' + folder self.projectpath = path + '/' + folder
try: try:
os.mkdir(projectpath) os.mkdir(self.projectpath)
except: except:
displaymsg.set("Directory Error. Please enter different Name.") self.displaymsg.set("Directory Error. Please enter different Name.")
def makeDirNr(pattern_nr): def makeDirNr(self, pattern_nr):
global projectpath #global projectpath
#Pfad wird addiert deswegen zusätzliche verzeichnisse #Pfad wird addiert deswegen zusätzliche verzeichnisse
#projectpath = projectpath + '/' + str(pattern_nr) #projectpath = projectpath + '/' + str(pattern_nr)
try: try:
os.mkdir(projectpath + '/' + str(pattern_nr)) os.mkdir(self.projectpath + '/' + str(pattern_nr))
except: except:
displaymsg.set("Directory Error") self.displaymsg.set("Directory Error")
#print(projectpath) #print(projectpath)
def start_Rec(): def start_Rec(self):
displaymsg.set("Recording...") print("record")
global path self.displaymsg.set("Recording...")
global time
global j
global pro
global pattern_nr
global audio_device
global RATE
CHUNK = 128 CHUNK = 128
FORMAT = pyaudio.paInt16 FORMAT = pyaudio.paInt16
CHANNELS = 2 CHANNELS = 2
#RATE = 44100
RECORD_SECONDS = loop_time
WAVE_OUTPUT_FILENAME = name_input.get()+ "_" + "track" + str(j+1) + ".wav"
RECORD_SECONDS= self.loop_time
print("record")
WAVE_OUTPUT_FILENAME = self.name_input.get() + "_" + "track" + str(self.j+1) + ".wav"
print(WAVE_OUTPUT_FILENAME)
p = pyaudio.PyAudio() p = pyaudio.PyAudio()
stream = p.open(format=FORMAT, stream = p.open(format=FORMAT,
channels=CHANNELS, channels=CHANNELS,
rate=RATE, rate=self.RATE,
input=True, input=True,
input_device_index= audio_device, input_device_index= self.audio_device,
frames_per_buffer=CHUNK frames_per_buffer=CHUNK
) )
#print("* recording") print("* recording")
frames = [] frames = []
start_MIDI() self.start_MIDI()
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)): for i in range(0, int(self.RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK) data = stream.read(CHUNK)
frames.append(data) frames.append(data)
@ -231,193 +310,63 @@ def start_Rec():
stream.stop_stream() stream.stop_stream()
stream.close() stream.close()
p.terminate() p.terminate()
if mode_select.get() == 2: if self.mode_select.get() == 2:
wf = wave.open(projectpath + '/' + str(pattern_nr) + '/' + WAVE_OUTPUT_FILENAME, 'wb') wf = wave.open(self.projectpath + '/' + str(self.pattern_nr) + '/' + WAVE_OUTPUT_FILENAME, 'wb')
else: else:
wf = wave.open(projectpath + '/' + WAVE_OUTPUT_FILENAME, 'wb') wf = wave.open(self.projectpath + '/' + WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS) wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT)) wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE) wf.setframerate(self.RATE)
wf.writeframes(b''.join(frames)) wf.writeframes(b''.join(frames))
wf.close() wf.close()
j = j + 1 self.j = self.j + 1
if j == 8: if self.j == 8:
j= 0 self.j= 0
displaymsg.set("End of Recording") self.displaymsg.set("End of Recording")
def sequenceMaster(): def sequenceMaster(self):
self.cancel = 0
global cancel self.getMIDIDevice()
global pattern_nr
cancel = 0
#print("test")
getMIDIDevice()
time.sleep(1) time.sleep(1)
getAudioDevice() self.getAudioDevice()
self.displaymsg.set("Sequence started")
displaymsg.set("Sequence started")
try: try:
openMidi() self.openMidi()
if self.mode_select.get() == 2:
self.makeDirNr(self.pattern_nr)
if mode_select.get() == 2: for i in range (0,8):
makeDirNr(pattern_nr) pattern_limit = self.patterns_input.get()
if self.cancel == 1 or self.pattern_nr == pattern_limit:
for i in range (0,8): #
pattern_limit = patterns_input.get()
if cancel == 1 or pattern_nr == pattern_limit:
break break
#print("sequence started",i) #print("sequence started",i)
muteAll() self.muteAll()
time.sleep(0.1) time.sleep(0.1)
setSolo(i) self.setSolo(i)
#starting Midi during wave record for timing #starting Midi during wave record for timing
start_Rec() self.start_Rec()
#print(i) self.stop_MIDI()
stop_MIDI()
time.sleep(1) time.sleep(1)
unmuteAll() self.unmuteAll()
mode = mode_select.get() mode = self.mode_select.get()
if i == 7 and mode == 2: if i == 7 and mode == 2:
#print(mode_select) #print(mode_select)
time.sleep(5) time.sleep(5)
nextPattern() self.nextPattern()
pattern_nr += 1 self.pattern_nr += 1
if pattern_nr == 9 : if self.pattern_nr == 9 :
pattern_nr = 0 self.pattern_nr = 0
sequenceMaster() self.sequenceMaster()
except: except:
displaymsg.set("OP-Z Sequence error try restarting the OP-Z or press CANCEL Button") self.displaymsg.set("OP-Z Sequence error try restarting the OP-Z or press CANCEL Button")
def cancelRec(): def cancelRec(self):
global cancel self.j = 0
global outport self.cancel = 1
global j self.closeMidi()
j = 0
cancel = 1
closeMidi()
#GUI Main
buttonsize_x = 7
buttonsize_y = 2
mode_select = 0
root = Tk() underbridge = Midirecorder()
root.title('underbridge for OP-Z')
root.resizable(width=False, height=False) #565A5E
root.tk_setPalette(background='#565A5E', foreground='black',activeBackground='#283867', activeForeground='black' )
upperframe= LabelFrame(root, text= "Parameter",padx= 10, pady =2, fg = 'white')
upperframe.grid(row = 0, column = 0, padx =2, pady =2,)
lowerframe= Frame(root,padx= 10, pady =5)
lowerframe.grid(row = 2, column = 0, padx =2, pady =2)
modifiers = LabelFrame(root, text= "Exclude Modifiers",padx= 10, pady =2, fg = 'white')
modifiers.grid(row = 1, column = 0, padx =2, pady =2)
footer= Frame(root,padx= 15, pady =2)
footer. grid(row = 3, column = 0, padx =2, pady =2)
mode_select = IntVar()
displaymsg = StringVar()
modifier1_value = IntVar()
modifier2_value = IntVar()
modifier3_value = IntVar()
modifier4_value = IntVar()
modifier5_value = IntVar()
modifier6_value = IntVar()
#root.geometry('550x150+0+0')
Get_BPM = Button(upperframe, text="Get BPM",width = buttonsize_x, height = buttonsize_y, fg = 'lightgrey', command = lambda:getBPM())
#ALL = Radiobutton(lowerframe, text= 'ALL', value = 1 , variable = mode_select, width = buttonsize_x, height = buttonsize_y , indicatoron = 0, bg= '#1b7d24' )
Song = Radiobutton(lowerframe, text= 'Project', value = 2 , variable = mode_select, width = buttonsize_x, height = buttonsize_y , indicatoron = 0, bg= '#1b7d24' )
Pattern = Radiobutton(lowerframe, text= 'Pattern', value = 3 , variable = mode_select, width = buttonsize_x, height = buttonsize_y, indicatoron = 0,bg= '#1b7d24' )
Pattern.select()
bar_input = Scale(upperframe, from_ = 1, to = 4, orient = HORIZONTAL, label="Nr. Bars", sliderlength= 10, length= 75, fg = 'white')
#bar_text = Label(upperframe,text="Nr. of Bars", width = 8, height = 1)
patterns_input = Scale(upperframe, from_ = 1, to = 10, orient = HORIZONTAL, label="Patterns",sliderlength= 10, length= 75, fg = 'white')
patterns_input.set(value=10)
bpm_input = Entry(upperframe, width =10, text="BPM",bg= 'lightgrey', relief= FLAT)
#bpm_text = Label(upperframe,text="BPM", width = 8, height = 1)
bpm_input.insert(0, "BPM")
#project_input = Entry(upperframe, width =10, text="Project",bg= 'white')
#bpm_text = Label(upperframe,text="BPM", width = 8, height = 1)
#project_input.insert(0, "Project Nr.")
add_sec = Scale(upperframe, from_ = 0, to = 10, orient = HORIZONTAL, label="extra Sec", sliderlength= 10, length= 75, fg = 'white')
#add_text = Label(upperframe,text="Sec offset", width = 8, height = 1)
name_input = Entry(upperframe, width =10, text="Name",bg = 'lightgrey', relief= FLAT)
name_input.insert(0, "Name")
#name_text = Label(upperframe,text="Prj Name", width = 8, height = 1)
modifier1 = Checkbutton(modifiers, text="Send 1", variable=modifier1_value)
modifier1.grid(row = 0, column = 0, padx =5, pady =2)
modifier2 = Checkbutton(modifiers,text="Send 2", variable=modifier2_value)
modifier2.grid(row = 0, column = 1, padx =5, pady =2)
modifier3 = Checkbutton(modifiers,text="Tape",variable=modifier3_value )
modifier3.grid(row = 0, column = 2, padx =5, pady =2)
modifier4 = Checkbutton(modifiers,text="Master", variable= modifier4_value)
modifier4.grid(row = 0, column = 3, padx =5, pady =2)
modifier5 = Checkbutton(modifiers,text="Perform", variable= modifier5_value)
modifier5.grid(row = 0, column = 4, padx =5, pady =2)
modifier6 = Checkbutton(modifiers,text="Module", variable= modifier6_value)
modifier6.grid(row = 0, column = 5, padx =5, pady =2)
set_param = Button(lowerframe, text="Set Prmtr",width = buttonsize_x, height = buttonsize_y, fg = 'white',bg= '#0095FF', command = lambda:setParam())
set_path = Button(lowerframe, text="Directory",width = buttonsize_x, height = buttonsize_y,fg = 'white',bg= '#0095FF', command = lambda:setPath())
start_recording = Button(lowerframe, text="RECORD",width = buttonsize_x, height = buttonsize_y,fg = 'white', bg = '#FF2200', command = lambda:threading.Thread(target = sequenceMaster).start())
tutorial = Label(footer,text="Enter Parameter, then press set Param, choose directory and start recording", height = 2, bg ='grey',fg= 'white', relief = FLAT)
display = Label(lowerframe,textvariable= displaymsg,width = 60, height = buttonsize_y -1, bg ='lightgrey', relief = FLAT)
cancel = Button(lowerframe,text = "CANCEL" , width = buttonsize_x, height = buttonsize_y, bg ='#FFCC00', fg= 'white', command = lambda: cancelRec())
cancel.grid(row = 0, column = 6, padx =2, pady =2)
donate = Label(footer, text= "donate <3 @ https://link.raise-uav.com", height = 1)
donate.grid(row = 3, column = 4, padx =2, pady =10, columnspan=2)
#Get_BPM.grid(row = 1, column = 0, padx =2, pady =2)
#ALL.grid()
Song.grid(row = 0, column = 1, padx =5, pady =2)
Pattern.grid(row = 0, column = 2, padx =5, pady =2)
name_input.grid(row = 0, column = 0, padx =5, pady =0)
#name_text.grid(row = 1, column = 2, padx =0, pady =0)
bpm_input.grid(row = 0, column = 1, padx =5, pady =0)
#bpm_text.grid(row = 0, column = 0, padx =0, pady =0)
#project_input.grid(row = 0, column = 2, padx =5, pady =0)
bar_input.grid(row = 0, column = 3, padx =5, pady =2)
#bar_text.grid(row = 1, column = 2, padx =0, pady =0)
patterns_input.grid(row = 0, column = 4, padx =5, pady =2)
add_sec.grid(row = 0, column = 5, padx =5, pady =2)
#add_text.grid(row = 1, column = 0, padx =0, pady =0)
set_param.grid(row = 0, column = 3, padx =5, pady =2)
set_path.grid(row = 0, column = 4, padx =5, pady =2)
start_recording.grid(row = 0, column = 5, padx =5, pady =2)
tutorial.grid(row = 1, column = 0, padx =5, pady =5, columnspan=5)
display.grid(row = 1, column = 0, padx =2, pady =10, columnspan= 7)
root.mainloop()