# 1 - Welcome friend:-)

Sonic Pi（ソニックパイ）へようこそ。これから説明するクレイジーな音造りに、あなたも夢中になることを願っています。音楽、シンセ、プログラミング、作曲、演奏など、これから学ぶことは、本当に刺激的なものになるでしょう。

でも、ちょっと待ってください。まずは自己紹介が必要でしたね。失礼いたしました！私は、Sonic Piを作成したSam Aaronといいます。 Twitter上の@samaaronで見つけることができますので、連絡くれるとうれしいです。もしかすると、 僕が観客の前で演奏しているライブコーディングのバンドMeta-eXにも興味を持ってもらえるかもしれません。Meta-eXの演奏の中で使っているトラックの一つを、Sonic Piの例の中で見つけることができます。

Sonic Piを改善するために、気づいたことや、アイデアでを持っていたら、是非、知らせてください。 フィードバックはとても役立ちます。あなたのアイデアが次の重要な機能になるかもしれません！

最後に、このチュートリアル（使いかた）は、カテゴリ別にグループ化されたセクションに分かれています。 始まりから終わりまで、簡単に学べるように手引きを書いたので、自由に、色々なセクションを覗いてみてください。 何か、不足している点に気がついたら、将来のバージョンのために検討したいので、知らせてください。

では、早速はじめましょう！

# 1.1 - ライブコーディング

Sonic Piの最もエキサイティングな側面のひとつは、まるでギターをライブで演奏するかのように、 ライブでコードを書いて音楽を作ることができることです。つまり、ステージやコンサートでSonic Piが 使えるということです！

## 心を解き放て

これからチュートリアルで、実際のSonic Piの詳しい使い方に入る前に、まず、 ライブコーディングがどんなものか体験してみましょう。あまり（もしくは全然）わからなくても、 心配ご無用！そのまま席についたまま、楽しんでいきましょう。

## ライブループ

さぁ、はじめましょう！下のコードを上の空欄のWorkspace（ワークスペース）にコピーしてみましょう。

    live_loop :flibble do
     sample :bd_haus, rate: 1
     sleep 0.5
    end

左上の`Run`（再生）ボタンを押すと、いい感じの速さでバスドラムの音が聞こえてきます。 `Stop`（停止）ボタンを押せば、いつでも音を止めることができます。ですが、 まだ`Stop`（停止）ボタンを押さずに、次のステップを実行しましょう。

1. -バスドラムがまだ鳴っていることを確認します。
2. -`sleep`の値を、`0.5`から、`1`より大きい値に書き換えてみましょう。
3. -`Run`（再生）ボタンをもう一度押します。
4. -ドラムの早さがどのように変わったかを確認してみましょう。
5. -この瞬間を忘れないでください。これが、あなたが初めてSonic Piでライブコーディングをした瞬間です。この瞬間を忘れないでください。そしてこれが最後にはならないはず・・・

