繁体   English   中英

写入 MIDI 文件

[英]Write MIDI file

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

那么,如何计算音符的“时间”和“持续时间”?

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

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

MIDIUtil 文档

  • time – 音符响起的时间。 该值可以是四分音符 [Float] 或刻度 [Integer]。 可以通过将 eventtime_is_ticks=True 传递给 MIDIFile 构造函数来指定刻度。 默认为四分音符。
  • 持续时间——音符的持续时间。 与时间参数一样,该值可以是四分音符 [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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM