2018年11月08日

Ports

original.jpg

schematic36.png

LaVoixskiHammond80mm1025_18.png

LaVoixskiHammondMCU100mm1025_18.png

#define LEDorg 44 // LED on D44 Switching the "Orange" LED
#define LEDorg_ON (CORE_PIN44_PORTSET = (1<<22))
#define LEDorg_OFF (CORE_PIN44_PORTCLEAR = (1<<22))

#define LED2org 45 // LED on D45 Switching the "Orange" LED
#define LED2org_ON (CORE_PIN45_PORTSET = (1<<23))
#define LED2org_OFF (CORE_PIN45_PORTCLEAR = (1<<23))

#define LEDlav 48 // Switching the "Purple" LED
#define LEDlav_ON (CORE_PIN48_PORTSET = (1<<9))
#define LEDlav_OFF (CORE_PIN48_PORTCLEAR = (1<<9))

#define LED2lav 49 // Switching the "Purple" LED
#define LED2lav_ON (CORE_PIN49_PORTSET = (1<<4))
#define LED2lav_OFF (CORE_PIN49_PORTCLEAR = (1<<4))


#define LEDvol 28 // LED on D28 Switching the "LED in Eyeball"
#define LEDvol_ON (CORE_PIN28_PORTSET = (1<<16))
#define LEDvol_OFF (CORE_PIN28_PORTCLEAR = (1<<16))

#define LEDvol2 13 // Switching the BIAS
#define LEDvol2_ON (CORE_PIN13_PORTSET = (1<<5))
#define LEDvol2_OFF (CORE_PIN13_PORTCLEAR = (1<<5))

#define LEDvol3 2 // Switching the Audio Levels
#define LEDvol3_ON (CORE_PIN2_PORTSET = (1<<0))
#define LEDvol3_OFF (CORE_PIN2_PORTCLEAR = (1<<0))

#define LED0 0 // Switching the Sequence Start Indicator
#define LED0_ON (CORE_PIN0_PORTSET = (16<<0))
#define LED0_OFF (CORE_PIN0_PORTCLEAR = (16<<0))

#define CS01 29
#define CS01_ON (CORE_PIN29_PORTSET = (1<<18))
#define CS01_OFF (CORE_PIN29_PORTCLEAR = (1<<18))

#define LDAC01 33
#define LDAC01_ON (CORE_PIN33_PORTSET = (1<<24))
#define LDAC01_OFF (CORE_PIN33_PORTCLEAR = (1<<24))

#define CS02 31
#define CS02_ON (CORE_PIN31_PORTSET = (1<<10))
#define CS02_OFF (CORE_PIN31_PORTCLEAR = (1<<10))

#define LDAC02 14
#define LDAC02_ON (CORE_PIN14_PORTSET = (1<<1))
#define LDAC02_OFF (CORE_PIN14_PORTCLEAR = (1<<1))

#define CS03 47
#define CS03_ON (CORE_PIN47_PORTSET = (1<<8))
#define CS03_OFF (CORE_PIN47_PORTCLEAR = (1<<8))

#define LDAC03 46
#define LDAC03_ON (CORE_PIN46_PORTSET = (1<<21))
#define LDAC03_OFF (CORE_PIN46_PORTCLEAR = (1<<21))

#define CS04 15
#define CS04_ON (CORE_PIN15_PORTSET = (1<<0))
#define CS04_OFF (CORE_PIN15_PORTCLEAR = (1<<0))

#define LDAC04 16
#define LDAC04_ON (CORE_PIN16_PORTSET = (1<<0))
#define LDAC04_OFF (CORE_PIN16_PORTCLEAR = (1<<0))

#define CS05 20
#define CS05_ON (CORE_PIN20_PORTSET = (1<<5))
#define CS05_OFF (CORE_PIN20_PORTCLEAR = (1<<5))

#define LDAC05 21
#define LDAC05_ON (CORE_PIN21_PORTSET = (1<<6))
#define LDAC05_OFF (CORE_PIN21_PORTCLEAR = (1<<6))


#define SCK01 30
#define SCK01_ON (CORE_PIN30_PORTSET = (1<<19))
#define SCK01_OFF (CORE_PIN30_PORTCLEAR = (1<<19))

#define SD01 32
#define SD01_ON (CORE_PIN32_PORTSET = (1<<11))
#define SD01_OFF (CORE_PIN32_PORTCLEAR = (1<<11))

//////////////////////////////////////////////////////////////////////////

reading = digitalReadFast(4); // Sequencer Start/Stop switch

if (reading == HIGH && previous == LOW && millis() - time2 > debounce) {
if(state4 == HIGH)
state4 = LOW;
else
state4 = HIGH;
time2 = millis();
}

digitalWriteFast(0, !state4); // Sequence Start/Stop indicator out
previous = reading;

////////////////////////////////////////////////////////////////////////////////

if(addr1a == 11 || addr1a == 13 || addr1a == 17 || addr1a == 21 || addr1a == 22 || addr1a == 25 || addr1a == 27 || addr1a == 28 || addr1a == 29){
LEDvol3_OFF;
}
else{
LEDvol3_ON;
}; //Driving MAX4603 SW01/03/04 level control

