Forth式シンセについて構想する
学校のPLCではラダー図でのプログラムの書き方の方法論を集中的に。ここで構造化プログラミングという言葉を聞くとは思わなかった。PLCのプログラミングも中々奥が深いのですね。
LPCについて引き続きネットを中心にして調べてます。自己相関の場合、係数は1から−1の間に収まるそうな。あとsin波の自己相関はcos波になるとか、パルス波の自己相関が三角波風になるとか。へー。
線形代数に色々フィルターのアイディアになりそうなものがありそうです。
yy_taroさんのエントリーを見てアマゾンを眺める。yy-taro.hatenablog.com
お!噂のパタヘネが安いのか!と思ったらこっちはセール対象じゃなかった。
- 作者: デイビッド A パターソン,ジョンLヘネシー
- 出版社/メーカー: 日経BP社
- 発売日: 2015/02/25
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
プロジェクト名"Speak&Spell2000"のシンセ部分について抜き出して、またブロック図を描いて色々考えていたんですが、シンセの仕様はこんな感じにまとまりそうです。
- 1周期毎の音の最小データはPWMのデューティ比として扱われる。
- ここが現状では色々な制約もありすべてfloat型になっているのがどうにも美しくない。早めに改善したい。
- 音データをバッファする小規模なスタックを持つ。
- 1周期毎にスタックの先頭データをmbedのPwmOutクラスに渡す。
- ここをTimerクラスで呼び出すことで発音タイミングの安定を計る。
- 読み込まれた先頭データはForth式に無くなる。
- オシレーター関数は呼び出される毎に演算をし、波形、周波数その他の引数に基づいて1個のデューティ比を返して停止する。
- シンセ関数はスタックの最後尾にオシレータからのデューティ比を追加する。
- 2VCOで音を加えたりリングモジュレーションをするときには、スタックの最後尾データに対して加算したり乗算したりすればいい。
- フィルター関数はスタックの先頭から必要な分データを複製、処理してスタックの先頭に1個のデューティ比を格納して停止する。
- 元の先頭データ1個分は減った上での処理済データの格納となる。
- ADSRを実装するとしたらこの段階でスタックの先頭データに対してデータ処理を行う。
- スタック構造のために、最低でもスタック個数×周期のレイテンシーが発生する。最善を尽くせば恐らく1/1000秒で収まる。
おお、何かこじつけっぽいけどForthっぽくなってきました!ただ、ファーストイン・ファーストアウトなのでリスト構造の方が適しているのかしら。まあでもスタック2つあればいけますが。