Tone.js 基本的な考え方を探る

間違っているかもしれないけど多分こんな感じ?

基本的な流れは、

  1. 音源を作って

  2. エフェクターを作って

  3. つなげて

  4. 発音

つなげるのはconnect, chainとかバリエーションある。ミキサーのMasterにだすのがtoDestination().

発音するところでは、楽譜のようなものが作れるのかな?と調べたけど楽譜までは至っていないでどちらかというとプログラム。

そして、ライブラリの構成をにらんでみるとこんな感じかな?

lowpassがEffectじゃなくてComponentというくくりにあるのかと思ったら、これ、Componentというくくりががまさにミキサーのイメージなんですね。

Instrumentがそのままできあいな楽器。

Eventが楽譜/スコア的な感じかな。

SourceのところはOscillatorとPlayerとUserMediaが一緒になってて、ちょっと気持ち悪いな。Oscillatorは独立してほしい。csound的充実希望かな。

CoreはWeb AudioそのなかでもDrawは音と映像のシンクに使えそうだし、ClockじゃなくてTransportを使った方がタイミングが厳密とか、Emitter面白そうだしなど。その他がCoreと書かれている感じ。

しかも、bpmがCoreの下のTransportの下にあるというのは分かりにくすぎ。というか、これでどうやってスコアを書いて、楽譜としての一貫性を持たせるのかまだわからない。というか、プログラムとスコアが分離できていない感じ。その点考えるとcsoundのscoreは優秀。

最後に、Unitというクラス/Functionが少し気持ち悪いくくりかな。MIDIをそこに入れるんだと思った。

試してみたら以下のような流れの感じで音がでた。Triggerするのとリリースを別に書くとか意味があるのだろうか??MIDIのnoteOffを手書きするような感じのことって。。

//音源を作る
const synth = new Tone.PolySynth(Tone.Synth).toDestination();

// 現在を定義、意味が若干曖昧
const now = Tone.now()

// エフェクターを作る。start()はChorusだと必要だけどそうとも限らない
// 多分LFOを回すためstart()が必要
// toDestination()はaudioOutを意味するので
// Effectから出力するならeffectの最後にtoDestination()をつける
const chorus  = new Tone.Chorus(
    {
        constxt: 'statechange',
        delayTime:10,
        depth:0.1,
        feedback:0.1,
        frequency:'2n',
        spread:180,
        type:'sine10',
        wet:0.4}
).toDestination().start();

// 音源をつなぎ先のエフェクターにつなげる
// これで準備完了
synth.connect(chorus);

// connectするか、toDestinationするということね。
// 音源をエフェクターにつなぐ(1)、直接鳴らす(2)
// (Q) あ、wet/dryで割合とかで分けてブランチできないのかな
//
// (1) const tom = new Tone.MembraneSynth({octaves: 4,pitchDecay: 0.1}).connect(feedbackDelay);
// (2) const tom = new Tone.MembraneSynth({octaves: 4,pitchDecay: 0.1}).toDestination();
// triggerするが、AttackとRelease別も一緒もどちらもできる
// 1)
//   synth.triggerAttack("E4", now + 2);
//   synth.triggerRelease(["D4", "F4", "A4", "C4", "E4"], now + 4);
// 2)
//   tom.triggerAttackRelease("A2", "32n");
synth.triggerAttack("D4", now);
synth.triggerAttack("F4", now + 0.5);
synth.triggerAttack("A4", now + 1);
synth.triggerAttack("C4", now + 1.5);
synth.triggerAttack("E4", now + 2);
synth.triggerRelease(["D4", "F4", "A4", "C4", "E4"], now + 4);

で、ToneJSってここまで読んで、作曲するためのものではないし、Webに簡単にこじゃれた音をつけたいためのものなの?って疑問がわきまくった。

P5.jsの音をもう少し良くしようと調べたんだけど。。