共振峰P432的内部世界



我如何意外地购买了合成器,对其进行了修理,弄清了它的工作原理并编写了一个模拟器的故事。

这个故事始于2019年8月最后一个周末的混沌建筑节。 晚上,我在Avito上浏览以寻找过去时代的有趣文物,我遇到了一款便宜的Formant P432合成器。 对于数字合成器而言,它看起来非常熟悉:下部有41个按键(3.5个八度)的键盘,上部有用于选择音调,打开合唱和统一效果的按钮以及用于调节颤音效果的旋钮。 操纵杆安装在键盘的左侧,可让您上下移动音高,并平稳地连接颤音。

对我而言,最有趣的是,该合成器是数字的,并且使用波表方法生成声音,也就是说,在按下键时,它会根据存储在ROM芯片中的表格数据生成声音。 快速了解Internet上的电路后,很明显,合成器控制基于著名的微处理器KP580VM80(i8080),声音存储在8个ROM芯片中,总容量为8 * 2 = 16 Kb。

购买了合成器,然后从卖方所在的城市出发,逐步将其运送到运输公司的当地办事处,我继续研究这些方案。 卖方在广告中写道,该工具存在缺陷,当您按下多个键时,该缺陷会以喘息的形式显现出来。 我想,这更有趣。 “有必要找到并消除。”

但是购买的主要动机是希望处理内部设备并从合成器的ROM中提取声音样本。

免责声明 :合成器节点和信号的组成部分的名称(“引号”和BIG字母中指示的名称除外)是我发明的,可能与开发人员的意图不同。 节点操作的描述是基于我(有限的)知识,Internet上的材料以及经验丰富的人员的建议。


当P432 [ 2 ]放心地到达我的声音时,我要做的第一件事就是拆开它。 里面的电线束和几块印刷电路板让我感到不愉快。

控制节点
板上焊接了前面板的按钮和控件,并指示了操作模式。

处理器节点
它包含KR580VM80微处理器和580套件的其他芯片,RF2上的2 KB ROM,两个总容量为256字节(K541RU2)的静态RAM芯片。 另外,解码器安装在板上,通过控制按钮和寄存器分配地址空间的一部分,以便与键盘交互,并在其输出处为生成器节点生成控制信号。

MIDI接口节点
它安装在处理器节点上方,由带有MIDI消息例程,精细逻辑和两个大型微电路的单独ROM组成:串联的VN59中断控制器和BB51接口。 具有光耦合器隔离的标准Midi电流环路实现电路连接到TX / RX VN51触点。

合唱团结
采用仅模拟输入,输出和电源的隔离板形式。 它在KA528BR2微电路-模拟延迟线上实现。 单元非常嘈杂,但给声音带来了有趣的色彩。

发电机总成
合成器的主要模块。 它包含8个ROM芯片,每个2 KB,数字逻辑(寄存器,加法器),两个DAC,具有可变参数和热稳定性的模拟滤波器。 该节点还包含一个时钟发生器,通过该时钟发生器可以同步处理器节点的寄存器的操作。 该节点上的子板具有VCO(压控发电机)板,这是合成器以后版本的工厂改进。

整流器和稳定器组件
线性电源,其逻辑电源产生+ 5V电压,而运算放大器则产生+12 / -15V电压。 + 5V由KR142EN5稳定,其辐射器是合成器的金属外壳,而+ 12 / -15V是齐纳二极管和晶体管上最简单的参数稳定器。 KR580VM50的-5V附加电源电压由一个-15V的齐纳二极管直接形成在处理器单元板上。 模拟和数字地分开分开,并且仅在此块中连接。

乐器键盘
簧片开关,对速度不敏感,就像在Formant的Kachkanar无线电工厂的其他合成器上一样。



删除带有ROM的单独板上的MIDI节点是由于P432系列中存在另一个合成器-“ Formant MINI”,它没有MIDI接口和HOR效果。 MINI处理器节点的固件稍有不同,并且生成器节点与P432相同。

因此,当我第一次打开电源时,我注意到了两个问题:线性输出的信号电平很弱,以及一次按下多个键时已经提到的声音。 应该注意的是,P432是一种复音合成器,它可以同时播放一种音色的4种声音(频率)。 加上UNISON效果,同时发声的声音数增加到8,每个键两个。

