2022年12月30日

LaVoixski@InputCaptureのデータ補完システムを導入する

WaveTable を読み出すタイミングを決定する”サンプリング・クロック = LRCK”と、フリーランするGPTの状態を外部からのトリガで記録する InputCapture により発動されるインターラプトは、当然ながら非同期の関係にあり、、、

Screen Shot 2022-09-14 at 7.03.32.png

オシレータの合成出力からデモジュレートされた入力信号(周波数帯域は数百Hz台)のアップエッジ間を計数したデータに次の更新が行われるまでの間、その数値は「ロック」されることになる。 

このロック(数値の固定)によって生じる影響は階段状の不連続な計測値の「段差」の発生で、周期性を持ったそれは入力されたアナログオシレータの周波数が反映されてしまう。 

Screen Shot 2020-01-14 at 14.34.26.png

この段差がスプリアス状の信号となって音声出力に影響を及ぼしているのだが、

Screen Shot 2020-03-06 at 4.33.54.png

今回行った試みは「段差の隙間」を埋める機構を追加する手法で、InputCaptureのトリガが発生する間隔をサンプリング・クロックのタイミングで計数し、そのステップ数を費やしてデータに発生した差分の解消を行う仕掛けだ。

Screen Shot 2023-01-10 at 2.58.52.png

まず、InputCaptureのデータが更新される間隔を、サンプリング・クロックによって駆動される AttatchInterrupt のタイミングで計数する。

Screen Shot 2022-12-31 at 4.19.46.png

データに発生した差分は、既に計数したStep数に分割され、サンプリング・クロックのタイミングで次の更新値まで加算される。

Screen Shot 2022-12-31 at 4.07.35.png

Pitch側のサブルーチンにジャンプするタイミングで、更新に掛かった時間を計数した結果をレジスタに取り込みつつ、カウンタをリセットする。

Screen Shot 2022-12-30 at 2.26.31.png

事前に10サイクル分の平均値を取った後、記録した1サイクル前のデータとの差分を比較して、1 step 当たりに加減を行う数値を割出す。

Screen Shot 2022-12-30 at 2.27.10.png

Volume側もPitch側と同様に、Volumeデータを取り扱うサブルーチンにジャンプしたタイミングで、更新に掛かった時間を計数した結果をレジスタに取り込み、カウンタをリセットする。

Screen Shot 2022-12-31 at 4.08.13.png

こちらも10サイクル分のデータから平均値を割り出した後に、1サイクル前のデータとの差分を比較して、1 step 当たりに加減を行う数値を割出す。 

Screen Shot 2022-12-31 at 4.08.48.png

ここでは、Transition に関するエンヴェロープ・データの更新を行っている。

Screen Shot 2022-12-31 at 4.08.57.png

結果として、極低音域で発生していた妙なバタつきが抑えられたのだが、機能の実装後に何故かChromaticModeが起動しない謎のバグに悩まされた。 バグの発生はメモリの整理を行うことで回避することが出来たが、そろそろ空きメモリに余裕がなくなってきたことが動作不良が発生した原因なのかもしれない。

追記: LCDをドライヴする周期を決定すると、出音にフリッカが発生することが判明したので、描画のタイミングをフリーランに戻すことにした。

Screen Shot 2022-12-31 at 4.09.41.png

追記2:

Volume側のValueが1000を超える辺りで発生する変化量は急峻で

Screen Shot 2022-07-13 at 3.54.41.png

Screen Shot 2022-07-26 at 16.35.30.png

どうしても補正しきれないケースが発生してしまうが、そこは用法でカヴァーするしか手段はない。 

EMAを調整する方法もあるが、その場合には当然ながらレスポンスとのトレードオフが発生する。
posted by Yasuski at 03:12| LaVoixski

2022年12月29日

2022年12月28日

LaVoixski@グリッチの発生に対応する

LFO等、エンヴェロープを極大値まで変化させる状況でグリッチの発生を確認、その対策を講じた。

まず、シャックリ現象対策を兼ねて、カウンタのオーバーフローを検知する機構を追加した。

Screen Shot 2022-12-28 at 6.38.12.png

Pitch/Volume双方にメモリバッファーを追加。

Screen Shot 2022-12-28 at 7.55.44.png

記録した10回分のデータを平均化する。