if(addr1a == 15 || addr1a == 30 || addr1a == 31){
LEDvol2_OFF;
}
else{
LEDvol2_ON;
}; //Driving MAX4603 SW02 bias control
// || addr1a == 32 pending

////////////////////////////////////////////////////////////////////////////

if((state==0) && (button_State3 == LOW)) // Check if cal switch (eye ball shape) is released
{
state=1;
timer=0;
}

/////////////////////////////////////////////////////////////////////////////

if ((vol_vd > 4)&&(vol_vd < 2048)) {LEDvol_ON;} else {LEDvol_OFF;} // LED (in the eye ball) "ON" if value in range
posted by Yasuski at 21:06| AudioElectronics

2018年08月26日

ディストーション回路とレベルシフター回路についてのまとめ

全出力のステレオ化に対応するため、テルミンの歪み系音源のバイアスを調整するスイッチ、及びアッテネーターの設定を変更した。 この機会に備忘録を兼ねて、オーディオ回路終段に追加したスイッチ周りの回路を解説する。

現状は、D2がディストーション系信号経路のレベルシフトを、D13が通常回路のレベルシフトと、ディストーション回路のバイアスシフトを同時に行う仕様で、

WS001430.JPG

ディストーション回路で行うバイアスシフトは、バイアスポイントをグランド電位まで下げることで下半分の波形をクリップする機能を持つ(*注1)。 

vlcsnap-2018-06-19-18h23m38s648.png

要するにこれはディストーションをオンにするスイッチと思えば良い。(*注2) 

バイアス電圧を変更できるディストーション回路は、全体の音質が過度に歪みっぽくなるのを避けるためにメイン出力2系統のうち1系統に限定されている。 オーヴァーロードモードで波形を加算した場合はD/Aを行う前の段階でソフトなディストーションが発生している。

通常レベルの信号を出力する側にオーヴァーロードモードの信号を分配した場合、レベルが過大になって出力のバランスが崩れてしまう。 これを回避する為に使用するアッテネーターがD2によってコントロールされている。

今回行ったスイッチング項目の追加はあくまでも暫定的な処置で、実のところは全アドレスのステレオ化に伴って細かな齟齬が出てきている。 レベルとパンニングの状態に関しては、今一度測定器を使用して精査を行う必要がある。

注1: これは基板製作時のポカミスで、アッテネーターの受けにしていたバッファーアンプのバイアス抵抗をグランド電位に接続していたことに端を発する機能で、エキサイターのハーフウエーブクリッピング機能に近い。バイアス電圧に接続を修正したら好みの音質から外れてしまった。

注2: 波形を見て判るように、グランド電位でバッサリと切られてしまういささか乱暴な仕様なので、回路にダイオードクリッパーを追加してソフトニーを与えられないか検討している。

ダイオードクリッパーの効果を見極めるために、LTspiceでシミュレーションを実行した。 

WS001437.JPG

バイアス電圧は1/2VCC固定。オペアンプの非反転入力端子から抵抗を介したダイオードクリッパーをグランド電位に接続している。 シミュレーション開始後にバイアスポイントが0V側にドリフトしていく過程が良く判る。

シミュレーションの結果を出力した音声の記録。


diodeClipper from yasuski.



映像はクリッピングポイントを可変抵抗で制御する過程を画像化したもの。 実際に入力される信号は波形が複雑なので、効果は更に大きくなる。

この回路は抵抗値を調整してクリッピングポイントを移動できるので、出音の調整をより微妙に行える点が良い。

diodeClipperSch.png

ちなみに、基板の改造は結構手間が掛かるので、次のロット分の改変を行っておいた。

DiodeClipper.png

diodeClipper02.png

diodeClipper03.png

posted by Yasuski at 07:03| AudioElectronics

2018年08月20日

ID-292版のピギーバック化について

ID-292版AddOnBoardのデザインを完了した。

LaVoixAddOnNew.png

対応するロングピンを見つけるのに手間がかかったが、20pin+4pinの組み合わせが最適だった。

基板のシェイプを非対称にしているのは、ピギーバック時のコネクタとのクリアランスを考慮したため。

ボードは、Box形状なpinの使用が前提となるため、既に丸ピンを使って製作した基板にスタックすることは出来ない。 また、MCU側もBox pinを装着した個体のみの対応となるので、今後基板をスタックする場所のコネクタには丸ピンを使えないことになる。

ID-292系は基盤のサイズに制限があるが、ピギーバック化である程度は機能の拡張に対応できる。 この場合、親基板上にはオーディオクロックやADAT系のチップが乗っかるだけで、AddOn側にDACやMCU、Oscillatorの主な機能が移行する。 つまり、Hammond版と似たような構成になるのだが、肝心のオーディオ系をMCUと分離しきれないところに限界がある。 抜本的な改良を行うには親基板側の改装が必要だが、要求される仕様によって実装するパーツを選ぶ場合は、現状の設計がベストだろう。

