2018年12月26日

ArpeggiatorをEnvelopeGenerator風に使用するアイデア

音声出力のエンヴェロープをアルペジエーターを使ってパルス制御風に駆動するモードを思い付いた。

その仕組みは単純で、microSDに登録した等倍=C2・無音=0のピッチ情報を用いて主旋律にピッチを連動させたアルペジエーターを駆動するだけなので、実装それ自体は簡単に済みそうだ。

インターフェイスは、アルペジエーターをオン・オフする閾値の制御用に追加した空きチャンネルを選択した時にEGを起動すればよいのだが、閾値/EGのモードを切り替えるためのスイッチを増設する必要がある。

さらにお手軽な手法として、アルペジエーターのピッチ情報を固定したデータをパターン選択ルーティンの後方に貼り付ける選択肢もある。 この場合は、既存のノート情報のアサインを変更するだけで済む。 

WS001531.JPG

現状、アルペジエーターは実質的に15ch程余っているのだが、これらは制御不能紙一重な仕様故にアドレスを数CH程潰したとしても楽器の運用に支障は生じないだろう。

WS001530.JPG

とりあえず、ノート情報をストアするための関数、inNotes を27番まで増す。

WS001528.JPG

リードカウンタの n は既にリザーブ済。 n の容量は32ステップもあれば十分だろう。 記録用のCHは最低でも4つは欲しいので、TEXTファイルの読み出し機構をあと2つ追加する必要あり。(遊んでいる2chを既に実装している) 

WS001529.JPG

出音の制御は、Pitch情報を真ん中の 等倍="0"・無音="x" に限定して、addValue に掛け算すればOK。

テルミンは明確なアタックを伴った発音が苦手なので、アルペジエーター系の発音一発目はタイミングが合わせ難いものの、この手のエフェクトを使用することで表現のヴァリエーションを増やすことができる。

posted by Yasuski at 08:02| LaVoixski

2018年12月25日

microSD関連のバグについて

microSDにデータを格納する際に発生するストアミスの原因は、データを転送するために準備したバッファーの桁不足にありそうだ。

Webで似たような症例を検索してみた結果、このような記事を発見した

ということで、とりあえず不足していた1文字分*を増やしてみた。

WS001527.JPG

データをアップロードする前のリザルトはこれ。 本来は1桁な筈の arptn_d の数値が2桁あるのがおかしい。

Screen Shot 2018-12-25 at 5.00.52.png

修正したファームウエアを書き込んだ後に、メモリにデータをストアしてシステムを再起動した結果がこちら。

Screen Shot 2018-12-25 at 5.00.52.png

arptn_d の値には設定域内の適正値 "3" が記録されている。

まだ、他のチャンネルでデータをストアした場合に不具合が再発生する可能性が残っているが、ひとまず修正は成功したといえるだろう。

*その後、16桁では不足かもしれないことに気付き、17文字に変更している。
posted by Yasuski at 05:16| LaVoixski

パラメーターの再設定時に発生したバグについて

SEQUENCER を駆動するクロックを分周した影響で遅くなったテンポの再設定を行おうとしたところ、入力を受け付けず調整不能に陥ってしまうバグが発生した。

原因を解明するのに少々手間取ったが、Metroに設定していたクロックの発生周期の最小単位を80msから20msに書き換えることで、実用域までクロックのタイミングを修正することが出来た。

WS001523.JPG

今後は実用レベルで瑕疵が発生しそうなので、出来ることならライヴに楽器を持ち込んで試験的な運用を行いたいところ。
posted by Yasuski at 01:03| LaVoixski

2018年12月24日

Metroのクロックレートを調整する

実用面から考えると無駄に速かったArpeggiatorのクロックに1/2分周を行った。

WS001524.JPG

ついでにSequencerにも同じ手当を行った結果、実用的なテンポを設定することが出来るようになった。

WS001526.JPG

要は、Metroがアクセプト出来るインターバルの制限が1000msなために発生していた不具合だが、分周によって最長1980msのインターバルでクロックをドライヴすることが可能となった。
posted by Yasuski at 18:07| LaVoixski

条件分岐処理の合理化を考える