これは簡単でした。では他の要素を加えてみましょう。`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

さあ、これらが実際にどう動くか好奇心が動き出すまで、 そしてあなたが次に何をしたらいいかを知りたくなるまで、演奏と実験を続けましょう。 さあ、残りのチュートリアルを読む準備ができました。

次にあなたを待っているものは・・・

# 1.2 - Sonic Pi のインターフェース

Sonic Piは、音楽をコーディング(記述)するための とてもシンプルなインターフェース(操作画面)を持っています。 ちょっと見てみましょう。

- A - 演奏の操作
- B - 編集の操作
- C - 情報とヘルプ
- D - コードエディタ
- E - ログ画面
- F - ヘルプシステム

## A. 演奏の操作

ここにあるグリーンのボタンで、音を再生したり停止するための主要な操作ができます。 Runボタンは編集画面内のコードを実行します。Stopボタンですべてのコードの動作を停止します。 Saveボタンは外部ファイルにコードを保存し、Recordボタンは演奏中の音を (WAV ファイルに)録音します。

## B. 編集の操作

これらのオレンジ色のボタンで編集画面を操作します。 Size +とSize -ボタンは文字サイズを大きくしたり小さくします。 Align ボタンはより専門的で見やすいコードに整えてくれます。

## C. 情報とヘルプ

これらの青いボタンで、情報、ヘルプや設定にアクセスします。Info ボタンは、 概要、コア、協力者、コミュニティ、ライセンス、ヒストリーといったSonic Pi自体についての情報を画面に表示します。 HelpボタンはFのヘルプシステム表示を切り替えます。 またPrefsボタンは基本的なシステムを操作するための設定画面の表示を切り替えます。

## D. コードエディタ

ここでは音楽を作曲/演奏したりするためのコードを書く領域です。コードを書いたり、消したり、 切り取り、貼り付けなどを行うためのシンプルな編集画面です。Google Docsやワードの基礎版だと思ってください。 編集画面ではコードの意味合いに応じて自動で色つけします。はじめは変わっていると思うかもしれませんが、 とても使いやすくなるはずです。例えば、数値は青色で示されます。

## E. ログ画面

コードを走らせた時、ログ画面にはプログラムがどうなっているかについての情報が表示されます。 既定では、正確な再生時間を毎音ごとにメッセージとして見ることができます。 コードのデバッグ（欠陥を取り除く作業）に利用でき、コードが何をしているかを理解することにも役立ちます。

## F. ヘルプシステム

最後は、SonicPiインターフェースのもっとも重要な部分の一つである、画面の下にあるヘルプシステムです。 青いHelpボタンによって表示/非表示を切り替えることができます。 ヘルプシステムは、ヘルプと情報を含んでいます。このチュートリアル、入手できるシンセのリスト、 サンプルや実例、効果のリスト、そして音楽をコーディングするために備えているSonic Piの 全機能のリストといった、Sonic Piの全てについてのヘルプと情報があります。

# 1.3 - 遊びを通した学び

SonicPiは、遊びと実験を通して、コンピューティングと音楽の両方を学ぶ手助けをしてくれます。 もっとも大切なことは、楽しむこと。そうすれば、コードや作曲、演奏を、学ぶ前に自然と身につけられるでしょう。

## 間違いはない

この章の間に、何年も音楽とライブコーディングを学んできた私から、 ちょっとアドバイスを。

「間違いはない、あるのはただ可能性だけ。」

これは、しばしばジャズについて言われることですが、ライブコーディングにも同様に言えることです。 経験に関係なく、あなたが全くの初心者でも、熟練のコーディング使いでも、作り出すコードが まったく予期せぬ結果になることがあります。めちゃくちゃクールに聞こえる場合は、そのコードを実行すればいいのですが、しかし、すごく耳障りで場違いに聞こえる場合もあります。 ですが、そうなっても問題ではありません。重要なのは、あなたが次にすべきことです。 音を取り除き、それを操作し、素晴らしいものに変化させるのです。観衆は熱狂するでしょう。

## シンプルにはじめよう

学習していると、今すぐすごいことをしたい気持ちに駆られます。しかし、今はその気持ちをこらえ、 それは後に到達する遠い目標として持ってください。今のところは、あなたの頭の中にあるすごいことに向かう 価値ある小さな一歩として、楽しくやりがいをもって書くという「最も単純な事」を考えていきましょう。 一度、その誠実に学ぶイメージを持って、試し、それを構築し、そして再生していけば、斬新なアイデアを与えてくれるでしょう。 すぐに、あなたは、楽しみながら、確実に上達をすることに大忙しになっているでしょう。

でも、みんなと作品をシェア（共有）することは忘れないでください！

# 2 - シンセ

Sonic Piの紹介はこれくらいにして、さっそく音を試してみましょう！

この章では、基本的なシンセ（synth）の出し方と操作方法を紹介します。シンセは、 音を作り出すシンセサイザーという響きのよい言葉を短縮したものです。典型的なシンセは、 非常に使うのが複雑です。特にアナログのシンセは、沢山のパッチワイヤーとモジュールがついています。 ですが、Sonic Piでは、とても簡単で親しみやすい方法で、このシンセの力を手に入れることが出来ます。

Sonic Piの分かりやすくシンプルな操作画面に騙されないでください。 もし使いこなせたら、洗練されたサウンド操作を可能にします。きっと驚くはずです。

# 2.1 - 初めての音

下記のコードをみてください:

    play 70

ここからすべてが始まります。アプリの上部のコードウィンドウ（実行ボタンの下に大きな空白）にコピーして貼り付けます。そして、左上のRunボタンを押してみましょう。

## ビープ音がなった!

ビックリした？もう一回、押してみましょう。そしてもう一回..。

わお！すごい！一日中楽しんで入られそうだけど、でも待って。 ビープ音の無限の流れに夢中になる前に、数値を変えてみましょう。

    play 75

違いが分かりますか？より低い値も試してみましょう。

    play 60

つまり、より低い値は低い音程（ピッチ）の音を、より高い値は高い音程（ピッチ）の音を鳴らします。 ちょうどピアノのように、低い部分の鍵盤（左手側）が低い音階を演奏し、高い部分の鍵盤（右手 側）が高い音階を奏でます。実は、数値は実際にピアノの鍵盤と関係しています。`play 47`は、実はピアノの47番目の鍵盤を演奏することを意味しています。`play 48`は一音上がる（右隣りの鍵盤）ということです。第４オクターブは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’を追加します。

夢中になって、自分の曲を作って楽しみましょう。

# 2.2 - シンセのオプション：Amp と Pan

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

では、続けてあなたの音のアンプやパンを変えて楽しんでみましょう！

# 2.3 - シンセの切り替え

これまで、ビープ音を鳴らして楽しんできました。けれども、 もしかするとあなたはこのベーシックなビープ音に退屈し始めているかも知れません。 これがSonic piが提供してくれるサウンドの全てなのでしょうか？もちろん、ビープ音だけではなくて、 もっと他にもたくさんのライブコーディングがありますよね？はい、あります。 この章ではSonic Piが作り出すエキサイティングな音の領域へと探検していきましょう。

## シンセ

Sonic Piは、シンセサイザーの略であるシンセと呼ばれる楽器の機能を持っています。 サンプルがすでに録音された音であるのに対して、シンセはあなたがそれをコントロールすることに応じて 新しいサウンドを生み出すことができます（このチュートリアルの後半でみていきます）。Sonic Piのシンセは、 パワフルで表現力に富んでいて、探索しながら演奏したり、楽しめるはずです。 最初に、ひとまずここでシンセを使うために、選び方を学んでみましょう。

## 酔っ払いのsawとprophet

面白い音は、ノコギリ（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`

音楽の中でシンセを切り替えて遊んでみてください。音楽の異なるセクションに違うシンセを使うように、 シンセを組み合わせて新しい音を作って楽しんでください。

