スタッフブログ

STAFF BLOG

やってみた

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文による条件分岐だったり、乱数を使ったりなどといったコードも書けます。
音楽を作りながら、気軽にプログラミングを学ぶツールとしては非常によいツールではないでしょうか。
次は、もう少し複雑なロジックも取り入れながら、より豪華な演奏ができるコードを書いてみたいと思います。
BACK

お問合せ

イーディーエーに興味をお持ちいただいて
ありがとうございます!
スマホアプリに関するご相談、
お見積りや弊社へのご質問など、
お気軽にお問い合わせください。
担当者より折り返しご連絡させていただきます。

    お名前必須
    会社名
    メールアドレス必須
    電話番号必須
    お問合わせ種別必須
    お問合わせ内容必須

    アンケートにご協力ください。
    弊社サイトへはどのようにしてアクセスされましたか?

    個人情報のお取扱いに関する同意事項

    1.事業者の氏名又は名称

    株式会社イーディーエー

    2.個人情報保護管理者の氏名又は職名、所属及び連絡先

    個人情報保護管理者 小宮 保人
    Mail:[email protected]

    3.取得した個人情報の利用目的

    当フォームで取得した個人情報は、お問い合わせに関する回答のために利用し、目的外利用はいたしません。

    4.弊社が取得した個人情報の第三者への委託、提供について

    弊社は、ご本人に関する情報をご本人の同意なしに第三者に委託または提供することはありません。

    5.個人情報保護のための安全管理

    弊社は、ご本人の個人情報を保護するための規程類を定め、従業者全員に周知・徹底と啓発・教育を図るとともに、その遵守状況の監査を定期的に実施いたします。
    また、ご本人の個人情報を保護するために必要な安全管理措置の維持・向上に努めてまいります。

    6.個人情報の開示・訂正・利用停止等の手続

    ご本人が、弊社が保有するご自身の個人情報の、利用目的の通知、開示、内容の訂正、追加又は削除、利用の停止、消去及び第三者への提供の停止を求める場合には、下記に連絡を頂くことで、対応致します。

    株式会社イーディーエー 個人情報お問合せ窓口
    〒106-0032 東京都港区六本木7丁目14番23 ラウンドクロス六本木4F
    TEL:03-5422-7524 FAX:03-5422-7534
    Mail:[email protected]

    7.ご提供いただく情報の任意性

    個人情報のご提供は任意ですが、同意を頂けない場合には、第3項にあります利用目的が達成できない事をご了承いただくこととなります。

    8.弊社Webサイトの運営について

    弊社サイトでは、ご本人が弊社Webサイトを再度訪問されたときなどに、より便利に閲覧して頂けるよう「クッキー(Cookie)」という技術を使用することがあります。これは、ご本人のコンピュータが弊社Webサイトのどのページに訪れたかを記録しますが、ご本人が弊社Webサイトにおいてご自身の個人情報を入力されない限りご本人ご自身を特定、識別することはできません。
    クッキーの使用を希望されない場合は、ご本人のブラウザの設定を変更することにより、クッキーの使用を拒否することができます。その場合、一部または全部のサービスがご利用できなくなることがあります。