几乎立即发现了声音安静的原因,这归咎于烧毁的输出OU K544UD1A。

更换后,即使将无源耳机连接到输出,该乐器也开始响亮。

但是声音很奇怪,情况非常令人费解,因为即使按了单个键,音调的声音也不像youtube上的P432演示那样。

找到问题花费了相当长的时间,但最终它被定位在主DAC的级别。 数字输入的高位不足以将其识别为逻辑1,因此模拟输出信号失真。 发现并消除了这个故事的罪魁祸首,之后问题得以解决。 轻按几下,所有音调都开始听起来清晰且没有问题。

历史将结束,但是维修已经花了很多时间,所以我决定我们不应该在那儿停下来,我们需要弄清楚:

  • 声音合成过程如何
  • 存储在发生器单元ROM中的内容
  • 过滤器的工作原理及其特点
  • 存储每个音调和包络参数的配置的位置

这项工作的结果是使用原始ROM中的数据对P432进行软件仿真。

发电机总成


发生器单元主DAC输出处的波形是根据直接数字合成(DDS)[ 1 ]的原理形成的。 接收的模拟信号通过低通滤波器,然后,如有必要,将其与合唱装置的输出混合,由输出放大器放大,然后馈入线性输出。 P432中的滤波器是根据先前在Polyvox合成器[ 3 ]中使用的方案制成的。


该图显示了发电机单元及其主要功能块。 橙色箭头指示外部数字信号的输入和输出,黑色-模块内部的数字信号,蓝色-模拟信号。


首先,考虑输入和输出:

  • 输入“频率”(11位)-对于每个声音(包括统一声),与按下的键或MIDI音符相对应的值都来自处理器节点。
  • 放大器输入(8位)—信号幅度的包络值。
  • 输入“滤波器”(8位)-滤波器截止频率的包络值。
  • “控制”输入-(8位)-3个最低有效位用于波形选择,2位用于滤波器偏移,2位用于Q滤波器质量水平Q(谐振),最后一位确定UNISON效果是打开还是关闭。
  • 输出“地址”(3位)-负责与处理器节点同步。

现在,让我们看看节点的主要模块是如何工作的。

同步电路借助多谐振荡器,计数器和逻辑元件为发生器单元的各个模块生成控制脉冲,并将当前的语音编号提供给输出“地址”。 当UNISON“地址”模式处于活动状态时,它将采用[0,1,2,3,4,5,6,7]值,而在非活动状态时则为[0,2,4,6]。 可以使用前面板上的调节旋钮和键盘左侧的操纵杆在很小的程度上更改主振荡器的频率。

时钟脉冲时序图。 说明:Unison-日志。 0有效电平,FA0-2-“地址”输出,DD8-12-相位累加器寄存器,DD33-35-表决总寄存器,DD36-37-DAC寄存器。


生成器板的数字部分(每4(8)个投票)同时更改输出“地址”的值,执行以下操作。 “频率”输入从处理器节点接收信号频率值。 频率的线性值由ROM上的解码器转换为相位增量。 增量在相位累加器(20位)中求和,相位累加器由加法器和8字RAM组成。 总和的最高9位被馈送到波形ROM的地址输入。 通过“控制”输入的三个最低有效位选择特定的ROM区域。 将ROM输出的10位与“放大器”输入处的值相加,并馈送到定标ROM的输入,后者为DAC生成双极性代码。 输出结果落入加法器和寄存器基础上的累加缓冲区,累加缓冲区按顺序对所有4(8)票的代码值求和。 在每个周期的最后,最终代码被存储寄存器锁存,并到达12位DAC。 在DAC上发出代码的频率是信号的采样频率,对于P432,约为33赫兹。 根据Nyquist的说法,P432发生器可用的最大声音频率约为16.5 kHz。

如果所选音色需要动态更改低通滤波器参数,则将包络值输出到滤波器输入,该输入通过10位DAC形成运放滤波器的控制电压。 该低通滤波器是根据可变状态滤波器的非冷凝器滤波器而制成的,并且包括温度稳定电路,用于改变Q的Q因子的块以及初始偏置。


