mirror of
https://github.com/Anjok07/ultimatevocalremovergui.git
synced 2024-12-01 02:27:21 +01:00
3385 lines
177 KiB
Python
3385 lines
177 KiB
Python
# GUI modules
|
|
import os
|
|
import pyperclip
|
|
import natsort
|
|
from gc import freeze
|
|
import tkinter as tk
|
|
from tkinter import *
|
|
from tkinter.tix import *
|
|
import webbrowser
|
|
from tracemalloc import stop
|
|
import lib_v5.sv_ttk
|
|
import tkinter.ttk as ttk
|
|
import tkinter.messagebox
|
|
import tkinter.filedialog
|
|
import tkinter.font
|
|
from tkinterdnd2 import TkinterDnD, DND_FILES # Enable Drag & Drop
|
|
import pyglet,tkinter
|
|
from datetime import datetime
|
|
# Images
|
|
from PIL import Image
|
|
from PIL import ImageTk
|
|
import pickle # Save Data
|
|
from pathlib import Path
|
|
# Other Modules
|
|
|
|
# Pathfinding
|
|
import pathlib
|
|
import sys
|
|
import subprocess
|
|
from collections import defaultdict
|
|
# Used for live text displaying
|
|
import queue
|
|
import threading # Run the algorithm inside a thread
|
|
from subprocess import call
|
|
from pathlib import Path
|
|
import ctypes as ct
|
|
import subprocess # Run python file
|
|
import inference_MDX
|
|
import inference_v5
|
|
import inference_v5_ensemble
|
|
import inference_demucs
|
|
|
|
|
|
from win32api import GetSystemMetrics
|
|
|
|
try:
|
|
with open(os.path.join(os.getcwd(), 'tmp', 'splash.txt'), 'w') as f:
|
|
f.write('1')
|
|
except:
|
|
pass
|
|
|
|
# Change the current working directory to the directory
|
|
# this file sits in
|
|
if getattr(sys, 'frozen', False):
|
|
# If the application is run as a bundle, the PyInstaller bootloader
|
|
# extends the sys module by a flag frozen=True and sets the app
|
|
# path into variable _MEIPASS'.
|
|
base_path = sys._MEIPASS
|
|
else:
|
|
base_path = os.path.dirname(os.path.abspath(__file__))
|
|
|
|
os.chdir(base_path) # Change the current working directory to the base path
|
|
|
|
#Images
|
|
instrumentalModels_dir = os.path.join(base_path, 'models')
|
|
banner_path = os.path.join(base_path, 'img', 'UVR-banner.png')
|
|
efile_path = os.path.join(base_path, 'img', 'file.png')
|
|
stop_path = os.path.join(base_path, 'img', 'stop.png')
|
|
help_path = os.path.join(base_path, 'img', 'help.png')
|
|
gen_opt_path = os.path.join(base_path, 'img', 'gen_opt.png')
|
|
mdx_opt_path = os.path.join(base_path, 'img', 'mdx_opt.png')
|
|
vr_opt_path = os.path.join(base_path, 'img', 'vr_opt.png')
|
|
demucs_opt_path = os.path.join(base_path, 'img', 'demucs_opt.png')
|
|
ense_opt_path = os.path.join(base_path, 'img', 'ense_opt.png')
|
|
user_ens_opt_path = os.path.join(base_path, 'img', 'user_ens_opt.png')
|
|
credits_path = os.path.join(base_path, 'img', 'credits.png')
|
|
|
|
DEFAULT_DATA = {
|
|
'exportPath': '',
|
|
'inputPaths': [],
|
|
'saveFormat': 'Wav',
|
|
'vr_ensem': '2_HP-UVR',
|
|
'vr_ensem_a': '1_HP-UVR',
|
|
'vr_ensem_b': '2_HP-UVR',
|
|
'vr_ensem_c': 'No Model',
|
|
'vr_ensem_d': 'No Model',
|
|
'vr_ensem_e': 'No Model',
|
|
'vr_ensem_mdx_a': 'No Model',
|
|
'vr_ensem_mdx_b': 'No Model',
|
|
'vr_ensem_mdx_c': 'No Model',
|
|
'mdx_ensem': 'UVR-MDX-NET 1',
|
|
'mdx_ensem_b': 'No Model',
|
|
'gpu': False,
|
|
'postprocess': False,
|
|
'tta': False,
|
|
'save': True,
|
|
'output_image': False,
|
|
'window_size': '512',
|
|
'agg': 10,
|
|
'modelFolder': False,
|
|
'modelInstrumentalLabel': '',
|
|
'aiModel': 'MDX-Net',
|
|
'algo': 'Instrumentals (Min Spec)',
|
|
'demucs_stems': 'All Stems',
|
|
'ensChoose': 'Multi-AI Ensemble',
|
|
'useModel': 'instrumental',
|
|
'lastDir': None,
|
|
'break': False,
|
|
#Advanced Options
|
|
'appendensem': False,
|
|
'demucs_only': False,
|
|
'split_mode': True,
|
|
#MDX-Net
|
|
'demucsmodel': True,
|
|
'non_red': False,
|
|
'noise_reduc': True,
|
|
'voc_only': False,
|
|
'inst_only': False,
|
|
'voc_only_b': False,
|
|
'inst_only_b': False,
|
|
'audfile': True,
|
|
'chunks': 'Auto',
|
|
'n_fft_scale': 6144,
|
|
'dim_f': 2048,
|
|
'noise_pro_select': 'Auto Select',
|
|
'overlap': 0.25,
|
|
'shifts': 2,
|
|
'overlap_b': 0.25,
|
|
'shifts_b': 2,
|
|
'margin': 44100,
|
|
'channel': 64,
|
|
'compensate': 1.03597672895,
|
|
'mdxnetModeltype': 'Vocals (Custom)',
|
|
'noisereduc_s': '3',
|
|
'mixing': 'Default',
|
|
'mdxnetModel': 'UVR-MDX-NET 1',
|
|
'DemucsModel': 'mdx_extra',
|
|
'DemucsModel_MDX': 'UVR_Demucs_Model_1',
|
|
'ModelParams': 'Auto',
|
|
}
|
|
|
|
def open_image(path: str, size: tuple = None, keep_aspect: bool = True, rotate: int = 0) -> ImageTk.PhotoImage:
|
|
"""
|
|
Open the image on the path and apply given settings\n
|
|
Paramaters:
|
|
path(str):
|
|
Absolute path of the image
|
|
size(tuple):
|
|
first value - width
|
|
second value - height
|
|
keep_aspect(bool):
|
|
keep aspect ratio of image and resize
|
|
to maximum possible width and height
|
|
(maxima are given by size)
|
|
rotate(int):
|
|
clockwise rotation of image
|
|
Returns(ImageTk.PhotoImage):
|
|
Image of path
|
|
"""
|
|
img = Image.open(path).convert(mode='RGBA')
|
|
ratio = img.height/img.width
|
|
img = img.rotate(angle=-rotate)
|
|
if size is not None:
|
|
size = (int(size[0]), int(size[1]))
|
|
if keep_aspect:
|
|
img = img.resize((size[0], int(size[0] * ratio)), Image.ANTIALIAS)
|
|
else:
|
|
img = img.resize(size, Image.ANTIALIAS)
|
|
return ImageTk.PhotoImage(img)
|
|
|
|
def save_data(data):
|
|
"""
|
|
Saves given data as a .pkl (pickle) file
|
|
|
|
Paramters:
|
|
data(dict):
|
|
Dictionary containing all the necessary data to save
|
|
"""
|
|
# Open data file, create it if it does not exist
|
|
with open('data.pkl', 'wb') as data_file:
|
|
pickle.dump(data, data_file)
|
|
|
|
def load_data() -> dict:
|
|
"""
|
|
Loads saved pkl file and returns the stored data
|
|
|
|
Returns(dict):
|
|
Dictionary containing all the saved data
|
|
"""
|
|
try:
|
|
with open('data.pkl', 'rb') as data_file: # Open data file
|
|
data = pickle.load(data_file)
|
|
|
|
return data
|
|
except (ValueError, FileNotFoundError):
|
|
# Data File is corrupted or not found so recreate it
|
|
save_data(data=DEFAULT_DATA)
|
|
|
|
return load_data()
|
|
|
|
def drop(event, accept_mode: str = 'files'):
|
|
"""
|
|
Drag & Drop verification process
|
|
"""
|
|
global dnd
|
|
global dnddir
|
|
|
|
path = event.data
|
|
|
|
if accept_mode == 'folder':
|
|
path = path.replace('{', '').replace('}', '')
|
|
if not os.path.isdir(path):
|
|
tk.messagebox.showerror(title='Invalid Folder',
|
|
message='Your given export path is not a valid folder!')
|
|
return
|
|
# Set Variables
|
|
root.exportPath_var.set(path)
|
|
elif accept_mode == 'files':
|
|
# Clean path text and set path to the list of paths
|
|
path = path.replace('{', '')
|
|
path = path.split('} ')
|
|
path[-1] = path[-1].replace('}', '')
|
|
# Set Variables
|
|
dnd = 'yes'
|
|
root.inputPaths = path
|
|
root.update_inputPaths()
|
|
dnddir = os.path.dirname(path[0])
|
|
print('dnddir ', str(dnddir))
|
|
else:
|
|
# Invalid accept mode
|
|
return
|
|
|
|
class ThreadSafeConsole(tk.Text):
|
|
"""
|
|
Text Widget which is thread safe for tkinter
|
|
"""
|
|
def __init__(self, master, **options):
|
|
tk.Text.__init__(self, master, **options)
|
|
self.queue = queue.Queue()
|
|
self.update_me()
|
|
|
|
def write(self, line):
|
|
self.queue.put(line)
|
|
|
|
def clear(self):
|
|
self.queue.put(None)
|
|
|
|
def update_me(self):
|
|
self.configure(state=tk.NORMAL)
|
|
try:
|
|
while 1:
|
|
line = self.queue.get_nowait()
|
|
if line is None:
|
|
self.delete(1.0, tk.END)
|
|
else:
|
|
self.insert(tk.END, str(line))
|
|
self.see(tk.END)
|
|
self.update_idletasks()
|
|
except queue.Empty:
|
|
pass
|
|
self.configure(state=tk.DISABLED)
|
|
self.after(100, self.update_me)
|
|
|
|
class MainWindow(TkinterDnD.Tk):
|
|
# --Constants--
|
|
# Layout
|
|
|
|
if GetSystemMetrics(1) >= 900:
|
|
IMAGE_HEIGHT = 140
|
|
FILEPATHS_HEIGHT = 85
|
|
OPTIONS_HEIGHT = 275
|
|
CONVERSIONBUTTON_HEIGHT = 35
|
|
COMMAND_HEIGHT = 200
|
|
PROGRESS_HEIGHT = 30
|
|
PADDING = 10
|
|
elif GetSystemMetrics(1) <= 720:
|
|
IMAGE_HEIGHT = 135
|
|
FILEPATHS_HEIGHT = 85
|
|
OPTIONS_HEIGHT = 274
|
|
CONVERSIONBUTTON_HEIGHT = 35
|
|
COMMAND_HEIGHT = 80
|
|
PROGRESS_HEIGHT = 6
|
|
PADDING = 5
|
|
else:
|
|
IMAGE_HEIGHT = 135
|
|
FILEPATHS_HEIGHT = 85
|
|
OPTIONS_HEIGHT = 274
|
|
CONVERSIONBUTTON_HEIGHT = 35
|
|
COMMAND_HEIGHT = 115
|
|
PROGRESS_HEIGHT = 6
|
|
PADDING = 7
|
|
|
|
COL1_ROWS = 11
|
|
COL2_ROWS = 11
|
|
|
|
def __init__(self):
|
|
# Run the __init__ method on the tk.Tk class
|
|
super().__init__()
|
|
|
|
# Calculate window height
|
|
height = self.IMAGE_HEIGHT + self.FILEPATHS_HEIGHT + self.OPTIONS_HEIGHT
|
|
height += self.CONVERSIONBUTTON_HEIGHT + self.COMMAND_HEIGHT + self.PROGRESS_HEIGHT
|
|
height += self.PADDING * 5 # Padding
|
|
|
|
# --Window Settings--
|
|
self.title('Ultimate Vocal Remover')
|
|
# Set Geometry and Center Window
|
|
self.geometry('{width}x{height}+{xpad}+{ypad}'.format(
|
|
width=620,
|
|
height=height,
|
|
xpad=int(self.winfo_screenwidth()/2 - 635/2),
|
|
ypad=int(self.winfo_screenheight()/2 - height/2 - 30)))
|
|
if GetSystemMetrics(1) >= 900:
|
|
pass
|
|
else:
|
|
self.tk.call('tk', 'scaling', 1.1)
|
|
self.configure(bg='#0e0e0f') # Set background color to #0c0c0d
|
|
self.protocol("WM_DELETE_WINDOW", self.save_values)
|
|
self.resizable(False, False)
|
|
self.update()
|
|
|
|
# --Variables--
|
|
self.logo_img = open_image(path=banner_path,
|
|
size=(self.winfo_width(), 9999))
|
|
self.efile_img = open_image(path=efile_path,
|
|
size=(20, 20))
|
|
self.stop_img = open_image(path=stop_path,
|
|
size=(20, 20))
|
|
self.help_img = open_image(path=help_path,
|
|
size=(20, 20))
|
|
if GetSystemMetrics(1) >= 900:
|
|
self.gen_opt_img = open_image(path=gen_opt_path,
|
|
size=(900, 826))
|
|
self.mdx_opt_img = open_image(path=mdx_opt_path,
|
|
size=(900, 826))
|
|
self.vr_opt_img = open_image(path=vr_opt_path,
|
|
size=(900, 826))
|
|
self.demucs_opt_img = open_image(path=demucs_opt_path,
|
|
size=(900, 826))
|
|
self.ense_opt_img = open_image(path=ense_opt_path,
|
|
size=(900, 826))
|
|
self.user_ens_opt_img = open_image(path=user_ens_opt_path,
|
|
size=(900, 826))
|
|
self.credits_img = open_image(path=credits_path,
|
|
size=(100, 100))
|
|
elif GetSystemMetrics(1) <= 720:
|
|
self.gen_opt_img = open_image(path=gen_opt_path,
|
|
size=(740, 826))
|
|
self.mdx_opt_img = open_image(path=mdx_opt_path,
|
|
size=(740, 826))
|
|
self.vr_opt_img = open_image(path=vr_opt_path,
|
|
size=(695, 826))
|
|
self.demucs_opt_img = open_image(path=demucs_opt_path,
|
|
size=(695, 826))
|
|
self.ense_opt_img = open_image(path=ense_opt_path,
|
|
size=(740, 826))
|
|
self.user_ens_opt_img = open_image(path=user_ens_opt_path,
|
|
size=(740, 826))
|
|
self.credits_img = open_image(path=credits_path,
|
|
size=(50, 50))
|
|
else:
|
|
self.gen_opt_img = open_image(path=gen_opt_path,
|
|
size=(740, 826))
|
|
self.mdx_opt_img = open_image(path=mdx_opt_path,
|
|
size=(740, 826))
|
|
self.vr_opt_img = open_image(path=vr_opt_path,
|
|
size=(730, 826))
|
|
self.demucs_opt_img = open_image(path=vr_opt_path,
|
|
size=(730, 826))
|
|
self.ense_opt_img = open_image(path=demucs_opt_path,
|
|
size=(740, 826))
|
|
self.user_ens_opt_img = open_image(path=user_ens_opt_path,
|
|
size=(740, 826))
|
|
self.credits_img = open_image(path=credits_path,
|
|
size=(50, 50))
|
|
|
|
self.instrumentalLabel_to_path = defaultdict(lambda: '')
|
|
self.lastInstrumentalModels = []
|
|
self.MDXLabel_to_path = defaultdict(lambda: '')
|
|
self.lastMDXModels = []
|
|
self.ModelParamsLabel_to_path = defaultdict(lambda: '')
|
|
self.lastModelParams = []
|
|
self.DemucsLabel_to_path = defaultdict(lambda: '')
|
|
self.lastDemucsModels = []
|
|
self.DemucsLabel_to_path_MDX = defaultdict(lambda: '')
|
|
self.lastDemucsModels_MDX = []
|
|
|
|
# -Tkinter Value Holders-
|
|
data = load_data()
|
|
# Paths
|
|
self.inputPaths = data['inputPaths']
|
|
self.inputPathop_var = tk.StringVar(value=data['inputPaths'])
|
|
self.exportPath_var = tk.StringVar(value=data['exportPath'])
|
|
self.saveFormat_var = tk.StringVar(value=data['saveFormat'])
|
|
self.vrensemchoose_var = tk.StringVar(value=data['vr_ensem'])
|
|
self.vrensemchoose_a_var = tk.StringVar(value=data['vr_ensem_a'])
|
|
self.vrensemchoose_b_var = tk.StringVar(value=data['vr_ensem_b'])
|
|
self.vrensemchoose_c_var = tk.StringVar(value=data['vr_ensem_c'])
|
|
self.vrensemchoose_d_var = tk.StringVar(value=data['vr_ensem_d'])
|
|
|
|
self.vrensemchoose_e_var = tk.StringVar(value=data['vr_ensem_e'])
|
|
self.vrensemchoose_mdx_a_var = tk.StringVar(value=data['vr_ensem_mdx_a'])
|
|
self.vrensemchoose_mdx_b_var = tk.StringVar(value=data['vr_ensem_mdx_b'])
|
|
self.vrensemchoose_mdx_c_var = tk.StringVar(value=data['vr_ensem_mdx_c'])
|
|
self.mdxensemchoose_var = tk.StringVar(value=data['mdx_ensem'])
|
|
self.mdxensemchoose_b_var = tk.StringVar(value=data['mdx_ensem_b'])
|
|
#Advanced Options
|
|
self.appendensem_var = tk.BooleanVar(value=data['appendensem'])
|
|
self.demucs_only_var = tk.BooleanVar(value=data['demucs_only'])
|
|
self.split_mode_var = tk.BooleanVar(value=data['split_mode'])
|
|
# Processing Options
|
|
self.gpuConversion_var = tk.BooleanVar(value=data['gpu'])
|
|
self.postprocessing_var = tk.BooleanVar(value=data['postprocess'])
|
|
self.tta_var = tk.BooleanVar(value=data['tta'])
|
|
self.save_var = tk.BooleanVar(value=data['save'])
|
|
self.outputImage_var = tk.BooleanVar(value=data['output_image'])
|
|
# MDX-NET Specific Processing Options
|
|
self.demucsmodel_var = tk.BooleanVar(value=data['demucsmodel'])
|
|
self.non_red_var = tk.BooleanVar(value=data['non_red'])
|
|
self.noisereduc_var = tk.BooleanVar(value=data['noise_reduc'])
|
|
self.chunks_var = tk.StringVar(value=data['chunks'])
|
|
self.noisereduc_s_var = tk.StringVar(value=data['noisereduc_s'])
|
|
self.mixing_var = tk.StringVar(value=data['mixing']) #dropdown
|
|
# Models
|
|
self.instrumentalModel_var = tk.StringVar(value=data['modelInstrumentalLabel'])
|
|
# Model Test Mode
|
|
self.modelFolder_var = tk.BooleanVar(value=data['modelFolder'])
|
|
# Constants
|
|
self.winSize_var = tk.StringVar(value=data['window_size'])
|
|
self.agg_var = tk.StringVar(value=data['agg'])
|
|
self.n_fft_scale_var = tk.StringVar(value=data['n_fft_scale'])
|
|
self.dim_f_var = tk.StringVar(value=data['dim_f'])
|
|
self.noise_pro_select_var = tk.StringVar(value=data['noise_pro_select'])
|
|
self.overlap_var = tk.StringVar(value=data['overlap'])
|
|
self.shifts_var = tk.StringVar(value=data['shifts'])
|
|
self.overlap_b_var = tk.StringVar(value=data['overlap_b'])
|
|
self.shifts_b_var = tk.StringVar(value=data['shifts_b'])
|
|
|
|
self.channel_var = tk.StringVar(value=data['channel'])
|
|
self.margin_var = tk.StringVar(value=data['margin'])
|
|
self.compensate_var = tk.StringVar(value=data['compensate'])
|
|
self.mdxnetModeltype_var = tk.StringVar(value=data['mdxnetModeltype'])
|
|
# Instrumental or Vocal Only
|
|
self.voc_only_var = tk.BooleanVar(value=data['voc_only'])
|
|
self.inst_only_var = tk.BooleanVar(value=data['inst_only'])
|
|
self.voc_only_b_var = tk.BooleanVar(value=data['voc_only_b'])
|
|
self.inst_only_b_var = tk.BooleanVar(value=data['inst_only_b'])
|
|
self.audfile_var = tk.BooleanVar(value=data['audfile'])
|
|
# Choose Conversion Method
|
|
self.aiModel_var = tk.StringVar(value=data['aiModel'])
|
|
self.last_aiModel = self.aiModel_var.get()
|
|
# Choose Conversion Method
|
|
self.algo_var = tk.StringVar(value=data['algo'])
|
|
self.last_algo = self.aiModel_var.get()
|
|
self.demucs_stems_var = tk.StringVar(value=data['demucs_stems'])
|
|
# Choose Ensemble
|
|
self.ensChoose_var = tk.StringVar(value=data['ensChoose'])
|
|
self.last_ensChoose = self.ensChoose_var.get()
|
|
# Choose MDX-NET Model
|
|
self.mdxnetModel_var = tk.StringVar(value=data['mdxnetModel'])
|
|
self.DemucsModel_var = tk.StringVar(value=data['DemucsModel'])
|
|
self.DemucsModel_MDX_var = tk.StringVar(value=data['DemucsModel_MDX'])
|
|
self.ModelParams_var = tk.StringVar(value=data['ModelParams'])
|
|
self.last_mdxnetModel = self.mdxnetModel_var.get()
|
|
# Other
|
|
self.inputPathsEntry_var = tk.StringVar(value='')
|
|
self.lastDir = data['lastDir'] # nopep8
|
|
self.progress_var = tk.IntVar(value=0)
|
|
# Font
|
|
pyglet.font.add_file('lib_v5/fonts/centurygothic/GOTHIC.TTF')
|
|
self.font = tk.font.Font(family='Century Gothic', size=10)
|
|
self.fontRadio = tk.font.Font(family='Century Gothic', size=8)
|
|
# --Widgets--
|
|
self.create_widgets()
|
|
self.configure_widgets()
|
|
self.bind_widgets()
|
|
self.place_widgets()
|
|
|
|
self.update_available_models()
|
|
self.update_states()
|
|
self.update_loop()
|
|
|
|
# -Widget Methods-
|
|
|
|
def create_widgets(self):
|
|
"""Create window widgets"""
|
|
self.title_Label = tk.Label(master=self,
|
|
image=self.logo_img, compound=tk.TOP)
|
|
self.filePaths_Frame = ttk.Frame(master=self)
|
|
self.fill_filePaths_Frame()
|
|
|
|
self.options_Frame = ttk.Frame(master=self)
|
|
self.fill_options_Frame()
|
|
|
|
self.conversion_Button = ttk.Button(master=self,
|
|
text='Start Processing',
|
|
command=self.start_conversion)
|
|
self.stop_Button = ttk.Button(master=self,
|
|
image=self.stop_img,
|
|
command=self.restart)
|
|
self.settings_Button = ttk.Button(master=self,
|
|
image=self.help_img,
|
|
command=self.settings)
|
|
|
|
#ttk.Button(win, text= "Open", command= open_popup).pack()
|
|
|
|
self.efile_e_Button = ttk.Button(master=self,
|
|
image=self.efile_img,
|
|
command=self.open_exportPath_filedialog)
|
|
|
|
self.efile_i_Button = ttk.Button(master=self,
|
|
image=self.efile_img,
|
|
command=self.open_inputPath_filedialog)
|
|
|
|
self.progressbar = ttk.Progressbar(master=self, variable=self.progress_var)
|
|
|
|
self.command_Text = ThreadSafeConsole(master=self,
|
|
background='#0e0e0f',fg='#898b8e', font=('Century Gothic', 11),borderwidth=0)
|
|
|
|
self.command_Text.write(f'Ultimate Vocal Remover [{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}]\n')
|
|
|
|
def configure_widgets(self):
|
|
"""Change widget styling and appearance"""
|
|
|
|
#ttk.Style().configure('TCheckbutton', background='#0e0e0f',
|
|
# font=self.font, foreground='#d4d4d4')
|
|
#ttk.Style().configure('TRadiobutton', background='#0e0e0f',
|
|
# font=("Century Gothic", "11", "bold"), foreground='#d4d4d4')
|
|
#ttk.Style().configure('T', font=self.font, foreground='#d4d4d4')
|
|
|
|
#s = ttk.Style()
|
|
#s.configure('TButton', background='blue', foreground='black', font=('Century Gothic', '9', 'bold'), relief="groove")
|
|
|
|
|
|
def bind_widgets(self):
|
|
"""Bind widgets to the drag & drop mechanic"""
|
|
self.filePaths_musicFile_Button.drop_target_register(DND_FILES)
|
|
self.filePaths_musicFile_Entry.drop_target_register(DND_FILES)
|
|
self.filePaths_saveTo_Button.drop_target_register(DND_FILES)
|
|
self.filePaths_saveTo_Entry.drop_target_register(DND_FILES)
|
|
self.filePaths_musicFile_Button.dnd_bind('<<Drop>>',
|
|
lambda e: drop(e, accept_mode='files'))
|
|
self.filePaths_musicFile_Entry.dnd_bind('<<Drop>>',
|
|
lambda e: drop(e, accept_mode='files'))
|
|
self.filePaths_saveTo_Button.dnd_bind('<<Drop>>',
|
|
lambda e: drop(e, accept_mode='folder'))
|
|
self.filePaths_saveTo_Entry.dnd_bind('<<Drop>>',
|
|
lambda e: drop(e, accept_mode='folder'))
|
|
|
|
def place_widgets(self):
|
|
"""Place main widgets"""
|
|
self.title_Label.place(x=-2, y=-2)
|
|
self.filePaths_Frame.place(x=10, y=155, width=-20, height=self.FILEPATHS_HEIGHT,
|
|
relx=0, rely=0, relwidth=1, relheight=0)
|
|
self.options_Frame.place(x=10, y=250, width=-50, height=self.OPTIONS_HEIGHT,
|
|
relx=0, rely=0, relwidth=1, relheight=0)
|
|
self.conversion_Button.place(x=50, y=self.IMAGE_HEIGHT + self.FILEPATHS_HEIGHT + self.OPTIONS_HEIGHT + self.PADDING*2, width=-60 - 40, height=self.CONVERSIONBUTTON_HEIGHT,
|
|
relx=0, rely=0, relwidth=1, relheight=0)
|
|
self.efile_e_Button.place(x=-45, y=200, width=35, height=30,
|
|
relx=1, rely=0, relwidth=0, relheight=0)
|
|
self.efile_i_Button.place(x=-45, y=160, width=35, height=30,
|
|
relx=1, rely=0, relwidth=0, relheight=0)
|
|
|
|
self.stop_Button.place(x=-10 - 35, y=self.IMAGE_HEIGHT + self.FILEPATHS_HEIGHT + self.OPTIONS_HEIGHT + self.PADDING*2, width=35, height=self.CONVERSIONBUTTON_HEIGHT,
|
|
relx=1, rely=0, relwidth=0, relheight=0)
|
|
self.settings_Button.place(x=-10 - 600, y=self.IMAGE_HEIGHT + self.FILEPATHS_HEIGHT + self.OPTIONS_HEIGHT + self.PADDING*2, width=35, height=self.CONVERSIONBUTTON_HEIGHT,
|
|
relx=1, rely=0, relwidth=0, relheight=0)
|
|
self.command_Text.place(x=25, y=self.IMAGE_HEIGHT + self.FILEPATHS_HEIGHT + self.OPTIONS_HEIGHT + self.CONVERSIONBUTTON_HEIGHT + self.PADDING*3, width=-30, height=self.COMMAND_HEIGHT,
|
|
relx=0, rely=0, relwidth=1, relheight=0)
|
|
self.progressbar.place(x=25, y=self.IMAGE_HEIGHT + self.FILEPATHS_HEIGHT + self.OPTIONS_HEIGHT + self.CONVERSIONBUTTON_HEIGHT + self.COMMAND_HEIGHT + self.PADDING*4, width=-50, height=self.PROGRESS_HEIGHT,
|
|
relx=0, rely=0, relwidth=1, relheight=0)
|
|
|
|
def fill_filePaths_Frame(self):
|
|
"""Fill Frame with neccessary widgets"""
|
|
# -Create Widgets-
|
|
# Save To Option
|
|
# Select Music Files Option
|
|
|
|
# Save To Option
|
|
self.filePaths_saveTo_Button = ttk.Button(master=self.filePaths_Frame,
|
|
text='Select output',
|
|
command=self.open_export_filedialog)
|
|
self.filePaths_saveTo_Entry = ttk.Entry(master=self.filePaths_Frame,
|
|
|
|
textvariable=self.exportPath_var,
|
|
state=tk.DISABLED
|
|
)
|
|
# Select Music Files Option
|
|
self.filePaths_musicFile_Button = ttk.Button(master=self.filePaths_Frame,
|
|
text='Select input',
|
|
command=self.open_file_filedialog)
|
|
self.filePaths_musicFile_Entry = ttk.Entry(master=self.filePaths_Frame,
|
|
textvariable=self.inputPathsEntry_var,
|
|
state=tk.DISABLED
|
|
)
|
|
|
|
|
|
# -Place Widgets-
|
|
|
|
# Select Music Files Option
|
|
self.filePaths_musicFile_Button.place(x=0, y=5, width=0, height=-10,
|
|
relx=0, rely=0, relwidth=0.3, relheight=0.5)
|
|
self.filePaths_musicFile_Entry.place(x=10, y=2.5, width=-50, height=-5,
|
|
relx=0.3, rely=0, relwidth=0.7, relheight=0.5)
|
|
|
|
# Save To Option
|
|
self.filePaths_saveTo_Button.place(x=0, y=5, width=0, height=-10,
|
|
relx=0, rely=0.5, relwidth=0.3, relheight=0.5)
|
|
self.filePaths_saveTo_Entry.place(x=10, y=2.5, width=-50, height=-5,
|
|
relx=0.3, rely=0.5, relwidth=0.7, relheight=0.5)
|
|
|
|
|
|
def fill_options_Frame(self):
|
|
"""Fill Frame with neccessary widgets"""
|
|
# -Create Widgets-
|
|
|
|
|
|
# Save as wav
|
|
self.options_wav_Radiobutton = ttk.Radiobutton(master=self.options_Frame,
|
|
text='WAV',
|
|
variable=self.saveFormat_var,
|
|
value='Wav'
|
|
)
|
|
|
|
# Save as flac
|
|
self.options_flac_Radiobutton = ttk.Radiobutton(master=self.options_Frame,
|
|
text='FLAC',
|
|
variable=self.saveFormat_var,
|
|
value='Flac'
|
|
)
|
|
|
|
# Save as mp3
|
|
self.options_mpThree_Radiobutton = ttk.Radiobutton(master=self.options_Frame,
|
|
text='MP3',
|
|
variable=self.saveFormat_var,
|
|
value='Mp3',
|
|
)
|
|
|
|
# -Column 1-
|
|
|
|
# Choose Conversion Method
|
|
self.options_aiModel_Label = tk.Button(master=self.options_Frame,
|
|
text='Choose Process Method', anchor=tk.CENTER,
|
|
background='#0e0e0f', font=self.font, foreground='#13a4c9', borderwidth=0, command=self.open_appdir_filedialog)
|
|
self.options_aiModel_Optionmenu = ttk.OptionMenu(self.options_Frame,
|
|
self.aiModel_var,
|
|
None, 'VR Architecture', 'MDX-Net', 'Demucs v3', 'Ensemble Mode')
|
|
|
|
# Choose Instrumental Model
|
|
self.options_instrumentalModel_Label = tk.Button(master=self.options_Frame,
|
|
text='Choose Main Model',
|
|
background='#0e0e0f', font=self.font, foreground='#13a4c9', borderwidth=0, command=self.open_Modelfolder_vr)
|
|
self.options_instrumentalModel_Optionmenu = ttk.OptionMenu(self.options_Frame,
|
|
self.instrumentalModel_var)
|
|
|
|
# Choose Demucs Model
|
|
self.options_DemucsModel_Label = tk.Button(master=self.options_Frame,
|
|
text='Choose Demucs Model',
|
|
background='#0e0e0f', font=self.font, foreground='#13a4c9', borderwidth=0, command=self.open_Modelfolder_de)
|
|
self.options_DemucsModel_Optionmenu = ttk.OptionMenu(self.options_Frame,
|
|
self.DemucsModel_var)
|
|
|
|
# Choose MDX-Net Model
|
|
self.options_mdxnetModel_Label = tk.Button(master=self.options_Frame,
|
|
text='Choose MDX-Net Model', anchor=tk.CENTER,
|
|
background='#0e0e0f', font=self.font, foreground='#13a4c9', borderwidth=0, command=self.open_newModel_filedialog)
|
|
|
|
self.options_mdxnetModel_Optionmenu = ttk.OptionMenu(self.options_Frame,
|
|
self.mdxnetModel_var)
|
|
|
|
# Ensemble Mode
|
|
self.options_ensChoose_Label = tk.Button(master=self.options_Frame,
|
|
text='Choose Ensemble', anchor=tk.CENTER,
|
|
background='#0e0e0f', font=self.font, foreground='#13a4c9', borderwidth=0, command=self.custom_ensemble)
|
|
self.options_ensChoose_Optionmenu = ttk.OptionMenu(self.options_Frame,
|
|
self.ensChoose_var,
|
|
None, 'Multi-AI Ensemble', 'Basic VR Ensemble', 'Vocal Models', 'Manual Ensemble')
|
|
|
|
# Choose Agorithim
|
|
self.options_algo_Label = tk.Label(master=self.options_Frame,
|
|
text='Choose Algorithm', anchor=tk.CENTER,
|
|
background='#0e0e0f', font=self.font, foreground='#13a4c9')
|
|
self.options_algo_Optionmenu = ttk.OptionMenu(self.options_Frame,
|
|
self.algo_var,
|
|
None, 'Vocals (Max Spec)', 'Instrumentals (Min Spec)')#, 'Invert (Normal)', 'Invert (Spectral)')
|
|
|
|
# Choose Demucs Stems
|
|
self.options_demucs_stems_Label = tk.Button(master=self.options_Frame,
|
|
text='Choose Stem(s)', anchor=tk.CENTER,
|
|
background='#0e0e0f', font=self.font, foreground='#13a4c9', borderwidth=0, command=self.advanced_demucs_options)
|
|
self.options_demucs_stems_Optionmenu = ttk.OptionMenu(self.options_Frame,
|
|
self.demucs_stems_var,
|
|
None, 'All Stems', 'Vocals', 'Other', 'Bass', 'Drums')
|
|
|
|
|
|
# -Column 2-
|
|
|
|
# WINDOW SIZE
|
|
self.options_winSize_Label = tk.Button(master=self.options_Frame,
|
|
text='Window Size', anchor=tk.CENTER,
|
|
background='#0e0e0f', font=self.font, foreground='#13a4c9',
|
|
borderwidth=0, command=self.advanced_vr_options)
|
|
self.options_winSize_Optionmenu = ttk.OptionMenu(self.options_Frame,
|
|
self.winSize_var,
|
|
None, '320', '512','1024')
|
|
# MDX-chunks
|
|
self.options_chunks_Label = tk.Label(master=self.options_Frame,
|
|
text='Chunks',
|
|
background='#0e0e0f', font=self.font, foreground='#13a4c9')
|
|
self.options_chunks_Optionmenu = ttk.OptionMenu(self.options_Frame,
|
|
self.chunks_var,
|
|
None, 'Auto', '1', '5', '10', '15', '20',
|
|
'25', '30', '35', '40', '45', '50',
|
|
'55', '60', '65', '70', '75', '80',
|
|
'85', '90', '95', 'Full')
|
|
|
|
|
|
# Overlap
|
|
self.options_overlap_b_Label = tk.Label(master=self.options_Frame,
|
|
text='Overlap', anchor=tk.CENTER,
|
|
background='#0e0e0f', font=self.font, foreground='#13a4c9')
|
|
self.options_overlap_b_Optionmenu = ttk.OptionMenu(self.options_Frame,
|
|
self.overlap_b_var,
|
|
0, 0.25, 0.50, 0.75, 0.99)
|
|
|
|
# Shifts
|
|
self.options_shifts_b_Label = tk.Label(master=self.options_Frame,
|
|
text='Shifts', anchor=tk.CENTER,
|
|
background='#0e0e0f', font=self.font, foreground='#13a4c9')
|
|
self.options_shifts_b_Optionmenu = ttk.OptionMenu(self.options_Frame,
|
|
self.shifts_b_var,
|
|
0, 0, 1, 2, 3, 4, 5,
|
|
6, 7, 8, 9, 10, 11,
|
|
12, 13, 14, 15, 16, 17,
|
|
18, 19, 20)
|
|
|
|
#Checkboxes
|
|
# GPU Selection
|
|
self.options_gpu_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
|
|
text='GPU Conversion',
|
|
variable=self.gpuConversion_var,
|
|
)
|
|
|
|
# Vocal Only
|
|
self.options_voc_only_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
|
|
text='Save Vocals Only',
|
|
variable=self.voc_only_var,
|
|
)
|
|
# Instrumental Only
|
|
self.options_inst_only_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
|
|
text='Save Instrumental Only',
|
|
variable=self.inst_only_var,
|
|
)
|
|
|
|
# Vocal Only
|
|
self.options_voc_only_b_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
|
|
text='Stem Only',
|
|
variable=self.voc_only_b_var,
|
|
)
|
|
# Instrumental Only
|
|
self.options_inst_only_b_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
|
|
text='Mix Without Stem Only',
|
|
variable=self.inst_only_b_var,
|
|
)
|
|
|
|
# TTA
|
|
self.options_tta_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
|
|
text='TTA',
|
|
variable=self.tta_var,
|
|
)
|
|
|
|
# MDX-Auto-Chunk
|
|
self.options_non_red_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
|
|
text='Save Noisey Vocal',
|
|
variable=self.non_red_var,
|
|
)
|
|
|
|
# Postprocessing
|
|
self.options_post_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
|
|
text='Post-Process',
|
|
variable=self.postprocessing_var,
|
|
)
|
|
|
|
# Split Mode
|
|
self.options_split_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
|
|
text='Split Mode',
|
|
variable=self.split_mode_var,
|
|
)
|
|
|
|
# -Column 3-
|
|
|
|
# AGG
|
|
self.options_agg_Label = tk.Button(master=self.options_Frame,
|
|
text='Aggression Setting',
|
|
background='#0e0e0f', font=self.font, foreground='#13a4c9',
|
|
borderwidth=0, command=self.advanced_vr_options)
|
|
self.options_agg_Optionmenu = ttk.OptionMenu(self.options_Frame,
|
|
self.agg_var,
|
|
None, '1', '2', '3', '4', '5',
|
|
'6', '7', '8', '9', '10', '11',
|
|
'12', '13', '14', '15', '16', '17',
|
|
'18', '19', '20')
|
|
|
|
# MDX-noisereduc_s
|
|
self.options_noisereduc_s_Label = tk.Button(master=self.options_Frame,
|
|
text='Noise Reduction',
|
|
background='#0e0e0f', font=self.font, foreground='#13a4c9',
|
|
borderwidth=0, command=self.advanced_mdx_options)
|
|
self.options_noisereduc_s_Optionmenu = ttk.OptionMenu(self.options_Frame,
|
|
self.noisereduc_s_var,
|
|
None, 'None', '0', '1', '2', '3', '4', '5',
|
|
'6', '7', '8', '9', '10')
|
|
|
|
|
|
# Save Image
|
|
self.options_image_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
|
|
text='Output Image',
|
|
variable=self.outputImage_var,
|
|
)
|
|
|
|
# MDX-Enable Demucs Model
|
|
self.options_demucsmodel_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
|
|
text='Demucs Model',
|
|
variable=self.demucsmodel_var,
|
|
)
|
|
|
|
# MDX-Noise Reduction
|
|
self.options_noisereduc_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
|
|
text='Noise Reduction',
|
|
variable=self.noisereduc_var,
|
|
)
|
|
|
|
# Ensemble Save Ensemble Outputs
|
|
self.options_save_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
|
|
text='Save All Outputs',
|
|
variable=self.save_var,
|
|
)
|
|
|
|
# Model Test Mode
|
|
self.options_modelFolder_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
|
|
text='Model Test Mode',
|
|
variable=self.modelFolder_var,
|
|
)
|
|
|
|
# -Place Widgets-
|
|
|
|
# -Column 0-
|
|
|
|
# Save as
|
|
self.options_wav_Radiobutton.place(x=400, y=-5, width=0, height=6,
|
|
relx=0, rely=0/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_flac_Radiobutton.place(x=271, y=-5, width=0, height=6,
|
|
relx=1/3, rely=0/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_mpThree_Radiobutton.place(x=143, y=-5, width=0, height=6,
|
|
relx=2/3, rely=0/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
|
|
# -Column 1-
|
|
|
|
# Choose Conversion Method
|
|
self.options_aiModel_Label.place(x=0, y=0, width=0, height=-10,
|
|
relx=0, rely=2/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
self.options_aiModel_Optionmenu.place(x=0, y=-2, width=0, height=7,
|
|
relx=0, rely=3/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
# Choose Main Model
|
|
self.options_instrumentalModel_Label.place(x=0, y=19, width=0, height=-10,
|
|
relx=0, rely=6/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
self.options_instrumentalModel_Optionmenu.place(x=0, y=19, width=0, height=7,
|
|
relx=0, rely=7/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
|
|
# Choose Demucs Model
|
|
self.options_DemucsModel_Label.place(x=0, y=19, width=0, height=-10,
|
|
relx=0, rely=6/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
self.options_DemucsModel_Optionmenu.place(x=0, y=19, width=0, height=7,
|
|
relx=0, rely=7/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
|
|
# Choose MDX-Net Model
|
|
self.options_mdxnetModel_Label.place(x=0, y=19, width=0, height=-10,
|
|
relx=0, rely=6/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
self.options_mdxnetModel_Optionmenu.place(x=0, y=19, width=0, height=7,
|
|
relx=0, rely=7/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
# Choose Ensemble
|
|
self.options_ensChoose_Label.place(x=0, y=19, width=0, height=-10,
|
|
relx=0, rely=6/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
self.options_ensChoose_Optionmenu.place(x=0, y=19, width=0, height=7,
|
|
relx=0, rely=7/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
|
|
# Choose Algorithm
|
|
self.options_algo_Label.place(x=20, y=0, width=0, height=-10,
|
|
relx=1/3, rely=2/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
self.options_algo_Optionmenu.place(x=12, y=-2, width=0, height=7,
|
|
relx=1/3, rely=3/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
|
|
# Choose Demucs Stems
|
|
self.options_demucs_stems_Label.place(x=13, y=0, width=0, height=-10,
|
|
relx=1/3, rely=2/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_demucs_stems_Optionmenu.place(x=71, y=-2, width=-118, height=7,
|
|
relx=1/3, rely=3/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
|
|
# -Column 2-
|
|
|
|
# WINDOW
|
|
self.options_winSize_Label.place(x=13, y=0, width=0, height=-10,
|
|
relx=1/3, rely=2/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_winSize_Optionmenu.place(x=71, y=-2, width=-118, height=7,
|
|
relx=1/3, rely=3/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#---MDX-Net Specific---
|
|
# MDX-chunks
|
|
self.options_chunks_Label.place(x=12, y=0, width=0, height=-10,
|
|
relx=2/3, rely=2/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_chunks_Optionmenu.place(x=71, y=-2, width=-118, height=7,
|
|
relx=2/3, rely=3/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
|
|
# Overlap
|
|
self.options_overlap_b_Label.place(x=13, y=0, width=0, height=-10,
|
|
relx=2/3, rely=4/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_overlap_b_Optionmenu.place(x=71, y=-2, width=-118, height=7,
|
|
relx=2/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
|
|
# Shifts
|
|
self.options_shifts_b_Label.place(x=12, y=0, width=0, height=-10,
|
|
relx=2/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_shifts_b_Optionmenu.place(x=71, y=-2, width=-118, height=7,
|
|
relx=2/3, rely=7/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
|
|
|
|
#Checkboxes
|
|
|
|
#GPU Conversion
|
|
self.options_gpu_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=1/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Vocals Only
|
|
self.options_voc_only_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=1/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Instrumental Only
|
|
self.options_inst_only_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=1/3, rely=7/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
|
|
#Vocals Only
|
|
self.options_voc_only_b_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=1/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Instrumental Only
|
|
self.options_inst_only_b_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=1/3, rely=7/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Split Mode
|
|
self.options_split_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=1/3, rely=7/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
|
|
# TTA
|
|
self.options_tta_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=2/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
# MDX-Keep Non_Reduced Vocal
|
|
self.options_non_red_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=2/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
|
|
# -Column 3-
|
|
|
|
# AGG
|
|
self.options_agg_Label.place(x=15, y=0, width=0, height=-10,
|
|
relx=2/3, rely=2/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_agg_Optionmenu.place(x=71, y=-2, width=-118, height=7,
|
|
relx=2/3, rely=3/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
# MDX-noisereduc_s
|
|
self.options_noisereduc_s_Label.place(x=15, y=0, width=0, height=-10,
|
|
relx=1/3, rely=2/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_noisereduc_s_Optionmenu.place(x=71, y=-2, width=-118, height=7,
|
|
relx=1/3, rely=3/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Checkboxes
|
|
#---MDX-Net Specific---
|
|
# MDX-demucs Model
|
|
self.options_demucsmodel_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=2/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
|
|
#---VR Architecture Specific---
|
|
#Post-Process
|
|
self.options_post_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=2/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Save Image
|
|
# self.options_image_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
# relx=2/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#---Ensemble Specific---
|
|
#Ensemble Save Outputs
|
|
self.options_save_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=2/3, rely=7/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#---MDX-Net & VR Architecture Specific---
|
|
#Model Test Mode
|
|
self.options_modelFolder_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=2/3, rely=7/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
|
|
# Change States
|
|
self.aiModel_var.trace_add('write',
|
|
lambda *args: self.deselect_models())
|
|
self.ensChoose_var.trace_add('write',
|
|
lambda *args: self.update_states())
|
|
|
|
self.inst_only_var.trace_add('write',
|
|
lambda *args: self.update_states())
|
|
|
|
self.voc_only_var.trace_add('write',
|
|
lambda *args: self.update_states())
|
|
|
|
self.inst_only_b_var.trace_add('write',
|
|
lambda *args: self.update_states())
|
|
|
|
self.voc_only_b_var.trace_add('write',
|
|
lambda *args: self.update_states())
|
|
|
|
self.demucs_stems_var.trace_add('write',
|
|
lambda *args: self.update_states())
|
|
|
|
self.noisereduc_s_var.trace_add('write',
|
|
lambda *args: self.update_states())
|
|
self.non_red_var.trace_add('write',
|
|
lambda *args: self.update_states())
|
|
|
|
self.mdxnetModeltype_var.trace_add('write',
|
|
lambda *args: self.update_states())
|
|
|
|
self.n_fft_scale_var.trace_add('write',
|
|
lambda *args: self.update_states())
|
|
|
|
self.dim_f_var.trace_add('write',
|
|
lambda *args: self.update_states())
|
|
|
|
self.demucsmodel_var.trace_add('write',
|
|
lambda *args: self.update_states())
|
|
|
|
self.demucs_only_var.trace_add('write',
|
|
lambda *args: self.update_states())
|
|
|
|
self.split_mode_var.trace_add('write',
|
|
lambda *args: self.update_states())
|
|
|
|
self.chunks_var.trace_add('write',
|
|
lambda *args: self.update_states())
|
|
|
|
# Opening filedialogs
|
|
def open_file_filedialog(self):
|
|
"""Make user select music files"""
|
|
global dnd
|
|
global nondnd
|
|
|
|
if self.lastDir is not None:
|
|
if not os.path.isdir(self.lastDir):
|
|
self.lastDir = None
|
|
|
|
paths = tk.filedialog.askopenfilenames(
|
|
parent=self,
|
|
title=f'Select Music Files',
|
|
initialfile='',
|
|
initialdir=self.lastDir,
|
|
)
|
|
if paths: # Path selected
|
|
self.inputPaths = paths
|
|
dnd = 'no'
|
|
self.update_inputPaths()
|
|
nondnd = os.path.dirname(paths[0])
|
|
print('last dir', self.lastDir)
|
|
|
|
def open_export_filedialog(self):
|
|
"""Make user select a folder to export the converted files in"""
|
|
path = tk.filedialog.askdirectory(
|
|
parent=self,
|
|
title=f'Select Folder',)
|
|
if path: # Path selected
|
|
self.exportPath_var.set(path)
|
|
|
|
def open_exportPath_filedialog(self):
|
|
filename = self.exportPath_var.get()
|
|
|
|
if sys.platform == "win32":
|
|
os.startfile(filename)
|
|
else:
|
|
opener = "open" if sys.platform == "darwin" else "xdg-open"
|
|
subprocess.call([opener, filename])
|
|
|
|
def open_inputPath_filedialog(self):
|
|
"""Open Input Directory"""
|
|
|
|
try:
|
|
if dnd == 'yes':
|
|
self.lastDir = str(dnddir)
|
|
filename = str(self.lastDir)
|
|
if sys.platform == "win32":
|
|
os.startfile(filename)
|
|
if dnd == 'no':
|
|
self.lastDir = str(nondnd)
|
|
filename = str(self.lastDir)
|
|
|
|
if sys.platform == "win32":
|
|
os.startfile(filename)
|
|
except:
|
|
filename = str(self.lastDir)
|
|
|
|
if sys.platform == "win32":
|
|
os.startfile(filename)
|
|
|
|
def start_conversion(self):
|
|
"""
|
|
Start the conversion for all the given mp3 and wav files
|
|
"""
|
|
|
|
# -Get all variables-
|
|
export_path = self.exportPath_var.get()
|
|
input_paths = self.inputPaths
|
|
instrumentalModel_path = self.instrumentalLabel_to_path[self.instrumentalModel_var.get()] # nopep8
|
|
# mdxnetModel_path = self.mdxnetLabel_to_path[self.mdxnetModel_var.get()]
|
|
# Get constants
|
|
instrumental = self.instrumentalModel_var.get()
|
|
try:
|
|
if [bool(instrumental)].count(True) == 2: #CHECKTHIS
|
|
window_size = DEFAULT_DATA['window_size']
|
|
agg = DEFAULT_DATA['agg']
|
|
chunks = DEFAULT_DATA['chunks']
|
|
noisereduc_s = DEFAULT_DATA['noisereduc_s']
|
|
mixing = DEFAULT_DATA['mixing']
|
|
else:
|
|
window_size = int(self.winSize_var.get())
|
|
agg = int(self.agg_var.get())
|
|
chunks = str(self.chunks_var.get())
|
|
noisereduc_s = str(self.noisereduc_s_var.get())
|
|
mixing = str(self.mixing_var.get())
|
|
ensChoose = str(self.ensChoose_var.get())
|
|
mdxnetModel = str(self.mdxnetModel_var.get())
|
|
|
|
except SyntaxError: # Non integer was put in entry box
|
|
tk.messagebox.showwarning(master=self,
|
|
title='Invalid Music File',
|
|
message='You have selected an invalid music file!\nPlease make sure that your files still exist and ends with either ".mp3", ".mp4", ".m4a", ".flac", ".wav"')
|
|
return
|
|
|
|
# -Check for invalid inputs-
|
|
|
|
for path in input_paths:
|
|
if not os.path.isfile(path):
|
|
tk.messagebox.showwarning(master=self,
|
|
title='Drag and Drop Feature Failed or Invalid Input',
|
|
message='The input is invalid, or the drag and drop feature failed to select your files properly.\n\nPlease try the following:\n\n1. Select your inputs using the \"Select Input\" button\n2. Verify the input is valid.\n3. Then try again.')
|
|
return
|
|
|
|
|
|
if self.aiModel_var.get() == 'VR Architecture':
|
|
if not os.path.isfile(instrumentalModel_path):
|
|
tk.messagebox.showwarning(master=self,
|
|
title='Invalid Main Model File',
|
|
message='You have selected an invalid main model file!\nPlease make sure that your model file still exists!')
|
|
return
|
|
|
|
if not os.path.isdir(export_path):
|
|
tk.messagebox.showwarning(master=self,
|
|
title='Invalid Export Directory',
|
|
message='You have selected an invalid export directory!\nPlease make sure that your directory still exists!')
|
|
return
|
|
|
|
if self.aiModel_var.get() == 'VR Architecture':
|
|
inference = inference_v5
|
|
elif self.aiModel_var.get() == 'Ensemble Mode':
|
|
inference = inference_v5_ensemble
|
|
elif self.aiModel_var.get() == 'MDX-Net':
|
|
inference = inference_MDX
|
|
elif self.aiModel_var.get() == 'Demucs v3':
|
|
inference = inference_demucs
|
|
else:
|
|
raise TypeError('This error should not occur.')
|
|
|
|
# -Run the algorithm-
|
|
threading.Thread(target=inference.main,
|
|
kwargs={
|
|
# Paths
|
|
'input_paths': input_paths,
|
|
'export_path': export_path,
|
|
'saveFormat': self.saveFormat_var.get(),
|
|
'vr_ensem': self.vrensemchoose_var.get(),
|
|
'vr_ensem_a': self.vrensemchoose_a_var.get(),
|
|
'vr_ensem_b': self.vrensemchoose_b_var.get(),
|
|
'vr_ensem_c': self.vrensemchoose_c_var.get(),
|
|
'vr_ensem_d': self.vrensemchoose_d_var.get(),
|
|
|
|
'vr_ensem_e': self.vrensemchoose_e_var.get(),
|
|
'vr_ensem_mdx_a': self.vrensemchoose_mdx_a_var.get(),
|
|
'vr_ensem_mdx_b': self.vrensemchoose_mdx_b_var.get(),
|
|
'vr_ensem_mdx_c': self.vrensemchoose_mdx_c_var.get(),
|
|
|
|
'mdx_ensem': self.mdxensemchoose_var.get(),
|
|
'mdx_ensem_b': self.mdxensemchoose_b_var.get(),
|
|
# Processing Options
|
|
'gpu': 0 if self.gpuConversion_var.get() else -1,
|
|
'postprocess': self.postprocessing_var.get(),
|
|
'appendensem': self.appendensem_var.get(),
|
|
'demucs_only': self.demucs_only_var.get(),
|
|
'split_mode': self.split_mode_var.get(),
|
|
'tta': self.tta_var.get(),
|
|
'save': self.save_var.get(),
|
|
'output_image': self.outputImage_var.get(),
|
|
'algo': self.algo_var.get(),
|
|
'demucs_stems': self.demucs_stems_var.get(),
|
|
# Models
|
|
'instrumentalModel': instrumentalModel_path,
|
|
'vocalModel': '', # Always not needed
|
|
'useModel': 'instrumental', # Always instrumental
|
|
# Model Folder
|
|
'modelFolder': self.modelFolder_var.get(),
|
|
# Constants
|
|
'window_size': window_size,
|
|
'agg': agg,
|
|
'break': False,
|
|
'ensChoose': ensChoose,
|
|
'mdxnetModel': mdxnetModel,
|
|
'DemucsModel': self.DemucsModel_var.get(),
|
|
'DemucsModel_MDX': self.DemucsModel_MDX_var.get(),
|
|
'ModelParams': self.ModelParams_var.get(),
|
|
# Other Variables (Tkinter)
|
|
'window': self,
|
|
'text_widget': self.command_Text,
|
|
'button_widget': self.conversion_Button,
|
|
'inst_menu': self.options_instrumentalModel_Optionmenu,
|
|
'progress_var': self.progress_var,
|
|
# MDX-Net Specific
|
|
'demucsmodel': self.demucsmodel_var.get(),
|
|
'non_red': self.non_red_var.get(),
|
|
'noise_reduc': self.noisereduc_var.get(),
|
|
'voc_only': self.voc_only_var.get(),
|
|
'inst_only': self.inst_only_var.get(),
|
|
'voc_only_b': self.voc_only_b_var.get(),
|
|
'inst_only_b': self.inst_only_b_var.get(),
|
|
'audfile': self.audfile_var.get(),
|
|
'chunks': chunks,
|
|
'noisereduc_s': noisereduc_s,
|
|
'mixing': mixing,
|
|
'n_fft_scale': self.n_fft_scale_var.get(),
|
|
'dim_f': self.dim_f_var.get(),
|
|
'noise_pro_select': self.noise_pro_select_var.get(),
|
|
'overlap': self.overlap_var.get(),
|
|
'shifts': self.shifts_var.get(),
|
|
'overlap_b': self.overlap_b_var.get(),
|
|
'shifts_b': self.shifts_b_var.get(),
|
|
'margin': self.margin_var.get(),
|
|
'channel': self.channel_var.get(),
|
|
'compensate': self.compensate_var.get(),
|
|
'mdxnetModeltype': self.mdxnetModeltype_var.get(),
|
|
},
|
|
daemon=True
|
|
).start()
|
|
|
|
# Models
|
|
def update_inputPaths(self):
|
|
"""Update the music file entry"""
|
|
if self.inputPaths:
|
|
# Non-empty Selection
|
|
text = '; '.join(self.inputPaths)
|
|
else:
|
|
# Empty Selection
|
|
text = ''
|
|
self.inputPathsEntry_var.set(text)
|
|
|
|
|
|
|
|
def update_loop(self):
|
|
"""Update the dropdown menu"""
|
|
self.update_available_models()
|
|
|
|
self.after(1000, self.update_loop)
|
|
|
|
def update_available_models(self):
|
|
"""
|
|
Loop through every VR model (.pth) in the models directory
|
|
and add to the select your model list
|
|
"""
|
|
temp_instrumentalModels_dir = os.path.join(instrumentalModels_dir, 'Main_Models') # nopep8
|
|
|
|
# Main models
|
|
new_InstrumentalModels = os.listdir(temp_instrumentalModels_dir)
|
|
|
|
if new_InstrumentalModels != self.lastInstrumentalModels:
|
|
self.instrumentalLabel_to_path.clear()
|
|
self.options_instrumentalModel_Optionmenu['menu'].delete(0, 'end')
|
|
for file_name in natsort.natsorted(new_InstrumentalModels):
|
|
if file_name.endswith('.pth'):
|
|
# Add Radiobutton to the Options Menu
|
|
self.options_instrumentalModel_Optionmenu['menu'].add_radiobutton(label=file_name,
|
|
command=tk._setit(self.instrumentalModel_var, file_name))
|
|
# Link the files name to its absolute path
|
|
self.instrumentalLabel_to_path[file_name] = os.path.join(temp_instrumentalModels_dir, file_name) # nopep8
|
|
self.lastInstrumentalModels = new_InstrumentalModels
|
|
#print(self.instrumentalLabel_to_path)
|
|
|
|
"""
|
|
Loop through every MDX-Net model (.onnx) in the models directory
|
|
and add to the select your model list
|
|
"""
|
|
|
|
temp_MDXModels_dir = os.path.join(instrumentalModels_dir, 'MDX_Net_Models') # nopep8
|
|
|
|
# MDX-Net
|
|
new_MDXModels = os.listdir(temp_MDXModels_dir)
|
|
|
|
if new_MDXModels != self.lastMDXModels:
|
|
self.MDXLabel_to_path.clear()
|
|
self.options_mdxnetModel_Optionmenu['menu'].delete(0, 'end')
|
|
for file_name_1 in natsort.natsorted(new_MDXModels):
|
|
if file_name_1.endswith(('.onnx')):
|
|
b = [".onnx"]
|
|
for char in b:
|
|
file_name_1 = file_name_1.replace(char, "")
|
|
|
|
c = ["UVR_MDXNET_3_9662"]
|
|
for char in c:
|
|
file_name_1 = file_name_1.replace(char, "UVR-MDX-NET 3")
|
|
|
|
d = ["UVR_MDXNET_2_9682"]
|
|
for char in d:
|
|
file_name_1 = file_name_1.replace(char, "UVR-MDX-NET 2")
|
|
|
|
e = ["UVR_MDXNET_1_9703"]
|
|
for char in e:
|
|
file_name_1 = file_name_1.replace(char, "UVR-MDX-NET 1")
|
|
|
|
f = ["UVR_MDXNET_9662"]
|
|
for char in f:
|
|
file_name_1 = file_name_1.replace(char, "UVR-MDX-NET 3")
|
|
|
|
g = ["UVR_MDXNET_9682"]
|
|
for char in g:
|
|
file_name_1 = file_name_1.replace(char, "UVR-MDX-NET 2")
|
|
|
|
h = ["UVR_MDXNET_9703"]
|
|
for char in h:
|
|
file_name_1 = file_name_1.replace(char, "UVR-MDX-NET 1")
|
|
|
|
i = ["UVR_MDXNET_KARA"]
|
|
for char in i:
|
|
file_name_1 = file_name_1.replace(char, "UVR-MDX-NET Karaoke")
|
|
|
|
self.options_mdxnetModel_Optionmenu['menu'].add_radiobutton(label=file_name_1,
|
|
command=tk._setit(self.mdxnetModel_var, file_name_1))
|
|
self.lastMDXModels = new_MDXModels
|
|
|
|
|
|
"""
|
|
Loop through every Demucs model (.th, .pth) in the models directory
|
|
and add to the select your model list
|
|
"""
|
|
|
|
try:
|
|
temp_DemucsModels_dir = os.path.join(instrumentalModels_dir, 'Demucs_Models') # nopep8
|
|
new_DemucsModels = os.listdir(temp_DemucsModels_dir)
|
|
|
|
if new_DemucsModels != self.lastDemucsModels:
|
|
#print(new_MDXModels)
|
|
self.DemucsLabel_to_path.clear()
|
|
self.options_DemucsModel_Optionmenu['menu'].delete(0, 'end')
|
|
for file_name_2 in natsort.natsorted(new_DemucsModels):
|
|
if file_name_2.endswith(('.yaml')):
|
|
b = [".yaml"]
|
|
for char in b:
|
|
file_name_2 = file_name_2.replace(char, "")
|
|
|
|
|
|
self.options_DemucsModel_Optionmenu['menu'].add_radiobutton(label=file_name_2,
|
|
command=tk._setit(self.DemucsModel_var, file_name_2))
|
|
self.lastDemucsModels = new_DemucsModels
|
|
except:
|
|
pass
|
|
|
|
try:
|
|
temp_DemucsModels_MDX_dir = os.path.join(instrumentalModels_dir, 'Demucs_Models') # nopep8
|
|
new_DemucsModels_MDX = os.listdir(temp_DemucsModels_MDX_dir)
|
|
|
|
if new_DemucsModels_MDX != self.lastDemucsModels_MDX:
|
|
#print(new_MDXModels)
|
|
self.DemucsLabel_MDX_to_path.clear()
|
|
self.options_DemucsModel_MDX_Optionmenu['menu'].delete(0, 'end')
|
|
for file_name_3 in natsort.natsorted(new_DemucsModels_MDX):
|
|
if file_name_3.endswith(('.yaml')):
|
|
b = [".yaml"]
|
|
for char in b:
|
|
file_name_3 = file_name_3.replace(char, "")
|
|
|
|
self.options_DemucsModel_MDX_Optionmenu['menu'].add_radiobutton(label=file_name_3,
|
|
command=tk._setit(self.DemucsModel_MDX_var, file_name_3))
|
|
self.lastDemucsModels_MDX = new_DemucsModels_MDX
|
|
except:
|
|
pass
|
|
|
|
|
|
"""
|
|
Loop through every model param (.json) in the models directory
|
|
and add to the select your model list
|
|
"""
|
|
|
|
try:
|
|
temp_ModelParams_dir = 'lib_v5\modelparams' # nopep8
|
|
new_ModelParams = os.listdir(temp_ModelParams_dir)
|
|
|
|
if new_ModelParams != self.lastModelParams:
|
|
#print(new_MDXModels)
|
|
self.ModelParamsLabel_to_path.clear()
|
|
self.options_ModelParams_Optionmenu['menu'].delete(0, 'end')
|
|
for file_name_3 in natsort.natsorted(new_ModelParams):
|
|
if file_name_3.endswith(('.json', 'Auto')):
|
|
|
|
self.options_ModelParams_Optionmenu['menu'].add_radiobutton(label=file_name_3,
|
|
command=tk._setit(self.ModelParams_var, file_name_3))
|
|
self.lastModelParams = new_ModelParams
|
|
except:
|
|
pass
|
|
|
|
|
|
def update_states(self):
|
|
"""
|
|
Vary the states for all widgets based
|
|
on certain selections
|
|
"""
|
|
|
|
if self.aiModel_var.get() == 'MDX-Net':
|
|
# Place Widgets
|
|
|
|
# Choose MDX-Net Model
|
|
self.options_mdxnetModel_Label.place(x=0, y=19, width=0, height=-10,
|
|
relx=0, rely=6/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
self.options_mdxnetModel_Optionmenu.place(x=0, y=19, width=0, height=7,
|
|
relx=0, rely=7/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
# MDX-chunks
|
|
self.options_chunks_Label.place(x=12, y=0, width=0, height=-10,
|
|
relx=2/3, rely=2/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_chunks_Optionmenu.place(x=71, y=-2, width=-118, height=7,
|
|
relx=2/3, rely=3/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
# MDX-noisereduc_s
|
|
self.options_noisereduc_s_Label.place(x=15, y=0, width=0, height=-10,
|
|
relx=1/3, rely=2/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_noisereduc_s_Optionmenu.place(x=71, y=-2, width=-118, height=7,
|
|
relx=1/3, rely=3/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#GPU Conversion
|
|
self.options_gpu_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_gpu_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=1/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Vocals Only
|
|
self.options_voc_only_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_voc_only_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=1/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Instrumental Only
|
|
self.options_inst_only_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_inst_only_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=1/3, rely=7/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
# MDX-demucs Model
|
|
self.options_demucsmodel_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_demucsmodel_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=2/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
|
|
# MDX-Keep Non_Reduced Vocal
|
|
self.options_non_red_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_non_red_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=2/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Model Test Mode
|
|
self.options_modelFolder_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_modelFolder_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=2/3, rely=7/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
|
|
# Forget widgets
|
|
self.options_ensChoose_Label.place_forget()
|
|
self.options_ensChoose_Optionmenu.place_forget()
|
|
self.options_instrumentalModel_Label.place_forget()
|
|
self.options_instrumentalModel_Optionmenu.place_forget()
|
|
self.options_save_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_save_Checkbutton.place_forget()
|
|
self.options_post_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_post_Checkbutton.place_forget()
|
|
self.options_tta_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_tta_Checkbutton.place_forget()
|
|
# self.options_image_Checkbutton.configure(state=tk.DISABLED)
|
|
# self.options_image_Checkbutton.place_forget()
|
|
self.options_winSize_Label.place_forget()
|
|
self.options_winSize_Optionmenu.place_forget()
|
|
self.options_agg_Label.place_forget()
|
|
self.options_agg_Optionmenu.place_forget()
|
|
self.options_algo_Label.place_forget()
|
|
self.options_algo_Optionmenu.place_forget()
|
|
self.options_DemucsModel_Label.place_forget()
|
|
self.options_DemucsModel_Optionmenu.place_forget()
|
|
self.options_demucs_stems_Label.place_forget()
|
|
self.options_demucs_stems_Optionmenu.place_forget()
|
|
self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_voc_only_b_Checkbutton.place_forget()
|
|
self.options_inst_only_b_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_inst_only_b_Checkbutton.place_forget()
|
|
self.options_inst_only_b_Checkbutton.place_forget()
|
|
self.options_overlap_b_Label.place_forget()
|
|
self.options_overlap_b_Optionmenu.place_forget()
|
|
self.options_shifts_b_Label.place_forget()
|
|
self.options_shifts_b_Optionmenu.place_forget()
|
|
self.options_split_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_split_Checkbutton.place_forget()
|
|
|
|
|
|
elif self.aiModel_var.get() == 'VR Architecture':
|
|
#Keep for Ensemble & VR Architecture Mode
|
|
# Choose Main Model
|
|
self.options_instrumentalModel_Label.place(x=0, y=19, width=0, height=-10,
|
|
relx=0, rely=6/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
self.options_instrumentalModel_Optionmenu.place(x=0, y=19, width=0, height=7,
|
|
relx=0, rely=7/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
# WINDOW
|
|
self.options_winSize_Label.place(x=13, y=0, width=0, height=-10,
|
|
relx=1/3, rely=2/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_winSize_Optionmenu.place(x=71, y=-2, width=-118, height=7,
|
|
relx=1/3, rely=3/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
# AGG
|
|
self.options_agg_Label.place(x=15, y=0, width=0, height=-10,
|
|
relx=2/3, rely=2/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_agg_Optionmenu.place(x=71, y=-2, width=-118, height=7,
|
|
relx=2/3, rely=3/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#GPU Conversion
|
|
self.options_gpu_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_gpu_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=1/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Vocals Only
|
|
self.options_voc_only_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_voc_only_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=1/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Instrumental Only
|
|
self.options_inst_only_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_inst_only_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=1/3, rely=7/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
# TTA
|
|
self.options_tta_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_tta_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=2/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Post-Process
|
|
self.options_post_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_post_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=2/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Save Image
|
|
# self.options_image_Checkbutton.configure(state=tk.NORMAL)
|
|
# self.options_image_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
# relx=2/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Model Test Mode
|
|
self.options_modelFolder_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_modelFolder_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=2/3, rely=7/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Forget Widgets
|
|
self.options_ensChoose_Label.place_forget()
|
|
self.options_ensChoose_Optionmenu.place_forget()
|
|
self.options_chunks_Label.place_forget()
|
|
self.options_chunks_Optionmenu.place_forget()
|
|
self.options_noisereduc_s_Label.place_forget()
|
|
self.options_noisereduc_s_Optionmenu.place_forget()
|
|
self.options_mdxnetModel_Label.place_forget()
|
|
self.options_mdxnetModel_Optionmenu.place_forget()
|
|
self.options_algo_Label.place_forget()
|
|
self.options_algo_Optionmenu.place_forget()
|
|
self.options_save_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_save_Checkbutton.place_forget()
|
|
self.options_non_red_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_non_red_Checkbutton.place_forget()
|
|
self.options_noisereduc_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_noisereduc_Checkbutton.place_forget()
|
|
self.options_demucsmodel_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_demucsmodel_Checkbutton.place_forget()
|
|
self.options_non_red_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_non_red_Checkbutton.place_forget()
|
|
self.options_DemucsModel_Label.place_forget()
|
|
self.options_DemucsModel_Optionmenu.place_forget()
|
|
self.options_demucs_stems_Label.place_forget()
|
|
self.options_demucs_stems_Optionmenu.place_forget()
|
|
self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_voc_only_b_Checkbutton.place_forget()
|
|
self.options_inst_only_b_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_inst_only_b_Checkbutton.place_forget()
|
|
self.options_overlap_b_Label.place_forget()
|
|
self.options_overlap_b_Optionmenu.place_forget()
|
|
self.options_shifts_b_Label.place_forget()
|
|
self.options_shifts_b_Optionmenu.place_forget()
|
|
self.options_split_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_split_Checkbutton.place_forget()
|
|
|
|
elif self.aiModel_var.get() == 'Demucs v3':
|
|
#Keep for Ensemble & VR Architecture Mode
|
|
# Choose Main Model
|
|
self.options_DemucsModel_Label.place(x=0, y=19, width=0, height=-10,
|
|
relx=0, rely=6/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
self.options_DemucsModel_Optionmenu.place(x=0, y=19, width=0, height=7,
|
|
relx=0, rely=7/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
|
|
# Choose Stems
|
|
self.options_demucs_stems_Label.place(x=13, y=0, width=0, height=-10,
|
|
relx=1/3, rely=2/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_demucs_stems_Optionmenu.place(x=55, y=-2, width=-85, height=7,
|
|
relx=1/3, rely=3/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
|
|
# Chunks
|
|
self.options_chunks_Label.place(x=12, y=0, width=0, height=-10,
|
|
relx=2/3, rely=2/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_chunks_Optionmenu.place(x=55, y=-2, width=-85, height=7,
|
|
relx=2/3, rely=3/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
|
|
# Shifts
|
|
self.options_shifts_b_Label.place(x=12, y=0, width=0, height=-10,
|
|
relx=2/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_shifts_b_Optionmenu.place(x=55, y=-2, width=-85, height=7,
|
|
relx=2/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
|
|
# Overlap
|
|
self.options_overlap_b_Label.place(x=13, y=0, width=0, height=-10,
|
|
relx=2/3, rely=8/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_overlap_b_Optionmenu.place(x=55, y=-2, width=-85, height=7,
|
|
relx=2/3, rely=9/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
|
|
#GPU Conversion
|
|
self.options_gpu_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_gpu_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=1/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Vocals Only
|
|
self.options_voc_only_b_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_voc_only_b_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=1/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Instrumental Only
|
|
self.options_inst_only_b_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_inst_only_b_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=1/3, rely=7/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
|
|
#Instrumental Only
|
|
self.options_split_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_split_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=1/3, rely=8/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
|
|
# Forget Widgets
|
|
self.options_save_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_save_Checkbutton.place_forget()
|
|
self.options_post_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_post_Checkbutton.place_forget()
|
|
self.options_tta_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_tta_Checkbutton.place_forget()
|
|
# self.options_image_Checkbutton.configure(state=tk.DISABLED)
|
|
# self.options_image_Checkbutton.place_forget()
|
|
self.options_demucsmodel_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_demucsmodel_Checkbutton.place_forget()
|
|
self.options_noisereduc_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_noisereduc_Checkbutton.place_forget()
|
|
self.options_non_red_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_non_red_Checkbutton.place_forget()
|
|
self.options_voc_only_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_voc_only_Checkbutton.place_forget()
|
|
self.options_inst_only_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_inst_only_Checkbutton.place_forget()
|
|
self.options_noisereduc_s_Label.place_forget()
|
|
self.options_noisereduc_s_Optionmenu.place_forget()
|
|
self.options_mdxnetModel_Label.place_forget()
|
|
self.options_mdxnetModel_Optionmenu.place_forget()
|
|
self.options_winSize_Label.place_forget()
|
|
self.options_winSize_Optionmenu.place_forget()
|
|
self.options_agg_Label.place_forget()
|
|
self.options_agg_Optionmenu.place_forget()
|
|
self.options_ensChoose_Label.place_forget()
|
|
self.options_ensChoose_Optionmenu.place_forget()
|
|
self.options_instrumentalModel_Label.place_forget()
|
|
self.options_instrumentalModel_Optionmenu.place_forget()
|
|
self.options_algo_Label.place_forget()
|
|
self.options_algo_Optionmenu.place_forget()
|
|
self.options_modelFolder_Checkbutton.place_forget()
|
|
|
|
elif self.aiModel_var.get() == 'Ensemble Mode':
|
|
if self.ensChoose_var.get() == 'Manual Ensemble':
|
|
# Choose Algorithm
|
|
self.options_algo_Label.place(x=20, y=0, width=0, height=-10,
|
|
relx=1/3, rely=2/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
self.options_algo_Optionmenu.place(x=12, y=-2, width=0, height=7,
|
|
relx=1/3, rely=3/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
# Choose Ensemble
|
|
self.options_ensChoose_Label.place(x=0, y=19, width=0, height=-10,
|
|
relx=0, rely=6/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
self.options_ensChoose_Optionmenu.place(x=0, y=19, width=0, height=7,
|
|
relx=0, rely=7/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
# Forget Widgets
|
|
self.options_save_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_save_Checkbutton.place_forget()
|
|
self.options_post_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_post_Checkbutton.place_forget()
|
|
self.options_tta_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_tta_Checkbutton.place_forget()
|
|
self.options_modelFolder_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_modelFolder_Checkbutton.place_forget()
|
|
# self.options_image_Checkbutton.configure(state=tk.DISABLED)
|
|
# self.options_image_Checkbutton.place_forget()
|
|
self.options_gpu_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_gpu_Checkbutton.place_forget()
|
|
self.options_voc_only_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_voc_only_Checkbutton.place_forget()
|
|
self.options_inst_only_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_inst_only_Checkbutton.place_forget()
|
|
self.options_demucsmodel_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_demucsmodel_Checkbutton.place_forget()
|
|
self.options_noisereduc_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_noisereduc_Checkbutton.place_forget()
|
|
self.options_non_red_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_non_red_Checkbutton.place_forget()
|
|
self.options_chunks_Label.place_forget()
|
|
self.options_chunks_Optionmenu.place_forget()
|
|
self.options_noisereduc_s_Label.place_forget()
|
|
self.options_noisereduc_s_Optionmenu.place_forget()
|
|
self.options_mdxnetModel_Label.place_forget()
|
|
self.options_mdxnetModel_Optionmenu.place_forget()
|
|
self.options_winSize_Label.place_forget()
|
|
self.options_winSize_Optionmenu.place_forget()
|
|
self.options_agg_Label.place_forget()
|
|
self.options_agg_Optionmenu.place_forget()
|
|
self.options_DemucsModel_Label.place_forget()
|
|
self.options_DemucsModel_Optionmenu.place_forget()
|
|
self.options_demucs_stems_Label.place_forget()
|
|
self.options_demucs_stems_Optionmenu.place_forget()
|
|
self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_voc_only_b_Checkbutton.place_forget()
|
|
self.options_inst_only_b_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_inst_only_b_Checkbutton.place_forget()
|
|
self.options_inst_only_b_Checkbutton.place_forget()
|
|
self.options_overlap_b_Label.place_forget()
|
|
self.options_overlap_b_Optionmenu.place_forget()
|
|
self.options_shifts_b_Label.place_forget()
|
|
self.options_shifts_b_Optionmenu.place_forget()
|
|
self.options_split_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_split_Checkbutton.place_forget()
|
|
|
|
|
|
elif self.ensChoose_var.get() == 'Multi-AI Ensemble':
|
|
# Choose Ensemble
|
|
self.options_ensChoose_Label.place(x=0, y=19, width=0, height=-10,
|
|
relx=0, rely=6/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
self.options_ensChoose_Optionmenu.place(x=0, y=19, width=0, height=7,
|
|
relx=0, rely=7/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
# MDX-chunks
|
|
self.options_chunks_Label.place(x=12, y=0, width=0, height=-10,
|
|
relx=2/3, rely=2/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_chunks_Optionmenu.place(x=71, y=-2, width=-118, height=7,
|
|
relx=2/3, rely=3/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
# MDX-noisereduc_s
|
|
self.options_noisereduc_s_Label.place(x=15, y=0, width=0, height=-10,
|
|
relx=1/3, rely=2/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_noisereduc_s_Optionmenu.place(x=71, y=-2, width=-118, height=7,
|
|
relx=1/3, rely=3/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
# WINDOW
|
|
self.options_winSize_Label.place(x=13, y=-7, width=0, height=-10,
|
|
relx=1/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_winSize_Optionmenu.place(x=71, y=-5, width=-118, height=7,
|
|
relx=1/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
# AGG
|
|
self.options_agg_Label.place(x=15, y=-7, width=0, height=-10,
|
|
relx=2/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_agg_Optionmenu.place(x=71, y=-5, width=-118, height=7,
|
|
relx=2/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#GPU Conversion
|
|
self.options_gpu_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_gpu_Checkbutton.place(x=35, y=3, width=0, height=5,
|
|
relx=1/3, rely=7/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Vocals Only
|
|
self.options_voc_only_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_voc_only_Checkbutton.place(x=35, y=3, width=0, height=5,
|
|
relx=1/3, rely=8/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Instrumental Only
|
|
self.options_inst_only_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_inst_only_Checkbutton.place(x=35, y=3, width=0, height=5,
|
|
relx=1/3, rely=9/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
# MDX-demucs Model
|
|
self.options_demucsmodel_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_demucsmodel_Checkbutton.place(x=35, y=3, width=0, height=5,
|
|
relx=2/3, rely=7/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
# TTA
|
|
self.options_tta_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_tta_Checkbutton.place(x=35, y=3, width=0, height=5,
|
|
relx=2/3, rely=8/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Ensemble Save Outputs
|
|
self.options_save_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_save_Checkbutton.place(x=35, y=3, width=0, height=5,
|
|
relx=2/3, rely=9/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
# Forget Widgets
|
|
self.options_post_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_post_Checkbutton.place_forget()
|
|
self.options_modelFolder_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_modelFolder_Checkbutton.place_forget()
|
|
# self.options_image_Checkbutton.configure(state=tk.DISABLED)
|
|
# self.options_image_Checkbutton.place_forget()
|
|
self.options_noisereduc_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_noisereduc_Checkbutton.place_forget()
|
|
self.options_non_red_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_non_red_Checkbutton.place_forget()
|
|
self.options_algo_Label.place_forget()
|
|
self.options_algo_Optionmenu.place_forget()
|
|
self.options_DemucsModel_Label.place_forget()
|
|
self.options_DemucsModel_Optionmenu.place_forget()
|
|
self.options_demucs_stems_Label.place_forget()
|
|
self.options_demucs_stems_Optionmenu.place_forget()
|
|
self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_voc_only_b_Checkbutton.place_forget()
|
|
self.options_inst_only_b_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_inst_only_b_Checkbutton.place_forget()
|
|
self.options_inst_only_b_Checkbutton.place_forget()
|
|
self.options_overlap_b_Label.place_forget()
|
|
self.options_overlap_b_Optionmenu.place_forget()
|
|
self.options_shifts_b_Label.place_forget()
|
|
self.options_shifts_b_Optionmenu.place_forget()
|
|
self.options_split_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_split_Checkbutton.place_forget()
|
|
else:
|
|
# Choose Ensemble
|
|
self.options_ensChoose_Label.place(x=0, y=19, width=0, height=-10,
|
|
relx=0, rely=6/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
self.options_ensChoose_Optionmenu.place(x=0, y=19, width=0, height=7,
|
|
relx=0, rely=7/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS)
|
|
# WINDOW
|
|
self.options_winSize_Label.place(x=13, y=0, width=0, height=-10,
|
|
relx=1/3, rely=2/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_winSize_Optionmenu.place(x=71, y=-2, width=-118, height=7,
|
|
relx=1/3, rely=3/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
# AGG
|
|
self.options_agg_Label.place(x=15, y=0, width=0, height=-10,
|
|
relx=2/3, rely=2/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
self.options_agg_Optionmenu.place(x=71, y=-2, width=-118, height=7,
|
|
relx=2/3, rely=3/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#GPU Conversion
|
|
self.options_gpu_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_gpu_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=1/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Vocals Only
|
|
self.options_voc_only_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_voc_only_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=1/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Instrumental Only
|
|
self.options_inst_only_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_inst_only_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=1/3, rely=7/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
# TTA
|
|
self.options_tta_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_tta_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=2/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Post-Process
|
|
self.options_post_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_post_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=2/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Save Image
|
|
# self.options_image_Checkbutton.configure(state=tk.NORMAL)
|
|
# self.options_image_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
# relx=2/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Ensemble Save Outputs
|
|
self.options_save_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_save_Checkbutton.place(x=35, y=21, width=0, height=5,
|
|
relx=2/3, rely=7/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS)
|
|
#Forget Widgets
|
|
self.options_algo_Label.place_forget()
|
|
self.options_algo_Optionmenu.place_forget()
|
|
self.options_instrumentalModel_Label.place_forget()
|
|
self.options_instrumentalModel_Optionmenu.place_forget()
|
|
self.options_chunks_Label.place_forget()
|
|
self.options_chunks_Optionmenu.place_forget()
|
|
self.options_noisereduc_s_Label.place_forget()
|
|
self.options_noisereduc_s_Optionmenu.place_forget()
|
|
self.options_mdxnetModel_Label.place_forget()
|
|
self.options_mdxnetModel_Optionmenu.place_forget()
|
|
self.options_modelFolder_Checkbutton.place_forget()
|
|
self.options_modelFolder_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_noisereduc_Checkbutton.place_forget()
|
|
self.options_noisereduc_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_demucsmodel_Checkbutton.place_forget()
|
|
self.options_demucsmodel_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_non_red_Checkbutton.place_forget()
|
|
self.options_non_red_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_DemucsModel_Label.place_forget()
|
|
self.options_DemucsModel_Optionmenu.place_forget()
|
|
self.options_demucs_stems_Label.place_forget()
|
|
self.options_demucs_stems_Optionmenu.place_forget()
|
|
self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_voc_only_b_Checkbutton.place_forget()
|
|
self.options_inst_only_b_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_inst_only_b_Checkbutton.place_forget()
|
|
self.options_inst_only_b_Checkbutton.place_forget()
|
|
self.options_overlap_b_Label.place_forget()
|
|
self.options_overlap_b_Optionmenu.place_forget()
|
|
self.options_shifts_b_Label.place_forget()
|
|
self.options_shifts_b_Optionmenu.place_forget()
|
|
self.options_split_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_split_Checkbutton.place_forget()
|
|
|
|
|
|
if self.inst_only_var.get() == True:
|
|
self.options_voc_only_Checkbutton.configure(state=tk.DISABLED)
|
|
self.voc_only_var.set(False)
|
|
self.non_red_var.set(False)
|
|
elif self.inst_only_var.get() == False:
|
|
self.options_non_red_Checkbutton.configure(state=tk.NORMAL)
|
|
self.options_voc_only_Checkbutton.configure(state=tk.NORMAL)
|
|
|
|
if self.voc_only_var.get() == True:
|
|
self.options_inst_only_Checkbutton.configure(state=tk.DISABLED)
|
|
self.inst_only_var.set(False)
|
|
elif self.voc_only_var.get() == False:
|
|
self.options_inst_only_Checkbutton.configure(state=tk.NORMAL)
|
|
|
|
if self.demucs_stems_var.get() == 'All Stems':
|
|
self.voc_only_b_var.set(False)
|
|
self.inst_only_b_var.set(False)
|
|
self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED)
|
|
self.options_inst_only_b_Checkbutton.configure(state=tk.DISABLED)
|
|
elif self.demucs_stems_var.get() == 'Vocals':
|
|
if self.inst_only_b_var.get() == True:
|
|
self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED)
|
|
self.voc_only_b_var.set(False)
|
|
elif self.inst_only_b_var.get() == False:
|
|
self.options_voc_only_b_Checkbutton.configure(state=tk.NORMAL)
|
|
|
|
if self.voc_only_b_var.get() == True:
|
|
self.options_inst_only_b_Checkbutton.configure(state=tk.DISABLED)
|
|
self.inst_only_b_var.set(False)
|
|
elif self.voc_only_b_var.get() == False:
|
|
self.options_inst_only_b_Checkbutton.configure(state=tk.NORMAL)
|
|
elif self.demucs_stems_var.get() == 'Other':
|
|
if self.inst_only_b_var.get() == True:
|
|
self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED)
|
|
self.voc_only_b_var.set(False)
|
|
elif self.inst_only_b_var.get() == False:
|
|
self.options_voc_only_b_Checkbutton.configure(state=tk.NORMAL)
|
|
|
|
if self.voc_only_b_var.get() == True:
|
|
self.options_inst_only_b_Checkbutton.configure(state=tk.DISABLED)
|
|
self.inst_only_b_var.set(False)
|
|
elif self.voc_only_b_var.get() == False:
|
|
self.options_inst_only_b_Checkbutton.configure(state=tk.NORMAL)
|
|
elif self.demucs_stems_var.get() == 'Drums':
|
|
if self.inst_only_b_var.get() == True:
|
|
self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED)
|
|
self.voc_only_b_var.set(False)
|
|
elif self.inst_only_b_var.get() == False:
|
|
self.options_voc_only_b_Checkbutton.configure(state=tk.NORMAL)
|
|
if self.voc_only_b_var.get() == True:
|
|
self.options_inst_only_b_Checkbutton.configure(state=tk.DISABLED)
|
|
self.inst_only_b_var.set(False)
|
|
elif self.voc_only_b_var.get() == False:
|
|
self.options_inst_only_b_Checkbutton.configure(state=tk.NORMAL)
|
|
elif self.demucs_stems_var.get() == 'Bass':
|
|
if self.inst_only_b_var.get() == True:
|
|
self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED)
|
|
self.voc_only_b_var.set(False)
|
|
elif self.inst_only_b_var.get() == False:
|
|
self.options_voc_only_b_Checkbutton.configure(state=tk.NORMAL)
|
|
|
|
if self.voc_only_b_var.get() == True:
|
|
self.options_inst_only_b_Checkbutton.configure(state=tk.DISABLED)
|
|
self.inst_only_b_var.set(False)
|
|
elif self.voc_only_b_var.get() == False:
|
|
self.options_inst_only_b_Checkbutton.configure(state=tk.NORMAL)
|
|
|
|
|
|
if self.noisereduc_s_var.get() == 'None':
|
|
self.options_non_red_Checkbutton.configure(state=tk.DISABLED)
|
|
self.non_red_var.set(False)
|
|
if not self.noisereduc_s_var.get() == 'None':
|
|
self.options_non_red_Checkbutton.configure(state=tk.NORMAL)
|
|
|
|
|
|
if self.mdxnetModeltype_var.get() == 'Vocals (Default)':
|
|
self.n_fft_scale_var.set('6144')
|
|
self.dim_f_var.set('2048')
|
|
try:
|
|
self.options_n_fft_scale_Entry.configure(state=tk.DISABLED)
|
|
self.options_dim_f_Entry.configure(state=tk.DISABLED)
|
|
self.options_n_fft_scale_Opt.configure(state=tk.DISABLED)
|
|
self.options_dim_f_Opt.configure(state=tk.DISABLED)
|
|
except:
|
|
pass
|
|
|
|
if self.mdxnetModeltype_var.get() == 'Other (Default)':
|
|
self.n_fft_scale_var.set('8192')
|
|
self.dim_f_var.set('2048')
|
|
try:
|
|
self.options_n_fft_scale_Entry.configure(state=tk.DISABLED)
|
|
self.options_dim_f_Entry.configure(state=tk.DISABLED)
|
|
self.options_n_fft_scale_Opt.configure(state=tk.DISABLED)
|
|
self.options_dim_f_Opt.configure(state=tk.DISABLED)
|
|
except:
|
|
pass
|
|
|
|
if self.mdxnetModeltype_var.get() == 'Drums (Default)':
|
|
self.n_fft_scale_var.set('4096')
|
|
self.dim_f_var.set('2048')
|
|
try:
|
|
self.options_n_fft_scale_Entry.configure(state=tk.DISABLED)
|
|
self.options_dim_f_Entry.configure(state=tk.DISABLED)
|
|
self.options_n_fft_scale_Opt.configure(state=tk.DISABLED)
|
|
self.options_dim_f_Opt.configure(state=tk.DISABLED)
|
|
except:
|
|
pass
|
|
|
|
if self.mdxnetModeltype_var.get() == 'Bass (Default)':
|
|
self.n_fft_scale_var.set('16384')
|
|
self.dim_f_var.set('2048')
|
|
try:
|
|
self.options_n_fft_scale_Entry.configure(state=tk.DISABLED)
|
|
self.options_dim_f_Entry.configure(state=tk.DISABLED)
|
|
self.options_n_fft_scale_Opt.configure(state=tk.DISABLED)
|
|
self.options_dim_f_Opt.configure(state=tk.DISABLED)
|
|
except:
|
|
pass
|
|
|
|
if self.mdxnetModeltype_var.get() == 'Vocals (Custom)':
|
|
try:
|
|
self.options_n_fft_scale_Entry.configure(state=tk.NORMAL)
|
|
self.options_dim_f_Entry.configure(state=tk.NORMAL)
|
|
self.options_n_fft_scale_Opt.configure(state=tk.NORMAL)
|
|
self.options_dim_f_Opt.configure(state=tk.NORMAL)
|
|
except:
|
|
pass
|
|
|
|
if self.mdxnetModeltype_var.get() == 'Other (Custom)':
|
|
try:
|
|
self.options_n_fft_scale_Entry.configure(state=tk.NORMAL)
|
|
self.options_dim_f_Entry.configure(state=tk.NORMAL)
|
|
self.options_n_fft_scale_Opt.configure(state=tk.NORMAL)
|
|
self.options_dim_f_Opt.configure(state=tk.NORMAL)
|
|
except:
|
|
pass
|
|
|
|
if self.mdxnetModeltype_var.get() == 'Drums (Custom)':
|
|
try:
|
|
self.options_n_fft_scale_Entry.configure(state=tk.NORMAL)
|
|
self.options_dim_f_Entry.configure(state=tk.NORMAL)
|
|
self.options_n_fft_scale_Opt.configure(state=tk.NORMAL)
|
|
self.options_dim_f_Opt.configure(state=tk.NORMAL)
|
|
except:
|
|
pass
|
|
|
|
if self.mdxnetModeltype_var.get() == 'Bass (Custom)':
|
|
try:
|
|
self.options_n_fft_scale_Entry.configure(state=tk.NORMAL)
|
|
self.options_dim_f_Entry.configure(state=tk.NORMAL)
|
|
self.options_n_fft_scale_Opt.configure(state=tk.NORMAL)
|
|
self.options_dim_f_Opt.configure(state=tk.NORMAL)
|
|
except:
|
|
pass
|
|
|
|
if self.demucs_only_var.get() == True:
|
|
self.demucsmodel_var.set(True)
|
|
self.options_demucsmodel_Checkbutton.configure(state=tk.DISABLED)
|
|
elif self.demucs_only_var.get() == False:
|
|
self.options_demucsmodel_Checkbutton.configure(state=tk.NORMAL)
|
|
|
|
|
|
|
|
self.update_inputPaths()
|
|
|
|
def deselect_models(self):
|
|
"""
|
|
Run this method on version change
|
|
"""
|
|
if self.aiModel_var.get() == self.last_aiModel:
|
|
return
|
|
else:
|
|
self.last_aiModel = self.aiModel_var.get()
|
|
|
|
self.instrumentalModel_var.set('')
|
|
self.ensChoose_var.set('Multi-AI Ensemble')
|
|
self.mdxnetModel_var.set('UVR-MDX-NET 1')
|
|
|
|
self.winSize_var.set(DEFAULT_DATA['window_size'])
|
|
self.agg_var.set(DEFAULT_DATA['agg'])
|
|
self.modelFolder_var.set(DEFAULT_DATA['modelFolder'])
|
|
|
|
|
|
self.update_available_models()
|
|
self.update_states()
|
|
|
|
def restart(self):
|
|
"""
|
|
Restart the application after asking for confirmation
|
|
"""
|
|
confirm = tk.messagebox.askyesno(title='Restart Confirmation',
|
|
message='This will restart the application and halt any running processes. Your current settings will be saved. \n\n Are you sure you wish to continue?')
|
|
|
|
if confirm:
|
|
self.save_values()
|
|
try:
|
|
subprocess.Popen(f'UVR_Launcher.exe')
|
|
except:
|
|
subprocess.Popen(f'python "{__file__}"', shell=True)
|
|
exit()
|
|
else:
|
|
pass
|
|
|
|
def open_newModel_filedialog(self):
|
|
"""Let user paste an MDX-Net model to use for the vocal seperation"""
|
|
|
|
filename = 'models\MDX_Net_Models'
|
|
|
|
if sys.platform == "win32":
|
|
os.startfile(filename)
|
|
else:
|
|
opener = "open" if sys.platform == "darwin" else "xdg-open"
|
|
subprocess.call([opener, filename])
|
|
|
|
def advanced_vr_options(self):
|
|
"""
|
|
Open Advanced VR Options
|
|
"""
|
|
top=Toplevel(self)
|
|
|
|
top.geometry("600x500")
|
|
window_height = 600
|
|
window_width = 500
|
|
|
|
top.title("Advanced VR Options")
|
|
|
|
top.resizable(False, False) # This code helps to disable windows from resizing
|
|
|
|
screen_width = top.winfo_screenwidth()
|
|
screen_height = top.winfo_screenheight()
|
|
|
|
x_cordinate = int((screen_width/2) - (window_width/2))
|
|
y_cordinate = int((screen_height/2) - (window_height/2))
|
|
|
|
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
|
|
|
|
# change title bar icon
|
|
top.iconbitmap('img\\UVR-Icon-v2.ico')
|
|
|
|
def close_win():
|
|
top.destroy()
|
|
self.settings()
|
|
|
|
tabControl = ttk.Notebook(top)
|
|
|
|
tab1 = ttk.Frame(tabControl)
|
|
|
|
tabControl.add(tab1, text ='Advanced Settings')
|
|
|
|
tabControl.pack(expand = 1, fill ="both")
|
|
|
|
tab1.grid_rowconfigure(0, weight=1)
|
|
tab1.grid_columnconfigure(0, weight=1)
|
|
|
|
frame0=Frame(tab1, highlightbackground='red',highlightthicknes=0)
|
|
frame0.grid(row=0,column=0,padx=0,pady=30)
|
|
|
|
l0=Label(frame0,text="Advanced VR Options",font=("Century Gothic", "13", "bold", "underline"), justify="center", fg="#13a4c9")
|
|
l0.grid(row=0,column=0,padx=0,pady=10)
|
|
|
|
l0=tk.Label(frame0, text='Window Size (Set Manually)', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=1,column=0,padx=0,pady=10)
|
|
|
|
l0=ttk.Entry(frame0, textvariable=self.winSize_var, justify="center")
|
|
l0.grid(row=2,column=0,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0, text='Aggression Setting (Set Manually)', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=3,column=0,padx=0,pady=10)
|
|
|
|
l0=ttk.Entry(frame0, textvariable=self.agg_var, justify="center")
|
|
l0.grid(row=4,column=0,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0, text='Select Model Param\n(Can\'t change Model Params in Ensemble Mode)', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=5,column=0,padx=0,pady=10)
|
|
|
|
self.options_ModelParams_Optionmenu = l0=ttk.OptionMenu(frame0, self.ModelParams_var)
|
|
|
|
self.options_ModelParams_Optionmenu
|
|
l0.grid(row=7,column=0,padx=0,pady=0)
|
|
|
|
l0=ttk.Checkbutton(frame0, text='Save Output Image(s) of Spectrogram(s)', variable=self.outputImage_var)
|
|
l0.grid(row=8,column=0,padx=0,pady=10)
|
|
|
|
l0=ttk.Button(frame0,text='Open VR Models Folder', command=self.open_Modelfolder_vr)
|
|
l0.grid(row=9,column=0,padx=0,pady=0)
|
|
|
|
l0=ttk.Button(frame0,text='Back to Main Menu', command=close_win)
|
|
l0.grid(row=10,column=0,padx=0,pady=10)
|
|
|
|
def close_win_self():
|
|
top.destroy()
|
|
|
|
l0=ttk.Button(frame0,text='Close Window', command=close_win_self)
|
|
l0.grid(row=11,column=0,padx=0,pady=0)
|
|
|
|
self.ModelParamsLabel_to_path = defaultdict(lambda: '')
|
|
self.lastModelParams = []
|
|
|
|
self.update_states()
|
|
|
|
|
|
def advanced_demucs_options(self):
|
|
"""
|
|
Open Advanced Demucs Options
|
|
"""
|
|
top= Toplevel(self)
|
|
|
|
top.geometry("670x500")
|
|
window_height = 670
|
|
window_width = 500
|
|
|
|
top.title("Advanced Demucs Options")
|
|
|
|
top.resizable(False, False) # This code helps to disable windows from resizing
|
|
|
|
screen_width = top.winfo_screenwidth()
|
|
screen_height = top.winfo_screenheight()
|
|
|
|
x_cordinate = int((screen_width/2) - (window_width/2))
|
|
y_cordinate = int((screen_height/2) - (window_height/2))
|
|
|
|
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
|
|
|
|
# change title bar icon
|
|
top.iconbitmap('img\\UVR-Icon-v2.ico')
|
|
|
|
def close_win():
|
|
top.destroy()
|
|
self.settings()
|
|
|
|
tabControl = ttk.Notebook(top)
|
|
|
|
tab1 = ttk.Frame(tabControl)
|
|
|
|
tabControl.add(tab1, text ='Advanced Settings')
|
|
|
|
tabControl.pack(expand = 1, fill ="both")
|
|
|
|
tab1.grid_rowconfigure(0, weight=1)
|
|
tab1.grid_columnconfigure(0, weight=1)
|
|
|
|
frame0=Frame(tab1, highlightbackground='red',highlightthicknes=0)
|
|
frame0.grid(row=0,column=0,padx=0,pady=30)
|
|
|
|
l0=Label(frame0,text="Advanced Demucs Options",font=("Century Gothic", "13", "bold", "underline"), justify="center", fg="#13a4c9")
|
|
l0.grid(row=0,column=0,padx=0,pady=10)
|
|
|
|
l0=tk.Label(frame0, text='Chunks (Set Manually)', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=1,column=0,padx=0,pady=10)
|
|
|
|
l0=ttk.Entry(frame0, textvariable=self.chunks_var, justify='center')
|
|
l0.grid(row=2,column=0,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0, text='Chunk Margin', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=3,column=0,padx=0,pady=10)
|
|
|
|
l0=ttk.Entry(frame0, textvariable=self.margin_var, justify='center')
|
|
l0.grid(row=4,column=0,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0, text='Shifts\n(Higher values use more resources and increase processing times)', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=5,column=0,padx=0,pady=10)
|
|
|
|
l0=ttk.Entry(frame0, textvariable=self.shifts_b_var, justify='center')
|
|
l0.grid(row=6,column=0,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0, text='Overlap', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=7,column=0,padx=0,pady=10)
|
|
|
|
l0=ttk.Entry(frame0, textvariable=self.overlap_b_var, justify='center')
|
|
l0.grid(row=8,column=0,padx=0,pady=0)
|
|
|
|
l0=ttk.Checkbutton(frame0, text='Save Stems to Model Name Directory', variable=self.audfile_var)
|
|
l0.grid(row=9,column=0,padx=0,pady=0)
|
|
|
|
l0=ttk.Checkbutton(frame0, text='Settings Test Mode', variable=self.modelFolder_var)
|
|
l0.grid(row=10,column=0,padx=0,pady=0)
|
|
|
|
# l0=ttk.Checkbutton(frame0, text='Basic Prediction', variable=self.audfile_var)
|
|
# l0.grid(row=10,column=0,padx=0,pady=0)
|
|
|
|
l0=ttk.Button(frame0,text='Open Demucs Model Folder', command=self.open_Modelfolder_de)
|
|
l0.grid(row=11,column=0,padx=0,pady=0)
|
|
|
|
l0=ttk.Button(frame0,text='Back to Main Menu', command=close_win)
|
|
l0.grid(row=12,column=0,padx=0,pady=10)
|
|
|
|
def close_win_self():
|
|
top.destroy()
|
|
|
|
l0=ttk.Button(frame0,text='Close Window', command=close_win_self)
|
|
l0.grid(row=13,column=0,padx=0,pady=0)
|
|
|
|
|
|
def advanced_mdx_options(self):
|
|
"""
|
|
Open Advanced MDX Options
|
|
"""
|
|
top= Toplevel(self)
|
|
|
|
top.geometry("670x550")
|
|
window_height = 670
|
|
window_width = 550
|
|
|
|
top.title("Advanced MDX-Net Options")
|
|
|
|
top.resizable(False, False) # This code helps to disable windows from resizing
|
|
|
|
screen_width = top.winfo_screenwidth()
|
|
screen_height = top.winfo_screenheight()
|
|
|
|
x_cordinate = int((screen_width/2) - (window_width/2))
|
|
y_cordinate = int((screen_height/2) - (window_height/2))
|
|
|
|
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
|
|
|
|
# change title bar icon
|
|
top.iconbitmap('img\\UVR-Icon-v2.ico')
|
|
|
|
def close_win():
|
|
top.destroy()
|
|
self.settings()
|
|
|
|
tabControl = ttk.Notebook(top)
|
|
|
|
tab1 = ttk.Frame(tabControl)
|
|
tab2 = ttk.Frame(tabControl)
|
|
tab3 = ttk.Frame(tabControl)
|
|
|
|
tabControl.add(tab1, text ='Advanced Settings')
|
|
tabControl.add(tab2, text ='Demucs Settings')
|
|
tabControl.add(tab3, text ='Advanced ONNX Model Settings')
|
|
|
|
tabControl.pack(expand = 1, fill ="both")
|
|
|
|
tab1.grid_rowconfigure(0, weight=1)
|
|
tab1.grid_columnconfigure(0, weight=1)
|
|
tab2.grid_rowconfigure(0, weight=1)
|
|
tab2.grid_columnconfigure(0, weight=1)
|
|
tab3.grid_rowconfigure(0, weight=1)
|
|
tab3.grid_columnconfigure(0, weight=1)
|
|
|
|
frame0=Frame(tab1, highlightbackground='red',highlightthicknes=0)
|
|
frame0.grid(row=0,column=0,padx=0,pady=30)
|
|
|
|
l0=Label(frame0,text="Advanced MDX-Net Options",font=("Century Gothic", "13", "bold", "underline"), justify="center", fg="#13a4c9")
|
|
l0.grid(row=0,column=0,padx=0,pady=10)
|
|
|
|
l0=tk.Label(frame0, text='Chunks (Set Manually)', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=1,column=0,padx=0,pady=10)
|
|
|
|
l0=ttk.Entry(frame0, textvariable=self.chunks_var, justify='center')
|
|
l0.grid(row=2,column=0,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0, text='Noise Reduction (Set Manually)', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=3,column=0,padx=0,pady=10)
|
|
|
|
l0=ttk.Entry(frame0, textvariable=self.noisereduc_s_var, justify='center')
|
|
l0.grid(row=4,column=0,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0, text='Chunk Margin', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=5,column=0,padx=0,pady=10)
|
|
|
|
l0=ttk.Entry(frame0, textvariable=self.margin_var, justify='center')
|
|
l0.grid(row=6,column=0,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0, text='Volume Compensation', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=7,column=0,padx=0,pady=10)
|
|
|
|
l0=ttk.Entry(frame0, textvariable=self.compensate_var, justify='center')
|
|
l0.grid(row=8,column=0,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0, text='Noise Profile', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=9,column=0,padx=0,pady=10)
|
|
|
|
l0=ttk.OptionMenu(frame0, self.noise_pro_select_var, None, 'Auto Select', 'MDX-NET_Noise_Profile_14_kHz', 'MDX-NET_Noise_Profile_17_kHz', 'MDX-NET_Noise_Profile_Full_Band')
|
|
l0.grid(row=10,column=0,padx=0,pady=0)
|
|
|
|
l0=ttk.Button(frame0,text='Open MDX-Net Models Folder', command=self.open_newModel_filedialog)
|
|
l0.grid(row=11,column=0,padx=0,pady=10)
|
|
|
|
l0=ttk.Button(frame0,text='Back to Main Menu', command=close_win)
|
|
l0.grid(row=12,column=0,padx=0,pady=0)
|
|
|
|
def close_win_self():
|
|
top.destroy()
|
|
|
|
l0=ttk.Button(frame0,text='Close Window', command=close_win_self)
|
|
l0.grid(row=13,column=0,padx=0,pady=10)
|
|
|
|
frame0=Frame(tab2, highlightbackground='red',highlightthicknes=0)
|
|
frame0.grid(row=0,column=0,padx=0,pady=30)
|
|
|
|
l0=tk.Label(frame0, text='Choose Demucs Model', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=0,column=0,padx=0,pady=0)
|
|
|
|
l0=tk.Button(frame0, text='(Click here to add more Demucs models)', font=("Century Gothic", "8"), foreground='#13a4c9', borderwidth=0, command=self.open_Modelfolder_de)
|
|
l0.grid(row=1,column=0,padx=0,pady=0)
|
|
|
|
self.options_DemucsModel_MDX_Optionmenu = l0=ttk.OptionMenu(frame0, self.DemucsModel_MDX_var)
|
|
|
|
self.options_DemucsModel_MDX_Optionmenu
|
|
l0.grid(row=2,column=0,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0, text='Mixing Algorithm', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=3,column=0,padx=0,pady=10)
|
|
|
|
l0=ttk.OptionMenu(frame0, self.mixing_var, None, 'Default', 'Min_Mag', 'Max_Mag', 'Invert_p')
|
|
l0.grid(row=4,column=0,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0, text='Shifts\n(Higher values use more resources and increase processing times)', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=5,column=0,padx=0,pady=10)
|
|
|
|
l0=ttk.Entry(frame0, textvariable=self.shifts_var, justify='center')
|
|
l0.grid(row=6,column=0,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0, text='Overlap', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=7,column=0,padx=0,pady=10)
|
|
|
|
l0=ttk.Entry(frame0, textvariable=self.overlap_var, justify='center')
|
|
l0.grid(row=8,column=0,padx=0,pady=0)
|
|
|
|
l0=ttk.Checkbutton(frame0, text='Split Mode', variable=self.split_mode_var)
|
|
l0.grid(row=9,column=0,padx=0,pady=10)
|
|
|
|
self.update_states()
|
|
|
|
frame0=Frame(tab3, highlightbackground='red',highlightthicknes=0)
|
|
frame0.grid(row=0,column=0,padx=0,pady=30)
|
|
|
|
l0=tk.Label(frame0, text='Stem Type', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=1,column=0,padx=0,pady=0)
|
|
|
|
l0=ttk.OptionMenu(frame0, self.mdxnetModeltype_var, None, 'Vocals (Default)', 'Other (Default)', 'Bass (Default)', 'Drums (Default)', 'Vocals (Custom)', 'Other (Custom)', 'Bass (Custom)', 'Drums (Custom)')
|
|
l0.grid(row=2,column=0,padx=0,pady=10)
|
|
|
|
l0=tk.Label(frame0, text='N_FFT Scale', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=3,column=0,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0, text='(Manual Set)', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=3,column=1,padx=0,pady=0)
|
|
|
|
self.options_n_fft_scale_Opt = l0=ttk.OptionMenu(frame0, self.n_fft_scale_var, None, '4096', '6144', '7680', '8192', '16384')
|
|
|
|
self.options_n_fft_scale_Opt
|
|
l0.grid(row=4,column=0,padx=0,pady=0)
|
|
|
|
self.options_n_fft_scale_Entry = l0=ttk.Entry(frame0, textvariable=self.n_fft_scale_var, justify='center')
|
|
|
|
self.options_n_fft_scale_Entry
|
|
l0.grid(row=4,column=1,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0, text='Dim_f', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=5,column=0,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0, text='(Manual Set)', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=5,column=1,padx=0,pady=0)
|
|
|
|
self.options_dim_f_Opt = l0=ttk.OptionMenu(frame0, self.dim_f_var, None, '2048', '3072', '4096')
|
|
|
|
self.options_dim_f_Opt
|
|
l0.grid(row=6,column=0,padx=0,pady=0)
|
|
|
|
self.options_dim_f_Entry = l0=ttk.Entry(frame0, textvariable=self.dim_f_var, justify='center')
|
|
|
|
self.options_dim_f_Entry
|
|
l0.grid(row=6,column=1,padx=0,pady=0)
|
|
|
|
self.DemucsLabel_MDX_to_path = defaultdict(lambda: '')
|
|
self.lastDemucsModels_MDX = []
|
|
|
|
self.update_states()
|
|
|
|
|
|
def custom_ensemble(self):
|
|
"""
|
|
Open Ensemble Custom
|
|
"""
|
|
top= Toplevel(self)
|
|
|
|
top.geometry("800x680")
|
|
window_height = 680
|
|
window_width = 800
|
|
|
|
top.title("Customize Ensemble")
|
|
|
|
top.resizable(False, False) # This code helps to disable windows from resizing
|
|
|
|
screen_width = top.winfo_screenwidth()
|
|
screen_height = top.winfo_screenheight()
|
|
|
|
x_cordinate = int((screen_width/2) - (window_width/2))
|
|
y_cordinate = int((screen_height/2) - (window_height/2))
|
|
|
|
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
|
|
|
|
# change title bar icon
|
|
top.iconbitmap('img\\UVR-Icon-v2.ico')
|
|
|
|
def close_win():
|
|
top.destroy()
|
|
self.settings()
|
|
|
|
tabControl = ttk.Notebook(top)
|
|
|
|
tab1 = ttk.Frame(tabControl)
|
|
|
|
tabControl.add(tab1, text ='Ensemble Options')
|
|
|
|
tabControl.pack(expand = 1, fill ="both")
|
|
|
|
tab1.grid_rowconfigure(0, weight=1)
|
|
tab1.grid_columnconfigure(0, weight=1)
|
|
|
|
frame0=Frame(tab1, highlightbackground='red',highlightthicknes=0)
|
|
frame0.grid(row=0,column=0,padx=0,pady=30)
|
|
|
|
l0=Label(frame0,text="Multi-AI Ensemble Options",font=("Century Gothic", "10", "bold", "underline"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=1,column=0,padx=20,pady=10)
|
|
|
|
l0=tk.Label(frame0,text='MDX-Net or Demucs Model 1\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9')
|
|
l0.grid(row=2,column=0,padx=0,pady=0)
|
|
|
|
l0=ttk.OptionMenu(frame0, self.mdxensemchoose_var, None, 'UVR-MDX-NET 1', 'UVR-MDX-NET 2', 'UVR-MDX-NET 3',
|
|
'UVR-MDX-NET Karaoke', 'Demucs UVR Model 1', 'Demucs UVR Model 2', 'Demucs mdx_extra', 'Demucs mdx_extra_q')
|
|
l0.grid(row=3,column=0,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0,text='\nMDX-Net or Demucs Model 2\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9')
|
|
l0.grid(row=4,column=0,padx=0,pady=0)
|
|
|
|
l0=ttk.OptionMenu(frame0, self.mdxensemchoose_b_var, None, 'No Model', 'UVR-MDX-NET 1', 'UVR-MDX-NET 2', 'UVR-MDX-NET 3',
|
|
'UVR-MDX-NET Karaoke', 'Demucs UVR Model 1', 'Demucs UVR Model 2', 'Demucs mdx_extra', 'Demucs mdx_extra_q')
|
|
l0.grid(row=5,column=0,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0,text='\nVR Model 1\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9')
|
|
l0.grid(row=6,column=0,padx=0,pady=0)
|
|
|
|
l0=ttk.OptionMenu(frame0, self.vrensemchoose_var, None, 'No Model', '1_HP-UVR', '2_HP-UVR', '3_HP-Vocal-UVR',
|
|
'4_HP-Vocal-UVR', '5_HP-Karaoke-UVR', '6_HP-Karaoke-UVR', '7_HP2-UVR', '8_HP2-UVR',
|
|
'9_HP2-UVR', '10_SP-UVR-2B-32000-1', '11_SP-UVR-2B-32000-2', '12_SP-UVR-3B-44100', '13_SP-UVR-4B-44100-1',
|
|
'14_SP-UVR-4B-44100-2', '15_SP-UVR-MID-44100-1', '16_SP-UVR-MID-44100-2',
|
|
'MGM_MAIN_v4', 'MGM_HIGHEND_v4', 'MGM_LOWEND_A_v4', 'MGM_LOWEND_B_v4')
|
|
l0.grid(row=7,column=0,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0,text='\nVR Model 2\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9')
|
|
l0.grid(row=8,column=0,padx=0,pady=0)
|
|
|
|
l0=ttk.OptionMenu(frame0, self.vrensemchoose_mdx_a_var, None, 'No Model', '1_HP-UVR', '2_HP-UVR', '3_HP-Vocal-UVR',
|
|
'4_HP-Vocal-UVR', '5_HP-Karaoke-UVR', '6_HP-Karaoke-UVR', '7_HP2-UVR', '8_HP2-UVR',
|
|
'9_HP2-UVR', '10_SP-UVR-2B-32000-1', '11_SP-UVR-2B-32000-2', '12_SP-UVR-3B-44100', '13_SP-UVR-4B-44100-1',
|
|
'14_SP-UVR-4B-44100-2', '15_SP-UVR-MID-44100-1', '16_SP-UVR-MID-44100-2',
|
|
'MGM_MAIN_v4', 'MGM_HIGHEND_v4', 'MGM_LOWEND_A_v4', 'MGM_LOWEND_B_v4')
|
|
l0.grid(row=9,column=0,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0,text='\nVR Model 3\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9')
|
|
l0.grid(row=10,column=0,padx=0,pady=0)
|
|
|
|
l0=ttk.OptionMenu(frame0, self.vrensemchoose_mdx_b_var, None, 'No Model', '1_HP-UVR', '2_HP-UVR', '3_HP-Vocal-UVR',
|
|
'4_HP-Vocal-UVR', '5_HP-Karaoke-UVR', '6_HP-Karaoke-UVR', '7_HP2-UVR', '8_HP2-UVR',
|
|
'9_HP2-UVR', '10_SP-UVR-2B-32000-1', '11_SP-UVR-2B-32000-2', '12_SP-UVR-3B-44100', '13_SP-UVR-4B-44100-1',
|
|
'14_SP-UVR-4B-44100-2', '15_SP-UVR-MID-44100-1', '16_SP-UVR-MID-44100-2',
|
|
'MGM_MAIN_v4', 'MGM_HIGHEND_v4', 'MGM_LOWEND_A_v4', 'MGM_LOWEND_B_v4')
|
|
l0.grid(row=11,column=0,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0,text='\nVR Model 4\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9')
|
|
l0.grid(row=12,column=0,padx=0,pady=0)
|
|
|
|
l0=ttk.OptionMenu(frame0, self.vrensemchoose_mdx_c_var, None, 'No Model', '1_HP-UVR', '2_HP-UVR', '3_HP-Vocal-UVR',
|
|
'4_HP-Vocal-UVR', '5_HP-Karaoke-UVR', '6_HP-Karaoke-UVR', '7_HP2-UVR', '8_HP2-UVR',
|
|
'9_HP2-UVR', '10_SP-UVR-2B-32000-1', '11_SP-UVR-2B-32000-2', '12_SP-UVR-3B-44100', '13_SP-UVR-4B-44100-1',
|
|
'14_SP-UVR-4B-44100-2', '15_SP-UVR-MID-44100-1', '16_SP-UVR-MID-44100-2',
|
|
'MGM_MAIN_v4', 'MGM_HIGHEND_v4', 'MGM_LOWEND_A_v4', 'MGM_LOWEND_B_v4')
|
|
l0.grid(row=13,column=0,padx=0,pady=0)
|
|
|
|
l0=Label(frame0,text="Basic VR Ensemble Options",font=("Century Gothic", "10", "bold", "underline"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=1,column=1,padx=20,pady=10)
|
|
|
|
l0=tk.Label(frame0,text='VR Model 1\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9')
|
|
l0.grid(row=2,column=1,padx=0,pady=0)
|
|
|
|
l0=ttk.OptionMenu(frame0, self.vrensemchoose_a_var, None, '1_HP-UVR', '2_HP-UVR', '3_HP-Vocal-UVR',
|
|
'4_HP-Vocal-UVR', '5_HP-Karaoke-UVR', '6_HP-Karaoke-UVR', '7_HP2-UVR', '8_HP2-UVR',
|
|
'9_HP2-UVR', '10_SP-UVR-2B-32000-1', '11_SP-UVR-2B-32000-2', '12_SP-UVR-3B-44100', '13_SP-UVR-4B-44100-1',
|
|
'14_SP-UVR-4B-44100-2', '15_SP-UVR-MID-44100-1', '16_SP-UVR-MID-44100-2',
|
|
'MGM_MAIN_v4', 'MGM_HIGHEND_v4', 'MGM_LOWEND_A_v4', 'MGM_LOWEND_B_v4')
|
|
l0.grid(row=3,column=1,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0,text='\nVR Model 2\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9')
|
|
l0.grid(row=4,column=1,padx=0,pady=0)
|
|
|
|
l0=ttk.OptionMenu(frame0, self.vrensemchoose_b_var, None, '1_HP-UVR', '2_HP-UVR', '3_HP-Vocal-UVR',
|
|
'4_HP-Vocal-UVR', '5_HP-Karaoke-UVR', '6_HP-Karaoke-UVR', '7_HP2-UVR', '8_HP2-UVR',
|
|
'9_HP2-UVR', '10_SP-UVR-2B-32000-1', '11_SP-UVR-2B-32000-2', '12_SP-UVR-3B-44100', '13_SP-UVR-4B-44100-1',
|
|
'14_SP-UVR-4B-44100-2', '15_SP-UVR-MID-44100-1', '16_SP-UVR-MID-44100-2',
|
|
'MGM_MAIN_v4', 'MGM_HIGHEND_v4', 'MGM_LOWEND_A_v4', 'MGM_LOWEND_B_v4')
|
|
l0.grid(row=5,column=1,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0,text='\nVR Model 3\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9')
|
|
l0.grid(row=6,column=1,padx=0,pady=0)
|
|
|
|
l0=ttk.OptionMenu(frame0, self.vrensemchoose_c_var, None, 'No Model', '1_HP-UVR', '2_HP-UVR', '3_HP-Vocal-UVR',
|
|
'4_HP-Vocal-UVR', '5_HP-Karaoke-UVR', '6_HP-Karaoke-UVR', '7_HP2-UVR', '8_HP2-UVR',
|
|
'9_HP2-UVR', '10_SP-UVR-2B-32000-1', '11_SP-UVR-2B-32000-2', '12_SP-UVR-3B-44100', '13_SP-UVR-4B-44100-1',
|
|
'14_SP-UVR-4B-44100-2', '15_SP-UVR-MID-44100-1', '16_SP-UVR-MID-44100-2',
|
|
'MGM_MAIN_v4', 'MGM_HIGHEND_v4', 'MGM_LOWEND_A_v4', 'MGM_LOWEND_B_v4')
|
|
l0.grid(row=7,column=1,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0,text='\nVR Model 4\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9')
|
|
l0.grid(row=8,column=1,padx=0,pady=0)
|
|
|
|
l0=ttk.OptionMenu(frame0, self.vrensemchoose_d_var, None, 'No Model', '1_HP-UVR', '2_HP-UVR', '3_HP-Vocal-UVR',
|
|
'4_HP-Vocal-UVR', '5_HP-Karaoke-UVR', '6_HP-Karaoke-UVR', '7_HP2-UVR', '8_HP2-UVR',
|
|
'9_HP2-UVR', '10_SP-UVR-2B-32000-1', '11_SP-UVR-2B-32000-2', '12_SP-UVR-3B-44100', '13_SP-UVR-4B-44100-1',
|
|
'14_SP-UVR-4B-44100-2', '15_SP-UVR-MID-44100-1', '16_SP-UVR-MID-44100-2',
|
|
'MGM_MAIN_v4', 'MGM_HIGHEND_v4', 'MGM_LOWEND_A_v4', 'MGM_LOWEND_B_v4')
|
|
l0.grid(row=9,column=1,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0,text='\nVR Model 5\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9')
|
|
l0.grid(row=10,column=1,padx=0,pady=0)
|
|
|
|
l0=ttk.OptionMenu(frame0, self.vrensemchoose_e_var, None, 'No Model', '1_HP-UVR', '2_HP-UVR', '3_HP-Vocal-UVR',
|
|
'4_HP-Vocal-UVR', '5_HP-Karaoke-UVR', '6_HP-Karaoke-UVR', '7_HP2-UVR', '8_HP2-UVR',
|
|
'9_HP2-UVR', '10_SP-UVR-2B-32000-1', '11_SP-UVR-2B-32000-2', '12_SP-UVR-3B-44100', '13_SP-UVR-4B-44100-1',
|
|
'14_SP-UVR-4B-44100-2', '15_SP-UVR-MID-44100-1', '16_SP-UVR-MID-44100-2',
|
|
'MGM_MAIN_v4', 'MGM_HIGHEND_v4', 'MGM_LOWEND_A_v4', 'MGM_LOWEND_B_v4')
|
|
l0.grid(row=11,column=1,padx=0,pady=0)
|
|
|
|
def close_win_self():
|
|
top.destroy()
|
|
|
|
l0=ttk.Button(frame0,text='Close Window', command=close_win_self)
|
|
l0.grid(row=13,column=1,padx=20,pady=0)
|
|
|
|
l0=Label(frame0,text="Additional Options",font=("Century Gothic", "10", "bold", "underline"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=1,column=2,padx=0,pady=10)
|
|
|
|
l0=ttk.Checkbutton(frame0, text='Append Ensemble Name to Final Output', variable=self.appendensem_var)
|
|
l0.grid(row=2,column=2,padx=0,pady=0)
|
|
|
|
l0=ttk.Button(frame0,text='Open Models Directory', command=self.open_Modelfolder_filedialog)
|
|
l0.grid(row=3,column=2,padx=0,pady=0)
|
|
|
|
l0=ttk.Button(frame0,text='Back to Main Menu', command=close_win)
|
|
l0.grid(row=4,column=2,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0,text='Additional VR Architecture Options',font=("Century Gothic", "10", "bold", "underline"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=5,column=2,padx=0,pady=0)
|
|
|
|
l0=ttk.Checkbutton(frame0, text='Post-Process', variable=self.postprocessing_var)
|
|
l0.grid(row=6,column=2,padx=0,pady=0)
|
|
|
|
l0=ttk.Checkbutton(frame0, text='Save Output Image(s) of Spectrogram(s)', variable=self.outputImage_var)
|
|
l0.grid(row=7,column=2,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0,text='Additional Demucs v3 Options',font=("Century Gothic", "10", "bold", "underline"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=8,column=2,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0, text='Shifts\n(Higher values use more resources)', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=9,column=2,padx=0,pady=0)
|
|
|
|
l0=ttk.Entry(frame0, textvariable=self.shifts_var, justify='center')
|
|
l0.grid(row=10,column=2,padx=0,pady=0)
|
|
|
|
l0=tk.Label(frame0, text='Overlap', font=("Century Gothic", "9"), foreground='#13a4c9')
|
|
l0.grid(row=11,column=2,padx=0,pady=0)
|
|
|
|
l0=ttk.Entry(frame0, textvariable=self.overlap_var, justify='center')
|
|
l0.grid(row=12,column=2,padx=0,pady=0)
|
|
|
|
l0=ttk.Checkbutton(frame0, text='Split Mode', variable=self.split_mode_var)
|
|
l0.grid(row=13,column=2,padx=0,pady=0)
|
|
|
|
def help(self):
|
|
"""
|
|
Open Help Guide
|
|
"""
|
|
top= Toplevel(self)
|
|
if GetSystemMetrics(1) >= 900:
|
|
top.geometry("1080x810")
|
|
window_height = 810
|
|
window_width = 1080
|
|
elif GetSystemMetrics(1) <= 720:
|
|
top.geometry("930x640")
|
|
window_height = 640
|
|
window_width = 930
|
|
else:
|
|
top.geometry("930x670")
|
|
window_height = 670
|
|
window_width = 930
|
|
top.title("UVR Help Guide")
|
|
|
|
top.resizable(False, False) # This code helps to disable windows from resizing
|
|
|
|
screen_width = top.winfo_screenwidth()
|
|
screen_height = top.winfo_screenheight()
|
|
|
|
x_cordinate = int((screen_width/2) - (window_width/2))
|
|
y_cordinate = int((screen_height/2) - (window_height/2))
|
|
|
|
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
|
|
|
|
# change title bar icon
|
|
top.iconbitmap('img\\UVR-Icon-v2.ico')
|
|
|
|
def close_win():
|
|
top.destroy()
|
|
self.settings()
|
|
|
|
tabControl = ttk.Notebook(top)
|
|
|
|
tab1 = ttk.Frame(tabControl)
|
|
tab2 = ttk.Frame(tabControl)
|
|
tab3 = ttk.Frame(tabControl)
|
|
tab4 = ttk.Frame(tabControl)
|
|
tab5 = ttk.Frame(tabControl)
|
|
tab6 = ttk.Frame(tabControl)
|
|
tab7 = ttk.Frame(tabControl)
|
|
tab8 = ttk.Frame(tabControl)
|
|
tab9 = ttk.Frame(tabControl)
|
|
|
|
tabControl.add(tab1, text ='General')
|
|
tabControl.add(tab2, text ='VR Architecture')
|
|
tabControl.add(tab3, text ='MDX-Net')
|
|
tabControl.add(tab4, text ='Demucs v3')
|
|
tabControl.add(tab5, text ='Ensemble Mode')
|
|
tabControl.add(tab6, text ='Manual Ensemble')
|
|
tabControl.add(tab7, text ='More Info')
|
|
tabControl.add(tab8, text ='Credits')
|
|
tabControl.add(tab9, text ='Updates')
|
|
|
|
tabControl.pack(expand = 1, fill ="both")
|
|
|
|
#Configure the row/col of our frame and root window to be resizable and fill all available space
|
|
|
|
tab7.grid_rowconfigure(0, weight=1)
|
|
tab7.grid_columnconfigure(0, weight=1)
|
|
|
|
tab8.grid_rowconfigure(0, weight=1)
|
|
tab8.grid_columnconfigure(0, weight=1)
|
|
|
|
tab9.grid_rowconfigure(0, weight=1)
|
|
tab9.grid_columnconfigure(0, weight=1)
|
|
|
|
tk.Button(tab1, image=self.gen_opt_img, borderwidth=0, command=close_win).grid(column = 0,
|
|
row = 0,
|
|
padx = 87,
|
|
pady = 30)
|
|
|
|
tk.Button(tab2, image=self.vr_opt_img, borderwidth=0, command=close_win).grid(column = 0,
|
|
row = 0,
|
|
padx = 87,
|
|
pady = 30)
|
|
|
|
tk.Button(tab3, image=self.mdx_opt_img, borderwidth=0, command=close_win).grid(column = 0,
|
|
row = 0,
|
|
padx = 87,
|
|
pady = 30)
|
|
|
|
tk.Button(tab4, image=self.demucs_opt_img, borderwidth=0, command=close_win).grid(column = 0,
|
|
row = 0,
|
|
padx = 87,
|
|
pady = 30)
|
|
|
|
tk.Button(tab5, image=self.ense_opt_img, borderwidth=0, command=close_win).grid(column = 0,
|
|
row = 0,
|
|
padx = 87,
|
|
pady = 30)
|
|
|
|
tk.Button(tab6, image=self.user_ens_opt_img, borderwidth=0, command=close_win).grid(column = 0,
|
|
row = 0,
|
|
padx = 87,
|
|
pady = 30)
|
|
|
|
#frame0
|
|
frame0=Frame(tab7,highlightbackground='red',highlightthicknes=0)
|
|
frame0.grid(row=0,column=0,padx=0,pady=30)
|
|
|
|
if GetSystemMetrics(1) >= 900:
|
|
l0=Label(frame0,text="Notes",font=("Century Gothic", "16", "bold"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=1,column=0,padx=20,pady=10)
|
|
|
|
l0=Label(frame0,text="UVR is 100% free and open-source but MIT licensed.\nAll the models provided as part of UVR were trained by its core developers.\nPlease credit the core UVR developers if you choose to use any of our models or code for projects unrelated to UVR.",font=("Century Gothic", "13"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=2,column=0,padx=10,pady=7)
|
|
|
|
l0=Label(frame0,text="Resources",font=("Century Gothic", "16", "bold"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=3,column=0,padx=20,pady=7, sticky=N)
|
|
|
|
link = Label(frame0, text="Ultimate Vocal Remover (Official GitHub)",font=("Century Gothic", "14", "underline"), justify="center", fg="#13a4c9", cursor="hand2")
|
|
link.grid(row=4,column=0,padx=10,pady=7)
|
|
link.bind("<Button-1>", lambda e:
|
|
callback("https://github.com/Anjok07/ultimatevocalremovergui"))
|
|
|
|
l0=Label(frame0,text="You can find updates, report issues, and give us a shout via our official GitHub.",font=("Century Gothic", "13"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=5,column=0,padx=10,pady=7)
|
|
|
|
link = Label(frame0, text="SoX - Sound eXchange",font=("Century Gothic", "14", "underline"), justify="center", fg="#13a4c9", cursor="hand2")
|
|
link.grid(row=6,column=0,padx=10,pady=7)
|
|
link.bind("<Button-1>", lambda e:
|
|
callback("https://sourceforge.net/projects/sox/files/sox/14.4.2/sox-14.4.2-win32.zip/download"))
|
|
|
|
l0=Label(frame0,text="UVR relies on SoX for Noise Reduction. It's automatically included via the UVR installer but not the developer build.\nIf you are missing SoX, please download it via the link and extract the SoX archive to the following directory - lib_v5/sox",font=("Century Gothic", "13"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=7,column=0,padx=10,pady=7)
|
|
|
|
link = Label(frame0, text="FFmpeg",font=("Century Gothic", "14", "underline"), justify="center", fg="#13a4c9", cursor="hand2")
|
|
link.grid(row=8,column=0,padx=10,pady=7)
|
|
link.bind("<Button-1>", lambda e:
|
|
callback("https://www.wikihow.com/Install-FFmpeg-on-Windows"))
|
|
|
|
l0=Label(frame0,text="UVR relies on FFmpeg for processing non-wav audio files.\nIt's automatically included via the UVR installer but not the developer build.\nIf you are missing FFmpeg, please see the installation guide via the link provided.",font=("Century Gothic", "13"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=9,column=0,padx=10,pady=7)
|
|
|
|
link = Label(frame0, text="X-Minus AI",font=("Century Gothic", "14", "underline"), justify="center", fg="#13a4c9", cursor="hand2")
|
|
link.grid(row=10,column=0,padx=10,pady=7)
|
|
link.bind("<Button-1>", lambda e:
|
|
callback("https://x-minus.pro/ai"))
|
|
|
|
l0=Label(frame0,text="Many of the models provided are also on X-Minus.\nThis resource primarily benefits users without the computing resources to run the GUI or models locally.",font=("Century Gothic", "13"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=11,column=0,padx=10,pady=7)
|
|
|
|
link = Label(frame0, text="Official UVR Patreon",font=("Century Gothic", "14", "underline"), justify="center", fg="#13a4c9", cursor="hand2")
|
|
link.grid(row=12,column=0,padx=10,pady=7)
|
|
link.bind("<Button-1>", lambda e:
|
|
callback("https://www.patreon.com/uvr"))
|
|
|
|
l0=Label(frame0,text="If you wish to support and donate to this project, click the link above and become a Patreon!",font=("Century Gothic", "13"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=13,column=0,padx=10,pady=7)
|
|
|
|
frame0=Frame(tab8,highlightbackground='red',highlightthicknes=0)
|
|
frame0.grid(row=0,column=0,padx=0,pady=30)
|
|
|
|
#inside frame0
|
|
|
|
l0=Label(frame0,text="Core UVR Developers",font=("Century Gothic", "16", "bold"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=0,column=0,padx=20,pady=5, sticky=N)
|
|
|
|
l0=Label(frame0,image=self.credits_img,font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9")
|
|
l0.grid(row=1,column=0,padx=10,pady=5)
|
|
|
|
l0=Label(frame0,text="Anjok07\nAufr33",font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9")
|
|
l0.grid(row=2,column=0,padx=10,pady=5)
|
|
|
|
l0=Label(frame0,text="Special Thanks",font=("Century Gothic", "16", "bold"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=4,column=0,padx=20,pady=10)
|
|
|
|
l0=Label(frame0,text="DilanBoskan",font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9")
|
|
l0.grid(row=5,column=0,padx=10,pady=5)
|
|
|
|
l0=Label(frame0,text="Your contributions at the start of this project were essential to the success of UVR. Thank you!",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=6,column=0,padx=0,pady=0)
|
|
|
|
link = Label(frame0, text="Tsurumeso",font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9", cursor="hand2")
|
|
link.grid(row=7,column=0,padx=10,pady=5)
|
|
link.bind("<Button-1>", lambda e:
|
|
callback("https://github.com/tsurumeso/vocal-remover"))
|
|
|
|
l0=Label(frame0,text="Developed the original VR Architecture AI code.",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=8,column=0,padx=0,pady=0)
|
|
|
|
link = Label(frame0, text="Kuielab & Woosung Choi",font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9", cursor="hand2")
|
|
link.grid(row=9,column=0,padx=10,pady=5)
|
|
link.bind("<Button-1>", lambda e:
|
|
callback("https://github.com/kuielab"))
|
|
|
|
l0=Label(frame0,text="Developed the original MDX-Net AI code.",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=10,column=0,padx=0,pady=0)
|
|
|
|
l0=Label(frame0,text="Bas Curtiz",font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9")
|
|
l0.grid(row=11,column=0,padx=10,pady=5)
|
|
|
|
l0=Label(frame0,text="Designed the official UVR logo, icon, banner, splash screen, and interface.",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=12,column=0,padx=0,pady=0)
|
|
|
|
link = Label(frame0, text="Adefossez & Demucs",font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9", cursor="hand2")
|
|
link.grid(row=13,column=0,padx=10,pady=5)
|
|
link.bind("<Button-1>", lambda e:
|
|
callback("https://github.com/facebookresearch/demucs"))
|
|
|
|
l0=Label(frame0,text="Core developer of Facebook's Demucs Music Source Separation.",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=14,column=0,padx=0,pady=0)
|
|
|
|
l0=Label(frame0,text="Audio Separation Discord Community",font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9")
|
|
l0.grid(row=15,column=0,padx=10,pady=5)
|
|
|
|
l0=Label(frame0,text="Thank you for the support!",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=16,column=0,padx=0,pady=0)
|
|
|
|
l0=Label(frame0,text="CC Karokee & Friends Discord Community",font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9")
|
|
l0.grid(row=17,column=0,padx=10,pady=5)
|
|
|
|
l0=Label(frame0,text="Thank you for the support!",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=18,column=0,padx=0,pady=0)
|
|
|
|
frame0=Frame(tab9,highlightbackground='red',highlightthicknes=0)
|
|
frame0.grid(row=0,column=0,padx=0,pady=30)
|
|
|
|
l0=Label(frame0,text="Update Details",font=("Century Gothic", "16", "bold"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=1,column=0,padx=20,pady=10)
|
|
|
|
l0=Label(frame0,text="Installing Model Expansion Pack",font=("Century Gothic", "13", "bold"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=2,column=0,padx=0,pady=0)
|
|
|
|
l0=Label(frame0,text="1. Download the model expansion pack via the provided link below.\n2. Once the download has completed, click the \"Open Models Directory\" button below.\n3. Extract the \'Main Models\' folder within the downloaded archive to the opened \"models\" directory.\n4. Without restarting the application, you will now see the new models appear under the VR Architecture model selection list.",font=("Century Gothic", "11"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=3,column=0,padx=0,pady=0)
|
|
|
|
link = Label(frame0, text="Model Expansion Pack",font=("Century Gothic", "11", "underline"), justify="center", fg="#13a4c9", cursor="hand2")
|
|
link.grid(row=4,column=0,padx=10,pady=10)
|
|
link.bind("<Button-1>", lambda e:
|
|
callback("https://github.com/Anjok07/ultimatevocalremovergui/releases/tag/v5.2.0"))
|
|
|
|
l0=ttk.Button(frame0,text='Open Models Directory', command=self.open_Modelfolder_filedialog)
|
|
l0.grid(row=5,column=0,padx=0,pady=0)
|
|
|
|
l0=Label(frame0,text="\n\nBackward Compatibility",font=("Century Gothic", "13", "bold"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=6,column=0,padx=0,pady=0)
|
|
|
|
l0=Label(frame0,text="The v4 Models are fully compatible with this GUI. \n1. If you already have them on your system, click the \"Open Models Directory\" button below. \n2. Place the files with extension \".pth\" into the \"Main Models\" directory. \n3. Now they will automatically appear in the VR Architecture model selection list.\n Note: The v2 models are not compatible with this GUI.\n",font=("Century Gothic", "11"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=7,column=0,padx=0,pady=0)
|
|
|
|
l0=ttk.Button(frame0,text='Open Models Directory', command=self.open_Modelfolder_filedialog)
|
|
l0.grid(row=8,column=0,padx=0,pady=0)
|
|
|
|
l0=Label(frame0,text="\n\nInstalling Future Updates",font=("Century Gothic", "13", "bold"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=9,column=0,padx=0,pady=0)
|
|
|
|
l0=Label(frame0,text="New updates and patches for this application can be found on the official UVR Releases GitHub page (link below).\nAny new update instructions will likely require the use of the \"Open Application Directory\" button below.",font=("Century Gothic", "11"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=10,column=0,padx=0,pady=0)
|
|
|
|
link = Label(frame0, text="UVR Releases GitHub Page",font=("Century Gothic", "11", "underline"), justify="center", fg="#13a4c9", cursor="hand2")
|
|
link.grid(row=11,column=0,padx=10,pady=10)
|
|
link.bind("<Button-1>", lambda e:
|
|
callback("https://github.com/Anjok07/ultimatevocalremovergui/releases"))
|
|
|
|
l0=ttk.Button(frame0,text='Open Application Directory', command=self.open_appdir_filedialog)
|
|
l0.grid(row=12,column=0,padx=0,pady=0)
|
|
else:
|
|
l0=Label(frame0,text="Notes",font=("Century Gothic", "11", "bold"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=1,column=0,padx=5,pady=5)
|
|
|
|
l0=Label(frame0,text="UVR is 100% free and open-source but MIT licensed.\nPlease credit the core UVR developers if you choose to use any of our models or code for projects unrelated to UVR.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=2,column=0,padx=5,pady=5)
|
|
|
|
l0=Label(frame0,text="Resources",font=("Century Gothic", "11", "bold"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=3,column=0,padx=5,pady=5, sticky=N)
|
|
|
|
link = Label(frame0, text="Ultimate Vocal Remover (Official GitHub)",font=("Century Gothic", "11", "underline"), justify="center", fg="#13a4c9", cursor="hand2")
|
|
link.grid(row=4,column=0,padx=5,pady=5)
|
|
link.bind("<Button-1>", lambda e:
|
|
callback("https://github.com/Anjok07/ultimatevocalremovergui"))
|
|
|
|
l0=Label(frame0,text="You can find updates, report issues, and give us a shout via our official GitHub.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=5,column=0,padx=5,pady=5)
|
|
|
|
link = Label(frame0, text="SoX - Sound eXchange",font=("Century Gothic", "11", "underline"), justify="center", fg="#13a4c9", cursor="hand2")
|
|
link.grid(row=6,column=0,padx=5,pady=5)
|
|
link.bind("<Button-1>", lambda e:
|
|
callback("https://sourceforge.net/projects/sox/files/sox/14.4.2/sox-14.4.2-win32.zip/download"))
|
|
|
|
l0=Label(frame0,text="UVR relies on SoX for Noise Reduction. It's automatically included via the UVR installer but not the developer build.\nIf you are missing SoX, please download it via the link and extract the SoX archive to the following directory - lib_v5/sox",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=7,column=0,padx=5,pady=5)
|
|
|
|
link = Label(frame0, text="FFmpeg",font=("Century Gothic", "11", "underline"), justify="center", fg="#13a4c9", cursor="hand2")
|
|
link.grid(row=8,column=0,padx=5,pady=5)
|
|
link.bind("<Button-1>", lambda e:
|
|
callback("https://www.wikihow.com/Install-FFmpeg-on-Windows"))
|
|
|
|
l0=Label(frame0,text="UVR relies on FFmpeg for processing non-wav audio files.\nIf you are missing FFmpeg, please see the installation guide via the link provided.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=9,column=0,padx=5,pady=5)
|
|
|
|
link = Label(frame0, text="X-Minus AI",font=("Century Gothic", "11", "underline"), justify="center", fg="#13a4c9", cursor="hand2")
|
|
link.grid(row=10,column=0,padx=5,pady=5)
|
|
link.bind("<Button-1>", lambda e:
|
|
callback("https://x-minus.pro/ai"))
|
|
|
|
l0=Label(frame0,text="Many of the models provided are also on X-Minus.\nThis resource primarily benefits users without the computing resources to run the GUI or models locally.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=11,column=0,padx=5,pady=5)
|
|
|
|
link = Label(frame0, text="Official UVR Patreon",font=("Century Gothic", "11", "underline"), justify="center", fg="#13a4c9", cursor="hand2")
|
|
link.grid(row=12,column=0,padx=5,pady=5)
|
|
link.bind("<Button-1>", lambda e:
|
|
callback("https://www.patreon.com/uvr"))
|
|
|
|
l0=Label(frame0,text="If you wish to support and donate to this project, click the link above and become a Patreon!",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=13,column=0,padx=5,pady=5)
|
|
|
|
frame0=Frame(tab8,highlightbackground='red',highlightthicknes=0)
|
|
frame0.grid(row=0,column=0,padx=0,pady=30)
|
|
|
|
#inside frame0
|
|
|
|
l0=Label(frame0,text="Core UVR Developers",font=("Century Gothic", "12", "bold"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=0,column=0,padx=20,pady=5, sticky=N)
|
|
|
|
l0=Label(frame0,image=self.credits_img,font=("Century Gothic", "11", "bold"), justify="center", fg="#13a4c9")
|
|
l0.grid(row=1,column=0,padx=5,pady=5)
|
|
|
|
l0=Label(frame0,text="Anjok07\nAufr33",font=("Century Gothic", "11", "bold"), justify="center", fg="#13a4c9")
|
|
l0.grid(row=2,column=0,padx=5,pady=5)
|
|
|
|
l0=Label(frame0,text="Special Thanks",font=("Century Gothic", "10", "bold"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=4,column=0,padx=20,pady=10)
|
|
|
|
l0=Label(frame0,text="DilanBoskan",font=("Century Gothic", "11", "bold"), justify="center", fg="#13a4c9")
|
|
l0.grid(row=5,column=0,padx=5,pady=5)
|
|
|
|
l0=Label(frame0,text="Your contributions at the start of this project were essential to the success of UVR. Thank you!",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=6,column=0,padx=0,pady=0)
|
|
|
|
link = Label(frame0, text="Tsurumeso",font=("Century Gothic", "11", "bold"), justify="center", fg="#13a4c9", cursor="hand2")
|
|
link.grid(row=7,column=0,padx=5,pady=5)
|
|
link.bind("<Button-1>", lambda e:
|
|
callback("https://github.com/tsurumeso/vocal-remover"))
|
|
|
|
l0=Label(frame0,text="Developed the original VR Architecture AI code.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=8,column=0,padx=0,pady=0)
|
|
|
|
link = Label(frame0, text="Kuielab & Woosung Choi",font=("Century Gothic", "11", "bold"), justify="center", fg="#13a4c9", cursor="hand2")
|
|
link.grid(row=9,column=0,padx=5,pady=5)
|
|
link.bind("<Button-1>", lambda e:
|
|
callback("https://github.com/kuielab"))
|
|
|
|
l0=Label(frame0,text="Developed the original MDX-Net AI code.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=10,column=0,padx=0,pady=0)
|
|
|
|
l0=Label(frame0,text="Bas Curtiz",font=("Century Gothic", "11", "bold"), justify="center", fg="#13a4c9")
|
|
l0.grid(row=11,column=0,padx=5,pady=5)
|
|
|
|
l0=Label(frame0,text="Designed the official UVR logo, icon, banner, splash screen, and interface.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=12,column=0,padx=0,pady=0)
|
|
|
|
link = Label(frame0, text="Adefossez & Demucs",font=("Century Gothic", "11", "bold"), justify="center", fg="#13a4c9", cursor="hand2")
|
|
link.grid(row=13,column=0,padx=5,pady=5)
|
|
link.bind("<Button-1>", lambda e:
|
|
callback("https://github.com/facebookresearch/demucs"))
|
|
|
|
l0=Label(frame0,text="Core developer of Facebook's Demucs Music Source Separation.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=14,column=0,padx=0,pady=0)
|
|
|
|
l0=Label(frame0,text="Audio Separation and CC Karokee & Friends Discord Communities",font=("Century Gothic", "11", "bold"), justify="center", fg="#13a4c9")
|
|
l0.grid(row=15,column=0,padx=5,pady=5)
|
|
|
|
l0=Label(frame0,text="Thank you for the support!",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=16,column=0,padx=0,pady=0)
|
|
|
|
frame0=Frame(tab9,highlightbackground='red',highlightthicknes=0)
|
|
frame0.grid(row=0,column=0,padx=0,pady=30)
|
|
|
|
l0=Label(frame0,text="Update Details",font=("Century Gothic", "12", "bold"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=1,column=0,padx=20,pady=5)
|
|
|
|
l0=Label(frame0,text="Installing Model Expansion Pack",font=("Century Gothic", "11", "bold"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=2,column=0,padx=0,pady=0)
|
|
|
|
l0=Label(frame0,text="1. Download the model expansion pack via the provided link below.\n2. Once the download has completed, click the \"Open Models Directory\" button below.\n3. Extract the \'Main Models\' folder within the downloaded archive to the opened \"models\" directory.\n4. Without restarting the application, you will now see the new models appear under the VR Architecture model selection list.",font=("Century Gothic", "11"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=3,column=0,padx=0,pady=0)
|
|
|
|
link = Label(frame0, text="Model Expansion Pack",font=("Century Gothic", "10", "bold"), justify="center", fg="#13a4c9", cursor="hand2")
|
|
link.grid(row=4,column=0,padx=5,pady=5)
|
|
link.bind("<Button-1>", lambda e:
|
|
callback("https://github.com/Anjok07/ultimatevocalremovergui/releases/tag/v5.2.0"))
|
|
|
|
l0=Button(frame0,text='Open Models Directory',font=("Century Gothic", "8"), command=self.open_Modelfolder_filedialog, justify="left", wraplength=1000, bg="black", relief="ridge")
|
|
l0.grid(row=5,column=0,padx=0,pady=0)
|
|
|
|
l0=Label(frame0,text="\nBackward Compatibility",font=("Century Gothic", "11", "bold"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=6,column=0,padx=0,pady=0)
|
|
|
|
l0=Label(frame0,text="The v4 Models are fully compatible with this GUI. \n1. If you already have them on your system, click the \"Open Models Directory\" button below. \n2. Place the files with extension \".pth\" into the \"Main Models\" directory. \n3. Now they will automatically appear in the VR Architecture model selection list.\n Note: The v2 models are not compatible with this GUI.\n",font=("Century Gothic", "11"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=7,column=0,padx=0,pady=0)
|
|
|
|
l0=Button(frame0,text='Open Models Directory',font=("Century Gothic", "8"), command=self.open_Modelfolder_filedialog, justify="left", wraplength=1000, bg="black", relief="ridge")
|
|
l0.grid(row=8,column=0,padx=0,pady=0)
|
|
|
|
l0=Label(frame0,text="\nInstalling Future Updates",font=("Century Gothic", "11", "bold"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=9,column=0,padx=0,pady=0)
|
|
|
|
l0=Label(frame0,text="New updates and patches for this application can be found on the official UVR Releases GitHub page (link below).\nAny new update instructions will likely require the use of the \"Open Application Directory\" button below.",font=("Century Gothic", "11"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=10,column=0,padx=0,pady=0)
|
|
|
|
link = Label(frame0, text="UVR Releases GitHub Page",font=("Century Gothic", "10", "bold"), justify="center", fg="#13a4c9", cursor="hand2")
|
|
link.grid(row=11,column=0,padx=5,pady=5)
|
|
link.bind("<Button-1>", lambda e:
|
|
callback("https://github.com/Anjok07/ultimatevocalremovergui/releases"))
|
|
|
|
l0=Button(frame0,text='Open Application Directory',font=("Century Gothic", "8"), command=self.open_appdir_filedialog, justify="left", wraplength=1000, bg="black", relief="ridge")
|
|
l0.grid(row=12,column=0,padx=0,pady=0)
|
|
|
|
|
|
def settings(self):
|
|
"""
|
|
Open Settings
|
|
"""
|
|
top= Toplevel(self)
|
|
|
|
top.geometry("600x500")
|
|
window_height = 600
|
|
window_width = 500
|
|
|
|
top.title("Settings Guide")
|
|
|
|
top.resizable(False, False) # This code helps to disable windows from resizing
|
|
|
|
screen_width = top.winfo_screenwidth()
|
|
screen_height = top.winfo_screenheight()
|
|
|
|
x_cordinate = int((screen_width/2) - (window_width/2))
|
|
y_cordinate = int((screen_height/2) - (window_height/2))
|
|
|
|
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
|
|
|
|
# change title bar icon
|
|
top.iconbitmap('img\\UVR-Icon-v2.ico')
|
|
|
|
def close_win_custom_ensemble():
|
|
top.destroy()
|
|
self.custom_ensemble()
|
|
|
|
def close_win_advanced_mdx_options():
|
|
top.destroy()
|
|
self.advanced_mdx_options()
|
|
|
|
def close_win_advanced_demucs_options():
|
|
top.destroy()
|
|
self.advanced_demucs_options()
|
|
|
|
def close_win_advanced_vr_options():
|
|
top.destroy()
|
|
self.advanced_vr_options()
|
|
|
|
def close_win_error_log():
|
|
top.destroy()
|
|
self.error_log()
|
|
|
|
def close_win_help():
|
|
top.destroy()
|
|
self.help()
|
|
|
|
def close_win():
|
|
top.destroy()
|
|
|
|
tabControl = ttk.Notebook(top)
|
|
|
|
tab1 = ttk.Frame(tabControl)
|
|
|
|
tabControl.add(tab1, text ='Settings Guide')
|
|
|
|
tabControl.pack(expand = 1, fill ="both")
|
|
|
|
tab1.grid_rowconfigure(0, weight=1)
|
|
tab1.grid_columnconfigure(0, weight=1)
|
|
|
|
frame0=Frame(tab1,highlightbackground='red',highlightthicknes=0)
|
|
frame0.grid(row=0,column=0,padx=0,pady=0)
|
|
|
|
l0=Label(frame0,text="Main Menu",font=("Century Gothic", "13", "bold", "underline"), justify="center", fg="#13a4c9")
|
|
l0.grid(row=0,column=0,padx=0,pady=10)
|
|
|
|
l0=ttk.Button(frame0,text="Ensemble Customization Options", command=close_win_custom_ensemble)
|
|
l0.grid(row=1,column=0,padx=20,pady=5)
|
|
|
|
l0=ttk.Button(frame0,text="Advanced MDX-Net Options", command=close_win_advanced_mdx_options)
|
|
l0.grid(row=2,column=0,padx=20,pady=5)
|
|
|
|
l0=ttk.Button(frame0,text="Advanced Demucs Options", command=close_win_advanced_demucs_options)
|
|
l0.grid(row=3,column=0,padx=20,pady=5)
|
|
|
|
l0=ttk.Button(frame0,text="Advanced VR Options", command=close_win_advanced_vr_options)
|
|
l0.grid(row=4,column=0,padx=20,pady=5)
|
|
|
|
l0=ttk.Button(frame0,text="Open Help Guide", command=close_win_help)
|
|
l0.grid(row=5,column=0,padx=20,pady=5)
|
|
|
|
l0=ttk.Button(frame0,text='Open Error Log', command=close_win_error_log)
|
|
l0.grid(row=6,column=0,padx=20,pady=5)
|
|
|
|
l0=Label(frame0,text="Additional Options",font=("Century Gothic", "13", "bold", "underline"), justify="center", fg="#13a4c9")
|
|
l0.grid(row=7,column=0,padx=0,pady=10)
|
|
|
|
l0=ttk.Button(frame0,text='Open Application Directory', command=self.open_appdir_filedialog)
|
|
l0.grid(row=8,column=0,padx=20,pady=5)
|
|
|
|
l0=ttk.Button(frame0,text='Close Window', command=close_win)
|
|
l0.grid(row=9,column=0,padx=20,pady=5)
|
|
|
|
|
|
def error_log(self):
|
|
"""
|
|
Open Error Log
|
|
"""
|
|
top= Toplevel(self)
|
|
if GetSystemMetrics(1) >= 900:
|
|
top.geometry("1080x810")
|
|
window_height = 810
|
|
window_width = 1080
|
|
elif GetSystemMetrics(1) <= 720:
|
|
top.geometry("930x640")
|
|
window_height = 640
|
|
window_width = 930
|
|
else:
|
|
top.geometry("930x670")
|
|
window_height = 670
|
|
window_width = 930
|
|
|
|
top.title("UVR Help Guide")
|
|
|
|
top.resizable(False, False) # This code helps to disable windows from resizing
|
|
|
|
screen_width = top.winfo_screenwidth()
|
|
screen_height = top.winfo_screenheight()
|
|
|
|
x_cordinate = int((screen_width/2) - (window_width/2))
|
|
y_cordinate = int((screen_height/2) - (window_height/2))
|
|
|
|
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
|
|
|
|
# change title bar icon
|
|
top.iconbitmap('img\\UVR-Icon-v2.ico')
|
|
|
|
def close_win():
|
|
top.destroy()
|
|
self.settings()
|
|
|
|
def close_win_self():
|
|
top.destroy()
|
|
|
|
tabControl = ttk.Notebook(top)
|
|
|
|
tab1 = ttk.Frame(tabControl)
|
|
|
|
tabControl.add(tab1, text ='Error Log')
|
|
|
|
tabControl.pack(expand = 1, fill ="both")
|
|
|
|
tab1.grid_rowconfigure(0, weight=1)
|
|
tab1.grid_columnconfigure(0, weight=1)
|
|
|
|
frame0=Frame(tab1,highlightbackground='red',highlightthicknes=0)
|
|
frame0.grid(row=0,column=0,padx=0,pady=0)
|
|
|
|
l0=Label(frame0,text="Error Details",font=("Century Gothic", "16", "bold"), justify="center", fg="#f4f4f4")
|
|
l0.grid(row=1,column=0,padx=20,pady=10)
|
|
|
|
l0=Label(frame0,text="This tab will show the raw details of the last error received.",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=2,column=0,padx=0,pady=0)
|
|
|
|
l0=Label(frame0,text="(Click the error console below to copy the error)\n",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7")
|
|
l0.grid(row=3,column=0,padx=0,pady=0)
|
|
|
|
with open("errorlog.txt", "r") as f:
|
|
l0=Button(frame0,text=f.read(),font=("Century Gothic", "7"), command=self.copy_clip, justify="left", wraplength=1000, fg="#FF0000", bg="black", relief="sunken")
|
|
l0.grid(row=4,column=0,padx=0,pady=0)
|
|
|
|
l0=ttk.Button(frame0,text="Back to Main Menu", command=close_win)
|
|
l0.grid(row=5,column=0,padx=20,pady=10)
|
|
|
|
l0=ttk.Button(frame0,text='Close Window', command=close_win_self)
|
|
l0.grid(row=6,column=0,padx=20,pady=0)
|
|
|
|
def copy_clip(self):
|
|
copy_t = open("errorlog.txt", "r").read()
|
|
pyperclip.copy(copy_t)
|
|
|
|
def open_Modelfolder_filedialog(self):
|
|
"""Let user paste a ".pth" model to use for the vocal seperation"""
|
|
filename = 'models'
|
|
|
|
if sys.platform == "win32":
|
|
os.startfile(filename)
|
|
else:
|
|
opener = "open" if sys.platform == "darwin" else "xdg-open"
|
|
subprocess.call([opener, filename])
|
|
|
|
def open_Modelfolder_vr(self):
|
|
"""Let user paste a ".pth" model to use for the vocal seperation"""
|
|
filename = 'models\Main_Models'
|
|
|
|
if sys.platform == "win32":
|
|
os.startfile(filename)
|
|
else:
|
|
opener = "open" if sys.platform == "darwin" else "xdg-open"
|
|
subprocess.call([opener, filename])
|
|
|
|
def open_Modelfolder_de(self):
|
|
"""Let user paste a ".pth" model to use for the vocal seperation"""
|
|
filename = 'models\Demucs_Models'
|
|
|
|
if sys.platform == "win32":
|
|
os.startfile(filename)
|
|
else:
|
|
opener = "open" if sys.platform == "darwin" else "xdg-open"
|
|
subprocess.call([opener, filename])
|
|
|
|
def open_appdir_filedialog(self):
|
|
|
|
pathname = '.'
|
|
|
|
print(pathname)
|
|
|
|
if sys.platform == "win32":
|
|
os.startfile(pathname)
|
|
else:
|
|
opener = "open" if sys.platform == "darwin" else "xdg-open"
|
|
subprocess.call([opener, filename])
|
|
|
|
def save_values(self):
|
|
"""
|
|
Save the data of the application
|
|
"""
|
|
# Get constants
|
|
instrumental = self.instrumentalModel_var.get()
|
|
if [bool(instrumental)].count(True) == 2: #Checkthis
|
|
window_size = DEFAULT_DATA['window_size']
|
|
agg = DEFAULT_DATA['agg']
|
|
chunks = DEFAULT_DATA['chunks']
|
|
noisereduc_s = DEFAULT_DATA['noisereduc_s']
|
|
mixing = DEFAULT_DATA['mixing']
|
|
else:
|
|
window_size = self.winSize_var.get()
|
|
agg = self.agg_var.get()
|
|
chunks = self.chunks_var.get()
|
|
noisereduc_s = self.noisereduc_s_var.get()
|
|
mixing = self.mixing_var.get()
|
|
|
|
# -Save Data-
|
|
save_data(data={
|
|
'exportPath': self.exportPath_var.get(),
|
|
'inputPaths': self.inputPaths,
|
|
'saveFormat': self.saveFormat_var.get(),
|
|
'vr_ensem': self.vrensemchoose_var.get(),
|
|
'vr_ensem_a': self.vrensemchoose_a_var.get(),
|
|
'vr_ensem_b': self.vrensemchoose_b_var.get(),
|
|
'vr_ensem_c': self.vrensemchoose_c_var.get(),
|
|
'vr_ensem_d': self.vrensemchoose_d_var.get(),
|
|
'vr_ensem_e': self.vrensemchoose_e_var.get(),
|
|
'vr_ensem_mdx_a': self.vrensemchoose_mdx_a_var.get(),
|
|
'vr_ensem_mdx_b': self.vrensemchoose_mdx_b_var.get(),
|
|
'vr_ensem_mdx_c': self.vrensemchoose_mdx_c_var.get(),
|
|
'mdx_ensem': self.mdxensemchoose_var.get(),
|
|
'mdx_ensem_b': self.mdxensemchoose_b_var.get(),
|
|
'gpu': self.gpuConversion_var.get(),
|
|
'appendensem': self.appendensem_var.get(),
|
|
'demucs_only': self.demucs_only_var.get(),
|
|
'split_mode': self.split_mode_var.get(),
|
|
'postprocess': self.postprocessing_var.get(),
|
|
'tta': self.tta_var.get(),
|
|
'save': self.save_var.get(),
|
|
'output_image': self.outputImage_var.get(),
|
|
'window_size': window_size,
|
|
'agg': agg,
|
|
'useModel': 'instrumental',
|
|
'lastDir': self.lastDir,
|
|
'modelFolder': self.modelFolder_var.get(),
|
|
'modelInstrumentalLabel': self.instrumentalModel_var.get(),
|
|
'aiModel': self.aiModel_var.get(),
|
|
'algo': self.algo_var.get(),
|
|
'demucs_stems': self.demucs_stems_var.get(),
|
|
'ensChoose': self.ensChoose_var.get(),
|
|
'mdxnetModel': self.mdxnetModel_var.get(),
|
|
'DemucsModel': self.DemucsModel_var.get(),
|
|
'DemucsModel_MDX': self.DemucsModel_MDX_var.get(),
|
|
'ModelParams': self.ModelParams_var.get(),
|
|
#MDX-Net
|
|
'demucsmodel': self.demucsmodel_var.get(),
|
|
'non_red': self.non_red_var.get(),
|
|
'noise_reduc': self.noisereduc_var.get(),
|
|
'voc_only': self.voc_only_var.get(),
|
|
'inst_only': self.inst_only_var.get(),
|
|
'voc_only_b': self.voc_only_b_var.get(),
|
|
'inst_only_b': self.inst_only_b_var.get(),
|
|
'audfile': self.audfile_var.get(),
|
|
'chunks': chunks,
|
|
'n_fft_scale': self.n_fft_scale_var.get(),
|
|
'dim_f': self.dim_f_var.get(),
|
|
'noise_pro_select': self.noise_pro_select_var.get(),
|
|
'overlap': self.overlap_var.get(),
|
|
'shifts': self.shifts_var.get(),
|
|
'overlap_b': self.overlap_b_var.get(),
|
|
'shifts_b': self.shifts_b_var.get(),
|
|
'margin': self.margin_var.get(),
|
|
'channel': self.channel_var.get(),
|
|
'compensate': self.compensate_var.get(),
|
|
'mdxnetModeltype': self.mdxnetModeltype_var.get(),
|
|
'noisereduc_s': noisereduc_s,
|
|
'mixing': mixing,
|
|
},
|
|
)
|
|
|
|
self.destroy()
|
|
|
|
if __name__ == "__main__":
|
|
|
|
root = MainWindow()
|
|
|
|
root.tk.call(
|
|
'wm',
|
|
'iconphoto',
|
|
root._w,
|
|
tk.PhotoImage(file='img\\GUI-icon.png')
|
|
)
|
|
|
|
lib_v5.sv_ttk.set_theme("dark")
|
|
lib_v5.sv_ttk.use_dark_theme() # Set dark theme
|
|
|
|
#Define a callback function
|
|
def callback(url):
|
|
webbrowser.open_new_tab(url)
|
|
|
|
root.mainloop() |