Oscillatorに関しては、ピギーバック化によってButtler/Colpittsの何れかのタイプを選択できる構成になっているが、片方ずつの機能を選択することで、オシレーター系統の完全な分離を行うことが出来る。 Buttler系に関しては、フロントパネル側に回路を分散させることもできるので、ローカル側でも更なる隔離が可能な仕様となった。

各セクションへの電源の供給に関しては、ノイズキャンセル用のLを各要所に配置してあるので、実装済の回路をアイソレートしたい場合はこれらを取り除くだけで良い。

実際のところ部品の「全部載せ」はなく、事前にある程度機能を絞って部品の配置を行うことになるだろう。つまり、AddOnとはいっても最初から機能の拡張を考慮した状況で、親基板共々取捨選択を行いながらシステムを構築していくスタイルに落ち着くと予想している。

旧式の親基板の使用に関しては、オシレーターとオーディオ系の機能を停止することを前提にした場合、adatを使用しない場合は2代目青基板から、adatを含めた場合はRev4.04の初代緑基板まで遡って転用が可能となる。 問題となるのはオシレーターの選択だが、AddOn基板のColpitts型の使用が推奨される。セカンド・オピニオンとしてトップパネル側のButtler型に機能を分散させる方式が採られることになるだろう。

追記:

基板の2階建てを行う場合、クリアランスを考えて特にMCUを装着するアドオン側の基板にロープロファイルなソケットを使いたいのだが、在庫を漁っていて発見したラッピングタイプのソケットが最適なことを発見した。 ロングピンタイプのソケットを既に発注してしまったのは少し早まった感があるが、ラッピングタイプのソケットはレアなのか結構な値が付いてしまっている。 ロングピンにはMCUのデバッグ端子という使い途があるので、在庫を抱えても問題はないのだが、ラッピングピンの在庫を消化した後はロングピンに移行することになるだろう。 

追記2:

ラッピング・ピンの在庫を大量に発見した、、、。 これも貰い物だったが、在庫管理が適当すぎてイカンなあ。

posted by Yasuski at 17:38| AudioElectronics

テルミン開発に関する方針の転換について

現在行っているデジタルテルミンの開発に関して諸々方針の転換を行いつつあるが、ここで考えをまとめるために記録を行っておく。

まず、基盤のサイズについて。 これは、ID-292という面白いシェイプのケースに収めることを前提にしていること、フリー版Eagleのサイズ制限内に基板のサイズを収めること、この二点により支配されていた。 サイズの制限に関してはKiCad等に乗り換えることでクリアできるが、ID-292は自作テルミンのいわばアイデンティティーのようなものなので、これはおいそれと諦める気にはなれない。

IMG_8153.JPG

が、ここにきて不安定なオシレーターの問題が浮上、現在改良を行うべくシミュレーションを繰り返しているが、設計に課せられるサイズの制限は大きなマイナス要因として働くことになった。 ID-292はシェイプが美しく実装の実績もあるのでこれを捨てる気にはなれないが、これをメインとして考えるのは少々無理に思えてきた。 実際、基板の実装密度も2層ではほぼ限界に近く、これ以上密度を上げることは困難な状態だ。

幸い、試作に使用したHamnmondのケースはデザインもよくサービス性に優れていて、代替のケースとして申し分のない素材であった。 

MFG_1455N2201RD.jpg

特に、試験専用筐体として開発した個体にはバックパネルを装備していて、これによって以前の閉鎖的な開発環境では到底考えられなかった試みを手軽に行えるようになった。

IMG_7906.JPG

このケースは、内側に基板をスロット状に挿入できる構造で、その幅は丁度100mmとEagleの制限下で基盤をデザインするにはうってつけの仕様である。 基盤はスロットに複数枚を挿せるので、1枚に全てを実装する必然はなくなり、クロストークが危惧されるオシレーターやオーディオ的にノイズ源から分離すべき機能を別基盤にまとめることが可能になる。

ということで、現在50×100mmのサイズにMCU/Oscillator/Audioの各セクションを分離して実装する作業を行っている。 まず、MCU基盤についての基本仕様を説明すると、UIとの絡みから旧来の配置を維持しつつ、オーディオやオシレーターの機能を分離している。 

LaVoixskiHammondVer1.0.png

未だ動くかどうかわからないadat系の機能はこの基盤に残してあるが、専有面積はそれほどではなく不要であればチップを実装しなければよい。 adatの機能を実用化出来た場合も、不要なDACを搭載せずにコストを圧縮できる。 MCUからはピンアウトを可能なかぎり引き出して、新たな機能の拡張にも対応できるようにしている。

AudioBoardのDACには、転送速度が速くNOPの回数を極限まで減らしても動作する実績を買ってMAX5717を採用する。

LaVoixskiAudioBoard.png

タスク処理のボトルネックが発生する原因の一つにDACとの通信に専有される時間の影響があるため、使用するDACは可能な限り高速でハンドリングの手法が単純なものを選択する。 DACの分解能と速度はトレードオフの関係にあるが、MAX5717はそのバランスに優れた製品といえる。 ボードにはこのチップを4個実装する。

