Тон.JS — аддитивный синтезатор

#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 … у него есть ограничения. Но с точки зрения того, что вы делаете, пока это правильно. Если бы вы создали уникальные фильтры, эффекты и т.д. Для каждого уровня синтезатора, это могло бы стать проблемой, но как есть, два параллельных синтезатора в любой программе — это на самом деле просто два отдельных синтезатора, играющих одну и ту же ноту. Это определение многоуровневости. При этом, в зависимости от синтезаторов, можно было бы получить некоторый прирост производительности, используя один синтезатор для генерации звука. Посмотрите на волновые таблицы.