【问题标题】:Write MIDI filePython 编写 MIDI 文件
【发布时间】:2021-02-26 12:07:07
【问题描述】:

我想用我从连接的数码钢琴收到的输入来编写一个 MIDI 文件。我正在使用 pygame.midi 打开一个输入端口并使用 midiutil 来编写 MIDI 文件。我无法理解的是时机。例如,在addNote(track, channel, pitch, time, duration, volume) 中,我如何知道注释的timeduration 是什么?阅读音符时,我的音高和音量都很好,但其他我不知道...我尝试使用时间戳但无济于事,它将音符放在 MIDI 文件中非常远的地方。

那么,我如何计算笔记的“时间”和“持续时间”?

【问题讨论】:

    标签: python time pygame midi write


    【解决方案1】:

    time 指示音符应在音乐时间中播放的位置。确切的参数应该是什么部分取决于 Midi 文件对象的构造方式(稍后会详细介绍)

    ​​>

    在实践中,MIDI 要求每个音符发送两条消息:NOTE On 消息和 NOTE Off 消息。 duration 将指示何时应该发送 Note Off 消息,相对于注释的开头。同样,参数的形成方式取决于文件对象的构造方式。

    来自MIDIUtil docs

    • time – 音符响起的时间。该值可以是四分音符 [Float],或者 勾选 [整数]。可以通过将 eventtime_is_ticks=True 传递给 MIDIFile 来指定刻度 构造函数。默认为四分音符。
    • duration – 音符的持续时间。与时间参数一样,该值可以是 四分音符 [Float],或记号 [Integer]

    演奏C大调音阶的完整例子

    from midiutil import MIDIFile
    degrees = [60, 62, 64, 65, 67, 69, 71, 72] # MIDI note number
    track = 0
    channel = 0
    time = 0 # In beats
    duration = 1 # In beats
    tempo = 60 # In BPM
    volume = 100 # 0-127, as per the MIDI standard
    MyMIDI = MIDIFile(1) # One track, defaults to format 1 (tempo track
    # automatically created)
    MyMIDI.addTempo(track,time, tempo)
    for pitch in degrees:
        MyMIDI.addNote(track, channel, pitch, time, duration, volume)
        time = time + 1
    with open("major-scale.mid", "wb") as output_file:
        MyMIDI.writeFile(output_file)
    

    文件tempo(在当前时间)结合音符的位置(time)和duration(根据多少节拍),库可以合成在正确时间播放(开始/停止)音符所需的所有 MIDI 消息。

    另一个例子

    让我们试着把它应用到下面的乐句上:

    首先,设置好一切。

    from midiutil import MIDIFile
    track = 0
    channel = 0
    time = 0 # In beats
    duration = 1 # In beats
    tempo = 60 # In BPM
    volume = 100 # 0-127, as per the MIDI standard
    MyMIDI = MIDIFile(1) # One track, defaults to format 1 (tempo track
    # automatically created)
    MyMIDI.addTempo(track,time, tempo)
    

    在 E 上添加前二分音符,在 G 上添加四分音符:

    time = 0  # it's the first beat of the piece
    quarter_note = 1  # equal to one beat, assuming x/4 time
    half_note = 2 # Half notes are 2x value of a single quarter note
    E3 = 64  # MIDI note value for E3
    G3 = 67
    
    # Add half note
    MyMIDI.addNote(track, channel, pitch=E3, duration=half_note, time=0, volume=volume)
    # Add quarter note
    MyMIDI.addNote(track, channel, pitch=G3, duration=quarter_note, time=0, volume=volume)
    

    现在让我们添加剩余的注释:

    A3 = 69
    C3 = 60
    B3 = 71
    C4 = 72
    
    # add the remaining notes
    for time, pitch, duration in [(1,A3, quarter_note),
                                  (2,B3, quarter_note), (2, C3, half_note), 
                                  (3,C4, quarter_note)]:
        MyMIDI.addNote(track, channel, 
                       duration=duration, 
                       pitch=pitch, time=time, volume=volume)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多