AudioBoardにはこの他、出力バッファー&ディストーション回路が搭載されているが、こちらも4回路分を用意した。 ただ、楽器の運用に関しては基本がステレオを1まとめとして考えているので、追加分の2chはサブチャンネル扱いとなるため、ステレオ版とは違った作法で信号を扱えるようにスイッチ回路に差別化を行っている。

最後にOscillatorBoardだが、これは試作版として2種類の基板を用意した。 

1枚目はバトラー型発振器で構成された2回路ペアを1枚の基盤にまとめたもので、PitchとVolumeは別基盤に完全に分離される。 

OSC1board.png>

もう一つはコルピッツ型発振器2ペア4回路を1枚の基板にまとめたもので、こちらはコンプリメンタリ・トランジスタを使ったICを使用するために発振回路の完全な分離を行わずボード一枚に機能を集約している。

OSC2board.png

で、話は全く変わってしまうが、いかにも借り物で長ったらしいOpenThereminOnTeensyからそろそろ楽器にまともな名称を付けたいのだが、今のところ思い付いているのはLaVoixskiというこれまた発音し難そうなもの。 
本当に定着出来るのかどうか甚だ怪しいが、暫くはこの名称を使っていこう。
posted by Yasuski at 03:52| AudioElectronics

2018年08月08日

OpenThereminOnTeensy@オペマニュアル最新版

そろそろ仕様が固まった感があるので、何度目か忘れたがオペレーション・マニュアルっぽい映像を作った。



今回は、CSSV等の説明がややこしくなるポイントを端折っているので、出来ればOverViewと項目毎にまとめた映像を製作する必要がある。
posted by Yasuski at 20:55| AudioElectronics

2018年07月27日

LEMOの8pコネクターをアンプに取り付ける

数年ぶりに行うライヴ演奏からのフィードバック。 

IMG_8294.JPG

なかなかやる気が出なかったのを思い切ったのが運の尽きで、丸一日がこの作業に費やされることになった。

IMG_8279.JPG

嵩張るスピコンを排除するために、フォン端子を使ったスピーカーケーブルをアンプに増設しようとしたが、丁度よいサイズの取り付け穴を開けられず、作業が長引いてしまった。 スピコン端子には2ch分の信号線を仕込んでいるので、サテライトスピーカーを一個プラスする情況ではこちらを使用する。

IMG_8283.JPG

製作するスピーカー用のケーブルは10m。スピコンのケーブルは6m程だったので、長さが足りずに現場で微妙な状況に陥ることが多かったが、これでキャパの広い場所でもある程度は対応できるはず。

作業の過程で電源が短絡するトラブルが発生したが、原因はなんとebayで購入したLEMO製の8pケーブルそのものにあった。

IMG_8288.JPG

よく見るとなんだか変な構成のケーブル=所謂変態仕様なブツだったことが判明。

IMG_8289.JPG

その内実は、単線×3本とシールド線2組、それとグランドラインで合計8端子という、なんだかよく解らない構成の代物。

IMG_8290.JPG

このシールド線のグランドが短絡の原因だった。

IMG_8291.JPG

代わりに在庫していたジャンクの12芯シールドを使ってコネクターを改造した。

IMG_8292.JPG

パワーアンプ系の配線など大電流が流れるラインには2芯を撚ってそれに充てている。

LEMOのデザインはNeutrikとはまた違った雰囲気を持つ。

IMG_8275.JPG

サテライト化した4chデジタル・パワーアンプ&#1chスピーカーユニット。

IMG_8270.JPG

オーディオ的には、滅茶苦茶な設計である。

IMG_8267.JPG

これは本体っぽく見える電源部。

IMG_8285.JPG

日付が変わる前に、なんとか音を出す事ができた。

IMG_8286.JPG
posted by Yasuski at 02:56| AudioElectronics

2018年07月25日

Open.Theremin@アルペジエーターにオン・オフスイッチを追加する

やはりこれがあるのと無いのとでは使い勝手に雲泥の差があった。

パターン読み込み後にアルペジエーターをオフった場合はその和音構成のままフリーズするので、テキストベースで編集できる和音のチャンネルと思ってもよいだろう。
posted by Yasuski at 13:52| AudioElectronics

2018年07月21日

Open.Theremin@実験用筐体にモメンタリスイッチとデジタルスイッチを増設する

昨日のアップデートからSequencerが不調で何をやっても修正が行えない。 理由が判らず原因を探っていたところ、ファイル書き換え時にファイル名を微妙に間違えていたという凡ミスが発覚した。 これを探るのに小一時間は掛けていたのは暑さの所為だと思いたい。

で、Sequencerの動作をコントロールするのに良さ気なインターフェイスはないものかと調査していたところ、ボタンスイッチの便利なスケッチを発見。これはトリプルクリックと長押しに対応しているので、スイッチひとつで結構なタスクをこなせそうだ。

ということで、コードに機能を実装する前準備として、ハードウエア=現物の取り付けを行った。

IMG_8257.JPG

完成している楽器に横孔を2箇所空けるのは結構勇気要るのだが、完全にバラすのもアレなのでチタン板の装甲板を挿入して作業を行った。 

