File size: 2,721 Bytes
20113f2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import os
import tempfile
from midi_utils import process_midi # 我们重用之前的核心处理逻辑

def process_midi_and_provide_download(input_midi_file):
    """

    这个函数会被Gradio调用。

    它接收一个上传的文件,调用处理函数,然后返回一个可供下载的新文件路径。

    """
    # 1. 检查用户是否上传了文件
    if input_midi_file is None:
        raise gr.Error("错误:请先上传一个MIDI文件!")

    print(f"收到的临时文件路径: {input_midi_file.name}")

    # 2. 从Gradio提供的临时文件中读取二进制数据
    with open(input_midi_file.name, 'rb') as f:
        midi_bytes = f.read()

    # 3. 使用我们之前写好的核心MIDI处理函数
    # 这个函数会返回一个包含已处理MIDI数据的内存缓冲区 (BytesIO)
    processed_midi_buffer = process_midi(midi_bytes)

    # 4. 将处理后的数据保存到一个新的临时文件中
    # 这是必要的,因为Gradio需要一个文件路径来创建下载链接
    with tempfile.NamedTemporaryFile(delete=False, suffix=".mid", prefix="processed-") as temp_output_file:
        temp_output_file.write(processed_midi_buffer.getvalue())
        output_file_path = temp_output_file.name
        print(f"已处理的文件已保存到: {output_file_path}")

    # 5. 返回这个新文件的路径,Gradio会自动生成一个下载链接
    return output_file_path

# --- 使用Gradio Blocks创建用户界面 ---
with gr.Blocks(theme=gr.themes.Soft()) as demo:
    # 标题和描述
    gr.Markdown(
        """

        # 🎵 MIDI 处理器 (Gradio版)

        这是一个可以直接在Hugging Face Space中交互的版本。

        """
    )
    gr.Markdown("---")
    gr.Markdown("### 步骤 1: 上传你的MIDI文件")

    # 文件上传组件
    midi_input = gr.File(label="点击或拖拽MIDI文件到这里", file_types=[".mid", ".midi"])

    gr.Markdown("### 步骤 2: 点击按钮进行处理")

    # 处理按钮
    process_button = gr.Button("处理MIDI文件 (所有音符升一个半音)", variant="primary")

    gr.Markdown("### 步骤 3: 下载处理后的文件")

    # 文件输出/下载组件
    midi_output = gr.File(label="处理结果将出现在这里,点击即可下载")
    
    # 将按钮的点击事件连接到我们的处理函数
    process_button.click(
        fn=process_midi_and_provide_download, # 要调用的函数
        inputs=midi_input,                     # 函数的输入来自哪里
        outputs=midi_output                    # 函数的输出更新哪个组件
    )

# 启动Gradio应用
demo.launch()