此时序图显示了生成器板的两个离散周期。 UNISON已关闭。 与地址更改同步的频率输入(Freq_in)接收四个不同键的频率编号。 但是仅按下它们中的最后两个(Volume_in = 0xFF)。 同时,将常量值(Filter_in = 0x60)分配给“过滤器”输入。 捕捉到存储寄存器(DD36-37)之后,最终代码将输入到DAC(DAC)。

对于包括UNISON
一切看起来都一样,只有“ Frequency”输入接收到一对数字:代表主声音和统一声。

注意:仅显示一个期间。



发电机组件的详细说明


以下是希望更详细地了解合成器设备的人员的详细信息和电气示意图。 尽管在我的合成器上附有操作手册[ 4 ]和整套纸质电路[ 5 ],但这些电路都可以在Internet上找到。 好人在一个论坛中与所有ROM的内容共享存档,但事实证明,其中一个文件有错误,因此我不得不退订单个ROM,并将它们与存档中的固件进行比较。

应当注意的是,在生产P432的过程中,制造商发布了一些合成板的修订版,以改善技术特性,这可能与下面介绍的第一个修订方案有所不同。



  1. 在两个573RF2上执行的频率增量转换ROM-DD1-2包含一个线性频率值与指数相位增量的对应表。 以图形方式显示,其内容如下所示



    与输出“地址”上的值变化同步,处理器节点将对应语音的11位频率值发布到输入“频率”,该频率值转换为16位增量。

    如果我们考虑DD1-2的前16个单词的内容,那么那里会写一些奇怪的数字,这些数字似乎没有用于声音的合成:

  2. 相位累加器-由DD3-7加法器(561IM1)和DD8-12寄存器(561IR11)组成。 加法器包含在链中,总容量为20位。 寄存器块允许您存储八个20字节信号相位值。 读/写寄存器的地址输入连接到总线“地址”。 通过此包含,您可以在时钟脉冲的输出处接收先前的值,并从输入中保存当前值。 这确保了每个语音合成器的相位分别累加。 寄存器输出的高9位被馈送到波形ROM的地址输入。
  3. ROM波形-DD13-14,DD18-19(5732)包含可由发生器组件合成的八个波形表。 通过“控制”信号的位S0-S2选择特定的存储区域和一对ROM。 在每个信号的描述下,以11位的位容量分配512个字。 最高的10位具有实用目的,指示信号的极性:1阳性,0阴性。 考虑到负值的反转,给出了波形的外观:

    Wave_00
    Wave_01
    Wave_02
    Wave_03
    Wave_04
    Wave_05
    Wave_06
    Wave_07
  4. 包络加法器-放大器输入端接收8个包络位(向左移2位),这些包络在DD23-25(561IM1)元素上与波形ROM输出的10个最低位相加。 包络具有4个阶段:起音,衰减,延音,释放,由处理器单元根据4个主要声音的每一个分别形成,具体取决于按下/释放键的时间。
    音调00的包络示例:清晰可见到快速攻击到255,然后下降到支撑239,然后平滑降低,最终在松开琴键时衰减为0。 横轴是时间(秒),纵轴是“放大器”输入的值。

    输入\“放大器\”的包络


    选择合成器ROM中的值,使得“放大器”的输入为0时,DAC的输出也将具有零信号电平,尽管事实上所有中间电路都会不断更改变量的值并生成不同的信号。
  5. 由DD27-28(5732)组成的缩放ROM包含一些曲线,用于根据波形的高阶位的值获得双极性信号的代码。 以图形形式,ROM的内容如下所示。



    如果第10位为1,则使用来自输出DD28 + 256的值,如果为0,则使用DD27 + 1。
  6. DD30-32(561IM1)上的票的累加器和DD33-DD35(5619)的寄存器在发给DAC之前混合所有票的代码值。 处理完最后一个语音的代码后,将接收到的值进一步传输到存储寄存器,并将加法器寄存器重置为零。

    示例:如上所述,如果“放大器” = 0,并且在波形ROM的输出处最大可能的振幅值(1 << 10)-1 = 1023,则在缩放ROM的输出处我们将得到0 + 256或255+ 1取决于波形的10位,总共为256 * 8 = 2048,并且对应于DAC输出的0。
  7. 在采样间隔期间,元素DD36-37(555TM9)上的存储寄存器在输出处接收并存储代码值。 生成器节点的采样频率大约等于33000 Hz。
  8. DA38 DAC(534PA1)-将12位值转换为模拟双极性信号,代码2048对应于模拟0。
  9. 低通滤波器-根据弗拉基米尔·库兹明(Vladimir Kuzmin)为Polivox合成器开发的方案而构建,但是,为P 432添加了用于OA滤波器控制电流热稳定的节点。 此外,它取自相同的Polivox,用于稳定发电机的频率。 在作者的网站上,您可以找到有关如何配置此节点的说明[ 6 ]。

    关于过滤器本身的文章已经很多,所以我们可以不用做任何细节。
    滤波器控制建立在一个10位DAC(572PA1)上,该输入的输入端带有一个8位“滤波器”信号,即滤波器的包络线,根据音色,它可以是一个恒定值,通常等于零。 滤波器参数还受到“控制”信号的4位值的影响:F0-F1设置DAC输出电压的偏移,而Q0-Q1负责滤波器的品质因数(谐振水平)。
  10. 在滤波器之后,安装了一个开关,使您能够与通过HOP效果处理过的副本的主信号混合。 在P432的早期修改中,当未按任何键时,使用同一开关关闭声音输出。 但是在后来的修订中,这被拒绝了,他们开始切割路径,扔电线并为电路添加新的元件。
  11. 放大器-将输出信号电平提高到250mV。

