2025年03月01日

LaVoixski@Delay系プログラムのリファインを考える

Deepseek に Python で記述されたコードを Arduino の作法に変換してもらった。

Screen Shot 2025-02-27 at 0.17.37.png

コードの導入を行う前準備として、Delay 系を x2、Modulator 系を x 8まで OverSampling が行えるように Looper にリザーヴしていた EXTMEM を 0x1affff から 0x17ffff まで減らしたが、実用上問題はなさそうだ。 

Screen Shot 2025-03-01 at 2.16.44.png

メモリの配分を変更する作業の過程でメモリの初期化を失敗しているのを発見し、適正な形に修正している。

Screen Shot 2025-03-01 at 2.16.07.png

LFOの波形生成に関しては、Wavetable方式からコード生成に転換するかもしれない。 

Screen Shot 2025-02-27 at 0.17.50.png

OverSampling や Lagrange Interpolation の次数を設定出来るようにしたが、問題は計算時間が間に合うかどうか。

Screen Shot 2025-03-01 at 3.18.48.png

C++ とは微妙に作法が違うのが Arduino のいやらしいところで、AI に添削を投げて手間を省くのが狙いなのだが、次は Arduino から HAL の二度手間感が強い STM32 系列のコーディングやライブラリの変換を依頼してみよう。
posted by Yasuski at 21:58| LaVoixski

LaVoixski@取り込み時間の精度を上げたLooperのテストを行う。



Arpeggiatorのクロックを参照して割出した録音時間に25msを足して大凡の辻褄を合わせた。

Screen Shot 2025-02-28 at 23.10.44.png

Pitch をロックした状態で、Looper の再生スピードを変更している。

posted by Yasuski at 13:57| LaVoixski

2025年02月17日

FPGA基板の組み立てを行う

久々にピギーバックな FPGA 基板を組んだところ、TCXO の取り付けミスに起因する端子の短絡に悩まされることになった。

IMG_0272.JPG

短絡が発生した箇所は GND / OscOut 側のランドで、故障が疑われた TCXO を引っ剥がす際に破損したプリントパターンをジャンパ栓で補修している。黄色は VCC、オレンジ色は 27MHz のクロックラインを繋いだ。

IMG_0273.JPG

TCXO の手実装は難易度が高く、失敗すると最悪の場合「電源の短絡」といった重篤なトラブルを誘発することに注意しなければならない。

隣接する VCC のランド TCXO の OscOut のランドがハンダブリッジによって短絡する症状は明らかに自分の設計ミスなので、より確実に部品の取り付けが行える方法、例えば中古のオーブンやアイロンを転用したリフロー方式を試すのが正解だろう。

IMG_0270.JPG

電源ラインの補修を確認するために抵抗値を測定してみたが、FPGA の電源供給は細いプリント配線よりもジャンパの手配線で行うのが電源効率の点で有利なことが判った。 4 層基盤が扱えない場合は、手間が掛かってもこのような手当で対処するのも一つの考え方だ。

追記:

改修した基盤に無事 Firmware を書き込めた。

VirtualBox_WIN10_17_02_2025_21_32_42.png

これで、adc → mcu1 → bus → mcu2 → dac の構成で、FPGA を使った高速シリアルオーディオストリームの実験を行う準備が整った。

Screen Shot 2025-02-13 at 17.56.16.png
posted by Yasuski at 16:06| FPGA

2025年02月16日

XO2に新しいファームウエアの書き込みを行う。

Teensy4.1 のリセット端子にアクセスするために空けた穴が原因で断線が疑われた FPGA 基盤の該当する JTAG ポート / デバイス間の抵抗値を測ると 40mΩ と微妙な数値が出た。 当初はそのままの状態で書き込みを行おうとしたものの、書き込み後のヴェリファイを失敗してしまう。

IMG_0269.JPG

残念ながら半断線状態が確定したので、ジャンパ線で健全な導通を確保した後にファームウエアの書き換えを行った。

VirtualBox_WIN10_15_02_2025_16_30_44.png

MCU に FPGA をビギーバックする過程で、MCU 基盤トップ側の Pin #41 (reset 端子) を立て忘れていた個体を発見、追加で Pin を実装している。

一方、KuwaidanSwitchMatrix を構成していた Xlinx 製の CPLD を Lattice/XO2 に移植する準備を行っている。

VirtualBox_WIN10_14_02_2025_20_32_49.png

既に論理合成を完了していて、外部に設定していたクロックジェネレータの内装を考えている。 Pin のフィッティングが未了だが、

