Spaces:
Running
Running
import os | |
import sys | |
import fitz | |
import subprocess | |
from PIL import Image | |
from music21 import converter | |
from utils import download | |
if sys.platform.startswith('linux'): | |
apkname = 'MuseScore.AppImage' | |
extra_dir = 'squashfs-root' | |
download( | |
filename=apkname, | |
url='https://cdn.jsdelivr.net/musescore/v4.2.0/MuseScore-4.2.0.233521125-x86_64.AppImage' | |
) | |
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 = "D:/Program Files/MuseScore 3/bin/MuseScore3.exe" | |
def abc_to_midi(abc_content, output_midi_path): | |
score = converter.parse(abc_content, format='abc') | |
score.write('midi', fp=output_midi_path) | |
return output_midi_path | |
def abc_to_musicxml(abc_content, output_xml_path): | |
score = converter.parse(abc_content, format='abc') | |
score.write('musicxml', fp=output_xml_path) | |
return output_xml_path | |
def musicxml_to_mxl(xml_path): | |
mxl_file = xml_path.replace('.musicxml', '.mxl') | |
command = [mscore, "-o", mxl_file, xml_path] | |
result = subprocess.run(command) | |
print(result) | |
return mxl_file | |
def midi2wav(mid_file: str): | |
wav_file = mid_file.replace('.mid', '.wav') | |
command = [mscore, "-o", wav_file, mid_file] | |
result = subprocess.run(command) | |
print(result) | |
return wav_file | |
def pdf2img(pdf_path: str): | |
output_path = pdf_path.replace('.pdf', '.jpg') | |
doc = fitz.open(pdf_path) | |
# 创建一个图像列表 | |
images = [] | |
for page_number in range(doc.page_count): | |
page = doc[page_number] | |
# 将页面渲染为图像 | |
image = page.get_pixmap() | |
# 将图像添加到列表 | |
images.append( | |
Image.frombytes( | |
"RGB", | |
[image.width, image.height], | |
image.samples | |
) | |
) | |
# 竖向合并图像 | |
merged_image = Image.new( | |
"RGB", | |
(images[0].width, sum(image.height for image in images)) | |
) | |
y_offset = 0 | |
for image in images: | |
merged_image.paste(image, (0, y_offset)) | |
y_offset += image.height | |
# 保存合并后的图像为JPG | |
merged_image.save(output_path, "JPEG") | |
# 关闭PDF文档 | |
doc.close() | |
return output_path | |
def mxl2jpg(mxl_file: str): | |
pdf_score = mxl_file.replace('.mxl', '.pdf') | |
command = [mscore, "-o", pdf_score, mxl_file] | |
result = subprocess.run(command) | |
print(result) | |
return pdf_score, pdf2img(pdf_score) | |