MIDI中BPM如何调成离谱的数值

提问于
最后更新于
浏览 271次
登录并提问
0

如114514,1919810之类的(好臭)

想调到特定的数值,我用Domino最大只能调到105000bpm,我想调到更大

提问于 Aug 23, 2024, 12:41:23 PM
4

人生苦短,我用Python。

将下列代码保存为py格式文件运行,按提示操作即可。

此代码没有经过事先测试,如有问题欢迎反馈。

import tkinter as tk

from tkinter import filedialog, messagebox

from mido import MidiFile, MidiTrack, MetaMessage


def select_midi():

    global midi_file

    midi_file = filedialog.askopenfilename(filetypes=[("MIDI Files", "*.mid *.midi")])

    if midi_file:

        try:

            mid = MidiFile(midi_file)

            for track in mid.tracks:

                for msg in track:

                    if msg.type == 'set_tempo':

                        bpm = int(60000000 / msg.tempo)

                        bpm_label.config(text=f"当前BPM值: {bpm}")

                        break

        except Exception as e:

            messagebox.showerror("编辑器坏掉了!", "编辑器坏掉了!这不是作者的问题!绝对不是!")

            root.destroy()


def change_bpm():

    try:

        new_bpm = int(bpm_entry.get())

        mid = MidiFile(midi_file)

        for track in mid.tracks:

            for i, msg in enumerate(track):

                if msg.type == 'set_tempo':

                    msg.tempo = int(60000000 / new_bpm)

                    track[i] = msg

                    break

        save_path = midi_file.replace(".mid", f"_new_{new_bpm}.mid")

        mid.save(save_path)

        messagebox.showinfo("疑似是成功了", "已经将更改好的midi保存至脚本所在目录!")

        root.destroy()

    except Exception as e:

        messagebox.showerror("编辑器坏掉了!", "编辑器坏掉了!这不是作者的问题!绝对不是!")

        root.destroy()


root = tk.Tk()

root.title("欢迎使用MIDI BPM 编辑器测试版!(作者:エア小鳥遊さん)")

root.geometry("400x200")


label = tk.Label(root, text="请输入您想要更改的BPM值:")

label.pack(pady=10)


bpm_entry = tk.Entry(root)

bpm_entry.pack(pady=5)

bpm_entry.config(validate="key", validatecommand=(root.register(lambda text: text.isdigit()), '%P'))


bpm_label = tk.Label(root, text="当前BPM值: 未选择文件")

bpm_label.pack(pady=5)


select_button = tk.Button(root, text="选择midi", command=select_midi)

select_button.pack(side="left", padx=20, pady=20)


change_button = tk.Button(root, text="立即更改", command=change_bpm)

change_button.pack(side="right", padx=20, pady=20)


root.mainloop()


回答于 8/23/24, 1:46 PM

您的回答

登录以回答

这儿是 MidiShow 问答区,欢迎您请教或帮大家解决关于音乐创作、MIDI 应用、MIDI 技术等音乐相关的问题。

问答区积分规则如下:


  1. 提问、回答或自问自答积分均不变
  2. 问题被赞成 : +10
  3. 问题被反对 : 提问者 -2,点击反对者不扣分
  4. 回答被赞成 : +10
  5. 回答被反对 : 回答者 -2,点击反对者 -1
  6. 提问者选出满意回答 :回答者 +15 ,提问者 +2

参与问答前请阅读:问答区玩法规则