File size: 3,606 Bytes
284b9fd
 
 
 
7ce0e34
284b9fd
 
1aa8b04
 
284b9fd
 
7ce0e34
 
1aa8b04
179dfee
1aa8b04
 
179dfee
1aa8b04
 
284b9fd
 
 
 
 
 
 
 
7ce0e34
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
284b9fd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f2b9c94
284b9fd
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import os
import sys
import time
import torch
import warnings
import requests
import subprocess
import modelscope
import huggingface_hub
from tqdm import tqdm

warnings.filterwarnings("ignore")

TEMP_DIR = "./__pycache__"
EN_US = os.getenv("LANG") != "zh_CN.UTF-8"
WEIGHTS_DIR = (
    huggingface_hub.snapshot_download("monetjoe/EMelodyGen", cache_dir=TEMP_DIR)
    if EN_US
    else modelscope.snapshot_download("monetjoe/EMelodyGen", cache_dir=TEMP_DIR)
)
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
PATCH_LENGTH = 128  # Patch Length
PATCH_SIZE = 32  # Patch Size
PATCH_NUM_LAYERS = 9  # Number of layers in the encoder
CHAR_NUM_LAYERS = 3  # Number of layers in the decoder
PATCH_SAMPLING_BATCH_SIZE = 0  # Batch size for training patch, 0 for full context
LOAD_FROM_CHECKPOINT = True  # Whether to load weights from a checkpoint
SHARE_WEIGHTS = False  # Whether to share weights between the encoder and decoder
EN2ZH = {
    "Low": "低",
    "High": "高",
    "Cite": "引用",
    "Save": "保存",
    "Audio": "音频",
    "Minor": "小调",
    "Major": "大调",
    "Mode": "大小调",
    "Submit": "提交",
    "Staff": "五线谱",
    "Status": "状态栏",
    "Feedback": "反馈",
    "Generate": "生成",
    "Dataset": "数据集",
    "BPM tempo": "BPM 速度",
    "Pitch SD": "音高标准差",
    "Video demo": "视频教程",
    "ABC notation": "ABC 记谱",
    "Download MXL": "下载 MXL",
    "Save template": "保存模板",
    "Download MIDI": "下载 MIDI",
    "By template": "通过模板生成",
    "Volume in dB": "dB 音量调节",
    "±12 octave": "±12 八度上下移",
    "Download template": "下载模板",
    "Download MusicXML": "下载 MusicXML",
    "Download PDF score": "下载 PDF 乐谱",
    "By feature control": "通过特征控制生成",
    "Additional info & option": "附加信息及选项",
    "Generate chords coming soon": "生成和声控制暂不可用",
    "The emotion to which the current template belongs": "当前模板所属情感",
    "Valence: reflects negative-positive levels of emotion": "愉悦度 反映情绪的 消极-积极 程度",
    "Arousal: reflects the calmness-intensity of the emotion": "唤醒度 反映情绪的 平静-激烈 程度",
    "The emotion you believe the generated result should belong to": "您所认为生成结果应该所属的情感",
}


def _L(en_txt: str):
    return en_txt if EN_US else f"{en_txt} ({EN2ZH[en_txt]})"


def download(filename: str, url: str):
    try:
        response = requests.get(url, stream=True)
        total_size = int(response.headers.get("content-length", 0))
        chunk_size = 1024

        with open(filename, "wb") as file, tqdm(
            desc=f"Downloading {filename} from {url}...",
            total=total_size,
            unit="B",
            unit_scale=True,
            unit_divisor=1024,
        ) as bar:
            for data in response.iter_content(chunk_size=chunk_size):
                size = file.write(data)
                bar.update(size)

    except Exception as e:
        print(f"Error: {e}")
        time.sleep(10)
        download(filename, url)


if sys.platform.startswith("linux"):
    apkname = "MuseScore.AppImage"
    extra_dir = "squashfs-root"
    download(filename=apkname, url=os.getenv("mscore"))
    if not os.path.exists(extra_dir):
        subprocess.run(["chmod", "+x", f"./{apkname}"])
        subprocess.run([f"./{apkname}", "--appimage-extract"])

    MSCORE = f"./{extra_dir}/AppRun"
    os.environ["QT_QPA_PLATFORM"] = "offscreen"

else:
    MSCORE = os.getenv("mscore")