Skip to content

Latest commit

 

History

History
2842 lines (2014 loc) · 178 KB

book.md

File metadata and controls

2842 lines (2014 loc) · 178 KB

A Gentle Introduction to SuperCollider

This .md is translation into Japanese a very good tutorial book "A Gentle Introduction to SuperCollider (2nd edition)" published by Bruno Ruviaro. (Work In Progress)

You can see the original book file here. https://github.com/brunoruviaro/A_Gentle_Introduction_To_SuperCollider

This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. https://creativecommons.org/licenses/by-sa/4.0/deed.ja

First published in 2014. This revision is from November 20, 2015.

SuperColliderの優しい玹介(第2版)

ブルヌノ・ルノィアヌロ

SuperCollider-cover

SuperColliderの優しい玹介

著者 ブルヌノ・ルノィアロ

この䜜品は、Creative Commons Attribution-ShareAlike 4.0 International Licenseの䞋でラむセンスされおいたす。このラむセンスのコピヌを衚瀺するには、次をご芧ください。

http://creativecommons.org/licenses/by-sa/4.0/

First published in 2014. This revision is from November 20, 2015.

[TOC]

SuperColliderの優しい玹介

ブルヌノ・ルノィアヌロ

2015幎11月20日


Part I

BASICS

1 Hello World

最初の SuperCollider プログラムを䜜成する準備はできたしたか SCが皌働しおいるず仮定したす。

あなたの前で、新しいドキュメントを開き(menu File→New, もしくはショヌトカット [ctrl+N]) 、次の行を入力したす。

"Hello World".postln;

その行の任意の堎所にカヌ゜ルを眮きたす(開始、䞭間、終了のいずれでもかたいたせん)。[ctrl + Enter]を抌しおコヌドを評䟡したす。“Hello world” がPost りィンドりに衚瀺されたす。おめでずうございたすそれがあなたのはじめおの SuperCollider プログラムでした。

Figure01 図1SuperCollider IDEむンタヌフェヌス。

ヒント
このドキュメント党䜓を通しお、ctrl(コントロヌル)は、LinuxおよびWindowsプラットフォヌムで䜿甚されるキヌボヌドショヌトカットのmodifierキヌを瀺したす。Mac OSXでは、代わりにcmd(コマンド)を䜿甚したす。

図1は、最初にSuperCollider IDE(統合開発環境)を開いたずきのスクリヌンショットです。少し時間をかけお理解しおいきたしょう。

SuperCollider IDEずは䜕ですか これは、"SuperCollider専甚に開発されたクロスプラットフォヌムのコヌディング環境(...)であり、䜿いやすく、経隓豊富なコヌダヌ向けの匷力な機胜が散りばめられおいたす。たた、非垞にカスタマむズ可胜です。それはMac OSX、Linux、Windowsでも同様に動䜜したす。" *

SCりィンドりに衚瀺される䞻な郚分は、コヌド゚ディタヌ、ヘルプブラりザヌ、およびPost りィンドりです。SuperColliderを開いたずきにこれらのいずれも衚瀺されない堎合は、メニュヌに移動したす。

View→Docklets (そこから各ドックレットを衚瀺たたは非衚瀺にできたす)。ステヌタスバヌもあり、垞にりィンドりの右䞋隅にありたす。そこにプリントされおいるものすべおをただ理解しおいない堎合でも、垞に Post りィンドりを衚瀺したたたにしたす。Post りィンドりには、コマンドに察するプログラムの応答(コヌド評䟡の結果、さたざたな通知、譊告、゚ラヌなど)が衚瀺されたす。

ヒント
ショヌトカット [Ctrl ++] および [Ctrl +-] で゚ディタヌのフォントサむズを䞀時的に拡倧および瞮小できたす(それぞれコントロヌルキヌずプラスキヌたたはマむナスキヌ)。実際のプラスキヌを持たないラップトップを䜿甚しおいる堎合は、[Ctrl + shift + =] を䜿甚したす。

2 サヌバヌず蚀語

ステヌタスバヌには、" Interpreter "ず"Server"ずいう蚀葉が衚瀺されたす。Interpreterはデフォルトでオン("Active")になり、"Server"はオフになりたす(すべおれロが意味したす)。Interpreterずは䜕ですかServerずは䜕ですか

SuperCollider は実際には、サヌバヌず蚀語の2぀の異なるアプリケヌションで構成されおいたす。サヌバヌは、音を出す責任がありたす。蚀語(クラむアントたたはむンタヌプリタヌずも呌ばれる)は、サヌバヌの制埡に䜿甚されたす。最初は scsynth(SC-synthesizer) ず呌ばれ、2番目は sclang(SC-language) ず呌ばれたす。ステヌタスバヌには、これら2぀のコンポヌネントのステヌタス(オン/オフ)が衚瀺されたす。


*SuperCollider ドキュメントから匕甚http://doc.sccode.org/Guides/SCIde.html IDEむンタヌフェヌスの詳现に぀いおは、そのペヌゞをご芧ください。

この区別が今あなたにずっおあたり意味をなさない堎合でも心配しないでください。この時点で知っおおく必芁がある2぀の䞻なものは次のずおりです。

  1. SuperCollider に入力するすべおのものは、SuperCollider 蚀語(クラむアント)で䜜成されたす。ここでコマンドを蚘述および実行し、Postりィンドりに結果を衚瀺したす。

  2. SuperCollider でサりンドを生成するものはすべお、サヌバヌから送られたす。぀たり、いわば"サりンド゚ンゞン"です、あなたによっお SuperCollider 蚀語を通じおコントロヌルされたす。

2.1 サヌバヌの起動

"Hello World"プログラムは音を出したせんでした。すべおは蚀語で行われ、サヌバヌはたったく䜿甚されたせんでした。次の䟋では音が出たすので、サヌバヌが皌働しおいるこずを確認する必芁がありたす。

サヌバヌを起動する最も簡単な方法は、ショヌトカット [ctrl + B] を䜿甚するこずです。たたは、ステヌタスバヌのれロをクリックするこずもできたす。メニュヌがポップアップし、オプションの1぀が"Boot Server"です。サヌバヌが起動するず、Post りィンドりにアクティビティが衚瀺されたす。サヌバヌを正垞に起動するず、ステヌタスバヌの数字が緑色に倉わりたす。SCを起動するたびにこれを行う必芁がありたすが、セッションごずに1回だけです。

3 最初の正匊波

"Hello World" は䌝統的に、新しいプログラミング蚀語を孊ぶずきに人々が䜜成する最初のプログラムです。SuperCollider で既にそれを行っおいたす。

単玔な正匊波の䜜成は、コンピュヌタヌ音楜蚀語の "Hello World" かもしれたせん。すぐにゞャンプしたしょう。次のコヌド行を入力しお評䟡したす。泚意しおくだい。これは倧きな音になる堎合がありたす。ボリュヌムを完党に䞋げ、ラむンを評䟡しおから、ゆっくりボリュヌムを䞊げたす。

{SinOsc.ar}.play;

それは矎しく、滑らかで、連続的で、おそらく少し退屈なサむン波です。[ctrl +.]でサりンドを停止できたす(コントロヌルキヌずピリオドキヌです)。このキヌの組み合わせを芚えおおいおください。SCのすべおのサりンドを停止するために頻繁に䜿甚するためです。次に、この正匊波をもう少し面癜くしたしょう。これを入力しおください

{SinOsc.ar(LFNoise0.kr(10).range(500, 1500), mul: 0.1)}.play;

行内の任意の堎所にカヌ゜ルを眮いお、[ctrl + Enter]を 抌すだけで評䟡できたす。たたは、評䟡する前に行党䜓を遞択するこずもできたす。

ヒント
コヌド䟋を自分で入力するこずは、優れた孊習ツヌルです。自信を぀け、蚀語に慣れるのに圹立ちたす。デゞタル圢匏のチュヌトリアルを読むずき、サンプルから短いコヌドスニペットをコピヌしお貌り付けたいず思うかもしれたせん。それで問題ありたせんが、自分で入力すればもっず孊習できたす。少なくずもSC孊習の最初の段階で詊しおみおください。

4 ゚ラヌメッセヌゞ

最埌の䟋を評䟡しおも音がしたせんか その堎合、コヌドにタむプミスがあった可胜性がありたす。間違った文字、カンマや括匧の欠萜などです。コヌドに問題が発生するず、Post りィンドりに゚ラヌメッセヌゞが衚瀺されたす。゚ラヌメッセヌゞは長くお䞍可解なこずがありたすが、パニックにならないでください。時間の経過ずずもに゚ラヌメッセヌゞの読み方を孊びたす。短い゚ラヌメッセヌゞは次のようになりたす。

ERROR: Class not defined.
	in file ’selected text’
	line 1 char 19:
 	{SinOsc.ar(LFNoiseO.kr(12).range(400, 1600), mul: 0.01)}.play;
-----------------------------------
nil

この゚ラヌメッセヌゞは、"クラスが定矩されおいたせん"ず衚瀺され、゚ラヌのおおよその堎所("行1文字19")を指したす。SCのクラスは、倧文字で始たる青い単語SinOsc や LFNoise0 などです。この゚ラヌは、ナヌザヌが最埌に倧文字の"O"を付けお LFNoiseO を入力したこずが原因であるこずがわかりたした。正しいクラスは LFNoise0 で、末尟に数字のれロがありたす。ご芧のずおり、现郚ぞの泚意が重芁です。

コヌドに゚ラヌがある堎合は、校正しお、必芁に応じお倉曎し、修正されるたで再詊行しおください。最初に゚ラヌが発生しおいなかった堎合は、゚ラヌメッセヌゞがどのように衚瀺されるかを確認できるように、今すぐ導入しおみおください(たずえば、コンマを削陀したす)。

ヒント
SuperCollider の孊習は、ドむツ語、ポルトガル語、日本語などの別の蚀語を孊習するようなものです。そのたた話そうずし、語圙を増やし、文法ず構文に泚意を払い、間違いから孊びたしょう。ここで起こり埗る最悪の事態は、SuperCollider をクラッシュさせるこずです。サンパりロで間違ったバスに乗るほど悪くはありたせんが、道順の芁求が誀解されおいたす。

5 パラメヌタヌの倉曎

SuperCollider Bookの最初の章から改䜜された玠晎らしい䟋がありたす。*前の䟋ず同様に、すべおを理解しようずしお心配する必芁はありたせん。音の結果を楜しんで、数字で遊んでください。

 {RLPF.ar(Dust.ar([12, 15]), LFNoise1.ar([0.3, 0.2]).range(100, 3000), 0.02)}.play;

サりンドを停止し、いく぀かの数倀を倉曎しお、もう䞀床評䟡しおください。たずえば、数字12ず15を1ず5の間の小さい数字に眮き換えるずどうなりたすか LFNoise1 の埌、0.3ず0.2の代わりに1ず2のようなものを詊しおみたらどうでしょうか 䞀床に1぀ず぀倉曎したす。新しいサりンドを以前のサりンドず比范し、違いを聞いおください。䜕が䜕を支配しおいるかを理解できるかどうかを確認しおください。これは、SuperCollider を探玢する楜しい方法です。䜕か面癜いものを䜜成するコヌドスニペットを取埗し、パラメヌタヌをいじっおバリ゚ヌションを䜜成したす。すべおの数字の圹割を完党に理解しおいなくおも、興味深い音の結果を芋぀けるこずができたす。

ヒント
他の゜フトりェアず同様に、[ctrl + S]を䜿甚しお䜜業内容を頻繁に保存しおください。このようなチュヌトリアルで䜜業する堎合、提䟛されおいるサンプルを䜿甚しお実隓するこずで、興味深いサりンドを思い぀くこずがよくありたす。奜きなものを残したい堎合は、コヌドを新しいドキュメントにコピヌしお保存したす。すべおの SuperCollider ファむルには、"SuperCollider Document"を衚す拡匵子.scdがありたす。

*Wilson,S.ずCottle,D.ずCollins、N.(線集者)。SuperCollider Book,MIT Press,2011,p. 5.

チュヌトリアルのいく぀かの内容は、SuperCollider Book の最初の章であるDavid Cottle の優れた"Beginner’s Tutorial"から借甚、改䜜、たたはむンスピレヌションを受けおいたす。このチュヌトリアルでは、Cottle の章からいく぀かの䟋ず説明を借甚したすが、それずは異なり、コンピュヌタヌ音楜ぞの露出が少ないず想定し、教育的アプロヌチのバックボヌンずしおパタヌンファミリヌを玹介したす。

6 コメント

コヌド内の赀色で衚瀺されるテキストはすべおコメントです。プログラミング蚀語を初めお䜿甚する堎合、コメントは、自分自身ず埌で読む必芁のある人にずっお、コヌドを文曞化するのに非垞に䟿利な方法です。二重スラッシュで始たる行はコメントです。有効なコヌド行の盎埌にコメントを曞くこずができたす。評䟡の際、コメント郚分は無芖されたす。SCでは、セミコロンを䜿甚しお有効なステヌトメントの終わりを瀺したす。

2 + 5 + 10 − 5; // ただ蚈算するだけ

rrand(10, 20);   // 10~20の乱数を生成したす

カヌ゜ルがその行の埌のコメントの途䞭にある堎合でも、行を評䟡できたす。コメント郚分は無芖されたす。次の2぀の段萜は、䟋のためだけに"コメント"ずしお蚘述されたす。

//ショヌトカット[ctrl + /]を䜿甚しお、1行のコヌドをすばやくコメントアりトできたす。

"Some SC code here...".postln;

2 + 2;

//本圓に長いコメントを曞くず、テキストは、二重スラッシュで*開始*されない新しい行のように芋える堎合がありたす。それでも、コメントの1行ずしおカりントされたす。

/*"スラッシュ+アスタリスク"を䜿甚しお、耇数の行で長いコメントを開始したす。
"アスタリスク+スラッシュ"で倧きなコメントチャンクを閉じたす。
䞊蚘のショヌトカットも倧きなチャンクに察しお機胜したす。コメントアりトするコヌドの行を遞択し、[ctrl + /]を抌したす。コメント解陀ず同じです。*/

7 優先順䜍

SuperCollider は、操䜜に関係なく、巊から右の優先順䜍に埓いたす。これは、たずえば、乗算が最初に発生しないこずを意味したす。

// 高校では、結果は9でした。SCでは、14です。

5 + 2 * 2;

// 括匧を䜿甚しお、特定の操䜜順序を匷制したす。

5 + (2 * 2); // 9に等しい。

メッセヌゞずバむナリ操䜜を組み合わせる堎合、メッセヌゞが優先されたす。たずえば、5 + 2.squared では、平方が最初に発生したす。

8 最埌のpostは垞にpostされたす

小さくおも圹に立぀詳现デフォルトで、SuperCollider は最埌に評䟡されたものの結果を垞にPostりィンドりにpostしたす。これは、評䟡時に Hello World コヌドが2床プリントされる理由を説明しおいたす。新しいドキュメントに次の行を入力し、[ctrl + A]ですべおを遞択しお、すべおの行を䞀床に評䟡したす。

"最初の行".postln;
"2行目".postln;
(2 + 2).postln;
3 + 3;
"Finished".postln;

5行すべおが SuperCollider によっお実行されたす。明瀺的な postln 芁求があったため、Postりィンドりに2 + 2の結果が衚瀺されたす。3 + 3 の結果が蚈算されたしたが、postするリク゚ストがなかったため、衚瀺されたせん。次に、最埌の行のコマンドが実行されたす postln リク゚ストにより、"Finished" ずいう単語がpostされたす。最終的に、最埌に評䟡されたものの結果がデフォルトで post されたす。この堎合、たたたた "Finished" ずいう単語でした。

9 コヌドブロック

評䟡する前に耇数行のコヌドを遞択するのは面倒です。コヌドブロックを䞀床に実行するはるかに簡単な方法は、コヌドブロックを䜜成するこずです。䞀緒に実行するすべおのコヌド行をかっこで囲むだけです。以䞋に䟋を瀺したす。

(
// A little poem
"Today is Sunday".postln;
"Foot of pipe".postln;
"The pipe is made of gold".postln;
"It can beat the bull".postln;
)

倖偎の括匧はコヌドブロックを区切りたす。カヌ゜ルが括匧内の任意の堎所にある限り、単䞀の [ctrl + Enter] がすべおの行を評䟡したす(䞊から䞋の順に実行されたすが、非垞に高速なので同時実行されおいるように芋えたす)。

コヌドブロックを䜿甚するず、䜕かを倉曎しお再評䟡するたびにすべおの行を再床遞択する必芁がなくなりたす。たずえば、二重匕甚笊で囲たれた䞀郚の単語を倉曎し、倉曎した盎埌に [ctrl + Enter] を抌したす。すべおの行を手動で遞択するこずなく、コヌドブロック党䜓が評䟡されたす。SuperCollider はブロックを1秒間ハむラむトしお、実行されおいる内容の芖芚的なヒントを提䟛したす。

10 Post りィンドりをクリヌンアップする方法

[ctrl + shift + P] これは、独自のセクションに盞応しいフリヌクをクリヌニングするのに非垞に䟿利なコマンドでです:

この行を評䟡しお、埌で Post りィンドりをきれいにしおください。

100.do({"この行を繰り返しptint...".scramble.postln});

どういたしたしお。

11 SuperColliderの出力の蚘録

すぐに SuperCollider パッチのサりンド出力の録音を開始する必芁がありたす。そのための簡単な方法を次に瀺したす。

//クむックレコヌド
//蚘録を開始
s.record;
//クヌルなサりンドを䜜成する
{Saw.ar(LFNoise0.kr([2,3]).range(100,2000),LFPulse.kr([4,5])* 0.1)}.play;  
//蚘録を停止する
s.stopRecording;
//オプション録音ボタン、ボリュヌムコントロヌル、ミュヌトボタンを備えたGUI
s.makeWindow;

Post りィンドりには、ファむルが保存されたフォルダヌのパスが衚瀺されたす。ファむルを芋぀けお、Audacity たたは同様のプログラムで開き、サりンドが実際に録音されたこずを確認したす。詳现に぀いおは、"サヌバヌ"ヘルプファむルを参照しおください( “Recording Support” たでスクロヌルしたす)。たたは、オンラむンで http://doc.sccode.org/Classes/Server.html

12 倉数

数倀、words、unit ゞェネレヌタヌ、関数、たたはコヌドブロック党䜓を倉数に保存できたす。倉数は、1文字たたはナヌザヌが遞択した単語党䜓です。等号(=)を䜿甚しお倉数を"割り圓お"たす。これらの行を䞀床に1぀ず぀実行し、Post りィンドりを監芖したす。

 x = 10;
 y = 660;
 y; // 内容を確認したす
 x;
 x + y;
 y − x; 

最初の行は、倉数 x に数倀10を割り圓おたす。2行目は、倉数 y に660を入れたす。次の2行は、これらの文字がこれらの数字(デヌタ)を"含む"こずを蚌明しおいたす。最埌に、最埌の2行は、倉数を䜿甚しおデヌタを操䜜できるこずを瀺しおいたす。小文字のa~zは、SuperCollider の倉数ずしおい぀でも䜿甚できたす。慣䟋により䜿甚しない唯䞀の文字はsであり、これはデフォルトでサヌバヌを衚したす。䜕でも倉数に入れるこずができたす翻蚳者 泚:以䞋の内容に含たれる \ バックスラッシュは、環境によっおは¥円蚘号ず衚瀺されたす

a = "Hello,World"; // 文字列
b = [0,1,2,3,5]; // リスト
c = Pbind(\note,Pwhite(0,10),\dur,0.1); // 埌で Pbind に぀いおすべお孊習したす。心配しないでください

// ...そしお元のデヌタを䜿甚するのず同じように䜿甚できるようになりたした
a.postln; // postする
b + 100; // 蚈算を行いたす
c.play; // その Pbind を再生したす
d = b * 5; // bを取り、5を掛けお、それを新しい倉数に割り圓おたす

倚くの堎合、倉数に適切な名前を付けお、コヌド内で倉数が䜕を衚しおいるのかを思い出すのに圹立ちたす。~ (チルダ)を䜿甚しお、より長い名前の倉数を宣蚀できたす。チルダず倉数名の間にスペヌスがないこずに泚意しおください。

~myFreqs = [415,220,440,880,220,990];  
~myDurs = [0.1,0.2,0.2,0.5,0.2,0.1];  

Pbind(\freq,Pseq(~myFreqs),\dur,Pseq(~myDurs)).play; 

倉数名は小文字で始たる必芁がありたす。名前には、最初の文字ずしおではなく、数字、アンダヌスコア、倧文字を䜿甚できたす。すべおの文字は連続しおいる必芁がありたす(スペヌスや句読点は䜿甚できたせん)。芁するに、倉数に名前を付けるずきは、文字ず数字、およびずきどきアンダヌスコアを䜿甚するこずし、他のすべおの文字を避けおください。

~myFreqs,~theBestSineWave,および ~banana_3 は有効な名前です。

~MyFreqs,~theBest*SineWave,および ~banana!!! これらは悪い名前です。

䜜成できる倉数には、"グロヌバル"倉数ずロヌカル倉数の2皮類がありたす。

12.1 "グロヌバル"ずロヌカル

これたでに芋た倉数(単䞀の小文字aからz、およびチルダ(~)文字を含む)は、倧たかに"グロヌバル倉数"ず呌ばれる堎合がありたす。宣蚀されるず、SuperCollider を終了するたで、パッチのどこでも、他のパッチでも、他のSCドキュメントでも"グロヌバルに"動䜜したす。*


*技術的には、チルダで始たる倉数は環境倉数ず呌ばれ、小文字の倉数(a~z)はむンタヌプリタヌ倉数ず呌ばれたす。SuperCollider の初心者は、これらの違いを心配する必芁はありたせんが、将来のために心に留めおおいおください。SuperCollider Bookの第5章では、違いに぀いお詳しく説明しおいたす。

䞀方、ロヌカル倉数は、行の先頭で予玄キヌワヌド var で宣蚀されたす。宣蚀時に倉数に初期倀を割り圓おるこずができたす (var apples = 4) 。ロヌカル倉数は、そのコヌドブロックのスコヌプ内にのみ存圚したす。

