Yumuta Music Tech Blog

音楽プログラミング、DTM、作曲・編曲などについて書いていきます

音楽版 FizzBuzz

2022年もよろしくお願いいたします。
これはネタ記事なのでまじめに読まなくていいです。

音楽やってるプログラマーは音楽でFizzBuzzくらいできて当然だよね?

しょうもない思いつきを形にしていく。

完成イメージ

  • 拍を1つ数えるごとにカウンターが1インクリメントする
  • 1回カウントするごとに音が再生される
  • カウンターが3の倍数だと、違う音A (Fizz) が流れる
  • カウンターが5の倍数だと、違う音B (Buzz) が流れる
  • カウンターが15の倍数だと、違う音C (FizzBuzz) が流れる
  • 100までカウントアップする

用意するもの

テキスト音楽「サクラ」

フリーの作曲ソフト。
テキストで例えば「ドレミ……」みたいに打ち込んで再生すれば音が出るので、わかりやすい。
上記のようなテキストをプログラムで生成できれば、サクラにペーストして再生すればよいので、
Programmabilityの観点からこのソフトを使います。

お好きなプログラミング言語の実行環境

FizzBuzzなので、サクラに読み込ませる「ドレミ……」のテキストは当然プログラムで生成する。
本記事ではJavaScript (Node.js) を採用しますが、日本語テキストが出力できればなんでもいいです。

Step.1 サクラを触ってみる

サクラをダウンロードし立ち上げる。テキスト部に「ドレミ……」等打ち込んでいく。
「ン」で休符になるみたいです。
デフォルトだと一つの音名が4分音符になる。例えば「ド」と打ち込むと、再生時に「ド」が4分音符の長さで再生される。

再生してみよう。
再生ボタンを押す。

f:id:yumuta:20220101160744p:plain
サクラの打ち込みサンプル1


soundcloud.com


かえるの歌だ。楽しいね。

いろいろやってみるぞ。いろいろできます。

f:id:yumuta:20220101164742p:plain
サクラの打ち込みサンプル2


soundcloud.com


いいね。このまま作曲家になれそう。
だが今回やるのはFizzBuzzなのでサクラはあくまで基本の使い方を説明するにとどめる。


※ お使いのPCによっては再生できないことがある (と思う)。midiという規格のファイルを再生するためにはmidiデータだけではだめで、再生機器にmidiデータを再生するためのチップとかソフトが入っている必要がある。これをmidi音源と言ったりする。なおWindowsにはMicrosoft GS Wavetable SW Synthというのがデフォルトで入っているので再生できるはずだが、これはVista以降から同時発音に支障が出るなどイマイチな感じになっている。なぜ??Micr○s○ftは大いに反省しなさい。Mac OSQuickTimemidi再生できたと思う。Linuxは知りません。
もし再生できなかったら一旦「ファイル」->「MIDI形式で保存」したあと、midiを再生できるフリーの音楽プレーヤーで読み込んでみてください。Yamaha MidRadio Playerとか、TiMidity++あたりがおすすめ。
ミッドラジオプレーヤトップページ
TiMidity++
余談ですが、本記事の試聴音源はサクラで出力したmidiデータをTiMidity++で再生・録音したものを使用しています。音量の調整にはAudacityというソフトを使っています。

Step. 2 サクラに読み込ませる音符テキストをFizzBuzzで出力する

まずはNode.jsでFizzBuzzのひな型を作る。
特に説明不要かと思います。

f:id:yumuta:20220103215348p:plain
普通のFizzBuzz

正しく動いていそうな感じがする。
各関数が音符テキストを出力するように改造していく。

実際にコーディングする前に、どういう風に作っていくかを先に考えてみる。
今思いついたイメージはこんな感じです。

  • 普段は普通の音が出る
  • Fizz, Buzzの時はちょっとヤバい音が出る
  • FizzBuzzの時はとてもヤバい音が出る
3, 5, 15の倍数でないときの音

ヤバくない「普通」の音を出します。普通っていうのが一番難しい。
普通な音というのを音色、音の長さ、音程の3点から考えていく。