# 2.4 - エンベロープでのデュレーション

前半のセクションでは、音を演奏したい時にどのように`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

## ADSR エンベロープ

つまり要約すると、Sonic PiのADSRエンベロープには、以下のフェーズがあります。

1. attack（アタック）- 0 アンプから`attack_level`までの時間
2. decay（ディケイ）- 音量を`attack_level`から`decay_level`まで移行させる時間
3. sustain（サステイン）- 音量を`decay_level`から`sustain_level`まで移行させる時間
4. release（リリース） - 音量を`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

ではあなたのサウンドにエンベロープを追加して演奏してみましょう。

# 3 - サンプル

あなたの音楽を発展させる方法は他にもあります。すでに録音された音を使うことです。偉大なヒップホップの伝統では、これらのあらかじめ録音された音のことを、サンプルと呼びます。つまり、マイクを持って外に出て、雨が優しくキャンバスを打つ音を録音しに行けば、それだけでサンプルを作ることができます。

Sonic Piは、サンプルで楽しいことがたくさんできるようになっています。90以上のパブリック・ドメイン（著作権がない）サンプルが、ジャム（即興演奏）するために同梱されているだけでなく、自分で操作して演奏することも可能にしてくれるのです。さっそくみていきましょう。

# 3.1 - サンプルを使う

