できること

第17回「Sonic Piで音プログラミング!」

raspberrypi17_main
今回は、Raspbianのプリインストールソフト「Sonic Pi」で遊びます!
アイコンがかわいいなぁと、ラズベリーパイを使い始めた当初から気になっていたソフトのひとつです。英語のソフトなのでなかなか手が出せずにいたところ、なんと上司が教えてくれることに!

前半は自力で予習した基本編、後半は上司に教えてもらいながら応用編の、二部構成でお送りします。
ちなみに、音楽の知識が無くても十分楽しめます。学生時代のリコーダーレベルのわたしでもしっかり遊べましたのでご安心を!

Sonic Piとは?

Sonic Pi公式サイト

Sonic Piは、「音」を扱うオープンソースのプログラミング環境です。Raspbianにプリインストールされています。ラズベリーパイ用の他に、Mac OS版とWindows版も公開されており、どちらも無料でダウンロードできます。

ラズベリーパイ公式サイトにもチュートリアルが掲載されています。英語のドキュメントですが、画面もスクリプトもシンプルなので、これだけでも十分進められそうです!

Raspberry Pi Learning Resource

Sonic Pi起動!

Sonic Piとはどんなソフトなのか、起動して実際の画面を見てみましょう!メニューの[プログラミング]-[Sonic Pi]をクリックします。
起動までには少し時間がかかりますが慌てず待ちましょう。

raspberrypi17_img01

図1

少し待つと、図2のような画面に切り替わります。
デフォルトは3分割の画面です。左上がコーディングの領域、右上がプログラムを実行したときのログの出力、下部はヘルプで、チュートリアルなどが表示されています。
その他に「Preferences」画面がありますが、デフォルトでは非表示となっています。

画面の説明は、ラズベリーパイ公式サイトの解説ページを参照してください。


WORKSHEET | Raspberry Pi Learning Resource

raspberrypi17_img2

図2

上部にある10個のボタンに、基本的な機能がまとめられています。種類ごとに色分けされていて、直感的にとても分かりやすいですね!

raspberrypi17_img3

図3

左側にあるピンク色の4つのボタンは、主にプログラミングで使用するボタンです。
「Run」「Stop」は、ワークスペースに記述したスクリプトを実行・停止するときに使用します。スクリプトを保存するには「Save」ボタン、実行中の音声を保存するには「Rec」ボタンをクリックします。音声ファイルの保存形式は「wav」です。

raspberrypi17_img4

図4

右側の黄色のボタンは、ワークスペースのスクリプトの見た目を調整します。「Size-」「Size+」で文字サイズの変更ができ、「Align」ボタンはスクリプトのインデントを整えてくれます。

raspberrypi17_img5

図5

青色のボタンは画面の表示切り替えです。「Info」ボタンは、開発者やバージョン情報などが確認できるウインドウを表示します。「Help」と「Prefs」は、画面内のそれぞれのパネルの表示を切り替えます。この2つは右クリックメニューからでも切り替え可能です。

サンプルやチュートリアル、関数や変数の一覧などは、「Help」ウインドウの中にまとめられています。「Help」ウインドウの右上のボタンをクリックすると、ウインドウが独立し、大きく広げて見られるのでオススメです。

raspberrypi17_img6

図6

音を鳴らしてみよう!

それでは早速音を鳴らしてみましょう!Raspberry Pi公式サイトのチュートリアルのサンプルスクリプトを実行してみました。

play 60

音が一音、再生されました!「ド」の音ですね。
ところでこの「60」って何?という疑問の答えは、同じページの「MIDI NOTES AND MUSIC NOTES」の項に書かれています。

Getting started with Sonic Pi | Raspberry Pi Learning Resources
Music Notes to MIDI Note Values

C D E F G A B
60 62 64 65 67 69 71

数字の正体は、MIDIのノートナンバーでした!表の中で番号が飛んでいるのは、鍵盤の黒鍵分があるからですね。

play :c4

このように、半角のコロン(:)を先頭に付けて、音名を指定することも可能です。「C4」を再生すると、数字で「60」を指定したときと同じ音が再生されます。

続けて鳴らす場合は、間に「sleep」を入れると、音を区切ることができます。このまま実行してしまうと、同じタイミングで一気に鳴ってしまうので、連続して鳴らしたい場合は「sleep」を入れて調整しましょう。「sleep」の単位は「秒」で、小数を指定することもできます。

play 60
sleep 0.5
play :c4

同じ音が2回、鳴ったでしょうか?
この状態で実行すると、デフォルトで設定されている音が鳴りますが、もちろん好きな音を選ぶことが可能です。音の種類は「Help」ウインドウの「Synths」タブで確認できます。

