電音の工場ブログ

当ブログは…

自作エフェクターシンセサイザ製作のネタや開発覚え書きなど、筆者の電音活動を記録しています。お探しの記事が見つからない方は、検索カテゴリ一覧をご利用ください。

スパマーが来訪すると、ときどきコメントをはてなユーザのみに絞ったり開放したりすることがあります。

2008-05-19

ソフト作ってます

| ソフト作ってます - 電音の工場ブログ を含むブックマーク はてなブックマーク - ソフト作ってます - 電音の工場ブログ ソフト作ってます - 電音の工場ブログ のブックマークコメント

ということで、今出来ている音源(BD, SD, HH, RimShot)だけでも鳴らすべく、コントローラのソフトウェアを書き始めた。

といっても週末にやったのは使うであろうペリフェラルに関する部分やらヘッダファイルをいじった程度で、本線系の記述はまだまだ。これまではATmega88で良く書いていたものだから、ATmega128で例えばA/Dのところを見て「レジスタ名が違う」「トリガソースを選べない」「デジタルインプットを無効にできない」とか微妙な違いに戸惑っていたり。

音源の制御としては、

  1. 単純に約2msecのトリガパルスとベロシティ値を出せばいいもの(BD, SD, LoTom, MdTom, HiTom, RimShot, HandClap, CowBell)
  2. 約2msecのトリガパルスとベロシティ値と選択信号を出すもの(HH ← ClosedHH/OpenHH)
  3. 音声信号とカウンタ値とベロシティ値とゲート信号を出すもの(RIDE, CRASH)

の3種があって、1.はベロシティ出力にシリアル(I2C)DAC利用、2.はベロシティ出力にPWM利用、3.はベロシティ出力にはPWM、音声信号とカウンタ値出力にパラレルDAC利用 ― と、イロイロあって面倒くさい。どのようにプロパティとメソッドを持ったら綺麗かを考え中。

MIDIをパースしたあとに音源制御に振るときも、switch~caseで分岐すると後半に記述した音源に不公平なので、ラウンドロビンで回そうかとか要らぬことを考え始めて週末が終わった。

ところで、ATmega128のポートをかなり使ってしまった。もしUIを拡充するとして、LCDやらロータリエンコーダやらスイッチやらをつけるとしたら、ポート配置がずいぶん汚いことになるかそもそも足りないかと微妙な状態。やるとしたら別マイコンに振るか。ということでSPIを空けておくことに決定。

geniegenie2008/05/19 10:58アセンブラだとMIDIをパースした後の処理を相対/絶対アドレスを列挙したインデックステーブルから拾ってジャンプって手があると思うんですが、Cでも似たことは出来ませんか?

ChuckChuck2008/05/19 12:25できます。インデックスができてしまえばどの音源でも等時間で発音処理に移行できそうです。
ただMIDIのパース結果のノート番号と手元のマップ( http://www29.atwiki.jp/rhythm-machine/pages/17.html )を照会してインデックスを割り出す際に、forループで回したりswitch~caseで飛んだりすると書き方によっては不公平が生じるなぁと考えていました。

RJBRJB2008/05/19 23:57こうなるとRTOSの出番になるのでしょうかねー(使ったことないけど知ったかぶり…)
でもAVRだときついのかしら。
最近ATmega64で遊んでますが、MIDI+α+β+γ(なんじゃそりゃ)ぐらいの処理になると頭が発散してきます(^_^;)

ChuckChuck2008/05/20 07:14そうですね>RTOS。でも数クロックで詰め詰めになりがちなので…
粒度の違う処理が混在してくると難しいですが、楽しんでいる部分もあります。「次こそ綺麗に書いてやる」と毎回違うフレームワークになってしまう私であります(TR909 CNTLは今までとそうとう構成が違う、と暗に言っている)。

トラックバック - http://emusic.g.hatena.ne.jp/Chuck/20080519