ビープ音を演奏するのは最初だけです。もっと面白いのは、録音済みのサンプルを使うことです。やってみましょう。

    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_`

さあ、あなたの曲でサンプルのミックスを始めてみましょう！

# 3.2 - サンプル・パラメータ：アンプとパン

シンセの項目で見てきたように、パラメータで簡単にサウンドを制御することができます。 サンプルは全く同じパラメータの仕組みを備えています。何度も登場する、`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`（あとで説明します）をシンセに設定している場合、 サンプルはこれを無視して再生します。

# 3.3 - サンプルを引き延ばす

すでに私たちは、音楽を作るために様々なシンセやサンプルを演奏することができます。そろそろ、音楽をもっとユニークで面白くするために、シンセとサンプルを編集する方法を学ぶ時間です。まずは、サンプルを引き延ばしたり圧縮する方法をみてみましょう。

## サンプルで表現する

サンプルとは、あらかじめ録音されたサウンドで、サウンドを再生するためにスピーカーのコーン（振動板）をどう動かすかを表す数値が格納されています。スピーカーのコーンは行ったり来たり（振動）するため、数値は、その時々でコーンがどれくらいの距離を行ったり来たりすべきかをその時々で表す必要があります。録音された音を忠実に再生するために、サンプルは概して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秒で再生されます。

サンプルのデュレーションは、再生するレートに影響を与えます。

- 2倍の再生レートは、再生時間を半分にする
- 半分の再生レートは、再生時間を2倍にする
- 4分の1の再生レートは、再生時間を4倍にする
- 10分の1の再生レートは、10倍長く再生させる

これを以下の数式で表します。

    new_sample_duration = (1 / rate) * sample_duration

再生レートを変えることは、サンプルのピッチ（音程）にも影響します。周波数や波形のピッチがどれくらい速く上下に動くかで決定されます。我々の脳は、どういうわけか、スピーカーの速い動きを高い音階に、遅い動きを低い音階に捉えます。だからあなたは時々、大きなベース・スピーカーが超低音を吐き出すのを見ることができるのです。実際に高い音を出しているときのスピーカーよりも、ゆっくりと振動しているのです。

もし波形を取り出して圧縮したら、1秒間でさらに頻繁に上下します。これがサウンドをより高い音にするのです。 上下の運動を2倍にすると、周波数が2倍になるということになります。 そのため、サンプルを2倍のレートで再生すると、聞こえる周波数が2倍になるということです。 また、レートを半分にすると、周波数が半分になるということでもあります。他のレートはそれに応じて周波数に影響します。

# 3.4 - エンベロープ・サンプル

ADSRエンベロープを用いて、サンプルのデュレーション（再生時間）とアンプ（音量）を編集することもできます。しかしながら、シンセのADSRエンベロープとは少しだけ異なったように作用します。サンプルに使用するエンベロープは、サンプルのアンプとデュレーションを減らすことしかできません。決して増やすことはできないのです。サンプルは、それが再生され終わったときか、エンベロープが完了したときのいずれかで停止します。どちらが先でも停止します。非常に長い`release:`を使ったとしても、サンプルのデュレーションは延長されません。

## アーメン・エンベロープ

わたしたちのお気に入りのフレーズ、アーメン・ブレイクに戻ります。

    sample :loop_amen

オプションが設定されていない場合、全サンプルがフル・アンプ（最大音量）で聞こえます。 もし1秒間のフェード・インを使いたい場合、`attack:`パラメータを使います。 （フェード・インとは徐々に音が大きくなることです。）

    sample :loop_amen, attack: 1

もっと短いフェード・インの場合は、`attack:`の値を小さくします。

    sample :loop_amen, attack: 0.3

## オート・サステイン

ADSR エンベロープの特徴が標準的なシンセ・エンベロープと異なる点は、サステイン（持続時間）の値です。 標準的なシンセのエンベロープでは、もし手動で変更しなければ、 0 に設定されています。ですが、 サンプルでは、サステインの値は通常、魔法のように全自動にセットされます。サステインの時間は、サンプルの残りを 演奏するように調整されます。デフォルトの値を渡さないときに、サンプルがフルで流れるのはこのためです。 アタック、ディケイ、サステイン、リリース(この４つの頭文字が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

今すぐ、サンプルを楽しくさせるエンベロープをいじってみましょう。 面白い結果を得るために数値を思いきり変更してみましょう。

# 3.5 - 部分的なサンプル

このセクションでは、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から１の間の値を終了点として選ぶことができます。 アーメンブレイクの半分までで終わらせてみましょう。

    sample :loop_amen, finish: 0.5

## 開始と終了の指定

もちろん、私たちは好きな部分を再生するために、これまでの開始と終了の２つを組み合わせることができます。 どのようにすれば真ん中あたりの短い場所だけを選べるのでしょうか？

    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

今すぐ、サンプルとこれまでに紹介した楽しい内容を組み合わせて演奏してみましょう！

# 3.6 - 外部サンプル

内蔵のサンプルは、すぐに使用でき、再生することができる一方で、 あなたは別に録音された音を試してみたいと願うかもしれません。 Sonic Piは完全にこの願いを叶えます。 まずは、あなたの部品（録音した音）の携帯性について、確認してみましょう。

## Portability

あなたが、内臓のシンセやサンプルだけを使って作曲した場合、 コードだけがは、あなたが音楽を忠実に再生ために必要なものになります。でもちょっと 考えてみてください。それは、実はとても凄いことなのですよね！あなたの音楽を忠実に再現する作品は、 テキストによるシンプルなものなので、電子メールで周りに送ったり、 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

# 4 - ランダム化

音楽にすこし面白さを加えるために、ランダムという素晴らしい方法があります。 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音階のシーケンスを生成します。シードの値を変更することによって、あなたの好きな フレーズを見つけることができます 他の人と共有するとき、彼らも、あなたが聞いたものとまったく同様のフレーズを 聞くことができるでしょう。

有用なランダム関数をもう少し見ていきましょう。

## choose：選択

一般的な方法は、あらかじめ用意した数値をリストの中からランダムに選択することです。 例えば、60、65または72の中から1音を演奏することができます。`choose`を用いれば、 リストから一つの項目をで選択することができます。まず、カンマで区切った番号のリストを角括弧でラップ（包んで）し、 配置する必要があります：`[60, 65, 72]`。次にそれらを`choose`に渡す必要があります。

    choose([60, 65, 72])

どんな音になるか聞いてみましょう。

    loop do
     play choose([60, 65, 72])
     sleep 1
    end

## rrand

すでに`rrand`について触れてきましたが、再び実行してみましょう。これは、2つの値の間の乱数（排他的）を返します。 この意味するところは上部または下部の番号いずれの値も含まれません。常に両者の間にある値です。 そして、その番号は常に浮動小数点になります - それは整数ではなく、分数です。

`rrand(20, 110)`で返される浮動小数点数の例：

- 20.343235
- 42.324324
- 100.93423

## rrand_i

時々、あなたは小数点ではなく、整数の乱数を望むこともあるでしょう。これは`rrand_i`を用いることで 解決できます。それは小数点を除いて`rrand`と同様に最小値および最大値の範囲（この場合、最長値と 最大値も含まれます）に潜在するランダム値を返す動作をします。下記は、`rrand_i(20, 110)`によって返される数値の例です。

- 20
- 46
- 99

## rand

`rand`は、`0`を含む最小値と最大値未満の間のランダムな浮動小数点数を返します。デフォルト（既定値）では `0`と`1`の間の値を返します。したがって、`amp:`値をランダム化する際に便利です。

    loop do
     play 60, amp: rand
     sleep 0.25
    end

## rand_i

`rrand_i`と`rrand`の関係と同様に`rand_i`は`0`と特定の最大値の間の整数値を返します。

## dice:サイコロ

ランダムな数字を出す際に、サイコロ投げをまねてみたくなることもあるでしょう。 これは、常に下の値が1である`rrand_i`の特殊なケースです。 `dice`を呼び出す時は、サイコロの面の数を指定する必要があります。 標準的なサイコロは6面で、`dice(6)`では、1 、2 、3 、4 、5 、 または6を返すサイコロと同様の作用をします。しかし、空想のボードゲームのように、 4面、12面、または20面サイコロで値を見つけたいこともあるでしょう。ことによっては120面のサイコロだって！

## one_in

最後に、サイコロ投げをまねて、例えば６という一番大きな数値を出してみたくなることもあるでしょう。 `one_in`はサイコロの面の数分の1の確率でtrueを返します。したがって`one_in(6)`では6分1の確率でtrue、それ以外の場合はfalseを返します。`true`と`false`の値は、このチュートリアルの次のセクションで説明するif文で非常に有用です。

さあ、ランダム性を使いこなしてコードをまぜこぜにしていきましょう！

# 5 - プログラミングの構造

これまでの章で、みなさんは`play`や`sample`コマンドを使ったり、`sleep`を使ってシンプルなメロディーやリズムを作曲することを通して音楽制作(*サウンドプログラミング)の基礎を学ぶことができました。

Sonic Piのコードの世界で他にどんなことができるか興味が出てきたことでしょう…

それでは、プログラミングの基礎となるループや条件文、ファンクション（関数やスレッドなどに進みましょう。 音楽的のアイデアを実現させるをびっくりするほど強力なツールをになることでしょう。

それでは、やってみましょう。

# 5.1 - ブロック

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`でコードをまとめることが重要であることを覚えておいてください。