アルペジエーター関連のタスクを積み上げ過ぎた結果、音質に悪影響が出てきた。 設定の処理を行うループ内にタスクが集中していることが原因と思われる。 今回追加したタスクの大半が条件分岐なので、この部分の処理速度を上げるのが手っ取り早い高速化のメソッドだろう。

処理の合理化をキーワードにしてWebの資料を漁った結果、if の代わりに switch を使うことで選択後の分岐処理をスキップ出来ることが解った。 

例えば、if()構文で条件分岐を行う場合、条件がヒットした後であってもタスクの終了後に残りの条件が総当りで参照されてしまい、この過程が処理の遅延に直結する。 記事で提案されていたのは switch/case で分岐を組む手法。 処理を行った後にbreakを行うことで、他の余分な条件をすっ飛ばして分岐のルーティンを終了するところが良い。

実際に行っていた処理の例では、アルペジエーターの再生パターンの選択やメモリーの管理をif()構文で行っているのだが、これが結構な量のステップを消費しているように見える。 そこで、この部分を switch による条件分岐に書き換えて、稼働試験を行った。

Screen Shot 2018-12-24 at 9.15.37.png

結果は発音に明らかな改善が見られたので、if()構文を可能な限りswitch/caseに書き換えることにした。

その他、発音機構のタスクを減らすために constrain で行っていたヴォリューム関連の出力制限をより単純な value && 0X0FFF によるマスキングに変更している。 弊害として、最小ヴォリュームから桁下がりで最大値に転換してしまう閾値周りの挙動が荒っぽくなるが、実用上は問題無さそうだったので、しばらくの間はこの仕様で様子を見ることにする。
posted by Yasuski at 10:12| LaVoixski

2018年12月23日

microSD関連のバグについて

microSDにデータを記録するタスクに、記録するチャンネルに対応する条件分岐を設定し直した。

以前から「対応するアドレス毎に」条件分岐を設定していたのだが、

WS001521.JPG

バグが発生する状態ではやたらと記録に時間が掛かる傾向があった。 電源投入後の立ち上げに掛かる時間とほぼ一緒なのが、何気に危ない。

以上の現象から想像するに、メモリーにデータを書き込みむ際に発動される条件分岐が無視されて、全てのデータが書き換えられているようだ。 これを阻止するために、さらに上位の篩分けとなる「mode2のチャンネル」によって分岐を行うことにしたのだが、、、。

WS001520.JPG

コンパイルが通ったので、後ほど実機で試験を行おう。

追記:

実験の結果、データのストアは正常に機能している模様。 ビープ音の再生も問題なく行われた。

ストアに要する時間が短縮されたことから、書き込み時の誤動作は解消したと解釈してもよいだろう。
posted by Yasuski at 08:57| LaVoixski

Arpeggiator#12にバグを発見する

再生を繰り返す過程でアルペジエータ12番の挙動が怪しいことが発覚、コードを精査したところローカルに配置した円環カウンタのクリア機構にアサイン・ミスを発見した。

WS001519.JPG

が、、、作業の甲斐無く、アルペジエーターのおかしな挙動は一向に改善しない。

これは「読み出したファイルの記述自体にミスがある」と考えてmicroSD にストアされたファイルの内容を確認したところ、本来は並んで記述してはいけないセパレーターの , (コンマ)と # (シャープ)がダブっていることを発見した。

不具合の原因はこれで決まりだが、面妖なのはソフトウェア側の該当する箇所の近辺に別のミスが潜んでいたことだ。

その他に確認されている怪しげな箇所としては、Sequencer内でアルペジエータの再生レートが設定不能になるバグがある。 ロータリーエンコーダーにアクセスする手順を間違うと、二度とパラメーターを変更することが出来なくなってしまう。

原因は、ロータリーエンコーダーの出力バッファーがMetroで組んだ回路と切り離されてしまうことだと思われるが、トリガーと連動してバッファーの値を取り込めるように、コードを改編する必要がある。

その後、該当する箇所にデータを読み込むためのコードを追加して問題は解決したが、microSDにデータを書き込むためのルーティンが何故か上手く動作しない。 いまのところ原因は不明だが、IDE自体のバグの可能性もあるので、しばらくの間は様子をみることにしよう。
posted by Yasuski at 00:14| LaVoixski