VirtualBox_WIN10_14_02_2025_20_33_01.png

配列を再設定する過程で不具合が出てくるかもしれない。 

別のアプローチとして、I2C 接続で MCU にポートを増やす手法を考えている。 MCU + I2C デバイスの構成は、FPGA を使うよりも回路の規模をよりシンプルに纏められる。
posted by Yasuski at 00:57| FPGA

2025年02月08日

adc/dacHandlerの製作

adcHandler の設計を始めている。

全体の構成をまとめる目的でノート上にブロック・ダイアグラム描く過程で、2 線+チャンネル分の CS といった構成で高速通信を行う仕掛けを思い付いた。

IMG_20250209_121341807.jpg

端子のスリム化を目指すために INH+chAddress といった構成で回路を組むことを思いつき、ベクターを使ってセレクタを記述しようとしたものの、VHDL の文法を完全に忘れてしまった。 

記憶を掘り返すために書庫からトラ技スペシャルを発掘して基本的な文法の確認を行ったが、20 年前の資料は流石に古臭い感が強く、実際 VHDL の仕様は 2008 年頃に改訂されているらしい。

例えば、reduce_or といったファンクションが追加されていたので、これを使った Wired OR を暫定的に組んでみたが、実験の結果はネガティブで、残念ながら Lattice の IDE にはこのファンクションが実装されていないことが判明、旧来のオーソドックスな手法で設計を行うことになった。

まず、以前は 32bit 構成のシフトレジスタを制御するクロック・ライン毎に分散させていた ChipSelect を一箇所に集約するためのセレクタを記述した。

Screen Shot 2025-02-06 at 12.21.24.png

賢いオプティマイザがリソースの消費を抑える形で最適化を行っていると思われるが、今回行う試みは CS ラインの合理化で、従来は 8 本だったそれが4本に収まる。 一方、MCU 側ではアドレッシングに要するステップが加算されるので、処理能力的には若干の劣化が見込まれる。

adcHandlerは、入出力の構造が dacHandler とは逆の構成になる。 出力最終段をまとめる WiredOR を模した素子に行った、orIn(0) といった端子の指定法に自信がなかったが、受け入れられたようだ。

Screen Shot 2025-02-06 at 19.59.50.png

新たに組み上げた adcHandler の全体構成はこのようになった。

Screen Shot 2025-02-08 at 12.28.34.png

adc から出力されるデータを捌くために、内部の信号ラインを増設している。

Screen Shot 2025-02-09 at 13.10.14.png

データラインのやり取りを統括する LRCK の信号ラインは従来のスタイルを踏襲している。

Screen Shot 2025-02-09 at 12.06.33.png

同様に、SCK の取り回しも従来と変化がないが、何れの場合にも極性のミスマッチが出てくるかもしれない。

Screen Shot 2025-02-09 at 12.06.13.png

リセット回路に関しては、終段手前の D-FF を配線から取り除いている。

Screen Shot 2025-02-09 at 12.05.51.png

今回使用を想定している 24bit 精度の ADC から LSB のデータをマスクするために出力される FSYNC の入力端子を 4 本追加した。

Screen Shot 2025-02-09 at 12.05.27.png

終段手前の D-FF のリセットは、CS 端子から "L" が入力されるタイミングで行う。

Screen Shot 2025-02-09 at 12.04.51.png

D-FF のクロックラインは Inverter によって反転されている。

Screen Shot 2025-02-09 at 12.02.20.png

ピンの配列はこのようにまとめた。

Screen Shot 2025-02-10 at 19.01.23.png

Screen Shot 2025-02-10 at 19.08.22.png

赤いマークで示されるエラーのアラートが認められるが、直後にリカヴァーが行われているので問題はないだろう。 処理速度のボトルネックも許容範囲に収まっているようだ。

Screen Shot 2025-02-10 at 19.07.46.png

Screen Shot 2025-02-08 at 17.42.15.png

蓄積したデータを放出するタイミングがシビアな故に実験で不具合を見つけなければならないのだが、旧dacHandler で出ていた「重篤な遅延が発生する旨の警告」は確認されていない。

シフトレジスタ周りのクロックラインを整理したついでに、dacHandler のアップデートを行うことにした。

Screen Shot 2025-02-08 at 17.15.51.png

旧 dacHandler のピン配置は D/CLK/CS*8 がフルチャンネルの構成だった。新しい設計で消費される端子は、D/CLK/addr0~2/C の計6本とほぼ半減する。