raspberrypi17_img7

図7

音の種類を指定するには「use_synth」を使います。「use_synth」の後の半角スペースまでを入力すると、音名のリストが表示されるので、この中から選択すると簡単です。

raspberrypi17_img8

図8

Sonic Piで鳴らせる音はなんと30種類!全部聴いてみたい!ということで、スクリプトを書いて実行してみました!

30種類すべての音を1秒間隔で再生してみました。楽器の音だけでなく、ビープ音やノイズなど、作曲のアクセントになりそうな音も用意されています。音の種類によって、響き方にもそれぞれ特徴があります。

実際に自分で試してみたい方は下記のスクリプトをどうぞ!

use_synth :beep
play 60
sleep 1
use_synth :bnoise
play 60
sleep 1
use_synth :cnoise
play 60
sleep 1
use_synth :dark_ambience
play 60
sleep 1
use_synth :dsaw
play 60
sleep 1
use_synth :dull_bell
play 60
sleep 1
use_synth :fm
play 60
sleep 1
use_synth :gnoise
play 60
sleep 1
use_synth :growl
play 60
sleep 1
use_synth :hollow
play 60
sleep 1
use_synth :mod_beep
play 60
sleep 1
use_synth :mod_dsaw
play 60
sleep 1
use_synth :mod_fm
play 60
sleep 1
use_synth :mod_pulse
play 60
sleep 1
use_synth :mod_saw
play 60
sleep 1
use_synth :mod_sine
play 60
sleep 1
use_synth :mod_tri
play 60
sleep 1
use_synth :noise
play 60
sleep 1
use_synth :pnoise
play 60
sleep 1
use_synth :pretty_bell
play 60
sleep 1
use_synth :prophet
play 60
sleep 1
use_synth :pulse
play 60
sleep 1
use_synth :saw
play 60
sleep 1
use_synth :sine
play 60
sleep 1
use_synth :square
play 60
sleep 1
use_synth :supersaw
play 60
sleep 1
use_synth :tb303
play 60
sleep 1
use_synth :tri
play 60
sleep 1
use_synth :zawa
play 60

コーディングのルールが分かってきたところで、前半戦終了!後半は、上司に教えてもらった応用編です!

音のアレンジ方法

Sonic Piでは、パラメータを付加するだけで、音の鳴らし方に変化をつけてアレンジができます。パラメータは「Help」ウインドウの中にあるチュートリアルの「2. synth」にまとめられています。

その中から代表的なものをまとめてみました。

パラメータ 説明
amp 音量
pan ステレオスピーカー(左、右、中央)の設定
release フェードアウトするまでの時間
attack フェードインするまでの時間
sustain 音の持続時間

「attack」「sustain」「release」はあまり聞き慣れない項目ですね。チュートリアルに載っている図を参考にするとイメージがつかみやすいです。

raspberrypi17_img9

図9(2.4 Duration with Envelopesより)

「attack」を設定すると、フェードインするように、ふわっと音が鳴り始まります。releaseはその逆で、だんだん音が小さくなりフェードアウトさせる設定です。間に入る「sustain」は、「amp」で設定した音量を持続させる時間です。
それぞれのデフォルト値は音の種類によって異なり、「Help」ウインドウの「Synths」タブで確認できます。

それでは実際にスクリプトを実行して聴き比べてみましょう。

use_synth :pretty_bell
play :c4
sleep 1
play :d4,amp:2
sleep 1
play :e4,pan:1
sleep 1
play :f4,attack:2
sleep 3
play :g4,release:2
sleep 2
play :a4,sustain:2
sleep 3
play :b4,pan:1,attack:3,release:2,sustain:1
sleep 6
play :c4,pan:-1,attack:1,release:3,sustain:2

「ドレミファソラシド」に一音ずつ変化を付けて再生しました。パラメータひとつでずいぶん印象が変わりますね!
「attack」「sustain」「release」を設定した場合は、その分再生時間が長くなるので、音が重ならないように「sleep」の値で調整しています。

「play」のパラメータ値は、固定値で設定する以外に、関数を使う方法があります。
ランダムで値を設定したい場合は「rrand」を使います。値の範囲を指定することができ、その範囲内で小数を含めた値が返されます。

rrand(1,3)

いくつかの値の中から選びたい場合は「choose」を使います。指定できる値が決まっている場合などはこちらを使いましょう。

choose([50,60])

実際にどんな値が選択されたかは、「Log」ウインドウに出力されたログで確認できます。
スクリプトを実行して確認してみましょう。

