Pd 似乎只有一个全局 MIDI 弯音控制。如何为单个音符发送不同的弯音事件?
在 Pd 扩展中,我制作了一个简单的补丁,它从 MIDI 读取并将相同的音符写入 MIDI 输出。现在我想根据查找表为每个传入音符单独更改弯音事件,因此 MIDI 输出音符的弯曲取决于 MIDI 输入音符。
有任何想法吗?
弯音是一种channel voice message
适用于整个通道的含义,因此没有直接的方法可以做你想做的事。唯一可能的解决方案是非常间接的,它会使用多个通道,每个通道都配置为播放相同的声音,然后将传入的音符分开,这样每个通道上一次只播放一个音符。这种方法的一个典型例子是吉他的 MIDI 拾音器——每根弦都有一个拾音器。他们将每个拾音器分配给一个谨慎的 MIDI 通道,然后他们可以将琴弦弯曲映射到各个琴弦的弯音(有时效果不佳)。
这是 MIDI 协议的限制,取决于您想要做什么,您可能想要查看 OSC (OpenSoundControl)、HD-MIDI 或简单的 FUDI。
所以您似乎知道 MIDI 的局限性(每个通道只有一个弯音参数),但想为每个音符单独调整弯音值。
假设您创建了 128 个表(命名为“bend1”..“bend128”),每个表有 16383 个值长,其中包含一个查找表,用于在输入弯音值(-8192..+8192)和输出弯音值(从 -1. .+1),那么您可以执行以下操作:
[notein 1]
| |
[t b f] |
| +---------+ |
| | |
| [bendin 1] | |
| | | |
[f ] [t f f] |
| | | |
[+ 8192] [set array$1( | |
| ______________+ | |
|/ / |
[tabread] / |
| / |
[* 12] / |
| / |
[+ ] |
| |
[noteout 1]
这将根据单独形状的弯音值修改每个 MIDI 音符。主要缺点是,[noteout] 将发送 MIDI 音符(由于 MIDI 的限制只能是整数值),因此输出将被量化为半音:-(
但是,如果您在 Pd 中进行合成,那么您可以使用分形音符值:只需将它们发送到 [mtof] 以从 MIDI 音符编号获取频率并将其发送到您最喜欢的 [osc~]。
使用纯数据,您可以通过使用 midi CC 来进行实时音高转换来解决此问题,或者为此指定“音符触后”。