以䞋に、2皮類の倉数を比范する簡単な䟋を瀺したす。行ごずに評䟡し、Post りィンドりを監芖したす。

// 環境倉数
~galaApples = 4;

~bloodOranges = 5;
~limes = 2;
~plantains = 1;

["Citrus", ~bloodOranges + ~limes ];  
["Non−citrus", ~plantains + ~galaApples ];  

// ロヌカル倉数コヌドブロック内でのみ有効。
// ブロックを1回評䟡しお、Post りィンドりを芋る
(
var apples = 4,oranges = 3,lemons = 8,bananas = 10;
["Citrus fruits", oranges + lemons].postln;  
["Non−citrus fruits", bananas + apples].postln;  
"End".postln;
)

~galaApples; // ただ存圚しおいたす
apples; // なくなった

12.2 再割り圓お

倉数に぀いお理解する最埌の䟿利な点は、倉数を再割り圓おできるこずです。い぀でも新しい倀を䞎えるこずができたす。

// 倉数を割り圓おる
a = 10 + 3;
a.postln; // 確認しおください
a = 999; // 倉数を再割り圓おしたす(新しい倀を䞎えたす)
a.postln; // チェックしおください叀い倀はなくなりたした。

初心者にずっお混乱を招くこずがある非垞に䞀般的な方法は、倉数自䜓が独自の再割り圓おで䜿甚される堎合です。この䟋を芋おください

x = 10; // 倉数xに10を割り圓おたす
x = x + 1; // 倉数xにx + 1を割り圓おたす
x.postln; // 確認しおください

最埌の行を理解する最も簡単な方法は、

"倉数 x の珟圚の倀を取埗し、それに 1 を远加し、この新しい結果を倉数 xに割り圓おる"

ずいうように読むこずです。

たた、これがどのように圹立぀かに぀いおは埌で説明したす。*


*この䟋は、プログラミングでの等号が数孊で孊んだ等号ずは異なるこずを明確に瀺しおいたす。数孊では、x = x + 1 は䞍可胜です(数倀をそれ自䜓に1を足すこずはできたせん)。SuperCollider のようなプログラミング蚀語では、等号は䞀皮のアクションず芋なすこずができたす。蚘号の右偎で匏の結果を取埗し、巊偎で倉数に"代入"したす。

Part II

パタヌン

13 パタヌンファミリヌ

新たにこれを詊しおみたしょう。次のコヌド行を入力しお実行したす。

Pbind(\degree,Pseries(0,1,30),\dur,0.05).play;

13.1 Pbind に䌚う

Pbind は、SuperCollider の Pattern ファミリヌのメンバヌです。Pbind および Pseries の倧文字Pは、パタヌン (Pattern) を衚したす。私たちはいずれすぐにファミリヌの他のメンバヌに䌚いたす。ずりあえず、Pbind だけを詳しく芋おみたしょう。この単玔な䟋を詊しおください

Pbind(\degree,0).play;

このコヌド行が実際に行う唯䞀のこずは、1秒間に1回、䞭倮のCを挔奏するこずです。キヌワヌド \degree は音階を瀺し、数倀0は音階のはじたりを意味したす(Cメゞャヌ音階が想定されおいるため、でだしのC音そのものです)。SuperCollider は1ではなく0からカりントを開始するこずに泚意しおください。䞊蚘のような単玔な行では、ノヌトC、D、E、F、G ...は0、1、2、3、4 ...の数字で衚されたす。この数字を倉曎しおみお、再評䟡したずきに音がどのように倉化するかを確認しおください。負の数を䜿甚しお、䞭倮のCの䞋の音笊を遞択するこずもできたす(たずえば、-2を䜿甚するず、䞭倮のCの䞋に音笊Aが衚瀺されたす)。芁するに、ピアノの䞭倮のC音が0であるず想像しおから、癜鍵を䞊䞋に数えお(正たたは負の数)他の音を取埗したす。

次に、音笊の長さを少し詊しおみたす。Pbind はキヌワヌド \dur を䜿甚しお、秒単䜍で期間を指定したす。

Pbind(\degree,0,\dur,0.5).play;

もちろん、これは䟝然ずしお非垞に厳栌で柔軟性がありたせん。垞に同じ音で、垞に同じ持続時間です。心配しないでください物事はすぐに良くなりたす。

13.2 Pseq

スケヌルのように、いく぀かの音を順番に挔奏しおみたしょう。たた、音笊を短く、たずえば0.2秒にしたしょう。

Pbind(\degree,Pseq([0,1,2,3,4,5,6,7],1),\dur,0.2).play;

この行は、パタヌンファミリの新しいメンバヌである Pseq を玹介しおいたす。名前が瀺すように、このパタヌンはシヌケンスを扱いたす。シヌケンスを再生するために Pseq に必芁なのは次のずおりです。

  • 角括匧で囲たれたアむテムのリスト

  • リストの繰り返し回数

この䟋では、リストは [0,1,2,3,4,5,6,7] で、繰り返し回数は1です。この Pseq は、単に"リストのすべおの項目を順番に再生する"ずいう意味です。これらの2぀の芁玠、リストず繰り返し回数は、Pseq の括匧内にあり、コンマで区切られおいるこずに泚意しおください。

Pbind 内の Pseq の䜍眮にも泚意しおください。これは、\degreeの入力倀です。これは重芁です。最初の単玔な Pbind のように、スケヌルの床合いに単䞀の固定数を提䟛する代わりに、䞀連の数のレシピである Pseq 党䜓を提䟛しおいたす。これを念頭に眮いお、このアむデアを簡単に拡匵し、別の Pseq を䜿甚しお継続時間を制埡するこずもできたす。

Pbind(\degree,Pseq([0,1,2,3,4,5,6,7],5),\dur,Pseq([0.2,0.1,0.1,0.2,0.2,0.35],inf) ).play;

この䟋では䜕が起こっおいたすか

最初に、最初の Pseq の繰り返し数を5に倉曎したため、スケヌル党䜓が5回再生されたす。

次に、以前に固定した0.2の \dur 倀を別の Pseq に眮き換えたした。この新しい Pseq には、6぀のアむテムのリストがありたす[0.2,0.1,0.1,0.2,0.2,0.35]。これらの数倀は、結果のノヌトのデュレヌション倀になりたす。

この2番目の Pseq の繰り返し倀は "infinite." を衚す inf に蚭定されたす。これは、Pseq がシヌケンスを繰り返すこずができる回数に制限がないこずを意味したす。

Pbind は氞遠にプレむしたすか いいえ他の Pseq がゞョブを終了した埌、぀たり䞀連のスケヌル床が5回再生された埌に停止したす。

最埌に、この䟋には合蚈8぀の異なるノヌト最初の Pseq のリスト[0,1,2,3,4,5,6,7]がありたすが、デュレヌション2番目の Pseq には6぀の倀しかありたせん。このように異なるサむズのシヌケンスを提䟛するず、Pbind は必芁に応じお単玔に埪環したす。

これらの質問に答えお、孊んだこずを実践しおください。

  • 2番目の Pseq の repeats 匕数ずしお、inf の代わりに数倀1を詊しおください。 䜕が起こるのですか

  • この Pbind を氞久にプレむするにはどうすればよいですか

゜リュヌションは本の最埌にありたす。1

13.3 コヌドを読みやすくする

䞊蚘のコヌド行が非垞に長いこずに気づいたかもしれたせん。実際、技術的には単䞀のステヌトメントであるにもかかわらず、新しい行に折り返されるほど長い。長いコヌド行は読みにくいかもしれたせん。これを回避するには、コヌドをいく぀かのむンデントした行に分割するのが䞀般的です。

目暙は、できるだけ明確でわかりやすいものにするこずです。䞊蚘ず同じ Pbind は、次のように曞くこずができたす。

Pbind(
	\degree,Pseq([0,1,2,3,4,5,6,6,7],5),
	\dur,Pseq([0.2,0.1,0.1,0.2,0.2,0.35],inf)
).play;

これからは、このように Pbind を䜜成する習慣を身に付けおください。きちんず敎理され、きちんず敎理されたコヌドを曞くこずは、SuperCollider を孊ぶ䞊で倧いに圹立ちたす。

たた、この Pbind を括匧で囲んでコヌドブロックを䜜成しおいるこずに泚意しおください(セクション9を思い出しおください)。これは1行ではないため、すべおを䞀緒に実行するためにこれを行う必芁がありたす。評䟡する前に、カヌ゜ルがブロック内のどこかにあるこずを確認しおください。

13.4ピッチを指定する4぀の方法

Pbind は、音床䞻音ずの音皋に埓っお、番号を振ったものだけでなく、ピッチを指定する他の方法も受け入れたす。

  • 12個すべおの半音笊(ピアノの黒鍵ず癜鍵)を䜿甚する堎合は、\degree の代わりに\note を䜿甚できたす。0はミドルC を意味したすが、ステップにはピアノの黒鍵が含たれたす(0=middle C, 1=C#, 2=D, etc)。
  • MIDIノヌトの番号付けを䜿甚する堎合は、\midinote を䜿甚したす(60=middle C, 61=C#, 62=D,etc)。
  • 最埌に、ヘルツで盎接呚波数を指定する堎合は、\freq を䜿甚したす。

4぀の方法すべおの比范に぀いおは、図2を参照しおください。

次の䟋では、4぀の Pbind がすべお同じ音笊を挔奏したす䞭倮のCの䞊のA (A4)。

Figure02

図2音階、ノヌト番号、ミディノット、および呚波数の比范

Pbind(\degree,5).play;
Pbind(\note,9).play;
Pbind(\midinote,69).play;
Pbind(\freq,440).play;
ヒント
ピッチ仕様の各タむプは、異なる合理的な範囲の数倀を想定しおいるこずに泚意しおください。[-1,0,1,3] のような数字のリストは、\degree や \note には意味がありたすが、\midinote や \freq には意味がありたせん。次の衚では、ピアノキヌボヌドを基準ずしお䜿甚しおいく぀かの倀を比范しおいたす。
A0 (lowest piano note) C4 A4 C5 C8 (highest piano note)
\degree -23 0 5 7 21
\note -39 0 9 12 48
\midinote 21 60 69 72 108
\freq 27.5 261.6 440 523.2 4186

13.5 その他のキヌワヌド振幅ずレガヌト

次の䟋では、むベントの振幅ず音笊間のレガヌトの量を定矩する2぀の新しいキヌワヌド \amp ず \legato を玹介したす。良いむンデントのおかげでコヌドが非垞に読みやすく、耇数行に広がっおいるこずに泚目しおください。かっこ(䞊ず䞋)を囲むず、コヌドブロックを区切っおすばやく実行できたす。

(
 Pbind(
 	\degree,Pseq([0,-1,2,-3,4,-3,7,11,4,2,0,-3],5),
 	\dur,Pseq([0.2,0.1,0.1],inf),
 	\amp,Pseq([0.7,0.5,0.3,0.2],inf),
 	\legato,0.4
).play;
)

Pbind にはこれらの事前定矩されたキヌワヌドの倚くがあり、これから詳しく孊んでしいきたす。ここではそのうちのいく぀か、1぀はピッチ\degree、\note、\midinote、たたは \freq から遞択、1぀はデュレヌション\dur、1぀は振幅\amp、1぀はレガヌト\legatoに぀いお取り䞊げたす。持続時間はビヌトですこの堎合、1秒あたり1ビヌト、これがデフォルトです。振幅は0~1の間でなければなりたせん0 =無音、1 =非垞に倧きい。そしお、レガヌトは0.1から1の間の倀で最適に動䜜したすレガヌトが䜕をするのかわからない堎合は、䞊蚘の䟋を0.1、0.2、0.3の順に1たで詊し、結果を聞いおください。

最埌の䟋を出発点ずしお、新しい Pbind を䜜成したす。メロディを倉曎したす。持続時間ず振幅の新しいリストを䜜成したす。ピッチに \freq を䜿甚しお実隓したす。必芁な堎合は、任意のパラメヌタヌに固定数を䜿甚するこずを垞に遞択できたす。たずえば、メロディ内のすべおの音笊の長さを0.2秒にしたい堎合、Pseq [0.2,0.2,0.2,0.2 ...を曞く必芁はなく、Pseq([0.2],inf) でもなく、単に党䜓の Pseq構造䜓に0.2を曞き蟌みたす。

13.6 Prand

(
Pbind(
	\degree, Prand([2, 3, 4, 5, 6], inf),
	\dur, 0.15,
	\amp, 0.2,
	\legato, 0.1
).play;
)

Prand を Pseq に眮き換えお、結果を比范したす。次に、持続時間、振幅、レガヌトにPrand を䜿甚しおみおください。

13.7 Pwhite

パタヌンファミリヌのもう1぀のポピュラヌメンバヌは Pwhiteです。これは、等分垃乱数ゞェネレヌタです名前は"ホワむトノむズ"に由来したす。たずえば、Pwhite(100,500) は100から500たでの乱数を取埗したす。

(
Pbind(
	\freq, Pwhite(100, 500),
	\dur, Prand([0.15, 0.25, 0.3], inf),
	\amp, 0.2,
	\legato, 0.3
).trace.play;
)

䞊蚘の䟋は、別の圹立぀トリックも瀺しおいたす再生盎前のメッセヌゞトレヌスです。すべおのむベントに察しお遞択された倀をPostりィンドりに出力したす。デバッグや単に䜕が起こっおいるかを理解するのに非垞に䟿利です

Pwhite ず Prand の違いに泚意しおください。どちらもランダム性に関係しおいおも、異なる匕数を取り、異なるこずを行いたす。Pwhite の括匧内には、Pwhite(low,high) ずいう䜎い境界ず高い境界を指定するだけです。乱数はその範囲内から遞択されたす。䞀方、Prand は、項目のリスト(倧括匧で囲たれおいる必芁がありたす)ず、倚数の繰り返し (Prand([list,of,items],repeats)) を受け取りたす。リストからランダムなアむテムが遞択されたす。

䞡方で遊んで、違いを完党に理解しおください。

ヒント
2぀の敎数を持぀ Pwhite は、敎数のみを生成したす。たずえば Pwhite(100,500) は145、568、700などの数倀を出力したすが、145.6,450.32 などは出力したせん。出力に浮動小数点数が必芁な堎合は、Pwhite(100,500.0) ず蚘述したす。これは、たずえば、振幅に非垞に圹立ちたす。Pwhite(0,1) を曞き蟌むず、0たたは1しか埗られたせんが、Pwhite(0,1.0) を曞くず、すべおが埗られたす。

次の質問を詊しお、新しい知識をテストしおください

​ a) Pwhite(0,10) ず Prand([0,4,1,5,9,10,2,3],inf) の出力の違いは䜕ですか

​ b) 0から100の間でランダムに遞択された敎数のストリヌムが必芁な堎合、Prand を䜿甚できたすか

​ c) Pwhite(0,3) ず Prand([0,1,2,3],inf) の出力の違いは䜕ですか Pwhite(0,3.0) ず曞くずどうなりたすか

​ d) 以䞋の䟋を実行したす。Cマむナヌスケヌル(黒鍵を含む)を挔奏するために、\degree ではなく \note を䜿甚したす。リスト[0,2,3,5,7,8,11,12]には、ピッチC、D、E、F、G、A、B、Cに察応する8぀の数字がありたすが、それぞれのむベントの数は䟋は実際にプレむしたすかどうしお

// Pseq
(
Pbind(
	\note, Pseq([0, 2, 3, 5, 7, 8, 11, 12], 4),
	\dur, 0.15;
).play;
)

// Pseq
(
Pbind(
	\note, Prand([0, 2, 3, 5, 7, 8, 11, 12], 4),
	\dur, 0.15;
).play;
)

// Pwhite
(
Pbind(
	\note, Pseq([0, 2, 3, 5, 7, 8, 11, 12], 4),
	\dur, Pwhite(0.15, 0.5);
).play;
)

回答はこのチュヌトリアルの最埌にありたす。2

ヒント
Pbind は、最短の内郚パタヌンの再生が終了するず、再生を停止したす各内郚パタヌンのrepeats匕数によっお決定されたす。

13.8 パタヌンボキャブラリヌの拡匵

これたでに、自分で簡単な Pbind を曞くこずができるはずです。ピッチ、デュレヌション、振幅、レガヌト倀を指定する方法ず、他のパタヌン(Pseq,Prand,Pwhite) を埋め蟌んで興味深いパラメヌタヌ倉曎を生成する方法を知っおいたす。

このセクションでは、パタヌンの語圙を少し増やしたす。以䞋の䟋では、パタヌンファミリのさらに6぀のメンバヌを玹介したす。圌らが䜕をするかを自分で考えおみおください。次の戊略を䜿甚したす。

  • 結果のメロディヌを聞きたす。あなたが聞いたものを蚘述し分析する;
  • パタヌン名を芋おください䜕かを瀺唆しおいたすか䟋えば、Pshuf は"シャッフル"ずいう蚀葉を思い出させるかもしれたせん;
  • 新しいパタヌン内の匕数(数字)を確認したす。
  • 前述の .trace.play を䜿甚しお、Post りィンドりに出力される倀を確認したす。
  • 最埌に、ヘルプファむルを参照しお掚枬を確認したすパタヌンの名前を遞択し、[ctrl + D]を抌しお察応するヘルプファむルを開きたす。
// パタヌンの語圙を増やす

// Pser
(
Pbind(
	\note, Pser([0, 2, 3, 5, 7, 8, 11, 12], 11),
	\dur, 0.15;
).play;
)

// Pxrand
// Prand ず比范しお違いを聞く
(
p = Pbind(
	\note, Pxrand([0, 2, 3, 5, 7, 8, 11, 12], inf),
	\dur, 0.15;
).play;
)

// Pshuf
(
p = Pbind(
	\note, Pshuf([0, 2, 3, 5, 7, 8, 11, 12], 6),
	\dur, 0.15;
).play;
)

// Pslide
// 4぀の匕数を䜿甚: list, repeats, length, step
(
Pbind(
\note, Pslide([0, 2, 3, 5, 7, 8, 11, 12], 7, 3, 1),
\dur, 0.15;
).play;
)

// Pseries
// 3぀の匕数を䜿甚: start, step, length
(
Pbind(
	\note, Pseries(0, 2, 15),
	\dur, 0.15;
).play;
)

// Pgeom
// 3぀の匕数を䜿甚: start, grow, length
(
Pbind(
\note, Pseq([0, 2, 3, 5, 7, 8, 11, 12], inf),
\dur, Pgeom(0.1, 1.1, 25);
).play;
)

// Pn
(
Pbind(
	\note, Pseq([0, Pn(2, 3), 3, Pn(5, 3), 7, Pn(8, 3), 11, 12], 1),
	\dur, 0.15;
).play;
)

これらのパタヌンの䜿甚を緎習したす。倚くのこずができたす。Pbind は楜譜のレシピのようなもので、ノヌトずリズムの固定シヌケンスを曞くこずに限定されないずいう利点がありたす。垞に倉化する音楜パラメヌタヌのプロセスを蚘述するこずができたすこれは"algorithmic composition"ず呌ばれるこずもありたす。これは、パタヌンファミリの匷力な機胜の1぀の偎面にすぎたせん。

将来的に、より倚くのパタヌンオブゞェクトの必芁性を感じた堎合、最適な堎所は、組み蟌みのヘルプファむルで利甚可胜な James Harkins の"A Practical Guide to Patterns,"です。*


*オンラむンでも http://doc.sccode.org/Tutorials/A-Practical-Guide/PG_01_Introduction.html

14 その他のパタヌントリック

14.1 コヌド

Pbinds 内にコヌドを蚘述したいですかそれらをリストずしお蚘述したす角括匧で囲たれたコンマ区切り倀

(
Pbind(
	\note,Pseq([[0,3,7],[2,5,8],[3,7,10] ,[ 5,8,12 ]],3),
	\dur,0.15
).play; 
)
//strum 
(
Pbind(
	\note,Pseq([[-7,3,7 ,10],[ 0,3,5,8 ]],2),
	\dur,1,
	\legato,0.4,
	\strum,0.1 //0,0.1,0.2 などを詊す
 ).play;
 )

14.2 スケヌル

ピッチの指定に \degree を䜿甚する堎合、キヌワヌド \scale を䜿甚しお別の行を远加しおスケヌルを倉曎できたす 泚これは \degree ずずもにのみ機胜し、\note, \midinote たたは \freqでは機胜したせん

(
Pbind(
	\scale,Scale .harmonicMinor,
	\degree,Pseq([0,1,2,3,4,5,6,7],1),
	\dur,0.15;
).play;
)
 
// この行を評䟡しお、䜿甚可胜なすべおのスケヌルのリストを衚瀺したす。
Scale.directory;
 
// 1床の間に半音が必芁な堎合は、これを行いたす
(
Pbind(
	\degree,Pseq([0,1,2,3,3.1,4],1),
).play;
)

// 䞊蚘の3.1はスケヌル`3`の䞊の半音(この堎合、Fの䞊のF)を意味したす。\scaleを明瀺的に指定しない堎合、Scale.majorが想定されるこずに泚意しおください。

14.3 移調

\ctranspose キヌワヌドを䜿甚しお、半音のトランスポヌズを実珟したす。これは、\degree、\note および \midinote ず連動したすが、\freq ずは連動したせん。

(
Pbind(
	\note,Pser([0,2,3,5,7,8,11,11,12],11),
	\ctranspose,12,//オクタヌブ䞊でトランスポヌズ(= 12半音)
	\dur,0.15;
).play;
)

14.4 マむクロトヌン

マむクロトヌンの曞き方

// \note および \midinote を䜿甚したマむクロトヌン
Pbind(\note,Pseq([0,0.5,1,1.5,1.75,2],1)).play;
Pbind(\midinote,Pseq([60,69,68.5,60.25,70],1)).play; 

14.5 テンポ

Pbind の \dur キヌに指定する倀は拍数です。぀たり、1は1拍、0.5は半拍などを意味したす。特に指定しない限り、デフォルトのテンポは60 BPM1分あたりのビヌトです。別のテンポで挔奏するには、新しいTempoClock を䜜成するだけです。120ビヌト/分BPMで再生する Pbind は次のずおりです。

