32kHzでも処理が追いつかなくて、16kHzでギリギリセーフだ。コードを最適化していけばもうちょっと頑張れると思うが、I2Cで入出力処理したり、トラックを増やしたりしたいので16kHzでやっていくことにする。
SPI通信に時間が食われているのかも?と思ってPSoC4の内蔵DACでもやってみたが、大して変わらなかった。
MCP4922を使った場合のタイミング
PSoC CreatorのTopDesignPSoC Creatorのプロジェクト
https://github.com/ryood/RhythmMachine/tree/master/PSoC/PSoC_Fixedpoint_DDS_RhythmMachine/PSoC_Fixedpoint_DDS_ThythmMachine_MCP4922.cydsn
DACにSPI送信する前後でPin_LDACをH/Lしているので、DACにデータを送信した場合としない場合を比較してみた。
DACへの送信なし(Sampling Rate: 48kHz)
ch1:Pin_LDAC ch2:Pin_Sampling_OV
DACへの送信あり(Sampling Rate: 48kHz)
DACへ送信すると処理がサンプリング間隔に間にあっていない。
PSoC 4内蔵のDACを使った場合のタイミング
PSoC ReatorのTopDesignPSoC Creatorのプロジェクト
https://github.com/ryood/RhythmMachine/tree/master/PSoC/PSoC_Fixedpoint_DDS_RhythmMachine/PSoC_Fixedpoint_DDS_RhythmMachine_IDAC.cydsn
DACに値を設定する前後で「Pin_IDAC8_Check」をH/Lした。
ch1:Pin_Sampling_OV ch2:Pin_IDAC8_Check
ありゃ?なんか波形がおかしいかな?気が向いたらもう一回チェックしてみよう。
MCP4922でサンプリング周波数を下げる
16kHz
ch1:Pin_LDAC ch2:Pin_Sampling_OV
ギリギリ間に合ってる感じだ。
12kHz
8kHz
8kHzまで下げるとかなり余裕がある。
音出し
MCP4922はPin14の出力をそのまま、PSoCのIDACは1kΩのRでI-V変換してオーディオインタフェースに入力して、PC上のGoldWave(波形編集ソフト)で録音した。DACの出力にはLPFを入れていない。8kHzではさすがに変な音になるが、逆にエフェクトかけたみたいで面白いかもしれない。
MCP4922の16MHzのキックの裏拍が歪っぽいが、スネアとかぶっていてオーバーした値に強制的にリミットをかけているのでどうとも言えない。(波形は頭打ちの矩形波的になっている)
メモ:
- ProperaheadのRebirth338(TB-303、TR-808、TR-909のソフト音源)で遊んでいたのがPentiumの200MHzとかそのあたりのCPUだったような気がするので、いくらARMとはいえFPUやMMX(だっけか?)の載っていない48MHzのCPUで音を作って合成するのはそれなりに真剣にやらないといけないようだ。
- Cortex-M3のPSoC 5LPならもう少し余裕がありそうだがなんか悔しいのでPSoC4でできる範囲で粘ろうと思う。
- サンプリング周波数を実行時に設定できるようにする?
- シーケンサー基板とPSoC4でほんとに単にシーケンサーとして使い、アナログ発振回路やノイズ生成回路の振幅を制御することも妄想中。
0 件のコメント:
コメントを投稿