use_synth :saw
loop do
play choose([:c4,:d4,:e4,:f4,:g4,:a4,:b4]), amp:rrand(1,3), pan:choose([-1,0,1]),attack:rrand(1,3),
release:rrand(1,3),sustain:rrand(1,3)
sleep rrand(1,5)
end

音の種類と「pan」は、設定できる値が決まっているので「choose」を使用して値を選択しています。「amp」「attack」「sustain」「release」は小数が入っても問題ないので「rrand」を使用しています。今回は「sleep」にも「rrand」を使用しました。

「loop do ~ end」は、繰り返しの命令文です。止めるときはSTOPボタンをクリックしましょう。

「Log」ウインドウの中で、パラメータ値がランダムに設定されているのが目視で確認できます。再生された音がランダムになっているので、もちろん耳でも確認できますね!「pan」の違いは、イヤホンで聞いた方が分かりやすいです。

和音で奏でてみよう!

和音を鳴らすには「chord」を使用します。引数としてコードネームを指定するのですが、下記のように、基準になる音と、メジャーコードやマイナーコードといった和音の種類を2つに分けて記述します。

play chord(:c4)
play chord(:c4,:minor)

また、「play_pattern」を使用すると、和音ではなく、コードを一音ずつ音階として鳴らしてくれます。引数の指定方法は、「chord」と同じです。
文章にするとちょっとむずかしいので、再生して違いを比べてみましょう!

use_synth :pretty_bell
play chord(:c4),release: 3
sleep 3
play chord(:g4), release: 3
sleep 3
play chord(:a4,:minor),release: 3
sleep 3
play chord(:f4),release: 3
sleep 3

play_pattern chord(:c4)
play_pattern chord(:g4)
play_pattern chord(:a4,:minor)
play_pattern chord(:f4)

「C→G→Am→F」というコードを実行してみました。聞き覚えのある方もいるのではないでしょうか?かの有名な「レットイットビー進行」です!
土台となるコードがこんなに簡単に再現できるので、楽器が弾けなくても曲作りが楽しめそうですね!

聞きながら作曲できるlive_loop!

Sonic Piの最大の特徴とも言えるのが、打ち込んだスクリプトをリアルタイムで反映してくれる「live_loop」です!

動画は、下記のスクリプトからスタートしました。

live_loop :loopname do
play chord(:c4)
sleep 2
play chord(:g4)
sleep 2
play chord(:a4,:minor)
sleep 2
play chord(:f4)
sleep 2
end

1行目の「loopname」は任意の名前を付けてください。
スクリプトを書き換えて「Run」ボタンをクリックすると、「Log」ウインドウが初期化され、次の周回からは新しい内容が反映された状態で再生されます。「Stop」ボタンをクリックするまで再生が続きます。スクリプトにエラーがある場合は、更新されずに前回のものが流れ続けるので、途中で止まってしまう心配はありません。
リアルタイムで聴き比べながら、音を加えたり、アレンジを変えたり、曲を作りこむことができるとっても便利な機能です!

また、上級者になるとこんなこともできちゃいます!

ラズベリーパイと、エレキギターのコラボレーションです!すごい!
演奏を止めることなく、新しく書いたスクリプトが再生されていくので、このようにセッションすることが可能なんですね!打ち込んだスクリプトがスクリーンに映し出されているので、Sonic Piの知識があれば「聞く」以外の楽しみ方もできそうです!

まとめ

プログラミングしながら音楽を学ぶ、作曲しながらプログラミングを学ぶ、両方できる方は一気に本格的な作曲を楽しめる!Sonic Piは、スキルに関わらず誰もが楽しめそうなソフトですね!

書いたスクリプトをすぐに「音」として体感できるので、コーディングのルールがとても覚ええやすかったように思います。特に「live_loop」の機能は、音の再生も自分の集中力も途切れることなく、夢中になって遊んでしまいました(笑)

次回は、久しぶりに電子部品を使って遊びます!

raspberrypi17_photo01

こちらが新しくもらった部品です!早速ブレッドボードに差してみたのですが、これ、温度センサだそうです!全然温度計には見えないですが……本当にこれで温度が測れるの!?
どうやってラズベリーパイと接続するの?どんな値が取れるの?3つの足の役割は?
見ているだけで疑問がたくさん!次回も奮闘の予感です!

アバター画像

プロフィール:プログラミング暦通算4年、最近IT業界に舞い戻ってきたプログラマーです。女子です。

高専ロボコン2016 出場ロボット解剖計画