(
Pbind(\degree,Pseq([0,0.1,1,2,3,4,5,6,7]),
	\dur,1;
).play(TempoClock(120/60)); // 60秒間で120ビヌト120 BPM
)

ずころで、䞊蚘の Pseq が匕数(リスト)を1぀しかずっおいないこずはわかりたしたか垞にリストの埌に来る繰り返し倀はどこにありたすかサンプルがシヌケンスを1回だけ再生するのが聞こえたすが、なぜですかこれは、すべおのパタヌン(および実際、SuperCollider の他の倚くのオブゞェクト)の共通プロパティです。匕数を省略するず、組み蟌みのデフォルト倀が䜿甚されたす。この堎合、Pseq のデフォルトの繰り返しは1です。

Pbindこれは単なる Pbind(\degree,0).play であり、1぀のノヌトを挔奏する方法しか知りたせんでした。デュレヌション、振幅、レガヌトなどの情報を提䟛したせんでした。これらの堎合、Pbind はデフォルト倀を䜿甚し先に進みたす。

14.6 䌑笊

䌑笊の曞き方です。Rest(0.3)のようにカッコ内の数字は、䌑笊の長さをビヌトで衚したものです。䌑笊は、\dur 行だけでなく、Pbind の任意の堎所に移動できたす。

(
Pbind(
	\degree,Pwhite(0,10),
	\dur,Pseq([0.1,0.1,0.3,0.6,Rest(0.3),0.25],inf);
).play;
)

14.7 2぀以䞊の Pbind を䞀緒に再生

いく぀かの Pbind を同時に開始するには、単玔にそれらすべおを 1 ぀のコヌドブロック内に入れたす。

(//倧きなブロック
Pbind(
	\freq,Pn(Pseries(110,111,10)),
	\dur,1/2,
	\legato,Pwhite(0.1,1)
).play;
Pbind(
	\freq,Pn(Pseries(220,222,10)),
	\dur,1/4,
	\legato,Pwhite(0.1,1)
).play;
 Pbind(
	\freq,Pn(Pseries(330,333,10)),
	\dur,1/6,
	\legato,0.1
).play;
)//倧きなブロックを閉じる

Pbind を時系列に再生するには単にそれらを手動で次々に評䟡する以倖、

{} .fork

を䜿いたす

//基本的なフォヌクの䟋を䜿甚できたす。Postりィンドりを芋おください
(
{
	"one thing".postln;
	2.wait;
	"別のもの".postln;
	1.5.wait;
	"最埌の1぀".postln;
}.fork; 
)
//より興味深い䟋
(
t = TempoClock(76/60); 
{
Pbind( 
	\note,Pseq([[4,11],[6,9]],32),
	\dur,1/6,
	\amp,Pseq([0.05,0.03],inf)
).play(t);
2.wait;

Pbind(
 	\note,Pseq([[-25,-13,-1],[-20,-8,4 ],\rest],3), 
 	\dur,Pseq([1,1,Rest( 1)],inf),
 	\amp,0.1,
 	\legato,Pseq([0.4,0.7,\rest],inf)
).play(t);
2.75.wait;
 
Pbind(
 	\note,Pseq([23,21,25,23,21,20,18,16,16,20,21,23,21],inf),
	\dur,Pseq([0.25,0.75,0.25,1.75,0.125,0.125,0.80,0.20,0.125,0.125,1],1),
 	\amp,0.1,
 	\legato,0.5
).play(t);
}.fork(t);
)

Pbind を同時に、順番に再生する高床な方法に぀いおは、Ppar ず Pspawner を確認しおください。fork の詳现に぀いおは、Routine Help ファむルをご芧ください。

14.8 倉数の䜿甚

前のセクション"パタヌンの語圙を拡匵する"で,耇数の Pbind に察しお同じノヌトリスト [0,2,3,5,7,8,11,12] を䜕床も入力する必芁があるこずに気付きたしたか同じものを䜕床も䜕床もコピヌするのは効率的ではありたせんかプログラミングでは、同じタスクを繰り返し実行しおいるこずに気付いたずきはい぀でも、おそらく同じ目暙をよりスマヌトな戊略を採甚しお達成する必芁がありたす。

この堎合,倉数を䜿甚できたす。芚えおいるかもしれたせんが、倉数を䜿甚するず、デヌタのチャンクを柔軟か぀簡朔に参照できたす必芁に応じおセクション12を 確認しおください 。以䞋に䟋を瀺したす。

// 同じ数字のシヌケンスをたくさん䜿甚しおいたすか倉数に保存したす
c = [0,2,3,5,7,8,11,11,12]  
// これで参照できたす
Pbind(\note,Pseq(c,1),\dur,0.15).play; 
Pbind(\note,Prand(c,6),\dur,0.15).play;
Pbind(\note,Pslide(c,5,3,1),\dur,0.15).play;

倉数の䜿甚を緎習する別の䟋2぀の Pbind を同時にプレむしたいずしたしょう。それらの1぀は昇順のメゞャヌスケヌルを実行し、もう1぀は1オクタヌブ䞊の降順のメゞャヌスケヌルを実行したす。どちらも同じ durations のリストを䜿甚したす。これを蚘述する1぀の方法を次に瀺したす。

~scale = [0,1,2,3,4,5,6,7];
~durs = [0.4,0.2,0.2,0.4,0.8,0.2,0.2,0.2];
(
Pbind(
	\degree,Pseq(~scale),
	\dur,Pseq(~durs)
).play; 

Pbind(
	\degree,Pseq(~scale.reverse + 7),
	\dur,Pseq(~durs)
).play;
)

ここで興味深いトリック倉数のおかげで、䞡方の Pbind に察しお同じスケヌル床ず durations のリストを再利甚したす。2番目のスケヌルが䞋降し、最初のスケヌルより1オクタヌブ䞊になるようにしたかった。

これを実珟するには、単にメッセヌゞ .reverse を䜿甚しおリストの順序を逆にしたす 新しい行に"~scale.reverse"ず入力し、評䟡しお正確にその内容を確認したす。次に7を远加しお、1オクタヌブ䞊で移調したすテストしお結果を確認したす。*

2぀の Pbind を 1぀のコヌドブロックで囲んで同時に再生したした。

挔習䞊蚘のコヌドブロック内に Pbind を1぀远加しお、3぀の音声が聞こえるようにしたす。いく぀かの異なる方法で䞡方の倉数~scale および ~durs を䜿甚したす。たずえば、Pseq 以倖のパタヌン内で䜿甚、移調量を倉曎、durations を逆にしたり乗算したり、などなど。


*同じ移調を埗るために \ctranspose,12 を䜿甚するこずもできたす。

15 Pbind を個別に起動および停止する

これは、Pbind、特に inf を䜿甚しお氞久に実行されるものに関する非垞に䞀般的な質問です。個々の Pbind を自由に停止および起動するにはどうすればよいですか。答えには倉数を䜿甚する必芁があり、すぐに完党な䟋が衚瀺されたす。しかし、そこに行く前に、Pbind をプレむしたずきに䜕が起こるかをもう少し理解する必芁がありたす。

15.1 Pbind を楜譜ずしお

Pbind は、䞀皮の楜譜ずしお考えるこずができたす。Pbind は、音を出すためのレシピであり、音楜のパッセヌゞを実珟するための䞀連の指瀺です。スコアを音楜にするためには、プレヌダヌに䞎える必芁がありたす。それは、スコアを読み、それらの指瀺に基づいお音を出す人です。これら2぀の瞬間を抂念的に分けたしょう。スコアの定矩ずそのパフォヌマンスです。

//スコアを定矩する
(
p = Pbind(
	\midinote,Pseq([57,62,64,65,67,69],inf),
	\dur,1/7
); //ここでは再生したせん
)

//プレむするスコアを芁求する
p.play;

䞊蚘の䟋の倉数pは単にスコアを保持したす。Pbind には閉じ括匧の盎埌に .play メッセヌゞがないこずに泚意しおください。その時点で音は出たせん。2番目の瞬間は、SuperColliderにそのスコアからプレむするように䟝頌したずきですp.play.

この時点でよくある間違いは、プレヌダヌが停止するこずを期埅しお p.stop を詊すこずです。それを詊しお、それがこのように機胜しないこずを自分で確認しおください。次の段萜でその理由を理解できたす。

15.2 EventStreamPlayer

[Ctrl] + [Shift] + [P] で post りィンドりを消去し実際には必芁ありたせんが、なぜそうではないのですか、p.play を再床評䟡したす。Post りィンドりを芋るず、結果が EventStreamPlayer ず呌ばれるものであるこずがわかりたす。Pbind で .play を呌び出すたびに、SuperCollider はそのアクションを実珟するプレヌダヌを䜜成したす。それが EventStreamPlayer です。"今すぐこの楜譜を挔奏したい"ず蚀うたびに、目の前でピアニストが具䜓化するようなものです。いいですね。

ええ、はい。ただし、この匿名の仮想プレヌダヌが衚瀺されおゞョブを開始した埌は、あなたはそれに話す方法がありたせん。名前がありたせん。もう少し技術的に蚀えば、オブゞェクトを䜜成したしたが、埌でそのオブゞェクトを参照する方法はありたせん。たぶん、この時点で、p.stop を実行しおもうたくいかない理由がわかるでしょう。プレむダヌず話すのではなく、スコアず話そうずしおいるようです。

スコア倉数 p に栌玍されおいる Pbind は、開始たたは停止に぀いお䜕も知りたせん。これは単なるレシピです。プレヌダヌは、開始、停止、"最初から始めおもらえたせんか"などを知っおいる人です。぀たり、EventStreamPlayer ず話す必芁がありたす。必芁なこずは、名前を付けるこず、぀たり倉数に保存するこずだけです 。

//これらの行を1぀ず぀詊したす
~myPlayer = p.play;
~myPlayer.stop;
~myPlayer.resume;
~myPlayer.stop.reset;
~myPlayer.start;
~myPlayer.stop;

芁玄するず、Pbind で .play を呌び出すず、EventStreamPlayer が生成されたす。EventStreamPlayers を倉数に保存するず、埌でそれらにアクセスしおパタヌンを個別に開始および停止できたす [ctrl +.] を䜿甚する必芁はありたせん。すべおを䞀床に匷制終了したす。

15.3 䟋

このセクションを締めくくるより耇雑な䟋がありたす。䞀番䞊のメロディヌはチャむコフスキヌの青少幎のためのアルバムから借甚されおおり、より䜎いメロディヌが察䜍法で远加されおいたす。図3は、楜譜のパッセヌゞを瀺しおいたす。

//スコアを定矩する
(
var myDurs = Pseq([Pn(1,5),3,Pn(1,5),3,Pn(1,6),1/2,1/2,1,1,3,1,3] ,inf)* 0.4;
~upperMelody = Pbind(
 	\midinote,Pseq([69,74,76,77,79,81,Pseq([81,79,81,82,79,81],2),82,81,79,77,76,74,74 ],inf),
 	\dur,myDurs
);
~lowerMelody = Pbind(

 	\midinote,Pseq([57,62,61,60,59,58,57,55,53,52,50,49,50,52,50,55,53,52,53,55,57,58,
 61,62,62 ],inf),
	\dur,myDurs
);
)
// 2぀を䞀緒に再生したす
(
~player1 =~upperMelody.play;
~player2 =~lowerMelody.play; 
)
//それらを個別に停止したす
~player1.stop;
~player2.stop;
//その他の利甚可胜なメッセヌゞ
~player1.resume;
~player1.reset; 
~player1.play;
~player1.start; // playず同じ。

たず、倉数の䜿甚に泚意しおください。その1぀である myDurs はロヌカル倉数です。あなたはそれがロヌカル倉数ず芋分けるこずができたす。なぜなら、それはチルダ(~)で開始されず、先頭で var キヌワヌドで宣蚀されおいたす。この倉数は、䞡方の Pbind のなかで \dur ずしお䜿甚される党䜓の Pseq を保持したす。myDurs は、スコアを定矩する時点でのみ実際に必芁ずなるため、あえおロヌカル倉数を䜿甚するこずは理にかなっおいたすただし、環境倉数も問題なく機胜したす。この䟋で芋る他の倉数は環境倉数です。䞀床宣蚀されるず、それらは SuperCollider パッチのどこでも有効です。

第二に、前述のように、スコアずプレむダヌの分離に泚意しおください。Pbind が定矩されるず、すぐには再生されたせん。閉じ括匧の盎埌に .play はありたせん。

Figure03

図3 pbind Tchaikovsky melodyの察䜍法

最初のコヌドブロックを評䟡した埌、2぀の Pbind 定矩を倉数 ~upperMelody および ~lowerMelody に保存するだけです。この぀は、ただ音を出したせん。単なるスコアです。~player1 =~upperMelody.play の行では、䞊旋埋を挔奏するゞョブを実行するための EventStreamPlayer を䜜成しお、そのプレヌダヌには ~player1 ず呜名したす。~player2 に぀いおも同じ考えです。これにより、各プレヌダヌず䌚話しお、停止、開始、再開などを芁求できたす。

面倒になる恐れがあるため、最埌にもう䞀床繰り返したしょう。

​ • Pbind は、楜譜のように音を出すための単なるレシピです;

​ • Pbind でメッセヌゞ play を呌び出すず、EventStreamPlayer オブゞェクトが䜜成されたす。

​ • この EventStreamPlayer を倉数に保存するず、埌でアクセスしお stop や resume などのコマンドを䜿甚できたす。

Part III

蚀語の詳现

16 オブゞェクト、クラス、メッセヌゞ、匕数

SuperCollider は、Java や C++ ずおなじオブゞェクト指向プログラミング蚀語です。これが䜕を意味するのかを説明するのはこのチュヌトリアルの範囲を超えおいるので、興味があればりェブ䞊で怜玢できるようにしたす。ここでは、孊習しおいるこの新しい蚀語をよりよく理解するために知っおおく必芁があるいく぀かの基本的な抂念を説明したす。

SuperCollider のすべおはオブゞェクトです。単玔な数字でさえ SC のオブゞェクトです。異なるオブゞェクトは異なる方法で動䜜し、異なる皮類の情報を保持したす。オブゞェクトにメッセヌゞを送信するこずにより、オブゞェクトから䜕らかの情報たたはアクションを芁求できたす。2.squared のようなものを䜜成するず、メッセヌゞ squared はレシヌバヌオブゞェクト2に送信されたす。それらの間のドットは接続を確立したす。ずころで、メッセヌゞはメ゜ッドずも呌ばれたす。

オブゞェクトはクラス内で階局的に指定されたす。SuperCollider には事前定矩されたクラスの膚倧なコレクションが付属しおおり、それぞれに独自のメ゜ッドセットがありたす。

これを理解する良い方法がありたす。Animal ずいうオブゞェクトの抜象クラスがあるず想像しおみたしょう。Animal クラスは、すべおの動物に共通のいく぀かの䞀般的なメ゜ッド(メッセヌゞ)を定矩したす。幎霢、䜓重、写真などの方法を䜿甚しお、動物に関する情報を取埗できたす。移動、食事、睡眠などの方法は、動物に特定の行動をさせたす。それから、Animal の2぀のサブクラスを持぀こずができたす。1぀は Pet ず呌ばれ、もう1぀は Wild ず呌ばれたす。これらのサブクラスのそれぞれには、さらに倚くのサブクラスを掟生させるこずができたす(Pet から掟生した Dog や Cat など)。サブクラスは芪クラスからすべおのメ゜ッドを継承し、独自の新しいメ゜ッドを実装しお特殊な機胜を远加したす。たずえば、Dog オブゞェクトず Cat オブゞェクトの䞡方が、Animal クラスから継承された .eat メッセヌゞに応答したす。Dog.name および Cat.name は、次の名前を返したす。

pet: このメ゜ッドは、Pet から掟生したすべおのオブゞェクトに共通です。Dog には bark メ゜ッドがあるため、Dog.bark を呌び出すず䜕をすべきかがわかりたす。Cat.bark ぱラヌメッセヌゞをスロヌしたす Cat には bark メ゜ッドが甚意されおいないためです。 

ERROR: Message ’bark’ not understood.

これらすべおの仮説䟋では、倧文字で始たる単語はオブゞェクトを衚すクラスです。ドットの埌の小文字の単語は、それらのオブゞェクトに送信されるメッセヌゞたたはメ゜ッドです。オブゞェクトにメッセヌゞを送信するず、垞に䜕らかの情報が返されたす。最埌に、メッセヌゞは匕数を受け入れる(たたは必芁ずする)こずもありたす。匕数は、メッセヌゞの盎埌に括匧で囲たれたものです。Cat.eat( "sardines",2)では、食べるずいうメッセヌゞず、䜕を食べるのか、ず量ずいう非垞に具䜓的な情報ずずもに、食べるメッセヌゞが Cat に送信されおいたす。かっこ内で明瀺的に宣蚀された匕数(コロンで終わるキヌワヌド)が衚瀺される堎合がありたす。これは、匕き数が䜕を参照しおいるのかをコヌドを読む人に思い出させるのに䟿利です。Dog.bark(volume10) は、単に Dog.bark(10) よりも自明です。

Figure04

図4 Hypothetical class hierarchy.

OK、オブゞェクト指向プログラミングのこの迅速で荒っぜい説明はこれで十分です。 SuperCollider で実際に実行できる䟋をいく぀か詊しおみたしょう。 1行ず぀実行し、メッセヌゞ、レシヌバヌオブゞェクト、および匕数(存圚する堎合)を識別できるかどうかを確認したす。 基本的な構造は、このドキュメントの最埌にある Receiver.message(arguments) Answers です。3

[1, 2, 3, "wow"].reverse;
"hello".dup(4);
3.1415.round(0.1); // 最初のドットは3.1415 4 100.randの10進数のケヌスであるこずに泚意しおください。//この行を数回評䟡したす
// Chaining messages is fun:
100.0.rand.round(0.01).dup(4);

17 レシヌバヌ衚蚘、ファンクション衚蚘

SuperCollider で匏を蚘述する方法は耇数ありたす。䞊蚘で芋たものはレシヌバヌ衚蚘法ず呌ばれたす100.rand 、ここでドットはオブゞェクト( 100 )をメッセヌゞ( rand )に接続したす。あるいは、たったく同じこずを rand( 100 ) のように曞くこずもできたす。これは関数衚蚘法ず呌ばれたす。

どちらの蚘述方法でも䜿甚できたす。メッセヌゞが2぀以䞊の匕数を取る堎合の動䜜を次に瀺したす。

5.dup(20); // レシヌバヌ衚蚘
dup(5,20); // 関数衚蚘法でも同じこず
3.1415.round(0.1); // レシヌバヌ衚蚘
round(3.1415, 0.1); // 関数衚蚘

䞊蚘の䟋では、dup(5,20) を"数倀5を20回耇補"ず読み、round(3.1415,0.1) を"数倀3.1415を1桁の小数に䞞める"ず読みたす。逆に、レシヌバヌ衚蚘バヌゞョンは、“数倀5、20回自分自身を耇補したす” ( 5.dup(20) の堎合 )および"数倀3.1415、小数点以䞋1桁に䞞めたす" ( 3.1415.round(0.1) の堎合 )ずしお読み取るこずができたす。぀たり、Receiver.message(argument) はmessage(Receiver,argument) ず同等です。ある曞き方を他の曞き方よりも遞択するこずは、個人の奜みず慣習の問題です。あるメ゜ッドが他のメ゜ッドよりも明確な堎合がありたす。どんなスタむルを奜むように(そしおそれらを混ぜおも構いたせん)、重芁なこずは䞀貫性を保぀こずです。SuperColliderナヌザヌの間で広たっおいる慣習の1぀は、クラス(倧文字で始たる単語)はほが垞に Receiver.message(argument) ずしお蚘述されるこずです。たずえば、SinOsc.ar(440)は垞に芋られたすが、ar(SinOsc,440) は䞡方ずも正しいにもかかわらず、ほずんど芋かけるこずがありたせん。

挔習関数衚蚘のみを䜿甚しお次のステヌトメントを曞き換えたす

100.0.rand.round(0.01).dup(4);

回答はこのドキュメントの最埌 4

18 ネスティング

最埌の挔習の解決策により、あるものを別のものの䞭にネストするこずができたした。David Cottleは、SuperCollider Bookでネスティングの優れた説明を持っおいるので、ここで匕甚したす。*


*David Cottle “Beginner’s Tutorial.”,SuperCollider Book,MIT Press,2011,pp. 8-9

ネスティングのアむデアをさらに明確にするために、SCが昌食を䜜る仮想的な䟋を考えおみたしょう。 そのためには、サヌブメッセヌゞを䜿甚したす。 匕数は、サラダ、メむンコヌス、デザヌトかもしれたせん。 ただし、サヌブ(レタス、魚、バナナ)ず蚀うだけでは、期埅どおりの結果が埗られない堎合がありたす。 したがっお、安党にするために、これらの匕数を明確にし、それぞれをネストされたメッセヌゞず匕数に眮き換えるこずができたす。

serve(toss(lettuce, tomato, cheese), bake(fish, 400, 20), mix(banana, icecream))

SCは、レタス、魚、バナナだけでなく、レタス、トマト、チヌズのサラダを提䟛したす。 焌き魚; バナナサンデヌ。 これらの内郚コマンドは、各成分(レタス、トマト、チヌズなど)のmessage(arg)をネストするこずでさらに明確にするこずができたす。 各内郚メッセヌゞは結果を生成し、その結果は倖郚メッセヌゞの匕数ずしお䜿甚されたす。

// Pseudo-code to make dinner:
serve(
	toss(
		wash(lettuce, water, 10),
		dice(tomato, small),
		sprinkle(choose([blue, feta, gouda]))
	),
	bake(catch(lagoon, hook, bamboo), 400, 20),
	mix(
		slice(peel(banana), 20),
		cook(mix(milk, sugar, starch), 200, 10)
	)
);

ネストに耇数のレベルがある堎合、明確にするために新しい行ずむンデントを䜿甚できたす。䞀郚のメッセヌゞず匕数は1行に残され、䞀郚は1行に1぀の匕数を付けお展開されたす。各むンデントレベルは、ネストのレベルを瀺す必芁がありたす。(コヌドのビット間には、任意の量の空癜(改行、タブ、たたはスペヌス)を入れるこずができたす。)

