#javascript #web-audio-api #synthesizer #tone.js
#javascript #web-audio-api #синтезатор #tone.js
Вопрос:
Я пытаюсь создать простой аддитивный синтезатор, используя Tone.JS
и WebAudioAPI
.
Пока что я настроил простой синтезатор, который работает нормально, и я могу играть любую ноту, какую захочу.
Я также могу свободно изменять параметры ecc…
Вот код:
// synth declaration using Tone.JS
var synth = new Tone.Synth({
oscillator: {
type: 'fmsquare',
modulationType: 'sawtooth',
modulationIndex: 3,
harmonicity: 2.4
},
envelope: {
attack: 0.001,
decay: 0.1,
sustain: 5,
release: 0.1
}
}).toMaster()
//Possible added oscillator
var synthB = new Tone.Synth({
//Sample Data.......
}).toMaster()
// Selection of piano keyboard from my HTML file
notes = document.querySelectorAll(".hex");
// Play note function
notes.forEach(function(note) {
note.addEventListener("mouseover", function(event){
x = event.target.title;
synth.triggerAttackRelease(x, "8n");
//synthB.triggerAttackRelease(x, "8n");
});
});
Я пытался добавить еще один, Tone.Synth
но я не могу понять, как «распараллелить» процесс.
Просматривая документацию, я нашел, как создать полифонический синтезатор, но это позволяет добавлять несколько экземпляров одного и того же синтезатора, чтобы воспроизводить более одной ноты.
Что я хотел бы сделать, так это воспроизвести одну и ту же ноту на РАЗНЫХ синтезаторах (каждый со своей формой волны), получая аддитивный синтезатор.
Я попытался просто создать SynthB
, а затем вызвать synthB.triggerAttackRelease()
, это работает нормально, но мне это не кажется «параллельным».
Есть ли какие-либо лучшие подходы?
Комментарии:
1. Я никогда не использовал Tone, но я создал vst на c . Я предполагаю, что то, что вы хотели бы сделать, это заставить два синтезатора совместно использовать конверт. В противном случае два разных синтезатора, играющих одну и ту же ноту, — это именно то, что представляют собой аддитивные синтезаторные слои (или параллельные).
2. Это не настоящая проблема, если я хотел бы заставить их совместно использовать оболочку, я мог бы просто назначить переменную A (например, Attack), поместить ее в оболочку генератора и изменить ее. Моя проблема была скорее «аппаратной», поэтому пока я вызываю 2 .triggerAttackRelease() один за другим. Вызывает ли это какие-либо проблемы, когда я начинаю укладывать несколько синтезаторов?
3. Пока оба синтезатора работают вместе, потому что (я думаю) мой браузер так быстро выполняет эти инструкции, что они кажутся параллельными. Но если я начну возиться с цепочкой фильтров после ecc генератора …, столкнусь ли я с какими-либо проблемами с задержкой таким образом?
4. В конечном итоге вы, скорее всего, столкнетесь с задержкой, я некоторое время назад работал с WebAudioAPI … у него есть ограничения. Но с точки зрения того, что вы делаете, пока это правильно. Если бы вы создали уникальные фильтры, эффекты и т.д. Для каждого уровня синтезатора, это могло бы стать проблемой, но как есть, два параллельных синтезатора в любой программе — это на самом деле просто два отдельных синтезатора, играющих одну и ту же ноту. Это определение многоуровневости. При этом, в зависимости от синтезаторов, можно было бы получить некоторый прирост производительности, используя один синтезатор для генерации звука. Посмотрите на волновые таблицы.