Screen Shot 2022-12-28 at 7.56.03.png

Volume側で一度削除したEMAの2段階自動設定システムを復活させた。 

前段は13bit幅のデータを16に分けた帯域毎に平滑し、これを12bitにマッピングした結果でエンヴェロープを記録したウエーブテーブルを駆動する。

Screen Shot 2022-12-28 at 7.56.31.png

後段は12bit幅でウエーブテーブルから読み出された数値を丸めている。帯域は素数っぽい配分で分割している。

Screen Shot 2022-12-28 at 7.56.21.png

この映像は、対策を行った後に記録したもの。



グリッチは完全に消去されていないが、そこそこのレベルで軽減が行われていることを確認した。
posted by Yasuski at 23:01| LaVoixski

2022年12月26日

LaVoixski@InputCapture発動時に立てたフラグの「消し忘れ」が発覚する。

inputCaptureのフラグを消し忘れているのが発覚したので、

Screen Shot 2022-12-26 at 23.44.57.png

フラグを消去するルーティンを追加したところ、

Screen Shot 2022-12-26 at 17.15.36.png

EMAによって平滑化していたデータの推移が極端に緩慢になる現象が発生した。

よく考えると、元来はEMAに小数点以下4桁代の数値を当てはめた場合の反応としてこの遅れの発生は当然の結果なのだが、修正に次ぐ修正を重ねていく過程でその不自然な挙動を疑問に思うことはなかった。

案の定、煽りを食らって他にも修正を強いられる箇所が大量に発生したのだが、

Screen Shot 2022-12-26 at 17.15.22.png

Screen Shot 2022-12-26 at 23.27.37.png

Screen Shot 2022-12-26 at 23.32.56.png

予め該当する係数に変数を充てていたお陰で、円滑に再設定を行うことが出来た。

Screen Shot 2022-12-26 at 17.16.02.png

これだけの大改装を行ったものの、相変わらずシャックリは治りきっておらず、問題の原因は物理面にありそうなことを示唆している。

物理面の怪しいポイントを潰すべく、まずはオシレータ周りの電源ラインに配置した "L" をショートさせることで電源ラインの構造をシンプルに整理したのだが、

IMG_9171.JPG

頻度は下がってもシャックリの発生は解消できていない。

ディテクタからの復調信号を計数した結果を見ると、シャックリが起きる度に10から20程度カウント数が低下するようだ。

このような急峻なデータの変化を抑えるフィルタの実装を試みているのだが、まともに動作する仕掛けの考案には至っていない。

前述したように、問題はやはり「物理」で発生している感があるのだが、一番怪しいのはコネクタ類の接点で、特にアンテナ周りが怪しく感じるものの、見掛け上の導通は正常値を示している。

他に怪しいポイントはリファレンスオシレータ側のバラクタ周りで、周波数を設定する電圧のカーヴが微妙な位置にセットされている可能性がある。

その後の試行錯誤の結果、デモジュレートした信号の低域側でシャックリが発生する傾向が認められたため、デフォルトの周波数設定値を"260"に調整した結果、シャックリの発生頻度が激減した。 

IMG_9176.JPG

簡易型のアナログ・オシレータの性能限界から、センシングが行える周波数には上限があり、

Screen Shot 2022-12-02 at 23.12.17.png

結果として演奏が可能な音域のレンジが狭まってしまったのだが、これでも 5 oct.は実用域を確保できている。

それ故、スペックの追求は程々にした方がよいのかもしれない。

試行錯誤を行う過程で、スプリアスの影響を考慮してカウンタのクロックを下げてみたが、いまひとつ効果は実感できなかった。

Screen Shot 2022-12-27 at 0.47.09.png

シャックリが発生する具体的な原因として、デモジュレータから入力される復調信号のエッジに発生した「チャタリング」が悪さをしている可能性を考えているのだが、物理原因で発生する高速なチャタリングに対して bitShift は効果が望めず、ソフトウエア側で対処出来そうなことは限られている。 

より実効性のある物理的な対処法として、発振回路側にヒステリシスを持たせた「波形整形回路」を設定することを考えているが、

Screen Shot 2022-12-27 at 4.58.58.png

回路上に部品を挿入するスペースを確保出来るかは微妙なところか。

