Merge pull request #506 from andrewcsmith/patch-2
[supercollider.git] / HelpSource / Tutorials / Mark_Polishook_tutorial / Japanese_version / 13.schelp
blob26d7c078940e49a7d5b0fd22a68862f1c6b5079d
1 title:: 13
2 summary:: Mark Polishook tutorial (JP)
3 categories:: Tutorials>Mark_Polishook_tutorial>Japanese_version
4 related:: Tutorials/Mark_Polishook_tutorial/00_Introductory_tutorial
6 section::時間ベースのフィルター
8 Delay、CombそしてAlpassといったUGenは時間ベースのエフェクトを生成します。これは空間や位置の感覚を与えるリバーブなどのエフェクトを作るのに適しています。
10 ////////////////////////////////////////////////////////////////////////////////////////////////////
12 code::
13 // 2つのSynthDef。第1のSynthDefはグレインを生成し、第2のSynthDefはそれらを遅らせる
14 //  グレインを生成するSynthDefは左チャンネル
15 // グレインを遅らせるSynthDefは右チャンネル
17 SynthDef("someGrains", { arg centerFreq = 777, freqDev = 200, grainFreq = 2;
18         var gate;
19         gate = Impulse.kr(grainFreq);
20         Out.ar(
21                 0,
22                 SinOsc.ar(
23                         LFNoise0.kr(4, freqDev, centerFreq),
24                         0,
25                         EnvGen.kr(Env.sine(0.1), gate, 0.1)
26                 )
27         )
28 }).add;
30 SynthDef("aDelay", { arg delay = 0.25;
31         Out.ar(
32                 1,
33                 DelayN.ar(
34                         In.ar(0, 1),
35                         delay,
36                         delay
37                 )
38         )
39 }).add;
42 // グレインをテストして ... オフにしなさい
43 // 全て左チャンネルだけ ... グッド!
44 Synth("someGrains");
47 // 2つのグループを作成。第1はソース、第2はエフェクト。
49 ~source = Group.head(s);
50 ~effects = Group.tail(s);
53 // グレインをディレイに配置する ... ソースは左でディレイをかけられたソースは右
55 Synth.head(~source, "someGrains");
56 Synth.head(~effects, "aDelay");
60 ////////////////////////////////////////////////////////////////////////////////////////////////////
62 section::フィードバック・フィルター
64 CombやAllpassフィルターは、自分の出力を入力にフィードバックするUGenの例です。Allpassフィルターは一般的にCombフィルターと比較した場合に音はあまり違って聞こえません。しかしながら、Allpassフィルターはそれを通過する信号の位相を変えます。このため、これはUGenのネットワーク中で用いる時に便利なのです。
66 code::
67 // インターナル・サーバーを起動!!
68 // 最初はCombフィルターで次がAllpassフィルター(パラメータは同じ)。両者を比較せよ。
71         CombN.ar(
72                 SinOsc.ar(500.rrand(1000), 0, 0.2) * Line.kr(1, 0, 0.1),
73                 0.3,
74                 0.25,
75                 6
76         )
77 }.scope;
80 // 前の例とそんなに大きな違いは無い
83         AllpassN.ar(
84                 SinOsc.ar(500.rrand(1000), 0, 0.2) * Line.kr(1, 0, 0.1),
85                 0.3,
86                 0.25,
87                 6
88         )
89 }.scope;
92 // 最初はCombフィルターで次がAllpassフィルター(パラメータは同じ)。両者を比較せよ。
93 // 2つの例はもっと短いディレイ・タイムを持つ ... 0.1秒
96         CombN.ar(
97                 SinOsc.ar(500.rrand(1000), 0, 0.2) * Line.kr(1, 0, 0.1),
98                 0.1,
99                 0.025,
100                 6
101         )
102 }.scope;
105 // ディレイ・タイムを短くすると、allpassフィルターはcombフィルターよりより広がって聞こえるようになる
108         AllpassN.ar(
109                 SinOsc.ar(500.rrand(1000), 0, 0.2) * Line.kr(1, 0, 0.1),
110                 0.1,
111                 0.025,
112                 6
113         )
114 }.scope
118 ////////////////////////////////////////////////////////////////////////////////////////////////////
120 section::リバーブレーション
122 次の例は、James McCartneyによるもので、.playではなく.scopeを使っているということと、変数が関数の中で宣言されているという変更を加えています。この例はSuperCollider 2の配布物の中の一部分のドキュメントであった01 Why SuperColliderからのものです。
124 これは事実上Schroederのリバーブの実装で、信号はCombフィルターの並列バンクを通過し、連続したいくつかのAllpassフィルターを通るというものです。
126 code::
129 var s, z, y;
130         // ランダムな10ボイス分のサイン波のパーカッション・サウンド:
131 s = Mix.ar(Array.fill(10, { Resonz.ar(Dust.ar(0.2, 50), 200 + 3000.0.rand, 0.003)}) );
132         // リバーブのプリ・ディレイ・タイム:
133 z = DelayN.ar(s, 0.048);
134         // 並列に7つの長さを変調されたcombによるディレイ:
135 y = Mix.ar(Array.fill(7,{ CombL.ar(z, 0.1, LFNoise1.kr(0.1.rand, 0.04, 0.05), 15) }));
136         // 4つのallpassによるディレイの2つの並列したチェーン(合計8個):
137 4.do({ y = AllpassN.ar(y, 0.050, [0.050.rand, 0.050.rand], 1) });
138         // オリジナルのサウンドをリバーブに加えてそれを再生:
139 s+(0.2*y)
140 }.scope
144 ////////////////////////////////////////////////////////////////////////////////////////////////////
146 section::コンポーネント
148 次の例は、01 Why SuperColliderドキュメントの、つい先ほど説明したばかりのシンセシスのプロセスを、小さくシンプルな部分に分割する方法を示します。それはまた信号を並列にフィルタリングする方法("combs"のSynthDefを参照)と、信号をシリーズでフィルタリングする方法("allpass"のSynthDefを参照)を示します。この例はまた、どのようにシンセが実行されるたびにランダムに生成されるコントロール値を使うのかということをデモするものです。
150 この例はまた、便宜上、どのようにして複数チャンネルのオーディオを任意の数のバスに広げることができるのかということを示します。つまり、バスに渡ってオーディオを広げるバスのアサインはSynthDefの中で固定されているものの、簡単にコントロールにアサインすることができるということです。
152 前の例をより小さな部分に分解することのアドバンテージは、オーディオ・バスに送られる最初の要素にならなければならない、ソースのオーディオを除いて、残りの部分は任意の順序に組み替え直すことができるということです。
154 code::
156 SynthDef("filteredDust", {
157         Out.ar(
158                 2,
159                 Mix.arFill(10, { Resonz.ar(Dust.ar(0.2, 50), Rand(200, 3200), 0.003) })
160         )
161 }).add;
163 SynthDef("preDelay", {
164         Out.ar(
165                 4,
166                 DelayN.ar(In.ar(2, 1), 0.048, 0.048)
167         )
168 }).add;
170 SynthDef("combs", {
171         Out.ar(
172                 6,
173                 Mix.arFill(7, { CombL.ar(In.ar(4, 1), 0.1, LFNoise1.kr(Rand(0, 0.1), 0.04, 0.05), 15) })
174         )
175 }).add;
177 SynthDef("allpass", { arg gain = 0.2;
178         var source;
179         source = In.ar(6, 1);
180         4.do({ source = AllpassN.ar(source, 0.050, [Rand(0, 0.05), Rand(0, 0.05)], 1) });
181         Out.ar(
182                 8,
183                 source * gain
184         )
185 }).add;
187 SynthDef("theMixer", { arg gain = 1;
188         Out.ar(
189                 0,
190                 Mix.ar([In.ar(2, 1), In.ar(8, 2)]) * gain
191         )
192 }).add;
195 // それぞれの行が実行されると、それぞれは最後のノードになる。結果は、"filteredDust"が最初のノードになり、
196 // "theMixer"が最後のノードになる。これは我々が望んだ通りである。
198 Synth.tail(s, "filteredDust");
199 Synth.tail(s, "preDelay");
200 Synth.tail(s, "combs");
201 Synth.tail(s, "allpass");
202 Synth.tail(s, "theMixer");
206 ////////////////////////////////////////////////////////////////////////////////////////////////////
208 または、グループを使って前の例のシンセの実行の順序をコントロールします。
210 code::
212 ~source = Group.tail(s);
213 ~proc1 = Group.tail(s);
214 ~proc2 = Group.tail(s);
215 ~proc3 = Group.tail(s);
216 ~final = Group.tail(s);
219 // 以下のノードは、上で並べた通りに、グループにアサインされる
220 // それゆえ、これらは正しい順序で実行される
222 Synth.head(~final, "theMixer");
223 Synth.head(~proc3, "allpass");
224 Synth.head(~proc2, "combs");
225 Synth.head(~proc1, "preDelay");
226 Synth.head(~source, "filteredDust");
230 上に示した様に正しい順序にグループを配置することはそれにアサインされるシンセもまた正しい順序になるということを保証します。
232 ////////////////////////////////////////////////////////////////////////////////////////////////////
234 参考までに、以下はSuperCollider 2の配布物からの(James McCartheyによる)01 Why SuperColliderドキュメントの完全なテキストです。
236 ////////////////////////////////////////////////////////////////////////////////////////////////////
238 \x01For context, here, below, is the complete text of the strong::01 Why SuperCollider:: document (by James McCartney) from the SuperCollider 2 distribution.
240 section::Why SuperCollider 2.0 ?
242 SuperCollider version 2.0 is a new programming language. strong::Why invent a new language and not use an existing language?:: Computer music composition is a specification problem. Both sound synthesis and the composition of sounds are complex problems and demand a language which is highly expressive in order to deal with that complexity. Real time signal processing is a problem demanding an efficient implementation with bounded time operations.
243 There was no language combining the features I wanted and needed for doing digital music synthesis. The SuperCollider language is most like Smalltalk. Everything is an object. It has class objects, methods, dynamic typing, full closures, default arguments, variable length argument lists, multiple assignment, etc. The implementation provides fast, constant time method lookup, real time garbage collection, and stack allocation of most function contexts while maintaining full closure semantics.
244 The SuperCollider virtual machine is designed so that it can be run at interrupt level. There was no other language readily available that was high level, real time and capable of running at interrupt level.
246 SuperCollider version 1.0 was completely rewritten to make it both more expressive and more efficient. This required rethinking the implementation in light of the experience of the first version. It is my opinion that the new version has benefitted significantly from this rethink. It is not simply version 1.0 with more features.
248 strong::Why use a text based language rather than a graphical language? ::
249 There are at least two answers to this. strong::Dynamism:: : Most graphical synthesis environments use statically allocated unit generators. In SuperCollider, the user can create structures which spawn events dynamically and in a nested fashion. Patches can be built dynamically and parameterized not just by floating point numbers from a static score, but by other graphs of unit generators as well. Or you can construct patches algorithmically on the fly. This kind of fluidity is not possible in a language with statically allocated unit generators.
250 strong::Brevity:: : In SuperCollider, symmetries in a patch can be exploited by either multichannel expansion or programmatic patch building. For example, the following short program generates a patch of 49 unit generators. In a graphical program this might require a significant amount of time and space to wire up. Another advantage is that the size of the patch below can be easily expanded or contracted just by changing a few constants.
252 code::
255         // 10 voices of a random sine percussion sound :
256 s = Mix.ar(Array.fill(10, { Resonz.ar(Dust.ar(0.2, 50), 200 + 3000.0.rand, 0.003)}) );
257         // reverb predelay time :
258 z = DelayN.ar(s, 0.048);
259         // 7 length modulated comb delays in parallel :
260 y = Mix.ar(Array.fill(7,{ CombL.ar(z, 0.1, LFNoise1.kr(0.1.rand, 0.04, 0.05), 15) }));
261         // two parallel chains of 4 allpass delays (8 total) :
262 4.do({ y = AllpassN.ar(y, 0.050, [0.050.rand, 0.050.rand], 1) });
263         // add original sound to reverb and play it :
264 s+(0.2*y)
265 }.play )
268 Graphical synthesis environments are becoming a dime a dozen. It seems like a new one is announced every month. None of them have the dynamic flexibility of SuperCollider's complete programming environment. Look through the SuperCollider help files and examples and see for yourself.
270 go to link::Tutorials/Mark_Polishook_tutorial/Japanese_version/14::