首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写MIDI文件

编写MIDI文件
EN

Stack Overflow用户
提问于 2020-11-14 21:04:12
回答 1查看 1.1K关注 0票数 4

我想写一个MIDI文件的输入,我从数字钢琴,我已经连接。我使用pygame.midi打开输入端口,使用midiutil编写MIDI文件。我不明白的是时机的问题。例如,在addNote(track, channel, pitch, time, duration, volume)中,我如何知道便条的timeduration是什么?当我读便条的时候,我的音高和音量都很好,但是其他的我不知道.我试着使用时间戳,但没有用,它将便条放在MIDI文件中。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-14 22:47:52

time规定音乐时间的位置,音符应该播放。确切的参数应该是什么在一定程度上取决于Midi文件对象是如何构造的(稍后会有更多信息)

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

来自MIDIUtil文档

  • 时间-音符发出声音的时间。这个值可以是四分之一纸币浮动,也可以是滴答整数。可以通过将eventtime_is_ticks=True传递给MIDIFile构造函数来指定滴答。默认的是季度笔记。
  • 持续时间-笔记的持续时间。与时间参数一样,值可以是四分之一音符浮动,也可以是滴答整数。

一个完整的例子,它演奏C大音阶。

代码语言:javascript
复制
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消息。

另一个例子

让我们尝试将其应用于以下音乐短语:

首先,把一切都安排好。

代码语言:javascript
复制
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上加上四分之一注:

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
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)
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64838592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档