2018年12月22日

SequencerのTempoFlashのタイミングを調整する

Sequencerの音符の分解能を高めた場合にTempoFlashの間隔が速くなり過ぎて視認性が悪化する問題に対策を行った。

例えば、16部音符を最小分解能とした場合、全音符には16stepが費やされるが、この間にLEDがチカチカと8回も瞬くことになる。

この問題を解消するために、テンポの設定に合わせてFlashのクロックを分周することにした。 

まずは分周用のカウンタを構成する関数を設定し、、、

WS001517.JPG

次に、metroを駆動するパラメーターの値を条件分岐で振り分けて、個別に分周比の設定を行う。 

今回は、1/4、1/2、等倍の3種類を準備した。

Screen Shot 2018-12-22 at 10.05.30.png

分周比を振り分ける閾値の設定が心配だったが、稼働試験の結果は違和感のないものになった。 
posted by Yasuski at 10:25| LaVoixski

2018年12月21日

VolumeAntennaの出力にThresholdを設定してArpeggiatorの起動を行う仕掛け

デモ映像を収録している時に思い付いたのだが、アルペジエーターのオン・オフをVolumeAntでスイッチしたくなった。

スイッチの閾値をマニュアルで設定できれば、より豊かな表現が行えそうだ。 アルペジエーターを使用することで機械的になりがちな演奏の雰囲気を、マニュアルスイッチング機能によって和らげることが出来るのではないか。

まずは、スイッチを構成するために必要な関数を設定し、、、

WS001509.JPG

Arpeggiatorをアクティヴェイトするためのスイッチ用にトリガーを追加して、、、

WS001510.JPG

metroが起動する度に、フラッグを反転させるラインを記述する。

ひとまずThreshold設定が可能なスイッチ回路を構成してみた。



各モードでスイッチングを行っているが、クロックの表示があったほうが便利そうだ。

Sequencerはクロックのレートが異なるので、専用のフラッグを追加した。 

WS001511.JPG

短いシーケンスを再生する場合にレートが速くなり過ぎることを回避するために、スケールを900msから1800msに広げている。

WS001512.JPG

こちらは、Arpeggiator用のフラッグ。 やはり、全モードで表示を行ったほうが良いということで、RGBロータリーエンコーダーのLEDを駆動する回路を追加した。 

WS001513.JPG

実際に動作させると、こんな感じになる。



LEDの輝度にカメラの感度を調整出来なかったためにイマイチ点滅の雰囲気が判り辛いが、ArpeggiatorのPlaybackRateに合わせて行われるLEDの点滅は結構インパクトがある。

ちなみに、Sequencerは再生レートが違うので点滅回路を別建で用意した。 

Arpeggiatorを起動するThresholdのパラメーターは、RGBロータリーエンコーダーの上側最終アドレス(#9/無点灯=黒)にアサインしている。 何れの場合も、Arpeggiatorの起動時にクロックのタイミングでLEDが水色に点滅する。

WS001514.JPG

microSDの記録が正常に行われない問題はフィックスできていないが、とりあえずデータを書き込む際に使用していた条件分岐の関数を整理しておいた。

WS001515.JPG

トリガーのスレッショルド出力には、Volume表示用のLED出力とは別に独立させたものを準備している。

WS001516.JPG

閾値はゼロから設定が可能。ゼロ設定で実質的にスイッチが無効化する。 メモリー機能は必要性が不明なのでまだ実装を行っていない。

Sequencerのテンポが判るのは良いのだが、ステップの分解能(の設定)によっては点滅が速過ぎて視認性が低下するのが問題。 条件分岐を行って分周比を変更する等、表示を最適化する必要を感じている。
posted by Yasuski at 16:45| LaVoixski

アルペジエーターの機能を比較する

発音バンク別に設定したアルペジエーターの機能を紹介する映像。



2~5Voice、フリーにPitchをエディット出来るモード、Seqencialにアルペジエーターの設定を設定できるモードの6種類を切り替えている。
posted by Yasuski at 01:18| LaVoixski