今回取り付けるパーツは、白色LEDの照光付きモメンタリ・スイッチと、4bitのデジタルスイッチ。デジタルスイッチは、サンプリングレートの変更等ハードウエア側の設定を直接行うために使用する。

途中、ドリルが噛んで楽器がぶん回される事故が起こったが、何とか無事作業を終えることが出来た。

IMG_8255.JPG

問題は、デジタルスイッチに取り付けるノブだが、カラー付きのライテルが現在欠品中なのがツライ。で、ジャンクを漁っていたら、一寸大きめだがシェイプが綺麗な地雷探知機のモード切替スイッチについていた面白い形のノブを発見し、コレを取り付けることにした。

IMG_8256.JPG

取り付けたパーツの端子はテフロン線で引き出して、とりあえずバックパネルに新設した中継ソケットに接続している。

IMG_8259.JPG

次は、コード側に機能を実装する番である。
posted by Yasuski at 17:11| AudioElectronics

2018年07月20日

Open.Theremin@左手に拠るSequencerの制御を考える

音量をオフっている期間が一定時間を過ぎるとSequencerのstepカウンターがリセットされる機能を思い付き、これを追加した。

スイッチの代わりに、音量がゼロの状態をトリガーにする仕掛けだが、スタートスイッチとして一瞬は働いたものの、長押し(音量ゼロの)を判定するタイマーのリセットが、カウント一巡で再トリガーが掛かる事案を解消できず、構想は失敗に終わった。

やはり、単純なスイッチを増設するのが正道だと思うが、もう少し構造を検討してみようと思う。

で、こちらも左手関連の技術で、テンポを変える機能を考えた。

これは、ある閾値を超えた時に左手のValueをStapRateに換算し、テンポを送らせていく機能だが、左手のセンシングのレンジが異様に狭いことが発覚。これによりVolumeAntennaをセンシングしたデータの処理に関する根本的な問題が発覚してしまい、本来の機能を実装する以前のレベルで修正を行うことになった。

と、紆余曲折があったものの、なんとか実装を完了することが出来た。

WS001382.JPG

実際の運用方法は簡単で、左手をアンテナからある程度の距離に離すと、テンポが徐々に緩くなるリタルダンドの機能が実現する。 自動演奏のテンポを意図的に揺らすことが可能になったのは割と大きな進歩かもしれない。
posted by Yasuski at 17:35| AudioElectronics

Open.Theremin@Sequencerのデータ入力にCS#V規格を新設する

CSVならぬ、C#SVなる珍妙な規格を思いつく。

これは、2biteの処理がややこし過ぎて自分の実力では導入が難しく、だったらカンマの代わりに#で音階を区切ることで、半音高い表現をする目論見。

要は、”n” とか ” p " などの音楽系としては使い慣れない文字を可能な限り排除したいだけ。

実際の使い方は、休符を入れて、

@,c,c#d,d#e,f,f#g,g#a,a#b,c

といった記述になる。 

'、'の代わりに '#'を検知すると、sharpのフラグを立てて、条件分岐を行う仕掛けで、とりあえずはまともに動作している。

WS001381.JPG

