2015年10月22日木曜日

PSoC 4でリズムマシンの音出しテスト

サンプリング周波数48kHzはムリだった。

32kHzでも処理が追いつかなくて、16kHzでギリギリセーフだ。コードを最適化していけばもうちょっと頑張れると思うが、I2Cで入出力処理したり、トラックを増やしたりしたいので16kHzでやっていくことにする。

SPI通信に時間が食われているのかも?と思ってPSoC4の内蔵DACでもやってみたが、大して変わらなかった。

MCP4922を使った場合のタイミング

PSoC CreatorのTopDesign

PSoC 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のTopDesign

PSoC 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でほんとに単にシーケンサーとして使い、アナログ発振回路やノイズ生成回路の振幅を制御することも妄想中。