# 5.2 - イテレーション（反復）とループ

以前、`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

さあ、これで回数を指定するイテレーション(反復)と永遠に繰り返すループのコーディング方法を理解することができましたね!

# 5.3 - 条件文

やってみたいと思うことのひとつに、ランダムに音を出すこと（前章参照）だけでなく、いくつかのコードをランダムに決め、それを選択していくというアイデアも出てくると思います。例えば、ドラムとシンバルをランダムに鳴らしたい場合、`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`など、異なる休符時間を持つ場合、そのどちらかに応じることになります。

## Simple if

時には、任意のコードを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

上のコードでは、それぞれの音符が持つ別の確率によって、異なる数のコード(和音)を奏でるでしょう。

# 5.4 - スレッド

それでは、強烈なベースラインとかっこいいビートを作った場合、どのようにしてそれらを同時に鳴らしたらいいでしょう？一つの回答としては、手動でそれらを同時に鳴らす事です―まず、いくつかのベースを演奏し、その後にいくつかのドラム、またその後にベースというように…しかしながら、すぐに沢山の楽器を処理することが難しいことに気づくでしょう。

もし、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}

## 名前を許された一つだけのスレッド

名前付きのスレッドについて知っておくべき最後のひとつは、名前の付いた１つのスレッドだけが同時に実行されることです。 では以下を見てみましょう。次のコードを考えてみてください。

    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`という名前があるスレッドが既に存在するため、別のものを作成しませんと伝えています。この動作はすぐに使う必要性はないように思えますが、ライブコーディングを始めると、非常に便利なものになるでしょう。

# 5.5 - ファンクション（関数）

一度、膨大なコードを書き始めると、それらの構造をより簡単かつ整理された状態で把握できるように、構築しまとめたいと感じることになるでしょう。`ファンクション`（関数）はそんなことをとても効果的に成し遂げる方法です。この関数を使うとコードのまとまりに対して名前をつけることも可能になります。早速、見ていきましょう。

## 関数の定義

    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を完全に白紙の状態からはじめました。 これまでワークスペースをなぜとり除いているかについては触れてきませんでした。 これは１つのワークスペースのみで再生されていたからで、別のワークスペース または別のスレッド内のコードを参照することはできなかったからです。 しかし、関数はそれを変えることができます。あなたが関数を定義すると、 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` が使われています。

関数によって、高度な表現と沢山の構造を簡単に読み込ませることが出来るということがわかりましたね！

# 5.6 - 変数値

コードを書いていく中で役に立つことは、覚えやすい名前を作成することです。 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

また、後の章ではもっと詳しくシンセをコントロールすることも学びます。

# 5.7 - スレッドの同期

一度、関数やスレッドを使用したとても高度なライブコーディングを行うと、おそらくスレッド内にある間違いを直すことが、とても簡単なことを理解できるでしょう。あなたはコードを起動してスレッドを再スタートさせることが容易にできるので、それは全然大したことではないのでしょう。しかし、スレッドを再スタートさせるときは、元々のスレッドとは調子がずれる事になります。

## 継続時間

以前話した時に、新しいスレッドが`in_thread`として作られると元のスレッドのすべてのセッティングが継続されることを学びました。これは現在の時間を含んでいます。つまり、スレッドが同時にスタートするときには常に他のスレッドと同期していることを意味しています。

しかし、１つのスレッドを起動したときは、それは独自の時間で再生されるので、他の現在実行中のスレッドと同期していることはほとんどありません。

## Cue と Sync

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の名前

`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`まで居座り続けさせ待たせるように、 それらのスレッドに送るように設定しても、もちろんそれは動作します。

# 6 - スタジオ エフェクト

Sonic Piには、あなたの作ったサウンドに簡単にスタジオ·エフェクトを追加できるという最もやりがいのある楽しい側面があります。たとえば、部分的にリバーブを追加したり、エコーやディストーション(歪み)、ワブルベース（ベース音にフィルターLFOを掛け、断続的な音にすること）を加えることができます。

Sonic Piには、エフェクト（効果）を追加する非常にシンプルで強力な方法があります。それも、あなたが作った音にディストーション(歪み)を通し、その後エコー、さらにリバーブと、それらをチェーン（連結）させ、また、シンセやサンプルにオプションを与えるのと同様の方法でエフェクトユニットのオプションを個別に制御することができ、実行されている間でも、オプションを変更することも可能です。だから、例えば、トラックのいたるところでベースのリバーブを強くするということができるのです。

## ギター エフェクター

もし、この話が少し複雑に聞こえる場合でも、心配は無用です。一度、少し触れてみれば、すぐに理解することができることでしょう。いわば、ギターのエフェクターのようなものをイメージしてください。購入できるギターエフェクターには多くの種類がありますが、リバーブ、ディストーションなど幾つかを数珠繋ぎに追加することができます。ギタリストは、自分のギターにエフェクターの一つ（ディストーションなど）を接続し、そして別のケーブルでリバーブエフェクターに繋ぎます。そしてリバーブエフェクターの出口はギターアンプに繋ぐことができるわけです。

    ギター -> ディストーション -> リバーブ -> アンプ

これをエフェクトチェーンと呼びます。Sonic Piは正にこれをサポートしています。さらに、ディストーション、リバーブ、エコーなどのエフェクターの多くは、どのくらい効果を加えるのか、制御できるようなダイヤルやスライダを持っていて、Sonic Piもこの種の制御をサポートしているということです。ついに、あなたはギタリストがエフェクターを使いながらギターを演奏する姿を想像することができていることでしょう。ただ、Sonic Piでは、それをコントロールするために他の何かを必要としません。それがコンピュータが代役を務めているのです。

さあ、エフェクトを探究していきましょう！

# 6.1 - エフェクトの追加

このセクションでは、エフェクター「リバーブとエコー」の組み合わせを見ていきます。

それらをどのようにチェーン接続するか、どのように制御するのか、これらの使用方法について説明します。 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

## Echo：エコー

選択できる効果は他にもたくさんあります。エコーはどうでしょうか?

    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

エコーが８秒間の時間でフェードアウトする様に、`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は、あなたが演奏するためにたくさんのエフェクターを搭載しています。どういった効果が使えるのかを見つけ出すためには、ヘルプシステム画面の下にある効果ボタンをクリックし、利用可能なリストを見てください。ここに私のお気に入りを記載しておきます。

