我建议即使您想使用模拟滤波级(它们可以使声音变得温暖,而通过其他方式很难实现),以数字方式生成起始波形可能是一个好主意。1980 年代,Williams 的许多电子街机使用包含 6800 微处理器、少量 RAM 和 ROM 以及包括 DAC 在内的少量 I/O 的板来产生声音。所有声音效果都是使用紧密的程序循环生成的,这些循环生成样本并将它们馈送到 DAC。由于处理器仅用于声音生成,因此循环执行速度可用于计时。
在实践中,即使是最简单的微控制器也有某种定时器资源,如果您希望能够在播放声音时更改音频参数,这可能会很有帮助。使用类似 6805 的代码,首先为每个声音编写一个轮询例程;为了提高速度,这些例程将存在于 RAM 中——类似于:
民意调查1:
brclr TMR_CONTROL,TMR_READY,轮询;等待下一个'tick'的开始
bclr TMR_CONTROL,TMR_READY
FRQ1L:lda #PATCH
PH1L:添加#PATCH
斯塔 PH1L+1 ; 相位 LSB 的补丁值
FRQ1M:lda #PATCH
PH1M:添加#PATCH
斯塔 PH1M+1 ; 补丁代码
FRQ1H:lda #PATCH
PH1H:添加#PATCH
斯塔 PH1H+1 ; 补丁代码
斯塔 FETCH+2 ; 修补目标的 LSB
获取:lda TABLE_BASE ;16 位地址
clr DAC_ENABLES
sta DAC_OUTPUT
lda #ENABLE_1
sta DAC_ENABLES
rts
接下来,将有一个主循环,它将按顺序为每个语音重复调用轮询例程,并在调用之间执行任何其他需要完成的逻辑(例如,查看是否需要更新任何语音参数)。使用这种方法,可以以高采样率更新相当数量的声音。
虽然可以完全使用模拟电路来生成初始波,但很难拥有多个独立的模拟发生器,它们的频率特性在百分之几内绝对相同。人耳对音高变化非常敏感——远比幅度变化敏感——所以用于信号生成的任何东西都必须非常一致。使用简单的微控制器作为起点是获得这种一致性的好方法,即使随后通过模拟整形电路馈送生成的信号。