多个midi节目同时播放?

Posted

技术标签:

【中文标题】多个midi节目同时播放?【英文标题】:Multiple midi programs playing simultaneously? 【发布时间】:2018-09-17 21:32:23 【问题描述】:

我正在使用 mido 库通过 python 控制 amsynth。

到目前为止,这一切都很好......但是我一次只能播放一个“预设”。

我正在尝试使用“program_change”来切换乐器,这样我就可以同时演奏多种乐器。

举个简单的例子:

import mido
from mido import Message
import time

outport = mido.open_output('amsynth:MIDI IN')

msg = Message('note_on', note = 64)
outport.send(msg)
time.sleep(2.0)

msg = Message('program_change', program = 1)
outport.send(msg)

msg = Message('note_on', note = 68) 
outport.send(msg)
time.sleep(2.0)

msg = Message('note_off', note = 64)
outport.send(msg)
time.sleep(0.5)

msg = Message('note_off', note = 68) 
outport.send(msg)
time.sleep(0.5)

但是当我尝试这个时,第一个节目的音符会在我切换频道时被剪掉。

所以问题可能是每个节目都需要在不同的频道上:

import mido
from mido import Message
import time

outport = mido.open_output('amsynth:MIDI IN')

msg = Message('note_on', note = 64, channel = 0)
outport.send(msg)
time.sleep(2.0)

msg = Message('program_change', program = 1)
outport.send(msg)

msg = Message('note_on', note = 68, channel = 1)
outport.send(msg)
time.sleep(2.0)

msg = Message('note_off', note = 64)
outport.send(msg)
time.sleep(0.5)

msg = Message('note_off', note = 68)
outport.send(msg)
time.sleep(0.5)

但这也不起作用。

作为一种解决方法,我一直在考虑运行多个 amsynth 实例......但这对我来说似乎是不正当的。

如何同时演奏多种乐器?

编辑:

听起来我需要在开始播放之前将节目分配给频道,然后像这样按频道播放:

  msg = Message('program_change', program = 23, channel = 1)
  outport.send(msg)

  msg = Message('program_change', program = 3, channel = 2)
  outport.send(msg)

  msg = Message('note_on', note = 64, channel = 1)
  outport.send(msg)
  time.sleep(2.0)

  msg = Message('note_on', note = 68, channel = 2)
  outport.send(msg)
  time.sleep(2.0)

  msg = Message('note_off', note = 64, channel = 1)
  outport.send(msg)
  time.sleep(0.5)

  msg = Message('note_off', note = 68, channel = 2) 
  outport.send(msg)
  time.sleep(0.5)

但是,这会在程序 3 中播放两个音符,所以很遗憾,这不起作用。

【问题讨论】:

AmSynth 不是多音色的,所以没有办法用它的单个实例来做你正在尝试的事情。 会不会是合成器是单声道的还是设置为单声道模式? 【参考方案1】:

使用 MIDI,有 16 个通道。在给定时间,每个频道都可以在一个节目/补丁上。当您调用program_change 时,您正在更改该默认通道的补丁。您应该为另一个通道发送program_change,然后将 MIDI 音符也发送到另一个通道。

【讨论】:

谢谢。我试过这个(请看我的编辑)但是这不起作用。是不是我做错了什么?

以上是关于多个midi节目同时播放?的主要内容,如果未能解决你的问题,请参考以下文章

监狱电教系统多终端同时播放的解决方案

在 Java 中同时播放 .mp3 和一系列音符 (MIDI)

MIDI 播放到同一设备

MIDI文件无法播放,还与Guitar Pro 5.1有关

codeforcesRound#523DTV shows

支持 .MIDI 文件的在线音乐播放器