json转mid文件问题

json转mid文件问题

要求把json文件转为mid文件
python的库转不了
json文件链接:https://pan.baidu.com/s/1Epyv1FURdph39LP14dZbEQ?pwd=tc91
提取码:tc91
json文件部分内容:

{"ver":1,"rightHandTrack":0,"roughProgress":false,"beats":4,"tempos":[{"tempo":857142,"tick":1920},{"tempo":625000,"tick":9840}],"leftHandTrack":1,"tracks":[{"channel":0,"name":"","program":0},{"channel":0,"name":"","program":0}],"measures":{"40560":{"duration":1920,"note_ticks":[0,240,480,720,840,960,1200,1440,1680],"measure":20},"9840":{"duration":1920,"note_ticks":[0,240,480,720,960,1200,1440,1680],"measure":4},"17520":{"duration":1920,"note_ticks":[0,240,480,720,960,1200,1440,1680],"measure":8},"44400":{"duration":1920,"note_ticks":[0,240,480,720,960,1200,1440],"measure":22},"61680":{"duration":1920,"note_ticks":[0,240,480,720,960,1200,1440,1680],"measure":31},"5760":{"duration":2040,"note_ticks":[0,240,360,480,600,720,960,1200,1440],"measure":2},"19440":{"duration":1920,"note_ticks":[0,240,480,720,960,1440],"measure":9},"38640":{"duration":1920,"note_ticks":[0,240,480,720,960,1200,1440,1680],"measure":19},"65520":{"duration":1920,"note_ticks":[0,240,480,720,960,1200,1440,1680],"measure":33},"13680":{"duration":1920,"note_ticks":[0,240,480,720,960,1200,1440,1680],"measure":6},"59760":{"duration":1920,"note_ticks":[0,240,480,720,960,1200,1440,1680],"measure":30},"73200":{"duration":1920,"note_ticks":[0],"measure":37},"63600":{"duration":1920,"note_ticks":[0,240,480,720,960,1200,1440,1680],"measure":32},"71280":{"duration":1920,"note_ticks":[0,240,480,720,960,1200,1440,1680],"measure":36},"75120":{"duration":1920,"note_ticks":[],"measure":38},"27120":{"duration":1920,"note_ticks":[0,240,480,720,960],"measure":13},"34800":{"duration":1920,"note_ticks":[0,240,480,720,960],"measure":17},"23280":{"duration":1920,"note_ticks":[0,240,480,720,960,1200,1440,1680],"measure":11},"30960":{"duration":1920,"note_ticks":[0,240,480],"measure":15},"55920":{"duration":1920,"note_ticks":[0,240,480,720,960,1200,1440,1680],"measure":28},"25200":{"duration":1920,"note_ticks":[0,240,480,720,960,1200,1440,1680],"measure":12},"57840":{"duration":1920,"note_ticks":[0,240,480,720,960,1200,1440,1680],"measure":29},"32880":{"duration":1920,"note_ticks":[0,240,480,720,960,1200,1440,1680],"measure":16},"11760":{"duration":1920,"note_ticks":[0,240,480,720,960,1440],"measure":5},"15600":{"duration":1920,"note_ticks":[0,480,960],"measure":7},"21360":{"duration":1920,"note_ticks":[0,240,480,960,1200,1440,1680],"measure":10},"46320":{"duration":1920,"note_ticks":[0,240,480,720,960,1200,1440,1680],"measure":23},"69360":{"duration":1920,"note_ticks":[0,240,480,720,960,1200,1440,1680],"measure":35},"36720":{"duration":1920,"note_ticks":[0,240,480,960,1200,1440,1680],"measure":18},"42480":{"duration":1920,"note_ticks":[0,240,480,720,960,1200,1440,1680],"measure":21},"48240":{"duration":1920,"note_ticks":[0,240,480,720,840,960,1200,1440,1680],"measure":24},"67440":{"duration":1920,"note_ticks":[0,240,480,960,1200,1440,1680],"measure":34},"29040":{"duration":1920,"note_ticks":[0,240,480,720,960,1200,1440],"measure":14},"52080":{"duration":1920,"note_ticks":[0,240,480,960,1200,1440,1680],"measure":26},"1920":{"duration":1920,"note_ticks":[0],"measure":0},"50160":{"duration":1920,"note_ticks":[0,240,480,720,960,1200,1440,1680],"measure":25},"54000":{"duration":1920,"note_ticks":[0,240,480,720,960,1200,1440,1680],"measure":27},"7800":{"duration":2040,"note_ticks":[],"measure":3},"3840":{"duration":1920,"note_ticks":[0],"measure":1}},"beatsUnit":4,"measureInfos":[],"lyrics":[],"events":[{"repeatIndex":0,"duration":0,"tick":0,"track":0,"event":[176,7,100]},{"repeatIndex":0,"duration":0,"tick":0,"track":1,"event":[176,7,100]},{"repeatIndex":0,"duration":0,"tick":0,"track":1,"event":[176,64,0]},{"repeatIndex":0,"duration":0,"tick":0,"track":0,"event":[192,0,0]},{"repeatIndex":0,"duration":0,"tick":0,"track":1,"event":[192,0,0]},{"finger":0,"note":0,"part":0,"repeatIndex":0,"staff":1,"tick":1840,"duration":1800,"measure":0,"elem_ids":["n_0_0"],"meas_start_tick":1920,"id":"n_0_0","track":0,"event":[144,83,51]},

他结构不太一样吧?

【相关推荐】




如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

援引讯飞星火:
首先,你需要将json文件转换为midi文件。可以使用在线工具或者本地软件进行转换。这里以本地软件为例,使用Python的库pydubmido来实现。

  1. 安装所需库:
pip install pydub mido
  1. 编写代码:
import json
from mido import MidiFile, MidiTrack, Message
from pydub import AudioSegment

# 读取json文件
with open('json_file.json', 'r') as f:
    data = json.load(f)

# 创建一个新的MIDI文件
midi = MidiFile()
track = MidiTrack()
midi.tracks.append(track)

# 设置轨道和时间
track.append(Message('set_tempo', tempo=500000, time=0))

# 遍历json数据,将音符添加到MIDI轨道
for item in data:
    if item['measureInfos']:
        measure_time = 0
        for note_tick in item['measureInfos'][0]['note_ticks']:
            track.append(Message('note_on', note=note_tick[2], velocity=note_tick[3], time=measure_time))
            track.append(Message('note_off', note=note_tick[2], velocity=note_tick[3], time=measure_time + note_tick[4]))
            measure_time += note_tick[4]

# 保存MIDI文件
midi.save('output.mid')

这段代码将读取json文件,提取音符信息,并将其添加到一个新的MIDI文件中。最后,将MIDI文件保存为output.mid

使用Python的JSON库解析JSON文件,将其中的数据提取出来。
根据提取出的数据,使用适当的库或工具来生成音乐数据。MIDI文件包含音符、乐器、时序等信息,你需要根据数据来创建这些信息。

GPT的回答,有用可以采纳一下,谢谢!

当然!下面是将JSON文件转换为MID文件的Python操作步骤:

  1. 确保您已经安装了所需的库。在Python中,您可以使用json库来处理JSON文件,使用mido库来处理MIDI文件。如果您尚未安装这些库,可以使用以下命令安装它们:

    pip install json
    pip install mido
    
  2. 导入所需的库。在Python脚本的开头,使用以下代码导入jsonmido库:

    import json
    import mido
    
  3. 打开JSON文件并解析为Python对象。假设JSON文件名为data.json,您可以按照以下方式打开并解析它:

    with open('data.json') as file:
     data = json.load(file)
    

    现在,您可以通过`变量访问JSON文件中的数据了。

  4. 创建MIDI文件。使用mido库创建一个新的MIDI文件对象,并设置要生成的MID文件的属性,例如MIDI类型、时间分辨率等。以下是一个示例代码:
    ```python

    创建MIDI文件对象

    mid = mido.MidiFile(ticks_per_beat=480)

添加轨道到MIDI文件

track = mido.MidiTrack()
mid.tracks.append(track)

这会创建一个具有默认时间分辨率的MIDI文件,并添加一个空的轨道。

5. 根据JSON数据创建MIDI事件。根据JSON数据中的内容,使用`mido`库添加相应的MIDI事件到轨道中。您可以使用循环来遍历JSON数据并根据需要添加MIDI事件。以下是一个示例代码:
```python
for event in data['events']:
    # 根据JSON中的事件类型创建相应的MIDI事件
    if event['type'] == 'note_on':
        msg = mido.Message('note_on', note=event['note'], velocity=event['velocity'], time=event['time'])
    elif event['type'] == 'note_off':
        msg = mido.Message('note_off', note=event['note'], velocity=event['velocity'], time=event['time'])
    # 添加MIDI事件到轨道中
    track.append(msg)

在这个示例中,假设JSON数据具有events键,它包含一个包含诸如音符开和音符关等事件的列表。您需要根据您的JSON文件结构和内容相应地更改代码。

  1. 保存MIDI文件。使用mido库将生成的MIDI文件保存为MID文件。以下是一个示例代码:
    mid.save('output.mid')
    
    此代码将生成的MIDI文件保存为名为output.mid的文件。

完整的示例代码如下所示:

import json
import mido

with open('data.json') as file:
    data = json.load(file)

mid = mido.MidiFile(ticks_per_beat=480)
track = mido.MidiTrack()
mid.tracks.append(track)

for event in data['events']:
    if event['type'] == 'note_on':
        msg = mido.Message('note_on', note=event['note'], velocity=event['velocity'], time=event['time'])
    elif event['type'] == 'note_off':
        msg = mido.Message('note_off', note=event['note'], velocity=event['velocity'], time=event['time'])
    track.append(msg)

mid.save('output.mid')

请确保将上述代码中的data.json替换为实际的JSON文件名。此代码将根据JSON文件中的内容生成一个MID文件,并将其保存为output.mid

希望这些步骤可以帮助您将JSON文件成功转换为MID文件。如果有任何问题,请随时提问。