導入
私事ですが、最近作曲にハマっていて電子音楽とか作っています。いわゆるEDMみたいな、そういうやつですね。電子音楽をやっている人は大抵サンプルパックを漁ってるんですが、なぜかっていうと電子音楽はサンプルを使いまくって成り立ってるからです。スネアやキックはほとんどサンプルが使われていますね。ところで、サンプルパックを漁る以外にもシンセサイザーでこれらの音を作ることが出来て、例えばノイズの音量を急激に下げるとスネアの音みたいになったり、正弦波の音程を急激に下げるとキックの音みたいになります。正弦波の音程を下げるくらいならプログラミング出来そうですね!という訳でコードからキックを生成したいと思います。
キックとは
ドラムの一番大きいやつをイメージして頂けると良いかなと思います。下でドンドンいってるやつですね。
下の画像の様に、音程を急激に下げるとキックの音が人工的に合成できます。
技術選定
Pythonで音声を扱えることは知っていたのですが、動的型の言語は好きじゃないのでC#を検討しました。
調べてみると、どうやらC#はwavファイルのサポートが薄く、ヘッダーから実装する必要がありそうだったのでkotlinを選択しました。
kotlin(Java)はwavファイルの出力をサポートしているみたいなので安心ですね。
実装
下のサイトを参考に、とりあえず矩形波を出力してみます。
https://mocha-java.com/create-square-wave-1/
https://www.youfit.co.jp/archives/1418
出来ました。
バイナリエディタでみると以下のようになっています。かわいいですね。
FF7Fの連続が波形の上半分にあたり、0180の連続が下半分にあたります。wavファイルは符号付きintでデータを表しているので最大値はFFFFではないんですね。(一敗)
改造して正弦波を出力します。
周波数の繋ぎ目が尖ってしまってるので、周波数を変える時に前の位相(Θ)からスタートします。
やや繋ぎ目が尖っていますが、完成です。
完成!
繋ぎ目のノイズが気になりますが、気にしたら負けです。
コード