На 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);
}
}
Однако скрипт для генерации самих тиков написан на языке Найквиста, основанном на Лиспе. Как я могу написать что-то на JavaScript, которое выполняет то же, что и генератор Lisp / Nyquist, но с использованием функций AudioContext и Web Audio?
Я пробовал множество онлайн-инструментов для перевода, но ни один из них, казалось, не достиг того, что мне нужно Кроме того, как я могу убедиться, что пустой буфер, с которого я начинаю (который заполнен образцом шума, сгенерированным приведенным выше кодом), запускается точно в соответствии с переменной time
в JS?
«Высокий проход 8» может быть сделан с помощью createBiquadFilter()
, и шум может создаваться, начиная со случайных чисел. Я раньше работал с Web Audio API и сделал из него генератор шума и тона. Однако на этой задаче я застрял.
В качестве альтернативы я попытался найти источник a.bestmetronome.com, но, по-видимому, они используют Flash для генерации своих звуков, и я не смог найти объект ActiveX, который фактически генерировал тики. Как я мог воспроизвести способ, которым они генерировали тиков? (Также с использованием API Web Audio)