Screen Shot 2025-02-11 at 0.07.23.png

現在楽器に実装している DA 出力は4ch で、この場合 MCU 側に必要とされる出力端子は D/CLK/CS*4 の6本が D/CLK/addr0~1/CS の5本に減少する。

Screen Shot 2025-02-08 at 17.27.41.png

こちらもスピードは確保できているようで、、、

Screen Shot 2025-02-08 at 17.37.37.png

重篤な制限はほぼ掛かっていない模様。

追記(0211_25):

順次処理領域の構成を修正することで、

Screen Shot 2025-02-12 at 22.06.22.png

データラインの遅延を抑えつつ所々で発生していたエラーをほぼリカヴァー出来るかもしれない。

Screen Shot 2025-02-12 at 22.42.20.png

AnalysisReport のエラーレポートは以下の通り。

Screen Shot 2025-02-13 at 1.42.35.png

高速動作が求められる信号ラインに発生したエラーが解消されているようだ。

Place&RouteTraceのエラーレポート。

Screen Shot 2025-02-13 at 1.43.04.png

MCK を分周した 2 ラインを除いて、エラーに対応が行われているようだ。

Screen Shot 2025-02-13 at 1.38.52.png

クロックラインのボトルネックは 245MHz と、状況は好転している。

Screen Shot 2025-02-13 at 1.41.14.png

posted by Yasuski at 22:07| FPGA

2025年01月31日

SolenoidBell@SMFplayerのGUIを変更した



選択したファイルが赤字で表示されるようになった。

IMG_20250131_225700266.jpg

この手法は、I2C等の入力を表示する場合に応用できるかもしれない。

Screen Shot 2025-01-31 at 23.04.34.png
posted by Yasuski at 18:34| SolenoidBell

2025年01月27日

SolenoidBell@SdFatを導入する

USB_HOST とのコンフリクトが確定している SD.h の代わりに SdFat.h を導入する作業を行った。

今回行ったライブラリのリプレイスによって、以前は不可能だった起動時に microSD 上に配置された JpegFile の描画を行うことが可能になった。

Screen Shot 2025-01-27 at 13.35.05.png

SdFat の採用に合わせて SMF を読み出すためのライブラリを最新のものに更新しつつ、プログラムに小変更を行った。 例えば、String で纏めて Filename をピックアップしていたのを、char アレイに文字を記録する方式に変更している。

Screen Shot 2025-01-27 at 17.12.33.png

今回は、getName() メソッドを学習した。 これはファイル名を文字配列 (fileName) に格納するために使用する方法で、配列のサイズは2番目の引数として渡され、名前が割り当てられたスペースに収まるようになっている。

AI の、使い慣れないライブラリに纏わる未知のリソースを引っ張って来る能力が素晴らしい。 トラブルシューティングの過程で「類型的な不具合」に関する知見が深まることは、依頼者側にとっての大きな利益となる。

ただし、ハードウエアの挙動に関してはこれまた別の次元の問題で、案の定システムクロックの設定が速過ぎたのが原因で LCD に JpegFile を描画することが出来なかった。 クロックを 800MHz 台に落とすことで問題を解決出来たが、これから所々の微調整が必要になるかもしれない。

映像では、SdFat ライブラリを使用して、microSD から SMF を読み出している。SD.h 使用時に Tempo を変更する場合に感じていたリズムのヨレが改善されている。



メモリに余裕があるので機能を追加で実装するハードルは低いのだが、問題となってくるのはステーブルな動作が保証されるかどうかで、この辺りの経験値の低さを実験でカヴァーしていく必要がある。

追記:

SMF player の表示系とファイル再生系の構造をリファインした。

残念ながら、総 STEP 数の自動取得は上手く機能しておらず、現状はファイルを再生した結果確定した Beat の総数を FlashMemory に書き込む形をとっている。

一方、表示系の変更に関しては、Kill_LCD の選択時に表示する内容を Beat カウントのみに限定した。

Screen Shot 2025-01-29 at 7.57.36.png

UpperEncoder にアクセスする毎に、SMF から設定値を読み出す仕掛けを組んだ。

Screen Shot 2025-01-29 at 7.59.10.png

より簡易にリモートを行うために、SMF の再生・停止コードをサブルーチンに組み替えている。

Screen Shot 2025-01-29 at 7.59.54.png

microSD から高速でデータを拾えるようになった結果、処理時間に余裕が出来たので、SMF player の UI を視認性を上げる方向に作り変えている。