- wobble,
- reverb,
- echo,
- distortion,
- slicer

さあ、エフェクターを追加して驚きの新しいサウンドの虜となってくだい！

# 6.2 - エフェクトの実践

外観は一見シンプルですが、 エフェクト内部は実際には異常に複雑なモンスターです。そのシンプルさは、しばしば、この機能を酷使させようと誘惑します。もしもあなたが強力なマシンを持っている場合は問題は無いかもしれませんが、ラズベリーパイで動作させる場合、確実にビートを刻み続けるようにしたいのであれば、どのくらいの負荷をかけているのか注意する必要があります。

このコードを考えてみましょう。

    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の音程ごとに新しいリバーブを作成しています。

これらの異なるアプローチからは、違うサウンド、また異なる性能をもたらします。だから、間違いでもなく可能性であることを覚えておいてください。あなたのプラットフォームに応じた制約の中で、最も適切に働くアプローチを使いわけながら演奏を心がけましょう。

# 7 - 演奏中のサウンド制御

これまでの章では、どのようにシンセやサンプルを扱い、アンプ（増幅）、パン、エンベロープなどのオプションを変更するのかを見てきました。呼び出された個々の音には、元来、音の継続時間を設定するデュレーションオプションが備わっています。

もしも演奏中にギターの弦を歪めビブラートさせるように、オプションを変更できたなら、それってクールではないでしょうか？

あなたは幸運です-このセクションでは、まさしくそれをどのように行うのかを紹介します。

# 7.1 - 演奏中のシンセ制御

これまでは、新しいサウンドとエフェクトを引き起こす方法について触れてきたただけ見てきましたが、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エンベロープ·パラメータがこれに該当します。そのオプションが制御可能かは、ヘルプシステムのドキュメントを参照してください。ドキュメントに「設定を変更することは出来ません」というコメントがある場合、シンセが開始した後にオプションを制御することはできません。

# 7.2 - エフェクトの制御

エフェクトも、少々異なる方法をとりますが、制御する事が出来ます。

    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プロックのゴールポストパラメータを使用します。”`|`”と”`|`”の間に、エフェクターを実行するためのユニークな名前を指定する必要があります。この動作は、パラメーター化された関数を使用する場合と同じです。

さあ、シンセやエフェクトをコントロールしてみよう！

# 7.3 - オプションのスライド

シンセやエフェクトの引数を探索しながら、`_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

さあ、操作に従って、滑らかな変調を楽しみましょう。

# 8 - データ構造

プログラマーのツールキットで非常に有益なツールはデータ構造です。

時には、複数の要素を使用して表現したい場合があるでしょう。たとえば、それが次々に演奏される連続した音符が便利だと気づくこともあるでしょう。プログラミング言語は、こういったことを正確に行うためのデータ構造を持っています。

プログラマが利用できるデータ構造はとてもエキサイティングで魅力的なもので、人々は常に新しい発明をしています。しかし、今の私たちは実際には非常に単純なデータ構造リストを考慮する必要があります。

より詳細にそれを見てみましょう。まずは、その基本的な形式を学習し、続いて、リストはどのようにスケール(音階)やコード（和音）を表現するために使用されるのかを学習していきましょう。

# 8.1 - リスト

このセクションでは、非常に有益なデータ構造であるリストについてみていきます。すでに大まかな方法で、音符をリストから無作為に選ぶことをランダムの章で触れました。

    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を命令します。次にリストを与えています。そして最後に第２の要素を問い合わせています。角括弧でインデックスを囲む必要があり、カウントは0で始まるので、2番目の要素のインデックスは1となります。下記、みてみましょう。

    # indexes:  0   1   2
              [52, 55, 59]

コード`puts [52, 55, 59][1]` を実行してみてください。ログに55とポップアップされるでしょう。インデックス `1` を別のインデックスに変えてみてください。さらに長い`list`を与えて、どのように次のコードで使うのかを考えてみてください。なんらかの音楽の構造として音符の連続を表現することができるのではないでしょうか。

# 8.2 - コード(和音)

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

どちらの書き方を好みますか？

# 8.3 - スケール(音階)

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リストのスケールまたはコードを選びますメインパネルの情報に、スケールやコードの長いリストが現れるまで下にスクロールしてください（あなたがどれを見るかに依拠します）。

間違いではなく可能性でるということを思い出して、楽しんでください。

# 8.4 - リング

標準のリストで面白いスピンオンにリングがあります。いくつかのプログラミングを理解していれば、リングバッファやリングアレイなどをみたことがあるかもしれません。ここでは、まさに`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