オクターヴ上は大文字のCに、その上は、nnっぽく数字の0から9と o,p,q (A#からCまでに該当させる)を使うことにする。

結局はこの規格もなんかややこしそうだが、概念的には「普通」に近いので、慣れればなんとかなるかもしれない。
posted by Yasuski at 08:46| AudioElectronics

2018年07月17日

Open.Theremin@CSVファイルのインポートを可能にする

CSV形式で記述された波形データを外部から取り込めるように、SDカードからのデータ読み出しルーティンに細工を行った。



テストベンチでの動作は確認できているが、楽器上での運用試験は未了。
posted by Yasuski at 19:40| AudioElectronics

2018年07月15日

SDカードにデータをハンドリングする

早朝ギニアからのアフリカンポップを聴きながら始めたコーディングは途中の小休止(居眠り)を挟んで、ようやくSDカードとのデータのやり取りのメソッドが確立しつつある。

SDカードのデータ型はcharなので、MCUとデータのやり取りを行う際に「翻訳」が必要になるが、一度に1biteずつしかデータを読み出せないところが大変に不便な仕様である。

WS001367.JPG

で、これを解消するためにはcharのArrayを組んで、そこに文字列を読み込ませたものを数値に変換するのだが、

WS001368.JPG

このメソッドを探すのに5時間ほど掛かってしまった。

日本語のサイトは殆どアテにはならず、最終的にTeensyのコミュニティーの記事に頼ることになったが、SDカードを使用する場合はその殆どがデータロガーシステムや映像系等だったことから、求める情報にたどり着くまでに時間がかかってしまった。

もちろん、英語の語彙の問題もあるわけだが、何故か日本語で検索しても埒が明かないという、結構ツライ体験をしたのだった。 やはり、嫌でも英語の理解は重要ということか。

画像は、立ち上げからSDカードのマウントを行った後、パラメーター群の初期値を読み込んで、Arpeggiatorのループが開始される模様。 

WS001363.JPG

後半に記録されているArpeggiatorのステップの変移は、読み込んだSequenceのステップ数がそのまま反映されている。

WS001364.JPG

昨日はこの「立ち上げ」に至らず往生したのだが、これは単にハードウエア単位の設定を間違えていたという凡ミスだった。

WS001366.JPG

作業が遠回りになった原因は、SDへのアクセスがままならない時期に予め実験でダブルクオートで変数を囲う形で変換のシミュレーションを行っていたことで、これを文字列を扱えるように改変する過程で思考が硬直してしまい、無駄な時間を過ごすことになった。

その後、シーケンサーの辻褄が合わないところを修正した。 

WS001369.JPG

何故かstep数が過大にカウントされていたが、3個多いという法則性があったので、問題なし。 

WS001365.JPG

これで、適当にフレーズを書き込んでも、勝手にステップを合わせてくれるようになった。

このまま上手く行けば、EEPROMを使わずに外部記録装置に設定を保存できるようになるわけだが、波形の記録から、ゆくゆくはバックトラック音源の再生など、さらなる機能拡張の可能性を確保できたのは大変有意義なことだと思う。

これから、各パラメーターの項目を地味に書き連ねていく作業に入るつもりだが、この気温の所為でそろそろ脳が沸騰してきた。
posted by Yasuski at 17:02| AudioElectronics

2018年07月14日

Open.Theremin@ピッチテーブルの扱いについて。

 @xx none
Char/1biteを#nnに対応させるテーブルを作った。
 cc 24nn 
 ics 25nn
左がSDカードに記述するノート、中央がスケッチ
 dd 26nn
上に抽象化された記号、右が実際の音程。
 jds 27nn
抽象化されている記号は実際には数値化されている。
 ee 28nn
例えば、c は0.25、cs は pitch1 * 0.25 と
 ff 29nn
なる。 pitch1 = 1.0600; で、これはcの半音
 kfs 30nn上の音程を意味している。
 gg 31nn 
 lgs 32nn 記述のメソッドは、スペースやカンマを用いずに
 aa 33nn 連続して行う。xxは休符。連続した音列は持続音
 mas 34nn となる。
 bb 35nn 
 CC 36nn 最終的には、数曲のシーケンスを格納して呼び出せる
 ICs 37nn ような仕掛けを実装する予定だ。
 DD 38nn 
 JDs 39nn 
 EE 40nn 
 F    F 41nn 
 KFs 42nn 
 GG 43nn 
 LGs 44nn 
 AA 45nn 
 MAs 46nn 
 BB 47nn 
 nC2 48nn 
 oCs2 49nn 
 pD2 50nn 
 qDs2 51nn 
 rE2 52nn 
 sF2 53nn 
 tFs2 54nn 
 uG2 55nn 
 vGs2 56nn 
 wAA2 57nn 
 xAs2 58nn 
 yB2 59nn 
 zC3 60nn 
posted by Yasuski at 13:19| AudioElectronics

SDカードにデータをトランスファーする方法(その3)

SDはキャラベースのファイル名でデータを管理するので、データをEEPROMに記録する場合に対応するアドレスをロータリーエンコーダーを回して順送りで呼び出していたようなことは出来そうにない。

混乱を避けるためファイルには関連するパラメーター群の数値を一気に記述せずに、対応するパラメーター毎にファイルを作る方法を考えている。 例えば、オシレーターのチューニングの場合、Memoryアドレスに対応する4つのパラメーターを別々に記録することになる。

つまり、記録を行う毎にファイル名を記述した条件分岐を設定する必要があるということで、これは結構な手間になる。

SDメモリー側には、予め対応するパラメーター分のファイル群を準備しなければならない。

パラメーターのアップデートに関しては、EEPROMで行っていた時よりも簡略化が出来るかもしれないが、何れにしても実験段階で記録装置の構造を詰めておかないと大混乱に至ってしまうだろう。

記述の煩雑さは、この例を見れば一目瞭然。

WS001360.JPG

検証用のシリアル通信が各所に挿入されているとはいえ、フォントサイズを4つ縮小しても、画面からはみ出してしまう。

WS001359.JPG
posted by Yasuski at 06:35| AudioElectronics

SDカードにデータをトランスファーする方法(その2)

単純に数値を変換するのであればあまり問題は無さそうだが、これをコード名などの抽象化されたものを扱う場合にどう処理すればよいのかが、イマイチ判然としない。 チューニング用のテーブルを作って、対応する数列をチョイスするような条件分岐を作り、それをシーケンス用のテーブルに登録することになるのだろうが、これは相当ややこしい。

作業の取っ掛かりとして、まずはチューニング表を作ることにしたが、5オクターヴもあれば十分だろうか。C4=60nnと同一の仕様にしたら概念が統一されて混乱が少なくなるだろう。 で、事前にあれこれ調べてみたが、Charを扱う場合は2biteになったとたんに処理がややこしくなるので、ASCIIキャラ1個につきnnを対応させるような独自表記で誤魔化したほうが良さそうだ。 データを1biteに抑えれば処理が簡単なので、無理くりではあるが独自規格の対応表を作ることにした。 一般的にはアプリ作って自動化するのが正解なのだろうが、いちいちIDEを開いて数列を撃ちこむよりは遥かに楽なので、アプリの製作には格別拘らなくても良さそうだ。

で、試しにラフな条件分岐を作って実験を行った。

WS001355.JPG

何故か理由は判らないが、Arrayの末尾に2つ空データを返していたので、その差分を引いて修正を行った結果がこれ。

WS001354.JPG

謎の空データが2つ追加されていた問題は、コピペ元が小数点のキャラクター分をアレイに追加していたのを失念していたこと、データを落としこむためにforで廻す際に、文字列の長さから1を引くのを忘れていたこと(1から16ではなく0から15になる)が原因と判明した。

WS001358.JPG

処理の違いを確かめるためにキャラクターを個別にダブルクオートで区切った場合と、

WS001356.JPG

羅列した文字列をダブルクオートでラップしたものを比較してみたが、同じ値が帰ってくるようだ。 ASCIIコードに準じてスペースやカンマは文字列として認識される。

WS001357.JPG

次のステップは、アドレスを読みだすシーケンサーを加えて、データをドライヴ出来るかどうか実験してみよう。 forを回している「n」が、そのままアルペジエーターやシーケンサーのstep数の設定に使える筈だ。
posted by Yasuski at 02:41| AudioElectronics

2018年07月13日

SDカードにデータをトランスファーする方法

microSDHC16GB class10 UHS-1の価格が1000円を切っていたので、これを評価用に購入した。

Teensy3.5/3.6にはmicroSDのソケットが標準装備されているので、これを使った実験を行いたい。 本当は1G程度でも十分すぎる位なのだが、最近は容量が小さくて速いものはまず商品化されていない。 SDカードの使用用途を考えると当然なのではあるのだが、、、。

SDカードのデータ型はキャラクターなので、数値を記録する場合はデータ型の変換が必要になってくる。

いろいろと調べてみたところ、まずSDカードにデータを送信する前準備の手段としてこのような記事を見つけた。

データを送る場合は、

dtostrf(write_var, 16, 14, outstr);

のように、データをWrapせねばならんようだ。

次に受けの方だが、Arduinoにはstring.toFloat()という便利なものがあるものの、これは下桁が丸められちゃうマヌケな仕様なので、別の方策を探すことになった。

で、見つけたのがこの方法で、

char inChar[inData.length() + 1]; //determine size of the array
inData.toCharArray(inChar, sizeof(inChar)); //put readStringinto an array
read_var = atof(inChar); //convert the array into a float

といった手段を取ることで、文字列のデータアレイから浮動小数点の結果を引き出している。

目的達成のための手段がはっきりしてきたので、ここからスケッチを書いていったのだが、 シリアル表示の関数 printIn は小数点以下2桁で丸めが行われてしまうために、浮動小数点を扱う動作の確認ができない。

その後、小数点以下がまともに表示されるprintfという関数を見つけたが、これの実装がどうやっても上手く出来ず、暫くの間悩まされることになった。 

折衷案として読みだしたデータを1000000000000000倍に拡大する手段を思い付いて、問題は解決した。

WS001352.JPG

が、、、若干の誤差が出るのが少々気持ち悪い。 果たして、これは「仕様」なのであろうか???

WS001351.JPG

SDカードはEEPROMのようなアドレス指定ではなく、ファイル名の指定でパラメーターを保持することになるのだろうか? 波形データ等大きめなファイルも格納できるので、ちゃんと仕組みを作ると相当便利になると思う一方で、データがぶっ飛ぶと全てが終わる。 その辺のリスクの重さは実際に運用してみないと判らないだろう。

データアレイは、sizeof( )を使うと自動でキャラクターの数を測って、文字列の長さが異なってもちゃんとデータを読み込んでくれる。これをシーケンサのステップ数の自動計測に応用できれば、パターンの作成がとても楽になると思う。

SDカードでデータの保持が行えるのであれば、ネット上に波形編集アプリ等の管理系サービスを展開するのが今風なのかもしれない、、、。
posted by Yasuski at 13:58| AudioElectronics

2018年07月08日

Open.Theremin@デバッグのまとめ

昨日の流れはデバッグ作業が中心だったのでその内容をまとめておく。

まず、記録不能だったアドレスを修正した。これは機能を削っていた部分を復活した際に、別の該当する部分のラインをコピペして、アドレスの修正を多なっていなかったために発生した不具合だった。

Screen Shot 2018-07-08 at 8.53.45.png

次に、用法上の問題で、ついオーヴァーレベルになってしまう波形編集のヴォリューム設定ノブのデータ出力を右シフトして、変化を鈍化させる手当を行った。これは、ロータリーエンコーダーのアクセラレーション機能が過剰に作用する弊害で、微調整が必要な項目には手当を行うべきということで、他のCHのパラメーターにも調整を行っておいた。

Screen Shot 2018-07-08 at 8.55.45.png

バックパネルに追加したMAX5541の接続が怪しいので、ハンダメッキなどの手当を行っておく。

実際に追加機能を利用した演奏方法を探っているが、やはり事前のプリセットが勝負どころというか、波形の選択が全てを決することが解りつつある。これは、プリセットを含めて全容を考え直す必要があるということだが、こればかりは、実際に運用を行った結果をフィードバックするしかない。

所謂楽器とガジェットの境目は、この用法の確立という点に掛かっていると自分は思っているので、機能の開発と同時に実践的な用法の発見を行うことを忘れないようにしていきたい。

追記:

ピッチデータのEEPROMの格納領域を拡大して、リアルタイム処理の負荷を軽減する事を目指した。

今いじっているプログラムは基本構造がTeensy3.2の仕様に準拠していて、限られたEEPROMの容量に合わせて記録するデータを圧縮していたが、その分リアルタイムの処理に負荷が掛かる構造だった。

Screen Shot 2018-07-08 at 8.51.41.png

Teensy3.6はEEPROMの格納領域が2倍もあるため、この処理に掛かるピッチ係数をEEPROMへの記録時に計算して登録してしまえば、その分リアルタイム処理負荷が軽減される筈。

ということで、データ幅をint16_tからfloat64_tに変更して記録を行うように、EEPROM関連のコードを書き換えた。

Screen Shot 2018-07-08 at 8.49.36.png

メモリーが足りなくなった後半部分ではセコく立ちまわっていたようだが、基本的には混乱を避けるために「足りないメモリー状況下であっても、余裕を持たせて大雑把にメモリーアサインを展開」していたことがラッキーだったようで、該当するメモリー領域の拡張はすんなりと行えた。

実験の結果、CodeMemoryMode選択時で感じていた処理の遅れによるザラザラ感が軽減された。
posted by Yasuski at 02:03| AudioElectronics

2018年06月24日

死亡したTeensyを復活させる方法

USBによる接続が不可能となったTeensyを復活させる方法を見つけたので備忘録を書いておく。

原因は定かではないが、一種のシャックリのようなものと思えば良いらしく、接続が絶たれただけでMCU自体は死亡していないようだ。

対処法はMAC系のプラットフォームを使用する場合が簡単なようだ。 まずはArduinoを起動して、なんでも良いからスケッチのコンパイルを行い、Teensyの書き込みソフトを起動する。 次に、故障したMCUのリセットボタンを押しながらUSB端子を接続すると、あら不思議、何故かデバイスの認識が行われ始める。

これで、死んだと思って放置していたTeensy3.5と3.6の2個ずつ、計4つのデバイスを復活できた。 ここで断捨離をやらかしていたらこの発見はなかったわけで、とにかくゴミと思われるものであってもある程度は保持する必要があるのだな、、、と痛感させられた次第。
posted by Yasuski at 01:07| AudioElectronics

2018年05月30日

TeensyでWDTを試す

WDTに関する記事を見つけたので、これを参考にしてクロックソースをテストベッドに組み込みたい。

https://bigdanzblog.wordpress.com/2017/10/27/watch-dog-timer-wdt-for-teensy-3-1-and-3-2/
posted by Yasuski at 05:58| AudioElectronics

2018年05月18日

Open.Theremin@新型基板の開発が頓挫中

新型テルミン開発の現状を箇条書きでまとめると、、、

1)アナログ部は概ね正常に動作している模様だが、D-FFによるディテクターの働きが正常かどうかはオリジナルの回路を実際に測定して確認する必要がある。

