I’m loser, baby.

So why don't you kill me?

Forth式シンセについて構想する

学校のPLCではラダー図でのプログラムの書き方の方法論を集中的に。ここで構造化プログラミングという言葉を聞くとは思わなかった。PLCのプログラミングも中々奥が深いのですね。

LPCについて引き続きネットを中心にして調べてます。自己相関の場合、係数は1から−1の間に収まるそうな。あとsin波の自己相関はcos波になるとか、パルス波の自己相関が三角波風になるとか。へー。
線形代数に色々フィルターのアイディアになりそうなものがありそうです。

yy_taroさんのエントリーを見てアマゾンを眺める。yy-taro.hatenablog.com
お!噂のパタヘネが安いのか!と思ったらこっちはセール対象じゃなかった。

コンピュータの構成と設計 第5版 上

コンピュータの構成と設計 第5版 上

『コンピュータの構成と設計』の方をkindle版お試ししたところ、この手のやつはpdfそのまんまのが多いのですがフォントも変えられるし読み易かったです。内容も流石に良さそうで、いつの日か正式に購入したい。

プロジェクト名"Speak&Spell2000"のシンセ部分について抜き出して、またブロック図を描いて色々考えていたんですが、シンセの仕様はこんな感じにまとまりそうです。

  • 1周期毎の音の最小データはPWMのデューティ比として扱われる。
    • ここが現状では色々な制約もありすべてfloat型になっているのがどうにも美しくない。早めに改善したい。
  • 音データをバッファする小規模なスタックを持つ。
  • 1周期毎にスタックの先頭データをmbedのPwmOutクラスに渡す。
    • ここをTimerクラスで呼び出すことで発音タイミングの安定を計る。
    • 読み込まれた先頭データはForth式に無くなる。
  • オシレーター関数は呼び出される毎に演算をし、波形、周波数その他の引数に基づいて1個のデューティ比を返して停止する。
    • オシレーター関数は関数内のカウンターを複数もつことで複数VCOやポリフォニックに対応可能。取り敢えずは2VCOのモノシンセの実装予定。
  • シンセ関数はスタックの最後尾にオシレータからのデューティ比を追加する。
    • 2VCOで音を加えたりリングモジュレーションをするときには、スタックの最後尾データに対して加算したり乗算したりすればいい。
  • フィルター関数はスタックの先頭から必要な分データを複製、処理してスタックの先頭に1個のデューティ比を格納して停止する。
    • 元の先頭データ1個分は減った上での処理済データの格納となる。
  • ADSRを実装するとしたらこの段階でスタックの先頭データに対してデータ処理を行う。
  • スタック構造のために、最低でもスタック個数×周期のレイテンシーが発生する。最善を尽くせば恐らく1/1000秒で収まる。

おお、何かこじつけっぽいけどForthっぽくなってきました!ただ、ファーストイン・ファーストアウトなのでリスト構造の方が適しているのかしら。まあでもスタック2つあればいけますが。