今回作るノイズジェネレーターは、NOS01という名前にした。Noiseは+3dB/octのようだ。フィルターだと1次フィルターの傾斜の半分に相当するので、2次(12dB/oct)のSVFは過剰。多いがCR1次フィルタでやってみることにした。Noiseというようだ。Webで見て回るとちゃんとリニアな±3dB/octにしようとするとめんどくさくなりそう。Products」さんの記事や「TECHLIB.COM」さんの記事など)CR1次フィルタはカットオフ周波数以上/以下は6dB/octで減衰するが、通過域は平坦なので、カットオフ周波数を可聴帯域の外に設定した。Noiseになってしまうが、お試しで使うのでまあだいたいということで。Noiseに比べてトータルの音量が下がってしまうので、後段に非反転増幅回路を入れて音量を調節した。AC解析CRフィルターや増幅回路の定数は厳密に求めたものではなく、聞いた感じできめた。Noise発生回路も前回実験した回路の定数を多少変更した。ACカップリングのC1、C2の値は10uFだと電位が落ち着くまで時間がかかるので1uFに下げた。1.59Hzブレッドボードで実験OPAMPはFET入力のTL072を使った。Noise傾きはだいたい+20dB/dec(+6dB/oct)録音してYouTubeにあげた。Noise用のフィルターをシミュレーションしてみた。シミュレーション回路図AC解析100Hzから1kHzで約-13dB、1kHzから10kHzで約-7dBになっている。反転増幅回路のLPFで極を2つ(?)作って傾斜をなだらかにして、だいたい-10dB/octdecの傾斜にしているようだ。その2前回実験した回路この回路のC1とR1の決め方がよくわからないので、ノイズ源として使っているQ1を電圧源に変えてAC解析してみた。シミュレーション回路図AC解析C1をパラメータ解析してみると、どうやらC1がノイズの周波数分布に影響して、低域の減衰の原因になっているようだ。Cappelsさんの記事を参考に、もう少し素直に見える回路も実験してみた。回路図Q1で発生したノイズをQ2のエミッタ接地回路で増幅、C3とR4でACカップリングしてU1の非反転増幅回路(101倍)で増幅し、さらにU2の非反転増幅回路(4.3倍)で増幅した。OPAMPはTL072を使った。前回の回路と比べるとOUT1の出力が小さく、後段の増幅率をかなり大きくしている。(Trの品種や個体差でノイズの出力レベルがかなり変わるようなのでもう少し調べないと、どうなのかはわからないです。)U1とU2の間のC1とR7はU1の増幅回路のオフセット電圧が大きく、電位が偏ってしまうので(とりあえず)ACカップリングしてみた。ch2:OUT1電源が9Vだとノイズが発生しない。ch2:OUT110Vかけるとノイズが発生。ch2:OUT1電源電圧を上げるとOUT1(OPAMPによる増幅前)のノイズの振幅は大きくなるが、増幅後はレベルが下がっている。前回と比べると、OUT2(OPAMPの増幅後)の波形がまばらになっているが、これはOPAMPによる増幅率が大きく周波数特性が悪化しているためだと思う。(OPAMPは増幅率が上がると周波数特性が悪化する)WaveSpectraでFFTこの回路では可聴帯域の低域の減衰が見られない。LTSpiceで書いたが、シミュレーションできない。F4GRXさんの記事を参考にしました。2.0の回路図は公式サイトに掲載されています。F4GRXさんの記事を引用。gaje.jpさんのブログ記事によるとノイズ発生用のTrはBC547がいいと書いてあるが、手持ちの2SC1815を使った。Trのベース・エミッタ間に逆電圧をかけるとノイズが発生する(アバランシェ降伏というらしい)ことを利用した回路で、そのままではレベルが低いのでエミッタ接地増幅回路で電圧増幅している。Trのエミッタ接地)Trのベース・エミッタの絶対定格(2SC1815の場合は5V)を越えて電圧をかける必要があるので、Trは壊れる。Q2のエミッタ接地回路はC2で接地されているので交流の増幅率はhFEになる。電源電圧が低いとノイズの出力レベルが低いので、後段にOPAMPの非反転増幅回路も入れてみた。回路図OPAMPはNJM4580を使い、電源は両電源とし、電源電圧を変えながら測定してみた。ch2:OUT1ノイズはほとんど発生しない。ch2:OUT1OUT1:460.0mVOUT2:2,060mV10Vかけるとノイズが発生する。ch2:OUT1OUT1:2,880mVOUT2:10,560mV電源電圧を上げると出力ノイズレベルも大きくなる。WaveSpectraでFFTWaveSpectraで可聴帯域のスペクトルを見てみた。信号レベルが大きいとオーディオ・インターフェイスが心配なので一部のみ。オーディオ・インターフェイスの入力はGuitar入力(入力インピーダンス:1MΩ)にした。VCC-VEE実測値:14.98Vオペアンプによる増幅前オペアンプによる増幅前だと1kHz以下が減衰している。全幅1kHz(100Hz/Div)で特に減衰しているようにも見えない。オーディオ・インターフェイスの入力が影響しているかもしれないので、OPAMPをTL072(FETタイプで入力インピーダンスが高い)のボルテージフォロア、回路図のR4を1MΩにしてOUT2を測定。ボルテージフォロア低域の減衰はかなり抑えられる。エミッタ接地の出力インピーダンスが4.7kΩ程度あるのとC3でAC結合しているのが影響しているのか?C2の容量もあやしい。実験後のTrの特性AVRトランジスタテスターで実験後Trの特性を測定してみた。Q1(2SC1815-GR)B=297Vf=690mVQ2(2SC1815-Y)B=172Vf=706mVQ1はもっとわかりやすく壊れるかと思ったがそうでもないようだ。メモ:アバランシェ降伏によるノイズはツェナーダイオードでもできるらしい。トラ技2015年8月号の「楽器エフェクタ製作集」にはCMOSロジックICのインバーター(Unbuffer)を使ったノイズ・ジェネレーターの回路が載っている。VCAを組み合わせて音出ししてみた。前半は振幅と周波数のエンベロープをいじって、中盤は音域を高くしてスネア・タムっぽくしたもの、後半は過大入力をいれてOverDriveしている。Nucleo(mbed)でプロトタイピング」ですべて内部演算をしていたものと比べて出音は丸い感じになってるかな?XSplitで録音/録画して、YouTubeにあげているのでわかりにくかもしれません。±17mANucleoF446はまあまあいい量の電力を食いよりますね。Bridgeからアナログ的に出力していて音声出力のためのサンプリングレートではないが、一定の周期で波形の周波数と振幅を更新しているのでその周期の問題です。WaveSpectraでスペクトルを見たものだが、32,000Hzあたりにピークが出ている。これは上記サンプリング周期によるデジタル的な歪だと思う。音にしなくても、離散処理するとこんなとこにまで影響が現れる。DCOにSPI送信する最初と最後でH/Lさせている。DCOは2回送信しているので間に細い線で分割されている。周期は31usで、逆数をとって約32,258Hz。タイマ割り込み一回分の処理時間は16.3us、SPI通信で11.7us(カーソルで測定)とほとんどがSPI通信に食われている。エンベロープを対数カーブにする浮動小数点演算や内蔵DACからの出力はch1とch2のHの時間の差分で行っていて、処理が重そうなわりにほとんど消費していない。ch1の間隔を見るとまだ余裕がありそうだが、これ以上処理の間隔を縮めると処理が追いつかず、入力系の処理ができなくなる。入力系の処理はMCP3008と遅~いSPI通信を行っている。5LPはCortex-M3でFPUが載っていないが、SPI通信はNucleoをmbedで使うよりも高速なので使ってみる手はあるかも。Nucleoをmbedではなくネイティブ環境でやってみる。←かなりめんどくさい(@@;でもまあ、32,000Hzは可聴帯域外だし、高速化できたとしてもエイリアスの出る周波数が高くなるだけで消えるわけではないので、とりあえずは一旦妥協する方向で。VCAの回路の一部で、R8とC3で1次LPFを構成してエンベロープ波形を滑らかにしている。ところが、R8を0Ω側に回し切ると発振してしまう。拡大(発振波形)R8を0ΩにするとIC3Aのボルテージフォロアの出力をIC4Aの非反転入力(インピーダンス高)に直接つないでいることになり、GNDに落としているC8がもろに容量性負荷というやつになっていると思う。発振しないようにするには、固定抵抗でゲタをはかすべきだと思うが、トリムPOTをちょっとだけプラス側に回しておけば大丈夫なので、今後気をつけることにする。←もう少し理論的なことも調べる。キック音源としては、Attackでかすかにシャンシャンいう音を混ぜたい。サンプリング音源と混ぜてもいいが、アナログシンセではノイズ・ジェネレーターを使っていることが多いので試しにやってみたい。ホワイトノイズを発生させて、フィルターを通してピンクノイズやブルーノイズにしてみる。ノイズ系はシーケンサーから制御するのは振幅変調のみ。フィルターはSVFを考えていて、カットオフ周波数やレゾナンスのパラメータは普通のPOTで手で設定する。フィルターにエンベロープをかけても面白いかも知れないので後で差し替えられるようにしておく。NucleoF446は、SPIが3系統付いていてSPI制御はしやすいが、DACは2個しかない。NucleoF303は、DACが3系統使えるがSPIが1系統しかなく、演算速度も若干遅い。Bridgeは周波数が高くなると出力振幅が小さくなるので、周波数が高くなると振幅が大きくなるように補正してVCAにエンベロープを出力するようにして、ようすを見てみる。Filterのプログラムを書いてIIRを通して違いを見てみる。Digitalフィルターのパラメータはプログラム上で計算するのは大変なので、いくつか用意しておいて切り替えられるようにする。メモ:現状でもエンベロープ設定用にPOTx16を使っているが、ノイズジェネレーターのエンベロープ波形を設定するとなるとさらに8個ぐらいは必要そう。Bufferこの間、u8g2で描画テストをしてみてSRAMを消費しすぎていたので原因を考えてみた。char*」に変更してみた。}ビルドの結果は最大30720バイトのフラッシュメモリのうち、スケッチが9650バイト(31%)を使っています。最大2048バイトのRAMのうち、グローバル変数が1512バイト(73%)を使っていて、ローカル変数で536バイト使うことができます。なって、SRAMの消費量は「#define」の時と同じ1512バイト。この程度は最適化されるようだ。IDEと言っても中でavr-gccでGCCを使っている。GCCは賢い(^q^!<追記:2017.09.18>文字列定数はSRAMではなくフラッシュメモリに格納されると思うので、フラッシュメモリの使用状況も比較。最大32256バイトのフラッシュメモリのうち、スケッチが9644バイト(29%)を使っています。最大2048バイトのRAMのうち、グローバル変数が1512バイト(73%)を使っていて、ローカル変数で536バイト使うことができます。最大30720バイトのフラッシュメモリのうち、スケッチが9650バイト(31%)を使っています。最大2048バイトのRAMのうち、グローバル変数が1512バイト(73%)を使っていて、ローカル変数で536バイト使うことができます。Bufferだと転送用バッファでメモリ領域を専有しているのでは?と思って、Page単位のクラスを使ってみた。while()ループ内でu8g2.clearBuffer()、u8g2.sendBuffer()は不要とご指摘いただいたので、スケッチを修正しました。OLEDに変更した(クラス名の途中のFを1にする)。while()」で回すように変更。最大30720バイトのフラッシュメモリのうち、スケッチが9730バイト(31%)を使っています。最大2048バイトのRAMのうち、グローバル変数が616バイト(30%)を使っていて、ローカル変数で1432バイト使うことができます。Bufferだと616Bで済んでいる。ページ単位の書き換えだと書き換えが上から下へとダラダラした描画になる。ベースマシンのシーケンサーのStep表示みたいなリアルタイム書き換えだと見栄えがよくない。Bufferを使ったほうがいいと思う。メモ:SSD1306はu8glibやu8g2の他にも専用のライブラリが多数公開されています。3mA10kΩ負荷、100Hz出力時。Github:https://github.com/ryood/SPI_Wein_Bridge_Oscメモ:増幅率を決める5kΩのトリムPOTは調整がちょっとむずかしいので、多回転タイプの方が良かったかも。筐体のサイドパネルをニスで塗装してみた。128X32をu8g2で使ってみる。