2)オーディオクロックの発振は正常に行われているが、MCUの動作を検証するシリアルモニターによる検証方法が、MCUに入力するクロックソースが別電源なために実行できないという問題がある。

3)起動時に音声が出力されない。テルミン以前の純粋な音声再生ルーティンが機能していない。

4)キャリブレーションモードへの移行を判定するモードスイッチは正常に動作している模様。

5)ただし、モードの移行をスイッチの押し時間で判定するタイマーがオーディオクロックによってドライヴされているため、ソフトウエア開発時の検証が出来ない。

6)実際に電源を投入して運用を行った状況ではロータリーエンコーダーの切り替えが出来ておらず、DACの出力電圧が変化しない。

7)オシレーターがチューン不能なため、ピッチ判定機能の検証が行えない。

8)手動でオシレーターをチューンした場合も、Volume側のLEDドライヴ(音声出力を判定している)が行えていないことが判る。音声が出力されない問題も絡んでくるのがポイントで、チューンの状態を確認できない。

9)電源とUSB通信端子の併用は、MCUの破壊をもたらす。

以上、判明している不具合をまとめてみたが、稼働までの道程は遠そうだ。

追記:


MCU2個目が死亡。

もう呪われているとしか思えないが、どうも通信の途中にUSBケーブルを引っこ抜いて死亡させるという愚を犯していた気がする。

毎度、書き込み時の情況はモニターしていた筈なのだが、偶に通信が遅延してそれを認識せずにやらかしていた感あり。

で、モードの切り替えだが、LEDの表示のみが働いていたようで、モードの切り替えを確認するLEDマーカーを追加しても反応しないことから、理由は判らないがなんらかの機能不全が発生している模様。

基本的には稼動状態だった旧システムからコードを移植しているだけなんだが、何故不具合が発生しているのか全く見当がつかない。
posted by Yasuski at 17:15| AudioElectronics