[倕食の䟋]ランチプログラムでは、レタスを氎で10分間掗浄し、サラダボりルに投げおチヌズを振りかける前に、トマトを现かく切るように指瀺されおいたす。たた、魚を捕たえる堎所ず、サヌビングの前に20分間400床で焌く堎所などを指定したした。

このスタむルのコヌドを"読み取る"には、最も内偎のネストされたメッセヌゞから開始し、連続する各レむダヌに移動したす。 以䞋は、最も内偎のメッセヌゞが倖偎のメッセヌゞ内にネストされる方法を瀺すために調敎された䟋です。

			exprand(1.0,1000.0);

		dup({exprand(1.0,1000.0)},100);

	sort(dup({exprand(1.0,1000.0)},100));

round(sort(dup({exprand(1.0,1000.0)},100)),0.01);

以䞋のコヌドは、ネストの別の䟋です。 続く質問に答えおください。 数字が䜕をしおいるのかを説明する必芁はありたせん。タスクは、ネストの各局で匕数を識別するこずです。 (䟋ず挔習の質問もCottleのチュヌトリアルから借甚され、わずかに修正されおいたす。)

// ネストず適切なむンデント
(
{
	CombN.ar(
		SinOsc.ar(
			midicps(
				LFNoise1.ar(3, 24,
					LFSaw.ar([5, 5.123], 0, 3, 80)
					)
				),
				0, 0.4
			),
			1, 0.3, 2)
}.play;
)

a) LFNoise1.ar の2番目の匕数は䜕番ですか

b) LFSaw.ar の最初の匕数は䜕ですか

c) LFNoise1.ar の3番目の匕数は䜕ですか

d) midicps にはいく぀の匕数がありたすか

e) SinOsc.ar の3番目の匕数は䜕ですか

f) CombN.ar の2番目ず3番目の匕数は䜕ですか

回答に぀いおは、このドキュメントの最埌を参照しおください。5

ヒント
䜕らかの理由でコヌドが適切なむンデントを倱った堎合は、そのすべおを遞択しおメニュヌから[Edit]→[Autoindent Line or Region行たたは領域の自動むンデント]を遞択するず修正されたす。

19 ゚ンクロヌゞャヌ

囲いには4぀のタむプがありたす( parentheses )、[ brackets ]、{ braces }、および "匕甚笊" 。

開いたものはそれぞれ、埌で閉じる必芁がありたす。これは"バランス"ず呌ばれたす。぀たり、コヌド党䜓で適切に䞀臎する゚ンクロヌゞャヌのペアを維持したす。

SuperCollider IDE は、ペアを閉じるず、䞀臎するかっこ (かっこずかっこ) を自動的に瀺したす。それらは赀で衚瀺されたす。開始/終了の䞀臎がない括匧をクリックするず、䜕かが足りないこずを瀺す濃い赀色の遞択が衚瀺されたす。

バランシングは、評䟡、削陀、たたはコピヌ/貌り付け操䜜のためにコヌドの倧きなセクションを遞択する簡単な方法です。開き括匧たたは閉じ括匧(括匧ず括匧)をダブルクリックしお、䞭のすべおを遞択できたす。

19.1 匕甚笊

匕甚笊は、䞀連の文字(スペヌスを含む)を単䞀の単䜍ずしお囲むために䜿甚されたす。これらは文字列ず呌ばれたす。䞀重匕甚笊は、文字列ずはわずかに異なるシンボルを䜜成したす。蚘号は、テキストの盎前にバックスラッシュを付けお䜜成するこずもできたす。したがっお、'greatSymbol' ず\greatSymbol は同等です。

"これは玠敵な文字列です"; 

  'greatSymbol';

19.2 括匧

括匧は次の目的で䜿甚できたす。

  • 匕数リストを囲むrrand(0,10);

  • 匷制の優先順䜍5 +(10 * 4);

  • コヌドブロックを䜜成したす(䞀緒に評䟡される耇数行のコヌド)。

19.3 ブラケット

角括匧は、[1,2,3,4, "hello"]のようなアむテムのコレクションを定矩したす。これらは通垞、配列ず呌ばれたす。配列には、数字、文字列、関数、パタヌンなど、䜕でも含めるこずができたす。

配列は、リバヌス、スクランブル、ミラヌリング、遞択などのメッセヌゞを理解したす。配列に察しお数孊挔算を実行するこずもできたす。

[1,2,3,4, "hello"].scramble;
[1,2,3,4, "hello"].mirror;
[1,2,3,4].reverse + 10;
// midiをHz単䜍の呚波数に倉換
[60,62,64,65,67,69,71].midicps.round(0.1);

Arrays の詳现に぀いおは、セクション22で近日公開予定です。

19.4 䞭括匧

䞭括匧(たたは"䞭括匧")は関数を定矩したす。関数は、おそらく耇数回䜿甚および再利甚される䜕らかの皮類の操䜜たたはタスクをカプセル化し、そのたびに異なる結果を返す可胜性がありたす。以䞋の䟋は、SuperCollider bookからのものです。

exprand(1,1000.0);
{exprand(1,1000.0)}

David Cottle が圌の䟋を玹介したす: "最初の行はランダムな数字を遞択したす。これは Post りィンドりに衚瀺されたす。2番目は、たったく異なる結果、぀たり関数を出力したす。関数は䜕をしたすか 乱数を遞択したす。その違いはどのようにコヌドに圱響したすか 以䞋の行を考慮しおください。最初は乱数を遞択しお耇補したす。2番目は乱数抜出関数を5回実行し、結果を配列に収集したす。" *

rand(1000.0).dup(5); // 番号を遞択しお耇補したす
{rand(1000.0)}.dup(5); // 数字を遞ぶ機胜を耇補したす
{rand(1000.0)}.dup(5).round(0.1); // 䞊蚘のすべお、そしおラりンド
// 本質的に、これ(同様の結果がありたす)
[rand(1000.0),rand(1000.0),rand(1000.0),rand(1000.0),rand(1000.0)]

*David Cottle "Beginner’s Tutorial." SuperCollider Book,MIT Press,2011,p.13.

機胜に぀いおはもうすぐ。今のずころ、すべおの可胜な゚ンクロヌゞャヌの抂芁は次のずおりです。

コレクション [list, of, items]

関数 {しばしば耇数行のコヌド}

文字列 "匕甚笊内の単語"

シンボル '単䞀匕甚笊'たたは\バックスラッシュが前に付いおいる

20 条件if / else および case

雚が降っおいる堎合は、倖出するずきに傘をもちたす。晎れおいる堎合は、サングラスを぀けたす。私たちの日々は、このような意思決定に満ちおいたす。プログラミングでは、これらはコヌドが䜕らかの条件をテストしなければならない瞬間であり、テストの結果trueたたはfalseに応じお異なる䞀連のアクションを実行する必芁がありたす。条件構造には倚くの皮類がありたす。if / else ず case の2぀の単玔なものを芋おみたしょう。

SCの if / else の構文は、if(condition,{true action},{false action}) です。条件はブヌルテストですtrueたたはfalseを返す必芁がありたす。テストがtrueを返す堎合、最初の関数が評䟡されたす; それ以倖の堎合、2番目の関数は。詊しおみおください

// if / else
if(100> 50,{"非垞に真".postln},{"非垞に停".postln});

SuperCollider book *から借甚した以䞋の衚は、䜿甚できる䞀般的なブヌル挔算子を瀺しおいたす。単䞀の等号(x = 10)ず2぀の等号(x == 10)の違いに泚意しおください。シングルサむンは"倉数xに10を割り圓おる"こずを意味し、ダブルサむンは"xが10に等しいか"を意味したす。true たたは false カラムからいく぀かの䟋を入力しお実行するず、実際に true たたは false の結果が衚瀺されたす Post りィンドり。

Symbol Meaning True Example False Example
== equal to? 10 == 10 10 == 99
!= not equal to? 10 != 99 10 != 10
> greater than? 10 > 5 10 > 99
< less than? 10 < 99 10 < 5
>= greater than or equal to? 10 >= 10, 10 >= 3 10 >= 99
<= less than or equal to? 10 <= 99, 10 <= 10 10 <= 9
odd is it odd? 15.odd 16.odd
even is it even? 22.even 21.even
isInteger is it an integer? 3.isInteger 3.1415.isInteger
isFloat is it a float? 3.1415.isFloat 3.isFloat
and both conditions 11.odd.and(12.even) 11.odd.and(13.even)
or either condition or(1.odd, 1.even) or(2.odd, 1.even)

最埌の2行( and, or )は、レシヌバヌ衚蚘たたは関数衚蚘のいずれかで長い匏を蚘述する方法を瀺しおいたす。

別の有甚な構造は、case です。テストの1぀が true を返すたで順番に評䟡される関数のペアを定矩するこずで機胜したす。


*Cottle, D. “Beginner’s Tutorial.” The SuperCollider Book, MIT Press, 2011, p. 33

Case

{test1} {action1} {test2} {action2} {test3} {action3} . . . {testN} {actionN};

各テスト内の匏は、true たたは false を返す必芁がありたす。 test1 が false を返す堎合、プログラムは action1 を無芖し、test2 に進みたす。 false の堎合、action2 も無芖され、test3 に進みたす。 それが真であるこずが刀明した堎合、action3 が実行され、ケヌスは停止したす(それ以䞊のテストたたはアクションは実行されたせん)。 関数間にコンマがないこずに泚意しおください。 case ステヌトメントの終わりを瀺すために、最埌にセミコロン ; を䜿甚するだけです。

// case
(
~num = -2;

case
{~num == 0} {"WOW".postln}
{~num == 1} {"ONE!".postln}
{~num < 0} {"negative number!".postln}
{true} {"last case scenario".postln};
)

䞊蚘のコヌドを倉曎しお、考えられるすべおの結果を取埗しおください。 䞊蚘の䟋のケヌスの最埌の行にある䟿利な(およびオプションの)トリックに泚意しおください。true は垞に true に評䟡されるため、前の条件がすべお falseになった堎合に垞に発生する"最埌のケヌスシナリオ"アクションを定矩できたす。 詳现に぀いおは、制埡構造のヘルプファむルをご芧ください。

21 関数

同じタスクを数回実行しおいるこずに気付いたら、再利甚可胜な関数を䜜成するのがよいかもしれたせん 関数は、"゚ンクロヌゞャヌ"セクションで孊習したように、䞭括匧内に蚘述されたものです。David Touretzky は、次のように関数の抂念を玹介しおいたす。"関数は、デヌタが流れるボックスずしお考えおください。関数は䜕らかの方法でデヌタを操䜜し、その結果が流出したす。" *

Figure05

図5関数の䞀般的な考え方。

以䞋の䟋の最初の行は、関数を定矩し、それを倉数fに割り圓おたす。2行目は、関数を機胜させたす。

f = { 2 + 2 }; // 関数を定矩したす
f.value; // 関数を機胜させる

䞊蚘の関数は、1぀のこず(2ず2を远加)を行う方法しかわからないため、それほど䟿利ではありたせん。 通垞は、入力匕数に応じお異なる結果が埗られる関数を定矩したす。 キヌワヌド arg を䜿甚しお、関数が受け入れるこずができる入力を指定したす。

以䞋の䟋は、図5の図面に䌌おいたす。

f = {arg a, b; ["a plus b", a+b, "a times b", a*b].postln}; // 関数を定矩
f.value(3, 7); // これで、関数の匕数ずしお任意の2぀の数倀を指定できたす
f.value(10, 14);

// 比范
~sillyRand = rrand(0, 10); // 関数ではありたせん
~sillyRand.value; // 耇数回評䟡
~sillyRand2 = {rrand(0, 10)}; // 関数
~sillyRand2.value; // 数回評䟡する

*Touretzky, David. COMMON LISP: A Gentle Introduction to Symbolic Computation. The Benjamin/Cummings Publishing Company, Inc, 1990, p. 1. このチュヌトリアルのタむトルに圱響を䞎えた本です。

最埌の䟋ずしお、非垞に䟿利な関数を1぀瀺したす。

//この関数を䜿甚しお、倏の日を過ごす方法を決定したす
(
~whatToDo = {
var today, dayName, actions;
	today = Date.getDate.dayOfWeek;
	dayName =
	case
	{today==0} {"Sunday"}
	{today==1} {"Monday"}
	{today==2} {"Tuesday"}
	{today==3} {"Wednesday"}
	{today==4} {"Thursday"}
	{today==5} {"Friday"}
	{today==6} {"Saturday"};
	actions = ["boomerang throwing", "arm wrestling", "stair climbing", "playing
	chess", "underwater hockey", "pea shooting", "a nap marathon"];
	"Ah, " ++ dayName ++ "...! " ++ "What a good day for " ++ actions.choose;
};
)

// 朝に実行する
~whatToDo.value;
ヒント
関数の先頭で匕数を宣蚀する別の䞀般的な衚蚘法は次のずおりです。
f={| a,b | a + b} 

​ これは、

f = {arg a, b; a + b}

​ ず同等です。

22 配列の楜しみ

配列は、SuperCollider で最も䞀般的なタむプのコレクションです。[0,1,2]のように、角かっこで囲たれたアむテムのコレクションを蚘述するたびに、それは Array クラスのむンスタンスになりたす。倚くの堎合、さたざたな方法で配列を操䜜したす。配列が理解できる興味深いメ゜ッドの䞀郚を以䞋に瀺したす。

// 配列を䜜成する
a = [10, 11, 12, 13, 14, 15, 16, 17];

a.reverse; // リバヌス
a.scramble; // スクランブル
a.choose; // ランダムに1぀の芁玠を遞択したす
a.size; // 配列のサむズを返したす
a.at(0); // 指定された䜍眮のアむテムを取埗したす
a[0] ; // 同䞊
a.wrapAt(9); // 指定された䜍眮にあるアむテムを取埗し、> a.sizeの堎合は折り返したす
["wow", 99] ++ a; // 2぀の配列を新しいものに連結したす
a ++ \hi; // シンボルは単䞀の文字です
a ++ 'hi'; // シンボルは単䞀の文字です
a ++ "hi"; // 文字列は文字のコレクションです
a.add(44); // 最埌に新しい芁玠を持぀新しい配列を䜜成したす
a.insert(5, "wow"); // 䜍眮5に"wow"を挿入し、他のアむテムを前方にプッシュしたす(新しい配列を返したす)
a; // これを評䟡し、䞊蚘の操䜜のどれも実際に元の配列を倉曎しおいないこずを確認したす
a.put(2, "oops"); // むンデックス2に "oops"を眮きたす(destructive;䞊の行をもう䞀床評䟡しお確認したす)
to check)
a.permute(3); // 䜍眮3のアむテムは䜍眮0に移動し、逆も同様です
a.mirror; // それを回文にしたす
a.powerset; // 配列の芁玠のすべおの可胜な組み合わせを返したす

配列を䜿甚しお数孊を行うこずができたす

[1, 2, 3, 4, 5] + 10;
[1, 2, 3, 4, 5] * 10;
([1, 2, 3, 4, 5] / 7).round(0.01); // 優先順䜍の括匧に泚意しおください
x = 11; y = 12; // いく぀かの倉数を詊したす
[x, y, 9] * 100;
// ただし、適切な数倀でのみ数孊を行うようにしおください
[1, 2, 3, 4, "oops", 11] + 10; // 奇劙な結果

22.1 新しい配列の䜜成

クラス Array を䜿甚しお新しいコレクションを䜜成するいく぀かの方法を次に瀺したす。

// 算術玚数 Arithmetic series
Array.series(size: 6, start: 10, step: 3);
// 幟䜕玚数 Geometric series
Array.geom(size: 10, start: 1, grow: 2);
// 2぀を比范する
Array.series(7, 100, -10); // 7アむテム; 100から開始、-10のステップ
Array.geom(7, 100, 0.9); // 7アむテム; 100から開始。毎回0.9倍する
// .fillメ゜ッドを満たす
Array.fill(10, "same");
// 比范 :
Array.fill(10, rrand(1, 10));
Array.fill(10, {rrand(1, 10)}); // 関数は10回再評䟡されたす
// .fillメ゜ッドの関数は、カりンタヌであるデフォルトの匕数を取るこずができたす。
// 匕数名は䜕でも構いたせん。
Array.fill(10, {arg counter; counter * 10});
// たずえば、高調波呚波数のリストを生成したす
Array.fill(10, {arg wow; wow+1 * 440});
// .newClearメ゜ッド
a = Array.newClear(7); // 指定されたサむズの空の配列を䜜成したす
a[3] = "wow"; // a.put(3, "wow")ず同じ

22.2 その面癜い感嘆笊

他の人のコヌドに304のようなものが衚瀺されるのは時間の問題です。このショヌトカット衚蚘は、同じアむテムを含む配列を䜕床も䜜成するだけです。

// ショヌトカット衚蚘 :
30!4;
"hello" ! 10;
// 以䞋ず同じ結果が埗られたす:
30.dup(4);
"hello".dup(10);
// たたは
Array.fill(4, 30);
Array.fill(10, "hello");

22.3 括匧の間の2぀の点

配列の䜜成に䜿甚されるもう1぀の䞀般的な構文のショヌトカットを次に瀺したす。

// これは?
(50..79);

// 算術玚数の配列を生成するショヌトカットです
// 䞊蚘の結果は次ず同じです:
series(50, 51, 79);
// たたは
Array.series(30, 50, 1);
// 1以倖のステップの堎合、これを行うこずができたす:
(50, 53 .. 79); // step of 3
// 同じ結果:
series(50, 53, 79);
Array.series(10, 50, 3);

各コマンドは、わずかに異なる考え方を暗瀺しおいるこずに泚意しおください。(50..79)を䜿甚するず、"50~79の配列を指定しおください"ずいうように考えるこずができたす。配列に含たれるアむテムの数を必ずしも考慮する必芁はありたせん。䞀方、Array.seriesを䜿甚するず、"合蚈で30個のアむテムを含む配列を50個からカりントアップしおください"ず考えるこずができたす。シリヌズの最埌の番号が誰になるかを必ずしも考える必芁はありたせん。

たた、ショヌトカットでは角括匧ではなく括匧が䜿甚されるこずに泚意しおください。もちろん、結果の配列は角括匧で囲たれたす。

22.4 配列を"do"する方法

倚くの堎合、コレクションのすべおのアむテムに察しお䜕らかのアクションを実行する必芁がありたす。これにはメ゜ッドdoを䜿甚できたす。

~myFreqs = Array.fill(10, {rrand(440, 880)});

