サウンドプログラミングしたい。
ゴリゴリの文系、音楽の素養ナシのwebエンジニアが0から音楽系サウンドプログラミングを学んでいく話です。ちなみに最終目標はコーラスを合成するGUIアプリ。道のりとおし。
それまでに学んだことをぼちぼち落としていきたいと思っています。
サウンドプログラミングとは?
サウンドプログラミングと一口に言っても、音声認識だったり音楽だったり、電話の信号変換の話もあったりします。とにかく幅が広い。
私が指しているサウンドプログラミングとは、デジタルオーディオの世界の方です。
誰向けか?
- サウンドプログラミングに興味があるけどどこから手をつけるべきかわからない人
- 数学ができない人
- プログラミングはやったことある人
- シンセサイザーを自作してみたい人
さあ始めよう!
しかし、いざサウンドに手を出してみると、知らなければならない情報が多すぎて何を勉強したらいいのかわからないのも事実。そもそもこの業界のエンジニアが少ないのか企業機密になってるんだかで、エンジニア向けのまとまった参考文献があまりありません。
今回はまず
- 足がかりとなった情報源の紹介
- 使用している言語の紹介
をしていきます。
ひたすら知識を詰めよう..
MIDI検定
これは音楽制作の知識が全くない場合はやるべきです。どういう風に音楽がデジタルで作られていくのかなど、音楽制作全般の知識が身につきます。MIDIはサウンドエンジニアの手となり足となる規格です。この勉強をすると、だいたいどうやって設計していくかイメージが取れるようになるでしょう。
私が勉強に使っている本です。
ミュージッククリエイターハンドブック
数字が出てこなくて読みやすい!嬉しい!
MIDI規格書
MIDIは最近になってようやく規格自体がオープンになったらしいです。規格書はPDFで無料ダウンロードできるようになっています。これもシンセサイザーなどの音がどうやってできているのか知る手がかりになります。
私はまだ読み途中ですが...。
数学の勉強
中学時代から数学ができなかった私ですが、サウンドの世界はもろ数学です。文系が頑張る話ではじめましたが、文系が理数系に転向するぐらい勉強する必要がありそうです。
現段階に来るまでに利用した数学は中学〜大学レベルの広範に及びます。大学レベルは理解することを諦めました。でも高校の正弦波あたりはきちんと理解しておいた方がいいです。音は波ですから。
以下は私が勉強に使っている参考書です。
サウンドプログラミング参考書
私はまだ一冊しか購入していません。なぜなら色々買っても数式だらけで???となるだけだから。
ただこの本は数字がわからなくてもCが読めればある程度言っていることがわかる本です。
サウンドエフェクトのプログラミング Cによる音の加工と音源合成
使用言語について
サウンドプログラミングの参考書をamazonで漁るとC言語の本が多く出てきます。
だがしかし、webエンジニアにCは難しすぎる。
GCが標準装備された言語で文字列結合をこちょこちょやっているような人間がひょいとできるような代物ではないのです。本当に。
読んでもよくわからないというのが関の山。
Rustってすごいね
そこで私はRustでCのサウンドコードをリバースしながら勉強しています。Rustなら安全なメモリ管理もできるし、よくわからないエラーに延々と悩まれされることもないです。だってコンパイラーが全部教えてくれるからね!
でもヒープ領域とかスタックとかまだうまく使えてないから配列はスライスとベクターしか使ってません。先にメモリ領域確保とかって話まだよくわからない。
音声合成はRust
先にRustについて紹介しましたが、私がRustを主に使っているのは音声合成の部分です。sin波形の関数だったりノコギリ波だったり、基本的に合成というのは数学演算になってきます。速度、安全性、静的型づけってところでかなりやりやすいかなと。
まだ新しい言語ですが、数学系やwaveファイル操作系のcrateはあるので安心して使えますよ。
解析はpython
私はコーラスを合成したいので、人間の肉声を録音し、スペクトラム分析、ケプストラム分析にかけて声紋分析をしています。
基本的に分析系はpythonがライブラリ最強なのでいいかなと思います。最初マイク入力もpythonにしていましたが、処理が遅すぎてやめました。この子はプロットとcsv出力だけできればいいです。
マイク入力はC++
なぜC++かというと、答えは簡単!open frame works(以降of)が使えるから!
ofは割合アーティスト向けなライブラリですが、マイク入力値をリアルタイムで波形表示したり、リアルタイム音高判別なんかもやりやすかったです。これはツールを自作したのでまたいつかお伝えしたいです。ただ個人的にC++はエラーメッセージの不親切さとか安全面の不安とかがあってアプリ制作には使いたくないところ。
GUIはnodejs
先に言っておきます。RustでGUIはまじ無理。リスカしよ。って感じです。
GUI系のライブラリはまだいまいちうまく噛んでくれません。Rustが急速にバージョン変わったりするからかもしれませんが、とにかくしんどいです。
私はnodejsのGUIライブラリNW.jsと、Rustとnodejsのツールチェインをしてくれるneonを使ってなんとか組み合わせ中です。もしかしたらどこかで詰むかも..。
今日はここまで
ざっと概要を説明したつもりですが、ここは触り中の触りです。
今後がっつり技術的な話をしていこうと思います。Cの参考書をRustで書き直したコードについても説明したいですし。
サウンドやってみたいなーって人に種を巻けてたら嬉しいです。お疲れ様でした。