IMG_20250129_160527863.jpg

MidiNoteNumber と SequenceStep の表示を切り替える機能を追加した。

IMG_20250129_160544393.jpg

MidiNoteNumber を表示するモード。

IMG_20250129_160607035.jpg

「ピアノロール」風に MidiNoteNumber を表示するモード。

IMG_20250129_160616114.jpg

システム立ち上げ後の待機画面で、ピックアップされたSMFを選択する。

IMG_20250129_160634776.jpg

ソレノイドの配置パターンを選択するモード。

IMG_20250129_160646607.jpg

UpperKnob で選択した全ての操作モードに於いて、直感的に Song Position が認識できるように GUI のデザインを変更している。
posted by Yasuski at 17:05| SolenoidBell

2025年01月25日

LaVoixski@SdFatの導入とJPEGDECのマッチングを行う

この時点で SdFat の実装を完了しているのだが、RAM1 の残量が 30k 超えと、メモリ消費の効率が劇的に改善された。 行った修正は、後述するステップ 1〜5 までで、その段階では JPEG ファイルの読み出しを行うことが出来なかった。

microSD の通信速度が速過ぎたのか、当初は読出し・書き込み時にエラーが頻発していた。 delay(); エレメントの挿入をエラー対策の一環として行っているが、いまのところ不具合の発生は確認されていない。

Screen Shot 2025-01-24 at 13.28.38.png

今回は、GFX for Arduino の ExampleCode、 JPEG image viewer example を参考に、コードを組み直していく。

Screen Shot 2025-01-25 at 12.59.51.png

SD.h から SdFat.h に乗り換える手順として、以下のステップを踏んでいく。

1)まず、SdFat.h をインクルードする。 

#include 〈SdFat.h〉

2)次に、SdFat オブジェクトと、ファイルを扱う SdFile オブジェクトの宣言を行う。

SdFat sd;
SdFile sdFile;

3)microSD のマウント先を指定する。 

MCU に Teensy4.1 を選択した場合、BUILTIN_SDCARD の指定が前提となる。
ただし、SD.h では自動認識されていたそれが、SdFat では ”10” を指定しなければならない。  

4)また、if (!SD.begin(chipSelect)) { return; } と記述していたイニシャライズは、

#define SD_CONFIG SdioConfig(FIFO_SDIO) / if (!sd.begin(SD_CONFIG)) { return; }

のように書換える必要がある。SD_CONFIG による接続はデータラインが複線化されているために、シングルラインの SD.h よりも高速な転送速度が保証される。

if (!sd.begin(chipSelect, SPI_HALF_SPEED)) { return;} と記述した場合には何故かファイルが読み出されない点に注意すること。

5)コマンドの仕様が異なる SdFat に対応し、SD.open() を sd.open() に書換える。

以上は main 上に行う変更だが、次のフェイズとしてファイル処理関数の修正を行う。

6)SdFat はファイル処理に異なる API を使用しているため、JpegFunc.h 上の関数、

jpegOpenFile、jpegCloseFile、jpegReadFile、jpegSeekFile

を SdFile で動作するように変更する必要がある。

Screen Shot 2025-01-25 at 14.15.59.png

7)この時点で発生したエラー('JPEGDRAW' was not declared in this scope)は、JPEGDRAW 型がコンパイラに認識されていないことを示しているが、この型は JPEGDEC ライブラリで定義されている。 対策として、JPEGDEC ライブラリをインクルードすればよい。

8)次に発生した "FILE_READ と FILE_WRITE が再定義されている" という警告は、SdFat ライブラリの定義を一貫して使用することで解決する。 SdFat の使用時には、Teensy コアに存在するFS.hファイルのインクルードを避けなければならない。 対策として、JPEGDEC.h 上に記述された FS.h のインクルードを削除またはコメントアウトする。

Screen Shot 2025-01-25 at 14.16.16.png
Teensyduino にはハードウェアに最適化された専用のライブラリが内装されているが、ライブラリのアップデート時に該当する部分がリプレイスされることは無く、その結果としてライブラリが並立した状態からコンフリクトが発生する可能性が AI から示唆されている。

Screen Shot 2025-01-25 at 14.17.36.png

'SD' was not declared in this scope は、SD オブジェクトがスケッチで定義されていないために発生するエラーで、その原因は JpegFunc.h の jpegOpenFile 関数にある。 SD.open() の呼び出しを SdFat の仕様に置き換えることで対応することができた。

