gpt4 book ai didi

javascript - 我如何在 JavaScript 中生成这种滴答声?

转载 作者:数据小太阳 更新时间:2023-10-29 05:34:30 25 4
gpt4 key购买 nike

在 a.bestmetronome.com 上,他们有一个节拍器可以根据噪音产生滴答声。

但是,我无法弄清楚“滴答声”是如何生成的。尽管我能够从 Audacity 中计算出“滴答”生成器:

;; Metronome tick by Steve Daulton.
(defun metronome-tick (hz peak)
(let* ((ln 300)
(sig-array (make-array ln))
(x 1))
;; generate some 'predictable' white noise
(dotimes (i ln)
(setf x (rem (* 479 x) 997))
(setf (aref sig-array i) (- (/ x 500.0) 1)))
(setf sig (sim (s-rest-abs 0.2)
(snd-from-array 0 44100 sig-array)))
(setf sig
(mult (abs-env (pwev 10 (/ ln 44100.0) 2 1 0))
(highpass8 (lowpass2 sig (* 2 hz) 6)
hz)))
(let ((gain (/ (peak sig 300))))
; The '1.11' factor makes up for gain reduction in 'resample'
(mult (abs-env (pwlv 1.11 0.02 1.11 0.05 0 ))
(jcrev (mult peak gain sig) 0.01 0.1)))))

;; Single tick generator:
(defun get-metronome-tick (hz gain)
(resample
(sound-srate-abs 44100 (metronome-tick hz gain))
*sound-srate*))

这是我目前在生成它的函数中的刻度:

function scheduleNote(beatNumber, time)
{
// push the note on the queue, even if we're not playing.
notesInQueue.push({
note: beatNumber,
time: time
});

if (beatNumber % 4 === 0) // beat 0 == high pitche
{
var fader = actx.createGain();
fader.gain.value = 2;
fader.connect(distor);

var oscil0 = actx.createOscillator();
oscil0.frequency.value = noteFreq[0];
oscil0.connect(fader);

var oscil1 = actx.createOscillator();
oscil1.frequency.value = noteFreq[0] * 2;
oscil1.connect(fader);

oscil0.start(time);
oscil1.start(time);
oscil0.frequency.exponentialRampToValueAtTime(noteFreq[1], time + noteLength);
oscil1.frequency.exponentialRampToValueAtTime(noteFreq[1] * 2, time + noteLength);
fader.gain.linearRampToValueAtTime(0, time + noteLength);
oscil0.stop(time + noteLength);
oscil1.stop(time + noteLength);
}
}

但是,生成报价本身的脚本是基于 Lisp 的 Nyquist 语言。我如何使用 AudioContext 和 Web Audio 函数用 JavaScript 编写一些东西来完成 Lisp/Nyquist 生成器的功能?

我尝试了很多在线翻译工具,似乎没有一个能满足我的需要。另外,如何确保我开始的空缓冲区(其中填充了上面代码生成的噪声样本)完全根据 JS 中的 time 变量开始?

可以使用 createBiquadFilter() 完成“highpass8”,并且可以从随机数开始创建噪声。我以前使用过 Web Audio API,并用它制作了一个噪音和音调发生器。然而,在这个任务上我被卡住了。


或者,我尝试查看 a.bestmetronome.com 的源代码,但显然他们使用 Flash 来生成声音,但我找不到实际生成滴答声的 ActiveX 对象。我怎样才能复制它们生成滴答声的方式? (也使用网络音频 API)

最佳答案

题目中写的奈奎斯特代码不会运行,因为s-rest-abs函数还没有定义。这个版本可以在 Audacity 的“Nyquist Prompt”效果中运行(参见:https://manual.audacityteam.org/man/nyquist_prompt.html)

;version 4
;type generate

;; Metronome tick by Steve Daulton.
(defun metronome-tick (hz peak)
(let* ((ln 300)
(sig-array (make-array ln))
(x 1))
;; generate some 'predictable' white noise
(dotimes (i ln)
(setf x (rem (* 479 x) 997))
(setf (aref sig-array i) (- (/ x 500.0) 1)))
(setf sig (sim (abs-env (s-rest 0.2))
(snd-from-array 0 44100 sig-array)))
(setf sig
(mult (abs-env (pwev 10 (/ ln 44100.0) 2 1 0))
(highpass8 (lowpass2 sig (* 2 hz) 6)
hz)))
(let ((gain (/ (peak sig 300))))
; The '1.11' factor makes up for gain reduction in 'resample'
(mult (abs-env (pwlv 1.11 0.02 1.11 0.05 0 ))
(jcrev (mult peak gain sig) 0.01 0.1)))))

;; Single tick generator:
(defun get-metronome-tick (hz gain)
(resample
(sound-srate-abs 44100 (metronome-tick hz gain))
*sound-srate*))

(get-metronome-tick 440 0.8)

最后一行调用函数“get-metronome-tick”。

(作为 Audacity Rhythm Track 生成器的作者,我很乐意提供有关此代码究竟在做什么的更多详细信息,尽管我认为在问题的上下文中没有必要这样做。)

正如您在 Audacity 的 Nyquist Prompt 中运行此代码所见,它生成了一个包含 2200 个样本值的序列(50 毫秒,44100 赫兹采样率)。以这种方式编写,以便整个插件可以分布在一个小文本文件中。

我不是 JS 专家,但我希望在 JS/HTML5 中,为示例数据简单地创建一个小的音频文件会更容易。由于不需要非常高的频率,这可能是一个非常小的低采样率文件(比如 550 个样本,采样率为 11025 Hz)或压缩格式,例如 OGG 或 MP3。该文件可以在 Audacity 中创建,方法是使用上述代码生成报价,然后导出。

然后可以用类似的东西加载声音:

<audio src="tickSound.ogg" type="audio/ogg"></audio>

另请参阅:https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Using_Web_Audio_API

https://www.w3.org/TR/webaudio/

关于javascript - 我如何在 JavaScript 中生成这种滴答声?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56707457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com