以前つくったmusic gadget platformはArduino単体で動くことを目標にして高速PWMなんて使っていましたけども音を出すという目的にはあまり良くないなーというのを感じていたのでその後あれこれ試したりしていました。
R-2RDACとかSTM32とか。
自前のソフトウェアSPIを使ってMCP4922 SPI DACを使ってやると44.1KHzステレオの波形出力なんかが出来るのを確認しました。意外とというかSPIって速いんだな。(多分Arduinoの純正ライブラリつかうとこんな速度は出ないはずですけども)
44.1KHzでの出力は波形データのサイズも大きく処理もカツカツになってしまいそうなのでレートを半分にしてSPI SRAMにデータを置いてそこから読み込みつつ出力できるといいな。ってことで22KHzにターゲットを絞ります。
とりあえずPythonで22KのSineWaveデータを作ります。
import math
freqTable = []
for i in range ( 0, 50 ):
f = math.sin( i * math.pi * 2 / 22050.0 * 440.0 )
f = (int)(f*0x3ff)
freqTable.append(f)
print(freqTable)
再生時には0x7ffを足し込むのを忘れると出力がひどいことに。
倍率が0x3ffなのは複数トラックを加算合成した際にシフトする手間を省くため(速度にも関わる)
4ch合成まであればいいかなということで0x3ff
22KHzの波形データいくつかくらいならATMega328の内蔵SRAMでもどうにかなるので外付けSRAMは必要ないのだけど、PCMならしたりするなら必要。
ターゲットが定まっていないのであれなのだけど。
どっちにしても波形沢山使いたいとかになってくると内蔵のRAMだと足りなくなるので外付けSRAMを使う方向で考えて行こう。
外付けSRAMを使うのはひとまずよしとして。
データをどのように格納しておくか。
uSDが手軽ではあるのだけど、手軽ではない。本当は使いたくない。
となるとそこそこ容量があって電源切っても消えないのはEEPROMかFRAMってことに。
FRAMは入手性いまいちなのと高い。のでやっぱりEEPROMか。
となると、つぎはどうやってEEPROMにデータ書き込むのかって話になってくる。
RPiとかからだらだら書き込んでやるのもいいけど、書き変えの手間たるや。
なにかしら外部から簡単にデータを書き換えられる仕組みについて考えておかないといけない。
8080エミュレータで使ってるモニタプログラムのような仕組みが必要かも。
軽く計算。22050Hz x 2byte x 4ch = 176400byte。
1秒で176Kbyte。これはSRAMがどうとか言う話ではないな。
DACが12bitなので活かそうとしての2byteだけど、フルスペック使おうとするとこういうことになるらしい。
やっぱuSDなのか?
midiは採用したくないという話。
midiは手軽だけど、可能性も殺すと思う。
でもツールが一通りあるのはやっぱりいいんだよね。なやましい。
前のmgpではmidiとi2cで動作したのだけどそんな感じで動かすのがいいんだろうか。
なんだかんだでmidiがいいのかなぁ。うーん。OSC? あれはなぁ・・・。