音楽版 FizzBuzz
2022年もよろしくお願いいたします。
これはネタ記事なのでまじめに読まなくていいです。
音楽やってるプログラマーは音楽でFizzBuzzくらいできて当然だよね?
しょうもない思いつきを形にしていく。
完成イメージ
用意するもの
テキスト音楽「サクラ」
フリーの作曲ソフト。
テキストで例えば「ドレミ……」みたいに打ち込んで再生すれば音が出るので、わかりやすい。
上記のようなテキストをプログラムで生成できれば、サクラにペーストして再生すればよいので、
Programmabilityの観点からこのソフトを使います。
お好きなプログラミング言語の実行環境
FizzBuzzなので、サクラに読み込ませる「ドレミ……」のテキストは当然プログラムで生成する。
本記事ではJavaScript (Node.js) を採用しますが、日本語テキストが出力できればなんでもいいです。
Step.1 サクラを触ってみる
サクラをダウンロードし立ち上げる。テキスト部に「ドレミ……」等打ち込んでいく。
「ン」で休符になるみたいです。
デフォルトだと一つの音名が4分音符になる。例えば「ド」と打ち込むと、再生時に「ド」が4分音符の長さで再生される。
再生してみよう。
再生ボタンを押す。
かえるの歌だ。楽しいね。
いろいろやってみるぞ。いろいろできます。
いいね。このまま作曲家になれそう。
だが今回やるのはFizzBuzzなのでサクラはあくまで基本の使い方を説明するにとどめる。
※ お使いのPCによっては再生できないことがある (と思う)。midiという規格のファイルを再生するためにはmidiデータだけではだめで、再生機器にmidiデータを再生するためのチップとかソフトが入っている必要がある。これをmidi音源と言ったりする。なおWindowsにはMicrosoft GS Wavetable SW Synthというのがデフォルトで入っているので再生できるはずだが、これはVista以降から同時発音に支障が出るなどイマイチな感じになっている。なぜ??Micr○s○ftは大いに反省しなさい。Mac OSはQuickTimeでmidi再生できたと思う。Linuxは知りません。
もし再生できなかったら一旦「ファイル」->「MIDI形式で保存」したあと、midiを再生できるフリーの音楽プレーヤーで読み込んでみてください。Yamaha MidRadio Playerとか、TiMidity++あたりがおすすめ。
ミッドラジオプレーヤトップページ
TiMidity++
余談ですが、本記事の試聴音源はサクラで出力したmidiデータをTiMidity++で再生・録音したものを使用しています。音量の調整にはAudacityというソフトを使っています。
Step. 2 サクラに読み込ませる音符テキストをFizzBuzzで出力する
まずはNode.jsでFizzBuzzのひな型を作る。
特に説明不要かと思います。
正しく動いていそうな感じがする。
各関数が音符テキストを出力するように改造していく。
実際にコーディングする前に、どういう風に作っていくかを先に考えてみる。
今思いついたイメージはこんな感じです。
3, 5, 15の倍数でないときの音
ヤバくない「普通」の音を出します。普通っていうのが一番難しい。
普通な音というのを音色、音の長さ、音程の3点から考えていく。
まずは音色。例えば、ピアノあたりは馴染みが深そうなので音色としてよいのではないか?
音色はピアノにします。
次に音の長さ。ずっと4分音符だとだらけるので、時折8分音符も混ぜたい。
したがってここでは、1拍 (=1カウントに相当) に対して、4分音符1つ、または8分音符2つのいずれかがランダムで来るようにする。
最後に、使う音程をどう配置するか。確率的に配置するのがよさそう。
ここではハ長調「ドレミファソラシド」から「ファ」と「シ」を抜いた、いわゆる「ヨナ抜き音階」を使う。
また、ハ長調なので「ド」の音を出やすくする。「ソ」の音もやや出やすくしようか。
このあたりのノウハウについては深入りしませんが、「普通」の曲を作るまでにはそれなりに勉強すべきことがあるという事です。
逆にヤバい曲を作りたいならむしろ勉強しない方がよかったりする。
以上をコーディングする。
FizzBuzzのアルゴリズム部を少し改造し、単一の文字列を最後に出力するよう変更。
8分音符も使いたいので、音符の基準長をしれっと8分音符に変更。基準の音色もピアノに設定。
other関数の中身を変更し、普通の音が出力されるようにする。
3の倍数 (Fizz) の時の音
普通の音がピアノだったので、ちょっと変わった音色にしたい。
サクラの音色タブから探してみる。
琴がいいかもしれません。
チャララ……という風にアルペジオっぽい感じで、低い音から順番にばらして演奏すれば風流なのではないだろうか。
Step.3 カウントが分かりやすいよう修正
何が1カウントなのか分かりにくくなってしまったので、カウントが分かりやすいような修正を加える。
ベースを加えてみることにする。
ベースがずっと4分音符で「ド」の音を刻み続ける、いわゆるルート弾きでいいのではないか。
ちなみにドラムも加えようとしたが、面倒なのと説明が煩雑になりそうなのでやめた。
今まで作ってきた主旋律はトラック1として、新しいベースのパートはトラック2として出力されるようになる。
これをサクラに貼り付けて再生する。
そしてこちらが完成形となります!
なるほど
今年もよろしくお願いいたします
~完~