Merge pull request #506 from andrewcsmith/patch-2
[supercollider.git] / HelpSource / Tutorials / Mark_Polishook_tutorial / Japanese_version / 09.schelp
blob27ce293eb38111e3e0fa421d66dbcdc0ddf28c6b
1 title:: 09
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::2項演算
8 1つのUGenの後にオペレータとオペランドが続く2項演算は、通常は、単項演算によって生成されるよりもより複雑なシンセシス・プロセスを作り出します。
10 2項演算の例としては、ほんのいくつか例を挙げると、加算、乗算、減算、割算といったものがあります。
12 一般的なパターンは
14 table::
15 ## OBJECT || OPERATOR || OPERAND
18 オブジェクト オペレータ オペランド
20 であり、例えば次の様に
22 code::
23 2 * 3
26 オブジェクト、2項演算子、オペランド、となります。
28 UGenに対して適用することのできる2項演算の多くのリストを見るには、SuperColliderのヘルプ・システムでHelp/BinaryOpsを参照して下さい。
30 ////////////////////////////////////////////////////////////////////////////////////////////////////
32 section::ミキシング=加算
34 2つ、またはそれ以上のUGenをミックスするには加算します。
36 code::
38         // 2つのノコギリ波をミックスする
39         {
40                 Saw.ar(500, 0.05)       // オブジェクト
41                 +                       // オペレータ
42                 Saw.ar(600, 0.06)       // オペランド
43         }.scope;
47 加算の結果は1つのBinaryOpUGenになります。
49 ////////////////////////////////////////////////////////////////////////////////////////////////////
51 次の例は、3つのUGenが加算を通して合体することによって何が起きるのかを示します。最初に、2つのUGenが1つのBinarOpUGenに合体します。その結果に加算演算子ともう1つのUGen(オペランド)が続き、もう1つのBinaryOpUGenを生成します。
53 code::
56         // 最初の2つのUGenは1つのBinaryOpUGenに合体する
57         Saw.ar(500, 0.05)
58         +
59         Saw.ar(600, 0.06)
60         +
61         // このUGenはBinaryOpUGenに対するオペランドと‘+’オペレータ
62         Saw.ar(700, 0.07)
63 }.scope;
67 ////////////////////////////////////////////////////////////////////////////////////////////////////
69 MixというUGenを用いることで前の例と同じ結果になります。
71 code::
74         // ミックスしたいUGenを配列の中に入れる
75         Mix.ar(
76                 [
77                         Saw.ar(500, 0.05),
78                         Saw.ar(600, 0.06),
79                         Saw.ar(700, 0.06)
80                 ]
81         )
82 }.scope
86 ////////////////////////////////////////////////////////////////////////////////////////////////////
88 もしくは、Mix.arFillを使って似た様な結果を生成することもできます。この関数が実行される時には毎回、アーギュメントiはインクリメントされます。つまり、1回目に関数が実行される時にはiは0に等しく、2回目には1、3回目には2、という様になります。
90 code::
91 { Mix.arFill(3, { arg i; Saw.ar(500 + ((i+1) * 100), 0.05) }) }.scope;
94 ////////////////////////////////////////////////////////////////////////////////////////////////////
96 section::スケーリング=掛算
98 低い周波数のオシレータを用いる次の例は、WhiteNoiseジェネレータに対してエンベロープを適用します。これは、1つのUGenを他のUGenと掛算することにより、双方をスケーリングするということをデモするものです。
100 code::
101 { WhiteNoise.ar(0.1) * SinOsc.kr(1, 1) }.scope;
104 次の例は、2つのノイズを生成するUgenがサイン波でスケーリングされてBinaryOpUGenを生成し、それがまた別のBinaryOpUGenに加算されるというものです。
106 code::
108         // ... 汽車のまね?
109         {
110                 (WhiteNoise.ar(0.1) * SinOsc.kr(1, 1))
111                 +
112                 (BrownNoise.ar(0.1) * SinOsc.kr(2, 1))
113         }.scope;
117 ////////////////////////////////////////////////////////////////////////////////////////////////////
119 section::エンベロープ
121 UGenの任意のアスペクト、例えば、周波数、位相、振幅といったものをダイナミックに変調するにはエンベロープを使います。
123 code::
124 // 振幅を変調する
125 { SinOsc.ar(440, 0, 0.1) * EnvGen.kr(Env.sine(1), doneAction: 2) }.scope;
128 doneActionアーギュメント(コントロール)を2にセットすると、SuperColliderはSinOscとEnvGenのインスタンスを保持するために要求されていたメモリを解放することを確約します。アーギュメントがキーワードのスタイルで与えられていることに注意して下さい。キーワードのスタイルとは、アーギュメントの名前の後にコロン(‘:’)が続き、コロンの後に値が続く、というものです。
130 キーワードはコードをより読みやすいものにします。また、これによってアーギュメントを任意の順番で書くことができる様になります。
132 ////////////////////////////////////////////////////////////////////////////////////////////////////
134 EnvGenのtimeScaleアーギュメント(コントロール)は、エンベロープの継続時間を変調します。
136 code::
138 SynthDef("timeScale", { arg ts = 1;
139         Out.ar(
140                 0,
141                 SinOsc.ar(440, 0, 0.4) * EnvGen.kr(Env.sine(1), doneAction: 2, timeScale: ts)
142         )
143 }).add;
146 Synth("timeScale", [\ts, 0.1]); // timeScaleコントロールはエンベロープの継続時間
149 ////////////////////////////////////////////////////////////////////////////////////////////////////
151 code::
152 //  ... エンベロープの時間をシンセが作られるたびに毎回違ったものにスケーリングする
154 r = Routine({
155         loop({
156                 Synth("timeScale", [\ts, 0.01.rrand(0.3)]);
157                 0.5.wait;
158         })
161 r.play
164 ////////////////////////////////////////////////////////////////////////////////////////////////////
166 section::加算合成
168 加算合成とはその名が示す通りのものです。コンポーネントはお互いに加えられ(または合計され)ます。
170 code::
172 {       // 関数を12回実行する
173         var n = 12;
174         Mix.arFill(
175                 n,
176                 {
177                         SinOsc.ar(
178                                 [67.0.rrand(2000), 67.0.rrand(2000)],
179                                 0,
180                                 n.reciprocal * 0.75
181                         )
182                 }
183         )
184         *
185         EnvGen.kr(Env.perc(11, 6), doneAction: 2)
186 }.scope
190 ////////////////////////////////////////////////////////////////////////////////////////////////////
192 section::それぞれのコンポーネントにエンベロープを与える
194 加算合成に期待されて来たこととは、求められる周波数成分に従ってサイン波を加算することで、想像しうるサウンドを生成または再現することができるということでした。
196 加算合成の問題点とは、サウンドの正確な周波数成分を知る必要があるということで、それには必要とされる数のサイン波のそれぞれが理想的なエンベロープで制御されることによって初めて可能になるのです。
198 どちらにせよ、前の例のそれぞれのコンポーネントに別々のエンベロープを与えることによって、より微妙なテクスチャーを生成することができます。
200 code::
202 {       var n = 12;
204         Mix.arFill(
205                         n,                                              // n個のサイン波を生成する
206                         {
207                         SinOsc.ar(                                      // それぞれがlow.rrand(high)の範囲内で起こりうる周波数
208                                 [67.0.rrand(2000), 67.0.rrand(2000)],   // ... 実数の値
209                                 0,
210                                 n.reciprocal                            // それぞれのサイン波の振幅をスケーリングする
211                                                                         // nの値に従って
212                         )
213                         *
214                         EnvGen.kr(                                      // サイン波のそれぞれにエンベロープを与える
215                                 Env.sine(2.0.rrand(17)),
216                                 doneAction: 0                           // サウンド全体が完了した時にだけ
217                                                                         // エンベロープを解放する(なぜ?)
218                         )
219                 }
220         )
221         *                                                               // パッチ全体に対してエンベロープを与える
222         EnvGen.kr(
223                 Env.perc(11, 6),
224                 doneAction: 2,
225                 levelScale: 0.75
226         )
228 }.scope
232 (もしくはlink::Classes/Klang:: ugenを用いることで同じ様な結果が得られます)
234 ////////////////////////////////////////////////////////////////////////////////////////////////////
236 section::リング変調
238 2つのUGenを掛算することでリング変調を生成します。
240 code::
241 // キャリアの振幅を低周波オシレータ(LFO)で変調
242 { SinOsc.ar(440, 0, 0.571) * SinOsc.kr(2.reciprocal) }.scope
244 // LFOの周波数を可聴帯域にすることで追加の周波数成分を生成する
245 { SinOsc.ar(440, 0, 0.571) * SinOsc.kr(880) }.scope
247 // 低周波のオシレータ(lfo)でモジュレータの振幅を変調する
249         {
250                 SinOsc.ar(440, 0, 0.571)
251                 *
252                 (SinOsc.kr(880)                         // モジュレータとlfoを括弧の中に包み込む
253                 *                                       // なぜ?
254                 SinOsc.kr([6.99, 8.01].reciprocal)
255                 )
256         }.scope
260 ////////////////////////////////////////////////////////////////////////////////////////////////////
262 section::振幅変調
264 2つのUGenを掛算する際にモジュレータの値を正の値に制限することで、Charles Dodgeが「クラシック」振幅変調と呼ぶものを生成します。
266 モジュレーター、もし低周波のオシレータである場合には、その出力が正の値に制限されているか正の値に制限されていないかの違いは、変調の振幅のみに表れます。UGenを正の値のみに制限するために.absメッセージを使っています。
268 code::
269 // 低周波のオシレータ(lfo)でキャリアの振幅を変調する
270 { SinOsc.ar(440, 0, 0.571) * SinOsc.kr(2.reciprocal).abs }.scope
272 // lfoを用いてモジュレータの振幅を変調する
274         {
275                 SinOsc.ar(440, 0, 0.571)
276                 *
277                 (SinOsc.kr(880).abs                     // モジュレータとlfoを括弧の中に包み込む
278                 *                                       // なぜ?
279                 SinOsc.kr([6.99, 8.01].reciprocal)
280                 )
281         }.scope
285 ////////////////////////////////////////////////////////////////////////////////////////////////////
287 モジュレータの出力を正の値に制限して低周波のオシレータの周波数を上げることにより、(サイドバンドを生成することによって)著しく音色が変化させます。
289 code::
290 // lfoの周波数を可聴帯域にして.absメッセージをモジュレータに適用する
291 { SinOsc.ar(440, 0, 0.571) * SinOsc.kr(880).abs }.scope
293 // 前の例をリング変調(.absメッセージの無いもの)と比較せよ
294 // ... 何が違うだろう?
295 { SinOsc.ar(440, 0, 0.571) * SinOsc.kr(880) }.scope
298 ////////////////////////////////////////////////////////////////////////////////////////////////////
300 go to link::Tutorials/Mark_Polishook_tutorial/Japanese_version/10::