IMG_9168.JPG
posted by Yasuski at 23:45| LaVoixski

2022年12月21日

LaVoixski@ID-292ヴァージョンが遂に完成する

手元にアンプが無いので音声の確認は未了だが、とりあえずMCUを実装してUIの動作を確認した。

IMG_9136.JPG

IMG_9137.JPG

IMG_9140.JPG

IMG_9148.JPG

期待していた「RGBプッシュ・スイッチ」の採用は、スイッチの極性の問題から失敗している。

当初はLEDの配色を間違えていたが、こちらはソフトウエアの変更で解決することができた。

ピッチに関しては、LCDの表示を見る限りチューニングのオフセット設定を行っていないことが原因で、不安定な状態に陥っている感がある。

LCDの接続方法は、製作時に懸念した通り「テフロン線の断線祭り」に陥った結果、リボンケーブルにリプレイスされることになった。

IMG_9151.JPG

通電後に煙が上がることもなく安心してアンプを繋いでみたところ、音が全く出ない非常に残念な状況に陥ってしまった。 が、翌日のライヴに間に合わせるためには早急に原因を究明しなければならない。 とりあえず、データラインの波形を観測すると、MCUからの通信は健全に行われているように見える。 ただし、DACの出力端子をオシロスコープで観測しても、全てのchから音声が出力されていない。 DACチップそのものの故障(ロット単位)も考えられるので、とりあえずの対応としてチップの交換を行うことを考えた。

IMG_9152.JPG

チップの交換を行う前に回路を精査した結果、音声が出力されない原因と考えられる「DACの負電圧発生回路に電源を引き忘れる」というポカミスが発覚した。 失敗の原因は「怪し気な回路図を参照したこと」にあったようだ。 念のため、稼働実績のある回路を参照することにしたが、どうやらチャージポンプ回路を構成する”C”の定数にも間違いがあったようだ。

PCM5102Aboard.png

なんとか DAC2 からの発音に漕ぎ着けたものの、依然としてDAC1(3/4ch)が反応しない。

また、稼働試験の過程で、目玉を発色させているPWMからオーディオラインにノイズが乗ることが判明している。 これはバラック環境では目立たなかった現象だが、頻繁に点滅する目玉の制御を、よりノイズの発生が少ないスタティック点灯方式に変更すべきだろう。

その後、不完全な仕上がりのまま、いきなり楽器として実戦投入することになったのだが、、、



リザルトはこんな感じになった。 ローディーが居ない何時ものパターンで、サウンド・チェックのみを記録している。

LaVoixskiの新型(CortexM7ベース)はM4ベースの旧型と比較してノイズ耐性が高く、現場に於ける実用性が証明された一方、内部回路に起因する「シャックリ」の発生を抑えきることが出来なかった。

IMG_20221218_114759808.jpg

今回のライヴで判明した問題点は、、、

1)シャックリの発生は、基本的には内部構造によるものなのだが、外乱の影響をある程度受けているようにも感じた。 ちなみに、周波数カウントを16bit幅で行っている旧型機は、本来これをメインに使う予定だったにも関わらず、現場のノイズに負けていた。

2)シャックリ対策として、カウンタの値にビットシフトを行ってレンジを変更するのが有効だが、出来ればこれを現場の環境に対応して行えるような機能を追加すべきかもしれない。

3)音響システム側の入力chが限定される環境では、テルミン側のch3/4アウトを採用するのが難しいことが判った。

4)クリッピングを許容するMixOutのアドレスと、通常レベルの編集を行うアドレスのレベル差が解消されておらず、レベルシフターの有効性に課題が残った。

5)ディストーション回路は正しく動作していて、出音がソフトに歪むことを確認しているが、レベルシフターとの統合が難しい。

6)これは事後の発見だが、出力が行われないDAC1のチャージポンプ用Cの実装ミスを発見している。

IMG_9153.JPG

Screen Shot 2022-12-19 at 11.49.09.png

シャックリ対策のその後は、、、

1)FrequencyDetect時にpitchデータを記録するバッファの更新箇所

Screen Shot 2022-12-20 at 20.52.10.png

2)帰還型フィルタ群の設定値

Screen Shot 2022-12-20 at 20.52.23.png

3)PREDIV(システムクロックの分周率)の値