まずは音色。例えば、ピアノあたりは馴染みが深そうなので音色としてよいのではないか?
音色はピアノにします。

次に音の長さ。ずっと4分音符だとだらけるので、時折8分音符も混ぜたい。
したがってここでは、1拍 (=1カウントに相当) に対して、4分音符1つ、または8分音符2つのいずれかがランダムで来るようにする。

最後に、使う音程をどう配置するか。確率的に配置するのがよさそう。
ここではハ長調「ドレミファソラシド」から「ファ」と「シ」を抜いた、いわゆる「ヨナ抜き音階」を使う。
また、ハ長調なので「ド」の音を出やすくする。「ソ」の音もやや出やすくしようか。

このあたりのノウハウについては深入りしませんが、「普通」の曲を作るまでにはそれなりに勉強すべきことがあるという事です。
逆にヤバい曲を作りたいならむしろ勉強しない方がよかったりする。

以上をコーディングする。

FizzBuzzアルゴリズム部を少し改造し、単一の文字列を最後に出力するよう変更。
8分音符も使いたいので、音符の基準長をしれっと8分音符に変更。基準の音色もピアノに設定。

f:id:yumuta:20220104082753p:plain
一つの長いテキストを出力するようFizzBuzzコードを改造

other関数の中身を変更し、普通の音が出力されるようにする。

f:id:yumuta:20220104083135p:plain
3, 5, 15の倍数以外の場合はヨナ抜き音階の中からランダムに選び、4分音符または8分音符2つとして出力する
3の倍数 (Fizz) の時の音

普通の音がピアノだったので、ちょっと変わった音色にしたい。
サクラの音色タブから探してみる。

f:id:yumuta:20220104083737p:plain

琴がいいかもしれません。
チャララ……という風にアルペジオっぽい感じで、低い音から順番にばらして演奏すれば風流なのではないだろうか。

f:id:yumuta:20220104083910p:plain
Fizzの時は16分音符を駆使して琴をアルペジオ的に再生
5の倍数 (Buzz) の時の音

変わった音を出したいが、Fizzの時とはまた毛色の違う音がいい。
サクラの音色タブから探してみる。

f:id:yumuta:20220104084305p:plain
オーケストラヒット

デン!! って感じの音が出る。聞き覚えのある音かもしれません。
とりあえずオーケストラヒットを使っておけば謎の勢いが出るようなところもあるので使ってみましょう。
音がいっぱい鳴っている方がインパクト出そうなので、和音で出力。今回は4分音符1発に絞り、決まった和音でいい。

f:id:yumuta:20220104085840p:plain
Buzzの時はオーケストラヒットの「ドミソ」の和音を4分音符で1発鳴らす
15の倍数 (FizzBuzz) の時の音

一番ヤバいのがいい。

f:id:yumuta:20220104084845p:plain
ガンショット
f:id:yumuta:20220104090015p:plain
FizzBuzzの時は銃声を一発

お前のハート撃ちぬくぞ♡

できた

聴いてみましょう。

f:id:yumuta:20220104090120p:plain
出力した音符テキストをサクラに貼り付ける


soundcloud.com



なるほど。


Step.3 カウントが分かりやすいよう修正

何が1カウントなのか分かりにくくなってしまったので、カウントが分かりやすいような修正を加える。
ベースを加えてみることにする。
ベースがずっと4分音符で「ド」の音を刻み続ける、いわゆるルート弾きでいいのではないか。

f:id:yumuta:20220104091625p:plain
トラックを増設しルート弾きのベースを追加する

ちなみにドラムも加えようとしたが、面倒なのと説明が煩雑になりそうなのでやめた。

今まで作ってきた主旋律はトラック1として、新しいベースのパートはトラック2として出力されるようになる。
これをサクラに貼り付けて再生する。

f:id:yumuta:20220104091732p:plain
ベースが追加された音符テキストをサクラに貼り付ける


そしてこちらが完成形となります!

soundcloud.com






なるほど







今年もよろしくお願いいたします
~完~