ultimatevocalremovergui/uvr-zn.py

6245 lines
312 KiB
Python
Raw Normal View History

2022-08-18 06:09:35 +02:00
# GUI modules
import os
import glob
from re import T
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
import hashlib
import wget
import time
import ctypes
import trace
import zipfile
import traceback
import torch
# 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
import lib_v5.filelist
import shutil
import importlib
import urllib.request
import pyAesCrypt
from __version__ import VERSION
from win32api import GetSystemMetrics
try:
with open(os.path.join(os.getcwd(), 'tmp', 'splash.txt'), 'w') as f:
f.write('1')
except:
pass
class KThread(threading.Thread):
def __init__(self, *args, **keywords):
threading.Thread.__init__(self, *args, **keywords)
self.killed = False
def start(self):
self.__run_backup = self.run
self.run = self.__run
threading.Thread.start(self)
def __run(self):
sys.settrace(self.globaltrace)
self.__run_backup()
self.run = self.__run_backup
def globaltrace(self, frame, why, arg):
if why == 'call':
return self.localtrace
else:
return None
def localtrace(self, frame, why, arg):
if self.killed:
if why == 'line':
raise SystemExit()
return self.localtrace
def kill(self):
self.killed = True
# 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
demucs_v3_repo_folder_path = 'models/Demucs_Models'
demucs_v3_repo_folder_path_b = 'models/Demucs_Models/v3_repo'
if not os.path.isdir(demucs_v3_repo_folder_path):
os.mkdir(demucs_v3_repo_folder_path)
if not os.path.isdir(demucs_v3_repo_folder_path_b):
os.mkdir(demucs_v3_repo_folder_path_b)
try:
shutil.move("models/Demucs_Models/5d2d6c55-db83574e.th", "models/Demucs_Models/v3_repo/5d2d6c55-db83574e.th")
shutil.move("models/Demucs_Models/7fd6ef75-a905dd85.th", "models/Demucs_Models/v3_repo/7fd6ef75-a905dd85.th")
shutil.move("models/Demucs_Models/14fc6a69-a89dd0ee.th", "models/Demucs_Models/v3_repo/14fc6a69-a89dd0ee.th")
shutil.move("models/Demucs_Models/83fc094f-4a16d450.th", "models/Demucs_Models/v3_repo/83fc094f-4a16d450.th")
shutil.move("models/Demucs_Models/464b36d7-e5a9386e.th", "models/Demucs_Models/v3_repo/464b36d7-e5a9386e.th")
shutil.move("models/Demucs_Models/a1d90b5c-ae9d2452.th", "models/Demucs_Models/v3_repo/a1d90b5c-ae9d2452.th")
shutil.move("models/Demucs_Models/cfa93e08-61801ae1.th", "models/Demucs_Models/v3_repo/cfa93e08-61801ae1.th")
shutil.move("models/Demucs_Models/e51eebcc-c1b80bdd.th", "models/Demucs_Models/v3_repo/e51eebcc-c1b80bdd.th")
shutil.move("models/Demucs_Models/ebf34a2d.th", "models/Demucs_Models/v3_repo/ebf34a2d.th")
shutil.move("models/Demucs_Models/ebf34a2db.th", "models/Demucs_Models/v3_repo/ebf34a2db.th")
print('Demucs v3 models have been moved to the correct directory.')
except:
pass
try:
srcdir = "models/Demucs_Models/v3_repo"
dstdir = "models/Demucs_Models"
for basename in os.listdir(srcdir):
if basename.endswith('.yaml'):
pathname = os.path.join(srcdir, basename)
if os.path.isfile(pathname):
shutil.copy2(pathname, dstdir)
except:
pass
try:
srcdir = "models/Demucs_Models"
dstdir = "models/Demucs_Models/v3_repo"
for basename in os.listdir(srcdir):
if basename.endswith('.yaml'):
pathname = os.path.join(srcdir, basename)
if os.path.isfile(pathname):
shutil.copy2(pathname, dstdir)
except:
pass
try:
srcdir = "models/Demucs_Models"
for basename in os.listdir(srcdir):
if basename.endswith('.tmp'):
pathname = os.path.join(srcdir, basename)
if os.path.isfile(pathname):
os.remove(pathname)
except:
pass
try:
srcdir = "models/Main_Models"
for basename in os.listdir(srcdir):
if basename.endswith('.tmp'):
pathname = os.path.join(srcdir, basename)
if os.path.isfile(pathname):
os.remove(pathname)
except:
pass
try:
srcdir = "models/MDX_Net_Models"
for basename in os.listdir(srcdir):
if basename.endswith('.tmp'):
pathname = os.path.join(srcdir, basename)
if os.path.isfile(pathname):
os.remove(pathname)
except:
pass
try:
with open('lib_v5/filelists/ensemble_list/mdx_demuc_en_list.txt', 'w') as f:
f.write('No Model\nNo Model\n')
except:
pass
try:
srcdir = "models/Demucs_Models/v3_repo"
for basename in os.listdir(srcdir):
if basename.endswith('.tmp'):
pathname = os.path.join(srcdir, basename)
if os.path.isfile(pathname):
os.remove(pathname)
except:
pass
try:
os.rename("models/Main_Models/MGM_HIGHEND_v4_sr44100_hl1024_nf2048.pth", "models/Main_Models/MGM_HIGHEND_v4.pth")
os.rename("models/Main_Models/MGM_LOWEND_A_v4_sr32000_hl512_nf2048.pth", "models/Main_Models/MGM_LOWEND_A_v4.pth")
os.rename("models/Main_Models/MGM_LOWEND_B_v4_sr33075_hl384_nf2048.pth", "models/Main_Models/MGM_LOWEND_B_v4.pth")
os.rename("models/Main_Models/MGM_MAIN_v4_sr44100_hl512_nf2048.pth", "models/Main_Models/MGM_MAIN_v4.pth")
except:
pass
try:
os.rename("models/MDX_Net_Models/UVR_MDXNET_9703.onnx", "models/MDX_Net_Models/UVR_MDXNET_1_9703.onnx")
os.rename("models/MDX_Net_Models/UVR_MDXNET_9682.onnx", "models/MDX_Net_Models/UVR_MDXNET_2_9682.onnx")
os.rename("models/MDX_Net_Models/UVR_MDXNET_9662.onnx", "models/MDX_Net_Models/UVR_MDXNET_3_9662.onnx")
except:
pass
#Images
banner_path = os.path.join(base_path, 'img', 'UVR-banner.png')
credits_path = os.path.join(base_path, 'img', 'credits.png')
demucs_opt_path = os.path.join(base_path, 'img', 'demucs_opt.png')
donate_path = os.path.join(base_path, 'img', 'donate.png')
download_path = os.path.join(base_path, 'img', 'download.png')
efile_path = os.path.join(base_path, 'img', 'file.png')
ense_opt_path = os.path.join(base_path, 'img', 'ense_opt.png')
gen_opt_path = os.path.join(base_path, 'img', 'gen_opt.png')
help_path = os.path.join(base_path, 'img', 'help.png')
instrumentalModels_dir = os.path.join(base_path, 'models')
key_path = os.path.join(base_path, 'img', 'key.png')
mdx_opt_path = os.path.join(base_path, 'img', 'mdx_opt.png')
stop_path = os.path.join(base_path, 'img', 'stop.png')
user_ens_opt_path = os.path.join(base_path, 'img', 'user_ens_opt.png')
vr_opt_path = os.path.join(base_path, 'img', 'vr_opt.png')
try:
with open('uvr_patch_version.txt', 'r') as file :
patch_version = file.read()
os.remove(f'{patch_version}.exe')
except:
pass
DEFAULT_DATA = {
'agg': 10,
'aiModel': 'MDX-Net',
'algo': 'Instrumentals (Min Spec)',
'appendensem': False,
'audfile': True,
'aud_mdx': True,
'autocompensate': True,
'break': False,
'channel': 64,
'chunks': 'Auto',
'chunks_d': 'Auto',
'compensate': 1.03597672895,
'demucs_only': False,
'demucs_stems': 'All Stems',
'DemucsModel': 'mdx_extra',
'demucsmodel': False,
'DemucsModel_MDX': 'UVR_Demucs_Model_1',
'demucsmodel_sel_VR': 'UVR_Demucs_Model_1',
'demucsmodelVR': False,
'dim_f': 2048,
'ensChoose': 'Multi-AI Ensemble',
'exportPath': '',
'flactype': 'PCM_16',
'gpu': False,
'inputPaths': [],
'inst_only': False,
'inst_only_b': False,
'lastDir': None,
'margin': 44100,
'mdx_ensem': 'MDX-Net: UVR-MDX-NET Main',
'mdx_ensem_b': 'No Model',
'mdx_only_ensem_a': 'MDX-Net: UVR-MDX-NET Main',
'mdx_only_ensem_b': 'MDX-Net: UVR-MDX-NET 1',
'mdx_only_ensem_c': 'No Model',
'mdx_only_ensem_d': 'No Model',
'mdx_only_ensem_e': 'No Model',
'mdxnetModel': 'UVR-MDX-NET Main',
'mdxnetModeltype': 'Vocals (Custom)',
'mixing': 'Default',
'modeldownload': 'No Model Selected',
'modeldownload_mdx': 'No Model Selected',
'modeldownload_demucs': 'No Model Selected',
'modeldownload_type': 'VR Arc',
'modelFolder': False,
'modelInstrumentalLabel': '',
'ModelParams': 'Auto',
'mp3bit': '320k',
'n_fft_scale': 6144,
'noise_pro_select': 'Auto Select',
'noise_reduc': True,
'noisereduc_s': '3',
'non_red': False,
'nophaseinst': False,
'normalize': False,
'output_image': False,
'overlap': 0.25,
'overlap_b': 0.25,
'postprocess': False,
'save': True,
'saveFormat': 'Wav',
'selectdownload': 'VR Arc',
'segment': 'None',
'settest': False,
'shifts': 2,
'shifts_b': 2,
'split_mode': True,
'tta': False,
'useModel': 'instrumental',
'voc_only': False,
'voc_only_b': False,
'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',
'vr_multi_USER_model_param_1': 'Auto',
'vr_multi_USER_model_param_2': 'Auto',
'vr_multi_USER_model_param_3': 'Auto',
'vr_multi_USER_model_param_4': 'Auto',
'vr_basic_USER_model_param_1': 'Auto',
'vr_basic_USER_model_param_2': 'Auto',
'vr_basic_USER_model_param_3': 'Auto',
'vr_basic_USER_model_param_4': 'Auto',
'vr_basic_USER_model_param_5': 'Auto',
'wavtype': 'PCM_16',
'window_size': '512',
}
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_alt():
save_data(data=DEFAULT_DATA)
return load_data()
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])
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))
self.download_img = open_image(path=download_path,
size=(30, 30))
self.donate_img = open_image(path=donate_path,
size=(30, 30))
self.key_img = open_image(path=key_path,
size=(30, 30))
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.lastInstrumentalModels_ensem = []
self.lastmdx_demuc_ensem = []
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.ModelParamsLabel_ens_to_path = defaultdict(lambda: '')
self.lastModelParams_ens = []
# -Tkinter Value Holders-
data = load_data()
data_alt = load_data_alt()
try:
self.agg_var = tk.StringVar(value=data['agg'])
except:
self.agg_var = tk.StringVar(value=data_alt['agg'])
try:
self.aiModel_var = tk.StringVar(value=data['aiModel'])
except:
self.aiModel_var = tk.StringVar(value=data_alt['aiModel'])
try:
self.algo_var = tk.StringVar(value=data['algo'])
except:
self.algo_var = tk.StringVar(value=data_alt['algo'])
try:
self.appendensem_var = tk.BooleanVar(value=data['appendensem'])
except:
self.appendensem_var = tk.BooleanVar(value=data_alt['appendensem'])
try:
self.audfile_var = tk.BooleanVar(value=data['audfile'])
except:
self.audfile_var = tk.BooleanVar(value=data_alt['audfile'])
try:
self.aud_mdx_var = tk.BooleanVar(value=data['aud_mdx'])
except:
self.aud_mdx_var = tk.BooleanVar(value=data_alt['aud_mdx'])
try:
self.autocompensate_var = tk.BooleanVar(value=data['autocompensate'])
except:
self.autocompensate_var = tk.BooleanVar(value=data_alt['autocompensate'])
try:
self.channel_var = tk.StringVar(value=data['channel'])
except:
self.channel_var = tk.StringVar(value=data_alt['channel'])
try:
self.chunks_d_var = tk.StringVar(value=data['chunks_d'])
except:
self.chunks_d_var = tk.StringVar(value=data_alt['chunks_d'])
try:
self.chunks_var = tk.StringVar(value=data['chunks'])
except:
self.chunks_var = tk.StringVar(value=data_alt['chunks'])
try:
self.compensate_var = tk.StringVar(value=data['compensate'])
except:
self.compensate_var = tk.StringVar(value=data_alt['compensate'])
try:
self.demucs_only_var = tk.BooleanVar(value=data['demucs_only'])
except:
self.demucs_only_var = tk.BooleanVar(value=data_alt['demucs_only'])
try:
self.demucs_stems_var = tk.StringVar(value=data['demucs_stems'])
except:
self.demucs_stems_var = tk.StringVar(value=data_alt['demucs_stems'])
try:
self.DemucsModel_MDX_var = tk.StringVar(value=data['DemucsModel_MDX'])
except:
self.DemucsModel_MDX_var = tk.StringVar(value=data_alt['DemucsModel_MDX'])
try:
self.demucsmodel_sel_VR_var = tk.StringVar(value=data['demucsmodel_sel_VR'])
except:
self.demucsmodel_sel_VR_var = tk.StringVar(value=data_alt['demucsmodel_sel_VR'])
try:
self.demucsmodel_var = tk.BooleanVar(value=data['demucsmodel'])
except:
self.demucsmodel_var = tk.BooleanVar(value=data_alt['demucsmodel'])
try:
self.DemucsModel_var = tk.StringVar(value=data['DemucsModel'])
except:
self.DemucsModel_var = tk.StringVar(value=data_alt['DemucsModel'])
try:
self.demucsmodelVR_var = tk.BooleanVar(value=data['demucsmodelVR'])
except:
self.demucsmodelVR_var = tk.BooleanVar(value=data_alt['demucsmodelVR'])
try:
self.dim_f_var = tk.StringVar(value=data['dim_f'])
except:
self.dim_f_var = tk.StringVar(value=data_alt['dim_f'])
try:
self.ensChoose_var = tk.StringVar(value=data['ensChoose'])
except:
self.ensChoose_var = tk.StringVar(value=data_alt['ensChoose'])
try:
self.exportPath_var = tk.StringVar(value=data['exportPath'])
except:
self.exportPath_var = tk.StringVar(value=data_alt['exportPath'])
try:
self.flactype_var = tk.StringVar(value=data['flactype'])
except:
self.flactype_var = tk.StringVar(value=data_alt['flactype'])
try:
self.gpuConversion_var = tk.BooleanVar(value=data['gpu'])
except:
self.gpuConversion_var = tk.BooleanVar(value=data_alt['gpu'])
try:
self.inputPathop_var = tk.StringVar(value=data['inputPaths'])
except:
self.inputPathop_var = tk.StringVar(value=data_alt['inputPaths'])
try:
self.inputPaths = data['inputPaths']
except:
self.inputPaths = data_alt['inputPaths']
try:
self.inst_only_b_var = tk.BooleanVar(value=data['inst_only_b'])
except:
self.inst_only_b_var = tk.BooleanVar(value=data_alt['inst_only_b'])
try:
self.inst_only_var = tk.BooleanVar(value=data['inst_only'])
except:
self.inst_only_var = tk.BooleanVar(value=data_alt['inst_only'])
try:
self.instrumentalModel_var = tk.StringVar(value=data['modelInstrumentalLabel'])
except:
self.instrumentalModel_var = tk.StringVar(value=data_alt['modelInstrumentalLabel'])
try:
self.margin_var = tk.StringVar(value=data['margin'])
except:
self.margin_var = tk.StringVar(value=data_alt['margin'])
try:
self.mdx_only_ensem_a_var = tk.StringVar(value=data['mdx_only_ensem_a'])
except:
self.mdx_only_ensem_a_var = tk.StringVar(value=data_alt['mdx_only_ensem_a'])
try:
self.mdx_only_ensem_b_var = tk.StringVar(value=data['mdx_only_ensem_b'])
except:
self.mdx_only_ensem_b_var = tk.StringVar(value=data_alt['mdx_only_ensem_b'])
try:
self.mdx_only_ensem_c_var = tk.StringVar(value=data['mdx_only_ensem_c'])
except:
self.mdx_only_ensem_c_var = tk.StringVar(value=data_alt['mdx_only_ensem_c'])
try:
self.mdx_only_ensem_d_var = tk.StringVar(value=data['mdx_only_ensem_d'])
except:
self.mdx_only_ensem_d_var = tk.StringVar(value=data_alt['mdx_only_ensem_d'])
try:
self.mdx_only_ensem_e_var = tk.StringVar(value=data['mdx_only_ensem_e'])
except:
self.mdx_only_ensem_e_var = tk.StringVar(value=data_alt['mdx_only_ensem_e'])
try:
self.mdxensemchoose_b_var = tk.StringVar(value=data['mdx_ensem_b'])
except:
self.mdxensemchoose_b_var = tk.StringVar(value=data_alt['mdx_ensem_b'])
try:
self.mdxensemchoose_var = tk.StringVar(value=data['mdx_ensem'])
except:
self.mdxensemchoose_var = tk.StringVar(value=data_alt['mdx_ensem'])
try:
self.mdxnetModel_var = tk.StringVar(value=data['mdxnetModel'])
except:
self.mdxnetModel_var = tk.StringVar(value=data_alt['mdxnetModel'])
try:
self.mdxnetModeltype_var = tk.StringVar(value=data['mdxnetModeltype'])
except:
self.mdxnetModeltype_var = tk.StringVar(value=data_alt['mdxnetModeltype'])
try:
self.mixing_var = tk.StringVar(value=data['mixing'])
except:
self.mixing_var = tk.StringVar(value=data_alt['mixing'])
try:
self.modeldownload_type_var = tk.StringVar(value=data['modeldownload_type'])
except:
self.modeldownload_type_var = tk.StringVar(value=data_alt['modeldownload_type'])
try:
self.modeldownload_var = tk.StringVar(value=data['modeldownload'])
except:
self.modeldownload_var = tk.StringVar(value=data_alt['modeldownload'])
try:
self.modeldownload_mdx_var = tk.StringVar(value=data['modeldownload_mdx'])
except:
self.modeldownload_mdx_var = tk.StringVar(value=data_alt['modeldownload_mdx'])
try:
self.modeldownload_demucs_var = tk.StringVar(value=data['modeldownload_demucs'])
except:
self.modeldownload_demucs_var = tk.StringVar(value=data_alt['modeldownload_demucs'])
try:
self.modelFolder_var = tk.BooleanVar(value=data['modelFolder'])
except:
self.modelFolder_var = tk.BooleanVar(value=data_alt['modelFolder'])
try:
self.ModelParams_var = tk.StringVar(value=data['ModelParams'])
except:
self.ModelParams_var = tk.StringVar(value=data_alt['ModelParams'])
try:
self.mp3bit_var = tk.StringVar(value=data['mp3bit'])
except:
self.mp3bit_var = tk.StringVar(value=data_alt['mp3bit'])
try:
self.n_fft_scale_var = tk.StringVar(value=data['n_fft_scale'])
except:
self.n_fft_scale_var = tk.StringVar(value=data_alt['n_fft_scale'])
try:
self.noise_pro_select_var = tk.StringVar(value=data['noise_pro_select'])
except:
self.noise_pro_select_var = tk.StringVar(value=data_alt['noise_pro_select'])
try:
self.noisereduc_s_var = tk.StringVar(value=data['noisereduc_s'])
except:
self.noisereduc_s_var = tk.StringVar(value=data_alt['noisereduc_s'])
try:
self.noisereduc_var = tk.BooleanVar(value=data['noise_reduc'])
except:
self.noisereduc_var = tk.BooleanVar(value=data_alt['noise_reduc'])
try:
self.non_red_var = tk.BooleanVar(value=data['non_red'])
except:
self.non_red_var = tk.BooleanVar(value=data_alt['non_red'])
try:
self.nophaseinst_var = tk.BooleanVar(value=data['nophaseinst'])
except:
self.nophaseinst_var = tk.BooleanVar(value=data_alt['nophaseinst'])
try:
self.normalize_var = tk.BooleanVar(value=data['normalize'])
except:
self.normalize_var = tk.BooleanVar(value=data_alt['normalize'])
try:
self.outputImage_var = tk.BooleanVar(value=data['output_image'])
except:
self.outputImage_var = tk.BooleanVar(value=data_alt['output_image'])
try:
self.overlap_b_var = tk.StringVar(value=data['overlap_b'])
except:
self.overlap_b_var = tk.StringVar(value=data_alt['overlap_b'])
try:
self.overlap_var = tk.StringVar(value=data['overlap'])
except:
self.overlap_var = tk.StringVar(value=data_alt['overlap'])
try:
self.postprocessing_var = tk.BooleanVar(value=data['postprocess'])
except:
self.postprocessing_var = tk.BooleanVar(value=data_alt['postprocess'])
try:
self.save_var = tk.BooleanVar(value=data['save'])
except:
self.save_var = tk.BooleanVar(value=data_alt['save'])
try:
self.saveFormat_var = tk.StringVar(value=data['saveFormat'])
except:
self.saveFormat_var = tk.StringVar(value=data_alt['saveFormat'])
try:
self.selectdownload_var = tk.StringVar(value=data['selectdownload'])
except:
self.selectdownload_var = tk.StringVar(value=data_alt['selectdownload'])
try:
self.segment_var = tk.StringVar(value=data['segment'])
except:
self.segment_var = tk.StringVar(value=data_alt['segment'])
try:
self.settest_var = tk.BooleanVar(value=data['settest'])
except:
self.settest_var = tk.BooleanVar(value=data_alt['settest'])
try:
self.shifts_b_var = tk.StringVar(value=data['shifts_b'])
except:
self.shifts_b_var = tk.StringVar(value=data_alt['shifts_b'])
try:
self.shifts_var = tk.StringVar(value=data['shifts'])
except:
self.shifts_var = tk.StringVar(value=data_alt['shifts'])
try:
self.split_mode_var = tk.BooleanVar(value=data['split_mode'])
except:
self.split_mode_var = tk.BooleanVar(value=data_alt['split_mode'])
try:
self.tta_var = tk.BooleanVar(value=data['tta'])
except:
self.tta_var = tk.BooleanVar(value=data_alt['tta'])
try:
self.voc_only_b_var = tk.BooleanVar(value=data['voc_only_b'])
except:
self.voc_only_b_var = tk.BooleanVar(value=data_alt['voc_only_b'])
try:
self.voc_only_var = tk.BooleanVar(value=data['voc_only'])
except:
self.voc_only_var = tk.BooleanVar(value=data_alt['voc_only'])
try:
self.vrensemchoose_a_var = tk.StringVar(value=data['vr_ensem_a'])
except:
self.vrensemchoose_a_var = tk.StringVar(value=data_alt['vr_ensem_a'])
try:
self.vrensemchoose_b_var = tk.StringVar(value=data['vr_ensem_b'])
except:
self.vrensemchoose_b_var = tk.StringVar(value=data_alt['vr_ensem_b'])
try:
self.vrensemchoose_c_var = tk.StringVar(value=data['vr_ensem_c'])
except:
self.vrensemchoose_c_var = tk.StringVar(value=data_alt['vr_ensem_c'])
try:
self.vrensemchoose_d_var = tk.StringVar(value=data['vr_ensem_d'])
except:
self.vrensemchoose_d_var = tk.StringVar(value=data_alt['vr_ensem_d'])
try:
self.vrensemchoose_e_var = tk.StringVar(value=data['vr_ensem_e'])
except:
self.vrensemchoose_e_var = tk.StringVar(value=data_alt['vr_ensem_e'])
try:
self.vr_multi_USER_model_param_1 = tk.StringVar(value=data['vr_multi_USER_model_param_1'])
except:
self.vr_multi_USER_model_param_1 = tk.StringVar(value=data_alt['vr_multi_USER_model_param_1'])
try:
self.vr_multi_USER_model_param_2 = tk.StringVar(value=data['vr_multi_USER_model_param_2'])
except:
self.vr_multi_USER_model_param_2 = tk.StringVar(value=data_alt['vr_multi_USER_model_param_2'])
try:
self.vr_multi_USER_model_param_3 = tk.StringVar(value=data['vr_multi_USER_model_param_3'])
except:
self.vr_multi_USER_model_param_3 = tk.StringVar(value=data_alt['vr_multi_USER_model_param_3'])
try:
self.vr_multi_USER_model_param_4 = tk.StringVar(value=data['vr_multi_USER_model_param_4'])
except:
self.vr_multi_USER_model_param_4 = tk.StringVar(value=data_alt['vr_multi_USER_model_param_4'])
try:
self.vr_basic_USER_model_param_1 = tk.StringVar(value=data['vr_basic_USER_model_param_1'])
except:
self.vr_basic_USER_model_param_1 = tk.StringVar(value=data_alt['vr_basic_USER_model_param_1'])
try:
self.vr_basic_USER_model_param_2 = tk.StringVar(value=data['vr_basic_USER_model_param_2'])
except:
self.vr_basic_USER_model_param_2 = tk.StringVar(value=data_alt['vr_basic_USER_model_param_2'])
try:
self.vr_basic_USER_model_param_3 = tk.StringVar(value=data['vr_basic_USER_model_param_3'])
except:
self.vr_basic_USER_model_param_3 = tk.StringVar(value=data_alt['vr_basic_USER_model_param_3'])
try:
self.vr_basic_USER_model_param_4 = tk.StringVar(value=data['vr_basic_USER_model_param_4'])
except:
self.vr_basic_USER_model_param_4 = tk.StringVar(value=data_alt['vr_basic_USER_model_param_4'])
try:
self.vr_basic_USER_model_param_5 = tk.StringVar(value=data['vr_basic_USER_model_param_5'])
except:
self.vr_basic_USER_model_param_5 = tk.StringVar(value=data_alt['vr_basic_USER_model_param_5'])
try:
self.vrensemchoose_mdx_a_var = tk.StringVar(value=data['vr_ensem_mdx_a'])
except:
self.vrensemchoose_mdx_a_var = tk.StringVar(value=data_alt['vr_ensem_mdx_a'])
try:
self.vrensemchoose_mdx_b_var = tk.StringVar(value=data['vr_ensem_mdx_b'])
except:
self.vrensemchoose_mdx_b_var = tk.StringVar(value=data_alt['vr_ensem_mdx_b'])
try:
self.vrensemchoose_mdx_c_var = tk.StringVar(value=data['vr_ensem_mdx_c'])
except:
self.vrensemchoose_mdx_c_var = tk.StringVar(value=data_alt['vr_ensem_mdx_c'])
try:
self.vrensemchoose_var = tk.StringVar(value=data['vr_ensem'])
except:
self.vrensemchoose_var = tk.StringVar(value=data_alt['vr_ensem'])
try:
self.wavtype_var = tk.StringVar(value=data['wavtype'])
except:
self.wavtype_var = tk.StringVar(value=data_alt['wavtype'])
try:
self.winSize_var = tk.StringVar(value=data['window_size'])
except:
self.winSize_var = tk.StringVar(value=data_alt['window_size'])
try:
self.lastDir = data['lastDir']
except:
self.lastDir = data_alt['lastDir']
self.last_aiModel = self.aiModel_var.get()
self.last_algo = self.aiModel_var.get()
self.last_ensChoose = self.ensChoose_var.get()
self.download_progress_var = tk.StringVar(value='')
self.download_progress_bar_var = tk.StringVar(value='')
self.download_progress_bar_zip_var = tk.IntVar(value=0)
self.download_stop_var = tk.StringVar(value='')
self.progress_var = tk.IntVar(value=0)
self.last_mdxnetModel = self.mdxnetModel_var.get()
self.inputPathsEntry_var = tk.StringVar(value='')
# 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.bind_widgets()
self.place_widgets()
self.update_available_models()
self.update_states()
self.update_loop()
global space_fill_wide
global space_medium_l
global space_medium
global space_small
global space_tiny
global download_code_file
global user_code_file
global download_code_temp_dir
download_code_file = 'lib_v5/filelists/download_codes/user_code_download.txt'
user_code_file = 'lib_v5/filelists/download_codes/user_code.txt'
download_code_temp_dir = 'lib_v5/filelists/download_codes/temp'
space_fill_wide = ' '*32
space_medium_l = ' '*20
space_medium = ' '*17
space_small = ' '*10
space_tiny = ' '*5
# -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='起飞!',
command=self.start_conversion)
self.stop_Button = ttk.Button(master=self,
image=self.stop_img,
command=self.stop_inf)
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')
global current_version
with open('uvr_patch_version.txt', 'r') as file :
current_version = file.read()
def start_target_update():
def target_update():
update_signal_url = "https://raw.githubusercontent.com/TRvlvr/application_data/main/update_patches.txt"
url = update_signal_url
label_set = " "
try:
file = urllib.request.urlopen(url)
for line in file:
patch_name = line.decode("utf-8")
if patch_name == current_version:
self.command_Text.write(f'Ultimate Vocal Remover v5.4.0 [{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}]')
else:
label_set = f"New Update Found: {patch_name}\n\nClick the update button in the \"Settings\" menu to download and install!"
self.command_Text.write(f'Ultimate Vocal Remover v5.4.0 [{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}]\n\n{label_set}')
except:
self.command_Text.write(f'Ultimate Vocal Remover v5.4.0 [{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}]')
rlg = KThread(target=target_update)
rlg.start()
start_target_update()
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='选择输出位置',
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='选择输入文件',
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='选择运算方式', 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='选择主要模式',
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='选择Demucs模型',
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='选择MDX-Net模型', 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='选择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', 'Basic MD Ensemble', 'Manual Ensemble')
# Choose Agorithim
self.options_algo_Label = tk.Label(master=self.options_Frame,
text='选择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='选择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='计算精度', 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')
# Demucs-Segment
self.options_segment_Label = tk.Label(master=self.options_Frame,
text='分段',
background='#0e0e0f', font=self.font, foreground='#13a4c9')
self.options_segment_Optionmenu = ttk.OptionMenu(self.options_Frame,
self.segment_var,
None, 'None', '1', '5', '10', '15', '20',
'25', '30', '35', '40', '45', '50',
'55', '60', '65', '70', '75', '80',
'85', '90', '95', '100')
# Overlap
self.options_overlap_b_Label = tk.Label(master=self.options_Frame,
text='重叠', 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='轮换', 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 运算',
variable=self.gpuConversion_var,
)
# Vocal Only
self.options_voc_only_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
text='仅保留人声',
variable=self.voc_only_var,
)
# Instrumental Only
self.options_inst_only_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
text='仅保留伴奏',
variable=self.inst_only_var,
)
# Vocal Only
self.options_voc_only_b_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
text='仅保留',
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='增强(建议不要点)',
variable=self.tta_var,
)
# MDX-Auto-Chunk
self.options_non_red_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
text='保存Noisey输出',
variable=self.non_red_var,
)
# Demucs Model VR
self.options_postpro_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
text='后期处理',
variable=self.postprocessing_var,
)
# Split Mode
self.options_split_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
text='分离模式',
variable=self.split_mode_var,
)
# -Column 3-
# AGG
self.options_agg_Label = tk.Button(master=self.options_Frame,
text='进阶设置',
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='减少噪音',
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='输出图像',
variable=self.outputImage_var,
)
# MDX-Enable Demucs Model
self.options_demucsmodel_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
text='Demucs模式',
variable=self.demucsmodel_var,
)
# MDX-Noise Reduction
self.options_noisereduc_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
text='降低噪音',
variable=self.noisereduc_var,
)
# Ensemble Save Ensemble Outputs
self.options_save_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
text='保存所有输出文件',
variable=self.save_var,
)
# Model Test Mode
self.options_modelFolder_Checkbutton = ttk.Checkbutton(master=self.options_Frame,
text='模型测试模式',
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)
# Demucs-Segment
self.options_segment_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_segment_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_postpro_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())
self.autocompensate_var.trace_add('write',
lambda *args: self.update_states())
self.compensate_var.trace_add('write',
lambda *args: self.update_states())
self.selectdownload_var.trace_add('write',
lambda *args: self.update_states())
self.modeldownload_var.trace_add('write',
lambda *args: self.update_states())
self.modeldownload_mdx_var.trace_add('write',
lambda *args: self.update_states())
self.modeldownload_demucs_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])
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:
tbs = str(self.inputPathsEntry_var.get())
head, sep, tail = tbs.partition(';')
in_path=os.path.dirname(head)
filename = str(in_path)
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-
global inf
inf = KThread(target=inference.main,
kwargs={
# Paths
'agg': agg,
'algo': self.algo_var.get(),
'appendensem': self.appendensem_var.get(),
'audfile': self.audfile_var.get(),
'aud_mdx': self.aud_mdx_var.get(),
'autocompensate': self.autocompensate_var.get(),
'break': False,
'button_widget_mdx_model_set': self.conversion_Button,
'button_widget': self.conversion_Button,
'channel': self.channel_var.get(),
'chunks': chunks,
'chunks_d': self.chunks_d_var.get(),
'compensate': self.compensate_var.get(),
'demucs_only': self.demucs_only_var.get(),
'demucs_stems': self.demucs_stems_var.get(),
'DemucsModel': self.DemucsModel_var.get(),
'demucsmodel': self.demucsmodel_var.get(),
'DemucsModel_MDX': self.DemucsModel_MDX_var.get(),
'demucsmodel_sel_VR': self.demucsmodel_sel_VR_var.get(),
'demucsmodelVR': self.demucsmodelVR_var.get(),
'dim_f': self.dim_f_var.get(),
'ensChoose': ensChoose,
'export_path': export_path,
'flactype': self.flactype_var.get(),
'gpu': 0 if self.gpuConversion_var.get() else -1,
'input_paths': input_paths,
'inst_menu': self.options_instrumentalModel_Optionmenu,
'inst_only': self.inst_only_var.get(),
'inst_only_b': self.inst_only_b_var.get(),
'instrumentalModel': instrumentalModel_path,
'margin': self.margin_var.get(),
'mdx_ensem': self.mdxensemchoose_var.get(),
'mdx_ensem_b': self.mdxensemchoose_b_var.get(),
'mdx_only_ensem_a': self.mdx_only_ensem_a_var.get(),
'mdx_only_ensem_b': self.mdx_only_ensem_b_var.get(),
'mdx_only_ensem_c': self.mdx_only_ensem_c_var.get(),
'mdx_only_ensem_d': self.mdx_only_ensem_d_var.get(),
'mdx_only_ensem_e': self.mdx_only_ensem_e_var.get(),
'mdxnetModel': mdxnetModel,
'mdxnetModeltype': self.mdxnetModeltype_var.get(),
'mixing': mixing,
'modelFolder': self.modelFolder_var.get(),
'ModelParams': self.ModelParams_var.get(),
'mp3bit': self.mp3bit_var.get(),
'n_fft_scale': self.n_fft_scale_var.get(),
'noise_pro_select': self.noise_pro_select_var.get(),
'noise_reduc': self.noisereduc_var.get(),
'noisereduc_s': noisereduc_s,
'non_red': self.non_red_var.get(),
'nophaseinst': self.nophaseinst_var.get(),
'normalize': self.normalize_var.get(),
'output_image': self.outputImage_var.get(),
'overlap': self.overlap_var.get(),
'overlap_b': self.overlap_b_var.get(),
'postprocess': self.postprocessing_var.get(),
'progress_var': self.progress_var,
'save': self.save_var.get(),
'saveFormat': self.saveFormat_var.get(),
'selectdownload': self.selectdownload_var.get(),
'segment': self.segment_var.get(),
'settest': self.settest_var.get(),
'shifts': self.shifts_var.get(),
'shifts_b': self.shifts_b_var.get(),
'split_mode': self.split_mode_var.get(),
'text_widget': self.command_Text,
'tta': self.tta_var.get(),
'useModel': 'instrumental', # Always instrumental
'voc_only': self.voc_only_var.get(),
'voc_only_b': self.voc_only_b_var.get(),
'vocalModel': '', # Always not needed
'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(),
'vr_multi_USER_model_param_1': self.vr_multi_USER_model_param_1.get(),
'vr_multi_USER_model_param_2': self.vr_multi_USER_model_param_2.get(),
'vr_multi_USER_model_param_3': self.vr_multi_USER_model_param_3.get(),
'vr_multi_USER_model_param_4': self.vr_multi_USER_model_param_4.get(),
'vr_basic_USER_model_param_1': self.vr_basic_USER_model_param_1.get(),
'vr_basic_USER_model_param_2': self.vr_basic_USER_model_param_2.get(),
'vr_basic_USER_model_param_3': self.vr_basic_USER_model_param_3.get(),
'vr_basic_USER_model_param_4': self.vr_basic_USER_model_param_4.get(),
'vr_basic_USER_model_param_5': self.vr_basic_USER_model_param_5.get(),
'wavtype': self.wavtype_var.get(),
'window': self,
'window_size': window_size,
},
daemon=True
)
inf.start()
def stop_inf(self):
confirm = tk.messagebox.askyesno(title='Confirmation',
message='You are about to stop all active processes.\n\nAre you sure you wish to continue?')
# 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
if confirm:
inf.kill()
button_widget = self.conversion_Button
button_widget.configure(state=tk.NORMAL)
text = self.command_Text
text.write('\n\nProcess stopped by user.')
torch.cuda.empty_cache()
importlib.reload(inference_v5)
importlib.reload(inference_v5_ensemble)
importlib.reload(inference_MDX)
importlib.reload(inference_demucs)
self.progress_var.set(0)
else:
pass
# 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_DemucsModels_dir = os.path.join(instrumentalModels_dir, 'Demucs_Models')
new_DemucsModels = os.listdir(temp_DemucsModels_dir)
temp_MDXModels_dir = os.path.join(instrumentalModels_dir, 'MDX_Net_Models') # nopep8
new_MDXModels = os.listdir(temp_MDXModels_dir)
newmodels = [new_DemucsModels, new_MDXModels]
temp_instrumentalModels_dir = os.path.join(instrumentalModels_dir, 'Main_Models') # nopep8
new_InstrumentalModels = os.listdir(temp_instrumentalModels_dir)
if new_InstrumentalModels != self.lastInstrumentalModels_ensem:
with open('lib_v5/filelists/ensemble_list/vr_en_list.txt', 'w') as f:
f.write('No Model\nNo Model\n')
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)
if new_InstrumentalModels != self.lastInstrumentalModels_ensem:
for file_name_vr in natsort.natsorted(new_InstrumentalModels):
if file_name_vr.endswith(".pth"):
b = [".pth"]
for char in b:
file_name_vr = file_name_vr.replace(char, "")
vr_list_en = file_name_vr
with open('lib_v5/filelists/ensemble_list/vr_en_list.txt', 'a') as f:
f.write("{}\n".format(vr_list_en))
self.lastInstrumentalModels_ensem = new_InstrumentalModels
"""
Loop through every MDX-Net model (.onnx) in the models directory
and add to the select your model list
"""
if newmodels != self.lastmdx_demuc_ensem:
with open('lib_v5/filelists/ensemble_list/mdx_demuc_en_list.txt', 'w') as f:
f.write('No Model\nNo Model\n')
if new_MDXModels != self.lastMDXModels or newmodels != self.lastmdx_demuc_ensem:
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")
j = ["UVR_MDXNET_Main"]
for char in j:
file_name_1 = file_name_1.replace(char, "UVR-MDX-NET Main")
self.options_mdxnetModel_Optionmenu['menu'].add_radiobutton(label=file_name_1,
command=tk._setit(self.mdxnetModel_var, file_name_1))
mdx_list_en = file_name_1
self.ensemfiles = mdx_list_en
with open('lib_v5/filelists/ensemble_list/mdx_demuc_en_list.txt', 'a') as f:
f.write("MDX-Net: {}\n".format(mdx_list_en))
self.lastMDXModels = new_MDXModels
"""
Loop through every Demucs model (.th, .pth) in the models directory
and add to the select your model list
"""
try:
if new_DemucsModels != self.lastDemucsModels or newmodels != self.lastmdx_demuc_ensem:
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', '.ckpt', '.gz', 'tasnet-beb46fac.th', 'tasnet_extra-df3777b2.th',
'demucs48_hq-28a1282c.th', 'demucs-e07c671f.th', 'demucs_extra-3646af93.th', 'demucs_unittest-09ebc15f.th',
'tasnet.th', 'tasnet_extra.th', 'demucs.th', 'demucs_extra.th', 'light.th', 'light_extra.th')):
#Demucs v3 Models
b = [".yaml"]
for char in b:
file_name_2 = file_name_2.replace(char, "")
#Demucs v2 Models
c = ["tasnet-beb46fac.th"]
for char in c:
file_name_2 = file_name_2.replace(char, "Tasnet v2")
d = ["tasnet_extra-df3777b2.th"]
for char in d:
file_name_2 = file_name_2.replace(char, "Tasnet_extra v2")
e = ["demucs48_hq-28a1282c.th"]
for char in e:
file_name_2 = file_name_2.replace(char, "Demucs48_hq v2")
f = ["demucs-e07c671f.th"]
for char in f:
file_name_2 = file_name_2.replace(char, "Demucs v2")
g = ["demucs_extra-3646af93.th"]
for char in g:
file_name_2 = file_name_2.replace(char, "Demucs_extra v2")
n = ["demucs_unittest-09ebc15f.th"]
for char in n:
file_name_2 = file_name_2.replace(char, "Demucs_unittest v2")
#Demucs v1 Models
h = ["tasnet.th"]
for char in h:
file_name_2 = file_name_2.replace(char, "Tasnet v1")
i = ["tasnet_extra.th"]
for char in i:
file_name_2 = file_name_2.replace(char, "Tasnet_extra v1")
j = ["demucs.th"]
for char in j:
file_name_2 = file_name_2.replace(char, "Demucs v1")
k = ["demucs_extra.th"]
for char in k:
file_name_2 = file_name_2.replace(char, "Demucs_extra v1")
l = ["light.th"]
for char in l:
file_name_2 = file_name_2.replace(char, "Light v1")
m = ["light_extra.th"]
for char in m:
file_name_2 = file_name_2.replace(char, "Light_extra v1")
self.options_DemucsModel_Optionmenu['menu'].add_radiobutton(label=file_name_2,
command=tk._setit(self.DemucsModel_var, file_name_2))
demucs_list_en = file_name_2
with open('lib_v5/filelists/ensemble_list/mdx_demuc_en_list.txt', 'a') as f:
f.writelines("Demucs: {}\n".format(demucs_list_en))
self.lastDemucsModels = new_DemucsModels
except:
pass
try:
if new_DemucsModels != self.lastDemucsModels or newmodels != self.lastmdx_demuc_ensem:
#print(new_MDXModels)
self.DemucsLabel_to_path.clear()
self.options_DemucsModel_MDX_Optionmenu['menu'].delete(0, 'end')
for file_name_3 in natsort.natsorted(new_DemucsModels):
if file_name_3.endswith(('.yaml', '.ckpt', '.gz', 'tasnet-beb46fac.th', 'tasnet_extra-df3777b2.th',
'demucs48_hq-28a1282c.th', 'demucs-e07c671f.th', 'demucs_extra-3646af93.th', 'demucs_unittest-09ebc15f.th',
'tasnet.th', 'tasnet_extra.th', 'demucs.th', 'demucs_extra.th', 'light.th', 'light_extra.th')):
#Demucs v3 Models
b = [".yaml"]
for char in b:
file_name_3 = file_name_3.replace(char, "")
#Demucs v2 Models
c = ["tasnet-beb46fac.th"]
for char in c:
file_name_3 = file_name_3.replace(char, "Tasnet v2")
d = ["tasnet_extra-df3777b2.th"]
for char in d:
file_name_3 = file_name_3.replace(char, "Tasnet_extra v2")
e = ["demucs48_hq-28a1282c.th"]
for char in e:
file_name_3 = file_name_3.replace(char, "Demucs48_hq v2")
f = ["demucs-e07c671f.th"]
for char in f:
file_name_3 = file_name_3.replace(char, "Demucs v2")
g = ["demucs_extra-3646af93.th"]
for char in g:
file_name_3 = file_name_3.replace(char, "Demucs_extra v2")
n = ["demucs_unittest-09ebc15f.th"]
for char in n:
file_name_3 = file_name_3.replace(char, "Demucs_unittest v2")
#Demucs v1 Models
h = ["tasnet.th"]
for char in h:
file_name_3 = file_name_3.replace(char, "Tasnet v1")
i = ["tasnet_extra.th"]
for char in i:
file_name_3 = file_name_3.replace(char, "Tasnet_extra v1")
j = ["demucs.th"]
for char in j:
file_name_3 = file_name_3.replace(char, "Demucs v1")
k = ["demucs_extra.th"]
for char in k:
file_name_3 = file_name_3.replace(char, "Demucs_extra v1")
l = ["light.th"]
for char in l:
file_name_3 = file_name_3.replace(char, "Light v1")
m = ["light_extra.th"]
for char in m:
file_name_3 = file_name_3.replace(char, "Light_extra v1")
self.options_DemucsModel_MDX_Optionmenu['menu'].add_radiobutton(label=file_name_3,
command=tk._setit(self.DemucsModel_MDX_var, file_name_3))
self.lastDemucsModels = new_DemucsModels
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:
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
try:
temp_ModelParams_dir = 'lib_v5\modelparams' # nopep8
new_ModelParams = os.listdir(temp_ModelParams_dir)
if new_ModelParams != self.lastModelParams_ens:
self.ModelParamsLabel_ens_to_path.clear()
self.options_ModelParams_a_Optionmenu['menu'].delete(0, 'end')
self.options_ModelParams_b_Optionmenu['menu'].delete(0, 'end')
self.options_ModelParams_c_Optionmenu['menu'].delete(0, 'end')
self.options_ModelParams_d_Optionmenu['menu'].delete(0, 'end')
self.options_ModelParams_1_Optionmenu['menu'].delete(0, 'end')
self.options_ModelParams_2_Optionmenu['menu'].delete(0, 'end')
self.options_ModelParams_3_Optionmenu['menu'].delete(0, 'end')
self.options_ModelParams_4_Optionmenu['menu'].delete(0, 'end')
self.options_ModelParams_5_Optionmenu['menu'].delete(0, 'end')
for file_name_3 in natsort.natsorted(new_ModelParams):
if file_name_3.endswith(('.json', 'Auto')):
self.options_ModelParams_a_Optionmenu['menu'].add_radiobutton(label=file_name_3,
command=tk._setit(self.vr_multi_USER_model_param_1, file_name_3))
self.options_ModelParams_b_Optionmenu['menu'].add_radiobutton(label=file_name_3,
command=tk._setit(self.vr_multi_USER_model_param_2, file_name_3))
self.options_ModelParams_c_Optionmenu['menu'].add_radiobutton(label=file_name_3,
command=tk._setit(self.vr_multi_USER_model_param_3, file_name_3))
self.options_ModelParams_d_Optionmenu['menu'].add_radiobutton(label=file_name_3,
command=tk._setit(self.vr_multi_USER_model_param_4, file_name_3))
self.options_ModelParams_1_Optionmenu['menu'].add_radiobutton(label=file_name_3,
command=tk._setit(self.vr_basic_USER_model_param_1, file_name_3))
self.options_ModelParams_2_Optionmenu['menu'].add_radiobutton(label=file_name_3,
command=tk._setit(self.vr_basic_USER_model_param_2, file_name_3))
self.options_ModelParams_3_Optionmenu['menu'].add_radiobutton(label=file_name_3,
command=tk._setit(self.vr_basic_USER_model_param_3, file_name_3))
self.options_ModelParams_4_Optionmenu['menu'].add_radiobutton(label=file_name_3,
command=tk._setit(self.vr_basic_USER_model_param_4, file_name_3))
self.options_ModelParams_5_Optionmenu['menu'].add_radiobutton(label=file_name_3,
command=tk._setit(self.vr_basic_USER_model_param_5, file_name_3))
self.lastModelParams_ens = new_ModelParams
except:
pass
self.lastmdx_demuc_ensem = [new_DemucsModels, new_MDXModels]
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_agg_Label.place_forget()
self.options_agg_Optionmenu.place_forget()
self.options_algo_Label.place_forget()
self.options_algo_Optionmenu.place_forget()
self.options_demucs_stems_Label.place_forget()
self.options_demucs_stems_Optionmenu.place_forget()
self.options_DemucsModel_Label.place_forget()
self.options_DemucsModel_Optionmenu.place_forget()
self.options_ensChoose_Label.place_forget()
self.options_ensChoose_Optionmenu.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_instrumentalModel_Label.place_forget()
self.options_instrumentalModel_Optionmenu.place_forget()
self.options_overlap_b_Label.place_forget()
self.options_overlap_b_Optionmenu.place_forget()
self.options_postpro_Checkbutton.configure(state=tk.DISABLED)
self.options_postpro_Checkbutton.place_forget()
self.options_save_Checkbutton.configure(state=tk.DISABLED)
self.options_save_Checkbutton.place_forget()
self.options_segment_Label.place_forget()
self.options_segment_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()
self.options_tta_Checkbutton.configure(state=tk.DISABLED)
self.options_tta_Checkbutton.place_forget()
self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED)
self.options_voc_only_b_Checkbutton.place_forget()
self.options_winSize_Label.place_forget()
self.options_winSize_Optionmenu.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_postpro_Checkbutton.configure(state=tk.NORMAL)
self.options_postpro_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_algo_Label.place_forget()
self.options_algo_Optionmenu.place_forget()
self.options_chunks_Label.place_forget()
self.options_chunks_Optionmenu.place_forget()
self.options_demucs_stems_Label.place_forget()
self.options_demucs_stems_Optionmenu.place_forget()
self.options_demucsmodel_Checkbutton.configure(state=tk.DISABLED)
self.options_demucsmodel_Checkbutton.place_forget()
self.options_DemucsModel_Label.place_forget()
self.options_DemucsModel_Optionmenu.place_forget()
self.options_ensChoose_Label.place_forget()
self.options_ensChoose_Optionmenu.place_forget()
self.options_inst_only_b_Checkbutton.configure(state=tk.DISABLED)
self.options_inst_only_b_Checkbutton.place_forget()
self.options_mdxnetModel_Label.place_forget()
self.options_mdxnetModel_Optionmenu.place_forget()
self.options_noisereduc_Checkbutton.configure(state=tk.DISABLED)
self.options_noisereduc_Checkbutton.place_forget()
self.options_noisereduc_s_Label.place_forget()
self.options_noisereduc_s_Optionmenu.place_forget()
self.options_non_red_Checkbutton.configure(state=tk.DISABLED)
self.options_non_red_Checkbutton.configure(state=tk.DISABLED)
self.options_non_red_Checkbutton.place_forget()
self.options_non_red_Checkbutton.place_forget()
self.options_overlap_b_Label.place_forget()
self.options_overlap_b_Optionmenu.place_forget()
self.options_save_Checkbutton.configure(state=tk.DISABLED)
self.options_save_Checkbutton.place_forget()
self.options_segment_Label.place_forget()
self.options_segment_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()
self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED)
self.options_voc_only_b_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)
# Segment
self.options_segment_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_segment_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)
#Split Mode
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_image_Checkbutton.configure(state=tk.DISABLED)
# self.options_image_Checkbutton.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_chunks_Label.place_forget()
self.options_chunks_Optionmenu.place_forget()
self.options_demucsmodel_Checkbutton.configure(state=tk.DISABLED)
self.options_demucsmodel_Checkbutton.place_forget()
self.options_ensChoose_Label.place_forget()
self.options_ensChoose_Optionmenu.place_forget()
self.options_inst_only_Checkbutton.configure(state=tk.DISABLED)
self.options_inst_only_Checkbutton.place_forget()
self.options_instrumentalModel_Label.place_forget()
self.options_instrumentalModel_Optionmenu.place_forget()
self.options_mdxnetModel_Label.place_forget()
self.options_mdxnetModel_Optionmenu.place_forget()
self.options_modelFolder_Checkbutton.place_forget()
self.options_noisereduc_Checkbutton.configure(state=tk.DISABLED)
self.options_noisereduc_Checkbutton.place_forget()
self.options_noisereduc_s_Label.place_forget()
self.options_noisereduc_s_Optionmenu.place_forget()
self.options_non_red_Checkbutton.configure(state=tk.DISABLED)
self.options_non_red_Checkbutton.place_forget()
self.options_postpro_Checkbutton.configure(state=tk.DISABLED)
self.options_postpro_Checkbutton.place_forget()
self.options_save_Checkbutton.configure(state=tk.DISABLED)
self.options_save_Checkbutton.place_forget()
self.options_tta_Checkbutton.configure(state=tk.DISABLED)
self.options_tta_Checkbutton.place_forget()
self.options_voc_only_Checkbutton.configure(state=tk.DISABLED)
self.options_voc_only_Checkbutton.place_forget()
self.options_winSize_Label.place_forget()
self.options_winSize_Optionmenu.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_image_Checkbutton.configure(state=tk.DISABLED)
# self.options_image_Checkbutton.place_forget()
self.options_agg_Label.place_forget()
self.options_agg_Optionmenu.place_forget()
self.options_chunks_Label.place_forget()
self.options_chunks_Optionmenu.place_forget()
self.options_demucs_stems_Label.place_forget()
self.options_demucs_stems_Optionmenu.place_forget()
self.options_demucsmodel_Checkbutton.configure(state=tk.DISABLED)
self.options_demucsmodel_Checkbutton.place_forget()
self.options_DemucsModel_Label.place_forget()
self.options_DemucsModel_Optionmenu.place_forget()
self.options_gpu_Checkbutton.configure(state=tk.DISABLED)
self.options_gpu_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_inst_only_Checkbutton.configure(state=tk.DISABLED)
self.options_inst_only_Checkbutton.place_forget()
self.options_mdxnetModel_Label.place_forget()
self.options_mdxnetModel_Optionmenu.place_forget()
self.options_modelFolder_Checkbutton.configure(state=tk.DISABLED)
self.options_modelFolder_Checkbutton.place_forget()
self.options_noisereduc_Checkbutton.configure(state=tk.DISABLED)
self.options_noisereduc_Checkbutton.place_forget()
self.options_noisereduc_s_Label.place_forget()
self.options_noisereduc_s_Optionmenu.place_forget()
self.options_non_red_Checkbutton.configure(state=tk.DISABLED)
self.options_non_red_Checkbutton.place_forget()
self.options_overlap_b_Label.place_forget()
self.options_overlap_b_Optionmenu.place_forget()
self.options_postpro_Checkbutton.configure(state=tk.DISABLED)
self.options_postpro_Checkbutton.place_forget()
self.options_save_Checkbutton.configure(state=tk.DISABLED)
self.options_save_Checkbutton.place_forget()
self.options_segment_Label.place_forget()
self.options_segment_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()
self.options_tta_Checkbutton.configure(state=tk.DISABLED)
self.options_tta_Checkbutton.place_forget()
self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED)
self.options_voc_only_b_Checkbutton.place_forget()
self.options_voc_only_Checkbutton.configure(state=tk.DISABLED)
self.options_voc_only_Checkbutton.place_forget()
self.options_winSize_Label.place_forget()
self.options_winSize_Optionmenu.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_image_Checkbutton.configure(state=tk.DISABLED)
# self.options_image_Checkbutton.place_forget()
self.options_algo_Label.place_forget()
self.options_algo_Optionmenu.place_forget()
self.options_demucs_stems_Label.place_forget()
self.options_demucs_stems_Optionmenu.place_forget()
self.options_DemucsModel_Label.place_forget()
self.options_DemucsModel_Optionmenu.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_modelFolder_Checkbutton.configure(state=tk.DISABLED)
self.options_modelFolder_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_overlap_b_Label.place_forget()
self.options_overlap_b_Optionmenu.place_forget()
self.options_postpro_Checkbutton.configure(state=tk.DISABLED)
self.options_postpro_Checkbutton.place_forget()
self.options_segment_Label.place_forget()
self.options_segment_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()
self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED)
self.options_voc_only_b_Checkbutton.place_forget()
elif self.ensChoose_var.get() == 'Basic MD 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)
#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)
# Split Mode
self.options_split_Checkbutton.configure(state=tk.NORMAL)
self.options_split_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)
#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_image_Checkbutton.configure(state=tk.DISABLED)
# self.options_image_Checkbutton.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_demucs_stems_Label.place_forget()
self.options_demucs_stems_Optionmenu.place_forget()
self.options_DemucsModel_Label.place_forget()
self.options_DemucsModel_Optionmenu.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_instrumentalModel_Label.place_forget()
self.options_instrumentalModel_Optionmenu.place_forget()
self.options_mdxnetModel_Label.place_forget()
self.options_mdxnetModel_Optionmenu.place_forget()
self.options_modelFolder_Checkbutton.configure(state=tk.DISABLED)
self.options_modelFolder_Checkbutton.place_forget()
self.options_non_red_Checkbutton.configure(state=tk.DISABLED)
self.options_non_red_Checkbutton.place_forget()
self.options_overlap_b_Label.place_forget()
self.options_overlap_b_Optionmenu.place_forget()
self.options_postpro_Checkbutton.configure(state=tk.DISABLED)
self.options_postpro_Checkbutton.place_forget()
self.options_segment_Label.place_forget()
self.options_segment_Optionmenu.place_forget()
self.options_shifts_b_Label.place_forget()
self.options_shifts_b_Optionmenu.place_forget()
self.options_tta_Checkbutton.configure(state=tk.DISABLED)
self.options_tta_Checkbutton.place_forget()
self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED)
self.options_voc_only_b_Checkbutton.place_forget()
self.options_winSize_Label.place_forget()
self.options_winSize_Optionmenu.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_postpro_Checkbutton.configure(state=tk.NORMAL)
self.options_postpro_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_chunks_Label.place_forget()
self.options_chunks_Optionmenu.place_forget()
self.options_demucs_stems_Label.place_forget()
self.options_demucs_stems_Optionmenu.place_forget()
self.options_demucsmodel_Checkbutton.configure(state=tk.DISABLED)
self.options_demucsmodel_Checkbutton.place_forget()
self.options_DemucsModel_Label.place_forget()
self.options_DemucsModel_Optionmenu.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_instrumentalModel_Label.place_forget()
self.options_mdxnetModel_Label.place_forget()
self.options_mdxnetModel_Optionmenu.place_forget()
self.options_modelFolder_Checkbutton.configure(state=tk.DISABLED)
self.options_modelFolder_Checkbutton.place_forget()
self.options_noisereduc_Checkbutton.configure(state=tk.DISABLED)
self.options_noisereduc_Checkbutton.place_forget()
self.options_noisereduc_s_Label.place_forget()
self.options_noisereduc_s_Optionmenu.place_forget()
self.options_non_red_Checkbutton.configure(state=tk.DISABLED)
self.options_non_red_Checkbutton.place_forget()
self.options_overlap_b_Label.place_forget()
self.options_overlap_b_Optionmenu.place_forget()
self.options_segment_Label.place_forget()
self.options_segment_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()
self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED)
self.options_voc_only_b_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.autocompensate_var.get() == True:
try:
self.options_compensate.configure(state=tk.DISABLED)
except:
pass
if self.autocompensate_var.get() == False:
#self.compensate_var.set()
try:
self.options_compensate.configure(state=tk.NORMAL)
except:
pass
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.selectdownload_var.get() == 'VR Arc':
#self.modeldownload_var.clear()
self.modeldownload_mdx_var.set('No Model Selected')
self.modeldownload_demucs_var.set('No Model Selected')
try:
self.downloadmodelOptions.configure(state=tk.NORMAL)
self.downloadmodelOptions_mdx.configure(state=tk.DISABLED)
self.downloadmodelOptions_demucs.configure(state=tk.DISABLED)
except:
pass
if self.selectdownload_var.get() == 'MDX-Net':
#self.modeldownload_mdx_var.set('Full Model Pack')
self.modeldownload_var.set('No Model Selected')
self.modeldownload_demucs_var.set('No Model Selected')
try:
self.downloadmodelOptions.configure(state=tk.DISABLED)
self.downloadmodelOptions_demucs.configure(state=tk.DISABLED)
self.downloadmodelOptions_mdx.configure(state=tk.NORMAL)
except:
pass
if self.selectdownload_var.get() == 'Demucs':
#self.modeldownload_demucs_var.set('Demucs v3: mdx')
self.modeldownload_var.set('No Model Selected')
self.modeldownload_mdx_var.set('No Model Selected')
try:
self.downloadmodelOptions_demucs.configure(state=tk.NORMAL)
self.downloadmodelOptions.configure(state=tk.DISABLED)
self.downloadmodelOptions_mdx.configure(state=tk.DISABLED)
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:
self.settings()
pass
def shutdown(self):
"""
Shuts down the application after asking for confirmation
"""
exit()
def open_newModel_filedialog(self):
"""Let user paste an MDX-Net model to use for the vocal Separation"""
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 delete_temps(self):
try:
for basename in os.listdir(download_code_temp_dir):
if basename.endswith('.aes'):
pathname = os.path.join(download_code_temp_dir, basename)
if os.path.isfile(pathname):
os.remove(pathname)
except:
pass
try:
for basename in os.listdir(download_code_temp_dir):
if basename.endswith('.txt'):
pathname = os.path.join(download_code_temp_dir, basename)
if os.path.isfile(pathname):
os.remove(pathname)
except:
pass
try:
srcdir = "models/Demucs_Models"
for basename in os.listdir(srcdir):
if basename.endswith('.tmp'):
pathname = os.path.join(srcdir, basename)
if os.path.isfile(pathname):
os.remove(pathname)
except:
pass
try:
srcdir = "models/Demucs_Models/v3_repo"
for basename in os.listdir(srcdir):
if basename.endswith('.tmp'):
pathname = os.path.join(srcdir, basename)
if os.path.isfile(pathname):
os.remove(pathname)
except:
pass
try:
srcdir = "models/Main_Models"
for basename in os.listdir(srcdir):
if basename.endswith('.tmp'):
pathname = os.path.join(srcdir, basename)
if os.path.isfile(pathname):
os.remove(pathname)
except:
pass
try:
srcdir = "models/MDX_Net_Models"
for basename in os.listdir(srcdir):
if basename.endswith('.tmp'):
pathname = os.path.join(srcdir, basename)
if os.path.isfile(pathname):
os.remove(pathname)
except:
pass
try:
srcdir = os.path.dirname(os.path.realpath(__file__))
for basename in os.listdir(srcdir):
if basename.endswith('.tmp'):
pathname = os.path.join(srcdir, basename)
if os.path.isfile(pathname):
os.remove(pathname)
except:
pass
def reset_to_defaults(self):
self.agg_var.set(10)
self.algo_var.set('Instrumentals (Min Spec)')
self.appendensem_var.set(False)
self.audfile_var.set(True)
self.aud_mdx_var.set(True),
self.autocompensate_var.set(True)
self.channel_var.set(64)
self.chunks_var.set('Auto')
self.chunks_d_var.set('Full')
self.compensate_var.set(1.03597672895)
self.demucs_only_var.set(False)
self.demucs_stems_var.set('All Stems')
self.DemucsModel_var.set('mdx_extra')
self.demucsmodel_var.set(False)
self.DemucsModel_MDX_var.set('UVR_Demucs_Model_1')
self.demucsmodel_sel_VR_var.set('UVR_Demucs_Model_1')
self.demucsmodelVR_var.set(False)
self.dim_f_var.set(2048)
self.flactype_var.set('PCM_16')
self.gpuConversion_var.set(False)
self.inst_only_var.set(False)
self.inst_only_b_var.set(False)
self.margin_var.set(44100)
self.mdxensemchoose_var.set('MDX-Net: UVR-MDX-NET Main')
self.mdxensemchoose_b_var.set('No Model')
self.mdx_only_ensem_a_var.set('MDX-Net: UVR-MDX-NET Main')
self.mdx_only_ensem_b_var.set('MDX-Net: UVR-MDX-NET 1')
self.mdx_only_ensem_c_var.set('No Model')
self.mdx_only_ensem_d_var.set('No Model')
self.mdx_only_ensem_e_var.set('No Model')
self.mdxnetModel_var.set('UVR-MDX-NET Main')
self.mdxnetModeltype_var.set('Vocals (Custom)')
self.mixing_var.set('Default')
self.modelFolder_var.set(False)
self.instrumentalModel_var.set('')
self.ModelParams_var.set('Auto')
self.mp3bit_var.set('320k')
self.n_fft_scale_var.set(6144)
self.noise_pro_select_var.set('Auto Select')
self.noisereduc_var.set(True)
self.noisereduc_s_var.set(3)
self.non_red_var.set(False)
self.nophaseinst_var.set(False)
self.normalize_var.set(False)
self.outputImage_var.set(False)
self.overlap_var.set(0.25)
self.overlap_b_var.set(0.25)
self.postprocessing_var.set(False)
self.save_var.set(True)
self.saveFormat_var.set('Wav')
self.segment_var.set(None)
self.settest_var.set(False)
self.shifts_var.set(2)
self.shifts_b_var.set(2)
self.split_mode_var.set(True)
self.tta_var.set(False)
self.voc_only_var.set(False)
self.voc_only_b_var.set(False)
self.vrensemchoose_var.set('2_HP-UVR')
self.vrensemchoose_a_var.set('1_HP-UVR')
self.vrensemchoose_b_var.set('2_HP-UVR')
self.vrensemchoose_c_var.set('No Model')
self.vrensemchoose_d_var.set('No Model')
self.vrensemchoose_e_var.set('No Model')
self.vrensemchoose_mdx_a_var.set('No Model')
self.vrensemchoose_mdx_b_var.set('No Model')
self.vrensemchoose_mdx_c_var.set('No Model')
self.vr_multi_USER_model_param_1.set('Auto')
self.vr_multi_USER_model_param_2.set('Auto')
self.vr_multi_USER_model_param_3.set('Auto')
self.vr_multi_USER_model_param_4.set('Auto')
self.vr_basic_USER_model_param_1.set('Auto')
self.vr_basic_USER_model_param_2.set('Auto')
self.vr_basic_USER_model_param_3.set('Auto')
self.vr_basic_USER_model_param_4.set('Auto')
self.vr_basic_USER_model_param_5.set('Auto')
self.wavtype_var.set('PCM_16')
self.winSize_var.set('512')
def advanced_vr_options(self):
"""
Open Advanced VR Options
"""
top=Toplevel(self)
window_height = 630
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))
top.attributes("-topmost", True)
# 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)
tabControl.add(tab1, text ='高级设置')
tabControl.add(tab2, text ='Demucs设置')
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)
frame0=Frame(tab1, highlightbackground='red',highlightthicknes=0)
frame0.grid(row=0,column=0,padx=0,pady=30)
l0=tk.Label(frame0,text="高级VR选项",font=("Century Gothic", "13", "underline"), justify="center", fg="#13a4c9")
l0.grid(row=0,column=0,padx=0,pady=10)
l0=tk.Label(frame0, text='窗口尺寸 (手动设置)', 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='进阶设置 (手动设置)', 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=0)
l0=ttk.Checkbutton(frame0, text='Demucs Model', variable=self.demucsmodelVR_var)
l0.grid(row=9,column=0,padx=0,pady=0)
def clear_cache():
cachedir = "lib_v5/filelists/model_cache/vr_param_cache"
for basename in os.listdir(cachedir):
if basename.endswith('.txt'):
pathname = os.path.join(cachedir, basename)
if os.path.isfile(pathname):
os.remove(pathname)
l0=ttk.Button(frame0,text='Clear Auto-Set Cache', command=clear_cache)
l0.grid(row=10,column=0,padx=0,pady=5)
l0=ttk.Button(frame0,text='Open VR Models Folder', command=self.open_Modelfolder_vr)
l0.grid(row=11,column=0,padx=0,pady=5)
l0=ttk.Button(frame0,text='Back to Main Menu', command=close_win)
l0.grid(row=12,column=0,padx=0,pady=5)
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=5)
self.ModelParamsLabel_to_path = defaultdict(lambda: '')
self.lastModelParams = []
frame0=Frame(tab2, highlightbackground='red',highlightthicknes=0)
frame0.grid(row=0,column=0,padx=0,pady=30)
l0=tk.Label(frame0,text='Demucs Model',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9')
l0.grid(row=1,column=0,padx=0,pady=5)
l0=ttk.OptionMenu(frame0, self.demucsmodel_sel_VR_var, None, 'UVR_Demucs_Model_1', 'UVR_Demucs_Model_2', 'UVR_Demucs_Model_Bag')
l0.grid(row=2,column=0,padx=0,pady=5)
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=3,column=0,padx=0,pady=5)
l0=ttk.Entry(frame0, textvariable=self.shifts_var, justify='center')
l0.grid(row=4,column=0,padx=0,pady=5)
l0=tk.Label(frame0, text='Overlap', font=("Century Gothic", "9"), foreground='#13a4c9')
l0.grid(row=5,column=0,padx=0,pady=5)
l0=ttk.Entry(frame0, textvariable=self.overlap_var, justify='center')
l0.grid(row=6,column=0,padx=0,pady=5)
l0=tk.Label(frame0, text='Segment', font=("Century Gothic", "9"), foreground='#13a4c9')
l0.grid(row=7,column=0,padx=0,pady=5)
l0=ttk.Entry(frame0, textvariable=self.segment_var, justify='center')
l0.grid(row=8,column=0,padx=0,pady=5)
l0=ttk.Checkbutton(frame0, text='Split Mode', variable=self.split_mode_var)
l0.grid(row=9,column=0,padx=0,pady=5)
self.update_states()
def advanced_demucs_options(self):
"""
Open Advanced Demucs Options
"""
top= Toplevel(self)
window_height = 750
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))
top.attributes("-topmost", True)
# 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 ='高级设置')
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=tk.Label(frame0,text="Advanced Demucs Options",font=("Century Gothic", "13", "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_d_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=tk.Label(frame0, text='Segment', font=("Century Gothic", "9"), foreground='#13a4c9')
l0.grid(row=9,column=0,padx=0,pady=10)
l0=ttk.Entry(frame0, textvariable=self.segment_var, justify='center')
l0.grid(row=10,column=0,padx=0,pady=0)
l0=ttk.Checkbutton(frame0, text='Save Stems to Model & Track Name Directory', variable=self.audfile_var)
l0.grid(row=11,column=0,padx=0,pady=5)
l0=ttk.Button(frame0,text='Open Demucs Model Folder', command=self.open_Modelfolder_de)
l0.grid(row=12,column=0,padx=0,pady=0)
l0=ttk.Button(frame0,text='Back to Main Menu', command=close_win)
l0.grid(row=13,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=14,column=0,padx=0,pady=0)
def advanced_mdx_options(self):
"""
Open Advanced MDX Options
"""
top= Toplevel(self)
window_height = 740
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))
top.attributes("-topmost", True)
# 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 ='高级设置')
tabControl.add(tab2, text ='Demucs设置')
tabControl.add(tab3, text ='高级ONNX模型设置')
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=tk.Label(frame0,text="Advanced MDX-Net Options",font=("Century Gothic", "13", "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)
self.options_compensate = l0=ttk.Entry(frame0, textvariable=self.compensate_var, justify='center')
self.options_compensate
l0.grid(row=8,column=0,padx=0,pady=0)
l0=ttk.Checkbutton(frame0, text='Autoset Volume Compensation', variable=self.autocompensate_var)
l0.grid(row=9,column=0,padx=0,pady=5)
l0=ttk.Checkbutton(frame0, text='Reduce Instrumental Noise Separately', variable=self.nophaseinst_var)
l0.grid(row=10,column=0,padx=0,pady=0)
l0=tk.Label(frame0, text='Noise Profile', font=("Century Gothic", "9"), foreground='#13a4c9')
l0.grid(row=11,column=0,padx=0,pady=5)
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=12,column=0,padx=0,pady=0)
l0=ttk.Button(frame0,text='Open MDX-Net Models Folder', command=self.open_newModel_filedialog)
l0.grid(row=13,column=0,padx=0,pady=10)
l0=ttk.Button(frame0,text='Back to Main Menu', command=close_win)
l0.grid(row=14,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=15,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=f'{space_small}Stem Type{space_small}', 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 (Custom)', 'Instrumental (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)
l0=ttk.Checkbutton(frame0, text='Auto-Set', variable=self.aud_mdx_var)
l0.grid(row=7,column=0,padx=0,pady=10)
def clear_cache():
cachedir = "lib_v5/filelists/hashes/mdx_model_cache"
for basename in os.listdir(cachedir):
if basename.endswith('.json'):
pathname = os.path.join(cachedir, basename)
if os.path.isfile(pathname):
os.remove(pathname)
l0=ttk.Button(frame0, text='Clear Auto-Set Cache', command=clear_cache)
l0.grid(row=8,column=0,padx=0,pady=10)
self.DemucsLabel_to_path = defaultdict(lambda: '')
self.lastmdx_demuc_ensem = []
self.update_states()
def custom_ensemble(self):
"""
Open Ensemble Custom
"""
top= Toplevel(self)
window_height = 680
window_width = 900
top.title("Customize Ensemble")
top.resizable(False, False) # This code helps to disable windows from resizing
top.attributes("-topmost", True)
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 ='选项包')
tabControl.add(tab2, text ='更多选择')
tabControl.add(tab3, text ='VR模型参数设置')
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)
mdx_demuc_en = ''
mdx_demuc_en = lib_v5.filelist.get_mdx_demucs_en_list(mdx_demuc_en)
mdx_demuc_en_list = mdx_demuc_en
vr_en = ''
vr_en = lib_v5.filelist.get_vr_en_list(vr_en)
vr_en_list = vr_en
frame0=Frame(tab1, highlightbackground='red',highlightthicknes=0)
frame0.grid(row=0,column=0,padx=0,pady=30)
mdx_only_ensem_a = self.mdx_only_ensem_a_var.get()
mdx_only_ensem_b = self.mdx_only_ensem_b_var.get()
mdx_only_ensem_c = self.mdx_only_ensem_c_var.get()
mdx_only_ensem_d = self.mdx_only_ensem_d_var.get()
mdx_only_ensem_e = self.mdx_only_ensem_e_var.get()
mdxensemchoose_b = self.mdxensemchoose_b_var.get()
mdxensemchoose = self.mdxensemchoose_var.get()
vrensemchoose_a = self.vrensemchoose_a_var.get()
vrensemchoose_b = self.vrensemchoose_b_var.get()
vrensemchoose_c = self.vrensemchoose_c_var.get()
vrensemchoose_d = self.vrensemchoose_d_var.get()
vrensemchoose_e = self.vrensemchoose_e_var.get()
vrensemchoose_mdx_a = self.vrensemchoose_mdx_a_var.get()
vrensemchoose_mdx_b = self.vrensemchoose_mdx_b_var.get()
vrensemchoose_mdx_c = self.vrensemchoose_mdx_c_var.get()
vrensemchoose = self.vrensemchoose_var.get()
l0=tk.Label(frame0,text="Multi-AI Ensemble Options",font=("Century Gothic", "11", "underline"), justify="center", fg="#f4f4f4")
l0.grid(row=1,column=0,padx=20,pady=10)
l0=tk.Label(frame0,text=f"{space_small}MDX-Net or Demucs Model 1{space_small}\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, *mdx_demuc_en_list)
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, *mdx_demuc_en_list)
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, *vr_en_list)
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, *vr_en_list)
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, *vr_en_list)
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, *vr_en_list)
l0.grid(row=13,column=0,padx=0,pady=0)
l0=tk.Label(frame0,text="Basic VR Ensemble Options",font=("Century Gothic", "11", "underline"), justify="center", fg="#f4f4f4")
l0.grid(row=1,column=1,padx=20,pady=10)
l0=tk.Label(frame0,text=f'{space_medium}VR Model 1{space_medium}\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, *vr_en_list)
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, *vr_en_list)
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, *vr_en_list)
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, *vr_en_list)
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, *vr_en_list)
l0.grid(row=11,column=1,padx=0,pady=0)
l0=tk.Label(frame0,text="Basic MD Ensemble Options",font=("Century Gothic", "11", "underline"), justify="center", fg="#f4f4f4")
l0.grid(row=1,column=2,padx=20,pady=10)
l0=tk.Label(frame0,text=f'{space_small}MDX-Net or Demucs Model 1{space_small}\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9')
l0.grid(row=2,column=2,padx=0,pady=0)
l0=ttk.OptionMenu(frame0, self.mdx_only_ensem_a_var, *mdx_demuc_en_list)
l0.grid(row=3,column=2,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=2,padx=0,pady=0)
l0=ttk.OptionMenu(frame0, self.mdx_only_ensem_b_var, *mdx_demuc_en_list)
l0.grid(row=5,column=2,padx=0,pady=0)
l0=tk.Label(frame0,text='\nMDX-Net or Demucs Model 3\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9')
l0.grid(row=6,column=2,padx=0,pady=0)
l0=ttk.OptionMenu(frame0, self.mdx_only_ensem_c_var, *mdx_demuc_en_list)
l0.grid(row=7,column=2,padx=0,pady=0)
l0=tk.Label(frame0,text='\nMDX-Net or Demucs Model 4\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9')
l0.grid(row=8,column=2,padx=0,pady=0)
l0=ttk.OptionMenu(frame0, self.mdx_only_ensem_d_var, *mdx_demuc_en_list)
l0.grid(row=9,column=2,padx=0,pady=0)
l0=tk.Label(frame0,text='\nMDX-Net or Demucs Model 5\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9')
l0.grid(row=10,column=2,padx=0,pady=0)
l0=ttk.OptionMenu(frame0, self.mdx_only_ensem_e_var, *mdx_demuc_en_list)
l0.grid(row=11,column=2,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=ttk.Button(frame0,text='Back to Main Menu', command=close_win)
l0.grid(row=13,column=2,padx=20,pady=0)
self.mdx_only_ensem_a_var.set(mdx_only_ensem_a)
self.mdx_only_ensem_b_var.set(mdx_only_ensem_b)
self.mdx_only_ensem_c_var.set(mdx_only_ensem_c)
self.mdx_only_ensem_d_var.set(mdx_only_ensem_d)
self.mdx_only_ensem_e_var.set(mdx_only_ensem_e)
self.mdxensemchoose_b_var.set(mdxensemchoose_b)
self.mdxensemchoose_var.set(mdxensemchoose)
self.vrensemchoose_a_var.set(vrensemchoose_a)
self.vrensemchoose_b_var.set(vrensemchoose_b)
self.vrensemchoose_c_var.set(vrensemchoose_c)
self.vrensemchoose_d_var.set(vrensemchoose_d)
self.vrensemchoose_e_var.set(vrensemchoose_e)
self.vrensemchoose_mdx_a_var.set(vrensemchoose_mdx_a)
self.vrensemchoose_mdx_b_var.set(vrensemchoose_mdx_b)
self.vrensemchoose_mdx_c_var.set(vrensemchoose_mdx_c)
self.vrensemchoose_var.set(vrensemchoose)
frame0=Frame(tab2, highlightbackground='red',highlightthicknes=0)
frame0.grid(row=0,column=0,padx=0,pady=30)
l0=tk.Label(frame0,text="Additional Options",font=("Century Gothic", "11", "underline"), justify="center", fg="#f4f4f4")
l0.grid(row=1,column=1,padx=0,pady=10)
l0=ttk.Checkbutton(frame0, text='Append Ensemble Name to Final Output', variable=self.appendensem_var)
l0.grid(row=2,column=1,padx=0,pady=5)
l0=ttk.Button(frame0,text='Open Models Directory', command=self.open_Modelfolder_filedialog)
l0.grid(row=3,column=1,padx=0,pady=5)
l0=tk.Label(frame0,text='Additional VR Architecture Options',font=("Century Gothic", "11", "underline"), justify="center", fg="#f4f4f4")
l0.grid(row=5,column=1,padx=0,pady=5)
l0=ttk.Checkbutton(frame0, text='Post-Process', variable=self.postprocessing_var)
l0.grid(row=6,column=1,padx=0,pady=5)
l0=ttk.Checkbutton(frame0, text='Save Output Image(s) of Spectrogram(s)', variable=self.outputImage_var)
l0.grid(row=7,column=1,padx=0,pady=5)
l0=tk.Label(frame0,text='Additional Demucs Options',font=("Century Gothic", "11", "underline"), justify="center", fg="#f4f4f4")
l0.grid(row=8,column=1,padx=0,pady=5)
l0=tk.Label(frame0, text='Shifts\n(Higher values use more resources)', font=("Century Gothic", "9"), foreground='#13a4c9')
l0.grid(row=9,column=1,padx=0,pady=5)
l0=ttk.Entry(frame0, textvariable=self.shifts_var, justify='center')
l0.grid(row=10,column=1,padx=0,pady=5)
l0=tk.Label(frame0, text='Overlap', font=("Century Gothic", "9"), foreground='#13a4c9')
l0.grid(row=11,column=1,padx=0,pady=5)
l0=ttk.Entry(frame0, textvariable=self.overlap_var, justify='center')
l0.grid(row=12,column=1,padx=0,pady=5)
l0=ttk.Checkbutton(frame0, text='Split Mode', variable=self.split_mode_var)
l0.grid(row=13,column=1,padx=0,pady=0)
frame0=Frame(tab3, highlightbackground='red',highlightthicknes=0)
frame0.grid(row=0,column=0,padx=0,pady=30)
def set_auto():
self.vr_multi_USER_model_param_1.set('Auto')
self.vr_multi_USER_model_param_2.set('Auto')
self.vr_multi_USER_model_param_3.set('Auto')
self.vr_multi_USER_model_param_4.set('Auto')
self.vr_basic_USER_model_param_1.set('Auto')
self.vr_basic_USER_model_param_2.set('Auto')
self.vr_basic_USER_model_param_3.set('Auto')
self.vr_basic_USER_model_param_4.set('Auto')
self.vr_basic_USER_model_param_5.set('Auto')
l0=tk.Label(frame0,text="Multi-AI Ensemble VR Model Params",font=("Century Gothic", "11", "underline"), justify="center", fg="#f4f4f4")
l0.grid(row=1,column=0,padx=20,pady=10)
l0=tk.Label(frame0,text='\nVR Model 1\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9')
l0.grid(row=2,column=0,padx=0,pady=0)
self.options_ModelParams_a_Optionmenu = l0=ttk.OptionMenu(frame0, self.vr_multi_USER_model_param_1)
self.options_ModelParams_a_Optionmenu
l0.grid(row=3,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=4,column=0,padx=0,pady=0)
self.options_ModelParams_b_Optionmenu = l0=ttk.OptionMenu(frame0, self.vr_multi_USER_model_param_2)
self.options_ModelParams_b_Optionmenu
l0.grid(row=5,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=6,column=0,padx=0,pady=0)
self.options_ModelParams_c_Optionmenu = l0=ttk.OptionMenu(frame0, self.vr_multi_USER_model_param_3)
self.options_ModelParams_c_Optionmenu
l0.grid(row=7,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=8,column=0,padx=0,pady=0)
self.options_ModelParams_d_Optionmenu = l0=ttk.OptionMenu(frame0, self.vr_multi_USER_model_param_4)
self.options_ModelParams_d_Optionmenu
l0.grid(row=9,column=0,padx=0,pady=0)
l0=ttk.Button(frame0,text='Set All to Auto', command=set_auto)
l0.grid(row=11,column=0,padx=0,pady=0)
l0=tk.Label(frame0,text="Basic VR Ensemble Model Params",font=("Century Gothic", "11", "underline"), justify="center", fg="#f4f4f4")
l0.grid(row=1,column=1,padx=20,pady=10)
l0=tk.Label(frame0,text=f'{space_medium}VR Model 1{space_medium}\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9')
l0.grid(row=2,column=1,padx=0,pady=0)
self.options_ModelParams_1_Optionmenu = l0=ttk.OptionMenu(frame0, self.vr_basic_USER_model_param_1)
self.options_ModelParams_1_Optionmenu
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)
self.options_ModelParams_2_Optionmenu = l0=ttk.OptionMenu(frame0, self.vr_basic_USER_model_param_2)
self.options_ModelParams_2_Optionmenu
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)
self.options_ModelParams_3_Optionmenu = l0=ttk.OptionMenu(frame0, self.vr_basic_USER_model_param_3)
self.options_ModelParams_3_Optionmenu
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)
self.options_ModelParams_4_Optionmenu = l0=ttk.OptionMenu(frame0, self.vr_basic_USER_model_param_4)
self.options_ModelParams_4_Optionmenu
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)
self.options_ModelParams_5_Optionmenu = l0=ttk.OptionMenu(frame0, self.vr_basic_USER_model_param_5)
self.options_ModelParams_5_Optionmenu
l0.grid(row=11,column=1,padx=0,pady=0)
self.ModelParamsLabel_ens_to_path = defaultdict(lambda: '')
self.lastModelParams_ens = []
self.update_states()
def help(self):
"""
Open Help Guide
"""
top= Toplevel(self)
if GetSystemMetrics(1) >= 900:
window_height = 810
window_width = 1080
elif GetSystemMetrics(1) <= 720:
window_height = 640
window_width = 930
else:
window_height = 670
window_width = 930
top.title("UVR Help Guide")
top.resizable(False, False) # This code helps to disable windows from resizing
top.attributes("-topmost", True)
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)
tabControl.add(tab1, text ='一般')
tabControl.add(tab2, text ='VR架构')
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.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)
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=tk.Label(frame0,text="Notes",font=("Century Gothic", "16", "bold"), justify="center", fg="#f4f4f4")
l0.grid(row=1,column=0,padx=20,pady=10)
l0=tk.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=tk.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=tk.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=tk.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=tk.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=tk.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=tk.Label(frame0,text="If you wish to support and donate to this project, click the link above and become a Patreon!\nOfficial UVR Patreons will receive VIP access to additional models as well as pre-releases.",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=tk.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=tk.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=tk.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=tk.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=tk.Label(frame0,text="DilanBoskan",font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9")
l0.grid(row=5,column=0,padx=10,pady=5)
l0=tk.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=tk.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=tk.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=tk.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=tk.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=tk.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=tk.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=tk.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=tk.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=tk.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)
else:
l0=tk.Label(frame0,text="Notes",font=("Century Gothic", "11", "bold"), justify="center", fg="#f4f4f4")
l0.grid(row=1,column=0,padx=5,pady=5)
l0=tk.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=tk.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=tk.Label(frame0,text="你可以通过我们的官方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=tk.Label(frame0,text="UVR依靠SoX进行降噪。如果你缺少SoX请通过链接下载它并将SoX压缩包解压到以下目录 - 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=tk.Label(frame0,text="UVR依靠FFmpeg来处理非wav音频文件。\n如果你缺少FFmpeg请通过提供的链接查看安装指南。",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=tk.Label(frame0,text="提供的许多模型也在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="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=tk.Label(frame0,text="如果你想支持和捐助这个项目请点击上面的链接成为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=tk.Label(frame0,text="核心UVR开发者",font=("Century Gothic", "12", "bold"), justify="center", fg="#f4f4f4")
l0.grid(row=0,column=0,padx=20,pady=5, sticky=N)
l0=tk.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=tk.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=tk.Label(frame0,text="特别感谢",font=("Century Gothic", "10", "bold"), justify="center", fg="#f4f4f4")
l0.grid(row=4,column=0,padx=20,pady=10)
l0=tk.Label(frame0,text="DilanBoskan",font=("Century Gothic", "11", "bold"), justify="center", fg="#13a4c9")
l0.grid(row=5,column=0,padx=5,pady=5)
l0=tk.Label(frame0,text="你在这个项目开始时的贡献对UVR的成功至关重要。谢谢你们!",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=tk.Label(frame0,text="开发了原始的VR架构AI代码.",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=tk.Label(frame0,text="开发了最初的MDX-Net人工智能代码.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7")
l0.grid(row=10,column=0,padx=0,pady=0)
l0=tk.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=tk.Label(frame0,text="设计了UVR的官方标志、图标、横幅、闪屏和界面。",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=tk.Label(frame0,text="Facebook的Demucs音乐源分离的核心开发者.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7")
l0.grid(row=14,column=0,padx=0,pady=0)
l0=tk.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=tk.Label(frame0,text="谢谢你的支持!",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7")
l0.grid(row=16,column=0,padx=0,pady=0)
def settings(self, choose=False):
"""
Open Settings
"""
self.delete_temps()
update_var = tk.StringVar(value='')
update_button_var = tk.StringVar(value='Check for Updates')
update_set_var = tk.StringVar(value='UVR Version Current')
top= Toplevel(self)
window_height = 780
window_width = 500
top.title("Settings Guide")
top.resizable(False, False) # This code helps to disable windows from resizing
top.attributes("-topmost", True)
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 askyesorno():
"""
Ask to Update
"""
top_dialoge= Toplevel()
window_height = 250
window_width = 370
top_dialoge.title("Update Found")
top_dialoge.resizable(False, False) # This code helps to disable windows from resizing
top_dialoge.lift()
top_dialoge.attributes("-topmost", True)
top.attributes("-topmost", False)
screen_width = top_dialoge.winfo_screenwidth()
screen_height = top_dialoge.winfo_screenheight()
x_cordinate = int((screen_width/2) - (window_width/2))
y_cordinate = int((screen_height/2) - (window_height/2))
top_dialoge.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
# change title bar icon
top_dialoge.iconbitmap('img\\UVR-Icon-v2.ico')
tabControl = ttk.Notebook(top_dialoge)
tabControl.pack(expand = 1, fill ="both")
tabControl.grid_rowconfigure(0, weight=1)
tabControl.grid_columnconfigure(0, weight=1)
def no():
top.attributes("-topmost", True)
top_dialoge.destroy()
def yes():
download_update()
top.attributes("-topmost", True)
top_dialoge.destroy()
frame0=Frame(tabControl,highlightbackground='red',highlightthicknes=0)
frame0.grid(row=0,column=0,padx=0,pady=0)
l0=tk.Label(frame0, text='最新发现', font=("Century Gothic", "13", "underline"), foreground='#13a4c9')
l0.grid(row=0,column=0,padx=0,pady=10)
l0=tk.Label(frame0, text='你确定要重新启动么?\n\nThe application will need to be restarted.\n', font=("Century Gothic", "11"), foreground='#13a4c9')
l0.grid(row=1,column=0,padx=0,pady=5)
l0=ttk.Button(frame0, text='Yes', command=yes)
l0.grid(row=2,column=0,padx=0,pady=5)
l0=ttk.Button(frame0, text='No', command=no)
l0.grid(row=3,column=0,padx=0,pady=5)
def change_event():
self.delete_temps()
try:
stop_thread()
except:
pass
try:
top_code.destroy()
except:
pass
top.destroy()
def close_win_custom_ensemble():
change_event()
self.custom_ensemble()
def close_win_advanced_mdx_options():
change_event()
self.advanced_mdx_options()
def close_win_advanced_demucs_options():
change_event()
self.advanced_demucs_options()
def close_win_advanced_vr_options():
change_event()
self.advanced_vr_options()
def close_win_error_log():
change_event()
self.error_log()
def close_win_help():
change_event()
self.help()
def close_win():
change_event()
def restart():
top.destroy()
self.restart()
tabControl = ttk.Notebook(top)
tab1 = ttk.Frame(tabControl)
tab2 = ttk.Frame(tabControl)
tab3 = ttk.Frame(tabControl)
tabControl.add(tab1, text ='设置指南')
tabControl.add(tab2, text ='音频格式设置')
tabControl.add(tab3, text ='下载中心')
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)
if choose:
tabControl.select(tab3)
frame0=Frame(tab1,highlightbackground='red',highlightthicknes=0)
frame0.grid(row=0,column=0,padx=0,pady=0)
l0=tk.Label(frame0,text="主菜单",font=("Century Gothic", "13", "underline"), justify="center", fg="#13a4c9")
l0.grid(row=0,column=0,padx=0,pady=10)
l0=ttk.Button(frame0,text="综合定制选项", command=close_win_custom_ensemble)
l0.grid(row=1,column=0,padx=0,pady=5)
l0=ttk.Button(frame0,text="高级MDX-Net选项", command=close_win_advanced_mdx_options)
l0.grid(row=2,column=0,padx=0,pady=5)
l0=ttk.Button(frame0,text="高级Demucs选项", command=close_win_advanced_demucs_options)
l0.grid(row=3,column=0,padx=0,pady=5)
l0=ttk.Button(frame0,text="高级VR选项", command=close_win_advanced_vr_options)
l0.grid(row=4,column=0,padx=0,pady=5)
l0=ttk.Button(frame0,text="打开帮助指南", command=close_win_help)
l0.grid(row=5,column=0,padx=0,pady=5)
l0=ttk.Button(frame0,text='打开错误日志', command=close_win_error_log)
l0.grid(row=6,column=0,padx=0,pady=5)
l0=tk.Label(frame0,text=f"附加选项",font=("Century Gothic", "13", "underline"), justify="center", fg="#13a4c9")
l0.grid(row=7,column=0,padx=0,pady=10)
l0=ttk.Checkbutton(frame0, text='设置 测试模式', variable=self.settest_var)
l0.grid(row=8,column=0,padx=0,pady=0)
l0=ttk.Button(frame0,text='将所有设置重置为默认值', command=self.reset_to_defaults)
l0.grid(row=9,column=0,padx=0,pady=5)
l0=ttk.Button(frame0,text='打开应用目录', command=self.open_appdir_filedialog)
l0.grid(row=10,column=0,padx=0,pady=5)
l0=ttk.Button(frame0,text='重新启动应用程序', command=restart)
l0.grid(row=11,column=0,padx=0,pady=5)
l0=ttk.Button(frame0,text='关闭窗口', command=close_win)
l0.grid(row=12,column=0,padx=0,pady=5)
def start_target_update():
def target_update():
update_var.set(' Loading version information... ')
update_signal_url = "https://raw.githubusercontent.com/TRvlvr/application_data/main/update_patches.txt"
url = update_signal_url
try:
file = urllib.request.urlopen(url)
for line in file:
patch_name = line.decode("utf-8")
if patch_name == current_version:
update_var.set(' UVR Version Current ')
update_button_var.set('Check for Updates')
else:
label_set_a = f" Update Found: {patch_name} "
update_var.set(str(label_set_a))
update_button_var.set('Click Here to Update')
except:
update_var.set(' Version Status: No Internet Connection ')
rlg = KThread(target=target_update)
rlg.start()
start_target_update()
l0=tk.Label(frame0,text="应用程序更新",font=("Century Gothic", "13", "underline"), justify="center", fg="#13a4c9")
l0.grid(row=13,column=0,padx=0,pady=10)
def start_check_updates():
def check_updates():
try:
url = "https://raw.githubusercontent.com/TRvlvr/application_data/main/update_patches.txt"
file = urllib.request.urlopen(url)
for line in file:
patch_name = line.decode("utf-8")
if patch_name == current_version:
update_var.set(' UVR Version Current ')
update_button_var.set('Check for Updates')
else:
label_set = f"Update Found: {patch_name}"
update_button_var.set('Click Here to Update')
update_var.set(str(label_set))
update_set_var.set(str(label_set))
askyesorno()
except:
update_var.set(' Version Status: No Internet Connection ')
rlg = KThread(target=check_updates)
rlg.start()
def open_bmac_m():
top.attributes("-topmost", False)
callback("https://www.buymeacoffee.com/uvr5")
l0=ttk.Button(frame0,text=update_button_var.get(), command=start_check_updates)
l0.grid(row=14,column=0,padx=0,pady=5)
l0=tk.Label(frame0,textvariable=update_var,font=("Century Gothic", "12"), justify="center", relief="ridge", fg="#13a4c9")
l0.grid(row=15,column=0,padx=0,pady=5)
l0=ttk.Button(frame0, image=self.donate_img, command=open_bmac_m)
l0.grid(row=16,column=0,padx=0,pady=5)
l0=tk.Label(frame0,text=f"{space_small}{space_small}{space_small}{space_small}",font=("Century Gothic", "13"), justify="center", relief="flat", fg="#13a4c9")
l0.grid(row=17,column=0,padx=0,pady=0)
frame0=Frame(tab2,highlightbackground='red',highlightthicknes=0)
frame0.grid(row=0,column=0,padx=0,pady=0)
l0=tk.Label(frame0,text="音频格式设置",font=("Century Gothic", "13", "underline"), justify="center", fg="#13a4c9")
l0.grid(row=0,column=0,padx=0,pady=10)
l0=tk.Label(frame0, text='Wav类型', font=("Century Gothic", "9"), foreground='#13a4c9')
l0.grid(row=1,column=0,padx=0,pady=10)
l0=ttk.OptionMenu(frame0, self.wavtype_var, None, 'PCM_U8', 'PCM_16', 'PCM_24', 'PCM_32', '32-bit Float', '64-bit Float')
l0.grid(row=2,column=0,padx=20,pady=0)
l0=tk.Label(frame0, text='Mp3比特率', font=("Century Gothic", "9"), foreground='#13a4c9')
l0.grid(row=5,column=0,padx=0,pady=10)
l0=ttk.OptionMenu(frame0, self.mp3bit_var, None, '96k', '128k', '160k', '224k', '256k', '320k')
l0.grid(row=6,column=0,padx=20,pady=0)
l0=ttk.Checkbutton(frame0, text='正常化输出\n(Prevents clipping)', variable=self.normalize_var)
l0.grid(row=7,column=0,padx=0,pady=10)
frame0=Frame(tab3,highlightbackground='red',highlightthicknes=0)
frame0.grid(row=0,column=0,padx=0,pady=0)
l0=tk.Label(frame0,text="应用程序下载中心",font=("Century Gothic", "13", "underline"), justify="center", fg="#13a4c9")
l0.grid(row=0,column=0,padx=20,pady=10)
def user_code():
"""
Input Code
"""
okVar = tk.IntVar()
try:
with open(user_code_file, "r") as f:
code_read = f.read()
user_code_var = tk.StringVar(value=code_read)
except:
user_code_var = tk.StringVar(value='')
try:
with open(download_code_file, "r") as f:
code_download_read = f.read()
user_code_download_var = tk.StringVar(value=code_download_read)
except:
user_code_download_var = tk.StringVar(value='')
global top_code
top_code= Toplevel()
window_height = 480
window_width = 320
top_code.title("User Download Codes")
top_code.resizable(False, False) # This code helps to disable windows from resizing
top_code.attributes("-topmost", True)
top.attributes("-topmost", False)
screen_width = top_code.winfo_screenwidth()
screen_height = top_code.winfo_screenheight()
x_cordinate = int((screen_width/2) - (window_width/2))
y_cordinate = int((screen_height/2) - (window_height/2))
top_code.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
# change title bar icon
top_code.iconbitmap('img\\UVR-Icon-v2.ico')
tabControl = ttk.Notebook(top_code)
tabControl.pack(expand = 1, fill ="both")
tabControl.grid_rowconfigure(0, weight=1)
tabControl.grid_columnconfigure(0, weight=1)
frame0=Frame(tabControl,highlightbackground='red',highlightthicknes=0)
frame0.grid(row=0,column=0,padx=0,pady=0)
def write_code():
with open(user_code_file, 'w') as f:
user_type_code = user_code_var.get()
f.write(str(user_type_code))
with open(download_code_file, 'w') as f:
user_download_code = user_code_download_var.get()
f.write(str(user_download_code))
top_code.destroy()
if user_type_code == 'VIP':
refresh_list_vip()
elif user_type_code == 'Developer':
refresh_list_dev()
else:
refresh_list()
def open_patreon():
top_code.attributes("-topmost", False)
callback("https://www.patreon.com/uvr")
def open_bmac():
top_code.attributes("-topmost", False)
callback("https://www.buymeacoffee.com/uvr5")
def quit():
top.attributes("-topmost", True)
top_code.destroy()
l0=tk.Label(frame0, text=f'用户下载代码', font=("Century Gothic", "11", "underline"), foreground='#13a4c9')
l0.grid(row=0,column=0,padx=0,pady=5)
l0=tk.Label(frame0, text=f'{space_medium}User Code{space_medium}', font=("Century Gothic", "9"), foreground='#13a4c9')
l0.grid(row=1,column=0,padx=0,pady=5)
l0=ttk.Entry(frame0, textvariable=user_code_var, justify='center')
l0.grid(row=2,column=0,padx=0,pady=5)
l0=tk.Label(frame0, text=f'下载代码', font=("Century Gothic", "9"), foreground='#13a4c9')
l0.grid(row=3,column=0,padx=0,pady=5)
l0=ttk.Entry(frame0, textvariable=user_code_download_var, justify='center')
l0.grid(row=4,column=0,padx=0,pady=5)
l0=ttk.Button(frame0, text='确认', command=write_code)
l0.grid(row=5,column=0,padx=0,pady=5)
l0=ttk.Button(frame0, text='取消', command=quit)
l0.grid(row=6,column=0,padx=0,pady=5)
l0=tk.Label(frame0, text=f'Support UVR', font=("Century Gothic", "11", "underline"), foreground='#13a4c9')
l0.grid(row=7,column=0,padx=0,pady=5)
l0=tk.Label(frame0, text=f'Obtain codes by making a one-time donation\n via \"Buy Me a Coffee\" or by becoming a Patreon.\nClick one of the buttons below to donate or pledge!', font=("Century Gothic", "8"), foreground='#13a4c9')
l0.grid(row=8,column=0,padx=0,pady=5)
l0=ttk.Button(frame0, text='UVR Patreon Link', command=open_patreon)
l0.grid(row=9,column=0,padx=0,pady=5)
l0=ttk.Button(frame0, text='UVR \"Buy Me a Coffee\" Link', command=open_bmac)
l0.grid(row=10,column=0,padx=0,pady=5)
def download_code():
"""
Input Download Code
"""
try:
with open(download_code_file, "r") as f:
code_download_read = f.read()
user_code_download_var = tk.StringVar(value=code_download_read)
except:
user_code_download_var = tk.StringVar(value='')
top_code= Toplevel()
window_height = 300
window_width = 410
top_code.title("Invalid Download Code")
top_code.resizable(False, False) # This code helps to disable windows from resizing
top_code.attributes("-topmost", True)
top.attributes("-topmost", False)
screen_width = top_code.winfo_screenwidth()
screen_height = top_code.winfo_screenheight()
x_cordinate = int((screen_width/2) - (window_width/2))
y_cordinate = int((screen_height/2) - (window_height/2))
top_code.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
# change title bar icon
top_code.iconbitmap('img\\UVR-Icon-v2.ico')
tabControl = ttk.Notebook(top_code)
tabControl.pack(expand = 1, fill ="both")
tabControl.grid_rowconfigure(0, weight=1)
tabControl.grid_columnconfigure(0, weight=1)
frame0=Frame(tabControl,highlightbackground='red',highlightthicknes=0)
frame0.grid(row=0,column=0,padx=0,pady=0)
def write_code_p():
with open(download_code_file, 'w') as f:
user_download_code = user_code_download_var.get()
f.write(str(user_download_code))
download_model()
top_code.destroy()
def quit():
top.attributes("-topmost", True)
top_code.destroy()
l0=tk.Label(frame0, text=f'无效的下载代码', font=("Century Gothic", "11", "underline"), foreground='#13a4c9')
l0.grid(row=0,column=0,padx=0,pady=10)
l0=tk.Label(frame0, text=f'请在下面提供正确的代码或进行其他选择.\n', font=("Century Gothic", "10"), foreground='#13a4c9')
l0.grid(row=1,column=0,padx=0,pady=0)
l0=tk.Label(frame0, text=f'下载代码', font=("Century Gothic", "9"), foreground='#13a4c9')
l0.grid(row=2,column=0,padx=0,pady=5)
l0=ttk.Entry(frame0, textvariable=user_code_download_var, justify='center')
l0.grid(row=3,column=0,padx=0,pady=5)
l0=ttk.Button(frame0, text='确认', command=write_code_p)
l0.grid(row=4,column=0,padx=0,pady=5)
l0=ttk.Button(frame0, text='取消', command=quit)
l0.grid(row=5,column=0,padx=0,pady=5)
l0=tk.Label(frame0, text=f"{space_fill_wide}Select Download{space_fill_wide}", font=("Century Gothic", "9"), foreground='#13a4c9')
l0.grid(row=1,column=0,padx=0,pady=10)
def download_progress_bar(current, total, width=80):
progress = ('%s' % (100 * current // total))
self.download_progress_bar_zip_var.set(int(progress))
self.download_progress_var.set(progress + ' %')
def change_state_complete():
download_button.configure(state=tk.NORMAL)
self.downloadmodelOptions.configure(state=tk.NORMAL)
self.downloadmodelOptions_mdx.configure(state=tk.NORMAL)
self.downloadmodelOptions_demucs.configure(state=tk.NORMAL)
stop_button.configure(state=tk.DISABLED)
self.download_stop_var.set(space_small)
self.download_progress_bar_var.set('Download Complete')
self.delete_temps()
def change_state_locked():
download_button.configure(state=tk.NORMAL)
self.downloadmodelOptions.configure(state=tk.NORMAL)
self.downloadmodelOptions_mdx.configure(state=tk.NORMAL)
self.downloadmodelOptions_demucs.configure(state=tk.NORMAL)
stop_button.configure(state=tk.DISABLED)
self.download_stop_var.set(space_small)
self.download_progress_bar_var.set('Invalid Download Code')
self.delete_temps()
def change_state_already_found():
download_button.configure(state=tk.NORMAL)
self.downloadmodelOptions.configure(state=tk.NORMAL)
self.downloadmodelOptions_mdx.configure(state=tk.NORMAL)
self.downloadmodelOptions_demucs.configure(state=tk.NORMAL)
stop_button.configure(state=tk.DISABLED)
self.download_stop_var.set(space_small)
self.download_progress_bar_var.set('Download Stopped')
self.delete_temps()
def change_state_failed():
download_button.configure(state=tk.NORMAL)
self.downloadmodelOptions.configure(state=tk.NORMAL)
self.downloadmodelOptions_mdx.configure(state=tk.NORMAL)
self.downloadmodelOptions_demucs.configure(state=tk.NORMAL)
stop_button.configure(state=tk.DISABLED)
self.download_stop_var.set(space_small)
self.download_progress_bar_var.set('Download Failed')
self.delete_temps()
def download_model():
self.delete_temps()
def begin_download_model():
if not self.modeldownload_var.get() == 'No Model Selected':
model = self.modeldownload_var.get()
self.download_progress_bar_var.set('Downloading...')
elif not self.modeldownload_mdx_var.get() == 'No Model Selected':
model = self.modeldownload_mdx_var.get()
self.download_progress_bar_var.set('Downloading...')
elif not self.modeldownload_demucs_var.get() == 'No Model Selected':
model = self.modeldownload_demucs_var.get()
self.download_progress_bar_var.set('Downloading...')
elif not update_set_var.get() == 'UVR Version Current':
model = update_set_var.get()
self.download_progress_bar_var.set('Downloading Update...')
else:
self.download_progress_bar_var.set('No Model Selected')
return
self.downloadmodelOptions.configure(state=tk.DISABLED)
self.downloadmodelOptions_mdx.configure(state=tk.DISABLED)
self.downloadmodelOptions_demucs.configure(state=tk.DISABLED)
download_button.configure(state=tk.DISABLED)
stop_button.configure(state=tk.NORMAL)
self.download_stop_var.set('Stop Download')
if model == 'Demucs v3: mdx':
try:
links = []
links = lib_v5.filelist.get_download_links(links, downloads='Demucs v3: mdx')
url_1 = links[0]
url_2 = links[1]
url_3 = links[2]
url_4 = links[3]
url_5 = links[4]
self.download_progress_bar_var.set('Downloading Model 1/4...')
if os.path.isfile('models/Demucs_Models/v3_repo/0d19c1c6-0f06f20e.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_1, 'models/Demucs_Models/v3_repo/0d19c1c6-0f06f20e.th', bar=download_progress_bar)
self.download_progress_bar_var.set('Downloading Model 2/4...')
if os.path.isfile('models/Demucs_Models/v3_repo/7ecf8ec1-70f50cc9.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_2, 'models/Demucs_Models/v3_repo/7ecf8ec1-70f50cc9.th', bar=download_progress_bar)
self.download_progress_bar_var.set('Downloading Model 3/4...')
if os.path.isfile('models/Demucs_Models/v3_repo/c511e2ab-fe698775.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_3, 'models/Demucs_Models/v3_repo/c511e2ab-fe698775.th', bar=download_progress_bar)
self.download_progress_bar_var.set('Downloading Model 4/4...')
if os.path.isfile('models/Demucs_Models/v3_repo/7d865c68-3d5dd56b.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_4, 'models/Demucs_Models/v3_repo/7d865c68-3d5dd56b.th', bar=download_progress_bar)
if os.path.isfile('models/Demucs_Models/v3_repo/mdx.yaml'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_5, 'models/Demucs_Models/v3_repo/mdx.yaml', bar=download_progress_bar)
if os.path.isfile('models/Demucs_Models/mdx.yaml'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_5, 'models/Demucs_Models/mdx.yaml', bar=download_progress_bar)
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if model == 'Demucs v3: mdx_q':
try:
links = []
links = lib_v5.filelist.get_download_links(links, downloads='Demucs v3: mdx_q')
url_1 = links[0]
url_2 = links[1]
url_3 = links[2]
url_4 = links[3]
url_5 = links[4]
self.download_progress_bar_var.set('Downloading Model 1/4...')
if os.path.isfile('models/Demucs_Models/v3_repo/6b9c2ca1-3fd82607.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_1, 'models/Demucs_Models/v3_repo/6b9c2ca1-3fd82607.th', bar=download_progress_bar)
self.download_progress_bar_var.set('Downloading Model 2/4...')
if os.path.isfile('models/Demucs_Models/v3_repo/b72baf4e-8778635e.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_2, 'models/Demucs_Models/v3_repo/b72baf4e-8778635e.th', bar=download_progress_bar)
self.download_progress_bar_var.set('Downloading Model 3/4...')
if os.path.isfile('models/Demucs_Models/v3_repo/42e558d4-196e0e1b.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_3, 'models/Demucs_Models/v3_repo/42e558d4-196e0e1b.th', bar=download_progress_bar)
self.download_progress_bar_var.set('Downloading Model 4/4...')
if os.path.isfile('models/Demucs_Models/v3_repo/305bc58f-18378783.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_4, 'models/Demucs_Models/v3_repo/305bc58f-18378783.th', bar=download_progress_bar)
if os.path.isfile('models/Demucs_Models/v3_repo/mdx_q.yaml'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_5, 'models/Demucs_Models/v3_repo/mdx_q.yaml', bar=download_progress_bar)
if os.path.isfile('models/Demucs_Models/mdx_q.yaml'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_5, 'models/Demucs_Models/mdx_q.yaml', bar=download_progress_bar)
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if model == 'Demucs v3: mdx_extra':
try:
links = []
links = lib_v5.filelist.get_download_links(links, downloads='Demucs v3: mdx_extra')
url_1 = links[0]
url_2 = links[1]
url_3 = links[2]
url_4 = links[3]
url_5 = links[4]
self.download_progress_bar_var.set('Downloading Model 1/4...')
if os.path.isfile('models/Demucs_Models/v3_repo/e51eebcc-c1b80bdd.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_1, 'models/Demucs_Models/v3_repo/e51eebcc-c1b80bdd.th', bar=download_progress_bar)
self.download_progress_bar_var.set('Downloading Model 2/4...')
if os.path.isfile('models/Demucs_Models/v3_repo/a1d90b5c-ae9d2452.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_2, 'models/Demucs_Models/v3_repo/a1d90b5c-ae9d2452.th', bar=download_progress_bar)
self.download_progress_bar_var.set('Downloading Model 3/4...')
if os.path.isfile('models/Demucs_Models/v3_repo/5d2d6c55-db83574e.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_3, 'models/Demucs_Models/v3_repo/5d2d6c55-db83574e.th', bar=download_progress_bar)
self.download_progress_bar_var.set('Downloading Model 4/4...')
if os.path.isfile('models/Demucs_Models/v3_repo/cfa93e08-61801ae1.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_4, 'models/Demucs_Models/v3_repo/cfa93e08-61801ae1.th', bar=download_progress_bar)
if os.path.isfile('models/Demucs_Models/v3_repo/mdx_extra.yaml'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_5, 'models/Demucs_Models/v3_repo/mdx_extra.yaml', bar=download_progress_bar)
if os.path.isfile('models/Demucs_Models/mdx_extra.yaml'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_5, 'models/Demucs_Models/mdx_extra.yaml', bar=download_progress_bar)
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if model == 'Demucs v3: mdx_extra_q':
try:
links = []
links = lib_v5.filelist.get_download_links(links, downloads='Demucs v3: mdx_extra_q')
url_1 = links[0]
url_2 = links[1]
url_3 = links[2]
url_4 = links[3]
url_5 = links[4]
self.download_progress_bar_var.set('Downloading Model 1/4...')
if os.path.isfile('models/Demucs_Models/v3_repo/83fc094f-4a16d450.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_1, 'models/Demucs_Models/v3_repo/83fc094f-4a16d450.th', bar=download_progress_bar)
self.download_progress_bar_var.set('Downloading Model 2/4...')
if os.path.isfile('models/Demucs_Models/v3_repo/464b36d7-e5a9386e.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_2, 'models/Demucs_Models/v3_repo/464b36d7-e5a9386e.th', bar=download_progress_bar)
self.download_progress_bar_var.set('Downloading Model 3/4...')
if os.path.isfile('models/Demucs_Models/v3_repo/14fc6a69-a89dd0ee.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_3, 'models/Demucs_Models/v3_repo/14fc6a69-a89dd0ee.th', bar=download_progress_bar)
self.download_progress_bar_var.set('Downloading Model 4/4...')
if os.path.isfile('models/Demucs_Models/v3_repo/7fd6ef75-a905dd85.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_4, 'models/Demucs_Models/v3_repo/7fd6ef75-a905dd85.th', bar=download_progress_bar)
if os.path.isfile('models/Demucs_Models/v3_repo/mdx_extra_q.yaml'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_5, 'models/Demucs_Models/v3_repo/mdx_extra_q.yaml', bar=download_progress_bar)
if os.path.isfile('models/Demucs_Models/mdx_extra_q.yaml'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_5, 'models/Demucs_Models/mdx_extra_q.yaml', bar=download_progress_bar)
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if model == 'Demucs v3: UVR Models':
try:
links = []
links = lib_v5.filelist.get_download_links(links, downloads='Demucs v3: UVR Models')
url_1 = links[0]
url_2 = links[1]
url_3 = links[2]
url_4 = links[3]
url_5 = links[4]
self.download_progress_bar_var.set('Downloading Model 1/2...')
if os.path.isfile('models/Demucs_Models/v3_repo/ebf34a2d.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_1, 'models/Demucs_Models/v3_repo/ebf34a2d.th', bar=download_progress_bar)
self.download_progress_bar_var.set('Downloading Model 2/2...')
if os.path.isfile('models/Demucs_Models/v3_repo/ebf34a2db.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_2, 'models/Demucs_Models/v3_repo/ebf34a2db.th', bar=download_progress_bar)
self.download_progress_bar_var.set('Downloading Model...')
if os.path.isfile('models/Demucs_Models/v3_repo/UVR_Demucs_Model_1.yaml'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_3, 'models/Demucs_Models/v3_repo/UVR_Demucs_Model_1.yaml', bar=download_progress_bar)
self.download_progress_bar_var.set('Downloading Model...')
if os.path.isfile('models/Demucs_Models/v3_repo/UVR_Demucs_Model_2.yaml'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_4, 'models/Demucs_Models/v3_repo/UVR_Demucs_Model_2.yaml', bar=download_progress_bar)
if os.path.isfile('models/Demucs_Models/v3_repo/UVR_Demucs_Model_Bag.yaml'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_5, 'models/Demucs_Models/v3_repo/UVR_Demucs_Model_Bag.yaml', bar=download_progress_bar)
if os.path.isfile('models/Demucs_Models/UVR_Demucs_Model_1.yaml'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_3, 'models/Demucs_Models/UVR_Demucs_Model_1.yaml', bar=download_progress_bar)
if os.path.isfile('models/Demucs_Models/UVR_Demucs_Model_2.yaml'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_4, 'models/Demucs_Models/UVR_Demucs_Model_2.yaml', bar=download_progress_bar)
if os.path.isfile('models/Demucs_Models/UVR_Demucs_Model_Bag.yaml'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url_5, 'models/Demucs_Models/UVR_Demucs_Model_Bag.yaml', bar=download_progress_bar)
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if model == 'Demucs v2: demucs':
try:
links = []
links = lib_v5.filelist.get_download_links(links, downloads='Demucs v2: demucs')
url = links
if os.path.isfile('models/Demucs_Models/demucs-e07c671f.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url, 'models/Demucs_Models/demucs-e07c671f.th', bar=download_progress_bar)
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if model == 'Demucs v2: demucs_extra':
try:
links = []
links = lib_v5.filelist.get_download_links(links, downloads='Demucs v2: demucs_extra')
url = links
if os.path.isfile('models/Demucs_Models/demucs_extra-3646af93.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url, 'models/Demucs_Models/demucs_extra-3646af93.th', bar=download_progress_bar)
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if model == 'Demucs v2: demucs48_hq':
try:
links = []
links = lib_v5.filelist.get_download_links(links, downloads='Demucs v2: demucs48_hq')
url = links
if os.path.isfile('models/Demucs_Models/demucs48_hq-28a1282c.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url, 'models/Demucs_Models/demucs48_hq-28a1282c.th', bar=download_progress_bar)
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if model == 'Demucs v2: tasnet':
try:
links = []
links = lib_v5.filelist.get_download_links(links, downloads='Demucs v2: tasnet')
url = links
if os.path.isfile('models/Demucs_Models/tasnet-beb46fac.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url, 'models/Demucs_Models/tasnet-beb46fac.th', bar=download_progress_bar)
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if model == 'Demucs v2: tasnet_extra':
try:
links = []
links = lib_v5.filelist.get_download_links(links, downloads='Demucs v2: tasnet_extra')
url = links
if os.path.isfile('models/Demucs_Models/tasnet_extra-df3777b2.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url, 'models/Demucs_Models/tasnet_extra-df3777b2.th', bar=download_progress_bar)
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if model == 'Demucs v2: demucs_unittest':
try:
links = []
links = lib_v5.filelist.get_download_links(links, downloads='Demucs v2: demucs_unittest')
url = links
if os.path.isfile('models/Demucs_Models/demucs_unittest-09ebc15f.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url, 'models/Demucs_Models/demucs_unittest-09ebc15f.th', bar=download_progress_bar)
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if model == 'Demucs v1: demucs':
try:
links = []
links = lib_v5.filelist.get_download_links(links, downloads='Demucs v1: demucs')
url = links
if os.path.isfile('models/Demucs_Models/demucs.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url, 'models/Demucs_Models/demucs.th', bar=download_progress_bar)
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if model == 'Demucs v1: demucs_extra':
try:
links = []
links = lib_v5.filelist.get_download_links(links, downloads='Demucs v1: demucs_extra')
url = links
if os.path.isfile('models/Demucs_Models/demucs_extra.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url, 'models/Demucs_Models/demucs_extra.th', bar=download_progress_bar)
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if model == 'Demucs v1: light':
try:
links = []
links = lib_v5.filelist.get_download_links(links, downloads='Demucs v1: light')
url = links
if os.path.isfile('models/Demucs_Models/light.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url, 'models/Demucs_Models/light.th', bar=download_progress_bar)
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if model == 'Demucs v1: light_extra':
try:
links = []
links = lib_v5.filelist.get_download_links(links, downloads='Demucs v1: light_extra')
url = links
if os.path.isfile('models/Demucs_Models/light_extra.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url, 'models/Demucs_Models/light_extra.th', bar=download_progress_bar)
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if model == 'Demucs v1: tasnet':
try:
links = []
links = lib_v5.filelist.get_download_links(links, downloads='Demucs v1: tasnet')
url = links
if os.path.isfile('models/Demucs_Models/tasnet.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url, 'models/Demucs_Models/tasnet.th', bar=download_progress_bar)
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if model == 'Demucs v1: tasnet_extra':
try:
links = []
links = lib_v5.filelist.get_download_links(links, downloads='Demucs v1: tasnet_extra')
url = links
if os.path.isfile('models/Demucs_Models/tasnet_extra.th'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url, 'models/Demucs_Models/tasnet_extra.th', bar=download_progress_bar)
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if model == 'VR Arch Model Pack v5: HP2 Models':
try:
links = []
links = lib_v5.filelist.get_download_links(links, downloads='model_repo')
url = f"{links}uvr_v5_hp2_models.zip"
if os.path.isfile('models/Main_Models/uvr_v5_hp2_models.zip'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url, 'models/Main_Models/uvr_v5_hp2_models.zip', bar=download_progress_bar)
with zipfile.ZipFile('models/Main_Models/uvr_v5_hp2_models.zip', 'r') as zip_ref:
zip_ref.extractall('models/Main_Models')
os.remove('models/Main_Models/uvr_v5_hp2_models.zip')
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if model == 'VR Arch Model Pack v4: Main Models':
links = []
links = lib_v5.filelist.get_download_links(links, downloads='model_repo')
url = f"{links}uvr_v4_models.zip"
try:
if os.path.isfile('models/Main_Models/4_models.zip'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url, 'models/Main_Models/4_models.zip', bar=download_progress_bar)
with zipfile.ZipFile('models/Main_Models/4_models.zip', 'r') as zip_ref:
zip_ref.extractall('models/Main_Models')
os.remove('models/Main_Models/4_models.zip')
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if model == 'VR Arch Model Pack v5: SP Models':
links = []
links = lib_v5.filelist.get_download_links(links, downloads='model_repo')
url = f"{links}uvr_v5_sp_models.zip"
try:
if os.path.isfile('models/Main_Models/uvr_v5_sp_models.zip'):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url, 'models/Main_Models/uvr_v5_sp_models.zip', bar=download_progress_bar)
with zipfile.ZipFile('models/Main_Models/uvr_v5_sp_models.zip', 'r') as zip_ref:
zip_ref.extractall('models/Main_Models')
os.remove('models/Main_Models/uvr_v5_sp_models.zip')
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if 'VR Arch Single Model v5:' in model or 'VR Arch Single Model v4:' in model:
if 'VR Arch Single Model v5:' in model:
model_name = model
head, sep, tail = model_name.partition('VR Arch Single Model v5: ')
model_name = tail
if 'VR Arch Single Model v4:' in model:
model_name = model
head, sep, tail = model_name.partition('VR Arch Single Model v4: ')
model_name = tail
if 'VR Arch Single Model v4:' in model:
model_name = model
head, sep, tail = model_name.partition('VR Arch Single Model v4: ')
model_name = tail
links = []
links = lib_v5.filelist.get_download_links(links, downloads='single_model_repo')
m_url = f"{links}{model_name}.pth"
url = m_url
try:
if os.path.isfile(f"models/Main_Models/{model_name}.pth"):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url, f"models/Main_Models/{model_name}.pth", bar=download_progress_bar)
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if 'MDX-Net Model: ' in model:
model_name = model
head, sep, tail = model_name.partition('MDX-Net Model: ')
model_name = tail
links = []
links = lib_v5.filelist.get_download_links(links, downloads='single_model_repo')
m_url = f"{links}{model_name}.onnx"
#print(m_url)
url = m_url
try:
if os.path.isfile(f"models/MDX_Net_Models/{model_name}.onnx"):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(url, f"models/MDX_Net_Models/{model_name}.onnx", bar=download_progress_bar)
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if 'MDX-Net Model VIP:' in model:
model_name = model
head, sep, tail = model_name.partition('MDX-Net Model VIP: ')
model_name = tail
url_code = f"https://github.com/TRvlvr/application_data/raw/main/filelists/aes_vip/{model_name}.txt.aes"
encrypted_file_code_vip = f"lib_v5/filelists/download_codes/temp/{model_name}.aes"
file_code_vip = f"lib_v5/filelists/download_codes/temp/{model_name}.txt"
try:
wget.download(url_code, encrypted_file_code_vip, bar=download_progress_bar)
with open(download_code_file, "r") as f:
user_download_code_read = f.read()
bufferSize = 128 * 1024
password = user_download_code_read
try:
pyAesCrypt.decryptFile(encrypted_file_code_vip, file_code_vip, password, bufferSize)
except:
try:
url_v_key = f"https://github.com/TRvlvr/application_data/raw/main/filelists/aes_dev/vip_key.txt.aes"
wget.download(url_v_key, 'lib_v5/filelists/download_codes/temp/vip_key.aes', bar=download_progress_bar)
pyAesCrypt.decryptFile('lib_v5/filelists/download_codes/temp/vip_key.aes',
'lib_v5/filelists/download_codes/temp/vip_key.txt', password, bufferSize)
with open('lib_v5/filelists/download_codes/temp/vip_key.txt', "r") as f:
vip_code_read = f.read()
password = vip_code_read
pyAesCrypt.decryptFile(encrypted_file_code_vip, file_code_vip, password, bufferSize)
except:
download_code()
change_state_locked()
return
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
with open(file_code_vip, "r") as f:
link=f.read()
m_url = link
try:
if os.path.isfile(f"models/MDX_Net_Models/{model_name}.onnx"):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(m_url, f"models/MDX_Net_Models/{model_name}.onnx", bar=download_progress_bar)
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if 'Developer Pack:' in model:
pack_name = model
head, sep, tail = pack_name.partition('Developer Pack: ')
pack_name = tail
url_code = f"https://github.com/TRvlvr/application_data/raw/main/filelists/aes_dev/{pack_name}.txt.aes"
#print(url_code)
encrypted_file_code = f"lib_v5/filelists/download_codes/temp/{pack_name}.aes"
file_code = f"lib_v5/filelists/download_codes/temp/{pack_name}.txt"
try:
wget.download(url_code, encrypted_file_code, bar=download_progress_bar)
with open(download_code_file, "r") as f:
user_download_code_read = f.read()
bufferSize = 128 * 1024
password = user_download_code_read
# encrypt
try:
pyAesCrypt.decryptFile(encrypted_file_code, file_code, password, bufferSize)
except:
download_code()
change_state_locked()
return
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
with open(file_code, "r") as f:
link=f.read()
m_url = link
try:
if os.path.isfile(f"models/MDX_Net_Models/{pack_name}.zip"):
self.download_progress_var.set('File already exists')
change_state_already_found()
pass
else:
wget.download(m_url, f"models/MDX_Net_Models/{pack_name}.zip", bar=download_progress_bar)
with zipfile.ZipFile(f'models/MDX_Net_Models/{pack_name}.zip', 'r') as zip_ref:
zip_ref.extractall('models/MDX_Net_Models')
try:
os.remove(f'models/MDX_Net_Models/{pack_name}.zip')
except:
pass
change_state_complete()
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
if 'Update Found:' in model:
pack_name = model
head, sep, tail = pack_name.partition('Update Found: ')
pack_name = tail
cwd_path = os.path.dirname(os.path.realpath(__file__))
#print('cwd_path ', cwd_path)
links = []
links = lib_v5.filelist.get_download_links(links, downloads='app_patch')
url_link = f"{links}{pack_name}.exe"
#print(url_link)
top.attributes("-topmost", False)
try:
if os.path.isfile(f"{cwd_path}/{pack_name}.exe"):
self.download_progress_var.set('File already exists')
subprocess.Popen(f"{cwd_path}/{pack_name}.exe")
else:
wget.download(url_link, f"{cwd_path}/{pack_name}.exe", bar=download_progress_bar)
subprocess.Popen(f"{cwd_path}/{pack_name}.exe")
except Exception as e:
short_error = f'{e}'
change_state_failed()
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
self.update_states()
global th
th = KThread(target=begin_download_model)
th.start()
def stop_thread():
th.kill()
download_button.configure(state=tk.NORMAL)
self.downloadmodelOptions.configure(state=tk.NORMAL)
self.downloadmodelOptions_mdx.configure(state=tk.NORMAL)
self.downloadmodelOptions_demucs.configure(state=tk.NORMAL)
stop_button.configure(state=tk.DISABLED)
self.download_stop_var.set(space_small)
self.update_states()
self.download_progress_bar_var.set('Download Stopped')
self.delete_temps()
def download_update():
self.modeldownload_var.set('No Model Selected')
self.modeldownload_mdx_var.set('No Model Selected')
self.modeldownload_demucs_var.set('No Model Selected')
tabControl.select(tab3)
download_model()
vr_download_list_file = "lib_v5/filelists/download_lists/vr_download_list.txt"
mdx_download_list_file = "lib_v5/filelists/download_lists/mdx_download_list.txt"
demucs_download_list_file = "lib_v5/filelists/download_lists/demucs_download_list.txt"
vr_download_list_temp_file = "lib_v5/filelists/download_lists/temp/vr_download_list.txt"
mdx_download_list_temp_file = "lib_v5/filelists/download_lists/temp/mdx_download_list.txt"
demucs_download_list_temp_file = "lib_v5/filelists/download_lists/temp/demucs_download_list.txt"
mdx_new_hashes = "lib_v5/filelists/hashes/mdx_new_hashes.txt"
mdx_new_inst_hashes = "lib_v5/filelists/hashes/mdx_new_inst_hashes.txt"
mdx_original_hashes = "lib_v5/filelists/hashes/mdx_original_hashes.txt"
download_links_file = "lib_v5/filelists/download_lists/download_links.json"
mdx_new_hashes_temp = "lib_v5/filelists/hashes/temp/mdx_new_hashes.txt"
mdx_new_inst_hashes_temp = "lib_v5/filelists/hashes/temp/mdx_new_inst_hashes.txt"
mdx_original_hashes_temp = "lib_v5/filelists/hashes/temp/mdx_original_hashes.txt"
download_links_file_temp = "lib_v5/filelists/download_lists/temp/download_links.json"
def move_lists_from_temp():
try:
shutil.move(vr_download_list_temp_file, vr_download_list_file)
shutil.move(mdx_download_list_temp_file, mdx_download_list_file)
shutil.move(demucs_download_list_temp_file, demucs_download_list_file)
shutil.move(mdx_new_hashes_temp, mdx_new_hashes)
shutil.move(mdx_new_inst_hashes_temp, mdx_new_inst_hashes)
shutil.move(mdx_original_hashes_temp, mdx_original_hashes)
shutil.move(download_links_file_temp, download_links_file)
except:
pass
def remove_lists_temp():
try:
os.remove(vr_download_list_temp_file)
os.remove(mdx_download_list_temp_file)
os.remove(demucs_download_list_temp_file)
os.remove(mdx_new_hashes_temp)
os.remove(mdx_new_inst_hashes_temp)
os.remove(mdx_original_hashes_temp)
os.remove(download_links_file_temp)
except:
pass
def refresh_download_list_only():
download_links = "https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/download_links.json"
def begin_refresh_list():
try:
url_1 = download_links
shutil.move(download_links_file, download_links_file_temp)
wget.download(url_1, download_links_file, bar=download_progress_bar)
os.remove(download_links_file_temp)
except Exception as e:
try:
shutil.move(download_links_file_temp, download_links_file)
except:
pass
rlg = KThread(target=begin_refresh_list)
rlg.start()
def refresh_list():
download_links = "https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/download_links.json"
def begin_refresh_list():
try:
url_1 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/gen_vr_download_list.txt'
url_2 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/gen_mdx_download_list.txt'
url_3 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/gen_demucs_download_list.txt'
url_4 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/hashes/mdx_new_hashes.txt'
url_5 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/hashes/mdx_new_inst_hashes.txt'
url_6 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/hashes/mdx_original_hashes.txt'
url_7 = download_links
wget.download(url_1, vr_download_list_temp_file, bar=download_progress_bar)
wget.download(url_2, mdx_download_list_temp_file, bar=download_progress_bar)
wget.download(url_3, demucs_download_list_temp_file, bar=download_progress_bar)
wget.download(url_4, mdx_new_hashes_temp, bar=download_progress_bar)
wget.download(url_5, mdx_new_inst_hashes_temp, bar=download_progress_bar)
wget.download(url_6, mdx_original_hashes_temp, bar=download_progress_bar)
wget.download(url_7, download_links_file_temp, bar=download_progress_bar)
move_lists_from_temp()
self.download_progress_bar_var.set('Download list\'s refreshed!')
top.destroy()
self.settings(choose=True)
except Exception as e:
short_error = f'{e}'
self.download_progress_bar_var.set('Refresh failed')
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
try:
remove_lists_temp()
except:
pass
rlg = KThread(target=begin_refresh_list)
rlg.start()
def refresh_list_vip():
download_links = "https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/download_links.json"
def begin_refresh_list_vip():
try:
url_1 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/vip_vr_download_list.txt'
url_2 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/vip_mdx_download_list.txt'
url_3 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/vip_demucs_download_list.txt'
url_4 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/hashes/mdx_new_hashes.txt'
url_5 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/hashes/mdx_new_inst_hashes.txt'
url_6 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/hashes/mdx_original_hashes.txt'
url_7 = download_links
wget.download(url_1, vr_download_list_temp_file, bar=download_progress_bar)
wget.download(url_2, mdx_download_list_temp_file, bar=download_progress_bar)
wget.download(url_3, demucs_download_list_temp_file, bar=download_progress_bar)
wget.download(url_4, mdx_new_hashes_temp, bar=download_progress_bar)
wget.download(url_5, mdx_new_inst_hashes_temp, bar=download_progress_bar)
wget.download(url_6, mdx_original_hashes_temp, bar=download_progress_bar)
wget.download(url_7, download_links_file_temp, bar=download_progress_bar)
move_lists_from_temp()
self.download_progress_bar_var.set('VIP: Download list\'s refreshed!')
top.destroy()
self.settings(choose=True)
except Exception as e:
short_error = f'{e}'
self.download_progress_bar_var.set('Refresh failed')
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
try:
remove_lists_temp()
except:
pass
rlv = KThread(target=begin_refresh_list_vip)
rlv.start()
vr_download_list_dev = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/dev_vr_download_list.txt'
mdx_download_list_dev = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/dev_mdx_download_list.txt'
demucs_download_list_dev = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/dev_demucs_download_list.txt'
def refresh_list_dev():
download_links = "https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/download_links.json"
def begin_refresh_list_dev():
try:
url_1 = vr_download_list_dev
url_2 = mdx_download_list_dev
url_3 = demucs_download_list_dev
url_4 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/hashes/mdx_new_hashes.txt'
url_5 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/hashes/mdx_new_inst_hashes.txt'
url_6 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/hashes/mdx_original_hashes.txt'
url_7 = download_links
wget.download(url_1, vr_download_list_temp_file, bar=download_progress_bar)
wget.download(url_2, mdx_download_list_temp_file, bar=download_progress_bar)
wget.download(url_3, demucs_download_list_temp_file, bar=download_progress_bar)
wget.download(url_4, mdx_new_hashes_temp, bar=download_progress_bar)
wget.download(url_5, mdx_new_inst_hashes_temp, bar=download_progress_bar)
wget.download(url_6, mdx_original_hashes_temp, bar=download_progress_bar)
wget.download(url_7, download_links_file_temp, bar=download_progress_bar)
move_lists_from_temp()
self.download_progress_bar_var.set('Developer: Download list\'s refreshed!')
top.destroy()
self.settings(choose=True)
except Exception as e:
short_error = f'{e}'
self.download_progress_bar_var.set('Refresh failed')
if '[Errno 11001] getaddrinfo failed' in short_error:
self.download_progress_var.set('No Internet Connection Detected')
else:
self.download_progress_var.set(short_error)
try:
remove_lists_temp()
except:
pass
rld = KThread(target=begin_refresh_list_dev)
rld.start()
vr_list = ''
vr_list = lib_v5.filelist.get_vr_download_list(vr_list)
vr_download_list = vr_list
mdx_list = ''
mdx_list = lib_v5.filelist.get_mdx_download_list(mdx_list)
mdx_download_list = mdx_list
demucs_list = ''
demucs_list = lib_v5.filelist.get_demucs_download_list(demucs_list)
demucs_download_list = demucs_list
ach_radio = l0=ttk.Radiobutton(frame0, text='VR Arch', variable=self.selectdownload_var, value='VR Arc')
l0.grid(row=3,column=0,padx=0,pady=5)
self.downloadmodelOptions = l0=ttk.OptionMenu(frame0, self.modeldownload_var, *vr_download_list)
l0.grid(row=4,column=0,padx=0,pady=5)
mdx_radio = l0=ttk.Radiobutton(frame0, text='MDX-Net', variable=self.selectdownload_var, value='MDX-Net')
l0.grid(row=5,column=0,padx=0,pady=5)
self.downloadmodelOptions_mdx = l0=ttk.OptionMenu(frame0, self.modeldownload_mdx_var, *mdx_download_list)
l0.grid(row=6,column=0,padx=0,pady=5)
demucs_radio = l0=ttk.Radiobutton(frame0, text='Demucs', variable=self.selectdownload_var, value='Demucs')
l0.grid(row=7,column=0,padx=0,pady=5)
self.downloadmodelOptions_demucs = l0=ttk.OptionMenu(frame0, self.modeldownload_demucs_var, *demucs_download_list)
l0.grid(row=8,column=0,padx=0,pady=5)
download_button = l0=ttk.Button(frame0, image=self.download_img, command=download_model)
l0.grid(row=9,column=0,padx=0,pady=5)
l0=tk.Label(frame0, textvariable=self.download_progress_bar_var, font=("Century Gothic", "9"), foreground='#13a4c9', borderwidth=0)
l0.grid(row=10,column=0,padx=0,pady=5)
l0=tk.Label(frame0, textvariable=self.download_progress_var, font=("Century Gothic", "9"), wraplength=350, foreground='#13a4c9')
l0.grid(row=11,column=0,padx=0,pady=5)
l0=ttk.Progressbar(frame0, variable=self.download_progress_bar_zip_var)
l0.grid(row=12,column=0,padx=0,pady=5)
stop_button = l0=ttk.Button(frame0, textvariable=self.download_stop_var, command=stop_thread)
l0.grid(row=13,column=0,padx=0,pady=5)
try:
with open(user_code_file, "r") as f:
code_read = f.read()
if code_read == 'VIP':
l0=ttk.Button(frame0, text='刷新列表', command=refresh_list_vip)
elif code_read == 'Developer':
l0=ttk.Button(frame0, text='刷新列表', command=refresh_list_dev)
else:
code_read = 'None'
l0=ttk.Button(frame0, text='刷新列表', command=refresh_list)
except:
code_read = 'None'
l0=ttk.Button(frame0, text='刷新列表', command=refresh_list)
l0.grid(row=14,column=0,padx=0,pady=5)
l0=ttk.Button(frame0, image=self.key_img, command=user_code)
l0.grid(row=15,column=0,padx=0,pady=5)
stop_button.configure(state=tk.DISABLED)
if choose:
pass
else:
self.download_progress_bar_var.set('')
self.download_progress_var.set('')
self.download_stop_var.set(space_small)
top.protocol("WM_DELETE_WINDOW", change_event)
self.update_states()
def error_log(self):
"""
Open Error Log
"""
top= Toplevel(self)
if GetSystemMetrics(1) >= 900:
window_height = 810
window_width = 1080
elif GetSystemMetrics(1) <= 720:
window_height = 640
window_width = 930
else:
window_height = 670
window_width = 930
top.title("UVR Help Guide")
top.resizable(False, False) # This code helps to disable windows from resizing
top.attributes("-topmost", True)
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 ='错误日志')
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=tk.Label(frame0,text="错误详情",font=("Century Gothic", "16", "bold"), justify="center", fg="#f4f4f4")
l0.grid(row=1,column=0,padx=20,pady=10)
l0=tk.Label(frame0,text="这个标签将显示最后收到的错误的原始细节.",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7")
l0.grid(row=2,column=0,padx=0,pady=0)
l0=tk.Label(frame0,text="(点击下面的错误控制台,复制该错误)\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="返回主菜单", command=close_win)
l0.grid(row=5,column=0,padx=20,pady=10)
l0=ttk.Button(frame0,text='关闭窗口', 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 copy_vr_list(self):
copy_t = open("lib_v5/vr_download_list.txt", "r").read()
pyperclip.copy(copy_t)
def open_Modelfolder_filedialog(self):
"""Let user paste a ".pth" model to use for the vocal Separation"""
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 Separation"""
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 Separation"""
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 = '.'
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={
'agg': agg,
'aiModel': self.aiModel_var.get(),
'algo': self.algo_var.get(),
'appendensem': self.appendensem_var.get(),
'audfile': self.audfile_var.get(),
'aud_mdx': self.aud_mdx_var.get(),
'autocompensate': self.autocompensate_var.get(),
'channel': self.channel_var.get(),
'chunks': chunks,
'chunks_d': self.chunks_d_var.get(),
'compensate': self.compensate_var.get(),
'demucs_only': self.demucs_only_var.get(),
'demucs_stems': self.demucs_stems_var.get(),
'DemucsModel': self.DemucsModel_var.get(),
'demucsmodel': self.demucsmodel_var.get(),
'DemucsModel_MDX': self.DemucsModel_MDX_var.get(),
'demucsmodel_sel_VR': self.demucsmodel_sel_VR_var.get(),
'demucsmodelVR': self.demucsmodelVR_var.get(),
'dim_f': self.dim_f_var.get(),
'ensChoose': self.ensChoose_var.get(),
'exportPath': self.exportPath_var.get(),
'flactype': self.flactype_var.get(),
'gpu': self.gpuConversion_var.get(),
'inputPaths': self.inputPaths,
'inst_only': self.inst_only_var.get(),
'inst_only_b': self.inst_only_b_var.get(),
'lastDir': self.lastDir,
'margin': self.margin_var.get(),
'mdx_ensem': self.mdxensemchoose_var.get(),
'mdx_ensem_b': self.mdxensemchoose_b_var.get(),
'mdx_only_ensem_a': self.mdx_only_ensem_a_var.get(),
'mdx_only_ensem_b': self.mdx_only_ensem_b_var.get(),
'mdx_only_ensem_c': self.mdx_only_ensem_c_var.get(),
'mdx_only_ensem_d': self.mdx_only_ensem_d_var.get(),
'mdx_only_ensem_e': self.mdx_only_ensem_e_var.get(),
'mdxnetModel': self.mdxnetModel_var.get(),
'mdxnetModeltype': self.mdxnetModeltype_var.get(),
'mixing': mixing,
'modeldownload': 'No Model Selected',
'modeldownload_mdx': 'No Model Selected',
'modeldownload_demucs': 'No Model Selected',
'modeldownload_type': 'VR Arc',
'modelFolder': self.modelFolder_var.get(),
'modelInstrumentalLabel': self.instrumentalModel_var.get(),
'ModelParams': self.ModelParams_var.get(),
'mp3bit': self.mp3bit_var.get(),
'n_fft_scale': self.n_fft_scale_var.get(),
'noise_pro_select': self.noise_pro_select_var.get(),
'noise_reduc': self.noisereduc_var.get(),
'noisereduc_s': noisereduc_s,
'non_red': self.non_red_var.get(),
'nophaseinst': self.nophaseinst_var.get(),
'normalize': self.normalize_var.get(),
'output_image': self.outputImage_var.get(),
'overlap': self.overlap_var.get(),
'overlap_b': self.overlap_b_var.get(),
'postprocess': self.postprocessing_var.get(),
'save': self.save_var.get(),
'saveFormat': self.saveFormat_var.get(),
'selectdownload': self.selectdownload_var.get(),
'segment': self.segment_var.get(),
'settest': self.settest_var.get(),
'shifts': self.shifts_var.get(),
'shifts_b': self.shifts_b_var.get(),
'split_mode': self.split_mode_var.get(),
'tta': self.tta_var.get(),
'useModel': 'instrumental',
'voc_only': self.voc_only_var.get(),
'voc_only_b': self.voc_only_b_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(),
'vr_multi_USER_model_param_1': self.vr_multi_USER_model_param_1.get(),
'vr_multi_USER_model_param_2': self.vr_multi_USER_model_param_2.get(),
'vr_multi_USER_model_param_3': self.vr_multi_USER_model_param_3.get(),
'vr_multi_USER_model_param_4': self.vr_multi_USER_model_param_4.get(),
'vr_basic_USER_model_param_1': self.vr_basic_USER_model_param_1.get(),
'vr_basic_USER_model_param_2': self.vr_basic_USER_model_param_2.get(),
'vr_basic_USER_model_param_3': self.vr_basic_USER_model_param_3.get(),
'vr_basic_USER_model_param_4': self.vr_basic_USER_model_param_4.get(),
'vr_basic_USER_model_param_5': self.vr_basic_USER_model_param_5.get(),
'wavtype': self.wavtype_var.get(),
'window_size': window_size,
},
)
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()