Skip to content

Instantly share code, notes, and snippets.

@atsushieno
Last active December 22, 2020 08:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save atsushieno/11cf7e8ba46bfbfdce3638ff9ab91eac to your computer and use it in GitHub Desktop.
Save atsushieno/11cf7e8ba46bfbfdce3638ff9ab91eac to your computer and use it in GitHub Desktop.
diff --git a/1-intro.md b/1-intro.md
index d12bb09..f198d26 100644
--- a/1-intro.md
+++ b/1-intro.md
@@ -7,15 +7,13 @@
## 音楜の打ち蟌み䜜業ずDAWの仕事
-この本の読者である皆さんにずっおは、DAWなどの゜フトりェアを䜿甚しおコンピュヌタヌで䜜曲できるこずは自明でしょう。しかし、実際にDAWを䜿っお䜜業しおいるかどうか、ずなるず、誰もがYESずは答えられない質問であるこずでしょう。
+この本の読者である皆さんにずっおは、DAWなどの゜フトりェアを䜿甚すればコンピュヌタヌで䜜曲できるこずは自明でしょう。実際にDAWを䜿っお党おの䜜業を行っおいるかどうかは人それぞれで、DAWを䜿甚しお音楜を制䜜しおいる人も、最終的な楜曲ファむルを䜜成するたでの党おの工皋をDAWで行っおいるずは限りたせんが、ここでは楜曲ファむルを䜜成するたでの工皋が党䜜業であるずしお話を進めたしょう。DAWを䜿甚した楜曲制䜜には、次のような䜜業がありたす順番通りずいうわけではありたせん。
-DAWを䜿甚しお音楜を制䜜しおいる人も、最終的な楜曲ファむルを䜜成するたでの党おの工皋をDAWで行っおいるずは限りたせんが、ここでは楜曲ファむルを䜜成するたでの工皋が党䜜業であるずしお話を進めたしょう。DAWを䜿甚した楜曲制䜜には、次のような䜜業がありたす順番通りずいうわけではありたせん。
-
-- 楜曲のパヌト構成を決めお、トラック矀ずしお線成する
-- 録音枈みのオヌディオサンプリングデヌタがあれば、それをオヌディオのトラックに貌り付ける
-- むンストゥルメンタル = 楜噚を指定しお譜面を打ち蟌む堎合は、ピアノロヌル゚ディタなどを䜿甚しながら各パヌトの音笊を打ち蟌む
-- 各パヌトの楜噚を定矩する。䞻にオヌディオプラグむンVSTやAUなどを指定しお、そのパラメヌタヌを調敎する
-- 各パヌトの音量を調敎し、パンを振り分けお巊右のバランスをずり、EQむコラむザヌなどで各音域の厚みを調敎する
+- 楜曲のパヌト構成を決めお、トラック矀ずしお線成する。
+- 録音枈みのオヌディオサンプリングデヌタがあれば、それをオヌディオのトラックに貌り付ける。あるいは他のパヌトを挔奏しながら新しいトラックのセクションを録音する。
+- むンストゥルメンタル = 楜噚を指定しお譜面を打ち蟌む堎合は、ピアノロヌル゚ディタなどを䜿甚しながら各パヌトの音笊を打ち蟌む。
+- 各パヌトの楜噚を定矩する。䞻にオヌディオプラグむンVSTやAUなどを指定しお、そのパラメヌタヌを調敎する。
+- 各パヌトあるいは楜曲党䜓の音量を調敎し、パンを振り分けお巊右のバランスをずり、EQむコラむザヌなどで各音域の厚みを調敎する。
これらの過皋の䞭で、DAWがどのような仕事を行っおいるか、個別に芋おいきたしょう。
@@ -56,16 +54,16 @@ DAWを䜿甚しお音楜を制䜜しおいる人も、最終的な楜曲ファ
䞀般的なPCのナヌザヌは、オヌディオデバむスを耇数䜿甚する必芁は無いでしょう。しかし音楜制䜜においおは、他のオヌディオ出力を䌎うアプリケヌションに邪魔されないように、あるいは他のオヌディオ入力ずミキシングする目的で、オヌディオむンタヌフェヌスに音声を出力しお、そこから受信したデヌタをデゞタルに保存するようなこずがありたす。このため、DAWには特に䜿甚するオヌディオデバむスを個別に蚭定する機胜が求められたす。
-たた、MIDIデバむスを䜿甚する堎合は、どのデバむスを䜿甚するかずいう環境蚭定も求められたす。さらに、近幎のMIDIデバむスには、MPEMIDI polyphonic expressionなど高床な入力情報を送信できるものが増えおおり、これらぞの察応オプションを远加で指定できるこずが期埅される堎面もありたす。今埌MIDI-CIcapability inquiryをはじめずする「MIDI 2.0」の機胜珟圚策定䞭が実珟しおくるず、この芁求事項が広がっおくるこずでしょう。
+たた、MIDIデバむスを䜿甚する堎合は、どのデバむスを䜿甚するかずいう環境蚭定も求められたす。さらに、近幎のMIDIデバむスには、MPEMIDI polyphonic expressionなど高床な入力情報を送信できるものが増えおおり、これらぞの察応オプションを远加で指定できるこずが期埅される堎面もありたす。今埌MIDI-CIcapability inquiryをはじめずするMIDI 2.0の機胜が実珟しおくるず、その芁求事項が広がっおくるこずでしょうMIDI 2.0に぀いおは別途蚀及したす。
## DAWではない音楜゜フトりェア・ツヌル
電子化された音楜は、倚くの堎合はDAWで制䜜されたすが、たたにそれ以倖の゜フトりェアが䜿甚されるこずもありたす。本曞のタヌゲットはシヌケンサヌ゚ンゞンなので、DAW以倖の音楜ツヌルに぀いおも蚀及しおおきたす。@<fn>{other-tools}
-//footnote[other-tools][ここで蚀及する他にもトラッカヌのような䜜曲ツヌルもあるのですが、機胜的にはざっくりDAWに類するものず蚀えるので、ここでは蚀及したせん。]
+//footnote[other-tools][ここで蚀及する他にもトラッカヌのような䜜曲ツヌルもあるのですが、UIの構成を陀く機胜面は倧たかにはDAWに類するものず蚀えるので、ここでは蚀及したせん。]
-### VPL/APLの系譜 (Max/MSP, Pure Data etc.)
+### クリ゚むティブコヌディングずVPL/APLの系譜
//image[puredata][Pure Data(Wikimedia Commons: PureData-Harvie-Examples.png)][scale=0.7]
@@ -79,11 +77,13 @@ VPLvisual programming languageずは、愚盎にプログラミングす
ノィゞュアルを凊理しないものに぀いおは、APL (audio programming language)ずいうカテゎリがありたす。さたざたなオヌディオ凊理を蚘述するための蚀語ずいう偎面が匷いです。音楜的な効果を蚘述するために䜿うこずもたれにあるので、DAWの仕事ず重耇するずころもありたす。䜿甚されおいる䜎レベルの゜フトりェア基盀が同様の構成になっおいるこずは倚いです。
+2020幎の本版執筆時点では、ラむブコヌディング系の蚀語ずしお広く知られおいるのはTidalCycles、Sonic Pi、SuperCollider、Extemporeなどが挙げられるでしょう。
+
### MMLの系譜
//image[mml][MML (mugene samples)][scale=0.8]
-MML (music macro language@<fn>{not-music-markup})は、APLずは異なり音楜を蚘述する目的で䜜られた各皮の蚀語の総称です。筆者もコンパむラヌを開発しお公開しおいるのですが@<fn>{mugene}、MIDI呜什のような可読性の䜎いものを読みやすく簡朔に蚘述するものですたずえば「オクタヌブ4のド」のノヌト・オンを`[90h, 40h, 50h]`などず蚘述する代わりに `o4c`ですたせる。20䞖玀に栄えおいた技術であり、もずもずは察象ずなる音源もMIDIではなくFM音源チップなどであり、DAWがメむンストリヌムになった珟圚ではあたり䜿われおいたせん。
+MML (music macro language@<fn>{not-music-markup})は、APLずは異なり音楜を蚘述する䜜線曲する目的で䜜られた各皮の蚀語の総称です。筆者もコンパむラヌを開発しお公開しおいるのですが@<fn>{mugene}、MIDI呜什のような可読性の䜎いものを読みやすく簡朔に蚘述するものですたずえば「オクタヌブ4のド」のノヌト・オンを`[90h, 40h, 50h]`などず蚘述する代わりに `o4c`ですたせる。20䞖玀に栄えおいた技術であり、もずもずは察象ずなる音源もMIDIではなくFM音源チップなどであり、DAWがメむンストリヌムになった珟圚ではあたり䜿われおいたせん。チップチュヌン系の䜜曲者がたたに䜿うこずがありたす。
//footnote[mugene][https://github.com/atsushieno/mugene]
@@ -92,6 +92,27 @@ APLや生のMIDIメッセヌゞを扱うラむブラリでは、「音楜」を
//footnote[not-music-markup][Music Markup LanguageでMMLずいうものも存圚したすが、党くの別物です]
//footnote[mml-literal][単独のコンパむラヌツヌルではなく、ラむブラリずしお提䟛しお、文字列リテラルをコンパむルする、ずいうかたちでも䜿えるでしょうが、ナヌザヌが開発ツヌルを揃えないずいけなくなるのはかえっお面倒なので、DSLの䞀皮ず考えお蚘述するほうがただ良いでしょう。]
+MML関連ツヌルには、特にデヌタフォヌマットが独自である堎合はプレむダヌずなる゜フトりェアが必芁であり、プレむダヌを開発するずきは本栌的なDAWに比べるずだいぶ軜量な仕事ではあるものの専甚のシヌケンサヌ゚ンゞンを実装する必芁がありたす。デヌタフォヌマットがSMFであったり、䞀郚のFM音源甚音楜デヌタなど既にプレむダヌが存圚するような既知のフォヌマットなどであれば、自分でシヌケンサヌ゚ンゞンを実装する必芁はないでしょう。
+
+
+## オヌディオ開発に適した蚀語ずその特城
+
+プログラミングにおけるオヌディオ凊理の䞖界はやや特殊な空間です。厳しいリアルタむム芁件を満足するためには、ガベヌゞコレクションのように「党おのスレッドを停止させおメモリを回収する」ような凊理や、「実行時に必芁になったら仮想マシンコヌドをネむティブコヌドに時間をかけおコンパむルする」JITのような凊理は向いおいないずされおいたす。そのため、Javaや.NETのような仮想マシン技術が入り蟌むこずがほがありたせん@<fn>{vstnet}。
+
+//footnote[vstnet][VST2 SDKを.NET API化しただけのVST.NETずいうプロゞェクトがありたすが、これはGCによる遅延を受容するずいう前提で䜜られたものです。VST3にも察応しおいたせん。]
+
+このため、オヌディオプログラム開発においおは、C++か、ネむティブコヌドずしおコンパむル枈みの実行バむナリを生成する特殊な蚀語および開発ツヌルが䜿われたす。Appleプラットフォヌム専甚のコヌドではSwiftやObjective-Cも甚いられたすGUIだけSwift、ずいうプラグむンも少なくないでしょう。C++以倖で有望芖されおいる蚀語はRustです。たた、汎甚蚀語でも、libsoundioの開発者が蚭蚈しおいるZigは、オヌディオアプリケヌション開発を念頭に眮いお蚭蚈されおいたす。@<fn>{v}
+
+//footnote[v][他にはV蚀語などもno JIT, no GCでオヌディオ開発ずの盞性が良さそうですが、宣䌝力が極端に匷い蚀語で実態ずの乖離が倧きいずいう偎面があるので、ここでは脚泚での蚀及にずどめたす。]
+
+//footnote[julia-aot][JuliaにはAOTで動䜜させるやり方もあるようなので、AOTで実甚䞊問題なければこれは障害ではないかもしれたせん。]
+
+ネむティブコヌド生成の文脈でよく登堎するのがLLVMです。LLVMはAPLaudio programming language、オヌディオプログラム開発蚀語のバック゚ンドにもよく甚いられたす。この方面ではFAUSTがよく知られおいたす。2020幎たでJUCEの開発元であったROLI@<fn>{roli}も2018幎にSOULずいう類䌌の蚀語をアナりンスしおいたす。䞀方でJITではなく静的コヌド生成が期埅されるこずもあっお、APLではなく汎甚蚀語ですが同じLLVM蚀語の系譜でも独自の実行モゞュヌル圢匏をもちJITを基本ずするJuliaなどは䌌お非なる分類であるずいえたす@<fn>{julia-aot}。
+
+![FAUSTのコヌド䟋公匏ドキュメントのAdditive Synthesis](faust-example.png)
+
+//footnote[roli][ROLIは2020幎にJUCE開発およびラむセンシングのビゞネスをPACE瀟に売华しおいたす。ラむセンス衚蚘などにおける開発䌁業の名矩は、JUCEの䌝統的な開発䌁業の名矩であったRaw Material Softwareずなっおいたす。]
+
## 音楜ツヌル開発の課題
@@ -123,36 +144,33 @@ DAWのような゜フトりェアは、䌝統的にデスクトップで行わ
| プラグむン機構 | Windows | Mac | Linux | iOS | Android |
| ------------------ | ------------ | --- | ----- | --- | -------- |
-| VST v2 入手䞍可胜 | ○ | ○ | ○ | ☓ | ☓ |
-| VST v3 | ○ | ○ | ○ | ☓ | ☓ |
-| AU (AudioUnit) | ☓ | ○ | ☓ | ○ | ☓ |
-| DSSI | ☓ | ☓ | ○ | ☓ | ☓ |
-| Lv2 (LADSPA v2) | (○) | (○) | ○ | ☓ | ☓ |
-| DirectX Plugins | ○ | ☓ | ☓ | ☓ | ☓ |
+| VST | ○ | ○ | ○ | - | - |
+| AU (AudioUnit) | - | ○ | - | ○ | - |
+| DSSI | - | - | ○ | - | - |
+| LV2 (LADSPA v2) | (○) | (○) | ○ | - | - |
+| DirectX Plugins | ○ | - | - | - | - |
AAXなど、耇数のプラグむンホストに開かれおいるずは蚀えない技術に぀いおは陀倖しおいたす。
VSTが特に有名ですが、VSTはv2ずv3で倧きく異なりたす。VST v3はGPLで公開されおおり、Linuxもサポヌトされおいるのですが、VST v3のAPIの蚭蚈に基づくプラグむン開発が煩雑になったこずもあっおか、珟圚でもVST v2に基づくプラグむンのほうが倚いずいうのが2019幎初頭の珟状です。VST v2は既にSteinbergがSDKを非公開にしおおり、入手䞍可胜になっおいるので、今埌は枛少しおいく可胜性が高いでしょう。
-LADSPAやDSSI、LV2は、VSTがプロプラ゚タリな゜フトりェアでMacずWindowsしかサポヌトしおいなかった時代に、Linuxでオヌディオプラグむンを実珟するための仕組みずしお開発されたした。オヌディオプラグむンには䌝統的に商業甚のものが倚かったのですが、LADSPAはLGPL、LV2はISC Licenseで公開されおいたす。VST v3も、ラむブラリであるにもかかわらずGPLv3で公開するずいうのは、実質的に商甚ラむセンス販売のためのラむセンス遞択です。
+AUもv2ずv3ではロヌド方匏などアヌキテクチャが異なる偎面もある特にiOSはv3のみサポヌトされおいるので、䞀抂には同䞀芖出来ないのですが、あくたで抂芁ずしお芋おください。
+
+VSTがプロプラ゚タリな゜フトりェアでMacずWindowsしかサポヌトしおいなかった時代に、Linuxでオヌディオプラグむンを実珟するための仕組みずしおLADSPAやDSSI、LV2ずいった芏栌が開発されたした。オヌディオプラグむンには䌝統的に商業甚のものが倚かったのですが、LADSPAはLGPL、LV2はISC Licenseで公開されおいたす。VST v3も、ラむブラリであるにもかかわらずGPLv3で公開するずいうのは、実質的にSDKの商甚ラむセンス販売のためのラむセンス遞択です。
-GUI郚分でプラットフォヌム固有の実装を混合する必芁が倚いずいう点で、Linuxずは盞性の悪い゜フトりェアの類型なのですが、オヌディオプラグむンが䟝存するWindowsのプラットフォヌム機胜やラむブラリは最小限に抑えたものが倚く、Wineで動䜜するものが少なからず存圚しおいるようです@<fn>{vst-wine}。
+GUI郚分でプラットフォヌム固有の実装を混合する必芁が倚いずいう点で、Linuxずは盞性の悪い゜フトりェアの類型なのですが、オヌディオプラグむンが䟝存するWindowsのプラットフォヌム機胜やラむブラリは最小限に抑えたものが倚く、Wineで動䜜するものが少なからず存圚しおいるようです@<fn>{vst-wine}。興味がある読者はairwave, LinVst, LinVst3, vst-bridge, yabridgeずいったプロゞェクトを調べおみおください。
//footnote[vst-wine][ラむセンスチェッカヌなどがOSを厳密にチェックする等の問題で期埅通りにむンストヌルされないこずも倚いです。]
このように、プラットフォヌムによっおバラバラの䞖界になっおいるオヌディオプラグむンですが、耇数のホストで動䜜するこずが求められるこずもあっお、基本的な芁求事項はどのプラグむン機構でもほが同様オヌディオ/MIDI の入力から出力たでのパむプラむン凊理であるずいえたす。そのため、これらを統䞀したクロスプラットフォヌムのAPIを提䟛するラむブラリが開発されおきたした。有名どころでは**JUCE**や**IPlug2**2018幎以前はWDLなどが挙げられたす。本曞で頻繁に蚀及するtracktion_engineもJUCEのモゞュヌルです。
-これらのオヌディオプラグむンは珟状ほがC++の独壇堎であり、他のプログラミング蚀語ではほずんど開発されおいない状態です。その理由は䞻にオヌディオの厳栌な䜎レむテンシヌ芁求によるものが倧きいです@<fn>{low-latency-requirements}。近幎ではRustのような蚀語でもこの芁求を満たせるはずですが、C++暙準も蚀語機胜を改善し぀぀あり、C++からの倧芏暡な移行が起こるかどうかは未だに予芋しがたいずころです。
-
-//footnote[low-latency-requirements][ガベヌゞコレクションやJITコンパむルなどでオヌディオ凊理が止たっおはならないわけです。]
-
### 音楜のデヌタモデルず挔奏゚ンゞン
オヌディオやMIDIのI/Oが実珟し、オヌディオプラグむンやMIDI楜噚によっお音源を甚いた発音が可胜になったら、次は音楜を挔奏呜什の集合䜓ずしお衚珟するデヌタモデルず、それを忠実に挔奏するプレむダヌ、そしおその挔奏デヌタを線集できる機胜が必芁になりたす。
いったんオヌディオI/OやオヌディオプラグむンのAPIを抜象化しおしたうず、この郚分は玔粋にプラットフォヌムやオヌディオプラグむンのAPIから独立した、玔粋なデヌタモデルだけで実珟できる郚分です。これを最もわかりやすく衚したのがMIDI芏栌であり、暙準MIDIファむルです。
-もっずも、MIDIで衚珟できる範囲で音楜が十分に衚珟できたのであれば、珟代でもMIDI音源がDTMの䞭心になっおいたこずでしょう。珟実はそうはならず、オヌディオプラグむン固有の機胜を利甚したり、MIDIでは扱いきれない数の音源を操䜜したり、MIDI仕様には含たれないような高床なコントロヌル呜什を駆䜿したり、ずいったモダンな手法に基づいお、䜜曲䜜業が行われたす。
+MIDIで衚珟できる範囲で音楜が十分に衚珟できたのであれば、珟代でもMIDI音源がDTMの䞭心になっおいたこずでしょう。珟実はそうはならず、オヌディオプラグむン固有の機胜を利甚したり、MIDIでは扱いきれない数の音源を操䜜したり、MIDI仕様には含たれないような高床なコントロヌル呜什を駆䜿したり、ずいったモダンな手法に基づいお、䜜曲䜜業が行われたす。
ずはいえ、MIDIの時代に確立した技術の倚くは珟代でも通甚するものです。たずえば音楜をトラックの集合䜓ずしお衚珟し、その䞭にグルヌピングされたデヌタの展開などはたた別ずしおノヌトオンやノヌトオフ、コントロヌルチェンゞなどの呜什ずタむムスタンプを組み合わせお挔奏呜什のむベントずしおたずめ、時間の蚈算はテンポず4分音笊の分解胜に基づいお指定する、ずいった技術芁玠は、珟代でも採甚されおいたす。DAWのシヌケンサヌ゚ンゞンは高床な呜什をサポヌトしたMIDIシヌケンサヌ゚ンゞンである、ず蚀っおもよいでしょう。
@@ -168,18 +186,19 @@ GUIは、䌝統的にはプラットフォヌム固有の機胜でした。こ
クロスプラットフォヌムのGUIフレヌムワヌクの䞭には、独自にGUI郚品をレンダリングするものず、APIだけが共通であるラむブラリをプラットフォヌム別に実装しおプラットフォヌム固有のGUI郚品を呌び出すものがありたす。埌者のアプロヌチは、ボタン、テキストボックス、リストビュヌなどに぀いおは、どのプラットフォヌムでも提䟛されおいるので有効ですが、音楜゜フトりェアには特有のGUIコントロヌルたずえば「ツマミ」や2軞スラむダヌなどがあり、それらはプラットフォヌムネむティブでは提䟛されおいたせん。vst4gui、JUCEやWDLはこれらを提䟛するGUIラむブラリずしおも遞ばれおきたした。
-ただ、GUIフレヌムワヌクは、ずもすればアプリケヌションの党䜓的な構造、ひいおは開発蚀語たで拘束するものであり、既存のものがあるずしおもそれを䜿うかどうかはアプリケヌションの蚭蚈次第でしょう。逆に、JUCEやWDLが利甚できるずいう理由でC++が遞ばれおきたずいう偎面はかなり倧きいでしょう。䞀方でJUCEで開発されたGUIは 平たくいえば「未熟きわたりない」です詊しにLinux䞊でJUCEで実装されたファむルダむアログを開いおみるずわかりたす。メむンメニュヌはどのプラットフォヌムでもアクセラレヌションキヌが効きたせん。「GUIはプラットフォヌムごずに実装されるべき」ず蚀われおも仕方ないレベルです。
+ただ、GUIフレヌムワヌクは、ずもすればアプリケヌションの党䜓的な構造、ひいおは開発蚀語たで拘束するものであり、既存のものがあるずしおもそれを䜿うかどうかはアプリケヌションの蚭蚈次第でしょう。逆に、JUCEやWDLが利甚できるずいう理由でC++が遞ばれおきたずいう偎面はかなり倧きいでしょう。䞀方でJUCEで開発されたGUIはプラットフォヌムGUIをリスペクトしたUIに比べるず倧きく劣りたす@<fn>{juce-linux-gui}。モバむルプラットフォヌムではよく「GUIはプラットフォヌムごずに実装されるべき」ずいう䞻匵が芋られたすが、デスクトップでも圓然に同様の議論があり、盞応の劥圓性がありたす。
+
+//footnote[juce-linux-gui][詊しにLinux䞊でJUCEで実装されたファむルダむアログを開いおみるずわかりたす。メむンメニュヌはどのプラットフォヌムでもアクセラレヌションキヌが効きたせん。]
もっずも、GUIでも、クロスプラットフォヌム・クロス制䜜環境でサポヌトされるべき機胜が無いわけではありたせん。たずえばコントロヌル・サヌフィスをカスタム制埡するためのUIを䜜成する機胜がありたす。あるいはナヌザヌが指定するオヌディオ・プラグむンのパラメヌタヌに察しお、それを制埡できるようなGUIコントロヌルツマミなどを自由に割り圓おられるビュヌを衚瀺できるような仮想コントロヌル・サヌフィスを䜜成する機胜もあるでしょう。これらはある皋床プラットフォヌムやDAWから独立した暙準的な存圚があるべきなのかもしれたせん。
もうひず぀、おそらくホスト偎ずプラグむン偎で事情が異なるのが、プラグむン偎のGUIは、自身ず無関係なキヌむベント等をホスト偎で凊理するように仕向けおやらないずいけない自身で党おのキヌむベントを凊理したこずにしおはならない点です。これは䞀般的なモヌダルダむアログのUIずは異なるずころです。このように操䜜の所有暩の所圚が䞍明瞭なGUIの構成はデスクトップアプリケヌションずしお䞍適切であるず筆者は考えたすが、既存のオヌディオプラグむンやプラグむンホストは、ほが䟋倖なくそのようなUI蚭蚈を前提ずしお構築されおいたす。
+本曞でずおも蚀及できそうにない話題ずしお、オヌディオアプリケヌションにより高氎準のアプリケヌション開発アヌキテクチャをどう適甚するか、ずいう問題がありたす。ずおも蚀及できそうにないのは、筆者の知識䞍足ずいうより、オヌディオアプリケヌションの䞖界で䜿われおいるGUIツヌルキットがそこたで成熟しおいないずいう問題が倧きいです。珟状ではGUIが分離できおいれば良いほうで、Flux, M-V-whateverMVVM, MVU, MVIなどずいった話題はオヌディオアプリケヌション開発ではほずんど芋られたせん。それどころか独自UIツヌルキットに立脚しおいるためにプラットフォヌムのUIガむドラむンに沿っおもいない、アクセシビリティ察応なども匱い ずいったものが倚いです。このような珟状であるべきアプリケヌションアヌキテクチャに぀いお議論するのは、残念ながら筆者の手には䜙りたす。
+
### GUIから切り離された音楜線集機胜
最埌に、DAWでは音楜を再生するだけではなく、線集も出来なければなりたせん。これもシヌケンサヌ゚ンゞンに期埅したい機胜のひず぀です。これはGUIからの操䜜に察応する機胜を実珟するもので、単なる再生機胜に比べるず栌段に耇雑な機胜であるずいえたす。
-GUIそのものはプラットフォヌムに匷く結び぀いたかたちで開発されるこずが倚いですが、GUIアプリケヌション開発においおもUIずロゞックの分離が求められるようになっおおり、゚ディタヌずしおの機胜をGUIから切り離しおプラットフォヌム䟝存を排陀するずいうのも、技術トレンドのひず぀であるずいえたす。
-
-
-
+GUIそのものはプラットフォヌムに匷く結び぀いたかたちで開発されるこずが倚いですが、GUIアプリケヌション開発においおもUIずロゞックの分離が求められるようになっおおり、゚ディタヌのようにGUI䞊で動䜜するこずが倧前提のアプリケヌションであっおも、さたざたな機胜をGUIから切り離しおプラットフォヌム䟝存を排陀するずいうのも、技術トレンドのひず぀であるずいえたす。
diff --git a/2-raw-audio-midi-access.md b/2-raw-audio-midi-access.md
index 6a42792..1f22a3f 100644
--- a/2-raw-audio-midi-access.md
+++ b/2-raw-audio-midi-access.md
@@ -1,20 +1,23 @@
-# オヌディオ/MIDIのネむティブアクセス
+# オヌディオ/MIDIぞのアクセス
シヌケンサヌ・゚ンゞンを䜜成する堎合、オヌディオやMIDIの機胜にアクセスするアプロヌチは2぀ありえたす。
-- 既存のオヌディオプラグむン開発フレヌムワヌクに含たれる機胜を䜿う
+- 既存のオヌディオ開発フレヌムワヌクに含たれる機胜を䜿う
- 自前でオヌディオやMIDIに盎接アクセスする
-前者の䟋ずしおは、JUCE、WDL/iPlug2、Carlaずいったラむブラリが挙げられたす。これらを䜿えば、この章で説明するようなオヌディオI/OやMIDI I/Oに぀いお、自分で実装すべきこずは䜕もありたせん。これらのラむブラリは商甚で䜿う堎合には泚意すべきものがあるので@<fn>{audio-plugin-fx-licensing}、読者によっおは自前で開発したいず考えるかもしれたせん。
+前者の䟋ずしおは、JUCE、WDL/iPlug2ずいったラむブラリが挙げられたす。これらを䜿えば、この章で説明するようなオヌディオI/OやMIDI I/Oに぀いお、自分で実装すべきこずは䜕もありたせん。これらのラむブラリは商甚で䜿う堎合には泚意すべきものがあるので@<fn>{audio-plugin-fx-licensing}、読者によっおは自前で開発したいず考えるかもしれたせん。
//footnote[audio-plugin-fx-licensing][たずえばJUCEの堎合、ラむブラリ党䜓はGPLv3あるいは商甚ラむセンスであり、OSSラむセンスでしか利甚できない状況ではAppleのApp Storeにはリリヌスできたせん。オヌディオI/Oをサポヌトする`juce_audio_devices`など䞀郚のコンポヌネントはISCラむセンスで提䟛されおいたす。]
いずれにしろ、本曞はシヌケンサヌ・゚ンゞンで䜿甚されおいる技術を解説するものなので、オヌディオプラグむンをブラックボックスずしおスルヌするのではなく、その䞭で䜿甚される技術を分解しお眺めるのが筋でしょう。この章は、オヌディオやMIDIに自前でアクセスする堎合に必芁になるAPIやラむブラリを玹介したす。
+
## MIDIアクセスAPI
-MIDIは本来、デバむス䞭立の芏栌であり、プラットフォヌム䞭立の芏栌です。しかし、プラットフォヌム䞭立の仕様であるはずのMIDIデバむスにアクセスするためには、プラットフォヌム固有のAPIを䜿甚しおアクセスするこずになりたす。䞀般的には、ハヌドりェアにアクセスするにはOS別に実装されたデバむスドラむバヌが必芁でありたたMIDI芏栌はUSB芏栌が誕生する以前から存圚する叀い仕様であり、デバむスドラむバヌに基づいおMIDIデバむスずしお認識されたものをプラットフォヌムでどのようにアクセスするかは、プラットフォヌムの開発蚀語やフレヌムワヌクによるためです。同じOS、たずえばWindowsでも、叀くからありCで利甚できるWindows Multimedia APIWinMMず、C#やJavaScript (WinJS)で利甚できるUniversal Windows Platform (UWP)では、開発蚀語もフレヌムワヌクも異なりたす。
+MIDIは本来、デバむス䞭立の芏栌であり、プラットフォヌム䞭立の芏栌です。しかし、プラットフォヌム䞭立の仕様であるはずのMIDIデバむスにアクセスするためには、プラットフォヌム固有のAPIを䜿甚しおアクセスするこずになりたす。䞀般的には、ハヌドりェアにアクセスするにはOS別に実装されたデバむスドラむバヌが必芁ですMIDI芏栌はUSB芏栌が誕生する以前から存圚する叀い仕様であり、たたMIDI I/Oはリアルタむム性の確保のためにOSの根幹に関わるずいう偎面もありたす@<fn>{web-midi-realtime}。デバむスドラむバヌに基づいおMIDIデバむスずしお認識されたものをプラットフォヌムでどのようにアクセスするかは、プラットフォヌムの開発蚀語やフレヌムワヌクによるためです。同じOS、たずえばWindowsでも、叀くからありCで利甚できるWindows Multimedia APIWinMMず、C#やJavaScript (WinJS)で利甚できるUniversal Windows Platform (UWP)では、開発蚀語もフレヌムワヌクも異なりたす。
+
+//footnote[web-midi-realtime][Web MIDI APIで保蚌できない機胜でもありたす。]
少し話題の察象を倉えお「MIDIをサポヌトするラむブラリ」ずがかしお蚀うず、これは必ずしもプラットフォヌム䟝存の機胜ずは限りたせん。たずえば 
@@ -42,10 +45,22 @@ MIDIは本来、デバむス䞭立の芏栌であり、プラットフォヌム
実のずころ、この機胜リストはWeb MIDI API仕様で定められおいる機胜そのものです。いささか逆説的ですが、MIDI仕様に基づいおデバむスずやり取りできる機胜はこの皋床に限られおいたす。
-2019幎珟圚、MMA (MIDI Manufacturers Association)では、MIDI 2.0ず呌ばれる仕様の策定が進められおいたす。既に具䜓化し぀぀ある仕様のサブセットずしおはMIDI CI (Capability Inquiry)が挙げられたす。これはMIDI機噚の機胜@<fn>{midi-ci-examples}のサポヌトの有無を「問い合わせるこずができる」ずいうもので、メッセヌゞングが単方向で「応答を受け取る」ずいう抂念が無いMIDI 1.0の仕様だけではたず実珟できない機胜です。このような新しい仕様が入っおくるず、MIDIアクセスのラむブラリに求められる機胜が拡倧するかもしれたせん。
+2020幎には、MMA (MIDI Manufacturers Association)によっおMIDI 2.0ず呌ばれる仕様が正匏に公開されたした。2020幎の本版執筆時点ではただ目に芋えるトレンドにはなっおいたせんが、MIDI 2.0サポヌトが求められるようになっおくるず、次の機胜も期埅されるようになりたす。
+
+- MIDIデバむスでサポヌトしおいる機胜MIDI 2.0サポヌトの有無も含むの問い合わせ (Capability Inquiry)
+- MIDIデバむスのプロパティの取埗ず蚭定 (Property Exchange)
+- MIDI 2.0 UMPに基づくデヌタパケットのメッセヌゞ線成・解析・転送の仕組み
+
+MIDI 2.0 UMPに぀いおは、MIDI 2.0プロトコルがMIDIアクセスAPIでサポヌトされおいれば、UMPのサポヌトそのものはプラットフォヌム非䟝存で実装できたす@<fn>{midi-2.0-guidebook}。これはMIDI 1.0のメッセヌゞが単玔なバむト配列でやり取りできるのず同様です。
+
+//footnote[midi-2.0-guidebook][UMPに぀いおは筆者が同人誌「MIDI 2.0 UMPガむドブック」ずしお詳しくたずめおいたす。]
+
+MIDI 2.0は耇数の仕様の集合䜓であり、その䞭のひず぀MIDI CI (Capability Inquiry)では、MIDI機噚の機胜@<fn>{midi-ci-examples}のサポヌトの有無を「問い合わせる」こずができたす。これはメッセヌゞングが単方向で「応答を受け取る」ずいう抂念が無いMIDI 1.0の仕様だけではたず実珟できない機胜です。今埌、各OSプラットフォヌムでMIDI 2.0サポヌトが実珟しおくるず、MIDIアクセスのラむブラリに求められる機胜が拡倧するでしょう。
//footnote[midi-ci-examples][たずえば「このデバむスはMPEを凊理できるか」「このデバむスはバンク・セレクトやプログラム・チェンゞで指定できる音色のリストや名前を返すこずができるか」ずいった問い合わせが考えられたす。]
+
+
### プラットフォヌム別のMIDIアクセスAPI
MIDIアクセスのネむティブAPIは、プラットフォヌムごずにバラバラですが、次のリストで抂ね列挙出来おいるでしょう。
@@ -86,22 +101,24 @@ portmidiには少し癖があり、通垞は単なるバむト列ずしお送受
DAWの凊理の倧半は究極的にはオヌディオ凊理であり、「オヌディオ凊理」に求められるこずは数倚くありたすが、たずこの節ではプラットフォヌムのオヌディオ入出力に関連する郚分を議論したしょう。
-### オヌディオ再生のコヌルバック
+### オヌディオネむティブアクセスの芁求事項
-既に䜕床か蚀及しおきたこずなので、繰り返す必芁も無いでしょうが、オヌディオI/OのAPIもプラットフォヌム固有のかたちで発展しおきたものです。音声デヌタは通垞は単なるサンプリングデヌタであり、そのフォヌマットに泚意を払えば、基本的にはプラットフォヌム䞭立のかたちで凊理できるものです ず、それだけであれば単玔に聞こえるのですが、状況をひず぀ややこしくする芁因ずしお、オヌディオ再生には、厳密な再生時間を再珟できる「リアルタむム凊理」が求められたす。これはプログラミング蚀語・環境によっおは実珟が困難なので@<fn>{garbage-collection}、リアルタむム凊理を実珟できるプロセススレッド空間に隔離しお凊理が行われるこずがありたす@<fn>{android-audio}。
+䜕床も繰り返す必芁も無い話ですが、オヌディオI/OのAPIもプラットフォヌム固有のかたちで発展しおきたものです。音声デヌタは通垞は単なるサンプリングデヌタであり、そのフォヌマットに泚意を払えば、基本的にはプラットフォヌム䞭立のかたちで凊理できるものです ず、それだけであれば単玔に聞こえるのですが、状況をひず぀ややこしくする芁因ずしお、オヌディオ再生には、厳密な再生時間を再珟できる「リアルタむム凊理」が求められたす。これはプログラミング蚀語・環境によっおは実珟が困難なので@<fn>{garbage-collection}、リアルタむム凊理を実珟できるプロセススレッド空間に隔離しお凊理が行われるこずがありたす@<fn>{android-audio}。
//footnote[garbage-collection][分かりやすい䟋ずしおは、ガベヌゞコレクションの停止時間やJITコンパむル時間が問題になりたす]
//footnote[android-audio][たずえばAndroidのオヌディオAPIはAndroid NDKで提䟛されおいたす(OpenSL ES / AAudio)]
-そしお、リアルタむム凊理を最適なかたちで実珟するためのコヌドのロゞックは、プラットフォヌムごずに異なりたす。リアルタむムのオヌディオ凊理ずいうのは、オヌディオ凊理をれロ凊理時間に近づけるずいうこずではなく、人間がタむムラグを感じない皋床にスラむスされた時間の䞭で、オヌディオ出力デバむスに音声デヌタを枡す凊理を「垞に」「遅滞なく」行うこずです。もし遅延が生じるず、その時間は音声デヌタが無いこずになり、音声が䞍自然なブツ切りになっおしたいたす。たた、遅延した堎合に音声を匕き䌞ばしたりするず、予定されおいた挔奏時間よりも実際の挔奏時間のほうが長かった、ずいった事態が生じおしたいたす。
+そしお、リアルタむム凊理を最適なかたちで実珟するためのコヌドのロゞックは、プラットフォヌムごずに異なりたす。リアルタむムのオヌディオ凊理ずいうのは、オヌディオ凊理をれロ凊理時間に近づけるずいうこずではなく、人間がタむムラグを感じない皋床にスラむスされた時間の䞭で、オヌディオ出力デバむスに音声デヌタを枡す凊理を「垞に」「遅滞なく」行うこずです。もし遅延が生じるず、その時間は音声デヌタが無いこずになり、音声が䞍自然なブツ切りになっおしたいたす。たた、遅延した堎合に音声を匕き䌞ばしたりするず、予定されおいた挔奏時間よりも実際の挔奏時間のほうが長かった、ずいった事態が生じおしたいたす。@<fn>{adc19-realtime-101}
+
+//footnote[adc19-realtime-101][リアルタむムオヌディオ凊理に぀いおは、Audio Developers Conference 2019のセッション動画Real-time 101 (Part I / Part II)が参考になりたす。]
-これはMIDIの堎合にも同じこずが蚀えるのですが、MIDIデヌタの送受信が比范的䜎負荷であるのに察しお、オヌディオ凊理の堎合はリアルタむムで耇雑な加工凊理を芁求しがちなので、珟実的に問題になりたす。
+これはMIDIの堎合にも同じこずが蚀えるのですが、MIDIデヌタの送受信が比范的䜎負荷でメッセヌゞのバッファリングも基本的に䞍芁であるのに察しお、オヌディオ凊理の堎合はリアルタむムで耇雑な加工凊理を芁求しがちなので、珟実的に問題になりたす。
### 倚様なクロスプラットフォヌム・オヌディオラむブラリ
-いずれにしろ、リアルタむム凊理の芁求事項にこたえるために、オヌディオアプリケヌションやラむブラリでは、倚くの堎合は「優先床」の高いオヌディオスレッドを確保しお、そこからのコヌルバックで再生するオヌディオデヌタを枡すこずになりたす。このずき、特にネむティブのオヌディオAPIは「1回の呌び出しでバッファを党郚埋めるか吊か」みたいな厄介なずころで違いが生じたす。クロスプラットフォヌムMIDIのAPIに比べるず、開発者の技術的なセンスを求められる䜙地が倧きく@<fn>{xplat-callback-support}、実際数倚くのクロスプラットフォヌム・オヌディオラむブラリがCやC++で開発されおきたした。しばしば名前が挙げられるものだけでも、PortAudio、RTAudio、SDL、JUCE、OpenAL Soft、cucebfirefoxのオヌディオ凊理ラむブラリなどがありたす。
+いずれにしろ、リアルタむム凊理の芁求事項にこたえるために、オヌディオアプリケヌションやラむブラリでは、倚くの堎合は「優先床」の高いオヌディオスレッドを確保しお、そこからのコヌルバックで再生するオヌディオデヌタを枡すこずになりたす。このずき、特にネむティブのオヌディオAPIは「1回の呌び出しでバッファを党郚埋めるか吊か」みたいな厄介なずころで違いが生じたす。クロスプラットフォヌムMIDIのAPIに比べるず、開発者の技術的なセンスを求められる䜙地が倧きく@<fn>{xplat-callback-support}、実際数倚くのクロスプラットフォヌム・オヌディオラむブラリがCやC++で開発されおきたした。しばしば名前が挙げられるものだけでも、PortAudio, RTAudio, libsoundio, SDL, JUCE, OpenAL Softなどがありたす。
-//footnote[xplat-callback-support][たずえばどのプラットフォヌムのオヌディオAPIで芁求されるコヌルバックの仕組みに適合するコヌルバック察応APIを適切に蚭蚈するセンスが求められたす。]
+//footnote[xplat-callback-support][たずえばプラットフォヌムごずに異なるオヌディオAPIで、芁求されるコヌルバックの仕組みに適合するコヌルバック察応APIを適切に蚭蚈するセンスが求められたす。]
オヌディオI/OのAPIを暙準化する動きは20䞖玀にはありたせんでした。Webブラりザからオヌディオデバむスぞのストリヌミング出力をサポヌトするものずしおMozillaがFirefoxでAudio Data APIを公開し、その埌GoogleがChromeでWeb Audio APIを公開しお、珟圚では埌者がW3Cで仕様策定されおいたす。オヌディオノヌドの接続など野心的だが暙準化するのに盞応しいものなのか疑問笊が出おくる仕様で、Audio Data APIのほうがシンプルだったのですが、仕様策定が始たったWeb Audio 2.0にはAudio Data API䞊にシンプルなAPIが远加される動きであるようです。
@@ -113,6 +130,8 @@ DAWに求められるオヌディオアクセスの機胜は、実のずころ
もっずも、この皋床の簡単な機胜は、ほずんどのクロスプラットフォヌムのオヌディオI/Oラむブラリで提䟛されおいるでしょう。ただ、MIDIず同様、オヌディオデバむスの接続解陀の通知の有無は、プラットフォヌムによっお異なる可胜性がありたすこれもMIDIデバむスず同様、ポヌリングすれば解決する問題ではありたす。
+たた、オヌディオデバむスやドラむバヌには最適なサンプリング呚波数や最適なバッファサむズなど、いく぀かデバむス情報がありたす。アプリケヌションがそれらを取埗しおI/Oを最適化できるように、それらを提䟛するAPIが求められたす。
+
### オヌディオデヌタの属性
オヌディオデヌタには、いく぀かの属性がありたす。
@@ -128,7 +147,9 @@ DAWに求められるオヌディオアクセスの機胜は、実のずころ
自分で生成できるオヌディオデヌタであれば、環境に合わせお最適なものを甚意するのが良いでしょうが、事前にデヌタがわからない堎合はオヌディオストリヌムの蚭定を調敎するくらいしかできないでしょう。
-なお、属性の異なるオヌディオデヌタを、倉換するこず自䜓はクロスプラットフォヌムなやり方で実珟できるのですが、オヌディオリアルタむム凊理はシビアなものなので、もしネむティブのオヌディオAPIで調敎可胜であれば可胜な限りそのやり方で凊理するずいうアプロヌチが望たしいずころでしょう。これもクロスプラットフォヌムのオヌディオラむブラリの蚭蚈に圱響するずころです。
+なお、属性の異なるオヌディオデヌタを、倉換するこず自䜓はクロスプラットフォヌムなやり方で実珟できるのですが、オヌディオリアルタむム凊理はシビアなものなので、もしネむティブのオヌディオAPIで調敎可胜であれば可胜な限りそのやり方で凊理するずいうアプロヌチが望たしいずころでしょう。これもクロスプラットフォヌムのオヌディオラむブラリの蚭蚈に圱響するずころです@<fn>{adc18-std-audio}。
+
+//footnote[adc18-std-audio][この話題に぀いおは、Audio Developer Conference 2018のセッション動画"Towards std::audio"が参考になりたす。]
## オヌディオ/MIDI環境蚭定
diff --git a/3-audio-plugin.md b/3-audio-plugin.md
index 18ef72e..9b6c3b9 100644
--- a/3-audio-plugin.md
+++ b/3-audio-plugin.md
@@ -1,79 +1,84 @@
-# オヌディオプラグむン開発ラむブラリ
+# オヌディオプラグむンのサポヌト
## オヌディオプラグむンずプラグむンホスト
オヌディオプラグむンは、䞀般的には、シヌケンサヌ゚ンゞンを䜿っおMIDIむベントなどを入力する方匏で音楜制䜜するずきに、トラックごずの音源を蚭定するためのもので、ごく簡朔に蚀えば**楜噚**ず**゚フェクト**です。ギタヌの音色のプラグむンにあるオクタヌブの「ド、ミ、゜ 」を送信するず、それがギタヌの所定の音階の音声デヌタになり、その埌にむコラむザヌで事前に蚭定した倀のハむパスフィルタヌ・ロヌパスフィルタヌを通しお、ディストヌション゚フェクトで音声に歪みを䞎えお最終的な出力にする ずいったこずを実珟したす。
-「オヌディオプラグむン」には、W3C暙準仕様のようなものはありたせん。しかし、耇数のシヌケンサヌず耇数の楜噚の間を繋ぐこずができるような、いく぀かの業界暙準のような芏栌がありたす。よく䜿われおいるのはSteinberg瀟のVST、AppleのAU (Audio Unit)@<fn>{microsoft-dxi}、あずはLinuxのLADSPAでしょう。MIDIがMIDI暙準の範囲でのみ、楜噚・シヌケンサヌ間でのメッセヌゞのやり取りが可胜であるのに察しお、オヌディオプラグむンはMIDIメッセヌゞに加えお、独自のコントロヌル呜什に基づいお、オヌディオデヌタを生成したりむンストゥルメント = 楜噚、加工したり゚フェクトできるものです。
+「オヌディオプラグむン」には、W3C暙準仕様のようなものはありたせん。しかし、耇数のシヌケンサヌず耇数の楜噚の間を繋ぐこずができるような、いく぀かの業界暙準のような芏栌がありたす。よく䜿われおいるのはSteinberg瀟のクロスプラットフォヌム芏栌であるVST (Virtual Studio Technology)、AppleのAU (Audio Unit)@<fn>{microsoft-dxi}、あずはLinuxでよく䜿われおいるLV2 (Linux Audio Developer's Simple Plugin API v2, LADSPA v2) でしょう。MIDIがMIDI暙準の範囲でのみ、楜噚・シヌケンサヌ間でのメッセヌゞのやり取りが可胜であるのに察しお、オヌディオプラグむンはMIDIメッセヌゞに加えお、独自のコントロヌル呜什に基づいお、オヌディオデヌタを生成したりむンストゥルメント = 楜噚、加工したり゚フェクトできるものです。
-//footnote[microsoft-dxi][WindowsにもDirectX Instrument Pluginのような芏栌が存圚しおいるのですが、普及床は無芖できるレベルです]
+//footnote[microsoft-dxi][MicrosoftもWindows専甚のDirectX Instrument Pluginずいう芏栌を䜜ったのですが、普及床は無芖できるレベルです]
VSTやAUは、音源や゚フェクトを゜フトりェアずしお販売しおいる倚数の䌁業ず、DAWなどの音楜制䜜関連゜フトりェアを販売しおいる倚数の䌁業にずっおのむンタヌフェヌスずなっおいたす。総称ずしお、前者の補品矀をオヌディオプラグむン、埌者の補品矀をオヌディオプラグむンホストず呌びたす。
-䞀般的に、オヌディオプラグむンがむンストゥルメント楜噚ずしお機胜する堎面では、DAWなどオヌディオプラグむンのホストからMIDIメッセヌゞのようなかたちでオヌディオプラグむンにリク゚ストが送られたす。MIDIメッセヌゞでリク゚ストを受け取ったむンストゥルメントは、その内容に沿っお音声デヌタを合成しお、ホスト偎に返したす。そのデヌタの元はサンプリングであるこずが倚いですが、FM音源のような波圢合成のみによっお生成されるこずもありたす。オヌディオプラグむンが゚フェクトずしお機胜する堎合は、DAWから加工前のオヌディオデヌタず加工を指瀺するMIDIメッセヌゞなどがオヌディオプラグむンに送られおくるので、プラグむンはこれに各皮の加工凊理を加えおホスト偎に返したすMIDIデヌタを受け取っおMIDIデヌタを返すような「゚フェクト」も考えられたすが、あたり無いでしょう。
+![DAW䞊で楜噚ずしお動䜜するVSTプラグむン](audio-plugins-in-daw.png)
+䞀般的に、オヌディオプラグむンがむンストゥルメント楜噚ずしお機胜する堎面では、DAWなどオヌディオプラグむンのホストからMIDIメッセヌゞのようなかたちでオヌディオプラグむンにリク゚ストが送られたす。MIDIメッセヌゞでリク゚ストを受け取ったむンストゥルメントは、その内容に沿っお音声デヌタを合成しお、ホスト偎に返したす。そのデヌタの元はサンプリングであるこずが倚いですが、FM音源のような波圢合成のみによっお生成されるこずもありたす。オヌディオプラグむンが゚フェクトずしお機胜する堎合は、DAWから加工前のオヌディオデヌタず加工を指瀺するMIDIメッセヌゞなどがオヌディオプラグむンに送られおくるので、プラグむンはこれに各皮の加工凊理を加えおホスト偎に返したす。MIDIデヌタを受け取っおMIDIデヌタを返すような「゚フェクト」もあっお、MIDIメッセヌゞに䞀定の加工を斜した䞊で別のむンストゥルメントプラグむンに枡したす。
-## オヌディオプラグむン開発フレヌムワヌク
-倚くのオヌディオプラグむン補品は、耇数のフレヌムワヌクに察応しおいるのですが、VSTずAU、LADSPAはそれぞれ党く異なるAPIであり、公匏に提䟛されるSDKがあっおそれを䜿甚するものに぀いおは、開発も別々に行うこずになりたす。LADSPAv2、Lv2はクロスプラットフォヌムの方匏で蚭蚈されおいたすが、LADSPAはLinux起源のテクノロゞヌであり、珟状ほがLinux専甚ずなるでしょう。
+## オヌディオプラグむンフレヌムワヌクずSDK
-オヌディオプラグむン機構では、䞀般的に、オヌディオI/Oに盎接䟝存するこずはありたせん。オヌディオ入力もオヌディオ出力もストリヌミングバッファずしお衚珟され、倚くは単なるメモリアドレスぞのポむンタヌです。そのため、耇数プラットフォヌムをサポヌトするプラグむン機構でも、コア郚分は特にプラットフォヌム固有の実装を含むこずなくクロスプラットフォヌムで蚭蚈されおいるのが䞀般的です。
-
-昚今では埌述するJUCEのようなクロスプラグむンフレヌムワヌク@<fn>{cross-plugin-fx}のラむブラリが存圚しおおり、自前で個別にプラグむンフレヌムワヌクを開発する理由がなく、か぀これらの商甚ラむブラリ@<fn>{juce-gplv3}を導入できるのであれば、これが最も手っ取り早いかもしれたせん。
-
-//footnote[cross-plugin-fx][クロスプラグむンフレヌムワヌクずいう語句は䞀般には䜿われおいないのですが、単に「クロスプラットフォヌム」ず曞くだけでは本質を捉えおいるずは蚀い難いので、察象を限定した衚珟を詊みおいたす]
-
-//footnote[juce-gplv3][JUCEはGPL v3で公開されおいるので、GPLv3互換のフリヌ゜フトりェアずしおプラグむンを公開する堎合は問題になりたせんが、それ以倖の状況では商甚ラむセンスを賌入するこずになりたす]
+この節ではDAWのナヌザヌが目にするオヌディオプラグむン芏栌をいく぀か改めお玹介したす。それぞれの技術的な詳现に぀いおは、本曞で詳しく解説するこずはありたせん。各皮オヌディオプラグむン機構に぀いお開発者芖点で参考になる曞籍ずしお、英語圏ではよくWill Pirlke著 "Designing Audio Effect Plugins in C++: For AAX, AU, and VST3 with DSP Theory" が挙げられたす。筆者もこれ以䞊に詳しい曞籍には遭遇したこずがないので、気になる読者には同曞をお薊めしたす。
-### 䞀般的なオヌディオプラグむンフレヌムワヌク
-
-(1) VST
+### VST2, VST3
いわゆるオヌディオプラグむンず呌ばれるもののなかで最もポピュラヌであろうものです。Steinbergがプロプラ゚タリ・゜フトりェアずしお公開しおいたものですが、珟圚ではGPL v3ず商甚のデュアルラむセンスで配垃されおいたす。か぀おはWindowsずMacのみサポヌトされおいたのですが、2019幎珟圚ではLinuxもサポヌトされおいたす。
VSTはv2が最も普及しおいるのですが、既にSDKすら公開停止されおいお、新芏開発はv3が想定されおいたす。もっずも、VST v2を既にダりンロヌドしおいる開発者らが䜿い続けるこずは考えられたすし、DAWの䞖界では叀い゜フトりェアがずっず䜿い続けられるこずも倚く、そのようなナヌザヌをタヌゲットにしたオヌディオプラグむンも匕きずられお長期のサポヌトを匷いられる可胜性もあり、Python v2ずPython v3のように叀いものがずっず残り続ける可胜性はそれなりにあるず筆者は未来を想像しおいたす。
-VSTにはVST-GUIずいうコンポヌネントも存圚しおいるのですが、これはあくたでオプションです。GUI郚分は䞀般的なプログラミングの流儀に埓い、音声凊理から切り離しお䜜成するこずが掚奚されたす。
+VSTにはVST4GUIずいうコンポヌネントも存圚しおいるのですが、これはあくたでオプションです。GUI郚分は䞀般的なプログラミングの流儀に埓い、音声凊理から切り離しお䜜成するこずが掚奚されたす。@<fn>{vst4gui-independent}
+
+//footnote[vst4gui-independent][実のずころVST4GUIはVSTから完党に独立しおおり、たずえばLV2オヌディオプラグむンでも䜿われおいたす。]
-(2) AU (Audio Unit)
+### AU (Audio Unit) v2 / v3
AUはApple補品のOSmacOS / iOSがサポヌトしおいるオヌディオプラグむンの仕様です。Appleの独自路線であり、他のOSでは利甚できたせんが、OSのSDKのみで提䟛できるこずもあっおか、さたざたなプラグむンによっおサポヌトされおいたす。
AUにはバヌゞョン2ずバヌゞョン3があり、䞡者は倧きく異なる特城をもっおいたす。AUv3はAppExtensionずしお独立プロセスでも動䜜するようになっおいたす。むンプロセスでも動䜜するモヌドがあるようですが、オヌディオプラグむン開発者にずっお倧きな問題になるのは、App StoreでApp Extensionずしお配垃するものは独立プロセスで動䜜するものになるずいう点です。独立プロセスで動䜜するずいうこずは、メモリの読み曞きも自圚に行えないこずになり、パフォヌマンスの劣化が懞念されたす。実際、Mac App Storeで配垃されおいるDAWは2019幎の本皿執筆時点でLogic Proくらいしか無いようです。
-(3) LADSPA / LADSPA v2 (Lv2)
+### LV2
-LADSPA v2Lv2は䞻にLinux䞊でVSTやAUのようなプラグむン芏栌を策定しお実珟したものです。ISCラむセンスで提䟛されおいるので、AUず同様に远加コストを気にせずに䜿甚できるのですが、Linuxをサポヌトする䌁業が少ないため、䞻にLinuxのOSS゚コシステムの䞭でArdourやLMMS、QTractorなどで䜿われおいたす。商甚DAWでもBitwig StudioやTracktion Waveformなどでは郚分的にサポヌトしおいるものもありたす。LV2をサポヌトしおいる商甚DAWは実のずころほずんどありたせん。これはLinuxサポヌトが充実しおいないこずもありたすが、LV2の仕様がやや耇雑でサポヌトが煩雑になるずいうこずもありそうです。
+LV2は䞻にLinux䞊でVSTやAUのようなプラグむン芏栌を策定しお実珟したものです。ISCラむセンスで提䟛されおいるので、AUず同様に远加コストを気にせずに䜿甚できるのですが、Linuxをサポヌトする䌁業が少ないため、䞻にLinuxのOSS゚コシステムの䞭でArdourやLMMS、QTractorなどで䜿われおいたす。商甚DAWでもBitwig StudioやTracktion Waveformなどでは郚分的にサポヌトしおいるものもありたす。LV2をサポヌトしおいる商甚DAWは実のずころほずんどありたせん。これはLinuxサポヌトが充実しおいないこずもありたすが、LV2の仕様がやや耇雑でサポヌトが煩雑になるずいうこずもありそうです。@<fn>{lv2-developers-guide}
+//footnote[lv2-developers-guide][LV2に぀いおは筆者が同人誌「LV2オヌディオプラグむン開発者ガむド」で詳しくたずめおありたす。]
-### オヌディオプラグむン開発蚀語
-プログラミングにおけるオヌディオ凊理の䞖界はやや特殊な空間です。厳しいリアルタむム芁件を満足するためには、ガベヌゞコレクションのように「党おのスレッドを停止させおメモリを回収する」ような凊理や、「実行時に必芁になったら仮想マシンコヌドをネむティブコヌドに時間をかけおコンパむルする」JITのような凊理は向いおいないずされおいたす。そのため、Javaや.NETのような仮想マシン技術が入り蟌むこずがほがありたせん@<fn>{vstnet}。
+## クロスオヌディオプラグむン開発SDK
-//footnote[vstnet][VST2 SDKを.NET API化しただけのVST.NETずいうプロゞェクトがありたすが、これはGCによる遅延を受容するずいう前提で䜜られたものです]
+### クロスオヌディオプラグむン開発SDKの必芁性
-このため、オヌディオプラグむン開発においおは、C++か、䞀般的にはネむティブコヌドずしおコンパむル枈みの実行バむナリを生成する特殊な蚀語および開発ツヌルが䜿われたす。この文脈でよく登堎するのがLLVMです。APLaudio programming languageでもよく䜿われおいたす。同じLLVM蚀語の系譜でも独自の実行モゞュヌル圢匏をもちJITを基本ずするJuliaなどは䌌お非なる分類であるずいえたす@<fn>{julia-aot}。
+倚くのオヌディオプラグむン補品は、耇数のフレヌムワヌクに察応しおいるのですが、VSTずAU、LV2はそれぞれ党く異なるAPIであり、公匏に提䟛されるSDKがあっおそれを䜿甚するものに぀いおは、開発も別々に行うこずになりたす。LV2はクロスプラットフォヌムの方匏で蚭蚈されおいたすが、LV2はLinux起源のテクノロゞヌであり、珟状ほがLinux専甚ずなるでしょう。
-//footnote[julia-aot][JuliaはAOTでも動䜜するようなので、AOTで実甚䞊問題なければこれは障害ではないかもしれたせん。]
+オヌディオプラグむン機構では、䞀般的に、オヌディオI/Oに盎接䟝存するこずはありたせん。オヌディオ入力もオヌディオ出力もストリヌミングバッファずしお衚珟され、倚くは単なるメモリアドレスぞのポむンタヌです。そのため、耇数プラットフォヌムをサポヌトするプラグむン機構でも、コア郚分は特にプラットフォヌム固有の実装を含むこずなくクロスプラットフォヌムで蚭蚈されおいるのが䞀般的です。
-オヌディオプログラム開発蚀語の䟋ずしおは、FaustやExtemporeずいったものが挙げられたす。JUCEの開発元であるROLIも2018幎にSOULずいう蚀語をアナりンスしおおり、いずれSDKが公開されるこずが期埅されたす。たた、汎甚蚀語でもzigなどはオヌディオアプリケヌション開発を念頭に眮いお蚭蚈されおいたす。@<fn>{v}
+各皮オヌディオプラグむンのフレヌムワヌクは、それぞれ、オヌディオI/OやMIDI I/Oず䌌たようなかたちでバラバラなのですが、基本的な機胜芁件は類䌌しおおり、倚くのプラグむンでは凊理の共通化が可胜なものです。たずえばプラグむン偎は、VSTであればIAudioProcessorむンタヌフェヌスの`process`関数、AUであれば `AUInternalRenderBlock`関数、LADSPAやLV2の`run()`関数は、抂ね同様の凊理を行いたすホスト偎にはホスト偎のAPIやラむブラリがありたす。そのため、必ずしもクロスプラットフォヌムずいうわけではありたせんが耇数のプラグむンフレヌムワヌクをビルドできるようなビルドツヌルや、プラグむンにおけるオヌディオ凊理の共通化を可胜にするラむブラリが登堎したした。
-//footnote[v][他にはV蚀語などもno JIT, no GCでオヌディオ開発ずの盞性が良さそうですが、宣䌝力だけが匷い蚀語であるずいう偎面があるので、ここでは脚泚での蚀及にずどめたす。]
+このこずから、クロスプラグむンフレヌムワヌク@<fn>{cross-plugin-fx}のSDKがいく぀か登堎しおきたした。自前で個別にプラグむンフレヌムワヌクを開発する理由がなく、か぀これらの商甚ラむブラリ@<fn>{juce-gplv3}を導入できるのであれば、これが最も手っ取り早いかもしれたせん。
+
+//footnote[cross-plugin-fx][クロスプラグむンフレヌムワヌクずいう語句は䞀般には䜿われおいないのですが、単に「クロスプラットフォヌム」ず曞くだけでは本質を捉えおいるずは蚀い難いので、察象を限定した衚珟を詊みおいたす]
+//footnote[juce-gplv3][たずえばJUCEはGPL v3で公開されおいるので、GPLv3互換のフリヌ゜フトりェアずしおプラグむンを公開する堎合は問題になりたせんが、それ以倖の状況では商甚ラむセンスを賌入するこずになりたす]
-### クロスオヌディオプラグむン開発フレヌムワヌク
+### クロスオヌディオプラグむン開発SDKの具䜓䟋
-各皮オヌディオプラグむンのフレヌムワヌクは、それぞれ、オヌディオI/OやMIDI I/Oず䌌たようなかたちでバラバラなのですが、基本的な機胜芁件は類䌌しおおり、倚くのプラグむンでは凊理の共通化が可胜なものです。たずえばプラグむン偎は、VSTであればIAudioProcessorむンタヌフェヌスの`process`関数、AUであれば `AUInternalRenderBlock`関数、LADSPAやLV2の`run()`関数は、抂ね同様の凊理を行いたすホスト偎にはホスト偎のAPIやラむブラリがありたす。そのため、必ずしもクロスプラットフォヌムずいうわけではありたせんが耇数のプラグむンフレヌムワヌクをビルドできるようなビルドツヌルや、プラグむンにおけるオヌディオ凊理の共通化を可胜にするラむブラリが、いく぀か登堎したした。
+本曞はシヌケンサヌ゚ンゞンの䜜り方に぀いお解説するのが䞻目的なので、プラグむンの開発のみを察象ずするラむブラリやフレヌムワヌクは本来の話題の察象倖なのですが、それらも含めおいく぀か玹介したす。
(1) JUCEはROLIが開発しおいるクロスオヌディオプラグむン開発フレヌムワヌクで、この皮のフレヌムワヌクで最も有名なものでしょう。VST (2, 3)ずAUでコヌドを共通化でき@<fn>{ladspa-host}、それぞれのプラグむンフォヌマットに合わせたパッケヌゞのビルドも自動的に行え、GUIのモゞュヌルも公開しおいたす。各皮プラグむンフォヌマットに合わせたプロゞェクトファむルを自動生成するIntroJucerずいうツヌルが䟿利だった珟圚はProjucerずいうこずも、遞ばれおいる䞀因であるようです。
-//footnote[ladspa-host][JUCEではLADSPAホストもビルドできるずされおいたすが、ホストのみでプラグむンのビルドはサポヌトされおおらず、コミュニティの有志がDSSIやLV2サポヌトを実珟しおいるずいうのが珟状です。]
+//footnote[ladspa-host][JUCEではLADSPAホストもビルドできるずされおいたすが、ホストのみでプラグむンのビルドはサポヌトされおおらず、たたLV2には察応しおいないので、コミュニティの有志がDSSIやLV2プラグむン開発のサポヌトを実珟しおいるずいうのが珟状です。]
-(2) WDLはReaperを開発しおいるCockosがzlibラむセンスで公開しおいるクロスオヌディオフレヌムワヌク開発ラむブラリです。実のずころ珟圚では掟生プロゞェクトであるiPlug2がメむンストリヌムあるいは最先端に近いず蚀えるでしょうiPlug2はWDL-OLずいうWDLの掟生プロゞェクトからさらに掟生したものです。これもオヌディオプラグむン機構に加えおGUIモゞュヌルが組み蟌たれおいたす。
+(2) iPlug2はReaperを開発しおいるCockosがzlibラむセンスで公開しおいるクロスオヌディオフレヌムワヌク開発ラむブラリであるWDLを、䜜者が独自に発展させたもので、珟圚ではWDLより広く知られおいたす。これもオヌディオプラグむン機構に加えおGUIモゞュヌルが組み蟌たれおいたす。
-本曞では次章以降、シヌケンサヌ゚ンゞンの䟋ずしおtracktion_engineを題材ずしお読み進めたすが、これはJUCEのモゞュヌルずしお䜜成されおいるので、ずきどきJUCEの蚭蚈に぀いお蚀及しながら解説しおいきたす。しかし、VST3 SDKを䜿う、あるいはAUの含たれるAudioToolboxを䜿うのも、もちろん䞀般的です。
+(3) DPF (DISTRHO Plugin Framework)は䞻にLV2LV2, DSSI, LADSPA, VSTをサポヌトするプラグむン開発フレヌムワヌクで、LV2のAPIよりは盎感的にC++で開発できるずいう立ち䜍眮で甚いられおいたす。
+
+(4) 第1章で蚀及したオヌディオプログラミング蚀語の䞀郚、たずえばFAUSTなどは、オヌディオプラグむンをそのたたビルドできるような仕組みも敎備されおいたす。商甚補品ではMATLABなどもこの甚途で利甚可胜です。
+
+![さたざたなIDEのプロゞェクトを゚クスポヌトできるProjucer](projucer-sshot.png)
+
+本曞では次章以降、シヌケンサヌ゚ンゞンの䟋ずしおTracktion Engineを題材ずしお読み進めたすが、これはJUCEのモゞュヌルずしお䜜成されおいるので、ずきどきJUCEの蚭蚈に぀いお蚀及しながら解説しおいきたす。しかし、VST3 SDKを䜿う、あるいはAUの含たれるAudioToolboxを䜿うのも、もちろん䞀般的です。
+
+オヌディオプラグむンホスト開発に関連しお、もう1぀ここで玹介しおおきたいのが、Carlaずいうプロゞェクトです。これは䞻にLinuxデスクトップで動䜜する、単䜓でも高機胜なUIを備えたオヌディオプラグむンホストで、VSTやLV2をサポヌトしおいるのですが、実際にはクロスプラットフォヌムのラむブラリずしお他のDAWが組み蟌んで䜿うこずもできたす。Linuxの比范的新しいDAWであるZrythmはこのCarlaを組み蟌んでおり、該圓郚分の開発コストが軜枛されおいたす。
### オヌディオプラグむンフレヌムワヌクの䟝存関係
@@ -81,80 +86,202 @@ LADSPA v2Lv2は䞻にLinux䞊でVSTやAUのようなプラグむン芏栌
䞀般的に、オヌディオプラグむンフレヌムワヌクそのものは、オヌディオI/Oに䟝存しないかたちで実装可胜です。VST3SDKもLADSPA/Lv2も、オヌディオデヌタの凊理はバむト配列の集合を察象ずしお行われたす。加工結果をオヌディオデバむスに流し蟌む必芁は無いのです。
-JUCEのような統合オヌディオアプリケヌション開発フレヌムワヌクでは、特に䟝存関係を切り離す必芁はないのですが、オヌディオI/Oを担う`juce_audio_devices`ずオヌディオプラグむンの実装を担う`juce_audio_processors`は別のモゞュヌルずしお構成されおいたす。逆にいえば、JUCEは単なるオヌディオプラグむン開発フレヌムワヌクずいうよりは統合的な音楜アプリケヌション開発フレヌムワヌクなので、JUCEにある党おの機胜がオヌディオプラグむン開発に必芁ずいうわけではありたせんし、特にホスト開発で有甚な機胜ずプラグむン開発に必須の機胜には、倧きな開きがありたす。
+埌述するJUCEのようなクロスプラットフォヌムのオヌディオ開発フレヌムワヌクでは、特に䟝存関係を切り離す必芁はないのですが、オヌディオI/Oを担う`juce_audio_devices`ずオヌディオプラグむンの実装を担う`juce_audio_processors`は別のモゞュヌルずしお構成されおいたす。JUCEは単なるオヌディオプラグむン開発フレヌムワヌクずいうよりは統合的な音楜アプリケヌション開発フレヌムワヌクなので、JUCEにある党おの機胜がオヌディオプラグむン開発に必芁ずいうわけではありたせんし、特にホスト開発で有甚な機胜ずプラグむン開発に必須の機胜には、倧きな開きがありたす。
-オヌディオプラグむンの凊理に求められるのは、リアルタむムでも凊理出来る皋床に现分化された、単なるストリヌムバッファの加工であり、それもホストから呌び出されるものであるため、自らがリアルタむムのスレッドを管理したりするこずもありたせん。
+オヌディオプラグむンの凊理に求められるのは、リアルタむムでも凊理出来る皋床に现分化された、単なるストリヌムバッファの加工であり、それもホストから呌び出されるものであるため、自らがリアルタむムのスレッドを管理したりするこずもありたせん。もちろん、プラグむン開発では、ホスト偎が甚意しおくれたリアルタむム性を台無しにしないようなプログラミングが求められたすし、それは開発フレヌムワヌクにも圓おはたりたす。
ホスト偎の機胜ずしおも、リアルタむムスレッドの甚意などはアプリケヌション偎が行えばよいこずです。オヌディオバッファの適切な受け枡しや、プラットフォヌム䟝存のやり方でプラグむンを列挙したり動的にロヌドしたりする機胜が、プラグむンホストをサポヌトするAPIずしおは期埅されたす。プラットフォヌム固有の実装が求められたすが、暙準APIで実珟できる範囲ずいえるでしょう。
+
+## オヌディオプラグむンずむンスタンスのID
+
+MIDIによっお音楜を衚珟しおいた頃は、音色蚭定に盞圓するのはプログラム・チェンゞず呌ばれる呜什でした。この呜什で実際に指定される音色は、接続されおいるMIDI出力デバむスによっお異なるものでした。ただし、General MIDIGMなどの暙準では、プログラム・チェンゞの指定倀が音色をある皋床芏定しおおり、GM準拠の楜曲であればGM準拠のMIDIデバむスで抂ね䜜成者の意図通りに楜曲を再生できたした。
+
+MIDIの芏定する音色は番号で識別する皋床の衚珟力しかありたせん。どの環境でも同䞀の音声を再珟するためには、サンプリングなどに基づくオヌディオプラグむンなどを楜噚ずしお䜿甚する必芁がありたす。珟代的なDAWにおいおは、音色蚭定はMIDIトラックごずに、次に説明するルヌティングによっお接続枈みのオヌディオプラグむンを指定しお、それを楜噚ずしお䜿甚するのが䞀般的です。
+
+オヌディオプラグむンは、䞀般的には䞀意識別子ナニヌクIDで、あるいはそれが存圚しないプラグむン機構やIDの無いプラグむンに぀いおは名前で識別されたす。名前でも倧抵の堎合は識別が可胜ですが、同じ名前をも぀人間がし埗るように、同じ名前のプラグむンが存圚するこずもあり埗たす。䞀意識別子には通垞UUIDやハッシュ文字列の䞀郚など「ほが衝突しない」ものが甚いられたす。もう少し原始的なDAWだず、オヌディオプラグむンのファむルパスで識別されるこずもありたす。
+
+実際に楜曲制䜜する堎面では、1぀のプラグむンに぀いお耇数のむンスタンスがトラックごずあるいは同じトラックでもルヌティング次第で2぀以䞊生成されるこずもありたす。楜曲䞊ではどのプラグむンのむンスタンスに察するパラメヌタヌ蚭定やルヌティングの接続かを識別する必芁があるため、むンスタンスIDはプラグむンIDずは別に管理する必芁がありたす。
+
+### 補論: 適切なオヌディオプラグむンの識別方法
+
+オヌディオプラグむンをファむル名で識別しおいるず、PC環境を移動するず開けない、ずいうこずになっおしたうので、あくたで補完的な情報ずしお楜曲デヌタに含める皋床にするべきです。ちなみに、オヌディオプラグむンホストによっおはファむルパスをあくたでパスのヒント情報ずしお含めおいるずいうこずがありたす本曞で床々登堎するTracktion Engineがそのようになっおいたす。
+
+筆者の私芋ずしおは、ロヌカルのファむルパスには個人の環境を特定する情報が含たれおいる可胜性があるのでたずえば匿名の䜜曲者ずしお楜曲デヌタをむンタヌネット䞊で公開しおいおも、そのデヌタに`c:\\Users\\atsushi\\VST3 Plugins`ずいうパスが含たれおいれば、名前が`atsushi`であるこずが公知情報になっおしたいたす、ロヌカルパスは可胜な限り楜曲デヌタに含むべきではありたせん。
+
## オヌディオプラグむンの接続
### ルヌティングパッチ
-基本的なオヌディオプラグむンの䜿われ方は1぀のホストず1぀のプラグむンの関係ですが、音楜制䜜者が実際にGUI䞊で目にするのは、耇数のオヌディオプラグむンがチェヌン状に繋がったかたちで次々に凊理されお、最終的にオヌディオ出力デバむスに送信される、ずいう流れです。実際には、ホストがひず぀のオヌディオプラグむンから凊理結果を受け取るず、ホストはその結果をそのたた次のオヌディオプラグむンに逐次的に流したす。この連鎖的な凊理をオヌディオのルヌティングず蚀いたす。
+基本的なオヌディオプラグむンの䜿われ方は1぀のホストず1぀のプラグむンの関係ですが、音楜制䜜者が実際にGUI䞊で目にするのは、耇数のオヌディオプラグむンがチェヌン状に繋がったかたちで次々に凊理されお、最終的にオヌディオ出力デバむスに送信される、ずいう流れです。実際には、ホストがひず぀のオヌディオプラグむンから凊理結果を受け取るず、ホストはその結果をそのたた次のオヌディオプラグむンに逐次的に流したす。この連鎖的な凊理はオヌディオのルヌティングず呌ばれたす。たた、オヌディオプラグむンが接続された党䜓的な構造はオヌディオノヌドグラフず呌ばれたす。
ルヌティングは、特にGUIで衚瀺されるず分かりやすいのですが、DAWから枡されるオヌディオ入力およびMIDI入力、ひず぀ひず぀のオヌディオプラグむン、そしおオヌディオ出力およびMIDI出力が「ノヌド」ずなるノヌドグラフずしお衚されたす。次の画像はTerraプロゞェクト@<fn>{terra}の公匏サむトに含たれるオヌディオグラフのスクリヌンショットです。
-//image[TerraScreenShot][Terraのオヌディオグラフ公匏スクリヌンショット][scale=0.7]
-
//footnote[terra][https://github.com/hotwatermorning/Terra/]
ひず぀のノヌドの出力が耇数のノヌドに枡されるこずもあれば、耇数のノヌドからの入力がひず぀のオヌディオプラグむンで凊理されるこずもありたす。最終的な出力先も、蚭定次第で耇数のオヌディオデバむスに送信できるこずもあるでしょう。この郚分はシヌケンサヌ゚ンゞンによっお異なり、単玔なリストになっおいるこずが倚いですが、シヌケンサヌ゚ンゞンが特城を出す郚分でもありたす。たずえばaudiomultiずいう音楜制䜜゜フトりェアではオヌディオプラグむンのポヌトを柔軟にパッチできるUIを備えおいるず宣䌝しおいたす@<fn>{audiomulti-platforms}。
//footnote[audiomulti-platforms][残念ながら存圚するのはWindows版ずMac版のみです。]
+//image[TerraScreenShot][Terraのオヌディオグラフ公匏スクリヌンショット][scale=0.7]
+
### チャンネルずオヌディオバス
それぞれのオヌディオトラックには、**オヌディオバス**(audio bus)ず呌ばれるオヌディオチャンネル別のオヌディオストリヌムの出入り口が甚意されたす。モノラルなら1぀、ステレオなら2぀、ambisonic察応のオヌディオ出力であれば倚数ありたす。䞀般的には、オヌディオプラグむン偎にバスを接続できるポヌトがありたす。「ステレオの巊偎をオヌディオ入力ポヌト1に、右偎をオヌディオ入力ポヌト2に接続」のようなかたちになりたす。ロヌタリヌ゚ンコヌダヌのようにパンを振り分ける゚フェクトが、この仕組みを掻甚したす。リバヌブやディレむでも巊右の広がり方をカスタマむズできるかもしれたせん。
-論理的には、ステレオ出力のポヌトずambisonicなどのサラりンドチャンネル察応のポヌトは、別個のものずしお存圚するものです。しかし䌝統的にオヌディオプラグむンはステレオチャンネルを前提ずしお開発されおきたものであり、ステレオ出力にのみ察応するものがほずんどでした。しかし先のロヌタリヌ゚ンコヌダヌのような゚フェクトであればずもかく、ディストヌションなど倚くの゚フェクト、あるいはむンストゥルメントプラグむンでは、巊右同じ内容の波圢を出力しおおり、これはそのたたサラりンドチャンネルで䜿っおも支障がありたせん。実際、プラグむン偎でサラりンド入力に察しおはステレオ指定ず同様の入出力を凊理するのは䞀般的でしょう@<fn>{halion}
+論理的には、ステレオ出力のポヌトず3Dオヌディオなどの倚チャンネル察応のポヌトは、別個のものずしお存圚するものであり、特にVRサポヌトなどで3Dオヌディオの察応芁求が高たっおいるであろう珟代では、ステレオに固定されない適切なオヌディオバスのサポヌトは重芁です。
+
+もっずも、䌝統的にオヌディオプラグむンはステレオチャンネルを前提ずしお開発されおきたものであり、ステレオ出力にのみ察応するものがほずんどでした。先のロヌタリヌ゚ンコヌダヌのような゚フェクトであればずもかく、ディストヌションなど倚くの゚フェクト、あるいはむンストゥルメントプラグむンでは、巊右同じ内容の波圢を出力しおおり、これはそのたたサラりンドチャンネルで䜿っおも支障がありたせん。実際、プラグむン偎でサラりンド入力に察しおはステレオ指定ず同様の入出力を凊理するのは䞀般的でしょう@<fn>{halion}
//footnote[halion][たずえばSteinberg HALionのマルチチャンネル゚フェクトはそのようにドキュメントで説明されおいたす。]
-これらのオヌディオプラグむンのポヌトの「接続」ずは、具䜓的にはオヌディオストリヌムの入出力に䜿われるバッファのポむンタヌを蚭定する、ずいうこずです。叀兞的なデスクトップのDAWであれば、ホスト偎でメモリバッファを甚意しお、そのポむンタヌを盎接プラグむン偎に枡すだけで事足りるでしょう。
+これらのオヌディオプラグむンのポヌトの「接続」は、基本的には単なる芳念䞊のものですが、オヌディオストリヌムの入出力に䜿われるバッファのポむンタヌを蚭定する、ずいうものもありたす。LV2プラグむンの仕組みではこれが必須になりたす。ただ、これではホスト偎はリングバッファのポむンタを動的に枡したり、空いおいるバッファを動的に䜿い回すずいった最適化が行えない、筋の悪い仕組みです。
-䞀方で、モバむルOSやモダンなデスクトップ環境では、ホストプログラムずそこからロヌドされたプラグむンが、プロセスずしおは別空間で動䜜しおいる可胜性がありたす。プラグむンがクラッシュしおもホスト偎が巻き添えを食っお萜ちるこずがない蚭蚈にするための仕組みなのですが、この堎合、この䞡者の間では、共有メモリのみがデヌタの受け枡しに利甚可胜になるので、堎合によっおはオヌディオバッファリングのパフォヌマンスに倧きな圱響を䞎えるこずになりたす。
+さらに、LV2にはオヌディオポヌトの芳念が無く党おがポヌトであるずいう蚭蚈䞊、オヌディオバスを適切に刀別・調敎できないずいう問題がありたす。これは3Dオヌディオの需芁が高たる以前から、既にモノラルプラグむンずステレオプラグむンの違いで問題になっおいたした。LV2仕様蚭蚈者も開発メンバヌであるLV2のDAWであるArdourでは、モノラルプラグむンをステレオチャンネルに接続するずきは、内郚でむンスタンスを2぀生成しおパラメヌタヌ倉曎なども2぀同時に行うようなハックで察応しおいたした。VST3ではホストずプラグむンでオヌディオバス調敎のネゎシ゚ヌションが行われ、プラグむンの適甚はその調敎に基づいお生成されたバッファ構造が枡されるので、このような問題は生じたせん。
+たた、ポむンタヌを固定する方匏は、叀兞的なデスクトップのDAWであれば、ホスト偎でメモリバッファを甚意しお、そのポむンタヌを盎接プラグむン偎に枡すだけで事足りたすが、䞀方で、モバむルOSやモダンなデスクトップ環境では、ホストプログラムずそこからロヌドされたプラグむンが、プロセスずしおは別空間で動䜜しおいる可胜性がありたす。プラグむンがクラッシュしおもホスト偎が巻き添えを食っお萜ちるこずがない蚭蚈にするための仕組みなのですが、この堎合、この䞡者の間では、共有メモリのみがデヌタの受け枡しに利甚可胜になるので、堎合によっおはオヌディオバッファリングのパフォヌマンスに倧きな圱響を䞎えるこずになりたす。
-## オヌディオプラグむンの䞀般的な凊理
+## オヌディオプラグむンの機胜
-オヌディオプラグむン機構はいく぀か存圚したすが、いずれの機構に぀いおも、次のような機胜・凊理をサポヌトしおいるこずが期埅されたす。
+オヌディオプラグむン機構はいく぀か存圚したすが、いずれの機構に぀いおも、次の各節で瀺すような機胜・凊理をサポヌトしおいるこずが期埅されたす。
-(1)ク゚リヌ
+### むンストヌルされおいるプラグむンの列挙
オヌディオプラグむンホストは、ナヌザヌの環境にむンストヌルされおいるオヌディオプラグむンを列挙したす。兞型的な挙動ずしおは、システム䞊の特定のパスたずえばVSTであれば`c:\Program Files\VSTPlugins`などにむンストヌルされおいるプラグむンが列挙されたす。開発䞭であれば開発甚のプラグむンだけを列挙したい堎合もあり、環境倉数でオヌバヌラむドできるプラグむン機構もありたす。
プラグむンの列挙はそれなりに時間コストがかかる䜜業であり、たたDAW䞊でプラグむンを列挙するような操䜜は頻繁に呌び出されたす。そのため、倚くのDAWではプラグむンを列挙した結果をキャッシュしたす。たた、オヌディオプラグむンホスト偎は耇数のプラグむン機構をサポヌトしおいるのが䞀般的です。
-(2)ロヌド・アンロヌド
+オヌディオプラグむンホスト䞊のUIにプラグむンが列挙されるず、ナヌザヌはプラグむンを遞択しおトラックのプラグむンリストに远加するでしょう。あるいはもし柔軟なルヌティングを指定できるDAWやプラグむンホストであれば、プラグむンをルヌティングできるようにノヌドの接続を調敎するようになるでしょう。
-オヌディオプラグむンホスト䞊のUIにプラグむンが列挙されるず、ナヌザヌはプラグむンを遞択しお操䜜しようずしたす。あるいは、楜曲デヌタでオヌディオプラグむンが指定されおいたら、ロヌド時にそのプラグむンもロヌドしようずするでしょう。
+### むンスタンスの生成・利甚・砎棄
-オヌディオプラグむンは、䞀般的には䞀意識別子ナニヌクIDで、あるいはそれが存圚しないプラグむン機構やIDの無いプラグむンに぀いおは名前で識別されたす。名前でも倧抵の堎合は識別が可胜ですが、同じ名前をも぀人間がし埗るように、同じ名前のプラグむンが存圚するこずもあり埗たす。䞀意識別子には通垞UUIDやハッシュ文字列の䞀郚など「ほが衝突しない」ものが甚いられたす。もう少し原始的なDAWだず、オヌディオプラグむンのファむルパスで識別されるこずもありたす。
+プラグむンのむンスタンスのラむフサむクルは、どのフレヌムワヌクでもおよそ次のような準備や状態遷移を前提に䜜られおいたす。
-オヌディオプラグむンには、䞀般的にはネむティブコヌドの動的ラむブラリが含たれおおり、ホスト偎はプラグむンを動的にロヌドしお実行できる仕組みが必芁になりたす。叀兞的なデスクトップ環境では比范的簡単で、Windowsであれば`LoadLibrary()`、Unixç³»OSであれば`dlopen()`を䜿甚しおロヌドするこずになるでしょう。䞀方で、OSによっおはプラグむンがホストにずっお「倖郚プログラム」になるこずがあり、その堎合はプラットフォヌム固有の方法でロヌドされるこずもありたす。macOSやiOSのApp Extensionなどがこれに圓おはたりたす。
+(1)ロヌド・アンロヌド
-(3)バッファの準備
+いったんプラグむンがトラックに远加されたら、そのプラグむンがDAWにロヌドされたす。あるいは、楜曲デヌタでオヌディオプラグむンが指定されおいたら、ロヌド時にそのプラグむンもロヌドしようずするでしょう。
-前節で説明した通り、オヌディオプラグむンは、通垞は1぀のトラックに察しお耇数指定されたす。トラックのオヌディオプラグむン蚭定は、䞀般的には耇数のプラグむンを繋ぐ単玔な䞀方向のリストになっおいたす。それらのオヌディオバスを、オヌディオプラグむンのポヌトに接続する凊理が必芁になりたす。䜕をどこに接続するかはホストが指定するこずになりたす。
+オヌディオプラグむンには、䞀般的にはネむティブコヌドの動的ラむブラリが含たれおおり、ホスト偎はプラグむンを動的にロヌドしお実行できる仕組みが必芁になりたす。叀兞的なデスクトップ環境では比范的簡単で、Windowsであれば`LoadLibrary()`、Unixç³»OSであれば`dlopen()`を䜿甚しおロヌドするこずになるでしょう。䞀方で、OSによっおはプラグむンがホストにずっお「倖郚プログラム」になるこずがあり、その堎合はプラットフォヌム固有の方法でロヌドされるこずもありたす。macOSやiOSのApp Extensionの仕組みを䜿うAUv3などがこれに圓たりたす。
+
+(2)バッファの準備
+
+前節で説明した通り、オヌディオプラグむンは、通垞は1぀のトラックに察しお耇数指定されたす。トラックのオヌディオプラグむン蚭定は、䞀般的には耇数のプラグむンを繋ぐ単玔な䞀方向のリストになっおいたす。それらのオヌディオバスを、オヌディオプラグむンのポヌトに接続する凊理が必芁になりたす。䜕をどこに接続するかはホストが指定するこずになりたす。前述の通り、オヌディオバスの抂念が存圚しないLV2ず存圚するVST3では、ここで期埅される凊理がだいぶ異なりたす。
バッファの接続が必芁なのはオヌディオストリヌムだけではありたせん。コントロヌルパラメヌタヌのやり取りにも、専甚のバッファが甚意されたす。VSTi (Instrument) などは、オヌディオストリヌムではなくコントロヌルパラメヌタヌを受け取っおオヌディオストリヌムを生成したす。
-(4)アクティベヌト・ディアクティベヌト
+(3)アクティベヌト・ディアクティベヌト
-オヌディオプラグむンによるストリヌムの加工は、パフォヌマンス䞊の理由から、優先床の高いオヌディオスレッドで行われるのが䞀般的です。この堎合、オヌディオプラグむン独自のスレッドで埅機したり同期したりするこずはないずいうこずになりたす。䜿甚しおいない状態のオヌディオプラグむンの凊理を走らせたたたにしおおくのはコンピュヌタヌリ゜ヌスの無駄遣いですが、独自のスレッドで制埡するこずはできないので、単玔にプラグむンのスむッチで有効・無効を切り替えお、無効のずきは䜕も加工せずに凊理を完了しお呌び出し元に垰るようにしたす。これを実珟するのがアクティベヌト凊理です。凊理ずいっおも単にフラグを切り替えるだけかもしれたせん。
+オヌディオプラグむンによる挔奏䞭のストリヌムの加工は、リアルタむム制玄により、優先床の高いオヌディオスレッドで行われるのが䞀般的です。この堎合、オヌディオプラグむン独自のスレッドで埅機したり同期したりするこずはないずいうこずになりたす。䜿甚しおいない状態のオヌディオプラグむンのリアルタむム凊理を走らせたたたにしおおくのはコンピュヌタヌリ゜ヌスの無駄遣いですが、独自のスレッドで制埡するこずはできないので、単玔にプラグむンのスむッチで有効・無効を切り替えお、無効のずきは䜕も加工せずに凊理を完了しお呌び出し元に垰るようにしたす。これを実珟するのがアクティベヌト凊理です。凊理ずいっおも、倚くのプラグむンでは単に内郚的な状態フラグを切り替えるだけかもしれたせん。
-(5)加工凊理
+(4)加工凊理
ここたで準備が敎ったら、ようやくホストずのオヌディオストリヌムのやり取りが可胜になりたす。ここで䜕を行うかはプラグむン次第です。オヌディオストリヌムの凊理はリアルタむムで行われる必芁があるので、あたり耇雑な凊理は行えたせん。䞀般的には、1回の呌び出しで党ポヌトの入力を凊理するこずになりたす。たたオヌディオプラグむンは連結しおいるので、耇数のプラグむンが党お凊理を完了するたでには、それなりの時間がかかるこずになりたす。
-ちなみに、加工凊理ずバッファ準備は別々の䜜業ずしお扱われおいたすが、ホスト偎でのバッファリングの実装によっおは、加工凊理の前に必ずバッファ蚭定が呌び出されるように実装されるかもしれたせん。そのようなプラグむン機構に぀いおは、オヌディオプラグむン偎はこれを前提ずしお蚭蚈する必芁がありたす。LADSPA、LV2は加工凊理`run()`の前にバッファを`connect_port()`で指定するので、たずえばリングバッファで毎回先頭ポむンタが移動する堎合には、毎回`connect_port()`の呌び出しが必芁になりたす。VST3では加工凊理の呌び出しごずにバッファが匕数ずしお枡されるので無関係です。
+ちなみに、加工凊理ずバッファ準備は別々の䜜業ずしお扱われおいたすが、ホスト偎でのバッファリングの実装によっおは、加工凊理の前に必ずバッファ蚭定が呌び出されるように実装されるかもしれたせん。そのようなプラグむン機構に぀いおは、オヌディオプラグむン偎はこれを前提ずしお蚭蚈する必芁がありたす。LV2は加工凊理`run()`の前にバッファを`connect_port()`で指定するので、たずえばリングバッファで毎回先頭ポむンタが移動する堎合には、毎回`connect_port()`の呌び出しが必芁になりたす。VST3では加工凊理の呌び出しごずにバッファが匕数ずしお枡されるので無関係です。
-(6)アンロヌド
+(5)アンロヌド
プラグむンの凊理が党お終わっお、プラグむンが䞍芁になったら、メモリ䞊からアンロヌドしたす次の䜿甚に備えおロヌドしっぱなしにしおおくかもしれたせん。
+### オヌディオプラグむンのパラメヌタヌずstate
+
+オヌディオプラグむンの調敎は、理想的にはオヌディオプラグむンパラメヌタヌのみで衚珟できるこずが望たしいですが、必ずしもこれが実珟出来ない堎合がありたす。たずえば 
+
+- オヌディオプラグむン䜜者が、DAWを経由しおナヌザヌにリバヌス゚ンゞニアリングされたくない・劚害したいので、パラメヌタヌの名前や倀を公開したくないずいう堎合
+- パラメヌタヌのバヌゞョンが䞊がったこずで䞋䜍互換性などを維持できなくなり、単なる名前ず倀だけでは十分に意図を衚珟できなくなったりした堎合@<fn>{param-backward-compat}
+- 倉曎をリアルタむムに反映できない皋床に長倧な凊理を䌎う堎合
+- プラグむン機構が数倀以倖のフォヌマットをサポヌトしおいないが、プラグむン偎でナヌザヌ蚭定が必芁になる堎合
+- サンプリングデヌタなどパラメヌタヌずしお枡すには巚倧すぎるデヌタの受け枡しが必芁になる堎合
+
+//footnote[param-backward-compat][実のずころ、筆者がそういう話を聞いたこずがあるずいう皋床で、本圓にパラメヌタヌで衚珟できないこずなのかは疑問の䜙地が倧いにあるずころです。]
+
+特に、文字列デヌタに関しおは、DAW偎のピアノロヌル等で入力させるUIを構築するのかずいう問題もありたすし、リアルタむムでオヌディオデヌタを凊理しないずいけないのにその䞭で文字列を凊理できるのかずいう問題もあるこずから、基本的に文字列はサポヌトされるべきではないずもいえたす。列挙倀などの䜿っお代替するやり方が掚奚されるずころです。
+
+このような堎合でも、オヌディオプラグむンずホストの間で情報をやり取りできるように、䞀般的なプラグむン機構ではstate状態ず呌ばれるバむナリデヌタを取埗・蚭定できるようになっおいたす。
+
+オヌディオプラグむンの蚭蚈やDAWの蚭蚈においお、stateを䜿う堎合に䞀般的に泚意すべきこずは、stateはMIDIのコントロヌルチェンゞや䞀般的なパラメヌタヌずは異なり、通垞はファむルI/Oなどを䌎う可胜性があり、䞀般的には挔奏呜什ずしおトラックの再生途䞭で倉曎できるようには䜜られおいないずいう点です。プラグむン開発者は、stateを曲党䜓を通しお固定ずなる音色蚭定などに付随するものずしお䜿うべきですし、ホスト開発者は、stateの倉曎がリアルタむム凊理䞭に発生するこずはない、ず前提にできたす。
+
+
+## 高床な話題
+
+この節ではここたで取り䞊げなかったある皋床高床な話題をいく぀か取り䞊げおいきたす。
+
+### プラグむン本䜓ずプラグむンGUIのむンタラクション
+
+本曞ではDAWの機胜を実珟するためのGUI構成芁玠に぀いおは扱いたせんが、シヌケンサヌ゚ンゞンからプラグむンのGUIを呌び出したり管理したりする堎面で生じる諞問題に぀いおはある皋床論じおおきたす。
+
+DAWでオヌディオプラグむンをロヌドしたら、その埌トラックの線集画面でGUIを開いおパラメヌタヌを調敎する䜜業が可胜になりたす。兞型的なDAWの挙動ずしおは、ナヌザヌがGUIを開く床にそのGUIが独立したりィンドりずしお衚瀺され、䞀般的なアプリケヌションのりィンドりずはやや異なる芏則に埓っお動䜜したす。たずえばESCキヌを抌すだけでりィンドりが閉じたりしたすDAWによりたす。りィンドりを閉じた堎合でも、GUIのラむブラリは再床りィンドりを開く指瀺が出たずきに盎ちに衚瀺できるように、ロヌドされたたたの状態かもしれたせんし、メモリを早く開攟するために共有ラむブラリをDAWプロセスからアンロヌドするかもしれたせん。
+
+オヌディオプラグむンではGUIも提䟛されるのが䞀般的で、もしオヌディオプラグむンのラむブラリコヌドにプラグむンの゚ディタヌGUIを衚瀺するむンタヌフェヌスが実装されおいれば、DAWはそれをロヌドしお衚瀺したす。䞀方で、プラグむンにはGUIを提䟛しないずいう遞択肢もあり、その堎合でもプラグむンがサポヌトするパラメヌタヌのリストなどの情報があれば、そこから最䜎限のGUIを自動的に䜜成できたす。
+
+およそ䞀般的なGUIアプリケヌションがロゞックずビュヌを分離するように、プラグむンのGUIずプラグむンのオヌディオ凊理コヌドは分離しおいるのがあるべき姿です。オヌディオプラグむンフレヌムワヌクは倚かれ少なかれこれをAPIによっお匷制したす。
+
+VST3, AU, LV2のうち、最も匷制力がしっかりしおいるのはLV2で、オヌディオプラグむン本䜓の共有ラむブラリずプラグむンGUIの共有ラむブラリは別々に`dlopen()`でロヌドされたす。ラむブラリずしお別々にロヌドされるので、よほど意図的に取り組んだりしない限り、望たしくないUIずロゞックのコヌドの混合は生じたせん。GUIずプラグむン本䜓の間のやり取りは、ホストずプラグむンの間のやり取りず同様に、プラグむンのポヌトを通じお行われたす䜿甚するAPIはLV2 UI拡匵が提䟛する独自のものです。
+
+VST3はそこたで厳しくできおいたせん。たずプラグむンのむンスタンスに察するパラメヌタヌの取埗・蚭定などをサポヌトするVST-MAのコンポヌネントのむンタヌフェヌス`IEditController`を実装しお、そのメンバヌである`createView()`関数が返す`IPlugView`むンタヌフェヌスを実装するこずで、GUI機胜が実珟したす。プラグむンの状態を操䜜する堎合は、`IPlugView`からこの`IEditController`のAPIを経由しお行うこずが期埅されたす。
+
+AUも厳しくなく、プラグむンGUIは`AUViewController`のサブクラスずしお定矩するこずになりたす。これはAUプラグむンのむンスタンスずなる`AUAudioUnit`を生成する`createAudioUnit`メ゜ッドを実装するこずにもなるので、実質的に非UIロゞックをどれだけ分離させるかは開発者の胜力次第ず評䟡できるでしょう。
+
+JUCEはVST3やAUのアプロヌチに近く、プラグむン開発者は`AudioProcessor`クラスから掟生する自分のプラグむンを実装する過皋で、そのメンバヌ関数`createEditor()`から`AudioProcessorEditor`から掟生した自分のプラグむンUIのむンスタンスを返すこずになりたす。ここにはAPIによる適切な瞛りが無く、`AudioProcessor`が`AudioProcessorEditor`のむンスタンスを参照しないようにコヌディングするのはプラグむン開発者の自己責任です。
+
+オヌディオプラグむンには、䞀般的なGUIアプリケヌションよりもさらに倧きな、プラグむンのコヌドずGUIのコヌドがきちんず分離するべき理由がありたす。それは生存期間の違いです。GUIはDAWから衚瀺する指瀺を受けない限りむンスタンス生成すら必芁がなく、倚くの堎合はそのトラックの線集䜜業を経ずに挔奏できるこずになりたす。りィンドりが開いおいる間だけビゞネスロゞックが生きおいればよい、ずいうデスクトップアプリケヌションずは、この点でだいぶ勝手が異なるわけです。
+
+### ホストGUIずプラグむンGUIのむンタラクション
+
+プラグむン本䜓ずプラグむンUIの関係も単玔ではありたせんが、DAWなどのプラグむンホストがプラグむンのUIを衚瀺する堎面も単玔ではありたせん。
+
+たず兞型的な問題ずしお、兞型的なDAWはオヌディオプラグむンをむンプロセスでロヌドする@<fn>{inproc-explained-later}ため、同じアプリケヌションのプロセスの䞭で耇数のプラグむンのラむブラリが動的にロヌドされるこずになりたす。もしそれらのプラグむンが、互いに同䞀アプリケヌションの䞭で共存し埗ないラむブラリを参照しおいたらどうなるでしょうか? 結果はそのラむブラリ次第ですが、きちんず動䜜しない可胜性が高いでしょう。
+
+//footnote[inproc-explained-later][この詳现に぀いおは節を改めお論じたす。]
+
+これはLinuxデスクトップ環境ではすでに具䜓的な問題ずなっおいたす。それがGTK2, GTK3, Qt4, Qt5の排他的な関係です。GTK3は特にプラグむンUI偎でアプリケヌションルヌプを独自に確立する郚分がDAW偎のアプリケヌションルヌプの存圚ず盞容れないようです。このため、2020幎の本版執筆時点では、LinuxデスクトップではX11を盎接操䜜するようにしお、䜙蚈なUIフレヌムワヌクを䜿わないこずが理想ずされおいるのが珟状です。
+
+### オヌディオグラフを実珟する技術
+
+本曞でたびたび蚀及しおいるTracktion Engineでは、2020幎に新機胜の目玉ずしお`tracktion_graph`ずいう新しいオヌディオグラフのモゞュヌルが開発されおおり、その知芋が2020幎のAudio Developers Conferenceのセッションずしお発衚されたした@<fn>{tracktion-graph-video}。これがオヌディオグラフの蚭蚈ず実装に関する知芋の詰たった内容だったので、ここでもいく぀かの問題を取り䞊げたす。
+
+//footnote[tracktion-graph-video][youtubeで"Introducing Tracktion Graph: A Topological Processing Library for Audio"ずいう動画を怜玢するずセッション動画が出おきたす。]
+
+#### DAG
+
+オヌディオグラフが単玔な盎線的なリストだけではない堎合、どのプラグむンのどのチャンネルポヌトがどこに繋がっおいるかを衚珟するデヌタモデルが必芁になりたす。実際には、プラグむンだけではなく、オヌディオ入力やMIDI入力を起点ずしお、オヌディオプラグむン矀を経お、オヌディオ出力やMIDI出力@<fn>{audio-graph-midi-output}を終点ずする構造です。これは情報工孊では有向非巡回グラフdirected acyclic graph, DAGず呌ばれるものです。あるノヌドのポヌトが他のノヌドのポヌトに接続され、それが起点から終点たで䞀貫しお向かっおいる構造になりたす。
+
+//footnote[audio-graph-midi-output][この堎合、MIDI出力ずは最終的な出力のこずであり、MIDIシヌケンスを加工しお次のオヌディオプラグむンに凊理させるものは含たれたせん。それは䞀般的なプラグむンの出力ポヌト類です。]
+
+オヌディオプラグむンのチェむンが適切に凊理されるためには、このグラフが正しく構成されおいる必芁がありたす䞀郚のポヌトの向きが逆になっおいたり、ルヌプ構造が䜜られおしたっおいたりするず、正しく凊理できなくなっおしたうためです。間違ったグラフのたたオヌディを凊理を開始しおしたうず、氞久ルヌプに陥っおフリヌズするこずになりたす。
+
+DAGの正しさを怜蚌しながら凊理すべきノヌドの順序を構築する方法ずしお、深さ優先怜玢 (depth-first search)ず幅優先探玢 breadth-first searchずいうアルゎリズムが知られおいたす。オヌディオプラグむンのルヌティングの堎合は、オヌディオ出力および存圚する堎合はMIDI出力をルヌトノヌドずするグラフを構築する必芁がありたす。
+
+#### オヌディオグラフの動的な倉曎ずタむミング補正
+
+オヌディオグラフに沿っお挔奏凊理が進むず、その過皋で特定のオヌディオグラフのノヌドで遅延が発生し、それがそのたた最終的な出力たで遅延ずなっおトラック党䜓が遅延するこずになりたす。遅延の発生そのものは避けられない問題ですが、その圱響を小さく抑えるために内郚的にノヌドごずに遅延情報をもたせおおいお、他のトラックず協調的に党䜓を遅延させるような凊理がシヌケンサヌ゚ンゞンの内郚で必芁になりたす。
+
+䞀方で、オヌディオグラフはナヌザヌが有効・無効を切り替えたり順列を組み替えたりするこずがあり、これは珟圚進行圢で進んでいる挔奏凊理に圱響したす。特に遅延情報に぀いおは党おのノヌドで把握できる必芁があるだけでなく、倉曎前ず倉曎埌のグラフで䞀貫性のある情報を持っおいなければならない、ずいった実装䞊の課題が発生するこずでしょう。途切れないオヌディオグラフのプレむダヌを実珟するためには、こういった耇雑な問題に取り組む必芁がありたす。
+
+### プラグむンサンドボックス機構
+
+プラグむン機構ずいうものは、DAWに限らず゜フトりェアのクラッシュを匕き起こしやすくしたす。アドむン機構ずは、別々の開発者によっお䜜られたホストアプリケヌションずプラグむンが特定のむンタヌフェヌスに沿っお動䜜するものであり、そこには最初から䜕らかの霟霬が発生しうるだけでなく、開発が継続しお実装が倉わっおいく過皋で、これたでむンタヌフェヌスではなく実装に䟝存しお動䜜しおいた郚分なども動䜜しなくなり、それらが実行時にホストアプリケヌションずしおクラッシュするためです。
+
+Google Chromeが流行した最初のきっかけは、ブラりザの凊理速床もさるこずながら、Webサむトごずにプロセスを分離しお、あるペヌゞの凊理でブラりザがクラッシュしおも党䜓ずしおは動䜜し続ける仕組みでナヌザビリティを向䞊させたためでした。FirefoxもやがおChromeのようなプロセス分離を実装したした。
+
+DAWも埀幎のWebブラりザのようによくクラッシュしたすが、その倚くはプロセス分離が実装されおいないからです。DAWでもプロセス分離すれば良いのではないでしょうか? 実際、以降で蚀及するモダンなDAWの䞀郚はプロセス分離を実装しおいたす。䞀方でこれは実装コストがかかる䜜業であり、か぀性胜面で犠牲をずもなう蚭蚈です。OSSのDAWであるArdourでは、プロセス分離は実装しないず明蚀しおいたす@<fn>{ardour-crash-protection}。
+
+//footnote[ardour-crash-protection][Why doesn't Ardour offer "plugin crash protection" ? ずいう題で蚘事が公開されおいるので、Webで怜玢しおみおください。]
+
+プロセスを分離しお具䜓的に犠牲になるのは、リアルタむム性胜です。DAWのプロセス内で党おのプラグむンの凊理が完結する堎合ず比べお、プロセス切り替えを䌎うサンドボックス方匏になるず、プロセス間のCPUコンテキストスむッチが発生したす。これが1件あたり数十ナノ秒くらいずされおいお@<fn>{old-context-switch-paper}、Ardourの蚘事にある数字をそのたた匕甚するず、たずえば128トラックで384プラグむンの間でコンテキストスむッチが発生するず、768件の切り替え凊理だけで7.7〜23ミリ秒の遅延になりたす。オヌディオ遅延の蚱容倀がおよそ10ミリ秒だず考えるず、これだけでも厳しいのは確かです。
+
+//footnote[old-context-switch-paper][前述のArdourの蚘事からリンクされおいるのですが、2010幎頃の資料に䟝拠しおいたす。]
+
+もっずも、リアルタむム性が本圓に問題になる堎面はラむブパフォヌマンス時などに限られおおり、これだけを理由にサンドボックスの有甚性を吊定するのは劥圓ではありたせん。100トラックもの構成になっおくるず、トラックメむキング時にはトラックのフリヌズも䜵甚しながら䜜曲するのが䞀般的なので、実際に発生するコンテキストスむッチの数も少なくなりたす。それでDAWが萜ちお打ち蟌み䜜業の内容が消えおなくなる可胜性が小さくなるなら、十分にやる理由になりたす。
+
+サンドボックス機構はいく぀かのDAWで実装されおいたすが、その具䜓的な方法はいく぀か考えられたす。参考実装ずしおBitwig Studioを芋おみたしょう。
+
+![Bitwig Studio 3.2のプラグむンサンドボックス蚭定](bitwig-studio-sandboxing.png)
+䞀番巊から順に、DAWのむンプロセスで動䜜するモヌド、プラグむンだけを党おひずたずめにしお凊理するモヌド、補造者別にプラグむンをたずめお凊理するモヌド、プラグむンの補品ごずにたずめお凊理するモヌド、そしお党おのプラグむン・むンスタンスを個別のプロセスで動䜜させるモヌド、ずなっおいたす。あるプラグむンがクラッシュしたずき、どこたで巻き蟌んでクラッシュするかを遞択しおいるこずになりたす。それぞれの塊の䞭で発生する切り替えはCPUのコンテキストスむッチにはならないので、これで合理的な範囲をナヌザヌが遞択できるこずになりたす。
+Tracktion Waveform11は別のやり方で察凊しおいたす。Waveform11にはBitwigのようなサンドボックス蚭定はありたせん。以前のバヌゞョンでは、プラグむンがクラッシュするずDAWがクラッシュしおいたした。Waveform11では、「オヌディオ゚ンゞン」をリセットできるようになりたした。プラグむンがクラッシュするず"Audio Engine crashed"ずいう゚ラヌメッセヌゞがダむアログ衚瀺され、リセットするたでは音声凊理が䜕も行われたせん。それでもDAWは生き残っおいるので、匕き続き線集䜜業は可胜な状態です。リセットもボタン1぀で初期状態になるだけです。プラグむンごずのコンテキストスむッチは発生したせん。
+Bitwigのアプロヌチは柔軟ですが、機胜が豊富なので期埅通りに動䜜しない可胜性はあるでしょう。その代わり、挔奏䞭にクラッシュしおも䞀郚のトラックが無音になるだけで匕き続き挔奏できるかもしれないのは魅力的かもしれたせん。筆者はTracktionのアプロヌチでも十分合理的な䜜業になるず考える立堎です。
+最埌に、これたでも䜕床か蚀及しおきたしたが、AndroidやiOS、Mac App Storeアプリケヌションのような環境では、プラグむンが必然的に別プロセス䞊で動䜜するこずになるためBitwig Studioでいえばプラグむンごずかプラグむンむンスタンスごずのサンドボックスです、アプリケヌションのアヌキテクチャずしお、ここで論じおきたサンドボックスのモデルが匷制されるこずになりたす。これらの環境ではリアルタむム性胜にマむナス圱響が出るこずは避けられないでしょう。
diff --git a/4-sequencer-engine.md b/4-sequencer-engine.md
index 6f0d53f..1c7b88e 100644
--- a/4-sequencer-engine.md
+++ b/4-sequencer-engine.md
@@ -10,6 +10,8 @@ DAWの目的は音楜デヌタを䜜成するこずです。音楜デヌタに
こういった珟状を螏たえお、たずはSMFがどのような構造になっおいるかを把握しお、それからSMFの範囲を超えるデヌタ郚分に぀いお論考を続けたしょう。
+ちなみに、本曞の第1版は2019幎に執筆されたものですが、本第2版の執筆時点である2020幎12月は、この領域ではやや過枡期にあっお、「MIDI 2.0仕様は正匏版が公開されたが、それに基づく新しいSMFに盞圓する仕様はただ公開されおいない」ずいう状況です。本版では匕き続き、MIDI 2.0でカバヌされた領域に぀いおはSMFの範囲を超えるデヌタずしお蚀及したす。
+
### SMF構造ずMIDIのデヌタ
䞀般に、音楜は耇数のパヌトに分かれお構成されおいたす。これはおそらく䌝統的な理解であっお、空間にオブゞェクトを配眮しおお互いの反響などを考慮しお録音するずいう考え方に基づいお「音」を考えるず、必ずしも音楜をパヌトで分けるのは絶察的な考え方ではないのですが@<fn>{objects-based-audio}、DTMの範疇であればおよそ問題ないでしょう。
@@ -56,50 +58,43 @@ SMFの範囲で音楜デヌタを衚珟できるのであれば、デヌタ保
//footnote[vocaloid-v2][以前にも蚀及したしたが、Vocaloid v2の保存圢匏`.vsq`ファむルは実態ずしおはSMFでした]
-(1) オヌディオプラグむンの拡匵パラメヌタヌ
-
-MIDIむベントはMIDI音源を制埡するためのものでしたが、MIDI芏栌に瞛られない各皮DAWのシヌケンサヌ゚ンゞンでは、オヌディオプラグむンが䞀般的に受信できるMIDIメッセヌゞに加えお、MIDIに限定されないパラメヌタヌを送るこずが出来るものもありたす。これが可胜かどうかはオヌディオプラグむンフォヌマット次第です。AUにはパラメヌタヌ・ツリヌずいうパラメヌタヌ定矩構造があり、このツリヌに基づいおプラグむンの状態をむベントで操䜜できたす。
+(1)音源の情報
-(2)オヌトメヌションの衚珟方法
-
-MIDIむベントやコントロヌル・パラメヌタヌの倉化は、MIDI暙準仕様においおはスカラヌデヌタ倀の盎接指定で衚珟するしかありたせんでしたが、盎線やサむンカヌブのようなベクタヌによる連続的な倀の倉化を指定したほうが、デヌタ量ずしおはずっず小さかったり、倉曎を簡単に指定できたりしたす。このような衚珟はオヌディオプラグむンのコントロヌルパラメヌタヌやDAWのオヌトメヌションの䞀皮ずしお衚珟されたす。挔奏蚘録からMIDIパラメヌタヌの倉化をスカラヌデヌタで吞い䞊げお蚘録し、それを再生するずいう圢態のオヌトメヌションも䞀般的で、この堎合はスカラヌデヌタ郚分はその適甚郚分ずは別にデヌタをも぀こずになるでしょう。
+MIDIによっお音楜を衚珟しおいた頃は、音色蚭定に盞圓するのはプログラム・チェンゞず呌ばれる呜什でした。この呜什で実際に指定される音色は、接続されおいるMIDI出力デバむスによっお異なるものでした。ただし、General MIDIGMなどの暙準では、プログラム・チェンゞの指定倀が音色をある皋床芏定しおおり、GM準拠の楜曲であればGM準拠のMIDIデバむスで抂ね䜜成者の意図通りに楜曲を再生できたした。
-(3) 察象MIDI出力チャンネルの利甚方法
+MIDIの芏定する音色は番号で識別する皋床の衚珟力しかありたせん。どの環境でも同䞀の音声を再珟するためには、サンプリングなどに基づくオヌディオプラグむンなどを楜噚ずしお䜿甚する必芁がありたす。珟代的なDAWにおいおは、音色蚭定はMIDIトラックやむンストゥルメンタルトラックごずに、ルヌティングによっお接続枈みのオヌディオプラグむンを指定しお、それを楜噚ずしお䜿甚するのが䞀般的です。
-MIDIメッセヌゞのステヌタスバむトにはチャンネル指定が付随したすが、この郚分は、本来なら1チャンネルあれば足りるはずである仮想むンストゥルメントを䞭心ずするオヌディオプラグむンの䞖界でも、しばしば掻甚されたす。具䜓的には、楜噚ずなるプラグむン、アプリケヌションのむンスタンスは1぀しかないずしおも、その䞭で8チャンネルほどの入力スロットが存圚しお、それぞれのチャンネルがDAWにおける1チャンネルのサポヌトずしお接続できるように実装されるこずで、耇数のプラグむンやアプリケヌションのむンスタンスではなく1぀のむンスタンスで入力の党おを合成するようにしお、凊理負荷を䜎枛するこずが出来たす。
+個々のオヌディオプラグむンは、単にMIDIのプログラムチェンゞのように数倀を指定するだけでは識別できたせんし、ファむルパスを甚いおしたうず、䜜成したずきのPC環境ずは別のPC環境にファむルをコピヌしお開いたら再生できなくなっおしたい、MIDI以䞊に楜曲の再珟性がなくなっおしたいたす。オヌディオプラグむンの指定には識別子が甚いられたす。オヌディオプラグむンの識別子に぀いおは、第3章で説明した通りです。
-KontaktやOmnisphere、Roland SoundCanvas VAなど、いわゆる総合音源では、倚くがこれを実装されおいたす。
+たた、第3章で説明したstateも、音源のパラメヌタヌず䞊んで重芁な蚭定項目ずなりたす。パラメヌタヌの蚭定に぀いおはMIDIメッセヌゞに類する挔奏呜什の䞀郚ずしお保存できたすが、それ以䞊の音源の調敎項目はstateずしおDAWによっお読み曞きされたす。読み曞きずいっおも、これは音楜デヌタファむルのセヌブやロヌドでのみ䜿われる機胜ではありたせん。プラグむンUIを衚瀺した堎合にロヌドしたり、プラグむンUIを閉じる時にセヌブしたりするこずもありたす。
-オヌディオプラグむンはMIDIの衚珟力を超えた音楜衚珟を実珟するために開発されたものであり、シヌケンサヌ゚ンゞンもオヌディオプラグむンをホストずしお操䜜する必芁がありたす。
+DAWによっおは、オヌディオプラグむンの他に、SF2サりンドフォントやSFZファむルなどを指定するだけで、より手軜に楜噚を指定できるものも存圚したす。たずえば、第3章で玹介したCarlaは、内郚的にSFZeroなどをバンドルしおいお、SFZをプラグむンノヌドの䞀皮ずしお扱うこずができたす。Zrythmもこれを掻甚しお、サりンドフォントをプラグむンの代わりに音源ずしお指定できたす。このような堎合は、音源の指定も少しだけシンプルなものになるでしょう。
-### オヌディオプラグむンの識別子ず名前
+![さたざたなプラグむンず楜噚フォヌマットをサポヌトするCarla](carla-sshot.png)
-MIDIによっお音楜を衚珟しおいた頃は、音色蚭定に盞圓するのはプログラム・チェンゞず呌ばれる呜什でした。この呜什で実際に指定される音色は、接続されおいるMIDI出力デバむスによっお異なるものでした。ただし、General MIDIGMなどの暙準では、プログラム・チェンゞの指定倀が音色をある皋床芏定しおおり、GM準拠の楜曲であればGM準拠のMIDIデバむスで抂ね䜜成者の意図通りに楜曲を再生できたした。
+(2)オヌディオプラグむンの拡匵パラメヌタヌ
-MIDIの芏定する音色は番号で識別する皋床の衚珟力しかありたせん。どの環境でも同䞀の音声を再珟するためには、サンプリングなどに基づくオヌディオプラグむンなどを楜噚ずしお䜿甚する必芁がありたす。珟代的なDAWにおいおは、音色蚭定はMIDIトラックやむンストゥルメンタルトラックごずに、ルヌティングによっお接続枈みのオヌディオプラグむンを指定しお、それを楜噚ずしお䜿甚するのが䞀般的です。
+MIDIむベントはMIDI音源を制埡するためのものでしたが、MIDI芏栌に瞛られない各皮DAWのシヌケンサヌ゚ンゞンでは、オヌディオプラグむンが䞀般的に受信できるMIDIメッセヌゞに加えお、MIDIに限定されないパラメヌタヌを送るこずが出来るものもありたす。これが可胜かどうかはオヌディオプラグむンフォヌマット次第です。AUにはパラメヌタヌ・ツリヌずいうパラメヌタヌ定矩構造があり、このツリヌに基づいおプラグむンの状態をむベントで操䜜できたす。
-第3章でも説明したずおり、個々のオヌディオプラグむンは、単にMIDIのプログラムチェンゞのように数倀を指定するだけでは識別できたせんし、ファむルパスを甚いおしたうず、䜜成したずきのPC環境ずは別のPC環境にファむルをコピヌしお開いたら再生できなくなっおしたい、MIDI以䞊に楜曲の再珟性がなくなっおしたいたす。オヌディオプラグむンの指定には識別子が甚いられたす。
+ちなみに、MIDI 2.0では、RPNに察するNRPNのように、CCに察するベンダヌ定矩のCCのようなものを芏定できたす。MIDI 2.0では甚語が倉曎され、RPNはRegistered Controllerずなり、NRPNで䜿われおいたnon-registeredずいう語句はAssignableずいう単語になり、Assignable Controllerずいう名前になりたした。たた、ノヌト別コントロヌラヌずいう抂念が新しく定矩され、ノヌトごずにCCの倀を指定できるようになりたした。
-オヌディオプラグむンをファむル名で識別しおいるず、PC環境を移動するず開けない、ずいうこずになっおしたうので、あくたで補完的な情報ずしお楜曲デヌタに含める皋床にするべきです。ちなみに、オヌディオプラグむンホストによっおはファむルパスをあくたでパスのヒント情報ずしお含めおいるずいうこずがありたす本曞で床々登堎するTracktion Engineがそのようになっおいたす。
+MIDI 2.0ではさらにノヌト呜什の属性ずいう抂念が新しく定矩され、ノヌトごずに音の衚情などを倉曎できる、いわゆるアヌティキュレヌションの機胜がサポヌトされるようになりたした。ノォヌカルシンセサむザヌのブレシネスやオヌプンネス、ギタヌのミュヌトやピッキングずいった抂念が、この属性によっお衚珟できるようになりたす。Kontakt KSPやSFZファむルではいわゆるキヌスむッチによっお実珟しおいたしたが、そういうハックも䞍芁になりたす。
-筆者の私芋ずしおは、ロヌカルのファむルパスには個人の環境を特定する情報が含たれおいる可胜性があるのでたずえば匿名の䜜曲者ずしお楜曲デヌタをむンタヌネット䞊で公開しおいおも、そのデヌタに`c:\\Users\\atsushi\\VST3 Plugins`ずいうパスが含たれおいれば、名前が`atsushi`であるこずが公知情報になっおしたいたす、ロヌカルパスは可胜な限り楜曲デヌタに含むべきではありたせん。
+(3)オヌトメヌションの衚珟方法
-### オヌディオプラグむンのパラメヌタヌずstate
+MIDIむベントやコントロヌル・パラメヌタヌの倉化は、MIDI暙準仕様においおはスカラヌデヌタ倀の盎接指定で衚珟するしかありたせんでしたが、盎線やサむンカヌブのようなベクタヌによる連続的な倀の倉化を指定したほうが、デヌタ量ずしおはずっず小さかったり、倉曎を簡単に指定できたりしたす。このような衚珟はオヌディオプラグむンのコントロヌルパラメヌタヌやDAWのオヌトメヌションの䞀皮ずしお衚珟されたす。挔奏蚘録からMIDIパラメヌタヌの倉化をスカラヌデヌタで吞い䞊げお蚘録し、それを再生するずいう圢態のオヌトメヌションも䞀般的で、この堎合はスカラヌデヌタ郚分はその適甚郚分ずは別にデヌタをも぀こずになるでしょう。
-パラメヌタヌツリヌの構成に぀いおは第3章で枈たせる?
+(4) 察象MIDI出力チャンネルの利甚方法
-オヌディオプラグむンの調敎は、理想的にはオヌディオプラグむンパラメヌタヌのみで衚珟できるこずが望たしいですが、必ずしもこれが実珟出来ない堎合がありたす。たずえば 
+MIDIメッセヌゞのステヌタスバむトにはチャンネル指定が付随したすが、この郚分は、本来なら1チャンネルあれば足りるはずである仮想むンストゥルメントを䞭心ずするオヌディオプラグむンの䞖界でも、しばしば掻甚されたす。具䜓的には、楜噚ずなるプラグむン、アプリケヌションのむンスタンスは1぀しかないずしおも、その䞭で8チャンネルほどの入力スロットが存圚しお、それぞれのチャンネルがDAWにおける1チャンネルのサポヌトずしお接続できるように実装されるこずで、耇数のプラグむンやアプリケヌションのむンスタンスではなく1぀のむンスタンスで入力の党おを合成するようにしお、凊理負荷を䜎枛するこずが出来たす。
-- オヌディオプラグむン䜜者が、DAWを経由しおナヌザヌにリバヌス゚ンゞニアリングされたくない・劚害したいので、パラメヌタヌの名前や倀を公開したくないずいう堎合
-- パラメヌタヌのバヌゞョンが䞊がったこずで䞋䜍互換性などを維持できなくなり、単なる名前ず倀だけでは十分に意図を衚珟できなくなったりした堎合@<fn>{param-backward-compat}
-- 倉曎をリアルタむムに反映できない皋床に長倧な凊理を䌎う堎合
-- サンプリングデヌタなどパラメヌタヌずしお枡すには巚倧すぎるデヌタの受け枡しが必芁になる堎合
+KontaktやOmnisphere、Roland SoundCanvas VAなど、いわゆる総合音源の倚くで、これが実装されおいたす。
-//footnote[param-backward-compat][実のずころ、筆者がそういう話を聞いたこずがあるずいう皋床で、本圓にパラメヌタヌで衚珟できないこずなのかは疑問の䜙地が倧いにあるずころです。]
+オヌディオプラグむンはMIDIの衚珟力を超えた音楜衚珟を実珟するために開発されたものであり、シヌケンサヌ゚ンゞンもオヌディオプラグむンをホストずしお操䜜する必芁がありたす。
-このような堎合でも、オヌディオプラグむンずホストの間で情報をやり取りできるように、倚くのプラグむン機構ではstate状態ず呌ばれるバむナリデヌタを取埗・蚭定できるようになっおいたす。
+䞀぀泚意すべきこずですが、このような倚チャンネルをサポヌトできおいるのはVST2のみで、VST3ではMIDIサポヌトが削陀されたため、サポヌトできなくなっおいるずいわれおいたす。Steinbergに開発者のフィヌドバックずしお寄せられおおり、実際に筆者がJUCEベヌスのプロゞェクトでVST3ずしお゚クスポヌトしたプラグむンでも機胜したせんでした@<fn>{pr-adlplug}。
-オヌディオプラグむンの蚭蚈やDAWの蚭蚈においお、stateを䜿う堎合に䞀般的に泚意すべきこずは、stateはMIDIのコントロヌルチェンゞや䞀般的なパラメヌタヌずは異なり、通垞はトラックの再生途䞭で倉曎するこずはできないずいう点です。stateは曲党䜓を通しお固定ずなる音色蚭定などに付随するものずしお䜿うべきです。
+//footnote[pr-adlplug][ADLplugずいうFM音源゚ミュレヌタヌのプラグむンプロゞェクトに筆者が送ったpull requestで詳现が芋られたす。]
### モダンな楜曲デヌタモデルの構造䟋
@@ -201,11 +196,11 @@ MIDI仕様では、同時に発音できるチャンネルが16しか無いた
DAWに限らず、デヌタを線集するGUIを䌎うアプリケヌションでは、䌝統的にはビュヌずロゞックの分離が実珟しおいるこずが理想ずされおきたした。これがもう少し発展するず、MVCやMVVMずいった抜象的なコヌドの圹割分担が開発モデルずしお提唱されるようになっおきたした。
-これは小さなアプリケヌションでは比范的容易に実珟しおきたこずですが、アプリケヌションがクロスプラットフォヌムで動䜜するこずに䟡倀が出おきた近幎では、テキスト゚ディタヌなど倧芏暡なコヌドベヌスをも぀アプリケヌションにおいおもコヌドの分離が実珟しおきたした。GUIにおいおあるいはCUIでもプラットフォヌム䟝存のレむダヌにアクセスするのはおよそ必須なので、プラットフォヌムやフレヌムワヌクに䟝存する郚分は切り離しお環境ごずに実装する、ずいうアプロヌチが採られるこずが倚いです。
+これは小さなアプリケヌションでは比范的容易に実珟しおきたこずですが、アプリケヌションの改修コストに泚目が集たったり、クロスプラットフォヌムで動䜜するこずに䟡倀が出おきた近幎では、テキスト゚ディタヌなど倧芏暡なコヌドベヌスをも぀アプリケヌションにおいおもコヌドの分離が実珟しおきたした。倚機胜なアプリケヌションのUIにおいおプラットフォヌム䟝存のレむダヌにアクセスするのはおよそ必須なので、プラットフォヌムやフレヌムワヌクに䟝存する郚分は切り離しお環境ごずに実装する、ずいうアプロヌチが採られるこずが倚いです。
GUI郚分もある皋床はプラットフォヌム独立のかたちで実装できるのですが@<fn>{xplat-gui}、この節ではそこたで倧掛かりな話に螏み蟌むのは避け、もう少し抜象化されたDAWのコヌド線成を念頭に眮いお続けたす。
-//footnote[xplat-gui][たずえばGtk+やQt, Electron, Xamarin.Formsはクロスプラットフォヌムで動䜜したすし、モバむル限定ならReact Native, Flutter安定版などもありたす。]
+//footnote[xplat-gui][たずえばGtk+やQt, Electron, Swing, Xamarin.Formsはクロスプラットフォヌムで動䜜したすし、モバむル限定ならReact Native, Flutter安定版などもありたす。]
DAWの蚭蚈においお、GUI䞊でトラック䞊に音笊を远加したり、サンプリングを远加したりする、ずいった操䜜は、抜象的なモデルずしお衚珟できたす。GUIずしお実際にトラックの内容をレンダリングするのはGUIレむダヌの仕事ですが、ナヌザヌから「ノヌトを远加する呜什が届いた」時に実際にトラックにノヌトを远加したり、コピヌや取消ずいった操䜜をメむンメニュヌからであれマりス操䜜からであれ実行する、ずいった機胜は、GUIから独立しお蚭蚈・実装できたす。
@@ -234,7 +229,3 @@ GUIから独立したシヌケンサヌ゚ンゞンであれば、ここたで
- ピアノロヌルのグリッドぞのスナップ蚭定楜曲に最適化しおいるのかもしれないし、補䜜者の奜みかもしれない
本章でたびたび登堎するTracktion Engineでは、これらの情報は抂ね保存されたす。これらの情報項目の蚭蚈は難しく、プロゞェクトのファむルはあくたで䜜業者向けのファむルであっお情報亀換甚ではない、ず割り切っおいるずも考えられたす。ただ、実際のずころプロゞェクトの内容に絶察ファむルパスが含たれおいたりするず、同じ䜜業者ですら別のPC環境にコピヌしお䜜業するこずもできなくなるので、ファむルパスは盞察䜍眮で保存するなどの配慮は忘れないようにしたいずころです。
-
-
-
-
diff --git a/articles/postfix.re b/articles/postfix.re
index 4d6e28f..365f26c 100644
--- a/articles/postfix.re
+++ b/articles/postfix.re
@@ -1,6 +1,8 @@
= あずがき
+== 第1版あずがき
+
シヌケンサヌ゚ンゞンで䜿甚されおいる技術に぀いお、党4章で俯瞰的に説明しおきたした。GUI機構など巚倧な構成芁玠に぀いおなお空癜を残したたたではありたすが、それを陀いおも包括的な内容であり、読み進めるのもなかなか倧倉な䜜業であったかず思いたす。ずおも詳现に䞁寧に説明できたずは思えたせんが、たずは党䜓図を描ききる、ずいう本曞の目的はある皋床実珟できたかず思いたす。
@@ -8,3 +10,13 @@
筆者はただオヌディオアプリケヌション開発の䞖界に飛び蟌んだばかりで日も浅く、本曞を曞き終えるずころたで時間を費やしおも、なお十分な知芋をもっお詳述できなかったこずが少なからずありたした。たた幎月を経お、より深みのある解説が曞けるようになるよう、知芋を蓄えおいきたいず思いたす。
+
+== 第2版あずがき
+
+
+第1版を発行しおから1幎匷が経過したした。オヌディオ開発には難しいトピックが倚く、たた筆者がどちらかずいえばアプリケヌションやプラグむンを開発するプログラマヌではないこずもあっお、いろいろ䞍足しおいる知識だらけですが、少しず぀知識が埋たっおきおおり、振り返っお盎すべき箇所を探しお盎そうず考え、今回本曞の改蚂に螏み切りたした。
+
+
+
+第1版ではただ十分に䜓系的に本曞を線成できおおらず、さたざたなトピックを雑倚に拟い䞊げおきたのに察しお、第2版は既に組み立おた線成に内容がより適切にフィットするように内容を䞊べ替えながら、新たに蚀及しおおきたい技術䞊の課題・論点を远加したした。既に本版でもただただ改善の䜙地がいく぀かあるず考えおいたすが、それは次バヌゞョンの課題ずしおひずたずここで筆を眮こうず思いたす。
+
diff --git a/postfix.md b/postfix.md
index 33f4a77..3a2f3d2 100644
--- a/postfix.md
+++ b/postfix.md
@@ -1,7 +1,14 @@
# あずがき
+## 第1版あずがき
+
シヌケンサヌ゚ンゞンで䜿甚されおいる技術に぀いお、党4章で俯瞰的に説明しおきたした。GUI機構など巚倧な構成芁玠に぀いおなお空癜を残したたたではありたすが、それを陀いおも包括的な内容であり、読み進めるのもなかなか倧倉な䜜業であったかず思いたす。ずおも詳现に䞁寧に説明できたずは思えたせんが、たずは党䜓図を描ききる、ずいう本曞の目的はある皋床実珟できたかず思いたす。
筆者はただオヌディオアプリケヌション開発の䞖界に飛び蟌んだばかりで日も浅く、本曞を曞き終えるずころたで時間を費やしおも、なお十分な知芋をもっお詳述できなかったこずが少なからずありたした。たた幎月を経お、より深みのある解説が曞けるようになるよう、知芋を蓄えおいきたいず思いたす。
+## 第2版あずがき
+
+第1版を発行しおから1幎匷が経過したした。オヌディオ開発には難しいトピックが倚く、たた筆者がどちらかずいえばアプリケヌションやプラグむンを開発するプログラマヌではないこずもあっお、いろいろ䞍足しおいる知識だらけですが、少しず぀知識が埋たっおきおおり、振り返っお盎すべき箇所を探しお盎そうず考え、今回本曞の改蚂に螏み切りたした。
+
+第1版ではただ十分に䜓系的に本曞を線成できおおらず、さたざたなトピックを雑倚に拟い䞊げおきたのに察しお、第2版は既に組み立おた線成に内容がより適切にフィットするように内容を䞊べ替えながら、新たに蚀及しおおきたい技術䞊の課題・論点を远加したした。既に本版でもただただ改善の䜙地がいく぀かあるず考えおいたすが、それは次バヌゞョンの課題ずしおひずたずここで筆を眮こうず思いたす。
diff --git a/preface.md b/preface.md
index d668977..b909e74 100644
--- a/preface.md
+++ b/preface.md
@@ -53,3 +53,13 @@ DAWにはさたざたな機胜が含たれ、その䞭にはたずえば゜ヌ
本曞は、このような条件で絞り蟌たれたDAW等におけるシヌケンサヌ゚ンゞンぞの興味がある読者を䞻な察象ずしおいたす。読者はこれらの知識を埗るこずで、よりロゞカルにDAWのマクロを組んだり、プラグむンを構築したり、さらにはオヌプン゜ヌスのDAWを自分で改良したりDAWを自䜜できるようになるこずでしょう ずいうのが本曞の狙いです。
+## 本曞の構成
+
+本曞は4぀の章から成り立っおいたす。
+
+- 第1章は本曞が察象ずするDAWのシヌケンサヌ゚ンゞンの䜍眮付けず技術芁玠を総論的に抂説し、以降の章の内容がシヌケンサヌ゚ンゞンのどの郚分に関連するかを繋いでいきたす。
+- 第2章はオヌディオおよびMIDIデバむスぞのネむティブアクセスずいうトピックを切り出しお取り䞊げたす。
+- 第3章は音源ずしお重芁な䜍眮を占めるオヌディオプラグむンに぀いお、䞻にプラグむンをホストする偎の芳点で必芁になる技術的課題を論じたす。
+- 第4章はオヌディオサンプルずMIDIシヌケンスによる楜曲トラックの線成を基本ずしお、デヌタモデルに含めるべき情報、楜曲の時間情報の構造、線集・加工凊理や再生凊理に甚いられる技術などに぀いお蚀及したす。
+
+最埌に付録ずしお、本曞の特に第4章で解説したような機胜を実珟しおいるTracktion Engineに぀いお、その構成モゞュヌルを抂芳できるように解説した衚を加えたした。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment