やってみた
2022.03.01
Sonic Piで音楽をプログラミング♪
Webシステムを中心に開発をしているエンジニアです。
これまで様々な言語による開発を行ってきましたが、最近ではPHPを使った開発に携わらせていただく機会が非常に多く、新しい言語に出会う機会が少なくなってきました。
そこで、RubyやPythonのようなPHP同様にWebシステムの開発によく使われる言語の中で、私が未経験の言語を1つ新たに習得したいと考えていたところ、Sonic Piというものに出会いました。
音楽をプログラミングする、というのは未経験だしとてもおもしろそう!
Rubyが使用されているなら、Ruby入門にもなるかも!!
ということで、インストールして触ってみました。
1. Sonic Piとは
Sonic Piはオープンソースのプログラミング環境です。
Windows、MacOS、Linux、Raspberry Pi OSで利用可能で、プログラミングで音楽を作ることができます。
※ダウンロードはこちらからできます。
言語は先程も書きましたが、Rubyを使用しています。
2. まずはドレミから
Sonic Piを起動するとこんな画面が表示されます。
上記の画面でコードを入力することで、音を鳴らすことができます。
ドの音を鳴らすコードは、下記のどちらかになります。
play 60
play :C4
playの後ろに音を指定して、音を再生することができます。 この「60」というのはMIDIでドを表す数字のようです。 「C4」はCの方が音名ですね。4は高さを表しているようです。 ちなみにドレミファソラシ、は下記のようになります。
数字が飛んでいるのは、ピアノでいうところの黒い鍵盤の部分のようです。私は数字より、アルファベットの音名の方がわかりやすかったので「C4」の方を使いました。 ということで、「ドレミ」と音を鳴らしたければこうなりますね。
play :C4 play :D4 play :E4
しかしこのままでは、同時に鳴ってしまいます。
runボタンを押して再生してみたところ、見事な不協和音が響き渡りました。
1音ずつ順番に音を鳴らすためには、下記のようにsleepで音を区切る必要があるようです。
play :C4 sleep 1 play :D4 sleep 1 play :E4 sleep 1
これで1音ずつ順番に、「ドレミ」と音が鳴りました。
sleepの後ろの数字で、次の音が鳴るまでの時間が変わります。
もっと間隔を短くしたければ小さい値、逆に長くしたい場合には大きい値にしましょう。
3. 和音を鳴らそう
chordという関数を使って、和音が鳴らせるようです。
下記のように、メジャーコードやマイナーコードという指定ができます。
この辺は音楽の知識が必要そうですね。
play chord(:C4, :major) sleep 1 play chord(:C4, :minor) sleep 1
筆者はCマイナーとかDマイナーとかなんとなく聞いたことありますが、あまり詳しくありません。
play_patternを使用することで、和音の中身を1音ずつ鳴らしてくれるそうです。
play_pattern chord(:C4, :major) play_pattern chord(:C4, :minor)
これで和音の中身が確認しやすいですね。
4. 音色を変えよう
use_synthを使って、音色を変えることができます。
use_synth :pretty_bell play :C4 sleep 1 use_synth :tri play :D4 sleep 1 use_synth :piano play :E4 sleep 1
上記のコードを演奏すると、1音ずつ違った音色で音が鳴ります。
use_synthの後に半角スペースを入力することで、リストが表示されますのでお気に入りの音色をみつけましょう!
5. 関数を作ろう
Sonic Piでは関数が定義できます。
doremiという関数を定義するなら、下記のようになります。
define :doremi do play :C4 sleep 1 play :D4 sleep 1 play :E4 sleep 1 end
これでドレミと演奏する関数doremiが定義できました。
繰り返し使うようなメロディは関数化しておくと便利そうですね。
6. ループしよう
Sonic Piで演奏をループさせたい時は、下記のように記述します。
loop do play :C4 sleep 1 play :D4 sleep 1 play :E4 sleep 1 end
これで、ドレミが繰り返し演奏されます。
ですがこれは無限ループとなり、stopボタンを押すまでずっと繰り返されます。
回数を指定してループする場合には、下記のように記述しましょう。
3.times do play :C4 sleep 1 play :D4 sleep 1 play :E4 sleep 1 end
これで3回だけ、ドレミが繰り返されます。
7.スレッドを使おう
in_threadというのを使って、スレッドが作成できます。
下記のように記述することで、ドレミと和音が同時に演奏されます。
in_thread do play :C4 sleep 1 play :D4 sleep 1 play :E4 sleep 1 end in_thread do play chord(:C4, :major) sleep 1 play chord(:C4, :major) sleep 1 play chord(:C4, :major) sleep 1 end
主旋律と伴奏、といった感じで使えそうですね。
8. ということで『森のくまさん』をプログラミングしてみた
難しい音楽を書くのは大変だし、時間もかかりそうなので簡単そうな曲を選んでそれっぽく聞こえるようにコードを書いてみました。
とりあえず「ある日森の中くまさんに出会った」までを輪唱みたいに追いかける感じで、「花咲く森の道くまさんに出会った」の部分から合唱みたいに一緒のタイミングで演奏されるようにしています。
## 「ある日森の中くまさんに出会った」の演奏 define :play_first do #ある日 play :G4 sleep 0.25 play :Fs4 sleep 0.25 play :G4 sleep 0.25 play :E4 sleep 1.25 #森の中 play :E4 sleep 0.25 play :Ds4 sleep 0.25 play :E4 sleep 0.25 play :C4 sleep 1.25 #くまさんに play :E4 sleep 0.25 play :D4 sleep 0.25 play :C4 sleep 0.25 play :D4 sleep 1.25 #出会った play :G4 sleep 0.25 play :A4 sleep 0.25 play :G4 sleep 0.25 play :E4 sleep 0.25 end ## 「花咲く森の道くまさんに出会った」部分の演奏 define :play_last do #花咲く play :G4 sleep 0.25 play :A4 sleep 0.25 play :B4 sleep 0.25 #森の道 play :C5 sleep 0.5 play :G4 sleep 0.5 play :E4 sleep 0.5 play :C4 sleep 0.5 play :A4 sleep 1.25 #くまさんに play :A4 sleep 0.25 play :B4 sleep 0.25 play :A4 sleep 0.25 #出会った play :G4 sleep 0.5 play :F4 sleep 0.5 play :E4 sleep 0.5 play :D4 sleep 0.5 play :C4 sleep 1.25 end in_thread do use_synth :pretty_bell sleep 1 play_first play_last end in_thread do use_synth :tri play_first sleep 1 play_last end
正直なところ、これで「よしRubyが書けるようになった!」となれるところまで、Rubyの理解を深めることは難しいでしょう。
私自身、「次は何の曲をSonic Piで書いてみようかな」と考えることはあっても、「よし!次はRubyで〇〇のアプリを作ってみよう!」と考えるのはまだまだハードルが高そうです。
ですが、Sonic Piではもっと複雑なif文による条件分岐だったり、乱数を使ったりなどといったコードも書けます。
音楽を作りながら、気軽にプログラミングを学ぶツールとしては非常によいツールではないでしょうか。
次は、もう少し複雑なロジックも取り入れながら、より豪華な演奏ができるコードを書いてみたいと思います。