3

我正在尝试制作一个简单的振荡器程序,我可以在其中更改 Octave 类型,就像 Massive VST 用正数和负数显示它一样:

大型振荡器
(来源:massynth.com

现在,我知道一个八度音阶有 1200 美分(每半音 100 美分)。我遇到的问题是,在制作 Osc 代码时,我意识到它的音高是以美分衡量的。

ctx = new webkitAudioContext(); 
function osc1(pitch){ 
osc = ctx.createOscillator(), 
osc.type = 2; //0 = sine, 1 = square, 2 = saw, 3 = triangle, 4 = custom
osc.frequency.value = pitch; //in cents
gainNode = ctx.createGainNode(); 
osc.connect(gainNode); 
gainNode.connect(ctx.destination);
gainNode.gain.value = 1; 
osc.noteOn(0); 
};

osc1 (20);

由于 Pitch 改变了音符的频率,我感到困惑的是,没有 MIDI 键盘我怎么能知道

  1. 演奏的是什么音符?
  2. 音符的播放频率是多少?

此外,我怎样才能从这些波形中获得低音?我已经进行了几次测试,以 1 美分、2 美分、5 美分、20 美分等产生声音,以查看它们的声音以及当 Osc 以 1 美分产生音高时,我得到的只是低点击,而使用2 美分,我在 4/4 节拍中得到几乎相同的点击。根据我的理解,您可以查看地图上的频率点,同样,美分就像这些点之间的距离。话虽如此,既然声音是直接从浏览器生成的,那么美分如何确定音符的频率呢?另外,如果只是移动振荡器的音高那么简单,那么振荡器从哪个音符开始?换句话说,你每次说什么“投球”?

考虑到我自己很困惑,我希望我写的东西有意义。

感谢您的任何帮助和反馈!

4

2 回答 2

7

音高以赫兹(每秒周期数)为单位测量,也可以作为音符和与该音符的偏差(以分为单位)给出。正如您正确指出的那样,1 分是半音的 1/100 或八度的 1/1200。

翻译音分的关键是要意识到音高的变化不是线性的,而是几何的。A 定义为 440 Hz。上一个八度的 A 是 880Hz,再上一个八度的 A 是 1760Hz,以此类推。请注意,两个 A 音符之间的赫兹差异对于每个八度音阶向上加倍。

从数学上讲,从给定的音高开始,下一个半音不是固定的赫兹数,而是一个比率,即 2 的十二次方根 (2 1/12 )。由于一美分小 100 倍,它的比率是 2 的 1200 次方根,即 2 1/1200。请记住,对于每个八度音阶,您将赫兹加倍。对于每个半音,您将频率乘以 2 1/12。如果您这样做十二次,您将增加一倍原始数字 (440 * (2 1/12 ) 12 = 440 * 2 = 880)。同样,(440 * (2 1/1200 ) 1200 = 880)。

在 Excel 中尝试一下。

Cell A1: 440
Cell A2: =A1*2^(1/1200)
Cell A3: ...copy A2 down...
.
.
.
Cell A1201:

如果您正确执行此操作,单元格 A1201 将神奇地包含值 880,其间的所有单元格将为您提供每一分的频率(但请参阅下面的重要警告)。

不幸的是,事情并不是那么简单。我描述的是基于数学的毕达哥拉斯量表,今天没有人使用。如果您以这种方式为钢琴调音,C 大调和 A 小调可能听起来不错,但其他键听起来会很不协调。造成这种情况的原因与听力的生理学有关。有完整的关于气质的学术书籍,在巴洛克时期引起了激烈的争论,几个系统争夺心灵份额,几乎直到巴赫“决定”让每个人都使用良好的气质,因为键盘不容易拥有它气质变了。

今天的音乐家使用一种称为良好调律音阶的修改,其中一些音符从数学上完美地向上或向下调整,以便所有键都可以使用而无需重新调整。这是一种妥协,但我们都习惯于听到它。我不会进一步讨论它,只是要说,因为间隔不完全是 2 1/12,所以分的定义取决于每个间隔的实际宽度。将美分视为 0 到 100 之间的一组点,在两个音符之间等距分布,但基于固定比率(2 1/1200 ) 而不是固定数量的赫兹。

如果您想制作一个准确的振荡器来提供音符,您将不得不研究音律并调整 Hz 值以匹配当前的音乐惯例。您将需要一本关于气质的好书,和/或一个可以调节不同气质的调音器。有几个 iPhone 应用程序可以处理不同的气质,包括对扬声器的输入和输出。

祝好运并玩得开心点。

于 2013-10-26T08:26:27.357 回答
4

或者用简单的方法来做 - 振荡器有一个“失谐” AudioParameter,它允许您以音分为单位向上或向下调整音高(基于振荡器的频率参数;简而言之,频率是基线(如您所述,默认为 A -440Hz),失谐是以美分为单位的偏移量)。:)

于 2013-10-26T13:53:33.933 回答