初めてのサウンドプログラミング

#サウンドプログラミングしたい。
ゴリゴリの文系、音楽の素養ナシのwebエンジニアが0から音楽系サウンドプログラミングを学んでいく話です。ちなみに最終目標はコーラスを合成するGUIアプリ。道のりとおし。
それまでに学んだことをぼちぼち落としていきたいと思っています。

##サウンドプログラミングとは?
サウンドプログラミングと一口に言っても、音声認識だったり音楽だったり、電話の信号変換の話もあったりします。とにかく幅が広い。
私が指しているサウンドプログラミングとは、__デジタルオーディオ__の世界の方です。

##誰向けか?
- サウンドプログラミングに興味があるけどどこから手をつけるべきかわからない人
- 数学ができない人
- プログラミングはやったことある人
- シンセサイザーを自作してみたい人

##さあ始めよう!
しかし、いざサウンドに手を出してみると、知らなければならない情報が多すぎて何を勉強したらいいのかわからないのも事実。そもそもこの業界のエンジニアが少ないのか企業機密になってるんだかで、エンジニア向けのまとまった参考文献があまりありません。
今回はまず

1. 足がかりとなった情報源の紹介
2. 使用している言語の紹介

をしていきます。

##ひたすら知識を詰めよう..

###MIDI検定
これは音楽制作の知識が全くない場合はやるべきです。どういう風に音楽がデジタルで作られていくのかなど、音楽制作全般の知識が身につきます。MIDIはサウンドエンジニアの手となり足となる規格です。この勉強をすると、だいたいどうやって設計していくかイメージが取れるようになるでしょう。

私が勉強に使っている本です。
[ミュージッククリエイターハンドブック](https://www.amazon.co.jp/%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%B8%E3%83%83%E3%82%AF%E3%82%AF%E3%83%AA%E3%82%A8%E3%82%A4%E3%82%BF%E3%83%BC%E3%83%8F%E3%83%B3%E3%83%89%E3%83%96%E3%83%83%E3%82%AF-MIDI%E6%A4%9C%E5%AE%9A%E5%85%AC%E5%BC%8F%E3%82%AC%E3%82%A4%E3%83%89/dp/4636869214/ref=sr_1_1?ie=UTF8&qid=1540972340&sr=8-1&keywords=%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%B8%E3%83%83%E3%82%AF%E3%82%AF%E3%83%AA%E3%82%A8%E3%82%A4%E3%82%BF%E3%83%BC "ミュージッククリエイターハンドブック")
数字が出てこなくて読みやすい!嬉しい!

###MIDI規格書
MIDIは最近になってようやく規格自体がオープンになったらしいです。[規格書](http://amei.or.jp/midistandardcommittee/MIDIspcj.html "MIDI1.0規格書")はPDFで無料ダウンロードできるようになっています。これもシンセサイザーなどの音がどうやってできているのか知る手がかりになります。
私はまだ読み途中ですが...。

###数学の勉強
中学時代から数学ができなかった私ですが、__サウンドの世界はもろ数学__です。文系が頑張る話ではじめましたが、文系が理数系に転向するぐらい勉強する必要がありそうです。
現段階に来るまでに利用した数学は中学〜大学レベルの広範に及びます。__大学レベルは理解することを諦めました__。でも高校の__正弦波あたりはきちんと理解しておいた方がいい__です。音は波ですから。
以下は私が勉強に使っている参考書です。
<dl>
<dt>中学数学</dt><dd>[数学の解き方をひとつひとつわかりやすく。](https://www.amazon.co.jp/%E4%B8%AD%E5%AD%A6%E6%95%B0%E5%AD%A6%E3%81%AE%E8%A7%A3%E3%81%8D%E6%96%B9%E3%82%92%E3%81%B2%E3%81%A8%E3%81%A4%E3%81%B2%E3%81%A8%E3%81%A4%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%8F%E3%80%82-%E4%B8%AD%E5%AD%A6%E3%81%B2%E3%81%A8%E3%81%A4%E3%81%B2%E3%81%A8%E3%81%A4%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%8F-%E5%AD%A6%E7%A0%94%E6%95%99%E8%82%B2%E5%87%BA%E7%89%88/dp/4053040795/ref=sr_1_1?s=books&ie=UTF8&qid=1540978075&sr=1-1&keywords=%E6%95%B0%E5%AD%A6%E3%81%AE%E8%A7%A3%E3%81%8D%E6%96%B9%E3%82%92%E3%81%B2%E3%81%A8%E3%81%A4%E3%81%B2%E3%81%A8%E3%81%A4%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%8F%E3%80%82 "中学数学の解き方をひとつひとつわかりやすく。 (中学ひとつひとつわかりやすく)")</dd>
<dt>高校数学</dt><dd>[忘れてしまった高校の数学を復習する本―高校数学ってこんなにやさしかった!?](https://www.amazon.co.jp/gp/product/4806116920/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1 "忘れてしまった高校の数学を復習する本―高校数学ってこんなにやさしかった!?")</dd>
<dt>大学数学</dt><dd>[マンガでわかるフーリエ解析](https://www.amazon.co.jp/gp/product/4274066177/ref=oh_aui_detailpage_o06_s00?ie=UTF8&psc=1 "マンガでわかるフーリエ解析")</dd>
</dl>

###サウンドプログラミング参考書
私はまだ一冊しか購入していません。なぜなら色々買っても数式だらけで???となるだけだから。
ただこの本は数字がわからなくてもCが読めればある程度言っていることがわかる本です。
[サウンドエフェクトのプログラミング　Cによる音の加工と音源合成 ](https://www.amazon.co.jp/gp/product/B01IGW5BCU/ref=oh_aui_d_detailpage_o04_?ie=UTF8&psc=1 "サウンドエフェクトのプログラミング　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で書き直したコードについても説明したいですし。
サウンドやってみたいなーって人に種を巻けてたら嬉しいです。お疲れ様でした。