Sonic Pi(ソニックパイ)へようこそ。これから説明するクレイジーな音造りに、あなたも夢中になることを願っています。音楽、シンセ、プログラミング、作曲、演奏など、これから学ぶことは、本当に刺激的なものになるでしょう。
でも、ちょっと待ってください。まずは自己紹介が必要でしたね。失礼いたしました!私は、Sonic Piを作成したSam Aaronといいます。 Twitter上の@samaaronで見つけることができますので、連絡くれるとうれしいです。もしかすると、 僕が観客の前で演奏しているライブコーディングのバンドMeta-eXにも興味を持ってもらえるかもしれません。Meta-eXの演奏の中で使っているトラックの一つを、Sonic Piの例の中で見つけることができます。
Sonic Piを改善するために、気づいたことや、アイデアでを持っていたら、是非、知らせてください。 フィードバックはとても役立ちます。あなたのアイデアが次の重要な機能になるかもしれません!
最後に、このチュートリアル(使いかた)は、カテゴリ別にグループ化されたセクションに分かれています。 始まりから終わりまで、簡単に学べるように手引きを書いたので、自由に、色々なセクションを覗いてみてください。 何か、不足している点に気がついたら、将来のバージョンのために検討したいので、知らせてください。
では、早速はじめましょう!
Sonic Piの最もエキサイティングな側面のひとつは、まるでギターをライブで演奏するかのように、 ライブでコードを書いて音楽を作ることができることです。つまり、ステージやコンサートでSonic Piが 使えるということです!
これからチュートリアルで、実際のSonic Piの詳しい使い方に入る前に、まず、 ライブコーディングがどんなものか体験してみましょう。あまり(もしくは全然)わからなくても、 心配ご無用!そのまま席についたまま、楽しんでいきましょう。
さぁ、はじめましょう!下のコードを上の空欄のWorkspace(ワークスペース)にコピーしてみましょう。
live_loop :flibble do
sample :bd_haus, rate: 1
sleep 0.5
end
左上のRun
(再生)ボタンを押すと、いい感じの速さでバスドラムの音が聞こえてきます。
Stop
(停止)ボタンを押せば、いつでも音を止めることができます。ですが、
まだStop
(停止)ボタンを押さずに、次のステップを実行しましょう。
sleep
の値を、0.5
から、1
より大きい値に書き換えてみましょう。Run
(再生)ボタンをもう一度押します。これは簡単でした。では他の要素を加えてみましょう。sample :bd_haus
の上に、
sample :ambi_choir, rate: 0.3
を追加してみます。コードはこのようになるはずです。
live_loop :flibble do
sample :ambi_choir, rate: 0.3
sample :bd_haus, rate: 1
sleep 1
end
では、ちょっと遊んでみましょう。値を変えてみてください。大きな値、小さな値、もしくはマイナスの値にしたとき、
何が起こるでしょうか?では、:ambi_choir
の rate:
の値をほんの少し(0.29などに)変えた時、どうなるでしょう?
sleep
の値をすごく小さくすると、どうでしょう?操作が速すぎると、エラーが出て
コンピュータが止まってしまいます。これはコンピュータがついていけないからです。
(そんな時は、より大きい値を sleep
に設定してRun
ボタンをもう一度押しましょう。)
では、sample
の行に #
をつけることで、 「コメント」してみてください。
live_loop :flibble do
sample :ambi_choir, rate: 0.3
# sample :bd_haus, rate: 1
sleep 1
end
コンピュータに#をつけた行を無視するよう命令したので、聞こえませんね。これはコメントと呼ばれます。 Sonic Piでは、要素を削除したり追加したりするのにコメントを使います。 最後に、楽しむための技をお伝えしましょう。以下のコードを、上の空欄のWorkspace(ワークスペース)にコピーします。 そして、2つは同時にループ(繰り返し)します。まずは精一杯、体験して楽しみましょう!
いくつかを試してみましょう。
rate:
の青い値を変更し、sample
の音が変わることを聞いてみましょう。sleep
の時間を変更し、それぞれのループを異なる速度で繰り返すのを聞いてみましょう。sample
の行のコメントを解除して( #
を削除)、ギターの逆再生を楽しみましょう。mix:
の値を0
(最小値) から 1
(最大値)の間で変えてみましょう。Run
ボタンを押し、次に繰り返しがどう変化したかに耳を傾けることを忘れないでください。
うまくいかなくても気にしないでください。Stop
ボタンを押して、Workspace内のコードを削除して、
新しいコードをコピーアンドペーストして、再び演奏の準備をすれば良いです。
失敗することがどんなことよりも学習の近道になるのですから。
live_loop :guit do
with_fx :echo, mix: 0.3, phase: 0.25 do
sample :guit_em9, rate: 0.5
end
# sample :guit_em9, rate: -0.5
sleep 8
end
live_loop :boom do
with_fx :reverb, room: 1 do
sample :bd_boom, amp: 10, rate: 1
end
sleep 8
end
さあ、これらが実際にどう動くか好奇心が動き出すまで、 そしてあなたが次に何をしたらいいかを知りたくなるまで、演奏と実験を続けましょう。 さあ、残りのチュートリアルを読む準備ができました。
次にあなたを待っているものは・・・
Sonic Piは、音楽をコーディング(記述)するための とてもシンプルなインターフェース(操作画面)を持っています。 ちょっと見てみましょう。
ここにあるグリーンのボタンで、音を再生したり停止するための主要な操作ができます。 Runボタンは編集画面内のコードを実行します。Stopボタンですべてのコードの動作を停止します。 Saveボタンは外部ファイルにコードを保存し、Recordボタンは演奏中の音を (WAV ファイルに)録音します。
これらのオレンジ色のボタンで編集画面を操作します。 Size +とSize -ボタンは文字サイズを大きくしたり小さくします。 Align ボタンはより専門的で見やすいコードに整えてくれます。
これらの青いボタンで、情報、ヘルプや設定にアクセスします。Info ボタンは、 概要、コア、協力者、コミュニティ、ライセンス、ヒストリーといったSonic Pi自体についての情報を画面に表示します。 HelpボタンはFのヘルプシステム表示を切り替えます。 またPrefsボタンは基本的なシステムを操作するための設定画面の表示を切り替えます。
ここでは音楽を作曲/演奏したりするためのコードを書く領域です。コードを書いたり、消したり、 切り取り、貼り付けなどを行うためのシンプルな編集画面です。Google Docsやワードの基礎版だと思ってください。 編集画面ではコードの意味合いに応じて自動で色つけします。はじめは変わっていると思うかもしれませんが、 とても使いやすくなるはずです。例えば、数値は青色で示されます。
コードを走らせた時、ログ画面にはプログラムがどうなっているかについての情報が表示されます。 既定では、正確な再生時間を毎音ごとにメッセージとして見ることができます。 コードのデバッグ(欠陥を取り除く作業)に利用でき、コードが何をしているかを理解することにも役立ちます。
最後は、SonicPiインターフェースのもっとも重要な部分の一つである、画面の下にあるヘルプシステムです。 青いHelpボタンによって表示/非表示を切り替えることができます。 ヘルプシステムは、ヘルプと情報を含んでいます。このチュートリアル、入手できるシンセのリスト、 サンプルや実例、効果のリスト、そして音楽をコーディングするために備えているSonic Piの 全機能のリストといった、Sonic Piの全てについてのヘルプと情報があります。
SonicPiは、遊びと実験を通して、コンピューティングと音楽の両方を学ぶ手助けをしてくれます。 もっとも大切なことは、楽しむこと。そうすれば、コードや作曲、演奏を、学ぶ前に自然と身につけられるでしょう。
この章の間に、何年も音楽とライブコーディングを学んできた私から、 ちょっとアドバイスを。
「間違いはない、あるのはただ可能性だけ。」
これは、しばしばジャズについて言われることですが、ライブコーディングにも同様に言えることです。 経験に関係なく、あなたが全くの初心者でも、熟練のコーディング使いでも、作り出すコードが まったく予期せぬ結果になることがあります。めちゃくちゃクールに聞こえる場合は、そのコードを実行すればいいのですが、しかし、すごく耳障りで場違いに聞こえる場合もあります。 ですが、そうなっても問題ではありません。重要なのは、あなたが次にすべきことです。 音を取り除き、それを操作し、素晴らしいものに変化させるのです。観衆は熱狂するでしょう。
学習していると、今すぐすごいことをしたい気持ちに駆られます。しかし、今はその気持ちをこらえ、 それは後に到達する遠い目標として持ってください。今のところは、あなたの頭の中にあるすごいことに向かう 価値ある小さな一歩として、楽しくやりがいをもって書くという「最も単純な事」を考えていきましょう。 一度、その誠実に学ぶイメージを持って、試し、それを構築し、そして再生していけば、斬新なアイデアを与えてくれるでしょう。 すぐに、あなたは、楽しみながら、確実に上達をすることに大忙しになっているでしょう。
でも、みんなと作品をシェア(共有)することは忘れないでください!
Sonic Piの紹介はこれくらいにして、さっそく音を試してみましょう!
この章では、基本的なシンセ(synth)の出し方と操作方法を紹介します。シンセは、 音を作り出すシンセサイザーという響きのよい言葉を短縮したものです。典型的なシンセは、 非常に使うのが複雑です。特にアナログのシンセは、沢山のパッチワイヤーとモジュールがついています。 ですが、Sonic Piでは、とても簡単で親しみやすい方法で、このシンセの力を手に入れることが出来ます。
Sonic Piの分かりやすくシンプルな操作画面に騙されないでください。 もし使いこなせたら、洗練されたサウンド操作を可能にします。きっと驚くはずです。
下記のコードをみてください:
play 70
ここからすべてが始まります。アプリの上部のコードウィンドウ(実行ボタンの下に大きな空白)にコピーして貼り付けます。そして、左上のRunボタンを押してみましょう。
ビックリした?もう一回、押してみましょう。そしてもう一回..。
わお!すごい!一日中楽しんで入られそうだけど、でも待って。 ビープ音の無限の流れに夢中になる前に、数値を変えてみましょう。
play 75
違いが分かりますか?より低い値も試してみましょう。
play 60
つまり、より低い値は低い音程(ピッチ)の音を、より高い値は高い音程(ピッチ)の音を鳴らします。
ちょうどピアノのように、低い部分の鍵盤(左手側)が低い音階を演奏し、高い部分の鍵盤(右手
側)が高い音階を奏でます。実は、数値は実際にピアノの鍵盤と関係しています。play 47
は、実はピアノの47番目の鍵盤を演奏することを意味しています。play 48
は一音上がる(右隣りの鍵盤)ということです。第4オクターブはCの60ということになります。
続いて、play 60
を鳴らしてみましょう。
もし、これがあたなにとって何の意味かわからなくても心配しないでください。 わたしも始めた時は同じでした。いま重要なことは、低い数値は低い音を、高い数値は高い音を生み出す、ということを知っておくことです。
音符を奏でることはとても楽しいですが、同時にたくさんの音符を鳴らすとさらに楽しくなります。 これを試してみましょう。
play 72
play 75
play 79
華やかです!複数のplay
を書くと、全て同時に演奏されます。自分で試してみましょう.
どの数値がいい組み合わせでしょうか?どれがひどい音?経験、探求しながら、自分自身で
見つけていきましょう。
音符と和音を演奏するのは楽しいですね。でも、メロディーの演奏はどうすればよいでしょうか?
一音ずつ、同時ではなく演奏したい場合は?それは簡単です。音符の間にsleep
を入れば可能です。
play 72
sleep 1
play 75
sleep 1
play 79
なんて素敵なアルペジオ(和音を続けて弾くこと)!では、sleep 1
の1
は何を意味するのでしょうか?これは一拍休む、という意味ですが、とりあえず今は、一秒休む、と考えま
しょう。では、アルペジオをもう少し早くしたいと思ったら?それは、短い値を使えばよいのです。
例えば半分の値0.5
ではどうでしょう?
play 72
sleep 0.5
play 75
sleep 0.5
play 79
早くなりましたね。では、自分で時間を変えてみましょう。違う時間と音符を使ってみましょう。
たとえばplay 52.3
や play 52.63
のような中間的な値でも演奏してみてください。
通常の全音符で演奏し続ける必要は、まったくありません。遊んで、楽しみましょう。
みなさんの中で、すでにいくつかの音楽記号を知っている人は、たとえば C とか F# などを使って メロディーを書きたいかも知れません(もしそうでなければ心配無用です、それを楽しむ必要はあり ません)。Sonic Piはそれをカバーしてくれます。以下のことをやってみましょう。
play :C
sleep 0.5
play :D
sleep 0.5
play :E
演奏する音階の前にコロン’:’を入れることを忘れないでください。コロンを置くと、Cが:C
のように色が変わります。
また、音名のあとに数値を追加してオクターヴを指定することもできます。
play :C3
sleep 0.5
play :D3
sleep 0.5
play :E4
半音♯(シャープ)にしたい場合は、’play :Fs3’のように音名の後に’s’を追加します。 半音♭(フラット)にしたい場合は、’play :Eb3’のように’b’を追加します。
夢中になって、自分の曲を作って楽しみましょう。
Sonic Piはあらゆる音を作りだし、コントロールするためのオプションの全てを提供します。 どんな音符を演奏するのか、そしてどんなサンプルをトリガー(きっかけ)にするのかはあなた次第です。 このチュートリアルでは、これらの多くをカバーするそれぞれについての詳細なドキュメントが ヘルプシステムにあります。しかし、これから最も有用なのうちの2つ、Amplitude(振幅)とPan(パン)を紹介します。 まずはオプションを見てみましょう。
Sonic Piはシンセのためにオプションという概念を備えています。
オプションは、あなたが耳にするサウンドの特徴をコントロールしたり、
変更するための手段で、演奏に反映されます。シンセはそれぞれ細かく音を
チューニングするためのオプションを持っています。
Sonic Piには、amp:
(音量)やエンベロープ・オプション(ほかのセクションで紹介します)のような、
多くのサウンドに共通するオプションを持っています。
オプションには2つの主要な役割があり、ひとつはその名前(制御の名前)、もうひとつは
数値(あなたが制御したい値)です。例えば、cheese:
いうオプションがあったとして、
1
の値にセットしたいとします。
オプションは、playの後にカンマ
,を入れて、その後、
amp:`(コロン : を忘れずに)のような
オプションの名前、スペース、そしてオプションの値、というように渡していきます。例えば、
play 50, cheese: 1
(cheese: は無効なオプションです。例として使っています。)
カンマを使って区切り、複数のオプションを使用することができます。
play 50, cheese: 1, beans: 0.5
オプションの順番は問題ではないので、以下は同じものです。
play 50, beans: 0.5, cheese: 1
シンセで認識されないオプションは無視されます(cheese
(チーズ)とbeans
(豆)などは明らかに馬鹿げた名前でしょう!)
もし偶然同じオプションを2回、違う値で使った場合は、最後のものが有効になります。
例えば、ここでのbeans:
は、0.5 ではなく 2 の値が採用されます。
play 50, beans: 0.5, cheese: 3, eggs: 0.1, beans: 2
Sonic Piの中の命令には多くのオプションが用意されているので、その使い方に ちょっとだけ時間を使って、習得しましょう!
それでは最初のオプションamp:
で演奏してみましょう。
アンプは音の大きさをコンピュータで表したものです。高アンプは大きな音を生成し、 低アンプは静かな音を生み出します。Sonic Piは時間と音符を数字を使って表現するので、 アンプにも数字を使用します。1 の値が通常の音量であるのに対して、0はサイレントです(何もきこえませんよ)。 2、10、100 というふうに、アンプを上げることができます。ただし、全体の音を増幅しすぎると、 大きな音になりすぎないように、Sonic Piはコンプレッサー(圧縮)と呼ばれる 効果を使用して確実な音量に抑えることを覚えておいてください。これは多くの場合、音がこもって 奇妙に聞こえます。ですから、圧縮を防ぐために0から0.5のような値で使用してみてください。
音の大きさを変えるために、 amp: オプションを使います。 例として、半分の音量で演奏するために、0.5 にしてみます。
play 60, amp: 0.5
倍の音量で演奏するために、2 にしてみます。
play 60, amp: 2
amp:
オプションは、関連付けられているplay
への命令だけを変更します。
ですから、この例では、最初の命令は半分の音量になり、次にはデフォルト(1の値)に戻ります。
play 60, amp: 0.5
sleep 0.5
play 65
もちろん、それぞれの命令で異なったamp:
の値を設定して演奏することもできます。
~~~~
play 50, amp: 0.1
sleep 0.25
play 55, amp: 0.2
sleep 0.25
play 57, amp: 0.4
sleep 0.25
play 62, amp: 1
~~~~
もうひとつの面白いオプションはpan:
です。ステレオで音の位置を制御します。
左に音をパンすることは左のスピーカーから音が聞こえることを意味し、
右にパンすれば右のスピーカーから聞こえます。値としては、-1 は最も左、
0 は中心、1 は最も右、というようにステレオの領域で表現することができます。
もちろん、音の正確な位置をコントロールするために、-1 から 1 の間のどの値でも使用することができます。
左のスピーカーから音を鳴らしてみましょう。
play 60, pan: -1
では、右のスピーカーから鳴らします。
play 60, pan: 1
最後に元の通り、中心から鳴らしてみます(通常の位置です)。
play 60, pan: 0
では、続けてあなたの音のアンプやパンを変えて楽しんでみましょう!
これまで、ビープ音を鳴らして楽しんできました。けれども、 もしかするとあなたはこのベーシックなビープ音に退屈し始めているかも知れません。 これがSonic piが提供してくれるサウンドの全てなのでしょうか?もちろん、ビープ音だけではなくて、 もっと他にもたくさんのライブコーディングがありますよね?はい、あります。 この章ではSonic Piが作り出すエキサイティングな音の領域へと探検していきましょう。
Sonic Piは、シンセサイザーの略であるシンセと呼ばれる楽器の機能を持っています。 サンプルがすでに録音された音であるのに対して、シンセはあなたがそれをコントロールすることに応じて 新しいサウンドを生み出すことができます(このチュートリアルの後半でみていきます)。Sonic Piのシンセは、 パワフルで表現力に富んでいて、探索しながら演奏したり、楽しめるはずです。 最初に、ひとまずここでシンセを使うために、選び方を学んでみましょう。
面白い音は、ノコギリ(saw)波です。試してみましょう。
use_synth :saw
play 38
sleep 0.25
play 50
sleep 0.25
play 62
sleep 0.25
他の音prophetを試してみましょう。
use_synth :prophet
play 38
sleep 0.25
play 50
sleep 0.25
play 62
sleep 0.25
2つを一緒にしたらどうでしょう。一方のあとに、もう一方を。 ~~~~
use_synth :saw play 38 sleep 0.25 play 50 sleep 0.25 use_synth :prophet play 57 sleep 0.25
では同時に。
use_synth :tb303 play 38 sleep 0.25 use_synth :dsaw play 50 sleep 0.25 use_synth :prophet play 57 sleep 0.25 ~~~~
use_synth
コマンドは、 下のplay
にだけ影響していることに注意してください。
大きなスイッチのようなものだと考えてください。指定したどんなシンセでも、
新しいplay
へ命令として演奏されます。use_synth
で新しいシンセにスイッチすることができます。
演奏するために Sonic Piがどんなシンセを備えているかを見るには、左端のメニュー(効果 の上)にあるシンセオプションを見てください。20以上が用意されています。これらは、わたしのお気に入りの数種類です。
:prophet
:dsaw
:fm
:tb303
:pulse
音楽の中でシンセを切り替えて遊んでみてください。音楽の異なるセクションに違うシンセを使うように、 シンセを組み合わせて新しい音を作って楽しんでください。
前半のセクションでは、音を演奏したい時にどのようにsleep
コマンドを
使用するかを見てきました。ですが、わたしたちはまだ音のデュレーション(長さ)について
制御できていませんね。
音のデュレーションを制御するための、パワフルでシンプルな手段として、 Sonic PiにはADSR amplitude envelope(ADSR・アンプ・エンベロープ)という 概念があります(ADSRが何を意味するかはこのセクションの後半で紹介します)。 アンプ・エンベロープは制御のための便利な2つの側面を持っています。
デュレーションは音の持続する長さのことです。長いデュレーションは、より長く音が 鳴ることを意味します。Sonic Piの全てのサウンドは、アンプ・エンベロープで制御でき、 ひとつのエンベロープ(音量や音色の時間的な変化)の長さは、音の長さでもあります。
ADSRエンベロープは、デュレーションの制御だけでなく、アンプ(音量)の緻密な 制御も可能にします。全てのサウンドは、サイレント(無音)で始まり、間に音があり、 またサイレントで終了します。エンベロープを使用すると、サウンドの音がある部分の音量を スライドさせたり、保持したりすることができます。これは、音楽の音量を上げたり下げたり するのを、誰かに指示するような感じです。例えば、あなたは誰かに「無音で始めて、 ゆっくりとフル・ボリュームにして、少しそのままで、そして一気に無音に戻る。」と頼むとします。 Sonic Piはエンベロープでこれをプログラムできるようにしてくれます。
前のセクションで見てきたように、アンプの0
は無音、1
は通常の音量です。
では、エンベロープのそれぞれの部分を順番に見ていきましょう。
エンベロープのうちデフォルトで使われている唯一の部分はリリース・フェーズです。 通常、全てのシンセのリリース・フェーズ(終わるまでの時間)は1で、 これは終了するまでに1ビート(デフォルトBPMの60の場合には1秒)のデュレーションを持っているということです。
play 70
この音は1秒間だけ聞こえます。続いて時間を指定しよう。 上の記述は、次の明示的で長い記述を簡略化したものです。
play 70, release: 1
これも全く同じように(1秒間持続する)音が出たと思います。
しかし、release:
のオプションを変更することでとても簡単に
持続時間を変更することができるようになりました。
play 60, release: 2
また、非常に小さなリリース・フェーズの値を使って、シンセのサウンドをとても短くすることができます。
play 60, release: 0.2
音がリリースされるまでの持続時間はリリース・フェーズと呼ばれていて、 デフォルトではリニア・トランジション(直線的な移行、つまり真っ直ぐ)です。以下の図は、この移行を表したものです。
図の左端の縦の線は、サウンドが0
の音量(ゼロ・アンプ)からスタートしていることを示しています。
しかし、すぐにフル・アンプに上がります(これは私たちが後で学ぶ、アタック・フェーズというものです)。
いったんフル・アンプになり、それからrelease:
で指定した値を取りながら、直線的にゼロに下がります。
長いリリース・タイムは長いシンセ・フェード・アウト(徐々に消えること)を生成します。
これにより、リリース・フェーズを変更して、あなたのサウンドのデュレーションを 変えることができます。自分の音楽にリリース・タイムを追加して演奏してみましょう。
通常、アタック・フェーズは全てのシンセにおいて0
です。つまり、0
アンプから
1
にただちに移動することを意味します。シンセは最初から音が打たれます。
けれども、あなたは音をフェード・イン(徐々に大きく)したいかも知れません。 これは、attack:
のオプションで実現することができます。いくつかの音をフェード・インしてみましょう。
play 60, attack: 2
sleep 3
play 65, attack: 0.5
複数のオプションを使うこともできます。例えば、短いアタック、長いリリースに、変更してみましょう。
play 60, attack: 0.7, release: 4
この、短いアタックに長いリリースのエンベロープは、以下の図のように表します。
もちろん、ほかに変更することもできます。長いアタックに短いリリースを試してみましょう。
play 60, attack: 4, release: 0.7
そして、アタックとリリース両方短くして、短いサウンドにもできます。
play 60, attack: 0.5, release: 0.5
アタック・フェーズとリリース・フェーズの設定に付け加えて、サステイン・フェーズ(持続時間)を 指定することができます。サステイン・フェーズとは、アタックとリリースの間でフル・アンプの 音が鳴り続ける時間のことです。
play 60, attack: 0.3, sustain: 1, release: 1
サステイン・フェーズは、オプションのリリース・フェーズに入る前に、ミックスの中で主となる
存在感を与えたい重要なサウンドにとって有効です。もちろん、attack:
とrelease:
両方のオプションを
0に設定することもとても有効ですし、サウンドに対して、完全にフェード・インなし、
フェード・アウトなしにするためにサステインを使えば良いのです。けれど、注意してください、
0 のリリースはオーディオの中にクリック音を生成します。たいていの場合、0.2のような
ごく小さい値を使う方が良いです。
そして、今あなたがさらなる制御のレベルを必要としているならば、ディケイ・タイムというものを
設定することもできます。これは、アタックとサステインの間にくるエンベロープのフェーズで、
音量がattack_level:
からdecay_level:
(もしこれを明示的に指定しなければ、この値は sustain_level:
と同じ値に設定されます)に落ちる時間を指定します。
通常では、decay:
のオプションは 0 で、アタックとサステインのレベルは両方とも 1 です。ですから、ディケイ・フェーズで効果を得るには、アタック、サステインのレベルも指定しなくてはなりません。
play 60, attack: 0.1, attack_level: 1, decay: 0.2, sustain_level: 0.4, sustain: 1, release: 0.5
最後の仕掛けは、decay_level:
オプションがデフォルトではsustain_level:
と同じ値に設定されていて、エンベロープを完全に制御したい場合に明示的に別な値に設定できることです。
これにより次のようなエンベロープを作ることができるでしょう。
play 60, attack: 0.1, attack_level: 1, decay: 0.2, decay_level: 0.3, sustain: 1, sustain_level: 0.4, release: 0.5
またdecay_level:
をsustain_level:
より大きく設定することもできます。
play 60, attack: 0.1, attack_level: 0.1, decay: 0.2, decay_level: 1, sustain: 0.5, sustain_level: 0.8, release: 1.5
つまり要約すると、Sonic PiのADSRエンベロープには、以下のフェーズがあります。
attack_level
までの時間attack_level
からdecay_level
まで移行させる時間decay_level
からsustain_level
まで移行させる時間sustain_level
から 0 に移行させる時間サウンドのデュレーションは、これらのフェーズの合計であることに注意することが大切です。 したがって、以下のサウンドは 0.5 + 1 + 2 + 0.5 = 4 で、4秒のデュレーションになります。
play 60, attack: 0.5, attack_level: 1, decay: 1, sustain_level: 0.4, sustain: 2, release: 0.5
ではあなたのサウンドにエンベロープを追加して演奏してみましょう。
あなたの音楽を発展させる方法は他にもあります。すでに録音された音を使うことです。偉大なヒップホップの伝統では、これらのあらかじめ録音された音のことを、サンプルと呼びます。つまり、マイクを持って外に出て、雨が優しくキャンバスを打つ音を録音しに行けば、それだけでサンプルを作ることができます。
Sonic Piは、サンプルで楽しいことがたくさんできるようになっています。90以上のパブリック・ドメイン(著作権がない)サンプルが、ジャム(即興演奏)するために同梱されているだけでなく、自分で操作して演奏することも可能にしてくれるのです。さっそくみていきましょう。
ビープ音を演奏するのは最初だけです。もっと面白いのは、録音済みのサンプルを使うことです。やってみましょう。
sample :ambi_lunar_land
Sonic Jam は演奏のためにたくさんのサンプルを持っています。play
コマンドを使うようにサンプルを使えばよいのです。複数のサンプルで演奏するには、ひとつひとつ、順番に書いていきます。
play 36
play 48
sample :ambi_lunar_land
sample :ambi_drone
もし間を空けたいなら、 sleep を使います。
sample :ambi_lunar_land
sleep 1
play 48
sleep 0.5
play 36
sample :ambi_drone
sleep 1
play 36
最初のサウンドが終わる前に、次のサウンドが始まることに注意してください。sleep
コマンドは、サウンドの開始の間隔だけを記述しています。これによって、簡単にサウンドを重ね合わせて、おもしろいオーバー・ラップ(重複)のエフェクト(効果)を生み出すことができるのです。
このチュートリアルの後半で、エンベロープでサウンドのduration
(長さ)を制御する方法についてみていきます。
Sonic Piが収録しているサンプルの種類を知るには、2つの方法があります。一つ目は、このヘルプシステムを使うことです。下のメニューの中の、サンプル
をクリックし、カテゴリを選ぶと、使用できるなサウンドのリストが表示されます。
あるいは、オート・コンプリーション(自動補完)システムを使うこともできます。 sample :ambi_
のような複数のサンプルを束ねるグループ名をタイプし始めると、同じグループ内から選択できるサンプルの名前がドロップ・ダウンして表れます。以下のサンプル・グループの接頭語を入力してみましょう。
:ambi_
:bass_
:elec_
:perc_
:guit_
:drum_
:misc_
:bd_
さあ、あなたの曲でサンプルのミックスを始めてみましょう!
シンセの項目で見てきたように、パラメータで簡単にサウンドを制御することができます。
サンプルは全く同じパラメータの仕組みを備えています。何度も登場する、amp:
と
pan:
をもう一度見てみましょう。
シンセで使った書き方と全く同じ方法で、サンプルのアンプ(音量)を変えることができます。
sample :ambi_lunar_land, amp: 0.5
サンプルでpan:
のパラメータを使うこともできます。例えば、定番のドラムフレーズの
アーメン・ブレイクを左耳で聞いた後に、半分は通過して再度右耳で聞く方法です。
sample :loop_amen, pan: -1
sleep 0.877
sample :loop_amen, pan: 1
0.877 は、:loop_amen
サンプルの半分の再生時間であることに注意してください。
そして、use_synth_defaults
(あとで説明します)をシンセに設定している場合、
サンプルはこれを無視して再生します。
すでに私たちは、音楽を作るために様々なシンセやサンプルを演奏することができます。そろそろ、音楽をもっとユニークで面白くするために、シンセとサンプルを編集する方法を学ぶ時間です。まずは、サンプルを引き延ばしたり圧縮する方法をみてみましょう。
サンプルとは、あらかじめ録音されたサウンドで、サウンドを再生するためにスピーカーのコーン(振動板)をどう動かすかを表す数値が格納されています。スピーカーのコーンは行ったり来たり(振動)するため、数値は、その時々でコーンがどれくらいの距離を行ったり来たりすべきかをその時々で表す必要があります。録音された音を忠実に再生するために、サンプルは概して1秒間に何千もの数値を格納しておく必要があるのです!Sonic Piはこの数値のリストを使って、適切なスピードでサウンドを再生するための正しい方法をあなたのコンピューターのスピーカーに伝え、振動させるのです。けれども、サウンドを変えるためにスピーカーに与えられる数値のスピードを変えるのも楽しいですよ。
アンビエント・サウンドのひとつ、:ambi_choir
で演奏してみましょう。デフォルト(既定値)で演奏するには、sample
にrate:
のオプションを渡します。
sample :ambi_choir, rate: 1
これはデフォルト(既定値)のレート(速度)1で演奏するので、まだ何も変わったところはありません。ですが、数値を何か他の値に変えてもよいのです。0.5
はどうでしょう。
sample :ambi_choir, rate: 0.5
ワオ!何が起きたのでしょう?そう、2つのことが起こりました。一つ目は、サンプルは再生に2倍の時間をかけていました。二つ目は、サウンドは1オクターブ低くなっていました。もう少し詳しく、これらのことを探ってみましょう。
引き延ばしたり圧縮したりして楽しいサンプルは、定番のアーメン・ブレイクです。 通常のレートでは、ドラムン・ベース(音楽ジャンルのひとつ)のトラックを思わせます。
sample :loop_amen
:loop_amenですが、レート(速度)を変えると、音楽のジャンルが切り替わったように聞こえます。 半分のスピードにすると、オールドスクールのヒップホップに。
sample :loop_amen, rate: 0.5
スピードを上げると、ジャングルのジャンルになりますね。
sample :loop_amen, rate: 1.5
では、パーティーの最後の仕掛けに、マイナスのレートを使うと何が起きるでしょうか。
sample :loop_amen, rate: -1
ワオ!逆再生!いろいろな異なったサンプルで、異なったレートで演奏してみましょう。ものすごく速い数値や、おかしなくらいゆっくりになる数値を使って、どんなおもしろいサウンドを作れるか、試してみましょう。
サンプルは、バネのように考えると便利です。再生速度(プレイバック)は、バネを縮めたり伸ばしたりするようなものです。もしサンプルをレート 2 で再生した場合、通常の長さの半分に、バネを縮めることになります。ですので、サンプルは半分の時間で演奏するので、より短くなります。もしサンプルを半分のレートで再生した場合、2倍の長さにバネを伸ばすことになります。そのため、サンプルは再生に2倍の時間をかけるため、より長くなるのです。もっと縮める(レートを上げる)と、短く再生され、さらに伸ばす(レートを下げる)と、さらに長く再生されます。 バネを縮めることは、その密度(1cm あたりのコイルの数)を増やすことです。これは高いピッチ(音程)のサンプルに近づくことになります。バネを伸ばすことは、密度を減らすことで、低いピッチ(音程)のサウンドに近づいていきます。
(このセクションはさらに細かい部分に興味がある人向けです。飛ばしても構いませんよ・・・。)
上記で見てきたように、サンプルは、スピーカーが一定の時間でどのように振動すべきかを表現した長大な 数値のリストによって表されています。この数値のリストで、これと同じようなグラフを描いてみます。
あなたはこれと同じような図を、以前に見たことがあるかも知れません。これはサンプルの波形と呼ばれるものです。これは数値のグラフです。このような波形はだいたい、1秒間に44100ポイントのデータを有しています(これはナイキスト・シャノンのサンプリング定理によるものです)。サンプルが2秒間続くなら、スピーカーに1秒間に44100ポイントのレート(長さ)を与えることで88200の数値で表現されます。もちろん、1秒間に88200ポイントで、2倍のレートとすることもできます。ですので、これは1秒間で再生されます。1秒間に22050ポイントで、半分のレートで再生することも可能です。この場合、4秒で再生されます。
サンプルのデュレーションは、再生するレートに影響を与えます。
これを以下の数式で表します。
new_sample_duration = (1 / rate) * sample_duration
再生レートを変えることは、サンプルのピッチ(音程)にも影響します。周波数や波形のピッチがどれくらい速く上下に動くかで決定されます。我々の脳は、どういうわけか、スピーカーの速い動きを高い音階に、遅い動きを低い音階に捉えます。だからあなたは時々、大きなベース・スピーカーが超低音を吐き出すのを見ることができるのです。実際に高い音を出しているときのスピーカーよりも、ゆっくりと振動しているのです。
もし波形を取り出して圧縮したら、1秒間でさらに頻繁に上下します。これがサウンドをより高い音にするのです。 上下の運動を2倍にすると、周波数が2倍になるということになります。 そのため、サンプルを2倍のレートで再生すると、聞こえる周波数が2倍になるということです。 また、レートを半分にすると、周波数が半分になるということでもあります。他のレートはそれに応じて周波数に影響します。
ADSRエンベロープを用いて、サンプルのデュレーション(再生時間)とアンプ(音量)を編集することもできます。しかしながら、シンセのADSRエンベロープとは少しだけ異なったように作用します。サンプルに使用するエンベロープは、サンプルのアンプとデュレーションを減らすことしかできません。決して増やすことはできないのです。サンプルは、それが再生され終わったときか、エンベロープが完了したときのいずれかで停止します。どちらが先でも停止します。非常に長いrelease:
を使ったとしても、サンプルのデュレーションは延長されません。
わたしたちのお気に入りのフレーズ、アーメン・ブレイクに戻ります。
sample :loop_amen
オプションが設定されていない場合、全サンプルがフル・アンプ(最大音量)で聞こえます。
もし1秒間のフェード・インを使いたい場合、attack:
パラメータを使います。
(フェード・インとは徐々に音が大きくなることです。)
sample :loop_amen, attack: 1
もっと短いフェード・インの場合は、attack:
の値を小さくします。
sample :loop_amen, attack: 0.3
ADSR エンベロープの特徴が標準的なシンセ・エンベロープと異なる点は、サステイン(持続時間)の値です。 標準的なシンセのエンベロープでは、もし手動で変更しなければ、 0 に設定されています。ですが、 サンプルでは、サステインの値は通常、魔法のように全自動にセットされます。サステインの時間は、サンプルの残りを 演奏するように調整されます。デフォルトの値を渡さないときに、サンプルがフルで流れるのはこのためです。 アタック、ディケイ、サステイン、リリース(この4つの頭文字がADSR)の値が全て 0 のときは、何の音も聞こえません。 Sonic Piはサンプルの長さがどれくらいなのか計算し、アタック、ディケイ、リリース・タイムを差し引いて、 あなたのサステイン・タイムの結果を使用します。もし、アタック、ディケイ、リリースの値が サンプルのデュレーションより長く追加された場合、サステインは 0 にセットされます。
これまでのことをを求するために、我らがアーメン・ブレイクをさらに詳細にみてみます。Sonic Piにサンプルがどれくらいの長さなのか尋ねてみます。
print sample_duration :loop_amen
1秒間のサンプルの長さは 1.753310657596372 と答えるでしょう。ここでは、便宜的に1.75 としますリリース・タイムを 0.75 にすると、驚くべきことが起こります。
sample :loop_amen, release: 0.75
サンプルの最初の1秒をフル・アンプで再生し、最後の 0.75 秒はフェード・アウトします。これが オート・サステインの動きです。標準では、release:
はいつもサンプルの最後から動作します。
もしサンプルの長さが10.75 秒なら、最初の10秒はフル・アンプで再生し、最後の0.75秒はフェード・アウトします。
通常、release:
はサンプルの最後でフェード・アウトするということを覚えておいてください。
サンプルのデュレーションの間にフェード・アウトとインを行うには
attack:
とrelease:
の両方を使うことができます。オート・サステインの仕組みと一緒に、
使用できます。
sample :loop_amen, attack: 0.75, release: 0.75
サンプルのアーメンブレイク全体のデュレーションは1.75秒なので、 アタックとリリースの時間が1.5秒まで追加されると、 サステインは自動的に0.25秒にセットされます。 これで簡単にサンプルをフェード・イン、アウトすることができます。
手動でsustain:
を 0 などにセットして、通常のADSRシンセの挙動に簡単に戻すこともできます。
sample :loop_amen, sustain: 0, release: 0.75
いま、サンプルはトータルで0.75秒間だけ再生されました。attack:
とdecay:
の通常値0ですので、
サンプルはフル・アンプ(最大音量)に直接変わり、0秒間サスティン(持続)し、リリースの0.75秒間で0アンプに戻ります。
この仕様を、長いサウンドのサンプルを短く、より打楽器的にするために、効果的に使うことができます。
:drum_cymbal_open
:
sample :drum_cymbal_open
上のサンプルでは一定時間シンバルの音が鳴っているのが聞こえます。ですが、もっとパーカッシブ(打楽器的)にしてみましょう。
sample :drum_cymbal_open, attack: 0.01, sustain: 0, release: 0.1
シンバルを叩いた後のサスティン(持続時間)を増やすことで、響かせるような効果も出すすることができます。
sample :drum_cymbal_open, attack: 0.01, sustain: 0.3, release: 0.1
今すぐ、サンプルを楽しくさせるエンベロープをいじってみましょう。 面白い結果を得るために数値を思いきり変更してみましょう。
このセクションでは、Sonic Piのサンプルの再生について私たちが探求してきたことをまとめます。 簡単にまとめてみましょう。
これまで、サンプルを再生する方法をみてきました。
sample :loop_amen
まず、サンプルのレート(速さ)を変更する方法を見つけて、このように半分の速度で再生してみました。
sample :loop_amen, rate: 0.5
次に、サンプルを徐々に大きくするフェードインを知りました。 (半分の速度でやってみましょう)
sample :loop_amen, rate: 0.5, attack: 1
また、sustain:
に明確な値とアタックとリリースの両方の短い値を設定することで、
サンプルを打楽器のように使用する方法を見つけました。
sample :loop_amen, rate: 2, attack: 0.01, sustain: 0, release: 0.35
では、いつもサンプルの先頭から開始する必要はあるのでしょうか? そして、いつもサンプルの最後まで終了する必要はあるのでしょうか?
サンプルのどこからでも、好きな場所を選んで音を再生することが可能です。 0はサンプルの開始で、1は終了です。0.5はサンプルの途中です。 アーメンブレイクの最後の半分を再生してみましょう。
sample :loop_amen, start: 0.5
どのようにすればサンプルの最後の1/4を再生できますか?
sample :loop_amen, start: 0.75
同様に、サンプルの0から1の間の値を終了点として選ぶことができます。 アーメンブレイクの半分までで終わらせてみましょう。
sample :loop_amen, finish: 0.5
もちろん、私たちは好きな部分を再生するために、これまでの開始と終了の2つを組み合わせることができます。 どのようにすれば真ん中あたりの短い場所だけを選べるのでしょうか?
sample :loop_amen, start: 0.4, finish: 0.6
もし、終了位置のあとを、開始位置として選ぶとどうなるでしょう?
sample :loop_amen, start: 0.6, finish: 0.4
かっこいい!!!逆再生になりますね!
そして新しい機能として、すでに学んだrate:
とstart:
(開始)とfinish:
(終了)を使った部分再生を組み合わせることができます。
sample :loop_amen, start: 0.5, finish: 0.7, rate: 0.2
そして、面白い結果を創りだすために、ADSRエンベロープと、いままでの全てを組み合わせることができます。
sample :loop_amen, start: 0.5, finish: 0.8, rate: -0.2, attack: 0.3, release: 1
今すぐ、サンプルとこれまでに紹介した楽しい内容を組み合わせて演奏してみましょう!
内蔵のサンプルは、すぐに使用でき、再生することができる一方で、 あなたは別に録音された音を試してみたいと願うかもしれません。 Sonic Piは完全にこの願いを叶えます。 まずは、あなたの部品(録音した音)の携帯性について、確認してみましょう。
あなたが、内臓のシンセやサンプルだけを使って作曲した場合、 コードだけがは、あなたが音楽を忠実に再生ために必要なものになります。でもちょっと 考えてみてください。それは、実はとても凄いことなのですよね!あなたの音楽を忠実に再現する作品は、 テキストによるシンプルなものなので、電子メールで周りに送ったり、 Gistに埋め込んで公開することができます。コードを持っていれば 友人と本当に簡単に共有することができます。
しかし、もしあなたが、自身で記録したサンプルを使ってしまうと、この携帯性が 失われてしまいます。なぜならば、あなたの音楽を他の人達が再現しようとしても、 あなたのコードだけでは再生することができず、記録したサンプルが必要になってしまうからです。 この事は、あなたの音楽を他の人が操作したり編集したり、試してみることを制限してしまう ことがあるということです。もちろん、あなた自身が録音したサンプルを使うことを 止めるということではなく、方法(データを送って、正しく共有するなど)に配慮していけばよいという事です。
では、どうやって、あなたが録音したWAVファイルやAIFFファイルをコンピュータで再生するのでしょうか?
sample
のファイルを置く場所を指定(パスを通す)するだけで、再生できるようになります。
sample "/Users/sam/Desktop/my-sound.wav"
Sonic Piは自動的にサンプルを読み込んで再生します。あなたは、sample
に今まで使ってきた全てのパラメータを、あなたが録音した音に使うことができます。
sample "/Users/sam/Desktop/my-sound.wav", rate: 0.5, amp: 0.3
音楽にすこし面白さを加えるために、ランダムという素晴らしい方法があります。 Sonic Piは音楽にランダム性を追加するためにいくつかの素晴らしい機能を持っていますが、 Sonic Piのランダムは、真のランダムではありません。これは一体何を意味しているのでしょう? 勉強を開始する前に、この衝撃的な真実を見ていきましょう。
たいへん便利なランダム関数に、二つの数字の間 (最小値と最大値)で
乱数(ランダムな値)が得られるrrand
があります。(rrandはレンジド・ランダムの略です。)
ランダムな音階を演奏してみましょう。
play rrand(50, 100)
おぉー、ランダムな音階を演奏しましたね。これは、音階77.4407
を演奏しました。
50と100との間で素敵なランダム音階はでしたね…でも、ちょっと待ってください、
上記で、私はあなたが再生したランダムな音階を正確に予測していませんか?何か怪しくないですか?
再度コードを実行してみてください。ランダムのはずが、再び77.4407
が選ばれましたよね?
実は、ランダムにすることができないのです!
この答えとなる擬似ランダムとは、真のランダムではないということです。SonicPiは、
反復可能な数としてのランダムを与えます。これは、あなたのマシンで作成した音楽が、誰か他の人のマシンで
再生されても同じように聞こえることを確認するのに大変便利な機能です。あなたの曲の中でいくつものランダ
ム性を使用している場合でも。
もちろん、音楽に与えられる側面として、もし「ランダム」が77.4407
を毎回選択した場合、
それは非常に面白くありません。しかし、それはしていません。以下のことを試してみてください。
loop do
play rrand(50, 100)
sleep 0.5
end
そう!最終的には、ランダムに聞こえますね。ランダム関数へ続いて呼び出されるその後の実行結果は ランダムな値を返します。ただし、また再生する場合は正確に乱数値の同じシーケンスを生成し、 まったく同じ音が鳴ります。Runボタンが押されるたびに、まるですべてのSonic Piコードが毎回、同じ時間に戻るかように蘇ります。
それはまさにシンセのデジャヴのように繰り返されます!
ランダム動作を取り入れたゾクッとするようなベルの音を使った楽しい作例です。 繰り返しサンプルのベル音:perc_bellをループさせ、ベル音の再生速度と音の間のsleepにランダムな数値を用いています。
loop do
sample :perc_bell, rate: (rrand 0.125, 1.5)
sleep rrand(0.2, 2)
end
ランダム化のもう一つの楽しみ方の例は、ランダムにシンセのカットオフを加えることです。 これを試してみるのに絶好のシンセは、 :tb303 エミュレータです。
use_synth :tb303
loop do
play 50, release: 0.1, cutoff: rrand(60, 120)
sleep 0.125
end
もし、SonicPiが提供する乱数の特定の配列が気に入らない場合、use_random_seed
を介すことで
別の開始点を選択することが可能です。シードの標準値は0であるため、異なるランダム体験のために
別のシード番号を入力してみましょう!
下記を考えてみてください:
5.times do
play rrand(50, 100)
sleep 0.5
end
このコードを実行するたびに、 5音階の同じシーケンスが聞けるでしょう。異なるフレーズを聞くには、シードの値を変更します。
use_random_seed 40
5.times do
play rrand(50, 100)
sleep 0.5
end
こうして異なる5音階のシーケンスを生成します。シードの値を変更することによって、あなたの好きな フレーズを見つけることができます 他の人と共有するとき、彼らも、あなたが聞いたものとまったく同様のフレーズを 聞くことができるでしょう。
有用なランダム関数をもう少し見ていきましょう。
一般的な方法は、あらかじめ用意した数値をリストの中からランダムに選択することです。
例えば、60、65または72の中から1音を演奏することができます。choose
を用いれば、
リストから一つの項目をで選択することができます。まず、カンマで区切った番号のリストを角括弧でラップ(包んで)し、
配置する必要があります:[60, 65, 72]
。次にそれらをchoose
に渡す必要があります。
choose([60, 65, 72])
どんな音になるか聞いてみましょう。
loop do
play choose([60, 65, 72])
sleep 1
end
すでにrrand
について触れてきましたが、再び実行してみましょう。これは、2つの値の間の乱数(排他的)を返します。
この意味するところは上部または下部の番号いずれの値も含まれません。常に両者の間にある値です。
そして、その番号は常に浮動小数点になります - それは整数ではなく、分数です。
rrand(20, 110)
で返される浮動小数点数の例:
時々、あなたは小数点ではなく、整数の乱数を望むこともあるでしょう。これはrrand_i
を用いることで
解決できます。それは小数点を除いてrrand
と同様に最小値および最大値の範囲(この場合、最長値と
最大値も含まれます)に潜在するランダム値を返す動作をします。下記は、rrand_i(20, 110)
によって返される数値の例です。
rand
は、0
を含む最小値と最大値未満の間のランダムな浮動小数点数を返します。デフォルト(既定値)では
0
と1
の間の値を返します。したがって、amp:
値をランダム化する際に便利です。
loop do
play 60, amp: rand
sleep 0.25
end
rrand_i
とrrand
の関係と同様にrand_i
は0
と特定の最大値の間の整数値を返します。
ランダムな数字を出す際に、サイコロ投げをまねてみたくなることもあるでしょう。
これは、常に下の値が1であるrrand_i
の特殊なケースです。
dice
を呼び出す時は、サイコロの面の数を指定する必要があります。
標準的なサイコロは6面で、dice(6)
では、1 、2 、3 、4 、5 、
または6を返すサイコロと同様の作用をします。しかし、空想のボードゲームのように、
4面、12面、または20面サイコロで値を見つけたいこともあるでしょう。ことによっては120面のサイコロだって!
最後に、サイコロ投げをまねて、例えば6という一番大きな数値を出してみたくなることもあるでしょう。
one_in
はサイコロの面の数分の1の確率でtrueを返します。したがってone_in(6)
では6分1の確率でtrue、それ以外の場合はfalseを返します。true
とfalse
の値は、このチュートリアルの次のセクションで説明するif文で非常に有用です。
さあ、ランダム性を使いこなしてコードをまぜこぜにしていきましょう!
これまでの章で、みなさんはplay
やsample
コマンドを使ったり、sleep
を使ってシンプルなメロディーやリズムを作曲することを通して音楽制作(*サウンドプログラミング)の基礎を学ぶことができました。
Sonic Piのコードの世界で他にどんなことができるか興味が出てきたことでしょう…
それでは、プログラミングの基礎となるループや条件文、ファンクション(関数やスレッドなどに進みましょう。 音楽的のアイデアを実現させるをびっくりするほど強力なツールをになることでしょう。
それでは、やってみましょう。
Sonic Piでよく見る構造はブロック(block
)といいます。ブロックは沢山のコードを
ひとかたまりとして、便利に扱うことができます。
たとえばsynth
やsample
では、その後ろのパラメータによって音を変えることができました。
しかし、場合によってはコード数行に同じ変更内容を反映させたい時などが出てきます。
たとえばループする時に、5回のうち1回だけリバーブを加えたい場合を考えてみます。
play 50
sleep 0.5
sample :elec_plip
sleep 0.5
play 62
コードのまとまりを使って何かをしようとするときに、コードのブロックの始まりと終わりをSonic Piに伝える必要があります。その際にdo
を始まりに、end
を終わりとして使用します。
do
play 50
sleep 0.5
sample :elec_plip
sleep 0.5
play 62
end
しかし、これではまだ完璧ではないので、実行されません。(動かしてみてもエラーメッセージが出るだけです)。
実行したい始まりと終わりのブロックをSonic Piへ伝達が完了していないからです。do
の前に特別なコードをすこし書くことによってこのブロックをSonic Piに教えることができます。
このチュートリアルの後半でこれらの特別なコードを使ったいくつかの事例を紹介していきます。
ひとまず、みなさんが特別なコードを使ってSonic Piを動かしたい場合、do
とend
でコードをまとめることが重要であることを覚えておいてください。
以前、play
とsample
のブロックを使って様々な音を作り出せること勉強しました。また、sleep
を使うことによって、音の発生する時間をコントロールする方法も学びました。
これらの基本的なブロックを使用することで多くの楽しさがあることを理解してもらえたのではないかと思います。しかし、音楽を作るための強力なコードを学べば、その楽しさの次元はまた新しい段階に向かうでしょう。次のいくつかのセクションではパワフルな新しいツールを探っていきます。はじめはまず「イテレーション(反復)とループ」を学びます。
何回か繰り返しを行うためにはどのようにコードを書いたらよいでしょう?例えばこのようなコードです。
play 50
sleep 0.5
sample :elec_blup
sleep 0.5
play 62
sleep 0.25
これを3回繰り返したい場合、どうしたら良いでしょう?単純に考えればコピーして貼り付けを3回繰り返せば可能です。
play 50
sleep 0.5
sample :elec_blup
sleep 0.5
play 62
sleep 0.25
play 50
sleep 0.5
sample :elec_blup
sleep 0.5
play 62
sleep 0.25
play 50
sleep 0.5
sample :elec_blup
sleep 0.5
play 62
sleep 0.25
ちょっと長過ぎますよね。もしサンプルの:elec_plip
を変更させたい場合、どうしたら良いでしょうか?3ヶ所全部の:elec_blup
をひとつひとつ変えなくてはいけません。さらに重要なことですが、繰り返しが50回とか1000回になったとしたらどうでしょう?変更したいコードがすごくたくさんになってしまいます。
イテレーション(反復)とは、終了条件に達するまで一定の処理を繰り返すことです。実際、コードの繰り返しはdo
を3回繰り返すことで簡単にできます。さあ、はじめましょう。先ほど学んだコードブロックを思い出してください。3回繰り返したいコードのブロックには「始まり」と「終わり」が記されていますね。そんな時にこの特別なコードである3.times
を使いましょう。同じコードを3回繰り返す代わりに、3.times
を書くことで、とても簡単に出来るようになります。その時にコードの最終行にend
を書き入れることも忘れないようにしましょう。
3.times do
play 50
sleep 0.5
sample :elec_blup
sleep 0.5
play 62
sleep 0.25
end
コピーと貼り付けよりを繰り返すより、ずっと美しいコードになったと思いませんか? このようにブロックを使うと、沢山の繰り返しの構造を作ることが出来るのです。
4.times do
play 50
sleep 0.5
end
8.times do
play 55, release: 0.2
sleep 0.25
end
4.times do
play 50
sleep 0.5
end
繰り返しの構造の中にさらなる繰り返しの機能を入れることによって面白いパターンを作ることが出来ます。例えば
4.times do
sample :drum_heavy_kick
2.times do
sample :elec_blip2, rate: 2
sleep 0.25
end
sample :elec_snare
4.times do
sample :drum_tom_mid_soft
sleep 0.125
end
end
もしすごくたくさんの繰り返しをしたい場合、1000.times do
のようにすごく大きな数値の繰り返しをさせることになってしまいます。こういった場合は、おそらく(stopボタンを押すまで)無限に繰り返す機能がほしいと思うでしょう。さあ、アーメンブレークのサンプルを無限にループさせてみましょう。
loop do
sample :loop_amen
sleep sample_duration :loop_amen
end
loopについて知っておかなくてはならない重要な点は、これはコードの中でブラックホールのように動いてしまう点です。一度loop機能が動いてしまうと、stop
ボタンを押さない限り永遠に再生されるということです。つまり、これはloopの外にあるもコードは、いつまでたっても聞くことが出来ないということを意味しています。例えば、下の例で言うと、シンバルの音はloopの外にあるため、いつまでも動くことはありません。
loop do
play 50
sleep 1
end
sample :drum_cymbal_open
さあ、これで回数を指定するイテレーション(反復)と永遠に繰り返すループのコーディング方法を理解することができましたね!
やってみたいと思うことのひとつに、ランダムに音を出すこと(前章参照)だけでなく、いくつかのコードをランダムに決め、それを選択していくというアイデアも出てくると思います。例えば、ドラムとシンバルをランダムに鳴らしたい場合、if
という言葉を使うとこれを実現できるようになります。
それではコインをトス(投げる)してみましょう。もしもコインが表であればドラムを鳴らし、裏であればシンバルを鳴らします。簡単ですね。コイントスの機能は one_in
という機能(ランダムのセクションで紹介しています)によって実現されます。2つのうちの1つというように条件を細かく指定するときには one_in(2)
と記述すると、ドラムを鳴らすコードとシンバルを鳴らす2つのコードどちらかを決められるようになります。
loop do
if one_in(2)
sample :drum_heavy_kick
else
sample :drum_cymbal_closed
end
sleep 0.5
end
if文は3つのパートを持っていることに注目してみましょう。
典型的なプログラム言語では、概ね、真(正しいという意味)をtrue
で表現し、偽(正しくない場合)はfalse
と表記します。そのため、 one_in
対する明確な回答として、true
かfalse
かを選択できる質問が必要となります。
はじめの選択では if
と else
の間に挟まれたプログラムが実行され、そして2番目の選択ではelse
と end
の間が実行されるということに注目しましょう。それは複数行のコードをまとめるdo/endブロックにとても似ていますね。例えば、
loop do
if one_in(2)
sample :drum_heavy_kick
sleep 0.5
else
sample :drum_cymbal_closed
sleep 0.25
end
end
sleep 0.5
やsleep 0.25
など、異なる休符時間を持つ場合、そのどちらかに応じることになります。
時には、任意のコードを1行だけ実行したいときがあるでしょう。これもifとその後ろに条件を記述することで可能です。例えば、
use_synth :dsaw
loop do
play 50, amp: 0.3, release: 2
play 53, amp: 0.3, release: 2 if one_in(2)
play 57, amp: 0.3, release: 2 if one_in(3)
play 60, amp: 0.3, release: 2 if one_in(4)
sleep 1.5
end
上のコードでは、それぞれの音符が持つ別の確率によって、異なる数のコード(和音)を奏でるでしょう。
それでは、強烈なベースラインとかっこいいビートを作った場合、どのようにしてそれらを同時に鳴らしたらいいでしょう?一つの回答としては、手動でそれらを同時に鳴らす事です―まず、いくつかのベースを演奏し、その後にいくつかのドラム、またその後にベースというように…しかしながら、すぐに沢山の楽器を処理することが難しいことに気づくでしょう。
もし、Sonic Piが自動的にそれらを作り出せるとしたら?thread(スレッド)と呼ばれる特別な命令によってそれが可能になります。
このシンプルな例で、強烈なベースラインとかっこいいビートが期待できてしまうのです。
loop do
sample :drum_heavy_kick
sleep 1
end
loop do
use_synth :fm
play 40, release: 0.2
sleep 0.5
end
ループはプログラムのブラックホールのようだと以前にお話しました。 一度ループを入れると、stopボタンを押さない限り、そこから抜け出せなくなります。 では、どうしたら同時にふたつの繰り返しを演奏することが出来るでしょう? 私たちは、同時にそれらのコードをタイミングを合わせスタートさせるようにSonic Piに伝えなくてはいけません。これがスレッドを使った解決方法なのです。
in_thread do
loop do
sample :drum_heavy_kick
sleep 1
end
end
loop do
use_synth :fm
play 40, release: 0.2
sleep 0.5
end
はじめのdo/endブロックをin_thread
で囲むことで、次にくるdo/endブロックをぴったりと同時にループさせるようにSonic Piに命令することができます。
それではドラムとベースラインを同時に鳴らすことに挑戦してみましょう!
そして、もう一つの音を追加したいので、先ほどのように繰り返しを入れてみましょう。
in_thread do
loop do
sample :drum_heavy_kick
sleep 1
end
end
loop do
use_synth :fm
play 40, release: 0.2
sleep 0.5
end
loop do
use_synth :zawa
play 52, release: 2.5, phase: 2, amp: 0.5
sleep 2
end
前と同じ問題が出てきましたね。in_thread
によって最初の繰り返しと2つ目の繰り返しが同時に演奏されています。しかし3番目の繰り返しが演奏されません。ですので以下のように、もう一つのスレッドが必要となります。
in_thread do
loop do
sample :drum_heavy_kick
sleep 1
end
end
in_thread do
loop do
use_synth :fm
play 40, release: 0.2
sleep 0.5
end
end
loop do
use_synth :zawa
play 52, release: 2.5, phase: 2, amp: 0.5
sleep 2
end
驚くべきことにRun
ボタンを押すということは、実際にはコードを実行するための新しいスレッドを作っていることになります。
そのために複数回Run
ボタンを押すことは、互いの上に音を階層化することになります。Run
それ自体がスレッドであるために、音を自動的に紡ぎ合わせることになるのです。
Sonic Piをマスターしようとするとき、スレッドが、音楽のために最も重要な構成要素であることに
気がつくでしょう。重要な役割の一つとして、他のスレッドから現在の設定セッティングを
分離することがあります。どういうことかというと、例えばuse_synth
を使ってシンセの種類を変更する時、
現在のスレッド中にあるシンセだけを変更します。他のどのスレッドも変更しません。
そのことを確認してみましょう。
play 50
sleep 1
in_thread do
use_synth :tb303
play 50
end
sleep 1
play 50
真ん中の音だけがほかのものと違うことに注目してみましょう。use_synth
の宣言はスレッドの中だけに影響し、スレッドの外にあるものには影響しません。
in_thread
を使って新しいスレッドを作ると、そのスレッドには現在の
スレッドの全ての設定が自動的に継承されます。ではその機能を見てみましょう。
use_synth :tb303
play 50
sleep 1
in_thread do
play 55
end
2番目の音符は、それが別のスレッドから再生されたにもかかわらず :tb303
シンセで演奏されることに注目してください。 use_*
関数を使ったいかなる設定も同様に作用するでしょう。
スレッドが作成されると、彼らの親から(前述の)すべての設定を継承しますが、スレッド以降の変更を共有することはありません。
最後に、スレッドに名前つける機能を覚えましょう。
in_thread(name: :bass) do
loop do
use_synth :prophet
play chord(:e2, :m7).choose, release: 0.6
sleep 0.5
end
end
in_thread(name: :drums) do
loop do
sample :elec_snare
sleep 1
end
end
このコードが動作した時、ログ画面を見てみましょう。レポートの中にスレッドの名前が表示されることがわかります。
[Run 36, Time 4.0, Thread :bass]
|- synth :prophet, {release: 0.6, note: 47}
名前付きのスレッドについて知っておくべき最後のひとつは、名前の付いた1つのスレッドだけが同時に実行されることです。 では以下を見てみましょう。次のコードを考えてみてください。
in_thread do
loop do
sample :loop_amen
sleep sample_duration :loop_amen
end
end
ワークスペースに上記のスレッドを貼り付けて、Run
ボタンを押します。
数回押してみましょう。複数のアーメン・ブレイクが不協和音として反復されるでしょう。
もういいですよね。stop
ボタンを押しましょう。
この動作はこれまで何度も見てきました。Runボタンを押すと、一番上のレイヤーにあるサウンドが鳴ります。
このためループが含まれている場合、
Run`ボタンを押すことを3回続けると、3つのレイヤーが一斉に実行されます。
ただし、名前付きのスレッドでそれは異なります。
in_thread(name: :amen) do
loop do
sample :loop_amen
sleep sample_duration :loop_amen
end
end
このコードでRun
ボタン複数回、押してみてください。ひとつのアーメン・ブレークのループのみが聞こえるでしょう。
そして下記のテキストがログ画面に表示されます。
==> Skipping thread creation: thread with name :amen already exists.
Sonic Pi は、:amen
という名前があるスレッドが既に存在するため、別のものを作成しませんと伝えています。この動作はすぐに使う必要性はないように思えますが、ライブコーディングを始めると、非常に便利なものになるでしょう。
一度、膨大なコードを書き始めると、それらの構造をより簡単かつ整理された状態で把握できるように、構築しまとめたいと感じることになるでしょう。ファンクション
(関数)はそんなことをとても効果的に成し遂げる方法です。この関数を使うとコードのまとまりに対して名前をつけることも可能になります。早速、見ていきましょう。
define :foo do
play 50
sleep 1
play 55
sleep 2
end
ここではfoo
と呼ばれている新しい関数を見ていきます。これは以前から出てきているdo/endブロックと、define
という魔法の言葉とともに働きます。しかしbar
やbaz
や、main_section
やlead_riff
のようなある程度の意味を持った関数が呼び出せれば、foo
を呼び出す必要はありませんでした。
それを定義するとき、関数の名前に:
(コロン)を付加することを忘れないでください。
いったん一つの関数を定義すると、ただ名前を書くことでそれを呼びだすことができます。
define :foo do
play 50
sleep 1
play 55
sleep 0.5
end
foo
sleep 1
2.times do
foo
end
foo
は、イテレーション(繰り返し)ブロック内のplay
やsample
などの書かれたコード内やどこからでも使うことができます。
この関数は、楽曲の中で自分自身を新しい意味ある言葉として定義し、それ自身を表現する際に非常に優れた方法です。
これまでのところ、Run
ボタンを押すたびに、Sonic Piを完全に白紙の状態からはじめました。
これまでワークスペースをなぜとり除いているかについては触れてきませんでした。
これは1つのワークスペースのみで再生されていたからで、別のワークスペース
または別のスレッド内のコードを参照することはできなかったからです。
しかし、関数はそれを変えることができます。あなたが関数を定義すると、
Sonic Piはそれを覚えることができます。では、ちょっとやってみましょう。
まずワークスペースにあるすべてのコードを消して、foo
と名づけたものに変更します。
foo
Run
ボタンを押して、関数のfoo
が再生されることを確認してください。
コードはどこにいったのでしょう?また、Sonic Piは、実行の仕方を
どのように知っていたのでしょうか?Sonic Piはワークスペースを消したあとでも、
あなたが打ち込んだ関数を覚えていて、定義した関数ををしっかりと再生してみせたのです。
この動作はdefine
もしくはdefonce
を使用した時にだけ働く機能です。
最小値と最大値の情報をrrandへ渡すように、変動する引数を受け取る面白い関数をご紹介しましょう。 それでは見てみましょう。
define :my_player do |n|
play n
end
my_player 80
sleep 0.5
my_player 90
この点を解説するのはとても難しいのですが、ポイントを説明します。
play
をmy_player
という関数として定義します。
この変数はdefine
で括られたdo/endブロックのdoの後に記述する必要があります。
変数は、垂直のバー|
で囲み、複数の変数を扱う場合はカンマ ,
で分割し、
変数の名前はどんな言葉でもつけることが出来ます。
この魔法は、define
を使いdo/endブロック内で行われます。
また、実行されるための値のような変数名を使うことも出来ます。
この例で言うと、n
という関数になります。コードが起動した際のひとつの約束ごととして、
変数はその領域に記憶されている実際の数値に置き換えられます。
あなたが関数を呼び出した際は、この数値を関数に置き換えて実行することが出来るのです。
このmy_player 80
というのは、音階80の音を鳴らすということです。
関数の定義の中で、n
はすぐに80
に置き換えられます。
そしてplay n
はplay 80
となるのです。また次にmy_player 90
という関数を呼び出す際には、
n
はすぐさま90
に置き換えられ、play n
はplay 90
として再生されます。
それではさらにおもしろい例を見てみましょう。
define :chord_player do |root, repeats|
repeats.times do
play chord(root, :minor), release: 0.3
sleep 0.5
end
end
chord_player :e3, 2
sleep 0.5
chord_player :a3, 3
chord_player :g3, 4
sleep 0.5
chord_player :e3, 3
ここでは repeats.times do
という行の中で一つの数値のように repeats
が使われます。
また、 play
を呼び出した際の音階の名前と同様に root
が使われています。
関数によって、高度な表現と沢山の構造を簡単に読み込ませることが出来るということがわかりましたね!
コードを書いていく中で役に立つことは、覚えやすい名前を作成することです。 Sonic Piはこれをとても簡単に作ることができます。あなたが使用したいと思う名前に続けて、
等号のイコール(=
)を書き、そのあとに覚えておきたい名前を書きます。
sample_name = :loop_amen
ここで変数sample_name
は:loop_amen
という記号として記憶されます。
sample_nameを使うときはどこでも:loop_amen
を使ったことになるのです。
例、
sample_name = :loop_amen
sample sample_name
Sonic Piでは変数を使う際、3つの主要な使い方があります。意味の伝達、繰り返しの操作、そして結果の獲得です。
コードを書くとき、あなたはコンピュータが理解しOKを出してくれることだけを考え、どのようにコンピュータに伝えて動作させるのかを意識するだけであれば、それは簡単な事ですね。しかし、覚えておかなくてはいけない大事なことは、コンピュータがコードを読むということだけではないということです。他の人もそれを読み、何が起こっているか理解をしようとするでしょう。あなた自身も将来、自分の書いたコードを見返して、どんなことをしたのか?理解する必要がある時が来るかもしれません。たぶん確実にあなたにも他の人にも、そういったことが起こるのです!
あなたのコードがどのように動いているのか他人が理解をするためにコメントを書く(前章で確認できます)という方法があります。もう一つの方法として、理解しやすい変数名を使うという方法があります。
sleep 1.7533
上の例だけを見ると、なぜ 1.7533
という数値を使ったのでしょう?その数値はどこから来たのか?それは何を意味しているのか?という疑問がわきます。しかし、次のコードを見てみましょう。
loop_amen_duration = 1.7533
sleep loop_amen_duration
こう書くとすぐに 1.7533
がサンプル音源:loop_amen
の長さであるということがわかりますね。もちろん、下記のように一行に書くことも可能です。
sleep sample_duration(:loop_amen)
どちらを用いたとしても、コードの意味がよりわかりやすいものになりました。
コードの中では沢山の繰り返しが頻繁に見られます。また、もし何かを変更したいときは、膨大な場所を変更する必要も出てきます。次のコードをみて下さい。
sample :loop_amen
sleep sample_duration(:loop_amen)
sample :loop_amen, rate: 0.5
sleep sample_duration(:loop_amen, rate: 0.5)
sample :loop_amen
sleep sample_duration(:loop_amen)
:loop_amen
によって沢山の事ができるのです!もし:loop_garzul
のような他のサンプルの繰り返しによる音が聞きたい場合はどうしましょう?そうするにはすべての:loop_amen
を探しだして:loop_garzul
に変更する必要があります。そんな変更ができる沢山の時間があればいいんですが…もし仮にあなたがステージの上で演奏している最中だったらどうでしょう?特にみんなのダンスを止めないために、変更するためのそんな優雅な時間はないかもしれません。
下記のようなコードを書いたとして、
sample_name = :loop_amen
sample sample_name
sleep sample_duration(sample_name)
sample sample_name, rate: 0.5
sleep sample_duration(sample_name, rate: 0.5)
sample sample_name
sleep sample_duration(sample_name)
そして、これは試しの前述のものと同様のものです。これもsample_name = :loop_amenをsample_name = :loop_garzul
に一行を変更する機能を備えています。つまりこのように変数の魔法によって多くのポイントを変更させることができるのです。
最後に、変数を使う優れた理由はそのコードの結果の獲得をするということです。例えば、サンプル音源の長さを使って何かを行いたい時など。
sd = sample_duration(:loop_amen)
上記のように書くことで、今、:loop_amen
というサンプルの長さが必要な時、どこにでもsd
を使うことが出来るようになります。
おそらくもっと重要なのは、変数は、playやsampleの結果をキャプチャすることができることです。
s = play 50, release: 8
またこのように書くことで s
が変数として記憶され、シンセをコントロールすることを許容するようになります。
s = play 50, release: 8
sleep 2
control s, note: 62
また、後の章ではもっと詳しくシンセをコントロールすることも学びます。
一度、関数やスレッドを使用したとても高度なライブコーディングを行うと、おそらくスレッド内にある間違いを直すことが、とても簡単なことを理解できるでしょう。あなたはコードを起動してスレッドを再スタートさせることが容易にできるので、それは全然大したことではないのでしょう。しかし、スレッドを再スタートさせるときは、元々のスレッドとは調子がずれる事になります。
以前話した時に、新しいスレッドがin_thread
として作られると元のスレッドのすべてのセッティングが継続されることを学びました。これは現在の時間を含んでいます。つまり、スレッドが同時にスタートするときには常に他のスレッドと同期していることを意味しています。
しかし、1つのスレッドを起動したときは、それは独自の時間で再生されるので、他の現在実行中のスレッドと同期していることはほとんどありません。
Sonic Pi はcue
とsync
という関数を使ってこの問題の解決方法を提供します。
cue
はすべての他のスレッドに向けてビートメッセージを送ることができます。初期状態の他のスレッドでは、これらのビートのメッセージは関係付けられず、無視されます。しかし、sync
関数を使えば、あなたは簡単にこの関連付けを登録することができるのです。
sync
という機能は、一定の時間、実行中のスレッドを止めるsleep
という関数と非常に似ていることに気づくことが重要です。しかし、sleep
ではどのくらい休止させるかを決めることができましたが、sync
ではそれを決めることができず、sync
は長さに関わらず、次のcue
が出てくるまで待つのです。
それでは、もうちょっと詳しくみていきましょう。
in_thread do
loop do
cue :tick
sleep 1
end
end
in_thread do
loop do
sync :tick
sample :drum_heavy_kick
end
end
ここではふたつのスレッドが使われています。ひとつは音はなりませんがメトロノームのような機能として :tick
を使って一秒ごとにビートの情報を送っています。2つ目のスレッドははtick
の情報と同期し、そのビートの情報を受け取った際に、 cue
のスレッドの時間に情報を引き継ぎ、起動を続けます。
この結果、:drum_heavy_kick
のサンプル音源は、厳密に同時のスタートでないふたつのスレッドであったとしても、他のスレッドに :tick
からの情報をきっちり受け取って正確にビートを刻んだ音が聞けるはずです。
in_thread do
loop do
cue :tick
sleep 1
end
end
sleep(0.3)
in_thread do
loop do
sync :tick
sample :drum_heavy_kick
end
end
このちょっとやっかいな sleep(0.3)
は一つ目のスレッドとはあまり関係のない2つ目のスレッドを作り出してしまいます。しかしながら、cue
やsync
を使えば、タイミングがずれてしまうようなアクシデントを回避してくれます。
cue
には:tick
以外のどんな好きな名前でも付けられます。その際には他のスレッドと動機させるために必ず正しい名前を使用する必要があります。もし違った場合、永遠に(もしくはストップボタンを押すまで)それはcue
の情報を待ち続けることになります。
それではcue
の名前付けを見てみましょう。
in_thread do
loop do
cue [:foo, :bar, :baz].choose
sleep 0.5
end
end
in_thread do
loop do
sync :foo
sample :elec_beep
end
end
in_thread do
loop do
sync :bar
sample :elec_flip
end
end
in_thread do
loop do
sync :baz
sample :elec_blup
end
end
ここではメインのcue
でビートメッセージをランダムに:foo
と:bar
、:baz
に送るよう設定しています。それから3つのスレッドがそれぞれ独自に同期して、それぞれ設定されたサンプルの音を再生します。この関係付けられた結果から、cue
のスレッドによって、それぞれが同期しながら0.5秒刻みに`syncスレッドの音がランダムに再生され、そしてサンプルが再生されます。
逆にsync
スレッドを次のcue
まで居座り続けさせ待たせるように、
それらのスレッドに送るように設定しても、もちろんそれは動作します。
Sonic Piには、あなたの作ったサウンドに簡単にスタジオ·エフェクトを追加できるという最もやりがいのある楽しい側面があります。たとえば、部分的にリバーブを追加したり、エコーやディストーション(歪み)、ワブルベース(ベース音にフィルターLFOを掛け、断続的な音にすること)を加えることができます。
Sonic Piには、エフェクト(効果)を追加する非常にシンプルで強力な方法があります。それも、あなたが作った音にディストーション(歪み)を通し、その後エコー、さらにリバーブと、それらをチェーン(連結)させ、また、シンセやサンプルにオプションを与えるのと同様の方法でエフェクトユニットのオプションを個別に制御することができ、実行されている間でも、オプションを変更することも可能です。だから、例えば、トラックのいたるところでベースのリバーブを強くするということができるのです。
もし、この話が少し複雑に聞こえる場合でも、心配は無用です。一度、少し触れてみれば、すぐに理解することができることでしょう。いわば、ギターのエフェクターのようなものをイメージしてください。購入できるギターエフェクターには多くの種類がありますが、リバーブ、ディストーションなど幾つかを数珠繋ぎに追加することができます。ギタリストは、自分のギターにエフェクターの一つ(ディストーションなど)を接続し、そして別のケーブルでリバーブエフェクターに繋ぎます。そしてリバーブエフェクターの出口はギターアンプに繋ぐことができるわけです。
ギター -> ディストーション -> リバーブ -> アンプ
これをエフェクトチェーンと呼びます。Sonic Piは正にこれをサポートしています。さらに、ディストーション、リバーブ、エコーなどのエフェクターの多くは、どのくらい効果を加えるのか、制御できるようなダイヤルやスライダを持っていて、Sonic Piもこの種の制御をサポートしているということです。ついに、あなたはギタリストがエフェクターを使いながらギターを演奏する姿を想像することができていることでしょう。ただ、Sonic Piでは、それをコントロールするために他の何かを必要としません。それがコンピュータが代役を務めているのです。
さあ、エフェクトを探究していきましょう!
このセクションでは、エフェクター「リバーブとエコー」の組み合わせを見ていきます。
それらをどのようにチェーン接続するか、どのように制御するのか、これらの使用方法について説明します。 Sonic Piのエフェクトシステムは、ブロックを使用します。
セクション5.1を読んでいなければ、戻って目を通してください。
リバーブを使用する場合、この様に特殊なコードwith_fx :reverb
をブロックに書きます。
with_fx :reverb do
play 50
sleep 0.5
sample :elec_plip
sleep 0.5
play 62
end
早速コードを実行してリバーブを聞いてみましょう。いいでしょ!音全体が残響効果で素晴らしくなります。
さあ、次はブロックの外にコードを書いて何が起こるか見てみましょう。
with_fx :reverb do
play 50
sleep 0.5
sample :elec_plip
sleep 0.5
play 62
end
sleep 1
play 55
どうして最後の play 55
にリバーブが適用されないのでしょうか。
それはブロックの外部に書かれているため、リバーブエフェクトは適応されないのです。
do/endブロックの手前で音を生成する場合も同様にリバーブは適用されません。
play 55
sleep 1
with_fx :reverb do
play 50
sleep 0.5
sample :elec_plip
sleep 0.5
play 62
end
sleep 1
play 55
選択できる効果は他にもたくさんあります。エコーはどうでしょうか?
with_fx :echo do
play 50
sleep 0.5
sample :elec_plip
sleep 0.5
play 62
end
Sonic Piのエフェクトブロックの強力な側面の一つは、既にplay
とsample
で見てきたように、
オプションと同様の数値が渡されることです。たとえば、エコーの楽しいオプションは、
秒単位で遅れを示すphase
で表され、エコーの長さを指定します。
下記のコードで、音の響きをゆっくりにしてみましょう。
with_fx :echo, phase: 0.5 do
play 50
sleep 0.5
sample :elec_plip
sleep 0.5
play 62
end
エコーの遅れを早くしてみましょう。
with_fx :echo, phase: 0.125 do
play 50
sleep 0.5
sample :elec_plip
sleep 0.5
play 62
end
エコーが8秒間の時間でフェードアウトする様に、decay
を設定してみましょう。
with_fx :echo, phase: 0.5, decay: 8 do
play 50
sleep 0.5
sample :elec_plip
sleep 0.5
play 62
end
ブロック効果の中で最も強力な側面の一つは、入れ子ができるということです。 これはとても簡単にエフェクト同士を連結することができます。たとえば、あなたはどのようにエコーとリバーブの両方を適応さますか? その答えは単純です。一つの効果の内側にもう一方を配置するだけです。
with_fx :reverb do
with_fx :echo, phase: 0.5, decay: 8 do
play 50
sleep 0.5
sample :elec_blup
sleep 0.5
play 62
end
end
オーディオの流れについて逆側から追ってみましょう。play 50
を含むblock
のdo/endブロック内のコード全ては、最初にエコーエフェクトに送られ、その音がリバーブエフェクトへと順に送られていきます。
クレイジーなサウンドを得るために非常に深く入れ子を使用することができます。しかし、一度にたくさんのエフェクトを入れ子で実行すると多くのリソースを必要とするため、注意してください。そのため、特にラズベリーパイのような低電力供給のプラットフォームではエフェクトの使用を節約することも必要です。
Sonic Piは、あなたが演奏するためにたくさんのエフェクターを搭載しています。どういった効果が使えるのかを見つけ出すためには、ヘルプシステム画面の下にある効果ボタンをクリックし、利用可能なリストを見てください。ここに私のお気に入りを記載しておきます。
さあ、エフェクターを追加して驚きの新しいサウンドの虜となってくだい!
外観は一見シンプルですが、 エフェクト内部は実際には異常に複雑なモンスターです。そのシンプルさは、しばしば、この機能を酷使させようと誘惑します。もしもあなたが強力なマシンを持っている場合は問題は無いかもしれませんが、ラズベリーパイで動作させる場合、確実にビートを刻み続けるようにしたいのであれば、どのくらいの負荷をかけているのか注意する必要があります。
このコードを考えてみましょう。
loop do
with_fx :reverb do
play 60, release: 0.1
sleep 0.125
end
end
このコードは非常に短いリリースタイムで音符60
を演奏します。そして、リバーブを加えたいために、コードをリバーブで囲んでいます。問題はなさそうには見えますが…。
コードが何をするかを見ていきましょう。まず、loop
は内側のすべてが永遠に繰り返すことを意味します。次に、with_fx
ブロックがあります。これはループが繰り返される度に、新しいリバーブエフェクトを作成することを意味します。ギターの弦を弾くたびに別々のリバーブエフェクターを用意して演奏しているようなものです。そんなことができたらかっこいいかもしれませんが、それはあなたが望むものとは限らないということです。たとえば、次のコードは、ラズベリーパイで実行させるためにはとても労力を要します。リバーブはwith_fx
によって制御され、停止か消去されるまで、生成され続け、スム−ズな演奏に必要とする大切なCPUパワーを奪うことになりかねません。
ギタリストのように、すべての音が1つのリバーブエフェクターを通る従来の設定と同様の流れを作るには、どうしたら良いでしょうか?
以下、サンプルです。
with_fx :reverb do
loop do
play 60, release: 0.1
sleep 0.125
end
end
with_fx
ブロックの内部にloop
を配置しす。この方法では、ループ内すべての音符の再生にリバーブを一つだけ作成します。このコードは効率的で、ラズベリーパイで正常に動作します。
loop
内の繰り返しの上位にwith_fx
を使うことで折り合いを付けます。
loop do
with_fx :reverb do
16.times do
play 60, release: 0.1
sleep 0.125
end
end
end
loop
の外部にwith_fx
を引き上げることで、16の音程ごとに新しいリバーブを作成しています。
これらの異なるアプローチからは、違うサウンド、また異なる性能をもたらします。だから、間違いでもなく可能性であることを覚えておいてください。あなたのプラットフォームに応じた制約の中で、最も適切に働くアプローチを使いわけながら演奏を心がけましょう。
これまでの章では、どのようにシンセやサンプルを扱い、アンプ(増幅)、パン、エンベロープなどのオプションを変更するのかを見てきました。呼び出された個々の音には、元来、音の継続時間を設定するデュレーションオプションが備わっています。
もしも演奏中にギターの弦を歪めビブラートさせるように、オプションを変更できたなら、それってクールではないでしょうか?
あなたは幸運です-このセクションでは、まさしくそれをどのように行うのかを紹介します。
これまでは、新しいサウンドとエフェクトを引き起こす方法について触れてきたただけ見てきましたが、Sonic Piは、演奏中の音を操り、処理する機能を備えています。シンセ扱うためには、変数を用います。
s = play 60, release: 5
これはローカル変数s
が音符60の演奏を処理することを表しています。
このローカル変数は、例えば別の関数といった他の機能からアクセスすることはできません。
一度s
を用意すればcontrol
関数を介して制御することができます。
s = play 60, release: 5
sleep 0.5
control s, note: 65
sleep 0.5
control s, note: 67
sleep 3
control s, note: 72
演奏している間に、1つのシンセのみを呼び出し、3回ピッチを変更します。ここで注目すべき点は、4つの異なるシンセを呼び出していないということです。
標準的なオプション(関数)はcontrol
へ渡すことができます。そしてamp:
, cutoff:
あるいはpan:
のようなオプションを制御することができます。
一度シンセが開始されると、一部のオプションは制御することができなくなります。ADSRエンベロープ·パラメータがこれに該当します。そのオプションが制御可能かは、ヘルプシステムのドキュメントを参照してください。ドキュメントに「設定を変更することは出来ません」というコメントがある場合、シンセが開始した後にオプションを制御することはできません。
エフェクトも、少々異なる方法をとりますが、制御する事が出来ます。
with_fx :reverb do |r|
play 50
sleep 0.5
control r, mix: 0.7
play 55
sleep 1
control r, mix: 0.9
sleep 1
play 62
end
変数を使用する代わりに、do/endプロックのゴールポストパラメータを使用します。”|
”と”|
”の間に、エフェクターを実行するためのユニークな名前を指定する必要があります。この動作は、パラメーター化された関数を使用する場合と同じです。
さあ、シンセやエフェクトをコントロールしてみよう!
シンセやエフェクトの引数を探索しながら、_slide
で終わるオプションがあることに気づいたかもしれません。それらを呼び出しても、何の効果を示さなかった可能性があります。これは正常のオプションではなく、前回のセクションで紹介したように、シンセを制御するときのみ動作をする特別なオプションです。
次の例を考えてみましょう。
s = play 60, release: 5
sleep 0.5
control s, note: 65
sleep 0.5
control s, note: 67
sleep 3
control s, note: 72
ここでは、各control
の呼び出し後、すぐにシンセのピッチの変更を聞くことができますが、ピッチが変化する間にスライドさせたくなるかもしれません。その場合、スライドを追加するために、note:
オプションを制御するように、シンセのnote_slide
オプションを追加する必要があります。
s = play 60, release: 5, note_slide: 1
sleep 0.5
control s, note: 65
sleep 0.5
control s, note: 67
sleep 3
control s, note: 72
control
の呼び出しの間の音程が滑らかに繋がっていることがわかるはずです。いい感じではないでしょうか。note_slide: 0.2
よりも短いスライド時間を使うことで、スライドをスピードアップすることができますし、もっと長い時間を使ってテンポを遅くすることができます。
一度、実行しているシンセの _slide
オプションを設定したら、それは記憶され、
対応するオプションがスライドする度に使用されます。
スライドを停止するためには、次のcontrol
を呼び出す前に0
に_slide
値を設定する必要があります。
また、エフェクトオプションをスライドさせることも可能です。
with_fx :wobble, phase: 1, phase_slide: 5 do |e|
use_synth :dsaw
play 50, release: 5
control e, phase: 0.025
end
さあ、操作に従って、滑らかな変調を楽しみましょう。
プログラマーのツールキットで非常に有益なツールはデータ構造です。
時には、複数の要素を使用して表現したい場合があるでしょう。たとえば、それが次々に演奏される連続した音符が便利だと気づくこともあるでしょう。プログラミング言語は、こういったことを正確に行うためのデータ構造を持っています。
プログラマが利用できるデータ構造はとてもエキサイティングで魅力的なもので、人々は常に新しい発明をしています。しかし、今の私たちは実際には非常に単純なデータ構造リストを考慮する必要があります。
より詳細にそれを見てみましょう。まずは、その基本的な形式を学習し、続いて、リストはどのようにスケール(音階)やコード(和音)を表現するために使用されるのかを学習していきましょう。
このセクションでは、非常に有益なデータ構造であるリストについてみていきます。すでに大まかな方法で、音符をリストから無作為に選ぶことをランダムの章で触れました。
play choose([50, 55, 62])
ここでは、コードやスケールを表現するためにリストの使い方についてみていきます。最初に、コードを演奏する方法をおさらいしてみましょう。sleepを使用しない場合、すべての音が同時に演奏されることを思い出してください。
play 52
play 55
play 59
このコードの別の表現方法を見てみましょう。
1つの方法として、[52, 55, 59]のように、すべての音符をリストに配置することがです。使いやすいplay機能は、リストになった音符をどのように演奏するかをすぐに理解します。試してください。
play [52, 55, 59]
おー、これは読みやすいですね。音符リストの演奏は、通常のパラメータのいずれも妨げになりません。
play [52, 55, 59], amp: 0.3
もちろん、MIDIの代わりに元来の音符の名前を使うこともできます。
play [:E3, :G3, :B3]
多少の音楽理論の知識を持っている方なら、幸運なことに3オクターブでEマイナーのコードが演奏されたことがわかるでしょう。
## リストへのアクセス
もう一つの非常に便利なリストの機能として、リストから情報を取得する機能です。これは少し奇妙に聞こえるかもしれなませんが、本の23ページを開いてくださいと誰かに頼まれることよりも簡単なことです。リストの場合は、インデックス23の要素は何ですか?と尋ねればいいのです。唯一、奇妙なことは、プログラミングのインデックスは通常、1ではなく0から開始されることです。
リストのインデックスは1,2,3と数える代わりに、0,1,2と数えていきます。
それではもう少し詳細にみてみましょう。
[52, 55, 59]
これは特に難しいことは何もありません。リストの2番目の要素は何でしょうか?そう、もちろん55
です。簡単ですね。それでは、同様にコンピュータが答えることができるかどうかを見てみましょう。
puts [52, 55, 59][1]
以前にこのようなものを見たことがない場合、少し奇妙に見えるかもしれませんが、大丈夫。私を信頼してください。難しいことはありません。上記の行には、puts
という命令、リストの52, 55, 59
、インデックスが[1 ]
の3つの部分があります。まずはじめに、Sonic Piへログの中から答えを出力させるためputsを命令します。次にリストを与えています。そして最後に第2の要素を問い合わせています。角括弧でインデックスを囲む必要があり、カウントは0で始まるので、2番目の要素のインデックスは1となります。下記、みてみましょう。
# indexes: 0 1 2
[52, 55, 59]
コードputs [52, 55, 59][1]
を実行してみてください。ログに55とポップアップされるでしょう。インデックス 1
を別のインデックスに変えてみてください。さらに長いlist
を与えて、どのように次のコードで使うのかを考えてみてください。なんらかの音楽の構造として音符の連続を表現することができるのではないでしょうか。
Sonic Piは和音名のリストを返す機能を内蔵しています。実際に試してみましょう。
play chord(:E3, :minor)
さあ、本当に動きましたね。そのままのリストよりも美しく見えますねそして人間にとっても読みやすいでしょう。では、どんな和音をSonic Pi はサポートをしているのでしょうか。沢山あります。下記のように、いくつかのコードを試してみましょう。
chord(:E3, :m7)
chord(:E3, :minor)
chord(:E3, :dim7)
chord(:E3, :dom7)
play_pattern
関数で簡単にコード(和音)からアルベジオ(和音を構成する音を一音ずつ順番に弾いていく奏法)に変更して演奏を行うことができます。
play_pattern chord(:E3, :m7)
でも、それはとてもゆっくりと演奏をしているので、あまり楽しくないかもしれません。play_pattern
は、区切られたリスト内の各音符を再生する度にsleep 1
を呼び出して演奏します。play_pattern_timed
関数を使用することで独自のタイミングと速度を指定することがきます。
play_pattern_timed chord(:E3, :m7), 0.25
時間のリスト化は、時間周期として取り扱うことができるでしょう。
play_pattern_timed chord(:E3, :m13), [0.25, 0.5]
これは下記と同等です。
play 52
sleep 0.25
play 55
sleep 0.5
play 59
sleep 0.25
play 62
sleep 0.5
play 66
sleep 0.25
play 69
sleep 0.5
play 73
どちらの書き方を好みますか?
Sonic Piは広い範囲の音階を演奏できます。C3メジャースケールの再生はどのように行うのでしょうか?
play_pattern_timed scale(:c3, :major), 0.125, release: 0.1
さらに多くのオクターブを実行することができます。
play_pattern_timed scale(:c3, :major, num_octaves: 3), 0.125, release: 0.1
ペンタトニックスケール(オクターブに5つの音が含まれる音階のこと)のすべての音符はどうでしょう?
play_pattern_timed scale(:c3, :major_pentatonic, num_octaves: 3), 0.125, release: 0.1
コードとスケールは、ランダムな選択を強いるには素晴らしい制約です。コードE3マイナーからランダムに音符を取り出すにはこの例を実行してください。
use_synth :tb303
loop do
play choose(chord(:E3, :minor)), release: 0.3, cutoff: rrand(60, 120)
sleep 0.25
end
異なる和音名やカットオフする範囲を試してみましょう。
Sonic Piによってサポートされているスケールやコードを検索するには、チュートリアルの左にある命令ボタンをクリックし、APIリストのスケールまたはコードを選びますメインパネルの情報に、スケールやコードの長いリストが現れるまで下にスクロールしてください(あなたがどれを見るかに依拠します)。
間違いではなく可能性でるということを思い出して、楽しんでください。
標準のリストで面白いスピンオンにリングがあります。いくつかのプログラミングを理解していれば、リングバッファやリングアレイなどをみたことがあるかもしれません。ここでは、まさにring
(環状リスト)についてみていきます。 - それは短く、簡単です。
リストの前章では、インデックスの機構を使用してリストから要素を取り出す方法を説明しました。
puts [52, 55, 59][1]
もしインデックス100を取り出そうとしら、何が起こるでしょう?まあ、3つの要素しか持たないリストの中でインデックス100の要素は、明らかにありません。だからSonic Piは空を意味する nil
を返すでしょう。
ここでは、現在のビート(拍子)が継続的に増加するcounter
を考えてみましょう。まずはカウンターとリストを作成します。
counter = 0
notes = [52, 55, 59]
これで、リストの音符にアクセスするためのカウンタを使用することができます。
puts notes[counter]
素晴らしい、52
を取得しました。カウンターを増やして別の音符を取得してみましょう。
counter = (inc counter)
puts notes[counter]
すごいでしょう、 55
を取得し、それを再び繰り返すならば59を得ます。さらに繰り返す場合は、リスト内の数が不足し
nil`になるでしょう。では、ちょうどループのはじめに戻り、再びリストの先頭から開始したい場合はどうしたらようでしょうか?そのためにリングを使います。
2つの方法の内、どちらか1つの方法でリングを作成することができます。どちらもパラメータとしての環(円環構造を持つリスト)要素であるring
関数を利用します。
(ring 52, 55, 59)
また、正常のリストを取得し、.ring
メッセージをそれを送りリングに変換することができます。
[52, 55, 59].ring
リングのインデックス化
いったんリングを取得したら、インデックスがマイナスもしくはリングの数値より大きい場合を除いて、通常のリストを使用する場合とまったく同じ方法で使用することができます。、そしてリングの1つの要素として括弧でくくられて表示されます。
(ring 52, 55, 59)[0] #=> 52
(ring 52, 55, 59)[1] #=> 55
(ring 52, 55, 59)[2] #=> 59
(ring 52, 55, 59)[3] #=> 52
(ring 52, 55, 59)[-1] #=> 59
現在のビート(拍子)の値を表すために変数を使用しているとしましょう。 その変数は、現在表しているビート値に関わらず、インデックスとして音符を演奏するためや、 リリースタイム(放出時間)、リングに格納されている有用な値として使うことができます。
知っておくと役立つこととして、scale
(音階)とchord
(和音)によって返されたリストもリングであり、任意のインデックスでそれらにアクセスすることを可能にします。
加えて、リングを構成する多くの機能があります。
range
は始点、終点とステップサイズを指定します。bools
は簡単に1と0を使用するためのブール値を扱うことができます。knit
は一連の繰り返される値のために構成することを可能にします。spread
はユークリッド分布に従ったブール値のリングを作成します。詳細については、それら個々のドキュメンテーションを見てください。
range
やspread
のようなコンストラクタに加えて、別なリングの作成方法としては、作成済みのリングを操作する方法があります。
次のような単純なリングを作成します:
(ring 10, 20, 30, 40, 50)
リングを逆にしたいときにはどうしたらよいでしょう?リングを反転させるには、チェーンコマンドの.reverse
を使います:
(ring 10, 20, 30, 40, 50).reverse #=> (ring 50, 40, 30, 20, 10)
では次に、リングから最初の3つの値を取得するにはどうしたらよいでしょう?
(ring 10, 20, 30, 40, 50).take(3) #=> (ring 10, 20, 30)
最後に、リングをシャッフルするにはどうしたらよいでしょう?
(ring 10, 20, 30, 40, 50).shuffle #=> (ring 40, 30, 10, 50, 20)
ここまでで既に強力なリングの作成方法を見てきましたが、 これらのコマンドを一緒に用いることで本当の力を発揮します。
リングをシャッフルし、最初の要素を削除し、次の3つの要素を得る場合にはどうでしょう?
段階的に見ていきましょう:
(ring 10, 20, 30, 40, 50)
- リングの最初の状態(ring 10, 20, 30, 40, 50).shuffle
- シャッフルし - (ring 40, 30, 10, 50, 20)
(ring 10, 20, 30, 40, 50).shuffle.drop(1)
- 最初の要素を削除し - (ring 30, 10, 50, 20)
(ring 10, 20, 30, 40, 50).shuffle.drop(1).take(3)
- 3つの要素を得る - (ring 30, 10, 50)
コマンドを一緒にくっつけるだけでこれらのコマンドの長いチェーンを作ることが分かったと思います。 チェーンコマンドを好きな順序で組み合わせることができ、それにより既に存在するリングから新しいリングを 生成するとても豊かで強力な方法を作り出しています。
リングは強力で重要な特徴を持っています。それは不変性と言って、リングを変更できないということを 意味しています。このセクションで紹介しているチェインコマンドがリングを変更するのではなく、 新しいリングを作成していることを意味しています。これにより、スレッドを跨いでリングを共有して、 同じリングを使っている他のスレッドに影響を与えないで、チェインを開始できることを意味しています。
ここに利用可能なチェーンコマンドを記載しておきます。
.reverse
- 逆順のリングを返却します.sort
- ソートされたリングを作成します.shuffle
- シャッフルされたリングを作成します.take(5)
- 最初の5つの要素をのみからなる新しいリングを返却します.drop(3)
- 最初の3つの要素以外の要素からなる新しいリングを返却します.butlast
- 最後の要素が欠けた状態の新しいリングをを返却します.drop_last(3)
- 最後の3つの要素が欠けた状態の新しいリングをを返却します.take_last(6)
- 最後の6つの要素をのみからなる新しいリングを返却します.stretch(2)
- リングの個々の要素を2回ずつ繰り返します.repeat(3)
- リング全体を3回繰り返します.mirror
- 逆順のリングを自分自身に追加します.reflect
- mirrorと同様ですが、真ん中の要素を重複させないようにします数字を引数に取っているチェーンコマンドは、他の数字を取ることももちろん可能です。
最初の5個の要素を削除したい場合には、.drop(3)
の代わりに遠慮無く.drop(5)
を呼んでください。
SonicPiの中で一番エキサイティングな特徴の1つは、ライブでギターをかき鳴らすのと同じように、ライブで音楽を演奏しながら、その場でコードを書き換え、音を変化させていくことができることです。シンプルなループを走らせ、そのサウンドが完璧になるまで調整しつつ。この方法で優れているのは、演奏中たくさんの反応をもらうことができることです。ですが、一番の利点は、Sonic Piでステージ上でライブができることです。
このセクションでは、コードを書き換えながら力強いパフォーマンスにつなげることができるLiveCodingの基本を学んでいきます。しっかりついてきてくださいね。
実際に楽みながら演奏をする方法を十分に学んできました。この章では、 これまでのすべての章から、どの様に作曲を開始し、ライブパフォーマンスに繋げるかを紹介していきます。 そのために3つの主な要素が必要になります。
よーし、始めましょう。最初の音をライブコーディングしましょう。まず演奏したいコード含む関数が必要です。 簡単なところから始めましょう。スレッドでその関数を呼び出すループもほしいところです。
define :my_loop do
play 50
sleep 1
end
in_thread(name: :looper) do
loop do
my_loop
end
end
もしそれが少し複雑に見える場合は、ファンクション(関数)とスレッドのセクションに戻って
復習してください。 既にこれらを頭に焼き付けているならば、それほど複雑ではありません。
ここにあるものは、単にplay 50
を演奏し、ビートのためにsleep 1
を実行するファンクション(関数)です。
そしてmy_loop
を呼び出し、繰り返しを実行する:looper
という名前付きスレッドを定義しています。
このコードを実行すると、音符50を何度も何度も繰り返します。
これから楽しみが始まります。コードを実行しながら、50を別の数値55に変更し、もう一度Runボタンを押してみましょう。すごい迫力!変化しましたね!ライブ!
スレッドそれぞれに別の名前を使うことによって、新しいレイヤは追加されせんでした。
そのうえ、そのファンクション(関数)が再定義されることより、音が変化しました。
:my_loop
に新しい定義を与えると、:looper
スレッドが新しい定義付けを繰り返します。
スリープ時間をや音符を変更し、再び試してみてください。どのように`use_synthを追加するには どうすればよいのでしょうか。たとえば、次のように変更します。
define :my_loop do
use_synth :tb303
play 50, release: 0.3
sleep 0.25
end
かなり面白くなってきましたが、それをさらに盛り上げることができます。 代わりに、何度も何度も同じ音を再生する、和音を弾いてみましょう:
define :my_loop do
use_synth :tb303
play chord(:e3, :minor), release: 0.3
sleep 0.5
end
コードからランダムな音階を演奏するにはどうでしょう。
define :my_loop do
use_synth :tb303
play choose(chord(:e3, :minor)), release: 0.3
sleep 0.25
end
またはランダムなカットオフ値を使用してみましょう。
define :my_loop do
use_synth :tb303
play choose(chord(:e3, :minor)), release: 0.2, cutoff: rrand(60, 130)
sleep 0.25
end
最後に、いくつかのドラムを追加しましょう。
define :my_loop do
use_synth :tb303
sample :drum_bass_hard, rate: rrand(0.5, 2)
play choose(chord(:e3, :minor)), release: 0.2, cutoff: rrand(60, 130)
sleep 0.25
end
どんどんおもしろくなってきましたね!
しかしながら、ファンクション(関数)とスレッドを使ったライブコーディングにステップアップする前に、
一息ついて、Sonic Piで永遠にコードを変える方法live_loop
について次の章を読んでいきましょう。
このチュートリアルの中でもこの章は、最も重要です。もし1つの章だけを読むのであれば、この章でしょう。 もし、前の章でライブコーディングの基礎を読んでいるのであれば、live_loopは、演奏するための簡単な方法で、 あまり多くを記述することはありません。
前の章を読んでいない場合、live_loop
はSonic Piでジャム(即興演奏)するための最良の方法でしょう。
演奏してみましょう。新しいワークスペースに次のように書いてください。
live_loop :foo do
play 60
sleep 1
end
Rnnボタンを押してください。基本的なビープ音が数秒なります。
これでは楽しくないのですが、まだStopを押さないでください。
もう一度 60
を65
へ変更し実行してください。
わー! 調子を崩さずに自動的に変化しました。 これがライブコーディングです。 いっそうベースのように変えてみましょう?演奏したままコードを更新しましょう。
live_loop :foo do
use_synth :prophet
play :e1, release: 8
sleep 8
end
ここでRunボタンを押してください
カットオフを動かしてみましょう。
live_loop :foo do
use_synth :prophet
play :e1, release: 8, cutoff: rrand(70, 130)
sleep 8
end
Runボタンをもう一度押しましょう
いくつかのドラムを追加してみましょう。
live_loop :foo do
sample :loop_garzul
use_synth :prophet
play :e1, release: 8, cutoff: rrand(70, 130)
sleep 8
end
e1
からc1
に音符を変更してみましょう。
live_loop :foo do
sample :loop_garzul
use_synth :prophet
play :c1, release: 8, cutoff: rrand(70, 130)
sleep 8
end
このあとは私の言うことを聞くのを止めて、自由に演奏してみましょう! 楽しんでください!
次のライブループを考えていきましょう。
live_loop :foo do
play 50
sleep 1
end
なぜ’: foo’という名前をつける必要があるか疑問をもつかもしれません。この名前は、 このライブループが他のすべてのライブループと異なっていることを示すために重要です。
同じ名前で実行中の2つのライブループが存在することはできません。
これは、複数同時にライブループを実行したい場合、それぞれに異なる名前を付ける必要があることを意味します。
live_loop :foo do
use_synth :prophet
play :c1, release: 8, cutoff: rrand(70, 130)
sleep 8
end
live_loop :bar do
sample :bd_haus
sleep 0.5
end
各ライブループを個別に変更し更新できます。そしてすべてちゃんと動作します。
既に気づいているかもしれませんが、ライブループは、以前にみてきたスレッドのcueの
メカニズムを使用して自動的に動作します。
ライブループがループするたびに、それが新しい名前を持つライブループのcue
eventを生成します。
従って、cue
をきっかけに何も停止せずにサウンドのループを同期させることができます。
この同期のとれたコードを考えてみましょう。
live_loop :foo do
play :e4, release: 0.5
sleep 0.4
end
live_loop :bar do
sample :bd_haus
sleep 1
end
それを停止することなくタイミングと同期を修正することができるかを見てみましょう。
まずは、foo
ループ内のsleep
の要素を0.5に変えてみましょう。
live_loop :foo do
play :e4, release: 0.5
sleep 0.5
end
live_loop :bar do
sample :bd_haus
sleep 1
end
まだ終了することはできません。あなたは調子がまったく合っていないことに気付くでしょう。 これはループがずれているからです。 他と同期するように、それを修理していきましょう。
live_loop :foo do
play :e4, release: 0.5
sleep 0.5
end
live_loop :bar do
sync :foo
sample :bd_haus
sleep 1
end
うわー、すべてを停止することなくすべてが完璧に同期しました。
いまから、ライブループを使用したライブコーディングを始めましょう!
ライブコーディングでリングをループしていて、気が付くとたくさんのことをしていたことはないでしょうか。 例えば、リングにメロディーの音符を入れたり、リズムのスリープ、 コード進行や音色のバリエーションを入れたり等々。
Sonic Piはlive_loop
内でリングと共に使えるとても手軽なツールを提供しています。
それはチックシステムと呼ばれ、tick through rings(リングをチックタックと進める)
機能を提供しています。次の例を見てください。
live_loop :arp do
play (scale :e3, :minor_pentatonic).tick, release: 0.1
sleep 0.125
end
ここでは、E3マイナーペンタトニックのスケールを作成し、各要素をチックしています。これは.tick
を
スケール宣言の末尾に追加することによって実現されています。このチックはライブループ内で局所的であるため、
個々のライブループは独立したチックを持つことができます。
live_loop :arp do
play (scale :e3, :minor_pentatonic).tick, release: 0.1
sleep 0.125
end
live_loop :arp2 do
use_synth :dsaw
play (scale :e2, :minor_pentatonic, num_octaves: 3).tick, release: 0.25
sleep 0.25
end
tick
はまた標準関数としても呼ぶことができ、その値はインデックスとして使うことができます。
live_loop :arp do
idx = tick
play (scale :e3, :minor_pentatonic)[idx], release: 0.1
sleep 0.125
end
しかし、この場合は.tick
を呼ぶほうが良いでしょう。tick
関数の用途は、
チックの値で手の込んだことをしたかったり、リングのインデックス以外のことにチックの値を使いたかったりする場合です。
チックの魅力的なところはそれが新しいインデックス(もしくはそのインデックスにあるリングの値)
を返すだけでなく、次にチックを呼んだときに必ず次の値を返すことを保証していることでしょう。
tick
が色んな形でこのような動作をしていることをこのドキュメントの例で見てみてください。
しかし、ここでチックの現在の値を見たいだけで値を増加させたくないの場合もあることを指摘することは重要でしょう。
これはlook
関数により実現可能です。look
を標準関数として呼んだり、リングの後ろに.look
を付けたりできます。
最後に、1つのライブループに複数のチックが必要になることがあるかも しれません。これはチックに名前を付けることで実現できます。
live_loop :arp do
play (scale :e3, :minor_pentatonic).tick(:foo), release: 0.1
sleep (ring 0.125, 0.25).tick(:bar)
end
ここでは2つのチックを使っていて、1つは音符用に、1つはスリープ時間用にしています。
これらのチックは同じライブループにあるので、別々にしておくためにユニークな名前を与えています。
これはちょうどlive_loop
に名前を付ける(:
から始まるシンボル名を渡すだけ)のと同じことです。
上の例では1つは:foo
でチックを呼び出し、もう1つは:bar
で呼び出しています。
また、これらの値をlook
したい場合には、チックの名前をlook
に渡す必要があります。
チックシステムの能力のほどんどは、最初のうちは役に立たないでしょう。
このセクションの全ての内容を学習しようとしないでください。
一つのリングでチックすることだけに集中するとよいでしょう。
そうすることで、live_loop
でリングをチックする簡単さや楽しみを得ることができるでしょう。
tick
のドキュメントには役に立つ例がたくさんあるので、それを見て楽しくチックしてみましょう!
この章ではSonic Piの経験を最大限に活用するために、 いくつかの非常に便利で、実際のところ不可欠な知識を紹介します。
用意した多くのキーボードのショートカットを活用する利点と、作品を共有する方法、そして Sonic Piでパフォーマンスするためのいくつかのヒントを見ていきます。
Sonic Piはコーディング環境としての楽器です。したがって、あなたが観客の前でライブ演奏している場合は特に、 ショートカットは、はるかに効率的で自然にSonicPiの演奏を行うことができます。
Sonic Piの多くの機能は、キーボードを介して制御することができます。 Sonic Piの演奏や作業により慣れるために、ショートカットをもっと使いこなしましょう。
個人的にはブラインドタッチの学習の検討をお勧めします。マウスを使う必要があるときに、動作が遅れ、私はいつもイライラしてしまいます。だから、普段からこれらのショートカットのすべてを使っています!
ショートカットを学べば、効果的にキーボードを使用でき、あなたは、間もなく、プロのようなライブコーディングができるようになるでしょう。
しかし、一度にすべてを憶えようとしないで、 まずはあなたが最も使うものを試しながら、実践の中で、さらに追加しながら憶えていくとよいでしょう。
クラリネットを習っているところを想像してみてください。すべてのクラリネットは、指使いや操作の全てが一貫してしていることを前提として作られていますが、もしそうでなかったら、別のクラリネットに乗り換えるには大変な時間を費やしてしまうだろうし、一回だけの制作のためにそれを使用することについて戸惑ってしまうでしょう。
残念なことに3つの主要なオペレーティングシステム( Linux、 Mac OS XおよびWindowsの場合)では、カット&ペーストなどの操作のために独自の基準が用意されています。 Sonic Piは、これらの基準に準拠します。しかしながらプラットフォームの基準に対応することよりも、 優先事項として、Sonic Pi内はクロスプラットフォームとして一貫した配置がなされています。 これは Raspberry Piで演奏したり、ショートカットを学ぶ時、 MacやPCに乗り換えても、違和感無く同じように操作できることを意味しています。
一貫性への考え方のひとつにショートカットの命名があります。SonicPiにおいて、主要な2つの組み合わせキーを当てはめるために、Control キーとMetaキーを用います。すべてのプラットフォームでは、Control キーは同じです。しかし、LinuxとWindowsでは、実際のMetaキーはAltキーで、MacのMetaキーはコマンド⌘キーです。一貫性のために、Metaキーを使いますが、 あなたのオペレーティングシステムにおける適切なキー配置であることを憶えておいてください。
シンプルで読みやすくするために、Ctrlキー+その他のキーは「C-」、Metaキー+その他のキーは「M-」の略語を使います。例えば、もしMetaキーと’ r ‘を同時に押さえるショートカットを要求する場合、「M-r」と表記します。 以下は、僕が見つけたとっても有用なショートカットのいくつかです。
マウスを使う代わりに、M-r
でコードを実行することができます。同様に、M-s
でコードを停止することができます。
ナビゲーションのショートカットを使わない操作は実にもどかしいです。そのため、ショートカットを学ぶことに時間を費やすことを強くお勧めします。マウスやキーボードの矢印キーを手で移動させるより、ブラインドタッチを学ぶことで、これらのショートカットをさらに有効に活用することができます。
文章の先頭に移動するにはC-a、文章の末尾に移動するにはC-e、1行上はC-p、1行下がるにはC-n、一文字進むにはC-f、そして、一文字戻るにはC-b。C-kでカーソルからラインの末尾まで全ての文字を消去する事ができます。
コードを自動整形するには M-m
を押します。
ヘルプシステムを切り替えるには、M-i
を押します。しかし、何かを見つける場合、もっとはるかに便利なショートカットは、カーソル下の単語検索し、ドキュメントを表示するC-i
です。簡単でしょう!
完全なリストについては、セクション10.2ショートカット一覧表を見てみましょう。
以下は、Sonic Piで利用可能な主なショートカットをまとめたものです。動機と背景については、セクション10.1を参照してください。
このリストでは下記の規定に準拠します。 (WindowsとLinuxのMetaキー はAltキー 、そしてMacは Cmdキー):
C-a
はControl キーを押さえながらaキー、両方を同時にを押した後に離す事を意味しています。M-r
はMeta キーを押さえながらrキー、両方を同時にした後に離す事を意味しています。M-Z
はMeta キーを押さえながらShiftキー、そして最後にzキー全てを同時に押した後に離す事を意味しています。C-M-f
はControl キーを押さえながらMetaキー、そして最後にfキー全てを同時に押した後に離す事を意味しています。M-r
- コードを実行M-s
- コードを停止M-i
- ヘルプシステムを表示M-p
- 設定を表示M-a
- 全てを選択M-c
- 選択個箇所をコピーM-x
- 選択個箇所をカットM-v
- エディターへ張り付けM-+
- 文字サイズを大きくM--
- 文字サイズを小さくM-m
- テキストを整形C-g
- エスケープC-a
- 行の冒頭に移動C-e
- 行の末尾に移動C-p
- ひとつ前の行に移動C-n
- 次の行に移動C-f
- 一文字進むC-b
- 一文字戻るC-M-f
- 一単語進むC-M-b
- 一単語戻るC-h
- 前の文字を削除C-d
- 次の文字を削除C-l
- 真ん中へ移動C-h
- 前の文字を削除C-d
- 次の文字を削除C-i
- カーソル以下の文字を表示M-z
- アンドゥ(行った操作を取り消し、元の状態に戻る)M-Z
- リドゥ(一旦取り消した操作をやり直す)C-k
- カーソルから行の末尾まで全ての文字を消去するSonicPiは、お互いに共有し学習するものです。
いったん、どのように音楽をコード化するかを学んだら、作曲したコードを共有することは電子メールを送信するのと同じくらい簡単なことです。あなたの作品から学び、さらに新しいマッシュアップで部品を使えるように他の人とコードを共有しましょう。
もしあなたの作品を他者と共有するためのよい方法が見当たらなければ、あなたの音楽をSoundCloudへ、そしてコードをGitHubに置くことをお勧めします。その方法で、あなたの作品は、容易にたくさんの人に届けることができるのです。
GitHubは、コードを共有し作業するためのサイトです。コードの共有や共同作業のためにプロの開発者と同じくアーティストも使用しています。新しい作品のコード(あるいは未完の作品)を共有する最も簡単な方法は、このGitHubでGistを作成することです。Gist機能はあなたのコードをアップロードすることで、簡単に他の人が参照、コピーし共有することができます。
作品を共有するもう一つの重要な方法は、音を録音しSoundCloudにアップロードすることです。作品をアップロードしたら、他のユーザーがコメントしあなたの作品について話し合うことができます。また、トラックの詳細にあなたのコードのGist へリンクを貼ることをお勧めします。
作品を記録するには、ツールバーのRec
ボタンを押すと、すぐに録音を開始します。
もしコードがすでに進行中でなければ、開始するためにRun
を押してください。録音が完了したら、
再び点滅しているRec
ボタンを押すと、ファイル名を入力するよう求められます。
WAVファイルとして保存された録音は、無料のソフトウエア(例えば、 Audacityを試してみてください)の任意の設定によって編集したりMP3に変換することができます。
私はみなさんが作った作品を共有し、Sonic Piで実際に新しいトリックや動きをお互いに教えあってもらえることを願っています。あなたが何を魅せてくれるか本当に楽しみにしています。
Sonic Piの中で最もエキサイティングな側面の一つは、楽器としてコードを使うことができるということです。これは、コードをライブで書き込むことが、音楽を演奏する新しい方法とみなすことができることを意味します。
我々は、これをライブコーディングと呼んでいます。
コードをライブするとき、観客にあなたの画面を表示することをお勧めします。そうでなければ、ギターを指や弦を隠しながら演奏するようなものです。私は家で練習するときは、ラズベリーパイと小型プロジェクターでリビングルームの壁に投影します。自分のテレビや学校/職場のプロジェクターのいずれかを使ってみましょう。挑戦してみてください、とても楽しいです。
絶対に1人で遊ばないでください - ライブコーディングバンドを結成しましょう!他の人とのセッションはとても楽しいものです。一人はビートを担当し、他のBGMや環境音など、どんな面白い音の組み合わせがつくれるか一緒に試しましょう。
ライブコーディングは新しいものではありません 一部の人々は、自ら構築した特注システムを使用して、ここ数年でライヴコーディングに取り組んできました。他のライブコーダーやシステムについての詳細を知るにはTOPLAP絶好の場所があります。
ライブコーディングの世界を探索するためのもう一つの偉大なリソースはAlgoraveです。ここで、クラブシーンでのライブコーディングに特化した情報を見つけることができます。
Sonic Piは現在、 Minecraft Piと対話するためのシンプルなAPIをサポートしています。Minecraftの特別版は、Raspberry PiのLinuxベースのオペレーティングシステムRaspbianにデフォルトでインストールされています。
Minecraft Piは、とっても簡単に扱えるよう設計されています。必要なことは、Minecraft Piを起動して世界を創造するだけです。その後、play
や synth
を扱うように mc_*
関数を自由に使います。何かのライブラリをインストールしたり、インポートする必要はありません。箱から出して動かしてみましょう。
The Minecraft Pi API はMinecraft Piアプリケーションへの接続を可能にします。あなたは何も心配をしなくてもよいということです。 Minecraft Piを起動せずに、Minecraft Pi APIを使おうとした場合には、Sonic Piはこれを丁寧に教えてくれます。同様に、live_loop
を実行する一方で、もしも、MinecraftPiを閉じてしまっても、live_loopの接続を停止し、接続できてないことを丁寧に伝えてくれます。再接続するために、再びMinecraft Piを起動して、Sonic Piが自動検出して、再接続を試みます。
Minecraft Pi APIはlive_loop
内でシームレスに動作するように設計されています。
これは、SonicPiの音に変更を加え、Minecraft Piの世界の変更と同期させることが可能であることを意味します。
インスタントなMinecraftベースのミュージックビデオです! Minecraft Piはアルファ版のソフトウェアであり、
わずかに不安定であることに注意してください。何か問題が発生した場合は、単純にMinecraft Piを再起動し、以前と同様に続けましょう。Sonic Piの自動接続機能が対応します。
Sonic PiとMinecraftの両方を実行したい場合は、特にSonic Piのサウンド機能を使用したい場合は Raspberry Pi 2.0を使用することをお勧めします。
現段階では、Sonic Piは、次のセクション11.1に詳述されている基本ブロックとプレイヤーの操作をサポートしています。 世界の中のプレイヤーの相互作用によるトリガーされるイベントのコールバックのサポートは、 将来のリリースバージョンで予定されています。
Sonic Pi は現在、下記のMinecraft Piの基本インタラクションをサポートしています:
これら、それぞれを順番に見てみましょう。
それではSonic Pi からの Minecraft Piの制御が、どれだけ簡単か見てみましょう。まずはじめに Minecraft Pi とSonic Pi が同時に起動しているかを確認し、 Minecraft の世界に入って歩くことができることを確認してください。
新しいSonicPi のワークスペースで、次のコードを入力してください。
mc_message "Hello from Sonic Jam Pi"
Runボタンを押すと、Minecraft ウィンドウにあなたのメッセージが表示されます。おめでとう、あなたは最初の Minecraft コードを書きました!簡単でしたね。
これから、小さな魔法を試してみましょう。どこかに瞬間移動してみましょう!以下を試してください。
mc_teleport 50, 50, 50
Runを押すとボーン!新しい場所へあなたの座標が移動しました。たいていは、乾燥した土地、または水に落ちたか、空中のどこかでしょう。50, 50, 50
、これらの数字は何でしょう?これらは瞬間移動しようとしている場所の座標です。Minecraftをプログラムするにあたり、座標がどのように動作するのか、本当に重要であるので、短い時間でみていきましょう。
いくつかの宝の場所が大きなX
でマーキングされた海賊の地図を想像してみてください。X
の正確な位置は、左から右へ向かってどれくらい離れているか、下から上へ向かってどのくらい離れているか、この二つの数字で場所を記述することができます。例えば、横へ10cm
、上に8cm
。これら2つの数字10
と8
が座標です。他に隠された宝物の在処も別の2つの数字で容易に記述できることが想像できますね。おそらく、2
つ横切り、9
つ上には大きな金脈がありそうです…
さて、 Minecraftの中では2つの数字では十分ではありません。また、私たちがどれだけ高い所にいるのかを知る必要があります。したがって、3つの数字が必要になります。
x
z
y
通常、 x
, y
, z
でこれらの座標を記述します。
座標を使って遊んでみましょう。Minecraftのマップで素敵な場所に移動した後、 SonicPiに切り替え次を入力してください。
puts mc_location
Runボタンを押すと、ログ画面に、現在位置の座標が表示されます。それらを書き留め、その後で、世界で前方に移動し、再び挑戦してください。これを正確に繰り返すことに時間を使うことをお勧めします。座標がどのように変化するかに注目しましょう!座標移動を繰り返して、世界のビットを移動しましょう。あなたが移動すると座標がどのように変化するか感触を得られるまで、これを行いましょう。これを調整する方法が理解できれば、MinecraftのAPIを使用したプログラミングがほぼ完了します。
現在位置をどのように知り、座標を利用して瞬間移動する方法を知っているあなたは、
Mincraft内に、コードで何かを構築し始めるための必要な道具をすべて持っています。
座標40
, 50
, 60
にガラスのブロックを作りたかったら、それはとっても簡単ですね。
mc_set_block :glass, 40, 50, 60
ハハ、それは本当に簡単でした。あなたhandyworkを表示するには ちょっと近くに瞬間移動してみましょう。
mc_teleport 35, 50, 60
振り向くと、あなたのガラスのブロックが表示されるはずです!それをダイヤモンドに変更してみましょう。
mc_set_block :diamond, 40, 50, 60
もし正しい方角で見れば、それがあなたの目の前で変更される可能性があります! これはエキサイティングな何かの始まりです…
少し複雑なことに移る前に、最後の一つを見てみましょう。座標の集合を与え、 特定のブロックの種類が何であるかをMinecraftに訪ねることができます。 では、先ほど作成したダイヤモンドブロックでそれを試してみましょう。
puts mc_get_block 40, 50, 60
イェイ! それは:diamond
(ダイヤモンド)ですね。ガラスに戻して、
もう一度尋ねてみましょう。:glass
を示しましたか?信じています(^o^)
Minecraft Pi コーディングへ暴れに行く前に、利用可能な ブロックタイプの便利なリストを示します:
:air 空気
:stone 石
:grass 草
:dirt 汚れ
:cobblestone 石畳
:wood_plank 木の板
:sapling 苗木
:bedrock 岩盤
:water_flowing 水流
:water 水
:water_stationary 静止した水
:lava_flowing 溶岩流
:lava 溶岩
:lava_stationary 固まった溶岩
:sand 砂
:gravel 砂利
:gold_ore 金の鉱石
:iron_ore 鉄鉱石
:coal_ore 石炭鉱石
:wood 木材
:leaves 葉
:glass ガラス
:lapis ラピス
:lapis_lazuli_block ラピスラズリブロック
:sandstone 砂岩
:bed ベッド
:cobweb クモの巣
:grass_tall 背の高い草
:flower_yellow 黄色い花
:flower_cyan シアン色の花
:mushroom_brown 茶色いキノコ
:mushroom_red 赤いキノコ
:gold_block 金のブロック
:gold 金
:iron_block 鉄のブロック
:iron 鉄
:stone_slab_double 石板(ダブル)
:stone_slab 石板
:brick レンガ
:brick_block レンガブロック
:tnt
:bookshelf 本棚
:moss_stone 苔石
:obsidian 黒曜石
:torch トーチ
:fire 火
:stairs_wood 木の階段
:chest チェスト
:diamond_ore ダイアモンドの鉱石
:diamond_block ダイアモンドのブロック
:diamond ダイアモンド
:crafting_table 作業テーブル
:farmland 農地
:furnace_inactive 廃炉
:furnace_active 炉
:door_wood 木のドア
:ladder はしご
:stairs_cobblestone 石畳の階段
:door_iron 鉄のドア
:redstone_ore レッドストーン鉱石
:snow 雪
:ice 氷
:snow_block 雪のブロック
:cactus サボテン
:clay 粘土
:sugar_cane サトウキビ
:fence フェンズ
:glowstone_block 光る石のブロック
:bedrock_invisible 目に見えない岩盤
:stone_brick 石レンガ
:glass_pane ガラス板
:melon メロン
:fence_gate フェンスゲート
:glowing_obsidian 輝く黒曜石
:nether_reactor_core 原子炉コア
これでSonic Pi入門のチュートリアルを終了します。方法に沿って何かを学べたのではないでしょうか。すべてを理解していなくても心配しないでください。とにかく時間を使って演奏し楽しんでください。質問があれば、気軽に戻ってチュートリアルを読み直してみてください。
もし、チュートリアルでカバーされていない疑問がある場合は、Sonic Pi forumsを開き、質問をしてください。そこでは、誰かが親身に手を貸してくれるでしょう。
最後に、このヘルプシステムのマニュアルの他の部分をより深くチェックすることをお勧めします。このチュートリアルではカバーしていない機能がいくつかあるので、新たな発見が待っているでしょう。
遊んで、楽しんで、コードを共有して、そしてスクリーンをみせながら、友人のために演奏してください。 そして思い出してください。
間違いはない、あるのはただ可能性だけ