前半は振幅と周波数のエンベロープをいじって、中盤は音域を高くしてスネア・タムっぽくしたもの、後半は過大入力をいれてOverDriveしている。
ジャンル的には、Techno → Psy Trance → Hard Styleっぽいかんじでしょうか(^q^?
「キックマシン KIK01 Nucleo(mbed)でプロトタイピング」ですべて内部演算をしていたものと比べて出音は丸い感じになってるかな?
XSplitで録音/録画して、YouTubeにあげているのでわかりにくかもしれません。
KIK01 Proto04の構成
消費電流
NucleoF446 + AD8402 Wien Bridge DCO: 100mA~120mA
Dual OTA VCA: ±17mA
NucleoF446はまあまあいい量の電力を食いよりますね。
mbed repository:
https://os.mbed.com/users/ryood/code/KIK01_Proto04/ Revision:23
サンプリングレートの問題
今回は元になる波形はWien Bridgeからアナログ的に出力していて音声出力のためのサンプリングレートではないが、一定の周期で波形の周波数と振幅を更新しているのでその周期の問題です。
WaveSpectraでスペクトルを見たものだが、32,000Hzあたりにピークが出ている。これは上記サンプリング周期によるデジタル的な歪だと思う。直接音にしなくても、離散処理するとこんなとこにまで影響が現れる。
処理のタイミングを計測
ch1:D8 ch2:D9
ch1は一回のタイマ割り込み処理の最初と最後でH/L、ch2はAD8402 Wien Bridge DCOにSPI送信する最初と最後でH/Lさせている。AD8402 Wien Bridge DCOは2回送信しているので間に細い線で分割されている。
周期は31usで、逆数をとって約32,258Hz。
タイマ割り込み一回分の処理時間は16.3us、SPI通信で11.7us(カーソルで測定)とほとんどがSPI通信に食われている。エンベロープを対数カーブにする浮動小数点演算や内蔵DACからの出力はch1とch2のHの時間の差分で行っていて、処理が重そうなわりにほとんど消費していない。
ch1の間隔を見るとまだ余裕がありそうだが、これ以上処理の間隔を縮めると処理が追いつかず、入力系の処理ができなくなる。入力系の処理はMCP3008と遅~いSPI通信を行っている。
PSoC 5LPはCortex-M3でFPUが載っていないが、SPI通信はNucleoをmbedで使うよりも高速なので使ってみる手はあるかも。
または、Nucleoをmbedではなくネイティブ環境でやってみる。←かなりめんどくさい(@@;
でもまあ、32,000Hzは可聴帯域外だし、高速化できたとしてもエイリアスの出る周波数が高くなるだけで消えるわけではないので、とりあえずは一旦妥協する方向で。
Dual OTA VCAのエンベロープ波形の発振
上図はDual OTA VCAの回路の一部で、R8とC3で1次LPFを構成してエンベロープ波形を滑らかにしている。ところが、R8を0Ω側に回し切ると発振してしまう。
抵抗値を少し上げる(正常)
ch1:エンベロープ入力 ch2:エンベロープLPF通過後
抵抗値ほぼ0Ω(発振)
ch1:エンベロープ入力 ch2:エンベロープLPF通過後
拡大(発振波形)
R8を0ΩにするとIC3Aのボルテージフォロアの出力をIC4Aの非反転入力(インピーダンス高)に直接つないでいることになり、GNDに落としているC8がもろに容量性負荷というやつになっていると思う。
発振しないようにするには、固定抵抗でゲタをはかすべきだと思うが、トリムPOTをちょっとだけプラス側に回しておけば大丈夫なので、今後気をつけることにする。←もう少し理論的なことも調べる。
KIK01の第二次作戦
図の下半分あたりは、AD8402 Wien Bridge DCOとDual OTA DCAで構成できた。
キック音源としては、Attackでかすかにシャンシャンいう音を混ぜたい。サンプリング音源と混ぜてもいいが、アナログシンセではノイズ・ジェネレーターを使っていることが多いので試しにやってみたい。
ホワイトノイズを発生させて、フィルターを通してピンクノイズやブルーノイズにしてみる。ノイズ系はシーケンサーから制御するのは振幅変調のみ。フィルターはSVFを考えていて、カットオフ周波数やレゾナンスのパラメータは普通のPOTで手で設定する。フィルターにエンベロープをかけても面白いかも知れないので後で差し替えられるようにしておく。
NucleoF446は、SPIが3系統付いていてSPI制御はしやすいが、DACは2個しかない。
NucleoF303は、DACが3系統使えるがSPIが1系統しかなく、演算速度も若干遅い。
痛し痒し(@@;
サイン波出力部分の改良案
Wien Bridgeは周波数が高くなると出力振幅が小さくなるので、周波数が高くなると振幅が大きくなるように補正してVCAにエンベロープを出力するようにして、ようすを見てみる。
プログラム上でexp()関数を使ってエンベロープ波形をアナログチックにしているが、Digital Filterのプログラムを書いてIIRを通して違いを見てみる。Digitalフィルターのパラメータはプログラム上で計算するのは大変なので、いくつか用意しておいて切り替えられるようにする。
メモ:
現状でもエンベロープ設定用にPOTx16を使っているが、ノイズジェネレーターのエンベロープ波形を設定するとなるとさらに8個ぐらいは必要そう。
POTをズラッと並べた方がパラメータいじりは楽だが、コンパクトにしたい気もするなぁ・・・
0 件のコメント:
コメントを投稿