CPU配置和节点


因此,我们找出了发电机。 现在,仍然需要了解所有控制信号的来源以及描述它们的参数的存储位置。

最初,我计划通过逻辑分析仪删除所有控制信号的转储,并提出一种算法来描述它们。 例如,放大器和滤波器的包络可以通过分段线性函数来描述,该函数需要有限数量的参数。

使用“频率”输入,它足以记录每个音色的单个琴键的频率值,并据此计算所有其他音色。

根据说明手册,P432具有41键键盘,其音量为3和5/12八度,科学表示法范围为C1-E4或亥姆霍兹表示法范围为C1-e1。 但是,实际上(对于音调00),基于对应关系A4 = 440 Hz,事实证明,左后八度的音调A会产生该频率的声音,并且已经给出了C3-E6范围。 后来证明,根据有效音调,再现频率的范围可以变化1或2个八度。

我还记录了逻辑分析仪从“控制”输入获得的所有可能音调的字节值,并将它们带到板上。

声音和控制输入值列表

显然,所有这些配置参数都应存储在一个合成器ROM中,稍作搜索后,就可以在处理器节点上DD16固件的后半部分找到它们。让我提醒您,ROM 573RF2的容量为2048字节。



1024字节的配置区域很容易分成32个音调,为每个音色的设置分配32字节。我花了很多时间来寻找音调设置与包络的实际相位,声音频率等之间的相关性。我不得不查看逻辑分析器的许多转储。

结果就是这样一个表。
它不包括所有配置字节,因为它们要么是00 / FF,要么尚未被解密。
字节数记号内容描述
0FA_min初始包络滤波器攻击值
1个FA_dt增量过滤器攻击值
2最大FA
3
4FD_ft
5FD_dt
6FS_lvl
7FREQ_u1
8FS_ft
9FS_dt
10FR_ft
11FR_dt
12
1300
14FREQ_u2
15Ctrl«»
16A_min
17A_dt
18岁A_max
19FF
20D_ft
21D_dt
22S_lvl
23FF
24S_ft
2500
2600
27R_dt
28
29日00
30FREQ_1
31FREQ_2

从表中可以看出,所有值都可以分为四组:输入``放大器''的包络的描述,输入``滤波器''的包络,输入``控制''的字节以及负责输入``频率''上主音和UNISON频率的字节。

让我们使用我首先处理的放大器包络示例更详细地考虑它们。滤波器包络的形成方式类似,只是有一些音调需要使用硬编码,因为不可能以不同的方式获得正确的包络。

