コメント
Unknown
(
Chuck
)
2009-03-17 14:43:56
こんにちは。
以前ATtiny45でFM音源の実験をしたことがあります。乗算器がないので機能は限定的だったのですが。
Unknown
(
nekosan
)
2009-03-18 00:06:32
Chuckさんこんにちは。
http://emusic.g.hatena.ne.jp/Chuck/20070530
ここのmp3で正解でしょうか?
ギュンギュンの金属音でイイカンジですね。
TINY45だとハードウェア乗算器がなくて大変しょうね。
ソースもさっくり眺めさせていただきましたが、Cだと処理速度的にはかなりキツキツだったのでは?
Unknown
(
Chuck
)
2009-03-18 04:38:51
あ、それです、それです。
Cで書きましたが当時見たときはそれほど無駄なコードは発生していないように思いました。WinAVRの最適化具合がバージョンによって揺れるのでなんとも言い切れないのですが。
とはいえfs=32kHzで入る程度まで仕様を削っています。乗算器があればもっといけたかもとは思います。定常音を得るのが目的だったのでEGとLFOは省略しましたが、音楽的には必要ですね。
8bit AVRで押し通すとしたら複数個のAVRを持ってきて個々の位相決定要素をそれぞれに演算させたものを集約させる、というやり方も面白そうです。
Unknown
(
nekosan
)
2009-03-18 20:10:22
EGやLFOまで含めて4音程度同時に出して、かつMIDI入力機能なども搭載できれば、ウクレレ的な楽器をコードでじゃかじゃか鳴らす程度は出来そうだなぁ…などと妄想しています。
MEGA48のアセンブラで実験したところ、2オペ(モジュレータ1、キャリア1)で50クロック程度だったんですが、これにEG、LFOも載せつつ、オペレータを8個まで増やせれば行けそうなんですが…
入りきらなかったら、やはり複数AVRに分散でしょうかね…
Unknown
(
nekosan
)
2009-03-19 19:56:00
>演算は sin(Cwt + B(t)sin(Mwt)) です。
なるほど。私の書いたロジックでは、今回は単音ということもあり色々手抜きをしてるので、とりあえず音が出る程度のスペックでした。
キャリアー側の周波数比は目下1固定にしちゃってます。(キャリア:2、モジュレータ:3,みたいな周波数比の設定が出来ない)
あと、各パラメタはレジスタ上で管理しているので、複数の音に対応させる時にはアクセスの遅いSRAMに確保しないとならないから、もう少し処理時間は必要になるでしょうね。
あと、sinテーブルは1波形256ポイント(8ビット幅)のデータしか持ってません。1波形を1バイトでアドレッシングできれば速いので。
この辺を拡充するとしたら、若干重くなりそうですね。
>私は手でパッチングしたい(アナログシンセ的に)ので
そうですよね。やっぱり手で弄りながら鳴らしたい!
ADSRはクルクルツマミかスライダーでグリグリ弄りたい。周波数比はロータリースイッチかロータリーエンコーダでしょうかね?
全部ロータリーエンコーダにすれば、入力端子がマルチプレクサできて簡単に済むかも…
>ADCで取り込もうとすると思います。演算精度が落ちるのですが。
10ビットADC取り込み時の割り込み禁止/解除の部分でしょうかね?
アセンブラだと割り込み禁止にしなくてもADCL、ADCHの2バイトのアトミックアクセス出来た気が…
もしくはADLAR=1として入力データの精度を8ビットに限定してしまえばアトミックアクセスも気にする必要がないかと…
Unknown
(
Chuck
)
2009-03-20 06:22:47
私はUIにはADCを多用しています。手軽なので。
演算精度が落ちるのは、アトミックアクセスとは関係なくて、単純にビット数の話です。ADCが10ビットしかありませんし、そもそもDAC出力が更新速度を考えるといいとこ8ビットです。
とはいえ外にでる信号を丸めなし8~10ビットに統一できれば問題は生じないと思います。
EGはまだないもののLFOや正弦波生成のAVRはあるので、パワーのあるマイコンに接続してみるのもいいかもと思い始めました。雑誌付録のLPC2388とか。
Unknown
(
nekosan
)
2009-03-20 19:35:31
>私はUIにはADCを多用しています。手軽なので。
そうですね。ロータリーエンコーダは入手性や値段に難がありますね…
>演算精度が落ちるのは、アトミックアクセスとは関係なくて、単純にビット数の話です。ADCが10ビットしかありませんし、そもそもDAC出力が更新速度を考えるといいとこ8ビットです。
DACと言えば、TINY861、461、261はPWM用に内蔵8MhzのPLL×8倍で64Mhzの出力ができるので、10ビットDACでも1サンプルあたり62.5Khzで出力が出来る計算です。(残念なことにMEGAシリーズじゃないので、乗算器が使えないんですけど)
このあいだTINY861買ってあるので、この高速PWM近々試してみたいと思ってます。
Unknown
(
Chuck
)
2009-03-21 05:59:41
UIは、ときどきボタンですら分圧電位を作ってADCに読ませたりしています。1ポートで8ボタンぐらい処理しています(同時押しは禁止で)。
> DACと言えば、TINY861、461、261
これはいいことを伺いました。ATtiny861は追いかけていなかったので知りませんでした。
tiny25/45/85/26 だと64MHz PWMできてもTimer1が8bitだったんですよね…
今8bit PWMで作っている正弦波生成に使いたいです。
200~230円ぐらいですか。近々買うかもしれませんが、先にレールで買ったtiny85をまずは消化しなくては…
Unknown
(
nekosan
)
2009-03-21 22:59:15
>UIは、ときどきボタンですら分圧電位を作ってADCに読ませたりしています。1ポートで8ボタンぐらい処理しています(同時押しは禁止で)。
ADCでボタン入力は1ピンですし、便利かも知れませんね。
>200~230円ぐらいですか。近々買うかもしれませんが、先にレールで買ったtiny85をまずは消化しなくては…
digi-keyでもtiny261は200円ちょっとって感じみたいですね。秋月とかの店頭でもその程度の単価で手に入るようになるといいんですけどね。
あと、できればmegaシリーズのように16ビットでPWMできるとか、もしくはMEGAシリーズでもPLLでPWMの周波数を引き上げられるといいいなぁ…。
コメントを投稿する
名前
タイトル
URL
コメント
※絵文字はjavascriptが有効な環境でのみご利用いただけます。
▼ 絵文字を表示
携帯絵文字
リスト1
リスト2
リスト3
リスト4
リスト5
ユーザー作品
▲ 閉じる
コメント利用規約
に同意の上コメント投稿を行ってください。
コメント利用規約に同意する
数字4桁を入力し、投稿ボタンを押してください。
以前ATtiny45でFM音源の実験をしたことがあります。乗算器がないので機能は限定的だったのですが。
http://emusic.g.hatena.ne.jp/Chuck/20070530
ここのmp3で正解でしょうか?
ギュンギュンの金属音でイイカンジですね。
TINY45だとハードウェア乗算器がなくて大変しょうね。
ソースもさっくり眺めさせていただきましたが、Cだと処理速度的にはかなりキツキツだったのでは?
Cで書きましたが当時見たときはそれほど無駄なコードは発生していないように思いました。WinAVRの最適化具合がバージョンによって揺れるのでなんとも言い切れないのですが。
とはいえfs=32kHzで入る程度まで仕様を削っています。乗算器があればもっといけたかもとは思います。定常音を得るのが目的だったのでEGとLFOは省略しましたが、音楽的には必要ですね。
8bit AVRで押し通すとしたら複数個のAVRを持ってきて個々の位相決定要素をそれぞれに演算させたものを集約させる、というやり方も面白そうです。
MEGA48のアセンブラで実験したところ、2オペ(モジュレータ1、キャリア1)で50クロック程度だったんですが、これにEG、LFOも載せつつ、オペレータを8個まで増やせれば行けそうなんですが…
入りきらなかったら、やはり複数AVRに分散でしょうかね…
なるほど。私の書いたロジックでは、今回は単音ということもあり色々手抜きをしてるので、とりあえず音が出る程度のスペックでした。
キャリアー側の周波数比は目下1固定にしちゃってます。(キャリア:2、モジュレータ:3,みたいな周波数比の設定が出来ない)
あと、各パラメタはレジスタ上で管理しているので、複数の音に対応させる時にはアクセスの遅いSRAMに確保しないとならないから、もう少し処理時間は必要になるでしょうね。
あと、sinテーブルは1波形256ポイント(8ビット幅)のデータしか持ってません。1波形を1バイトでアドレッシングできれば速いので。
この辺を拡充するとしたら、若干重くなりそうですね。
>私は手でパッチングしたい(アナログシンセ的に)ので
そうですよね。やっぱり手で弄りながら鳴らしたい!
ADSRはクルクルツマミかスライダーでグリグリ弄りたい。周波数比はロータリースイッチかロータリーエンコーダでしょうかね?
全部ロータリーエンコーダにすれば、入力端子がマルチプレクサできて簡単に済むかも…
>ADCで取り込もうとすると思います。演算精度が落ちるのですが。
10ビットADC取り込み時の割り込み禁止/解除の部分でしょうかね?
アセンブラだと割り込み禁止にしなくてもADCL、ADCHの2バイトのアトミックアクセス出来た気が…
もしくはADLAR=1として入力データの精度を8ビットに限定してしまえばアトミックアクセスも気にする必要がないかと…
演算精度が落ちるのは、アトミックアクセスとは関係なくて、単純にビット数の話です。ADCが10ビットしかありませんし、そもそもDAC出力が更新速度を考えるといいとこ8ビットです。
とはいえ外にでる信号を丸めなし8~10ビットに統一できれば問題は生じないと思います。
EGはまだないもののLFOや正弦波生成のAVRはあるので、パワーのあるマイコンに接続してみるのもいいかもと思い始めました。雑誌付録のLPC2388とか。
そうですね。ロータリーエンコーダは入手性や値段に難がありますね…
>演算精度が落ちるのは、アトミックアクセスとは関係なくて、単純にビット数の話です。ADCが10ビットしかありませんし、そもそもDAC出力が更新速度を考えるといいとこ8ビットです。
DACと言えば、TINY861、461、261はPWM用に内蔵8MhzのPLL×8倍で64Mhzの出力ができるので、10ビットDACでも1サンプルあたり62.5Khzで出力が出来る計算です。(残念なことにMEGAシリーズじゃないので、乗算器が使えないんですけど)
このあいだTINY861買ってあるので、この高速PWM近々試してみたいと思ってます。
> DACと言えば、TINY861、461、261
これはいいことを伺いました。ATtiny861は追いかけていなかったので知りませんでした。
tiny25/45/85/26 だと64MHz PWMできてもTimer1が8bitだったんですよね…
今8bit PWMで作っている正弦波生成に使いたいです。
200~230円ぐらいですか。近々買うかもしれませんが、先にレールで買ったtiny85をまずは消化しなくては…
ADCでボタン入力は1ピンですし、便利かも知れませんね。
>200~230円ぐらいですか。近々買うかもしれませんが、先にレールで買ったtiny85をまずは消化しなくては…
digi-keyでもtiny261は200円ちょっとって感じみたいですね。秋月とかの店頭でもその程度の単価で手に入るようになるといいんですけどね。
あと、できればmegaシリーズのように16ビットでPWMできるとか、もしくはMEGAシリーズでもPLLでPWMの周波数を引き上げられるといいいなぁ…。