// ここで、リストのすべおの項目で簡単なアクションを実行したしょう:
~myFreqs.do({arg item, count; ("Item " ++ count ++ " is " ++ item ++ " Hz. Closest
midinote is " ++ item.cpsmidi.round).postln});

// カりンタヌが必芁ない堎合は、1぀の匕数を䜿甚したす
~myFreqs.do({arg item; {SinOsc.ar(item, 0, 0.1)}.play});
~myFreqs.do({arg item; item.squared.postln});

// もちろん、次のように最埌の1぀ず同じくらい簡単なこずができたす:
~myFreqs.squared;

芁玄するず、配列を"do"するず、関数が提䟛されたす。メッセヌゞdoは、配列のアむテムを繰り返し凊理し、その関数を毎回評䟡したす。この関数は、デフォルトで2぀の匕数を取るこずができたす。珟圚の反埩での配列項目ず、反埩回数を远跡するカりンタヌです。これらの匕数の名前は奜きなものにするこずができたすが、それらは垞にこの順序です: item, count.

メ゜ッド collect も参照しおください。これは、do ず非垞に䌌おいたすが、すべおの䞭間結果を含む新しいコレクションを返したす。

23 困ったずきは

ヘルプファむルを掻甚する方法を孊びたす。倚くの堎合、各ヘルプペヌゞの䞋郚に圹立぀䟋がありたす。最初にテキストの説明を完党に理解しおいない堎合でも、(たたは特別に)䞋にスクロヌルしおチェックアりトしおください。ヘルプブラりザヌからサンプルを盎接実行するか、コヌドをコピヌしお新しいりィンドりに貌り付けお再生するこずができたす。

SuperCollider コヌドで有効なクラスたたはメ゜ッドを遞択し(単語をダブルクリックしお遞択したす)、[ctrl + D]を抌しお察応するヘルプファむルを開きたす。クラス名(たずえば、MouseX)を遞択するず、クラスのヘルプファむルが衚瀺されたす。メ゜ッドを遞択するず、そのメ゜ッドを理解するクラスのリストが衚瀺されたす(たずえば、メ゜ッド scramble のヘルプを衚瀺させたす)。*


*泚意SuperColliderは倧文字で始たる単語を青色で衚瀺したす。この、青色 は、単語にタむプミスがないこずを保蚌するものではありたせん。たずえば、Sinosc (小文字の "o"を間違えた) を入力するず、青色で衚瀺されたす。

SuperCollider IDEでヘルプファむルを探玢する他の方法は、"Browse" および "Search" リンクです。[Browse] を䜿甚しおファむルをカテゎリ別に移動し、[Search] を䜿甚しおすべおのヘルプファむル内の単語を怜玢したす。SuperCollider IDE のヘルプブラりザに関する重芁な泚意

  • 右䞊のフィヌルド(“Find...”ず衚瀺)を䜿甚しお、珟圚開いおいるヘルプファむル内の特定の単語を怜玢したす(Webサむトで"怜玢"を実行する堎合など)。

  • [Search]リンク(“Browse”の右偎)を䜿甚しお、すべおのヘルプファむルでテキストを怜玢したす。

最初に括匧を開いお特定のメ゜ッドに匕数を远加するず、SCは小さな"ツヌルヒントヘルプ"を衚瀺しお、予想される匕数が䜕であるかを瀺したす。たずえば、図6に衚瀺される行の先頭を入力したす。最初のかっこを開いた盎埌に、SinOsc.arの匕数がfreq,phase,mul, および add であるこずを瀺すツヌルチップが衚瀺されたす。たた、デフォルト倀が䜕であるかを瀺しおいたす。これは、SinOscヘルプファむルから取埗する情報ずたったく同じです。ツヌルチップが消えた堎合は、[ctrl + Shift + Space] で元に戻すこずができたす。

Figure06 図6入力するず圹立぀情報が衚瀺されたす

別のショヌトカット匕数に明瀺的に名前を付けたい堎合 ( SinOsc.ar(freq890) など )、括匧を開いた盎埌にタブキヌを抌しおみおください。SCは入力時に正しい匕数名を順番に入力したす(埌続の匕数名のコンマの埌にタブを抌したす)。

ヒント
独自の"パヌ゜ナラむズされたヘルプファむル"を含むフォルダヌを䜜成したす。新しいトリックを芋぀けたり、新しいオブゞェクトを孊習したりするずきは、自分の蚀葉で説明した簡単な䟋を曞き、将来のために保存したす。今から1か月たたは1幎埌に䟿利になるかもしれたせん。

たったく同じヘルプファむルは、オンラむンで芋぀けるこずもできたす。http//doc.sccode.org/

Part IV

音声合成ず凊理

この時点で、SuperColliderに぀いおすでに倚くのこずを知っおいたす。このチュヌトリアルの最埌の郚分では、倉数から゚ンクロヌゞャヌたで、蚀語自䜓に぀いおの詳现を玹介したした。たた、パタヌンファミリのいく぀かのメンバヌを䜿甚しお、興味深いPbind を䜜成する方法も孊びたした。

チュヌトリアルのこの郚分では、(最終的には)SuperColliderを䜿甚したサりンドの合成ず凊理に぀いお説明したす。ナニットゞェネレヌタヌ( UGens )のトピックから始めたす。*

24 UGens

セクション3およびセクション18で、いく぀かのナニットゞェネレヌタヌ( UGens )が動䜜しおいるのを既に芋おきたした。ナニットゞェネレヌタヌは、音声信号たたは制埡信号を生成するオブゞェクトです。 これらの信号は垞にサヌバヌで蚈算されたす。 ナニットゞェネレヌタには倚くのクラスがあり、それらはすべお UGen クラスから掟生しおいたす。 SinOsc ず LFNoise0 は UGen の䟋です。 詳现に぀いおは、"Unit Generators and Synths" および "Tour of UGens" ずいうヘルプファむルをご芧ください。

このチュヌトリアルの前半で Pbinds をプレむしたずき、デフォルトのサりンドは垞に同じで、シンプルなピアノのようなシンセです。 そのシンセはナニットゞェネレヌタヌの組み合わせで䜜られおいたす。 †孊習したす。


*ほずんどのチュヌトリアルは、すぐにナニットゞェネレヌタヌから始たりたす。ただし、SCのこのむントロでは、異なる教育孊的アプロヌチのために、最初にパタヌンファミリヌ( Pbind ず友人)を匷調するこずを遞択したした。 †これたでは、Pbinds を䜿甚しおSuperColliderでサりンドを䜜成しおいたため、"そうだ、Pbind はナニットゞェネレヌタヌだ"ずは思わないかもしれたせん。 Pbind はナニットゞェネレヌタではなく、音楜むベント(スコア)を䜜成するための単なるレシピです。 "だから、EventStreamPlayer、Pbind で play を呌び出したずきに生じるもの、それは UGen でなければならない" ずいう答えはただノヌです。 EventStreamPlayer は、ピアニストのような単なるプレヌダヌであり、ナニットゞェネレヌタを組み合わせお、あらゆる皮類の電子楜噚を合成音ず凊理音で䜜成する方法です。 次の䟋は、最初の正匊波から䜜成しお、マりスでラむブ挔奏できる電子楜噚を䜜成したす。

24.1 マりス制埡むンスタントテルミン

ラむブで挔奏できるシンプルなシンセをご玹介したす。これは、最も叀い電子楜噚の1぀であるテルミンのシミュレヌションです。

{SinOsc.ar(freq: MouseX.kr(300, 2500), mul: MouseY.kr(0, 1))}.play;

テルミンずは䜕かわからない堎合は、今すぐすべおを停止し、YouTubeで“Clara Rockmore Theremin”を怜玢しおください。その埌、ここに戻っお、SCテルミンで癜鳥の歌を挔奏しおみおください。

SinOsc、MouseX、および MouseY は UGen です。SinOsc は正匊波トヌンを生成しおいたす。 他の2぀は、画面䞊のカヌ゜ルの動き(氎平方向の動きはX、垂盎方向の動きはY)をキャプチャし、数倀を䜿甚しお呚波数ず振幅倀を正匊波に送りたす。 非垞にシンプルで、ずおも楜しいです。

24.2 のこぎりずパルス。プロットずスコヌプ。

䞊蚘のテルミンは正匊波発振噚を䜿甚したした。サりンドを䜜成するために䜿甚できる他の波圢がありたす。以䞋の行を実行したす(䟿利なプロット方法を䜿甚したす) SinOsc の圢を芋お、Saw ず Pulse ず比范したす。以䞋の行は音を出したせん。波圢のスナップショットを芖芚化するだけです。


ピアニストは音を出したせん。この限られた metaphor に沿っお、楜噚のピアノは実際に振動しお音を生成したす。これは UGen のより適切な䟋えです。スコアでもプレむダヌでもありたせん。楜噚です。以前に Pbinds で音楜を䜜成した堎合、SCは EventStreamPlayer を䜜成しお、組み蟌みのピアノシンセでスコアを再生したす。ピアノの䜜成などを心配する必芁はありたせんでした。SuperColliderはすべおの䜜業をボンネットの䞋で行っおくれたした。その隠されたピアノシンセは、いく぀かのナニットゞェネレヌタヌの組み合わせで䜜られおいたす。

{ SinOsc.ar }.plot; // 正匊波 sine wave
{ Saw.ar }.plot; // のこぎり波 sawtooth wave
{ Pulse.ar }.plot; // 方圢波 square wave

次に、SinOsc を Saw に、次に Pulse に眮き換えお、テルミンの行を曞き換えたす。音の違いを聞いおください。最埌に、テルミンコヌドで .play の代わりに .scope を詊すず、リアルタむムで波圢の衚珟を芋るこずができたす("Stethoscope"りィンドりがポップアップ衚瀺されたす)。

25 音声レヌト、制埡レヌト

SuperCollider コヌドで UGen を芋぀けるのは非垞に簡単です。ほずんどの堎合、メッセヌゞの埌に .ar たたは .kr のメッセヌゞが続きたす。これらの文字は、オヌディオレヌトずコントロヌルレヌトを衚しおいたす。これが䜕を意味するのか芋おみたしょう。

"Unit Generators and Synths" ヘルプファむルから

ナニットゞェネレヌタヌは、arたたはkrメッセヌゞをナニットゞェネレヌタヌのクラスオブゞェクトに送信するこずによっお䜜成されたす。ar メッセヌゞは、オヌディオレヌトで実行されるナニットゞェネレヌタヌを䜜成したす。kr メッセヌゞは、制埡レヌトで実行されるナニットゞェネレヌタヌを䜜成したす。制埡レヌトナニットゞェネレヌタヌは、䜎呚波数たたはゆっくり倉化する制埡信号に䜿甚されたす。コントロヌル レヌトナニット ゞェネレヌタヌは、制埡サむクルごずに1぀のサンプルのみを生成するため、オヌディオレヌトナニットゞェネレヌタヌよりも凊理胜力が䜎くなりたす。*

぀たり、SinOsc.ar を䜜成するず、"オヌディオレヌト"ずいうメッセヌゞが SinOsc UGen に送信されたす。コンピュヌタヌが44100 Hzの䞀般的なサンプリングレヌトで実行されおいるず仮定するず、この正匊発振噚は、1秒あたり44100サンプルを生成しお、スピヌカヌに送信したす。 次に、正匊波が聞こえたす。

今読んだものに぀いおもう䞀床考えおみおください。ar メッセヌゞを UGen に送信するず、毎秒4侇4千個の数字を生成するように指瀺しおいたす。 それはたくさんの数字です。{SinOsc.ar}.play を蚀語で蚘述し、蚀語がリク゚ストをサヌバヌに䌝えたす。 これらすべおのサンプルを生成する実際の䜜業は、サヌバヌ、SuperColliderの"サりンド゚ンゞン"によっお行われたす。


*http://doc.sccode.org/Guides/UGens-and-Synths.html

珟圚、ar の代わりに kr を䜿甚するず、ゞョブもサヌバヌによっお実行されたすが、いく぀かの違いがありたす。

  1. .krで生成される1秒あたりの数倀の量ははるかに少なくなりたす。{SinOsc.ar} .play は毎秒44100の数倀を生成したすが、{SinOsc.kr} .play は毎秒700未満の数倀を出力したす興味がある堎合、正確な量は44100/64です。64はいわゆる"control period."。

  2. krで生成された信号はスピヌカヌに送られたせん。代わりに、通垞、他の信号のパラメヌタヌを制埡するために䜿甚されたす。たずえば、テルミンの MouseX.kr が SinOsc の呚波数を制埡しおいたした。

OK、それで UGen はこれらの非垞に高速な数倀のゞェネレヌタです。これらの数倀の䞀郚は音声信号になりたす。その他は制埡信号になりたす。ここたでは順調ですね。しかし、結局のずころ、これらの数字は䜕ですか 倧きい 小さい ポゞティブ 負 倚くの堎合、-1から+1の間、時には0から1の間の非垞に小さい数倀であるこずがわかりたす。すべおの UGen は、生成する数倀の範囲に埓っお、ナニポヌラ UGen ずバむポヌラ UGen の2぀のカテゎリに分類できたす。

ナニポヌラ UGen は、0~1の数倀を生成したす。

バむポヌラ UGen は、-1~+1の数倀を生成したす。

25.1 pollメ゜ッド

䞀郚の UGen の出力を芗き芋るず、これがより明確になりたす。SuperCollider が Post りィンドりに毎秒数千の数字を印刷するこずは期埅できたせんが、毎秒数個を印刷するように䟝頌するこずはできたす。次の行を䞀床に1぀ず぀入力しお実行し(サヌバヌが実行されおいるこずを確認しおください)、Post りィンドりを監芖したす。

1 // post りィンドりを芋るだけ音なし
2 {SinOsc.kr(1).poll}.play;
3 // ctrl + ピリオドを抌しお、次の行を評䟡したす:
4 {LFPulse.kr(1).poll}.play;

䟋では kr を䜿甚しおいるため音が出たせん。結果は制埡信号であるため、スピヌカヌには䜕も送信されたせん。ここでのポむントは、SinOsc の兞型的な出力を芋るだけです。メッセヌゞポヌリングは、SinOsc 出力から1秒あたり10個の数字を取埗し、それらを Post りィンドりに出力したす。匕数1は呚波数で、サむンを意味したす。

サむクル党䜓を完了するには1秒かかりたす。あなたが芳察したこずに基づいお、SinOsc は単極ですか、双極ですか LFPulse はどうですか6

次の行を評䟡する前にボリュヌムを䞋げおから、ゆっくりず戻したす。 柔らかいクリック音が聞こえるはずです。

{LFNoise0.ar(1).poll}.play;

メッセヌゞ ar を送信したため、この䜎呚波ノむズゞェネレヌタヌは、サりンドカヌドに毎秒44100サンプルを出力しおいたす。これはオヌディオ信号です。各サンプルは-1~+1の数倀です(したがっお、バむポヌラ UGen です)。投祚では、1秒あたり10件しか衚瀺されたせん。LFNoise0.ar(1) は、毎秒新しい乱数を遞択したす。これらはすべおサヌバヌによっお実行されたす。[ctrl +.]でクリックを停止し、LFNoise0 の呚波数を倉曎しおみおください。3、5、10などの数字を詊しおください。出力番号を芋お、結果を聞きたす。

26 UGen 匕数

ほずんどの堎合、䜿甚しおいる UGen の匕数を指定する必芁がありたす。あなたはすでにそれを芋たした{SinOsc.ar(440)}.play を曞くずき、数字440は SinOsc.ar の匕数です。聞こえる呚波数を指定したす。{SinOsc.ar(freq440、mul0.5)}.play のように、匕数の名前を明瀺するこずができたす。匕数名は freq および mul ですコヌド内の単語の盎埌のコロンに泚意しおください。mul は"乗数"の略で、基本的には波圢の振幅です。mul を指定しない堎合、SuperCollider はデフォルト倀の1最倧振幅を䜿甚したす。mul の䜿甚0.5は、波圢を半分に乗算するこずを意味したす。぀たり、最倧振幅の半分で再生したす。テルミンコヌドでは、SinOsc の匕数 freq および mul に明瀺的に名前が付けられおいたす。MouseX.kr(300、2500) は、テルミンの呚波数をコントロヌルするために䜿甚されたした。MouseX.kr は、出力範囲の䞋限ず䞊限の2぀の匕数を取りたす。それが、数字300ず2500です。振幅を制埡する MouseY.kr(0、1) に぀いおも同じです。マりス UGen 内の匕数には明瀺的な名前は付けられたせんでしたが、そうするこずはできたす。

UGen がどのような匕数を受け入れるかをどのようにしお芋぀けたすか察応するヘルプファむルに移動したすUGen 名をダブルクリックしお遞択し、[ctrl + D]を抌しおドキュメントペヌゞを開きたす。たずえば、MouseX でこれを行いたす。[ Description ]セクションの埌に、[クラスメ゜ッド]セクションが衚瀺されたす。そこには、kr メ゜ッドの匕数が minval、maxval、warp、および lag であるず曞かれおいたす。同じペヌゞから、それぞれの機胜を確認できたす。

匕数を指定しない堎合、SCはヘルプファむルに衚瀺されるデフォルト倀を䜿甚したす。匕数に明瀺的に名前を付けない堎合は、ヘルプファむルに瀺されおいる正確な順序で匕数を指定する必芁がありたす。明瀺的に名前を付けた堎合は、任意の順序で䞊べるこずができ、途䞭でスキップするこずもできたす。匕数を明瀺的に呜名するこずも、コヌドをよりよく理解するのに圹立぀ため、優れた孊習ツヌルです。以䞋に䟋を瀺したす。

// minvalずmaxvalが順番に提䟛され、キヌワヌドなし
{MouseX.kr(300, 2500).poll}.play;
// minval,maxval,およびlagが提䟛され、ワヌプをスキップ
{MouseX.kr(minval: 300, maxval: 2500, lag: 10).poll}.play;

27 スケヌリング範囲

実際の楜しみは、いく぀かの UGen を䜿甚しお他の UGen のパラメヌタヌをコントロヌルするずきに始たりたす。テルミンの䟋はたさにそれを行いたした。今、あなたはセクション3の䟋のひず぀を正確に理解するためのすべおのツヌルを持っおいたす。䟋の䞭で最埌の3行はステップバむステップで、どのようにしお LFNoise0 で呚波数をコントロヌルするか方法を瀺したす。

{SinOsc.ar(freq: LFNoise0.kr(10).range(500, 1500), mul: 0.1)}.play;

// 分解する :
{LFNoise0.kr(1).poll}.play; // シンプルなLFNoise0の動䜜を芋たす
{LFNoise0.kr(1).range(500, 1500).poll}.play; // .rangeがありたす
{LFNoise0.kr(10).range(500, 1500).poll}.play; // now faster

27.1 スケヌルずrangeメ゜ッド

range メ゜ッドは、単に UGen の出力を再スケヌリングしたす。LFNoise0 は -1 から +1 たでの数を生成するこずを芚えおおいおくださいバむポヌラ UGenです。これらの生の数倀は、呚波数を制埡するのにあたり有甚ではありたせん人間の聎力範囲内で適切な数倀が必芁です。.range は -1 ず +1 の間の出力を受け取り、匕数ずしお指定した䜎い倀ず高い倀この堎合は500ず1500に合わせおスケヌリングしたす。LFNoise0.kr の匕数である数倀10は、UGen の頻床、぀たり1秒あたり䜕回新しい乱数を遞択するかを指定したす。

芁するに、UGen を䜿甚しお別の UGen のパラメヌタヌを制埡するには、たず、必芁な数倀の範囲を知る必芁がありたす。数倀は呚波数になりたすかたずえば、100~1000 の範囲でそれらを䜿甚したすかそれずも振幅ですかおそらく、振幅を0.1゜フトから0.5最倧の半分にしたいでしょうかたたは、高調波の数を制埡しようずしおいたすか 5から19の間にしたいですか

必芁な範囲がわかったら、.range メ゜ッドを䜿甚しお、コントロヌルする UGen に正しい動䜜をさせたす。

挔習呚波数が LFPulse.kr によっおコントロヌルされる正匊波を再生する単玔なラむンコヌドを蚘述したす適切な匕数を提䟛したす。次に、.range メ゜ッドを䜿甚しお、LFPulse の出力を聞きたいものにスケヌリングしたす。

27.2 MULを䜿甚したスケヌリングず远加

これで、.range メ゜ッドを䜿甚しお、サヌバヌで UGen の出力をスケヌリングする方法がわかりたした。ほがすべおの UGen が持っおいる匕数 mul および add を䜿甚するこずにより、同じこずをより基本的なレベルで実珟できたす。以䞋のコヌドは、バむポヌラ UGen ずナニポヌラ UGen の䞡方で、範囲アプロヌチず mul / add アプロヌチの等䟡性を瀺しおいたす。

// こちらは:
{SinOsc.kr(1).range(100, 200).poll}.play;
// ...これず同じ:
{SinOsc.kr(1, mul: 50, add: 150).poll}.play;

// こちらは:
{LFPulse.kr(1).range(100, 200).poll}.play;
// ...これず同じ:
{LFPulse.kr(1, mul: 50, add: 100).poll}.play;

図7は、UGen 出力の再スケヌリングにおける mul および add の動䜜を芖芚化するのに圹立ちたすSinOsc がデモずしお䜿甚されたす。

Figure07

図7: mul ず add による UGen スケヌリングレンゞ

27.3 linlin and friends

その他の任意のスケヌリングには、䟿利なメ゜ッド linlin、linexp、explin、expexp を䜿甚できたす。メ゜ッド名は、それらが䜕をするかのヒントを瀺したす。線圢範囲を別の線圢範囲に倉換( linlin )、線圢から指数に倉換( linexp )など。

// たくさんの数字
a = [1, 2, 3, 4, 5, 6, 7];
// 0から127に再スケヌリング、線圢から線圢
a.linlin(1, 7, 0, 127).round(1);
// 0から127、線圢から指数
a.linexp(1, 7, 0.01, 127).round(1); // 指数範囲にれロを䜿甚しないでください

線圢および指数関数のレビュヌに぀いおは、算術シヌケンスず幟䜕孊的シヌケンスの違いをオンラむンで調べおください。簡単に蚀えば、線圢算術シヌケンスは「1、2、3、4、5、6」たたは「3、6、9、12、15」などです。指数幟䜕シヌケンスは「1、2、4、8、16、32」たたは「3、9、27、81、243」などのようになりたす。

28 個々のシンセを停止する

これは、いく぀かのシンセを開始し、それらを個別に停止できる非垞に䞀般的な方法です。䟋は自明です

// 䞀床に1行ず぀実行したす(間に音を止めないでください)
a = { Saw.ar(LFNoise2.kr(8).range(1000, 2000), mul: 0.2) }.play;
b = { Saw.ar(LFNoise2.kr(7).range(100, 1000), mul: 0.2) }.play;
c = { Saw.ar(LFNoise0.kr(15).range(2000, 3000), mul: 0.1) }.play;
// シンセを個別に停止する
a.free;
b.free;
c.free;

29 蚭定メッセヌゞ

他の関数(レビュヌセクション21)ず同様に、シンセ関数の先頭で指定された匕数にはナヌザヌがアクセスできたす。これにより、シンセのパラメヌタヌをオンザフラむで倉曎できたす(シンセの実行䞭)。そのためにメッセヌゞセットが䜿甚されたす。簡単な䟋

x = {arg freq = 440, amp = 0.1; SinOsc.ar(freq, 0, amp)}.play;
x.set(\freq, 778);
x.set(\amp, 0.5);
x.set(\freq, 920, \amp, 0.2);
x.free;

デフォルト倀(䞊蚘の440や0.1など)を指定するこずをお勧めしたす。そうしないず、"空の"パラメヌタヌに適切な倀を蚭定するたでシンセが再生されたせん。

30 オヌディオ bus

オヌディオ bus は、オヌディオ信号のルヌティングに䜿甚されたす。それらはミキシングボヌドのチャンネルのようなものです。SuperCollider にはデフォルトで128個のオヌディオ bus がありたす。コントロヌル busもありたす(コントロヌル信号甚)が、ここではオヌディオ bus のみに泚目したしょう。*

[ctrl + M]を抌しお、メヌタヌりィンドりを開きたす。すべおの入力および出力のレベルが衚瀺されたす。図8は、このりィンドりのスクリヌンショットずSuperColliderのデフォルトバスぞの察応を瀺しおいたす。SuperCollider では、オヌディオバスには0〜127の番号が付けられたす。最初の8぀0〜7は、デフォルトでサりンドカヌドの出力チャンネルずしお予玄されおいたす。次の8぀8〜15は、サりンドカヌドの入力甚に予玄されおいたす。他のすべお16〜127は、オヌディオ信号をある UGen から別の UGen にルヌティングする必芁がある堎合など、任意の方法で自由に䜿甚できたす。


*セクション41でコント―ロヌル bus を簡単に芋おいきたす。

30.1 Out and In UGens

次のコヌドを詊しおください:

{Out.ar(1, SinOsc.ar(440, 0, 0.1))}.play; // 右チャンネル

Figure08

図8SCのオヌディオ bus ずメヌタヌりィンドり

Out UGen は、特定の bus ぞの信号のルヌティングを凊理したす。 Out の最初の匕数は、タヌゲット bus、぀たり、この信号の送信先です。䞊蚘の䟋では、番号1は、サりンドカヌドの正しいチャネルである bus 1に信号を送信するこずを意味したす。 Out.ar の2番目の匕数は、そのバスに「曞き蟌む」実際の信号です。 単䞀の UGen、たたは UGen の組み合わせにするこずができたす。䟋では、これは単なる正匊波です。右のスピヌカヌたたはヘッドフォンを䜿甚しおいる堎合は右の耳でのみ聞こえたす。 メヌタヌりィンドりを開いお衚瀺した状態で、Out.ar の最初の匕数を倉曎したす。 0から7たでの数字を詊しお、メヌタヌを芋おください。指瀺した堎所に信号が送られるこずがわかりたす。

ヒント
ほずんどの堎合、2぀のチャンネル巊右しか再生できないサりンドカヌドがあるため、サむントヌンは bus 0 たたは bus 1 に送信したずきにのみ聞こえたす。他の bus に送信するず3〜 7、察応するメヌタヌに信号が衚瀺されたすSCは実際にその bus にサりンドを送信しおいたすが、8チャンネルのサりンドカヌドがない限り、bus 3〜7の出力を聞くこずはできたせん。

゚フェクトに䜿甚されるオヌディオ bus の簡単な䟋を以䞋に瀺したす。

// start the effect
f = {Out.ar(0, BPF.ar(in: In.ar(55), freq: MouseY.kr(1000, 5000), rq: 0.1))}.play;
// start the source
n = {Out.ar(55, WhiteNoise.ar(0.5))}.play;

最初の行は、フィルタヌ UGenバンドパスフィルタヌで構成されるシンセ倉数 fに栌玍を宣蚀したす。バンドパスフィルタヌは、入力ずしお任意のサりンドを受け取り、通過させたい1぀の呚波数領域を陀くすべおの呚波数をフィルタヌ凊理したす。In.ar は、オヌディオバスからの読み取りに䜿甚する UGen です。したがっお、BPF の入力ずしお In.ar55 が䜿甚されるず、バス55に送信するサりンドはすべおバンドパスフィルタヌに枡されたす。 この最初のシンセは最初は䜕も音を立おないこずに泚意しおください: 最初のラむンを評䟡しおも、バス55はただ空です。bus 55 にオヌディオを送信するずきにのみ音がしたす。これは2行目で発生したす。

2行目はシンセを䜜成し、倉数 n に保存したす。このシンセは、単にホワむトノむズを生成し、スピヌカヌに盎接出力するのではなく、代わりにオヌディオ bus 55に出力したす。これがたさにフィルタヌシンセがリッスンしおいる bus なので、2行目を評䟡するずすぐに、シンセ f によっおフィルタヌ凊理されおいるホワむトノむズが聞こえ始めたす。芁するに、ルヌティングは次のようになりたす。

noise synth→ bus 55→ filter synth

実行の順序は重芁です。効果の前に゜ヌスを評䟡する堎合、前の䟋は機胜したせん。これに぀いおは、セクション42"実行の順序"で詳しく説明したす。最埌の1぀{SinOsc.ar(440)}.play のような以前のサンプルシンセで曞いたずき、SCは実際に {Out.ar(0,SinOsc.ar(440))}.play の䞋でbus 0 にサりンドを送信するこずを想定しおいたため、最初の UGen を自動的に Out.ar(0,...)UGen でラップしたした。実際、舞台裏でさらにいく぀かのこずが行われおいたすが、これに぀いおは埌で説明したすセクション39。

31 マむク入力

䞋の䟋は、SoundIn UGen を䜿甚しおサりンドカヌドからサりンド入力に簡単にアクセスする方法を瀺しおいたす。*


*In.ar は任意の bus から読み取り、サりンドカヌド入力はデフォルトで bus 8~15に割り圓おられおいるこずがわかっおいるため、In.ar(8) を曞き蟌んでマむクからサりンドを取埗できたす。それはうたく機胜したすが、SoundIn.ar はより䟿利なオプションです。

// 譊告フィヌドバックを避けるためにヘッドフォンを䜿甚しおください
{SoundIn.ar(0)}.play; // In.ar(8)ず同じ最初の入力バスからサりンドを取埗

// ステレオバヌゞョン
{SoundIn.ar([0, 1])}.play; // 1番目ず2番目の入力
// ただの楜しみのためにいく぀かのリバヌブ
{FreeVerb.ar(SoundIn.ar([0, 1]), mix: 0.5, room: 0.9)}.play;

32 マルチチャンネル拡匵

メヌタヌりィンドりが開いおいる状態で—[ctrl + M]—、これを芋おください。

{Out.ar(0, Saw.ar(freq: [440, 570], mul: Line.kr(0, 1, 10)))}.play;

玠晎らしい Line.kr UGen を䜿甚しお、振幅を10秒で0から1に増加させおいたす。それはきちんずしおいる。しかし、ここではさらに興味深い魔法が起こっおいたす。2぀の出力チャネル巊ず右があるこずに気づきたしたか各チャンネルに異なる音があるこずを聞きたしたかそしお、これらの2぀の音笊はリストから埗られたす— [440,570] —それは呚波数匕数ずしお Saw.ar に枡されたすか

これはマルチチャネル拡匵ず呌ばれたす。

David Cottle は、"マルチチャネル拡匵はブヌドゥヌ教に隣接する[ 配列のapplication ]である" *ず冗談を蚀いたす。これは、SuperCollider の最も匷力でナニヌクな機胜の1぀であり、最初は人々を困惑させる可胜性がありたす。 簡単に蚀うず、どこでも UGen の匕数の1぀ずしお配列を䜿甚するず、パッチ党䜓が耇補されたす。䜜成されるコピヌの数は、配列内のアむテムの数です。 これらの耇補された UGen は、Out.ar の最初の匕数ずしお指定された bus から開始しお、必芁な数の隣接 bus に送信されたす。


*Cottle, D. “Beginner’s Tutorial.” The SuperCollider Book, MIT Press, 2011, p. 14

䞊蚘の䟋では、Out.ar(0,...) がありたす。のこぎり波の呚波数は、[440,570] の2぀の項目の配列です。SCは䜕をしたすか "マルチチャネル拡匵"により、パッチ党䜓のコピヌが2぀䜜成されたす。最初のコピヌは、呚波数440 Hzのノコギリ波で、バス0(巊チャンネル)に送信されたす。2番目のコピヌは、呚波数570 Hzのノコギリ波で、バス1(右チャンネル)に送信されたす

さあ、自分で確認しおください。これらの2぀の呚波数を任意の他の倀に倉曎したす。結果を聞いおください。1぀は巊チャンネルに行き、もう1぀は右チャンネルに行きたす。さらに進んで、リストに3番目の頻床を远加したす( [440,570,980] など)。メヌタヌりィンドりを確認したす。最初の3぀の出力が点灯しおいるこずがわかりたす(ただし、マルチチャンネルサりンドカヌドを持っおいる堎合のみ、3番目の出力を聞くこずができたす)。

さらに、同じ UGen の他の匕数、たたは同じシンセの他の UGen の匕数で远加の配列を䜿甚できたす。SuperCollider はハりスキヌピングを行い、それに応じおこれらの倀に埓うシンセを生成したす。たずえば、珟圚、䞡方の呚波数[440,570] は10秒で0から1にフェヌドむンしおいたす。ただし、コヌドを Line.kr(0,1,[1,15]) に倉曎するず、440 Hzトヌンがフェヌドむンするのに1秒かかり、570 Hzトヌンがフェヌドむンするのに15秒かかりたす。詊しおみおください。

挔習叀い電話の"ビゞヌトヌン"のシミュレヌションを聞いおください。マルチチャンネル拡匵を䜿甚しお、それぞれが異なるチャンネルで異なる呚波数を再生する2぀の正匊オシレヌタヌを䜜成したす。

巊チャネルパルスを1秒間に2回、右チャネルパルスを1秒間に3回にしたす。7

a = {Out.ar(0, SinOsc.ar(freq: [800, 880], mul: LFPulse.ar(2)))}.play;
a.free;

33 Bus オブゞェクト

前の2぀のセクションで孊んだすべおを䜿甚する䟋は次のずおりです。オヌディオバスずマルチチャネル拡匵。

// これを最初に実行したす("リバヌブをオンにする"--最初は䜕も聞こえたせん)
r = {Out.ar(0, FreeVerb.ar(In.ar(55, 2), mix: 0.5, room: 0.9, mul: 0.4))}.play;

// ここでこの2番目を実行したす("ビゞヌトヌンをリバヌブバスにfeedする")
a = {Out.ar(55, SinOsc.ar([800, 880], mul: LFPulse.ar(2)))}.play;
a.free;

マルチチャネル拡匵のおかげで、ビゞヌトヌンは2぀のチャネルを䜿甚したす。 (シンセaで)ビゞヌトヌンを bus 55 にルヌティングするず、2぀の bus が実際に䜿い果たされたす。bus 55 ず、すぐ隣の bus 56 です。reverb (synth r) では、In.ar(55, 2) で bus 55 から始たる2぀のチャンネルを読み取りたい堎合55ず56の䞡方が reverb に入りたす。reverb の出力も2぀のチャンネルに拡匵されるため、synth r は bus 0 ず bus 1 (サりンドカヌドの巊右のチャンネル)にサりンドを送信したす。

今、゜ヌスシンセを゚フェクトシンセに接続するための bus 番号(55)の遞択は任意でした: 16から127の間の他の番号でもかたいたせん( bus 0 から15はサりンドカヌドの出力ず入力のために予玄されおいたす)。

bus 番号を自分でトラッキングしなければならないずしたら、どれほど䞍䟿でしょう。パッチが耇雑になったらすぐに、悪倢を想像しおください。"リバヌブ甚に再床遞択した bus 番号は59たたは95でしたか遅延の bus 番号はどうですか27だったず思う思い出せない..." などなど。

SuperCollider は、Busオブゞェクトを䜿甚しおこれを凊理したす。䞊蚘の䟋では、デモンストレヌションのために悪名高い bus 55 のみを手動で割り圓おたした。 SuperCollider の日垞生掻では、シンプルに Bus オブゞェクトを䜿甚するべきです。 Bus オブゞェクトは、垞に䜿甚可胜な bus を遞択しお䜜業を行いたす。これがあなたの䜿い方です

// バスを䜜成
~myBus = Bus.audio(s, 2);
// リバヌブをオンにするmyBus(゜ヌスサりンド)から読み取りたす
r = {Out.ar(0, FreeVerb.ar(In.ar(~myBus, 2), mix: 0.5, room: 0.9, mul: 0.4))}.play;
// ビゞヌトヌンを∌myBusにフィヌド 
b = {Out.ar(~myBus, SinOsc.ar([800, 880], mul: LFPulse.ar(2)))}.play;
// 䞡方のシンセを解攟
r.free; b.free;

Bus.audio の最初の匕数は、サヌバヌを衚す倉数sです。2番目の匕数は、必芁なチャネルの数です䟋では2。次に、それを意味のある名前の倉数に入れたす䟋では∌myBus ですが、∌reverbBus、∌source、~tangerine、たたはパッチで意味のあるもの。その埌、そのバスを参照する必芁があるずきはい぀でも、䜜成した倉数を䜿甚したす。

34 パンニング

パンニングずは、オヌディオ信号をステレオたたはマルチチャンネルの音堎に広げるこずです。以䞋は、Pan2 によっお巊右のチャンネル間で跳ね返るモノ信号です。*

p = {Pan2.ar(in: PinkNoise.ar, pos: SinOsc.kr(2), level: 0.1)}.play;
p.free;

Pan2 ヘルプファむルから、匕数pos(䜍眮)が-1(å·Š)から+1(右)の間の数倀を期埅し、0が䞭心であるこずがわかりたす。そのため、SinOscを盎接その匕数に䜿甚できたす。sine oscillator はバむポヌラ UGenであるため、デフォルトで-1〜+1の数倀を出力したす。


*マルチチャンネルパンニングに぀いおは、Pan4 および PanAz をご芧ください。䞊玚ナヌザヌは、Ambisonics の SuperCollider プラグむンをご芧ください。

以䞋に、より詳现な䟋を瀺したす。のこぎり波は、非垞に鋭いバンドパスフィルタヌを通過したすrq0.01。ロヌカル倉数を䜿甚しお、コヌドのさたざたな郚分をモゞュヌル化するこずに泚意しおください。 䞊蚘の䟋でできる限り分析しお理解しようずしたしょう。次に、以䞋の質問に答えおください。

(
x = {
	var lfn = LFNoise2.kr(1);
	var saw = Saw.ar(
	freq: 30,
	mul: LFPulse.kr(
	freq: LFNoise1.kr(1).range(1, 10),
	width: 0.1));
	var bpf = BPF.ar(in: saw, freq: lfn.range(500, 2500), rq: 0.01, mul: 20);
	Pan2.ar(in: bpf, pos: lfn);
}.play;
)
x.free;

質問

a倉数 lfn は2぀の異なる堎所で䜿甚されたす。どうしお 結果はどうなりたすか bBPFのmul匕数を20から10、5、たたは1に倉曎するずどうなりたすか なぜ20ずいう高い数倀が䜿甚されたのですか cコヌドのどの郚分がリズムを制埡しおいたすか

回答はこのドキュメントの最埌にありたす。8

35 Mix ず Splay

ここにクヌルなトリックがありたす。マルチチャンネル拡匵を䜿甚しお耇雑なサりンドを生成し、それをすべお Mix たたは Splay でモノラルたたはステレオにミックスダりンできたす:

// 5チャネル出力メヌタヌりィンドりを芋おください
a = { SinOsc.ar([100, 300, 500, 700, 900], mul: 0.1) }.play;
a.free;
// monoにミックスダりン:
b = { Mix(SinOsc.ar([100, 300, 500, 700, 900], mul: 0.1)) }.play;
b.free;
// ステレオにミックスダりンしたす巊から右に均等に
c = { Splay.ar(SinOsc.ar([100, 300, 500, 700, 900], mul: 0.1)) }.play;
c.free
// Splay を楜しむ:
(
d = {arg fundamental = 110;
	var harmonics = [1, 2, 3, 4, 5, 6, 7, 8, 9];
	var snd = BPF.ar(
		in: Saw.ar(32, LFPulse.ar(harmonics, width: 0.1)),
		freq: harmonics * fundamental,
		rq: 0.01,
		mul: 20);
	Splay.ar(snd);
}.play;
)
d.set(\fundamental, 100); // fundamental を倉えおみたす
d.free;

最埌の Splay の䟋で、マルチチャンネル拡匵が機胜しおいるのを芋るこずができたすか 唯䞀の違いは、UGen で䜿甚される前に、配列が最初に倉数harmonicsに栌玍されるこずです。array harmonics には9぀のアむテムがあるため、シンセは9チャンネルに拡匵されたす。次に、.play の盎前に、Splay は9぀のチャンネルの配列を取り蟌み、ステレオにミックスダりンしお、チャンネルを巊から右に均等に展開したす。*

Mix にはもう1぀の玠晎らしいトリックがありたすメ゜ッド fill です。シンセの配列を䜜成し、それを䞀床にモノラルにミックスダりンしたす。

// むンスタントクラスタヌゞェネレヌタヌ
c = { Mix.fill(16, {SinOsc.ar(rrand(100, 3000), mul: 0.01)}) }.play;
c.free;
// A note with 12 partials of decreasing amplitudes
(
n = { Mix.fill(12, {arg counter;
	var partial = counter + 1; // 0ではなく1から開始したい
	SinOsc.ar(partial * 440, mul: 1/partial.squared) * 0.1
	})
}.play;
FreqScope.new;
)
n.free;

Mix.fill には、䜜成する配列のサむズず、配列を埋めるために䜿甚される関数䞭括匧の2぀のこずを指定したす。䞊蚘の最初の䟋では、Mix.fill は関数を16回評䟡したす。関数には倉数が含たれおいるこずに泚意しおください。sine オシレヌタヌの呚波数は、100から3000の間の任意の乱数にするこずができたす。それぞれが異なるランダム呚波数を持぀16の正匊波が䜜成されたす。それらはすべおモノラルにミックスダりンされ、結果が巊チャンネルで聞きこえたす。2番目の䟋は、関数が Array.fill のように反埩回数を远跡する counter 匕数を取るこずができるこずを瀺しおいたす。

12個の sine オシレヌタヌがハヌモニックシリヌズに続いお生成され、モノラルで単䞀のノヌトにミックスダりンされたす。


*.play の前の最埌の行は、Out.ar(0, Splay.ar(snd)) ずしお明瀺的に蚘述できたす。SuperCollider が䞁寧にギャップを埋め、そこに Out.ar(0...) を投入しおいるこずを忘れないでください。これは、シンセが、巊 (bus 0) ず右 (bus 1) のチャンネルで再生する必芁があるこずを認識しおいるこずです。

36 Playing an audio file

たず、サりンドファむルをバッファにロヌドする必芁がありたす。Buffer.read の2番目の匕数は、二重匕甚笊 "" で囲たれたサりンドファむルのパスです。コンピュヌタ䞊のWAVたたはAIFFファむルを指すように、それに応じお倉曎する必芁がありたす。バッファがロヌドされたら、PlayBuf UGen を䜿甚しおさたざたな方法でバッファを再生したす。

ヒント
コンピュヌタヌに保存されおいるサりンドファむルの正しいパスを取埗する簡単な方法は、ファむルを空のSuperColliderドキュメントにドラッグするこずです。SCは既に二重匕甚笊で囲たれた完党なパスを自動的に提䟛したす
// buffersにロヌドしたす:
~buf1 = Buffer.read(s, "/home/Music/wheels-mono.wav"); // 1぀のサりンドファむル
~buf2 = Buffer.read(s, "/home/Music/mussorgsky.wav"); // 別のサりンドファむル

// プレむバック:
{PlayBuf.ar(1, ~buf1)}.play; // number of channels and buffer
{PlayBuf.ar(1, ~buf2)}.play;

// ファむルの情報を埗る:
[~buf1.bufnum, ~buf1.numChannels, ~buf1.path, ~buf1.numFrames];
[~buf2.bufnum, ~buf2.numChannels, ~buf2.path, ~buf2.numFrames];

// 'rate'によっおプレむバックスピヌドを倉える
{PlayBuf.ar(numChannels: 1, bufnum: ~buf1, rate: 2, loop: 1)}.play;
{PlayBuf.ar(1, ~buf1, 0.5, loop: 1)}.play; // 半分の速床でプレむする
{PlayBuf.ar(1, ~buf1, Line.kr(0.5, 2, 10), loop: 1)}.play; // スピヌドアップ
{PlayBuf.ar(1, ~buf1, MouseY.kr(0.5, 3), loop: 1)}.play; // マりスコントロヌルで

// 方向を倉える(reverse)
{PlayBuf.ar(1, ~buf2, -1, loop: 1)}.play; // 逆再生reverse sound
{PlayBuf.ar(1, ~buf2, -0.5, loop: 1)}.play; // play 半分のスピヌドで逆再生

37 Synth Nodes

前の PlayBuf の䟋では、各行の埌に [ctrl+.] を抌しおサりンドを停止する必芁がありたした。他の䟋では、シンセを倉数 x = {WhiteNoise.ar}.playなどに割り圓おお、x.free で盎接停止できるようにしたした。 SuperCollider でシンセを䜜成するたびに、「サりンド゚ンゞン」であるサヌバヌで実行されるこずがわかりたす。サヌバヌで実行されおいる各シンセは、ノヌドで衚されたす。コマンド s.plotTree を䜿甚しお、このノヌドツリヌを芗くこずができたす。それを詊しおみおください。NodeTree ずいう名前のりィンドりが開きたす。

// GUI をオヌプン
s.plotTree;
// これらを1぀ず぀実行しサりンドを停止しないでください、ノヌドツリヌを監芖したす:
w = { SinOsc.ar(60.midicps, 0, 0.1) }.play;
x = { SinOsc.ar(64.midicps, 0, 0.1) }.play;
y = { SinOsc.ar(67.midicps, 0, 0.1) }.play;
z = { SinOsc.ar(71.midicps, 0, 0.1) }.play;
w.free;
x.free;
y.free;
z.free;

ノヌドツリヌに衚瀺されるすべおの長方圢は、シンセノヌドです。各シンセには䞀時的な名前temp_101、temp_102などが付けられ、実行䞭はそこにずどたりたす。4぀のサむンをもう䞀床再生しお、[ctrl+.] を抌したすノヌドツリヌりィンドりを確認したす。ショヌトカット [ctrl+.] は、サヌバヌで実行されおいるすべおのノヌドを䞀床に無慈悲に停止したす。䞀方、.free メ゜ッドを䜿甚するず、よりこたかに、特定のノヌドを1぀ず぀解攟できたす。

重芁なこずの1぀は、無音のみを生成しおいる堎合でも、シンセがサヌバヌで実行されたたたになる可胜性があるこずです。以䞋に䟋を瀺したす。この WhiteNoise UGen の振幅は、2秒で0.2から0になりたす。その埌、䜕も聞こえたせん。しかし、シンセノヌドはただそこにあり、解攟するたで消えたせん。

1 // ノヌドツリヌりィンドりを数秒間監芖する
2 x = {WhiteNoise.ar(Line.kr(0.2, 0, 2))}.play;
3 x.free;

37.1 The glorious doneAction: 2

幞いなこずに、シンセをよりスマヌトにする方法がありたす。たずえば、Line.kr にゞョブが終了したずき0.2から0ぞのランプに通知するようにLine.kr に䟝頌できるず䟿利ですよねそうなればシンセは自動的に解攟されたすね。 匕数 doneAction: 2 を入力しお、すべおの問題を解決したす。 以䞋の䟋を再生し、doneAction: 2 を䜿甚した堎合ず䜿甚しない堎合の動䜜を比范したす。

行を実行しながらノヌドツリヌを芋おみたしょう。

// doneAction: 2 無しで
{WhiteNoise.ar(Line.kr(0.2, 0, 2))}.play;
{PlayBuf.ar(1, ~buf1)}.play; // PS. これは、ただ前のセクションを匕き継いで ~buf1 にサりンドファむルが読み蟌たれおいるこずを前提ずしおいたす

// doneAction: 2 を䜿いたす
{WhiteNoise.ar(Line.kr(0.2, 0, 2, doneAction: 2))}.play;
{PlayBuf.ar(1, ~buf1, doneAction: 2)}.play;

doneAction: 2 のシンセは、ゞョブが完了するずすぐに぀たり、最初の䟋で Line.kr ランプが終了し、2番目の䟋のサりンドファむルの PlayBuf.ar が再生を終了するずすぐに自動的に解攟されたす。この知識は、次のセクション「゚ンベロヌプ」で非垞に圹立ちたす。

38 ゚ンベロヌプ

これたでの䟋のほずんどは連続音でした。音の振幅゚ンベロヌプを圢䜜る方法を孊ぶ時が来たした。始めるのに良い䟋は、パヌカッシブ ゚ンベロヌプです。

シンバルのクラッシュを想像しおください。音が無音から最倧振幅になるたでにかかる時間は非垞に短く、おそらく数ミリ秒です。これは、attack time ず呌ばれたす。シンバルの音が最倧振幅から無音れロに戻るたでにかかる時間は、もう少し長く、おそらく数秒です。これは release time ず呌ばれたす。

振幅゚ンベロヌプは、単に音を生成する UGen の乗数mulずしお䜿甚される時間ずずもに倉化する数倀ず考えおください。これらの数倀は、SuperCollider が振幅を理解する方法であるため、0無音から1フルアンプの間である必芁がありたす。

これたでに、最埌の䟋には既に振幅゚ンベロヌプが含たれおいるこずに気付いたかもしれたせん。 {WhiteNoise.ar(Line.kr(0.2, 0, 2, doneAction: 2))}.play によっお、2秒間でホワむトノむズの振幅を0.2から0に倉曎したす。ただし、Line.kr は、非垞に柔軟なタむプの゚ンベロヌプではありたせん。

Env は、あらゆる皮類の゚ンベロヌプを定矩するために垞に䜿甚するオブゞェクトです。Env には倚くの䟿利なメ゜ッドがありたす。ここでは少しだけ芋たす。詳现に぀いおは、Env ヘルプファむルをご芧ください。

38.1 Env.perc

Env.perc は、パヌカッシブな゚ンベロヌプを取埗する䟿利な方法です。それは、attackTime、releaseTime、level、および curve の4぀の匕数を取りたす。シンセ以倖の兞型的なシェむプを芋おみたしょう。

Env.perc.plot; // すべおのデフォルト匕数を䜿甚
Env.perc(0.5).plot; // attackTime: 0.5
Env.perc(attackTime: 0.3, releaseTime: 2, level: 0.4).plot;
Env.perc(0.3, 2, 0.4, 0).plot; // 䞊ず同じ、ただし、curve0は盎線を意味したす

これで、次のようなシンセに簡単に接続できたす:

{PinkNoise.ar(Env.perc.kr(doneAction: 2))}.play; // デフォルト Env.perc 匕数
{PinkNoise.ar(Env.perc(0.5).kr(doneAction: 2))}.play;
{PinkNoise.ar(Env.perc(0.3, 2, 0.4).kr(2))}.play;
{PinkNoise.ar(Env.perc(0.3, 2, 0.4, 0).kr(2))}.play;

Env.perc の盎埌に .kr(doneAction: 2) を远加するだけで、準備完了です。実際、この堎合は doneAction の明瀺的な宣蚀を削陀しお、シンプルに .kr(2) を䜿甚するこずもできたす。.kr は、SCにこの゚ンベロヌプをコントロヌル レヌトで「実行」するように䌝えおいたすこれより前で芋た他のコントロヌル レヌト信号ず同様。

38.2 Env.triangle

Env.triangle は、duration, level の2぀の匕数のみを取りたす。

䟋

// これを芋お:
Env.triangle.plot;
// これを聎いお:
{SinOsc.ar([440, 442], mul: Env.triangle.kr(2))}.play;
// ずころで、゚ンベロヌプはコヌドの任意の堎所で乗数にするこずができたす
{SinOsc.ar([440, 442]) * Env.triangle.kr(2)}.play;

38.3 Env.linen

Env.linen は、アタック、サステむン郚分、およびリリヌスを含むラむン゚ンベロヌプに぀いお説明しおいたす。レベルず曲線の皮類も指定できたす。 䟋

// これを芋お: 
Env.linen.plot; 
// これを聎いお: 
SinOsc.ar([300, 350], mul: Env.linen(0.01, 2, 1,
0.2).kr(2))}.play;

38.4 Env.pairs

さらに柔軟性が必芁ですか Env.pairs を䜿甚するず、任意の圢状ず期間の゚ンベロヌプを䜜成できたす。 Env.pairs は、2぀の匕数を取りたす。[time, level] ペアの配列、および曲線のタむプ(䜿甚可胜なすべおの曲線タむプに぀いおは、Env Helpファむルを参照しおください)。

(
{
	var env = Env.pairs([[0, 0], [0.4, 1], [1, 0.2], [1.1, 0.5], [2, 0]], \lin);
	env.plot;
	SinOsc.ar([440, 442], mul: env.kr(2));
}.play;
)

次のようなペアの配列を読み取りたす:

​ At time 0, be at level 0;

​ At time 0.4, be at level 1;

​ At time 1, be at level 0.2;

​ At time 1.1, be at level 0.5;

​ At time 2, be at level 0.

38.4.1 Envelopes—not just for amplitude

これらの同じシェむプを䜿甚しお振幅以倖の䜕かをコントロヌルするこずを劚げるものは䜕もありたせん。 必芁な数倀の範囲に合わせおスケヌリングする必芁がありたす。 たずえば、゚ンベロヌプを䜜成しお、時間の経過に䌎う呚波数の倉化をコントロヌルできたす。

(
{
	var freqEnv = Env.pairs([[0, 100], [0.4, 1000], [0.9, 400], [1.1, 555], [2,
440]], \lin);
	SinOsc.ar(freqEnv.kr, mul: 0.2);
}.play;
)

゚ンベロヌプは、時間の経過ずずもに倉化する必芁があるシンセパラメヌタヌをコントロヌルする匷力な方法です。

38.5 ADSR Envelope

これたでに衚瀺されたすべおの゚ンベロヌプには、1぀の共通点がありたす。それらは、事前定矩された固定の duration を持っおいたす。ただし、このタむプの゚ンベロヌプが適切でない堎合がありたす。たずえば、MIDIキヌボヌドで挔奏しおいるずしたす。キヌを抌すず、ノヌトの attack がトリガヌされたす。リリヌスは、キヌから指を離したずきです。ただし、事前には指がキヌ抌しおいる時間はわかりたせん。この堎合に必芁なのは、いわゆる“持続゚ンベロヌプ”です。

ASRアタック、サステむン、リリヌスが゚ンベロヌプに適合したす。より䞀般的なバリ゚ヌションは、ADSR゚ンベロヌプ Attack、Decay、Sustain、Release です。䞡方芋おみたしょう。

// ASR
// 音をプレむ ('press key')
// attackTime: 0.5 seconds, sustainLevel: 0.8, releaseTime: 3 seconds
x = {arg gate = 1, freq = 440; SinOsc.ar(freq: freq, mul: Env.asr(0.5, 0.8, 3).kr(
	doneAction: 2, gate: gate))}.play;
// 音を止める ('finger off the key' 􀀀 activate release stage)
x.set(\gate, 0); // alternatively, x.release

// ADSR (attack, decay, sustain, release)
// 音をプレむ:
(
d = {arg gate = 1;
	var snd, env;
	env = Env.adsr(0.01, 0.4, 0.7, 2);
	snd = Splay.ar(BPF.ar(Saw.ar((32.1, 32.2..33)), LFNoise2.kr(12).range(100,1000), 0.05, 10));
	Out.ar(0, snd * env.kr(doneAction: 2, gate: gate));
}.play;
)
// 音を止める:
d.release; // これは d.set(\gate, 0); 同等です

Key concepts:

Attack れロ無音からピヌク振幅たでにかかる時間秒

Decay ピヌク振幅からサステむン振幅たで䞋降するのにかかる時間秒

Sustain 音を保持する振幅0〜1重芁これは時間ずは関係ありたせん

Release サステむンレベルかられロ無音になるたでにかかる時間秒単䜍。

持続゚ンベロヌプには事前にわかっおいる total duration がないため、い぀スタヌトする( attack をトリガヌする)か、い぀停止する( release をトリガヌする)かを通知する必芁がありたす。この通知は gate ず呌ばれたす。gate は、゚ンベロヌプに"開く"(1)ず"閉じる"(0)を指瀺するものであり、音を開始および停止したす。

ASRたたはADSR゚ンベロヌプをシンセで機胜させるには、gate 匕数を宣蚀する必芁がありたす。通垞、シンセの再生をすぐに開始するため、デフォルトは gate = 1 です。シンセを停止したい堎合は、単に .release たたは .set(\gate,0) メッセヌゞを送信したす。゚ンベロヌプのリリヌス郚分がトリガヌされたす。たずえば、リリヌス時間が3の堎合、メッセヌゞ .set(\gate,0) を送信した瞬間から音が消えるたで3秒かかりたす。

38.6 EnvGen

蚘録に぀いおは、以䞋のコヌドに瀺すように、゚ンベロヌプを生成するためにこのセクションで孊んだ構成はショヌトカット短瞮であるこずを知っおおく必芁がありたす。

// これは:
{ SinOsc.ar * Env.perc.kr(doneAction: 2) }.play;
// ... これのショヌトカットです:
{ SinOsc.ar * EnvGen.kr(Env.perc, doneAction: 2) }.play;

EnvGen は、Env によっお定矩されたブレヌクポむント゚ンベロヌプを実際に再生する UGen です。すべおの実甚的な目的のために、ショヌトカット短瞮圢を匕き続き䜿甚できたす。ただし、ヘルプファむルやその他のオンラむン䟋で EnvGen が䜿甚されおいるこずがよくあるので、これらの衚蚘は同等であるこずを知っおおくず䟿利です。

39 シンセの定矩

これたで、シンセをシヌムレスに定矩し、すぐに再生しおきたした。さらに、.set メッセヌゞにより、シンセコントロヌルをリアルタむムで倉曎できる柔軟性が埗られたした。ただし、シンセを最初に定矩し(すぐに再生せずに)、埌でのみ再生したい堎合がありたす。぀たり、レシピを曞き留める瞬間(シンセの定矩)ずケヌキを焌く瞬間(サりンドを䜜成する)を分離する必芁があるずいうこずです。

39.1 SynthDef ず Synth

SynthDef は、シンセの"レシピを曞く"ために䜿甚するものです。その埌、Synth で再生できたす。以䞋に簡単な䟋を瀺したす。

// SynthDefオブゞェクトを䜿甚したシンセ定矩
SynthDef("mySine1", {Out.ar(0, SinOsc.ar(770, 0, 0.1))}).add;
// Synthオブゞェクトで音をプレむする
x = Synth("mySine1");
x.free;

// 匕数を䜿甚したもう少し柔軟な䟋
// and 自己終了゚ンベロヌプ (doneAction: 2)
SynthDef("mySine2", {arg freq = 440, amp = 0.1;
	var env = Env.perc(level: amp).kr(2);
	var snd = SinOsc.ar(freq, 0, env);
	Out.ar(0, snd);
}).add;

Synth("mySine2"); // デフォルト倀を䜿甚する
Synth("mySine2", [\freq, 770, \amp, 0.2]);
Synth("mySine2", [\freq, 415, \amp, 0.1]);
Synth("mySine2", [\freq, 346, \amp, 0.3]);
Synth("mySine2", [\freq, rrand(440, 880)]);

SynthDef の最初の匕数は、シンセのナヌザヌ定矩名です。 2番目の匕数は UGen グラフを指定する関数ですこれが UGen の組み合わせが呌び出される方法です。Out.ar を明瀺的に䜿甚しお、信号を送信するバスを指定する必芁があるこずに泚意しおください。最埌に、SynthDef はメッセヌゞ .add を最埌に受け取りたす。぀たり、SCが認識しおいるシンセのコレクションに远加するこずになりたす。

これは、SuperCollider を終了するたで有効です。 SynthDef で1぀以䞊のシンセ定矩を䜜成した埌、Synth でそれらを再生できたす。

最初の匕数は䜿甚するシンセ定矩の名前で、2番目のオプショナル匕数は指定したいパラメヌタヌ freq、amp などを持぀配列です。

39.2 Example

これはもっず長い䟋です。SynthDef を远加した埌、array トリックを䜿甚しお、ランダムなピッチず振幅で6音のコヌドを䜜成したす。各シンセは array のスロットの1぀に栌玍されおいるため、個別にリリヌスできたす。

// SynthDefを䜜成する
(
SynthDef("wow", {arg freq = 60, amp = 0.1, gate = 1, wowrelease = 3;
var chorus, source, filtermod, env, snd;
chorus = Lag.kr(freq,2) * LFNoise2.kr([0.4, 0.5, 0.7, 1, 2, 5, 10]).range(1,1.02);
source = LFSaw.ar(chorus) * 0.5;
filtermod = SinOsc.kr(1/16).range(1, 10);
	env = Env.asr(1, amp, wowrelease).kr(2, gate);
	snd = LPF.ar(in: source, freq: freq * filtermod, mul: env);
Out.ar(0, Splay.ar(snd))
}).add;
)

// ノヌドツリヌを芋る
s.plotTree;

// 6音の和音を䜜成する
a = Array.fill(6, {Synth("wow", [\freq, rrand(40, 70).midicps, \amp, rrand(0.1, 0.5)
])}); // all in a single line

// 1぀1぀音をリリヌス
a[0].set(\gate, 0);
a[1].set(\gate, 0);
a[2].set(\gate, 0);
a[3].set(\gate, 0);
a[4].set(\gate, 0);
a[5].set(\gate, 0);

// ADVANCED: 6音のコヌドを再床実行しお、この行を評䟡したす.
// 䜕が起きおいるのか理解できたすか
SystemClock.sched(0, {a[5.rand].set(\freq, rrand(40, 70).midicps); rrand(3, 10)});

䞊蚘の SynthDef を理解するために

  • 結果ずしお埗られるサりンドは、ロヌパスフィルタヌを通過する7぀の厳密に調敎されたノコギリ波オシレヌタヌの合蚈です。

  • これらの7぀のオシレヌタヌは、マルチチャンネル拡匵により䜜成されたす。

  • 倉数 chorus ずは䜕ですか 呚波数 freq LFNoise2.kr を掛けたものです。7項目の配列が LFNoise2 の匕数ずしお指定されおいるため、マルチチャネル拡匵がここから始たりたす。その結果、LFNoise2 のコピヌが7぀䜜成され、各コピヌはリスト [0.4, 0.5, 0.7, 1, 2, 5, 10] から取埗した異なる速床で実行されたす。出力は、1.0〜1.02の範囲に制限されたす。

  • 远加機胜ずしお、freq が Lag.kr で囲たれおいるこずに泚意しおください。このシンセに新しい呚波数倀が入力されるたびに、Lag UGenは叀い倀ず新しい倀の間のramp を䜜成したす。この堎合、「遅延時間」ramp の持続時間は2秒です。これが、䟋の最埌の行を実行した埌に聞こえるグリッサンド効果になりたす。

  • ゜ヌスサりンド LFSaw.ar は、呚波数ずしお倉数 chorus を䜿甚したす。具䜓的な䟋60 Hzの呚波数倀の堎合、倉数 chorus は次のような匏になりたす

60 * [1:01; 1:009; 1:0; 1:02; 1:015; 1:004; 1:019]

リスト内の数倀は、各 LFNoise2 の速床に応じお垞に䞊䞋に倉化したす。最終結果は、垞に 60〜61.2 60 * 1.02 の間でスラむドする7぀の呚波数のリストです。これはコヌラス゚フェクトず呌ばれたす、たた倉数名chorusです。

  • 倉数 chorus を LFSaw.ar の freq ずしお䜿甚するず、マルチチャンネル拡匵が発生したす。これで、わずかに異なる呚波数を持぀7぀のノコギリ波ができたした。

  • 倉数 filtermod は、非垞にゆっくり16秒間に1サむクル動く正匊波 oscillator であり、出力範囲は1〜10にスケヌリングされたす。これは、ロヌパスフィルタヌのカットオフ呚波数を倉調するために䜿甚されたす。

  • 倉数 snd は、ロヌパスフィルタヌLPFを保持したす。LPF は、入力ずしお゜ヌスを取埗し、カットオフ呚波数を超えるすべおの呚波数をフィルタヌ凊理したす。このカットオフは固定倀ではなく、匏 freq * filtermod です。したがっお、freq = 60 を想定した䟋では、これは60〜600の数倀になりたす。filtermod は1〜10の間で振動する数倀であるため、乗算は 60 *(1〜10) になりたす。

  • LPF は、マルチチャネルも7぀のコピヌに拡匵したす。振幅゚ンベロヌプ env もそこに適甚されたす。

  • 最埌に、Splay はこの7぀のチャンネルの配列を取り、ステレオにミックスダりンしたす。

39.3 Under the hood

最初に SynthDef を䜜成し䞀意の名前で、次に aSynth を呌び出すずいうこの2段階のプロセスは、{SinOsc.ar} .play のような単玔なステヌトメントを蚘述するずきにSCが垞に行うこずです。 SuperCollider は、それをa䞀時的な SynthDef の䜜成、およびb即時再生したがっお、Post りィンドりに衚瀺される temp_01、temp_02 ずいう名前に解凍unpacksしたす。あなたの䟿宜のために、それらはすべお舞台裏で。

// これをするずき:
{SinOsc.ar(440)}.play;
// SCがやっおいるのはこれ:
{Out.ar(0, SinOsc.ar(440))}.play;
// 実際にはこういうこずです:
SynthDef("tempName", {Out.ar(0, SinOsc.ar(440))}).play;

// そしお、それらはすべお、この2ステップ操䜜ぞのショヌトカットです:
SynthDef("tempName", {Out.ar(0, SinOsc.ar(440))}).add; // シンセ定矩を䜜成する
Synth("tempName"); // play it

40 Pbind can play your SynthDef

SynthDefs ずしおシンセを䜜成するこずの矎しさの1぀は、Pbind を䜿甚しおそれらを再生できるこずです。 "wow" SynthDef がただメモリにロヌドされおいるず仮定しお最埌の䟋の埌でSCを終了しお再床開いた堎合を陀き、以䞋の Pbinds を詊しおください:

(
Pbind(
\instrument, "wow",
\degree, Pwhite(-7, 7),
\dur, Prand([0.125, 0.25], inf),
\amp, Pwhite(0.5, 1),
\wowrelease, 1
).play;
)

(
Pbind(
\instrument, "wow",
\scale, Pstutter(8, Pseq([
Scale.lydian,
Scale.major,
Scale.mixolydian,
Scale.minor,
Scale.phrygian], inf)),
\degree, Pseq([0, 1, 2, 3, 4, 5, 6, 7], inf),
\dur, 0.2,
\amp, Pwhite(0.5, 1),
\wowrelease, 4,
\legato, 0.1
).play;
)

Pbind を䜿甚しおカスタム SynthDef の1぀を再生するずきは、次の点に泚意しおください:

  • Pbind key\instrumentを䜿甚しお、あなたの SynthDef の名前を宣蚀したす。

  • SynthDef のすべおの匕数は、Pbind 内郚からアクセスおよび制埡できたす。 それらを Pbind キヌずしお䜿甚するだけです。たずえば、䞊蚘で䜿甚した \wowrelease ずいう匕数に泚目しおください。wow これは Pbind が理解するデフォルトのキヌの1぀ではなく、シンセ定矩の固有のキヌです倉な名前は意図的に遞択されおいたす。

  • Pbind のすべおのピッチ倉換機胜 \degree、\note、および \midinote のキヌを䜿甚するには、SynthDef に freq の匕数入力があるこずを確認したすそのように正確に入力する必芁がありたす。Pbind が蚈算を行いたす。

  • Env.adsr などサスティヌン゚ンベロヌプを䜿甚する堎合、シンセにデフォルトの匕数 gate = 1 が蚭定されおいるこずを確認しおください Pbind は舞台裏で適切なタむミングでノヌトを停止するため、そのように正確に入力する必芁がありたす。

  • サスティヌン゚ンベロヌプを䜿甚しおいない堎合、SynthDef に適切な UGen に doneAction2 が含たれおいるこずを確認しお、サヌバヌ内のシンセノヌドを自動的に解攟したす。

挔習1぀以䞊の Pbind を䜜成しお、以䞋に瀺す "pluck" SynthDef を再生したす。mutedString 匕数には、0.1〜0.9の倀を詊しおください。Pbind の1぀に、ゆっくりしたコヌドのシヌケンスを再生させたす。\strum で和音をアルペゞ゚むトしおみおください。

(
SynthDef("pluck", {arg amp = 0.1, freq = 440, decay = 5, mutedString = 0.1;
var env, snd;
env = Env.linen(0, decay, 0).kr(doneAction: 2);
snd = Pluck.ar(
	in: WhiteNoise.ar(amp),
    trig: Impulse.kr(0),
	maxdelaytime: 0.1,
	delaytime: freq.reciprocal,
	decaytime: decay,
	coef: mutedString);
	Out.ar(0, [snd, snd]);
}).add;
)

41 コントロヌル Bus

このチュヌトリアルの前半で、オヌディオ busセクション30ずバスオブゞェクトセクション33に぀いお説明したした。オヌディオルヌティングの抂念に焊点を合わせるために、圓時のコントロヌルバスのトピックは別ずしおおきたした。 SuperCollider のコントロヌル bus は、オヌディオではなくコントロヌル信号をルヌティングするためのものです。この違いを陀いお、オヌディオ bus ずコントロヌル bus の間に実甚的たたは抂念的な違いはありたせん。

コントロヌル bus の䜜成ず管理は、オヌディオバスで行うのず同じ方法で、.ar の代わりに .kr を䜿甚するだけです。SuperCollider には、デフォルトで4096個のコントロヌル bus がありたす。 以䞋の䟋の最初の郚分では、デモンストレヌションのためだけに任意の bus 番号を䜿甚したす。2番目の郚分では、bus の䜜成に掚奚されるBusオブゞェクトを䜿甚したす。

// コントロヌル bus 55にコントロヌル信号を曞き蟌む
{Out.kr(55, LFNoise0.kr(1))}.play;
// コントロヌル bus 55からコントロヌル信号を読み取る
{In.kr(55).poll}.play;

// Busオブゞェクトの䜿甚
~myControlBus = Bus.control(s, 1);
{Out.kr(~myControlBus, LFNoise0.kr(5).range(440, 880))}.play;
{SinOsc.ar(freq: In.kr(~myControlBus))}.play;

次の䟋は、2぀の異なるシンセを同時に倉調するために䜿甚される単䞀のコントロヌル信号を瀺しおいたす。Blip シンセでは、制埡信号は1から10たでの倍音の数をコントロヌルするために再スケヌリングされたす。2番目のシンセでは、同じコントロヌル信号がパルスオシレヌタの呚波数を倉調するために再スケヌリングされたす。

// コントロヌル bus を䜜成する
~myControl = Bus.control(s, 1);

// コントロヌル信号を bus に送りたす
c = {Out.kr(~myControl, Pulse.kr(freq: MouseX.kr(1, 10), mul: MouseY.kr(0, 1)))}.play;

// コントロヌルされおいる音を再生する
// マりスを動かしお倉曎を聞く
(
{
	Blip.ar(
		freq: LFNoise0.kr([1/2, 1/3]).range(50, 60),
		numharm: In.kr(~myControl).range(1, 10),
		mul: LFTri.kr([1/4, 1/6]).range(0, 0.1))
}.play;

{
	Splay.ar(
		Pulse.ar(
			freq: LFNoise0.kr([1.4, 1, 1/2, 1/3]).range(100, 1000) * In.kr(~myControl).range(0.9, 1.1),
			mul: SinOsc.ar([1/3, 1/2, 1/4, 1/8]).range(0, 0.03))
)
}.play;
)

// 比范するコントロヌル信号をオフにする
c.free;

41.1 asMap

次の䟋では、メ゜ッド asMap を䜿甚しお、制埡バスを実行䞭のシンセノヌドに盎接マップしたす。この方法では、シンセの定矩に In.kr も必芁ありたせん。

// SynthDef を䜜成する
SynthDef("simple", {arg freq = 440; Out.ar(0, SinOsc.ar(freq, mul: 0.2))}).add;
// コントロヌル bus を䜜成する
~oneBus = Bus.control(s, 1);
~anotherBus = Bus.control(s, 1);
// Start controls
{Out.kr(~oneBus, LFSaw.kr(1).range(100, 1000))}.play;
{Out.kr(~anotherBus, LFSaw.kr(2, mul: -1).range(500, 2000))}.play;
// Start a note
x = Synth("simple", [\freq, 800]);
x.set(\freq, ~oneBus.asMap);
x.set(\freq, ~anotherBus.asMap);
x.free;

42 実行の順序

セクション30でオヌディオバスに぀いお議論するずき、実行順序の重芁性を瀺唆したした。 以䞋のコヌドは、セクション30のフィルタヌ凊理されたノむズの䟋の拡匵バヌゞョンです。以䞋の説明では、実行順序の基本抂念を説明し、実行順序が重芁である理由を瀺したす。

// audio bus を぀くる
~fxBus = Bus.audio(s, 1);
~masterBus = Bus.audio(s, 1);
// SynthDef を぀くる
(
	SynthDef("noise", {Out.ar(~fxBus, WhiteNoise.ar(0.5))}).add;
	SynthDef("filter", {Out.ar(~masterBus, BPF.ar(in: In.ar(~fxBus), freq: MouseY.kr
(1000, 5000), rq: 0.1))}).add;
SynthDef("masterOut", {arg amp = 1; Out.ar(0, In.ar(~masterBus) * Lag.kr(amp, 1))}).
add;
)
// ノヌドツリヌりィンドりを開く:
s.plotTree;
// synth をプレむノヌドツリヌを芋たす
m = Synth("masterOut");
f = Synth("filter");
n = Synth("noise");
// マスタヌボリュヌム
m.set(\amp, 0.1);

最初に、倉数 ~fxbus および ~masterBus に割り圓おられた2぀のオヌディオ bus 。 次に、3぀の SynthDef が䜜成されたす:

  • 「ノむズ」は、ホワむトノむズを゚フェクト bus に送信するノむズ゜ヌスです;

  • 「フィルタヌ」は、゚フェクト bus から入力を受け取り、凊理されたサりンドをマスタヌ bus に送信するバンドパスフィルタヌです;

  • 「masterOut」は、マスタヌ bus からの信号を受け取り、単玔なボリュヌムコントロヌルを適甚しお、音量を調敎した最終的なサりンドをスピヌカヌに送信したす;

シンセを順番に実行しながらノヌドツリヌを確認したす。 [ノヌドツリヌ]りィンドりのシンセノヌドは、䞊から䞋に実行されたす。デフォルトでは、最新のシンセがトップに远加されたす。図9では、「ノむズ」が䞊、「フィルタヌ」が2番目、「masterOut」が最埌になっおいたす。これが正しい順序です。䞊から䞋に順に読みこみ、ノむズ゜ヌスはフィルタヌに流れ蟌み、フィルタヌの結果はマスタヌバスに流れ蟌みたす。

Figure09 Figure 9: Synth nodes in the Node Tree window

サンプルをもう䞀床実行しお、行 m、f、および n を逆の順序で評䟡しようずするず、信号が間違った順序で蚈算されるため、䜕も聞こえたせん。

正しい順序で正しい行を評䟡するこずは問題ありたせんが、コヌドが耇雑になるず、泚意が必芁になる堎合がありたす。この job を簡単にするために、SuperCollider では、ノヌドツリヌのシンセを配眮する堎所を明瀺的に定矩できたす。このために、target 匕数ず addAction 匕数を䜿甚したす。

n = Synth("noise", addAction: 'addToHead');
m = Synth("masterOut", addAction: 'addToTail');
f = Synth("filter", target: n, addAction: 'addAfter');

これで、䞊蚘の行をどの順序で実行しおも、ノヌドが正しい堎所に確実に収たるようになりたす。「ノむズ」シンセは、ノヌドツリヌの先頭に远加するように明瀺的に指瀺されたす。「masterOut」がテヌルに远加されたす; フィルタはタヌゲット n の盎埌に明瀺的に远加されたす103ノむズシンセ。

42.1 Groups

たくさんのシンセサむザヌを䜿い始めたら、そのうちのいく぀かは゜ヌスサりンド甚、その他ぱフェクト甚、たたは必芁なものは䜕でも、それらをグルヌプにたずめるこずをお勧めしたす。これが基本的な䟋です:

// NodeTree のすべおを監芖し続ける
s.plotTree;
// busを぀くりたす
~reverbBus = Bus.audio(s, 2);
~masterBus = Bus.audio(s, 2);
// groups を定矩
(
~sources = Group.new;
~effects = Group.new(~sources, \addAfter);
~master = Group.new(~effects, \addAfter);
)
// いっせいにすべおのシンセを実行
(
// One source sound
{
Out.ar(~reverbBus, SinOsc.ar([800, 890])*LFPulse.ar(2)*0.1)
}.play(target: ~sources);
// Another source sound
{
Out.ar(~reverbBus, WhiteNoise.ar(LFPulse.ar(2, 1/2, width: 0.05)*0.1))
}.play(target: ~sources);
// reverb です
{
Out.ar(~masterBus, FreeVerb.ar(In.ar(~reverbBus, 2), mix: 0.5, room: 0.9))
}.play(target: ~effects);
// マりスを䜿った愚かなマスタヌボリュヌムコントロヌル
{Out.ar(0, In.ar(~masterBus, 2) * MouseY.kr(0, 1))}.play(target: ~master);
)

実行順序の詳现に぀いおは、ヘルプファむル「Synth」、「Order of Execution」、および「Group」を参照しおください。

Part V

WHAT’S NEXT?

これたでにこのチュヌトリアルのすべおを読んで理解しおいれば、あなたはもはや SuperCollider の初心者ではありたせん 私たちは倚くの分野をカバヌしたした。ここからは、個人プロゞェクトの開発を開始し、独力で孊習を続けるために必芁なすべおの基本的なツヌルを手に入れたした。以䞋のセクションでは、いく぀かの䞀般的な䞭玚レベルのトピックに぀いお簡単に玹介したす。最埌のセクションでは、他のチュヌトリアルず孊習リ゜ヌスの簡朔なリストを瀺したす。

43 MIDI

MIDIの拡匵プレれンテヌションコンセプトや技は、このチュヌトリアルの範囲倖です。以䞋の䟋は、MIDIデバむスにある皋床粟通しおいるこずを前提ずしお、スタヌトするために提䟛されおいたす。

// 利甚可胜なすべおのデバむスをSCに接続する簡単な方法
MIDIIn.connectAll;

// すべおの受信MIDIメッセヌゞをすばやく衚瀺する方法
MIDIFunc.trace(true);
MIDIFunc.trace(false); // stop it

// すべおのCC入力をすばやく怜査する方法
MIDIdef.cc(\someCC, {arg a, b; [a, b].postln});

// CC 7、チャンネル0からのみ入力を取埗
MIDIdef.cc(\someSpecificControl, {arg a, b; [a, b].postln}, ccNum: 7, chan: 0);

// 簡単なテストのための SynthDef
SynthDef("quick", {arg freq, amp; Out.ar(0, SinOsc.ar(freq) * Env.perc(level: amp).
kr(2))}).add;

// キヌボヌドたたはドラムパッドから再生する
(
MIDIdef.noteOn(\someKeyboard, { arg vel, note;
	Synth("quick", [\freq, note.midicps, \amp, vel.linlin(0, 127, 0, 1)]);
});
)

// パタヌンを䜜成し、キヌボヌドから再生したす
(
a = Pbind(
	\instrument, "quick",
	\degree, Pwhite(0, 10, 5),
	\amp, Pwhite(0.05, 0.2),
	\dur, 0.1
);
)

// test
a.play;

// pad か keyboard で Trigger pattern 
MIDIdef.noteOn(\quneo, {arg vel, note; a.play});

よくある質問は、持続ノヌトのノヌトオンおよびノヌトオフメッセヌゞの管理方法です。぀たり、ADSR゚ンベロヌプを䜿甚する堎合、キヌが抌されおいる限り、各ノヌトを持続させる必芁がありたす。リリヌスは、指が察応するキヌから倖れた堎合にのみ行われたす必芁に応じお、ADSR゚ンベロヌプのセクションをレノュヌ。

そのためには、SuperCollider は単に各キヌに察応するシンセノヌドを远跡する必芁がありたす。次の䟋に瀺すように、そのために配列を䜿甚できたす。

// A SynthDef with ADSR envelope
SynthDef("quick2", {arg freq = 440, amp = 0.1, gate = 1;
	var snd, env;
	env = Env.adsr(0.01, 0.1, 0.3, 2, amp).kr(2, gate);
	snd = Saw.ar([freq, freq*1.5], env);
	Out.ar(0, snd)
}).add;

// MIDI keyboard でプレむする
(
var noteArray = Array.newClear(128); // 配列にはMIDIノヌトごずに1぀のスロットがありたす

MIDIdef.noteOn(\myKeyDown, {arg vel, note;
	noteArray[note] = Synth("quick2", [\freq, note.midicps, \amp, vel.linlin(0,127, 0, 1)]);
	["NOTE ON", note].postln;
});

MIDIdef.noteOff(\myKeyUp, {arg vel, note;
	noteArray[note].set(\gate, 0);
	["NOTE OFF", note].postln;
});
)
// PS. SC MIDI接続が行われおいるこずを確認しおください(MIDIIn.connectAll)

䞊蚘のコヌドを理解するために

  • SynthDef "quick2"はADSR゚ンベロヌプを䜿甚したす。gate 匕数は、ノヌトをオンたたはオフにする圹割を果たしたす。

  • 「noteArray」ず呌ばれる配列が䜜成され、再生されおいるノヌトを远跡したす。配列のむンデックスは、再生䞭のMIDIノヌト番号に察応するこずを意図しおいたす。

  • キヌボヌドでキヌが抌されるたびに、シンセの再生が開始されシンセノヌドがサヌバヌに䜜成されたす、そのシンセノヌドぞの参照は配列の䞀意のスロットに保存されたす。配列むンデックスは、単にMIDIノヌト番号そのものです。

  • キヌがリリヌスされるたびに、メッセヌゞ .set(\gate,0) が適切なシンセノヌドに送信され、ノヌト番号によっお配列から取埗されたす。

この短いMIDIデモでは、SuperCollider ぞのMIDIの導入に぀いおのみ説明したした。SuperColliderからMIDIメッセヌゞを取埗するには、MIDIOut ヘルプファむルをご芧ください。

44 OSC

OSCOpen Sound Controlは、ネットワヌクを介しお異なるアプリケヌション間たたは異なるコンピュヌタヌ間であらゆる皮類のメッセヌゞを通信するための優れた方法です。倚くの堎合、MIDIメッセヌゞよりもはるかに柔軟な代替手段です。ここで詳现に説明するスペヌスはありたせんが、次の䟋が出発点ずしお適切です。

デモの目暙は、OSCメッセヌゞをスマヌトフォンからコンピュヌタヌ、たたはコンピュヌタヌからコンピュヌタヌに送信するこずです。 受信偎コンピュヌタヌで、次の簡単なコヌドスニペットを評䟡したす:

(
OSCdef(
key: \whatever,
func: {arg ...args; args.postln},
path: '/stuff')
)

泚 [ctrl+.] を抌すず OSCdef が䞭断され、それ以䞊メッセヌゞを受信しなくなりたす。

44.1 別のコンピュヌタヌから OSC を送信する

これは、䞡方のコンピュヌタヌが SuperCollider を実行し、ネットワヌクに接続されおいるこずを前提ずしおいたす。受信偎コンピュヌタヌのIPアドレスを芋぀け、送信偎コンピュヌタヌで次の行を評䟡したす:

// メッセヌゞを送信するマシンでこれを䜿甚したす
~destination = NetAddr("127.0.0.1", 57120); // 宛先の正しいIPアドレスを䜿甚する
computer

~destination.sendMsg("/stuff", "heelloooo");

44.2 スマヌトフォンから OSC を送信する

  • 無料のOSCアプリを電話にむンストヌルしたすたずえば、gyrosc 。
  • 受信偎コンピュヌタヌのIPアドレスをOSCアプリに「target」ずしお入力したす。
  • SuperCollider の受信ポヌトを OSC アプリに入力したす通垞57120。
  • アプリが OSC の送信に䜿甚する正確なメッセヌゞパスを確認し、それに応じお OSCdef を倉曎したす。
  • 電話機がネットワヌクに接続されおいるこずを確認しおください。 電話機が適切なパスにメッセヌゞを送信しおいる限り、メッセヌゞがコンピュヌタヌに届くのを確認できたす。

45 Quarks ず plug-ins

他のナヌザヌが䜜成したクラスず UGen を远加するこずにより、SuperCollider の機胜を拡匵できたす。Quark は SuperCollider クラスのパッケヌゞであり、SuperCollider 蚀語でできるこずを拡匵しおいたす。UGen プラグむンは、SuperCollider オヌディオ合成サヌバヌの拡匵機胜です。

SuperColliderむンストヌルにプラグむンず Quark を远加する方法のを知るには、http//supercollider.sourceforge.net/ にアクセスしおください。「Using Quarks」ヘルプファむルも出発点ずしお適切です。http://doc.sccode.org/Guides/UsingQuarks.html

SuperCollider ドキュメントから、Quarks.gui を評䟡しお、䜿甚可胜なすべおのクォヌクのリストを衚瀺できたす新しいりィンドりで開きたす。

46 远加リ゜ヌス

これで、SuperCollider の玹介は終わりです。いく぀かの远加孊習リ゜ヌスを以䞋にリストしたす。Enjoy!

  • Eli Fieldsteel による優れたYouTubeチュヌトリアルシリヌズ。http://www.youtube.com/playlist?list=PLPYzvS8A_rTaNDweXe6PX4CXSGq4iEWYC.

  • Scott Wilson ず James Harkins による暙準のSC開始チュヌトリアルは、オンラむンおよび組み蟌みのヘルプファむルで利甚できたす。http://doc.sccode.org/Tutorials/Getting-Started/00-Getting-Started-With-SC.html

  • Nick Collins のオンラむンチュヌトリアル: http://composerprogrammer.com/teaching/supercollider/ sctutorial/tutorial.html

  • 公匏の SuperCollider メヌリングリストは、倚数のナヌザヌから友奜的な助けを埗るための最良の方法です。初心者の方はこのリストの質問を歓迎したす。こちらからサむンアップできたす。http://www.birmingham.ac.uk/facilities/BEAST/research/supercollider/mailinglist.aspx

  • あなたの街で SuperCollider ミヌトアップグルヌプを芋぀けおください。公匏の sc-usersスヌパヌコラむダヌナヌザヌズメヌリングリストは、あなたが䜏んでいる堎所があるかどうかを知る最良の方法です。お䜏たいの地域にミヌトアップグルヌプがない堎合は、グルヌプを始めおください

  • たくさんの興味深いコヌドスニペットがここにありたす。

    http://sccode.org/ アカりントにサむンアップしお、コヌドも共有しおください。

  • SuperCollider のツむヌトを聞いたこずがありたすか http://supercollider.github.io/community/sc140.html

Notes

  1. 最初の質問2番目の Pseq の繰り返し匕数ずしお inf の代わりに数倀1を䜿甚するず、Pbind は6぀のノヌトが挔奏された埌぀たり、デュレヌション倀の完党なシヌケンスが実行された埌に停止したす。2番目の質問Pbind を氞遠にプレむするには、すべおの内郚パタヌンの繰り返し倀ずしお inf を䜿甚したす。

  2. ​ aPwhite(0, 10) は、0から10たでの任意の数を生成したす。Prand([0, 4, 1, 5, 9, 10, 2, 3], inf) は、いく぀かの数を持぀リストからのみ遞択したす 0から10の間ですが、すべおではありたせん6、7、8が存圚しないため、このPrandには発生したせん。

    ​ b技術的には、0から100たでのすべおの数字のリストを提䟛する堎合、Prand を䜿甚できたすが、このタスクに Pwhite を䜿甚する方が合理的ですPwhite(0, 100)。

    ​ cPrand([0, 1, 2, 3], inf) は、リストからアむテムをランダムに遞択したす。Pwhite(0, 3) は、異なる方法で同じ皮類の出力に到達したす。0〜3の敎数の乱数を生成したす。これは、䞊の Prand ず同じオプションのプヌルになりたす。ただし、Pwhite(0, 3.0) を蚘述するず、出力が異なりたす。 Pwhiteの入力匕数の1぀はfloat(3.0)ずしお曞き蟌たれるため、0.154、1.0、1.45、2.999など、1〜3の浮動小数点数を出力するようになりたした。

    ​ d最初の Pbind は32音8音のシヌケンスの4倍を挔奏したす。2番目の Pbind は4぀のノヌトのみを再生したすリストから遞択された4぀のランダムな遞択肢 Pseq ずは異なり、Prand はリストからすべおのノヌトを再生する矩務を負わないこずを思い出しおください。3番目ず最埌の Pbind は、最初ず同様に32音を挔奏したす。

  3. 最初の行配列 [1, 2, 3, "wow"] は受信オブゞェクトです。メッセヌゞは逆です。2行目文字列「hello」は受信オブゞェクトです。dup はメッセヌゞです。4は dup の匕数です。3行目3.1415は受信オブゞェクトです。round はメッセヌゞです。0.1は䞞めの匕数です。4行目100はレシヌバオブゞェクトです。 randはメッセヌゞです。最終行100.0はメッセヌゞrandの受信者であり、その結果は0から100の間の乱数です。その数倀は匕数0.01でメッセヌゞ round の受信者になるため、乱数は2぀の10進数の堎合に䞞められたす。次に、この結果がメッセヌゞの受信オブゞェクトになりたす 匕数4の dup は、その番号の4぀の重耇を持぀リストを䜜成したす。

  4. 関数衚蚘のみを䜿甚した曞き換え

    dup(round(rand(100.0)、0.01),4);
  5. こたえ: a) 24 b) [5; 5:123] [数字ず括匧の䞡方) c) LFSaw ラむン党䜓 d) Only one e) 0.4 f) 1 ず 0.3

  6. SinOsc は、-1〜+1の数倀を出力するため、バむポヌラです。LFPulse は出力範囲が0-1であるため、ナニポヌラです実際、LFPulse は特に0たたは1のみを出力し、その間には䜕もありたせん

  7. ゜リュヌション:

    a = {Out.ar(0, SinOsc.ar(freq: [800, 880], mul: LFPulse.ar([2, 3])))}.play;
  8. ​ (a) 倉数 lfn は、単に LFNoise2 を保持したす。LFNoise2 の圹割は、毎秒-1から+1たで新しい乱数を生成し、前の乱数からスラむドさせおすぐに新しい番号にゞャンプする LFNoise0 ずは異なりたすするこずです。この倉数 lfn の最初の䜿甚は、BPFの freq 匕数にありたすlfn.range(500, 2500) 。これは、-1から+1たでの数倀を取り、それらを500〜2500の範囲にスケヌリングしたす。これらの数倀は、フィルタヌの䞭心呚波数ずしお䜿甚されたす。これらの呚波数は、䞊䞋にスラむドする音です。最埌に、再床 lfn を䜿甚しお、panner Pan2 の䜍眮を制埡したす。数倀は既に必芁な範囲-1〜+1にあるため、 .range メッセヌゞなしで盎接䜿甚されたす。これの良い結果は、呚波数の倉化を䜍眮の倉化ず結び぀けるこずです。どうやっお LFNoise2 は1秒ごずに新しい乱数に向かっおスラむドし始め、これがフィルタヌの呚波数ずパン䜍眮の同期した倉化になりたす。各堎所に2぀の異なる LFNoise2 がある堎合、倉曎は無盞関になりたすこれも問題ないかもしれたせんが、異なる聎芚の結果です。

    ​ (b) mul: of 1は、あたりにも゜フトすぎたす。フィルタヌは非垞にシャヌプであるため、元の信号から非垞に倚くを取り去り、振幅が倧幅に䜎䞋したす。信号を適床に聞こえる範囲に戻す必芁があるため、BPFラむンの最埌に mul: 20 がありたす。

    ​ (c) リズムは、sawのmul: 匕数である LFPulse によっお駆動されたす。LFPulse 呚波数1秒あたりのパルス数は、1〜10の数倀を生成する LFNoise1 によっおコントロヌルされたすそれらの間を補間したす。これらの数倀は、このパッチの「1秒あたりのノヌト数」です。