Screen Shot 2025-01-25 at 14.19.47.png
最適化された ファームウエアをアップロードしたシステムの運用を 8H 程継続しているが、現時点で不具合の発生は認められない。


追記:

SD_CONFIG を指定すると、Teensy4.1 に実装された micorSDslot と 4 ラインでデータのやり取りを行うことができる。

Screen Shot 2025-01-26 at 0.17.34.png

今回行ったコードの改変により、RAM1 の消費量が何故か 1K 近く改善されている。

JPEGDEC は最新のヴァージョンを使うことが出来た。

Screen Shot 2025-01-26 at 1.03.53.png

GFX は、これ以降のヴァージョンから仕様が大きく変更されたようで、互換性が確保されていない。

Screen Shot 2025-01-26 at 1.05.03.png

どうやら Teensyduino には独特のクセがあって、パッケージに内包されるライブラリを外部から直接更新することが出来ないようだ。

競合が指摘された SdFat を Library フォルダから取り除いた場合に、ArduinoIDE から SdFat が認識されなくなることが判明している。

Screen Shot 2025-01-26 at 1.07.20.png

実際のところは Teensyduino 上に最適化されたオリジナルのライブラリが格納されていて、そのヴァージョンは 2.1.2 だった。

Screen Shot 2025-01-26 at 1.14.28.png

何にせよ、カスタマイズされた SdFat ライブラリは優先されるべきで、安易にアップデートを行うのは愚策なのかもしれない。
posted by Yasuski at 14:25| LaVoixski

2025年01月23日

LaVoixski@SdFatの導入について

Deepseekに徹夜で質問を投げ続けた結果、朧気ながら出口が見えてきた感があるが、根本的な問題の解決には至らず、実用化までの道は遠い。

問題は、正攻法ではSDカードのマウントを試みる時点でスタックしてしまうことで、後述する裏技的な方法でマウントを行えるものの、書き込み時の精度に問題があり、その実用性には疑問が残る。

ただ、不安定ながらもその処理速度は凄まじく、音声の読み出し等の限定的な用途では現状でも使用出来る可能性がある。

Screen Shot 2025-01-22 at 23.22.44.png

評価を行ったコードはこのサイトに掲載されていたもので、

Screen Shot 2025-01-23 at 4.00.12.png

限定された環境では正常に動作が行われているように見えるが、ベリファイを通せるかは微妙なレベルのクオリティと思われる。

Screen Shot 2025-01-23 at 4.00.44.png

参照したコードでは、#define SD_CONFIG SdioConfig(FIFO_SDIO) でFIFOを実装しているが、書き込みの精度に問題があるようだ。 

SdFat的には、#define SPI_CLOCK SD_SCK_MHZ(16) // Set SPI clock speed to 16 MHz のように、SPIの速度設定を行う方法 if (!sd.begin(SD_CS_PIN, SPI_CLOCK)) { ~ が推奨されるようだが、これがどうやってもSDカードを認識させることができない。

また、SdFat には、BUILTIN_SDCARD が実装されておらず、ユーザー側で以下に示すような設定

const uint8_t SD_CS_PIN = BUILTIN_SDCARD; // Use for Teensy's onboard SD card

を行わなければならない。

残念ながら、JPEGの描画機能は実行に至らず、IDEやライブラリのヴァージョン管理を伴った対応が必要となるだろう。

追記:

SdFat導入の続報。

microSDからのデータ転送ラインを複線で行うSD_CONFIGを指定すると、速過ぎるデータ転送レートの影響でエラーが続出する不具合が発生、その対策としてdelayエレメントをデータ読出しサブルーチン毎に挿入した結果、microSDへのデータWrite/Read時に発生していたエラーを抑え込めている。 

暫くの間は運用試験を行って不具合の発生を検証していくが、書き込みが不安定な場合は、open/close毎にdelayエレメントを挿入することになるだろう。

驚異的なのはRAM1の消費を劇的に抑え込めたことで、SDライブラリ使用時に残量4K弱だったのが、SdFatでは30k+に激増している。

Screen Shot 2025-01-24 at 13.28.38.png

ちなみに、現時点ではBitmapデータの表示はメモリ不足で行えず、Jpegの変換機能も正常に動作させることが叶っていない。

楽器の機能に直接影響しない「LCDに画像を表示する機能」は割愛する可能性が高いが、表示系の実装は引き続き単独でトライしていく。
posted by Yasuski at 04:15| LaVoixski

2025年01月21日