Scala でソフトシンセ作ってみる その0

なんか前も同じようなこと書いた気もするけど、以前挫折したのをやり直したりしています。

とりあえず、今回は wav に吐いて終わりではなく、ちゃんと自力で音を出せるように、まずはデバイスへの出力クラスから作ってみました。

https://github.com/shout-poor/Synthcala/blob/master/Synthcala/src/jp/noisyspot/synth/out/OutDevice.scala

使う方はこんな感じ。 440Hz の矩形波を生成して出力するサンプルです。

https://github.com/shout-poor/Synthcala/blob/master/Synthcala/testrunner/OutDeviceTestRun.scala

ポイントとしては、

  • SourceDataLine#write は、内部バッファがいっぱいになると空きができるまでブロックするので、再生自体を別スレッドで処理するために Actor を継承。メッセージとして直接サンプルのリスト (Seq[Double]) を送信して使用する。
  • ソフトシンセの波形生成側で扱うサンプルは -1.0 ~ 1.0 の倍精度実数とし、本クラス内でデバイスに応じたバイト列に変換。(現時点では、符号付き 16bit / LittleEndian のみ実装)

基本的には Java の Audio API を使ってるだけなので、Scala らしいところはあんまりないかと思います。

次は波形生成と各種フィルタ/エフェクタの枠組みを作っていきます。