带后缀* _dt的参数指定相应相位的信号电平变化的增量,例如,对于音频00:A_min = 0,A_dt = 48和A_max = 255。这意味着必须将攻击0的初始值增加48,直到达到255。对于下降阶段,必须将D_dt的值从A_max减小到S_lvl级别,如果S_ft> 0,则支撑级别应随每个S_ft间隔减少1,模拟声音逐渐消失。 R_dt参数指示衰减阶段的增量:必须在每个时间间隔内将当前包络电平减小R_dt,直到达到电平0。如果参数* _dt <= 1且在其他情况下值为* _dt,则实际dt为1。

* _ft参数确定该值必须保持不变的时间,这是信封的一种采样间隔。根据经验,发现该参数的零值对应于〜100 DAC采样周期或〜3 ms。对于大于零的值,必须使用公式int(256 / * _ft)* 100计算时间,即* _ft是100个DAC周期的基本间隔的乘数。

显示所有信封选项的插图。在右侧,它与显式离散化重复,以更好地理解参数* _ft / * _ dt的本质。



配置区域中的“管理”字节与我使用逻辑分析仪根据经验收到的字节一致。

频率字节确定“频率”输入的值。如上所述,合成器可以同时播放4个声音(复音),当UNISON开启时,每个声音可以与另一台发生器一起加入,但与主发生器略有失谐或偏移1-2个八度。

频率被编码为两个字节:FREQ_1,FREQ_2(用于主)和FREQ_u1,FREQ_u2(用于统一)。实验得出的公式,用于计算P432键盘第二个八度音符的音符A的频率值。

freq_offset = {4:0xd0, 5:0x90, 6:0x50} freq = (config['FREQ_1'] << 8) + freq_offset[config['FREQ_1']] + config['FREQ_2'] 

音频00的示例,其中:FREQ_1 = 6,FREQ_2 = 8,我们得到:6 * 0x100 + 0x50 + 8 = 0x658,这与所有音频的逻辑分析仪数据一致。 为了一致,计算是相似的。

值得注意的是,对于音调00,值0x658对应于440 Hz或音符A4的频率。
实验确定,相邻(包括黑色)键的“频率”间隔为16(0x10)个单位。 因此,如果我们知道左侧第22个琴键的值(第二个八度音阶的A)-0x658,那么我们可以轻松地获得最左边(1号):0x508和最右边(41号):0x788的值。

基于此,您可以计算键盘的范围和不同音调的再现频率。 “频率”列仅对简单波形正确。
FREQ_1射程频率Hz音色
4C1-E432.70-329.6301、07、13、14、25、30、31、32、33、34、35
5C2-E565.41-659.2603、05、06、10、15、17、23、24、27、37
6C3-E6130.81-1318.5100、02、04、11、12、16、20、21、22、26、36
上面的内容足以创建P432仿真器,所以让我们继续前进。

在Python中创建P432仿真


我认为将配置存储和声音生成分开是很好的,所以创建了两个主要类:

  • P432data,负责从ROM映像中加载值并将音调的配置转换为便于使用的形式;
  • P432,包含创建信封形状和实际生成数字样本的方法。
我不会详细介绍P432data,可以在github上查看源代码。
但是更详细地考虑了P432的方法。

当然, 最主要的gen_samples ,其参数指示应返回的样本数。 在这种方法中,将重新创建从输入“频率”值到DAC输出的信号处理,使其尽可能接近原型。 原则上,着眼于P432方案,您可以快速找到生成器程序集模块的Python等效项。 唯一需要明确添加的是将变量缩减到给定的维数:相位累加器为20位,包络加法器为11位,投票加法器为12位。 为了使这些变量的溢出逻辑正常工作,此限制是必需的。

用于创建getADS放大器和getFADS滤波器的包络的方法列表列出了包络幅度值,gen_samples会在按下键时从中获取值。 他们在公司中有几种getRgetFR方法,形成信封衰减阶段。 他们将电平参数作为输入-包络电平的当前值,从该值开始将其减小为0。