4)Pitch/Volumeの復調信号をカウントした結果に対するBitShiftの設定値

Screen Shot 2022-12-20 at 20.52.33.png

以上の定数をそれぞれ変更した結果、シャックリの発生を極力抑えることに成功している。

5)DAC1に関しては、負電圧を発生させるチャージポンプ回路周りに不具合が発生していたようで、2度目のデバイス交換で回路の発振を確認したものの、相変わらず音が出ない。

6)レベルシフタの動作不良に関しては、まずD2をD38に変更した後、アッテネータの抵抗値 2.2k / 7.5k の組み合わせを、7.5kHz側を並列化することで 3.75k に変更して過大に減衰を行っていたクリッピング波形のレベルを稼いだ。 これでもまで低い感触があるので、3.3k 辺りまで下げた方が良いだろう。

Screen Shot 2022-12-19 at 23.45.29.png

7)目玉LEDをスタティック点灯方式に変更する過程で点灯のためのプログラムに不備を発見し、これを修正している。

その後、DAC1周りの回路に凡ミスを発見した結果、ようやく4ch(アウトプット端子の不備で現時点での確認は3chだが)の出力を行えるようになった。

Screen Shot 2022-12-20 at 23.41.05.png

ICを交換した後にチャージポンプ回路の電圧を測定すると、既定値の −3.2V が出力される VNEG 端子に −1.4V と異様に低い電圧が観測された。 この端子に接続されている部品はコンデンサ2個で、ここに何らかの問題が潜んでいる可能性が示唆される。

そこで発覚したのは「負電源端子 VNEG に接続した平滑コンデンサの極性を間違える」という、これまた程度の低いミスだった。 コンデンサの交換後にようやく DAC1 からの出力を確認することが出来た。



ドロケーの録音は音質が悪いのだが、映像ではモノラル・アウトと Mixed の Rch をパワード・スピーカー(単体)の入力でミックスした音声をモニターしている。 音声出力の端末は 3ch out が仕様なので、Mixed 2ch に加えて Op3+OSC3 の音声を抵抗を使って1chにミックスしなければならない。。

その他の変更点として、DIstortion回路=オペアンプのバイアス電圧をグランドに落す機構のスイッチ経由でグランドと接続している100kの抵抗値を47kに下げる調整を行っているが、これでもまだ歪み度が足りない感触があるので、抵抗値を20k程度まで落とすことを考えている。

追記:

周波数カウンタのリザルトに対して行う bitShift の設定は「シャックリ現象」との兼ね合いで、使用感を確かめながら最適値を擦り合わせていくことになる。

Screen Shot 2022-12-21 at 15.16.50.png

Screen Shot 2022-12-21 at 15.23.09.png

追記2:

Distortion回路=BIAS電圧の切替によって、出力にポップノイズが出てしまうのは回路の「仕様」だが、やはりこれが気になってしまうのが人情で、動作速度が速過ぎてノイズが発生するMAXIMのアナログスイッチICを、スイッチングスピードに時定数の設定でが可能な P−Channel FET を使ったディスクリート回路に換装することにした。

Screen Shot 2022-12-22 at 0.35.09.png

アナログスイッチICはレベルシフタを兼ねていたため、新たにレベル変換用のゲートICを追加する必要があるが、74/1Gシリーズのフットプリントは意外と嵩張って仕舞う。 実装にはそこそこ苦労しそうだと思っていたのだが、端子の配列が素直なためか想像していた程の手間は掛からなかった。

Screen Shot 2022-12-22 at 2.46.55.png

追記3:

試行錯誤が続いているが、FVCのリザルトに掛けるウエイトは暫定でこんな感じになった。

Screen Shot 2022-12-22 at 13.25.41.png

一方、アナログオシレータが安定して動作する領域を精査したところ、その閾値はデータ読みで200カウント辺りに存在することが判っている。

Screen Shot 2022-12-22 at 13.25.54.png
posted by Yasuski at 14:04| LaVoixski

2022年12月10日

2022年12月07日

ESP32-S3がArduinoIDEから認識されない問題について

ESP32/S3の導入を試みたところ、LEDチカさえ行えない状況で3日間スタックしていた。

まず、BoardManager から最新のファイルが導入できない問題が発生したが、Webで紹介されている参照先の大半が何故か無効で、ここに紹介されていた

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json

