Python 写 MIDI 文件

标签 python time pygame midi write

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

最佳答案

time规定了音符应该在音乐时间中的位置。参数应该是什么部分取决于 Midi 文件对象的构造方式(稍后会详细介绍)
实际上,MIDI 要求每个音符有两条消息:a NOTE On消息和 NOTE Off信息。 duration将指示何时 Note Off消息应该被发送,相对于笔记的开始。同样,参数的形成方式取决于文件对象的构造方式。
来自 MIDIUtil docs :

  • time – the time at which the note sounds. The value can be either quarter notes [Float], or ticks [Integer]. Ticks may be specified by passing eventtime_is_ticks=True to the MIDIFile constructor. The default is quarter notes.
  • duration – the duration of the note. Like the time argument, the value can be either quarter notes [Float], or ticks [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 消息。
另一个例子
让我们尝试将其应用于以下音乐短语:
musical phrase
首先,设置一切。
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)

关于Python 写 MIDI 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64838592/

相关文章:

python - 带有前导 $ 字符的正则表达式命名捕获组替代方案

python - 是否可以在 Python 中引发内置异常,但使用不同的消息?

调试时的 C++ 计时

python - 我如何用 Pygame 计算鼠标速度?

python - 使用 Tkinter 时出现致命的 python 错误(pygame 降落伞)段错误

python - PyQt - 如何检查 QDialog 是否可见?

Python Eclipse Paho 客户端 - 与 MQTT 代理的 TLS 连接异常 : No ciphers available

java - 如何以 12 小时格式而不是 24 小时格式显示时间 - timeEt.setIs24HourView(false);不管用

ruby-on-rails - rails : active record saving time:type with unwanted format

python - 使用PyGame播放音频文件时的时间安排不正确