四个主要音色具有与放大器和滤波器相同的包络形状,但是如果每个音色都有其自己的包络,并且在按下某个键时开始,则对于滤波器来说,所有音色都是相同的,从第一次按下开始,在下一个按下后重新开始,一直持续到最后一个放手 看上面

根据使用说明书,P432分别为键盘键1至41发出MIDI音符编号,范围为36至77(实际上是76)。 为了避免重新发明轮子,我决定将模拟器中的36-76范围用作按键的编号,因此我需要使用midi2freq方法,该方法将按键编号转换为“ Frequency”(频率)值,并考虑到所选的音调。

最后一对方法是key_press (midi_note)和key_release (midi_note),它们形成了语音与基本音调的频率,包络的相位和当前位置的对应关系的字典。

最后一个主要方法是setprog (prog,clean = True),用于选择活动音调。 Setprog加载所需音调的配置,如果未清除clean标志,则清除内部变量。 如果将clean设置为False,则不会重置内部变量,这使您可以在生成声音的过程中在音调之间切换,而几乎没有咔嗒声或其他不愉快的声音。

为了将生成的样本写入WAV文件,基于wave模块创建了write_wav实用程序方法。 对于每个样本,执行缩放以增加幅度并将其变为带符号的16位格式。

这些方法足以获取wav文件,并记录几秒钟的任何合成器声音。

 #    p432=P432() #   p432.setprog(0) #     (  ) p432.unison=False p432.filter_en = False #   A   p432.key_press(57) #  3   samples=p432.gen_samples(33000*3) #   p432.key_release(57) #    p432.write_wav('test_00.wav',samples) 

音色00的波形是正弦波,因此在输出处我们得到一个具有叠加包络的正弦波。 听。



更加有趣的是在统一和滤波器打开的情况下录制音调14。 听。



图形用户界面


控制台声音生成器很好,但我也想在键盘上弹奏。 因此,我决定在Tkinter上制作一个简单的GUI。

界面受到了真正的P432的影响,增加了键盘图例,MIDI输入选择按钮和关闭滤波器的功能。


如果您安装了“ python-rtmidi”模块,将出现“ Midi In”按钮。 按下并选择Midi输入设备后,程序将激活一个回调函数,以捕获所有16个midi通道上的Note-On,Note-Off和Program Change事件。 通过程序更改,您可以更改活动仿真器音调的编号。

要拦截键盘击键,请使用Tkinter bind('<KeyPress')bind('<KeyRelease')方法 ,然后在回调函数中,使用允许的列表检查键号,将其转换为Midi音符,然后调用p432.key_press()方法, p432.key_release() 。 截获在程序启动时被激活,并在结束时被禁用。

为了输出流声音,在非阻塞模式下使用pyaudio模块。 呈现接口后,它在单独的线程线程中启动,并且tkinter继续主要工作。 在回调函数中,pyaudio传递要生成的样本数,作为回报,它从gen_samples和状态标志接收样本。 为了减少音符打开事件(按一个键)和声音出现之间的等待时间,选择了一个很小的缓冲区:200个样本。 它由打开的pyaudio方法的frames_per_buffer参数设置。

可以从发行版中下载适用于Windows的P432_emulator的编译后的pyinstall版本。

结论


在本文中,几乎没有公开生成器节点(及其在仿真器中的数字实现),处理器节点,HOP效果和MIDI接口中模拟滤波器的操作细节。 重点放在生成器单元数字部分的设计,存储音色参数并在创建仿真器时使用它们的方法上。

如果您对该主题感兴趣,那么我将计划第二篇文章,并对其余内容进行分析。

另外,如果在您看来P432节点的操作描述中有错误或不正确,请在注释中写下。

该项目的源代码,ROM固件,图表和操作手册可在github上找到

参考文献


  1. Ridiko L. DDS:直接数字频率合成。
  2. 苏联合成器博物馆,共振峰P432。 www.ruskeys.net/base/form432.php
  3. 维基百科 Polyvox。
  4. 电音键盘乐器“ Formant P432”。 操作手册
  5. “ Formant P432”的电气示意图。
  6. 设置Polyvox的温度稳定性。

Source: https://habr.com/ru/post/zh-CN482292/


All Articles