每个音符的纯数据弯音

时间:2015-09-22 12:45:41

标签: audio midi puredata

似乎Pd只有全局MIDI弯音控制。如何为个别音符发送不同的弯音事件?

在Pd扩展中,我制作了一个简单的补丁,从MIDI中读取并将相同的音符写入MIDI输出。现在我想根据查找表为每个传入的音符改变音高弯曲事件单独,因此MIDI输出音符会根据音符中的MIDI进行不同的弯曲。

有什么想法吗?

4 个答案:

答案 0 :(得分:5)

弯音是channel voice message意味着它适用于整个频道,因此没有直接的方法来做你想要的。唯一可行的解​​决方案是非常间接的,它将使用多个通道,每个通道配置为播放相同的声音,然后将传入的音符分开,使得每个通道上一次只播放一个音符。这种方法的一个典型例子是吉他的MIDI拾音器 - 每个琴弦都有一个拾音器。他们将每个拾音器分配给一个谨慎的MIDI通道,然后他们可以将字符串弯曲映射到各个字符串的音高弯曲(有时很差)。

答案 1 :(得分:3)

这是MIDI协议的限制,取决于你想要做什么,你可能想要查看OSC(OpenSoundControl),HD-MIDI或简单的FUDI。

答案 2 :(得分:2)

因此您似乎意识到MIDI的限制(每个通道只有一个弯音参数),但是想要为每个音符单独形成音高弯曲值。

假设您创建了128个表(名为“bend1”..“bend128”),每个16383值为long,包含一个查找表,用于在输入pitchbend值(-8192 .. + 8192)和输出pitchbend值之间进行转换(来自-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-notenumber获得频率并将其发送到你最喜欢的[osc~]。

答案 3 :(得分:0)

使用纯数据,你可以通过使用midi CC来进行实时音高变换或者分配"注意触后"以此目的。