niszetの日記

10年目エンジニアが最近勉強したことを忘れないようにメモをする

Csoundでwavを生成するところまで

実行環境について

そういえば、書いていませんでした。
* OS: Windows10 Pro
* Csound : Version 0.9.3-beta

で行っています。

Rに食わせるwavを作っておく

初手からあまり込み入ったことをすると詰むので、まずは簡単にサイン波を作るところから行きましょう。

こちらの例

write.flossmanuals.net

から転載します。
Csoundは素人なので、素人説明になりますが、マニュアルのリンクも併せて貼っておきますので、本当の意味はそちらでご確認いただきたく。

こちらで、気になったワードを検索するのが手っ取り早いかなと思います。
The Canonical Csound Reference Manual

<CsoundSynthesizer>
<CsOptions>
-odac
</CsOptions>
<CsInstruments>
instr 1
aSin      poscil    0dbfs/4, 440
          out       aSin
endin
</CsInstruments>
<CsScore>
i 1 0 1
</CsScore>
</CsoundSynthesizer>

何も考えず、上記のソースをコピペして、Runボタンを押してみてください。ラの音が聞こえるはずです。
440の部分が音の周波数を表しています。単位はHz。Hzは1秒間に振動する回数ですね。
440Hzはラの音の高さになります。 instr ~ endinは音を鳴らす音源の定義だと思ってもらえればよくって、今回は440Hzの音を生成するブロックなのです。
これをaSinという変数に代入して、out aSinでaSinに定義した音を出力するところまでを含んだ音源だと思えば今はたぶん良いのだと思います。

CsScoreのブロックはそのままスコアを定義していますが、i 1 0 1 は instr 1 を 0 秒から 1 秒間 実行せよということで、結果としてラのRunボタンを押すとラの音が1秒間聞こえるのです。

さて、このままでもいいのですが、Rでwavを見るときに440個の波を見るのは面倒くさいですね。 ということで1Hzの音にしてみましょう。下記のとおりです。

<CsoundSynthesizer>
<CsOptions>
-odac
</CsOptions>
<CsInstruments>
instr 1
aSin      poscil    0dbfs/4, 1
          out       aSin
endin
</CsInstruments>
<CsScore>
i 1 0 1
</CsScore>
</CsoundSynthesizer>

単純に440を1に変えただけですね。
さて、これを同じようにRunすると実行しているようだけど何も聞こえない。1Hzは人間の聞こえる周波数の外なので実行してもわからないのでした。
まぁ、ちゃんとできてるに違いない!ということで、気にせずにwav形式で出力します。Recordというボタンを押すと、現在エディットしているファイル名に.wavの拡張子がついて、マイドキュメントあたりにあると思います。linuxだとhomeディレクトリかな?

これをバイナリエディタで開いてみると…?

52 49 46 46 08 00 00 00 57 41 56 45 66 6D 74 20
10 00 00 00 01 00 02 00 44 AC 00 00 10 B1 02 00
04 00 10 00 64 61 74 61 00 00 00 00 00 00 00 00
01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00
05 00 00 00 07 00 00 00 08 00 00 00 09 00 00 00

で始まる、数字の羅列と、Stirlingなどであれば右側に変な文字列が並んでいると思います。

これでとりあえず準備は完了です。
ひょっとしたら、環境によっては出方が違うかもしれませんが…

さて、次回はバイナリエディタとにらめっこしつつ、Rでこれを読んでいきます。

しかし、本業多忙のためちょっと更新が開いてしまいます。
上のバイナリを、wavのフォーマットとにらめっこして、仕様通りなのかを見ると良いかもしれませんです。