リンク先が正解だった。

Screen Shot 2022-12-08 at 0.10.22.png

初期設定を保存した後にBoardManagerを立ち上げてファイルの更新を行うと、Ver. を 2.0.5 まで上げることが可能になり、

Screen Shot 2022-12-08 at 0.11.05.png

旧いVer.では表示されなかった ESP32_S3 がボードの選択肢に上がってくる。

Screen Shot 2022-12-08 at 0.11.37.png

次に持ち上がった問題は python の互換性で、OSX にはデフォルトの状態で python2.X がインストールされている。 ArduinoIDE を使用するには、これを python3.X にアップデートすることが前提となる。

Screen Shot 2022-12-07 at 0.15.26.png

まず、下準備として、未インストールの python3 と pyserial のインストールを行わなければならない。

python3 のインストーラをダウンロード/インストールした後、Terminalで

pip3 install serial
pip3 install pyserial

とコマンドを打込んで、pyserialをインストールする。
 
次に python3 のアップデートを実行し、Terminal に which python3 とコマンドを打って python3 の所在を把握しておく。

一方、Arduinoの初期設定フォルダのリンクから、packages→ESP32→hardware→ESP32→2.0.5→tools フォルダ内(plathome.txt はこの場所にある)を辿り esptool.py の編集をエディタで行う。 

先頭に記述された #!/usr/bin/env python を #!/usr/local/bin/python3 に書換えて保存した後、ファイルのコピーを行い packages→ESP32→tools→esptool_py→4.2.1 フォルダ内にペーストする。

Screen Shot 2022-12-07 at 0.05.32.png

残念ながらこのままではIDEがリンク先を見失ってしまうので、

Screen Shot 2022-12-07 at 0.36.29.png

書き込みを成功させるには、Arduinoの設定ファイル、plathome.txt に記述されている、

tools.gen_esp32part.cmd=python3 "{runtime.platform.path}/tools/gen_esp32part.py"

書き換えを行わなければならない

具体的には、plathome.txt ファイル内の記述 tools.gen_esp32part.cmd= 以下に、既にterminalで確保しているpython3のリンクを貼り付ける一方、ファイル内に記述された”python”を、全て”python3"に書き換えて保存する。

Screen Shot 2022-12-07 at 22.20.19.png

IDEに「ファイルの実行権限に問題がある」旨を指摘された場合は、Terminalでファイルへのアクセス権を確保しなければならない。

以上、必要とされる手続きを調べるのに丸々1日が必要だった。

Screen Shot 2022-12-07 at 22.24.14.png

Screen Shot 2022-12-07 at 22.24.18.png

尚、D13にLEDが実装されていない ESP32_S3 には example の Blink スケッチが対応しておらず、

Screen Shot 2022-12-07 at 22.45.59.png

動作を検証するには RGB_LED の駆動を行うスケッチを書き込む必要がある。

posted by Yasuski at 23:54| LaVoixski

2022年12月06日

LaVoixski@DMAMEMに配置したバッファからLCDの波形表示を行う

TransitionMode下で、出力波形が左手の動きにつれて変化する模様を記録した。



今回は、EXTMEMに設定していたLCDのメモリ・バッファをDMAMEMに変更している。

Screen Shot 2022-12-06 at 1.25.28.png

バッファは、LRCKのタイミングで波形データを蓄積し、、、

Screen Shot 2022-12-06 at 1.58.51.png

Screen Shot 2022-12-06 at 1.58.33.png

Main Loop 内に配置した波形表示のサブルーチンで読み出される。

Screen Shot 2022-12-06 at 2.00.22.png

Screen Shot 2022-12-06 at 2.00.33.png

DMAMEMはPSRAMを読み出すEXTRAMよりもスピードが速く、波形の安定した表示に貢献している。

追記:

DistiortionMode選択時の不審なLEDの動きを修正しつつ、正確なタイミングで点滅表示を行う目的で、LED点灯サブルーチンとLRCKの同期を行った。

Screen Shot 2022-12-07 at 16.15.44.png

ついでに、気になっていたLCDの上下表示エリアのチラツキを、データ更新の頻度を上げることで解消している。
posted by Yasuski at 01:27| LaVoixski