リングのインデックス化

いったんリングを取得したら、インデックスがマイナスもしくはリングの数値より大きい場合を除いて、通常のリストを使用する場合とまったく同じ方法で使用することができます。、そしてリングの１つの要素として括弧でくくられて表示されます。

    (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つの要素を得る場合にはどうでしょう？

段階的に見ていきましょう:

1. `(ring 10, 20, 30, 40, 50)` - リングの最初の状態
2. `(ring 10, 20, 30, 40, 50).shuffle` - シャッフルし - `(ring 40, 30, 10, 50, 20)`
3. `(ring 10, 20, 30, 40, 50).shuffle.drop(1)` - 最初の要素を削除し - `(ring 30, 10, 50, 20)`
4. `(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)`を呼んでください。

# 9 - ライブコーディング

SonicPiの中で一番エキサイティングな特徴の1つは、ライブでギターをかき鳴らすのと同じように、ライブで音楽を演奏しながら、その場でコードを書き換え、音を変化させていくことができることです。シンプルなループを走らせ、そのサウンドが完璧になるまで調整しつつ。この方法で優れているのは、演奏中たくさんの反応をもらうことができることです。ですが、一番の利点は、Sonic Piでステージ上でライブができることです。

このセクションでは、コードを書き換えながら力強いパフォーマンスにつなげることができるLiveCodingの基本を学んでいきます。しっかりついてきてくださいね。

# 9.1 - ライブコーディング

実際に楽みながら演奏をする方法を十分に学んできました。この章では、 これまでのすべての章から、どの様に作曲を開始し、ライブパフォーマンスに繋げるかを紹介していきます。 そのために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`について次の章を読んでいきましょう。

# 9.2 - ライブループ

このチュートリアルの中でもこの章は、最も重要です。もし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

このあとは私の言うことを聞くのを止めて、自由に演奏してみましょう! 楽しんでください!

# 9.3 - マルチ・ライブループ

次のライブループを考えていきましょう。

    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

うわー、すべてを停止することなくすべてが完璧に同期しました。

いまから、ライブループを使用したライブコーディングを始めましょう！

# 9.4 - チック

ライブコーディングでリングをループしていて、気が付くとたくさんのことをしていたことはないでしょうか。 例えば、リングにメロディーの音符を入れたり、リズムのスリープ、 コード進行や音色のバリエーションを入れたり等々。

## リングのチック

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`のドキュメントには役に立つ例がたくさんあるので、それを見て楽しくチックしてみましょう！

# 10 - 不可欠な知識

この章ではSonic Piの経験を最大限に活用するために、 いくつかの非常に便利で、実際のところ不可欠な知識を紹介します。

用意した多くのキーボードのショートカットを活用する利点と、作品を共有する方法、そして Sonic Piでパフォーマンスするためのいくつかのヒントを見ていきます。

# 10.1 - ショートカットの使用

Sonic Piはコーディング環境としての楽器です。したがって、あなたが観客の前でライブ演奏している場合は特に、 ショートカットは、はるかに効率的で自然にSonicPiの演奏を行うことができます。

Sonic Piの多くの機能は、キーボードを介して制御することができます。 Sonic Piの演奏や作業により慣れるために、ショートカットをもっと使いこなしましょう。

個人的にはブラインドタッチの学習の検討をお勧めします。マウスを使う必要があるときに、動作が遅れ、私はいつもイライラしてしまいます。だから、普段からこれらのショートカットのすべてを使っています！

ショートカットを学べば、効果的にキーボードを使用でき、あなたは、間もなく、プロのようなライブコーディングができるようになるでしょう。

しかし、一度にすべてを憶えようとしないで、 まずはあなたが最も使うものを試しながら、実践の中で、さらに追加しながら憶えていくとよいでしょう。

## 一貫したクロスプラットフォーム

クラリネットを習っているところを想像してみてください。すべてのクラリネットは、指使いや操作の全てが一貫してしていることを前提として作られていますが、もしそうでなかったら、別のクラリネットに乗り換えるには大変な時間を費やしてしまうだろうし、一回だけの制作のためにそれを使用することについて戸惑ってしまうでしょう。

残念なことに3つの主要なオペレーティングシステム（ Linux、 Mac OS XおよびWindowsの場合）では、カット＆ペーストなどの操作のために独自の基準が用意されています。 Sonic Piは、これらの基準に準拠します。しかしながらプラットフォームの基準に対応することよりも、 優先事項として、Sonic Pi内はクロスプラットフォームとして一貫した配置がなされています。 これは Raspberry Piで演奏したり、ショートカットを学ぶ時、 MacやPCに乗り換えても、違和感無く同じように操作できることを意味しています。

## Control と Meta

一貫性への考え方のひとつにショートカットの命名があります。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、１行上はC-p、１行下がるにはC-n、一文字進むにはC-f、そして、一文字戻るにはC-b。C-kでカーソルからラインの末尾まで全ての文字を消去する事ができます。

## コードの整形

コードを自動整形するには `M-m`を押します。

## ヘルプシステム

ヘルプシステムを切り替えるには、`M-i`を押します。しかし、何かを見つける場合、もっとはるかに便利なショートカットは、カーソル下の単語検索し、ドキュメントを表示する`C-i`です。簡単でしょう！

完全なリストについては、セクション10.2ショートカット一覧表を見てみましょう。

# 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` - カーソルから行の末尾まで全ての文字を消去する

# 10.3 - 共有

SonicPiは、お互いに共有し学習するものです。

いったん、どのように音楽をコード化するかを学んだら、作曲したコードを共有することは電子メールを送信するのと同じくらい簡単なことです。あなたの作品から学び、さらに新しいマッシュアップで部品を使えるように他の人とコードを共有しましょう。

もしあなたの作品を他者と共有するためのよい方法が見当たらなければ、あなたの音楽をSoundCloudへ、そしてコードをGitHubに置くことをお勧めします。その方法で、あなたの作品は、容易にたくさんの人に届けることができるのです。

## コードをGitHubへ

GitHubは、コードを共有し作業するためのサイトです。コードの共有や共同作業のためにプロの開発者と同じくアーティストも使用しています。新しい作品のコード（あるいは未完の作品）を共有する最も簡単な方法は、このGitHubでGistを作成することです。Gist機能はあなたのコードをアップロードすることで、簡単に他の人が参照、コピーし共有することができます。

## 音をSoundCloudへ

作品を共有するもう一つの重要な方法は、音を録音しSoundCloudにアップロードすることです。作品をアップロードしたら、他のユーザーがコメントしあなたの作品について話し合うことができます。また、トラックの詳細にあなたのコードのGist へリンクを貼ることをお勧めします。

作品を記録するには、ツールバーの`Rec`ボタンを押すと、すぐに録音を開始します。 もしコードがすでに進行中でなければ、開始するために`Run`を押してください。録音が完了したら、 再び点滅している`Rec`ボタンを押すと、ファイル名を入力するよう求められます。 WAVファイルとして保存された録音は、無料のソフトウエア（例えば、 Audacityを試してみてください）の任意の設定によって編集したりMP3に変換することができます。

## 希望

私はみなさんが作った作品を共有し、Sonic Piで実際に新しいトリックや動きをお互いに教えあってもらえることを願っています。あなたが何を魅せてくれるか本当に楽しみにしています。

# 10.4 - パフォーマンス

Sonic Piの中で最もエキサイティングな側面の一つは、楽器としてコードを使うことができるということです。これは、コードをライブで書き込むことが、音楽を演奏する新しい方法とみなすことができることを意味します。

我々は、これをライブコーディングと呼んでいます。

## 画面を表示しよう

コードをライブするとき、観客にあなたの画面を表示することをお勧めします。そうでなければ、ギターを指や弦を隠しながら演奏するようなものです。私は家で練習するときは、ラズベリーパイと小型プロジェクターでリビングルームの壁に投影します。自分のテレビや学校/職場のプロジェクターのいずれかを使ってみましょう。挑戦してみてください、とても楽しいです。

## バンドを結成しよう

絶対に1人で遊ばないでください - ライブコーディングバンドを結成しましょう！他の人とのセッションはとても楽しいものです。一人はビートを担当し、他のBGMや環境音など、どんな面白い音の組み合わせがつくれるか一緒に試しましょう。

## TOPLAP

ライブコーディングは新しいものではありません 一部の人々は、自ら構築した特注システムを使用して、ここ数年でライヴコーディングに取り組んできました。他のライブコーダーやシステムについての詳細を知るにはTOPLAP絶好の場所があります。

## Algorave

ライブコーディングの世界を探索するためのもう一つの偉大なリソースはAlgoraveです。ここで、クラブシーンでのライブコーディングに特化した情報を見つけることができます。

# 11 - Minecraft Pi（マインクラフトパイ）

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の自動接続機能が対応します。

## Raspberry Pi 2.0が必要

Sonic　PiとMinecraftの両方を実行したい場合は、特にSonic　Piのサウンド機能を使用したい場合は Raspberry Pi 2.0を使用することをお勧めします。

## APIサポート

現段階では、Sonic　Piは、次のセクション11.1に詳述されている基本ブロックとプレイヤーの操作をサポートしています。 世界の中のプレイヤーの相互作用によるトリガーされるイベントのコールバックのサポートは、 将来のリリースバージョンで予定されています。

# 11.1 - Minecraft Pi APIの基礎

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`。これら２つの数字`10`と`8`が座標です。他に隠された宝物の在処も別の２つの数字で容易に記述できることが想像できますね。おそらく、`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	原子炉コア

# 12 - おわりに

これでSonic Pi入門のチュートリアルを終了します。方法に沿って何かを学べたのではないでしょうか。すべてを理解していなくても心配しないでください。とにかく時間を使って演奏し楽しんでください。質問があれば、気軽に戻ってチュートリアルを読み直してみてください。

もし、チュートリアルでカバーされていない疑問がある場合は、Sonic Pi forumsを開き、質問をしてください。そこでは、誰かが親身に手を貸してくれるでしょう。

最後に、このヘルプシステムのマニュアルの他の部分をより深くチェックすることをお勧めします。このチュートリアルではカバーしていない機能がいくつかあるので、新たな発見が待っているでしょう。

遊んで、楽しんで、コードを共有して、そしてスクリーンをみせながら、友人のために演奏してください。 そして思い出してください。

間違いはない、あるのはただ可能性だけ

Sam Aaron