awawa

@awawaInu

Thunderbolt 4まとめ

Thunderboltまとめ

概要

  • Antelope Discrete 8 Synergy CoreのThunderbolt2をWindowsで使いたかったが情報インターネットに少なすぎる
  • いろいろ試してWindowsにおけるThunderboltについて分かったことをまとめる

互換性について

インストール

BIOS設定

1000円コンデンサマイクの周波数特性

概要

semetemo.hatenablog.com

  • マイクの音質に個体差がある気がする...→ほんまか?
  • 手作りマイクを頑張って5本作って計測してみた。
    SMAP

どうやって測るか?

  • スピーカーから音を流してそれをマイクで録音
  • 録音された音をPCで分析
  • 特性がわかる!
    本当は1mくらい離して録るんだって

もう少し詳しく書くと

  • しかし、再生した元のオーディオファイルと、収音した音を比較するだけでは、計測結果に"スピーカーの特性"と"空間の特性"が乗ってきてしまう
    • オーディオファイル→スピーカー→空間→マイク
    • スピーカーと空間の影響をとりのぞきたい
  • 音質の基準となるreferenceマイクを用意して、同じセットアップで音をとる。録った音を手作りマイクと比較して特性を計測する。
    • 今回は手元にあったTascamボイスレコーダーDR-40をreferenceに使用
    • DR-40はカタログスペックで±2dBの範囲でフラットにとれることが保証されている
  • 本当はreferenceと手作りマイクは並べて同時にとらないといけない (気がする) けど今回は先にreferenceを1回とって、そのあとで手作りマイクを録っています
    各種条件

結果

まずは再生した信号に対する特性

続いて, DR-40に対する, 手作りマイクとEdge Soloの特性

拡大してみてネ~~~

  • 周波数特性のフラットさという観点では, Edge Soloと同等程度ではありそう. つまりまともな特性にはなっていそう
  • Edge soloの方が200Hz - 2kHzあたりが少し引っ込んでいて, 高周波数帯域で特性がピーキー。もしかしたらこういう特性の方が耳当たりのよい音声が録れるのかもしれない。
    • 4kHzあたりを切って8kHzあたりをブーストするのはまあまあ理にかなってる気がする

続いて手作りマイク個体差の分析

各マイクのパワーは正規化しています

  • 100Hz前後の応答がわりかしばらつく
    • 聴いた感じも低域が引っ込みがちなのと比較的そうじゃないのがいる. 筐体のつくりの問題だと思いますが規則性は不明...

筐体の作成工程で音質は変わるか?

  • 結論周波数特性には一貫した変化はなかった (グラフはなし)
    • 次の4工程の段階で計測
      • 基盤むき出し
      • 基盤むき出し + コンデンサマイクの裏をボンドで固定
      • 完成品 - メッシュ
      • 完成品
  • 信号とノイズの比率 (SNR) はメッシュをつけることで平均1.5dBくらい改善していた (そのためにメッシュつけてるしね)
  • ちなみにマイクに取れた音のパワーは、最小のものと最大のもので2.5dBほど差があった.

結論

  • もちろん聴かないと良し悪しはなんとも言えないですが、とりあえず周波数特性は実用に堪える程度にはフラットな模様
  • 個体差はそこそこあるっぽいので使うときには注意が必要
  • 筐体のつくりや回路の改善でより音質をよくするのが次のステップ

コンデンサマイクを1000円で作る

概要

  • 実家でシンクルームがしたい

syncroom.yamaha.com

  • 実家にはピアノしかない
  • マイクで収音してパソコンに取り込んでシンクルームをするぞ
  • マイクないから作るぞ

できたもの

  • 5個作って2個使えた (ザコ)
  • 音はこんな感じ
  • soundcloud.com

コンデンサマイクの自作

前回までの回路

  • これまでは次のような回路を作っていました
    • 手書き(きたない)
  • 実物はこんな感じ
    • カラフルでかわいい
  • しかし部品点数が多いしコンデンサの容量が大きくてデカがち
    • 写真のように回路をマイクとは別に用意して, 回路を中継してマイクをつなぐスタイル
  • マイクに回路を組み込みたい

今回の回路

  • Shinさんという方がブログにてとても良い回路を公開してくださっている、本当にありがとうございます
    • ameblo.jp
    • これがすべて, マイクに合わせて電源電圧は変えた
  • ECM電源は分圧して出す. 電流によって電圧値が多少変動するけど, 雑音源になるツェナーダイオードを使うよりも良いらしい
  • この回路を使うためには, コンデンサマイクの素子 (ちっちゃい) の回路 (とてもちっちゃい) を手作業で切る"Linkwidz mod"という改造を施す必要がある

コンデンサマイクの3線改造

  • 短絡されている(フレーム)グラウンドとマイナス端子をパターンカットすることで切り離す
  • 今回使ったEM-158については次のページにやり方を書いてくれている (優しい世界)
  • こんな感じ
    • 失敗
    • 成功の写真は撮り忘れました.
  • 彫刻刀の三角刀で少しずつ切ったらいけた. 普通のカッターとかアートナイフでは無理だった. 意外にそれほど深く切らなくても大丈夫.
  • もともとある2つの端子 (+と-) と, 切り離されたフレーム (GND) とを合わせて3端子のマイクとして扱う

材料費 800円

部品 型番 数量 販売個数 単価 小計 購入元 備考 リンク
コンデンサマイク EM158 1 1 250 250 秋月
MOSFET 2SK-2880D 2 1 40 80 秋月
フィルムコンデンサ 0.22uF 125MMBA224K 1 1 30 30 秋月 元の回路ではWIMA MKS-2 63V 0.22uF
片面紙エポキシ・ユニバーサル基板 AE-3 1 1 70 70 秋月 切って使う
XLRオス キャノンコネクタ NC3MXX NEUTRIK 1 1 300 300 サウンドハウス
メッシュ ゴミ箱から回収 光 PS20-323が使えるかも
抵抗 1M 1 10 10
抵抗 47k 2 10 20
抵抗 10k 2 10 20
抵抗 1.5k 1 10 10
790

回路

  • 左下と右上の小さい丸いのがコンデンサマイク
  • 直接XLRコネクタにくっつけた
  • XLRコネクタの1番とフレームを短絡する
    • マイクの筐体をグラウンドする
  • コンデンサマイクの周辺は低温はんだで接続

筐体

  • できた回路にコネクタをはめ込む
    • 左側はマイクケーブルを自作するときに使うXLRコネクタ (オス)
  • コネクタ x 2の筐体も作ってみたが音質がダメだった
    • 見た目はちょっとそれっぽいのにね
    • 筐体内の反響で音質が劣化しているっぽい
  • 金属のメッシュでマイクを覆う形に
    • 茶こしを切って曲げてくっつけた
  • 各部品はアロンアルファで固定, 部品同士は電気的に接触させる
    • 筐体もメッシュもグラウンドが取れてないとハムノイズが乗ってしまう

あとがき

  • 昼間しか弾けないので結局帰省中にはシンクルームできませんでした

追記

後日、周波数特性の計測をしました semetemo.hatenablog.com

  • さらに後日、この記事に書いた筐体では接触が悪いような挙動が見られました。
    • メッシュの内側、回路の周囲をフェルトで巻いてマイクの裏側がフェルトでおおわれるように改良したところ安定して動作するようになりました。
    • またこれにより聴感的に音のバランスが良くなり、音質が向上しました。音質は声を収録して確認しており、具体的には高周波のピーキーな感じが少し抑えられました。

VRで撮影した画像を実写に合成する

VRChatにはまってはや数か月、現実の鏡にアバターが映らず普通のおじさんが映ってしまうのがしんどくなってきました。 VRでの姿を現実につれてくるためにVRChatで撮影した画像を現実の画像に合成することを試してみました。

真の姿

ありがたいことにVRChatにはグリーンバックのワールドがあるので、そこで撮影をして背景を透過し、実写の画像に合成します。 やってみていろいろノウハウがたまったので書き留めておこうと思います。 合成には下記のgimpという非常に高機能なフリーの画像編集ソフトを使用しました。 www.gimp.org

素材の撮影

構図の決定

背景画像を撮影する。アバターを想定して人間入りでも撮っておくと、アバターをどの方向からどういう姿勢で撮影すればよいかわかる。 最終的な背景画像はアバターと合わせた後にもう一度いろいろ加味してもう一度撮影しました。

グリーンバックワールドでの撮影

グリーンバックのワールドでモデルと同じポーズの写真を撮影する。 vrchat.com

このとき

  • 注意
    • あとで解像度が足りなくなるので, できるだけ高解像で(接写で)撮影する
    • カメラの高さが実際に合うようにする
    • 二度手間にならないように少しずつアングル変えてたくさん撮る
    • 表情に注意

自動でグリーンを抜く

スクリプトを書きました。こちら。 github.com 荒い部分がでてしまうので、最終的には手動でやったほうがいいかも。 この記事に添付した画像は自動で抜いたものを使ったので若干荒いです。

透過前

透過後

gimpで読み込んで背景と画像を合わせてみる

実際にキャラクターのサイズを変更しつつ、背景画像に合わせてみます。 うまくいかなそうであれば、もう一度背景画像を撮影します。 最悪もう一度VRに入ってアバターの画像もとります。

最終的な背景画像の撮影

下記に注意

  • キャラクターと背景画像の物体のオクルージョンに注意する
    • キャラクターを椅子に座らせる場合, 椅子の足とのオクルージョン
  • カメラの平行が取れているのが良い画像に見える気がする, カメラ正面の水平な線が画面に平行か
  • 映り込みに注意
    • ディスプレイの表示とか、ゴミとか、なぞの布とか、脱ぎ散らかした服とか
  • 複数の遠近, 高さ, 角度で撮影しておいて、あとで撮影しなおしにならないようにする

画像の選定

背景画像を1枚、キャラクター画像を数枚選ぶ。自分は背景単体で見てよさそうなものを1つ決めたあと、その上に透過したキャラクター画像を合わせてみて、キャラクター画像を選んだ。

選んだ背景

合成

色見の調整などは戻せないので、レイヤを適宜複製してから編集するようにしていきます

キャラクター画像の手動での透過

自動での透過がうまくいっていなければgimpにて手動で丁寧に透過をする。 このとき周辺はほとんどぼかす必要はなく, かつグリーンができるだけ残らないようにする。 gimpでの透過の方法は検索するといろいろ出てきます。ちなみにgimpだったらグリーンバックじゃなくても透過できます。 https://gazocustomize.com/gimp-foreground-extraction-tool/

キャラクターのサイズ/位置合わせ

人間の大きさを参考にサイズを合わせる, 場合によっては縦横比も調整してかわいく見えるようにする。 合成するキャラクター画像が複数ある場合は、それらの間のサイズの整合をとる。 ここまでの作業は後戻りしたくないので、いったんここまでやって確定する

背景とキャラクターの色見の調整

背景とキャラクターの光の当たり方が違う場合, 色温度やレベルを調整して同じようなライティング環境っぽくする

キャラクターの輪郭のぼかし

キャラクターの輪郭にぼかしをいれて, いい感じに輪郭が混ざるようにする。 手順としては、ファジー選択で背景がわをクリックして背景の選択をし、その状態で境界をぼかすで境界がぼかして、ぼけた状態でdelするとキャラの輪郭がちょっとずつ半透明になる

キャラクターの輪郭線の描画

ファジー選択で背景がわをクリックすると背景が選択されるが, その状態で選択を反転させるとキャラが選択される。 キャラクターの輪郭に1pxの太さで線を入れる. 線が半透明で入ってくれていい感じになった

背景のぼかし

キャラクターの解像度にたいして背景の解像度が高いように見える場合は背景にガウスブラーを設定値1とかでちょっと入れる

背景のポスタリゼーション

背景をポスタリゼーションすると, アニメっぽくなってキャラとなじむかもしれない。 設定値を10くらいにしてパット見実写くらいの感じにする。印象だけちょっとアニメ感を出したい。

レイヤの統合

レイヤを複製してから、複製したもの同士を統合する。後戻りできないので

仕上げ

レベルを調整して全体的な色見を調整する。ホワイトバランスの自動調整をすることもできる。 最後に設定値0.5くらいでガウスブラーをかけるとちょっとなじむ気がする

真の姿

VRChatのアバターを音声で操作する

はじめに

VRChatはいわゆるソーシャルVRアプリのひとつで、平たく言えばみんなでVR空間で集まって、現実みたいにおしゃべりしたり、VRならではの楽しいことしようぜ、というものです。 私もあまりの楽しさに完全に入り浸っています。

さてそんなVRChatにおよそ1週間前に非常に大きなアップデートがあって話題になっていました。 hello.vrchat.com VRCがAvatar OSCという機能を追加したというものです。詳細は多く記事が出ていると思うのでそちらに譲りますが、何がすごいかというと "任意の入力" を使ってアバターを操作することができるようになりました(操作に使える情報の量や頻度には限りがありますが...)。

なんでも入力にできるので、部屋の温度をセンサで取得して気温に適した服装をアバターにさせたり、もっと実用的なところで言うと、これまで対応していなかったVR機器やiPhoneのフェイストラッキング機能を使って、ユーザーの表情をアバターの表情にマッピングしたりすることができるようになりました。 すでに多く同様の例が公表されてはいますが、私も音声認識でのアバター操作を実装したので、記事に残そうと思います。

何ができたか

音声認識をして、認識結果に応じてアバターの衣装の変更ができるようになりました。

実装について

実装は整理したのちに公開予定です。

GCPのCloud Speech-to-Text APIで認識

音声認識の中間出力を使ってレスポンスの向上

  • 上のデモを見ると音声を発してからアバターに反映されるまでのレスポンスがかなり良いことがわかると思います。これは音声認識の中間出力を使用しているためです。
    • 音声認識結果は中間出力と、発話区間の終端が確定した段階で出力される最終結果があります。
    • 終結果の方が認識は正解になりやすいものの、音声が終了したことが分かった後で最終的な結果が出力されるため、最終結果を待って判定をすると認識から動作までの遅延が大きくなります。中間出力は入力されたところまでの音声情報を使って多少先読み的に認識結果を出すので、うまく使うとレスポンスをよくできます。 -上記のデモの実装では、中間出力に対して単語とのマッチングを行い、一度マッチングした単語はそれ以降の中間出力とはマッチングしないような実装をしました。

参考

  • OSCのセットアップについては、下記の記事が非常にまとまっていてわかりやすいです。(友人のたかくんが、私が音声認識アバターに服を脱がせようと必死な裏で頑張って書いていた記事です。)

脈拍センサを使ってリアルタイムに心拍数を推定する

はじめに

操作しているゲームのキャラクターともっと心を通わせたい、そんな思いを実現するために操作者(私)の心拍数をPCに入力する装置を作りました。 私の心拍数が増えるとキャラクターの息が荒くなるということが現実のものになります。

センサで得た脈拍信号(心電図的なもの)から、PCで心拍数を得るところまでがこの記事の内容で、それをゲームに反映させる部分は別の記事にしたいと思います。 プログラムのこととかはQiitaに投稿してあります。qiita.com

今回は市販の脈拍センサ + マイコン (Arduino) + PC (python) の組み合わせで心拍数を推定しています。

やったこと

最初の手順は簡単です。まず脈拍センサを買いました。 www.amazon.co.jp こんなんです。

f:id:semetemo:20220226233007p:plain
これで心拍数をはかれる
センサの光る部分(写真は電源が入ってないので光ってません)に指を押し当てると、心電図"的な"ものをとることができます。

つづいて配線をして、センサをマイコン(今回はArduino UNO)につなぐと、マイコンがセンサと通信して、リアルタイムに脈波を取得できます。

f:id:semetemo:20220226233240p:plain
1回の波が1回の鼓動

このマイコンをPCとUSBでつなぐと、シリアル通信という方法で、データのやり取りをすることができます。これによりセンサの信号をPCにとりこんで、それを解析して心拍数を推定します。

f:id:semetemo:20220226233347p:plain
毎秒推定結果が表示されます

あとは心拍数を使ってアバターの表情を変えるなり動きを変えるなり好きにできます。 マイコンは今回はArduinoUnoというものを使っていますが、もっと安いProMiniの互換品とかでも動かせると思います。PCを除けば1,500円前後でいけそう。

筐体について

どうやってセンサを固定するか

脈拍センサは指などに光を照射して、光の戻り具合で脈拍を測っています。つまり、目に見えない微妙な明るさの変化をつかって脈拍を測っています。そのため、センサがちょっと動いたりすると値が大きく変動してしまって、正しく脈拍が取れなくなってしまいます。 ということで、いい感じにセンサを固定する必要があります。今回は手元にあったケーブルを束ねるマジックテープを使って指に巻けるようにしました。

f:id:semetemo:20220226233908p:plain
ありものでなんとかなった
ついでに大事な点として、センサの指に触れる部分にセロファンテープを貼っています。回路に直接指が触れるのでそれによりショートして値が飛ぶことがありました。

どこで測るのか

本来は指先か耳たぶで測ることが推奨されています。確かに指先と耳たぶが信号が強くて測りやすいですが、指先につけたらゲームができないし、耳たぶだとヘッドフォンの邪魔になりそうです。

またApple Watchのように腕で測ると、信号が比較的小さく短時間のデータに基づいたリアルタイムな心拍数の推定をしようとするとあまり正確に算出できませんでした。加えて意外に、センサをぴったり腕に固定するのは難しかったため、腕の動きによる値のブレの問題もありました。

首もためしてみましたが、心拍が大きくとれる一方、呼吸や発話の影響が大きく、しゃべらず静かに呼吸する前提でないと心拍数はうまく推定できませんでした。

f:id:semetemo:20220226234720j:plain
センサをベルトに縫い付けて首に巻いてみたけど精度はいまいちだった。
最終的に指先よりは若干信号は弱いものの、親指の第一関節と第二関節の間に固定することにしました。

Arduino側の実装

センサをArduinoに接続する必要があります。センサのVin, GND, SDA, SCL端子をそれぞれArduino UNOの5V, GND, A4, A5端子に接続します。 続いてセンサの値を読みこんでPCに取り込むプログラムを作成し、これをArduinoに書き込みます。 プログラムは、PC側の処理のプログラムも含めてgithubに配置しています。 github.com

PC側の実装

PC側にはArduinoで読み込んだ脈拍の信号が順次送られてきます。しかし生の信号の波形のままではコントローラーとして使いづらいので、ここから心拍数を推定します。

これは簡単そうに見えて一筋縄ではいかなかったです。ひとつに、脈拍の信号には計測したい信号以外のノイズが含まれているため、ノイズにできるだけまどわされずに脈を検出する必要があります。 もう一つに、脈は毎回毎回同じ強さなのではなく、1回1回異なる強度で、またセンサの配置などの条件によっても異なる強度で入ってきます。

このあたりを踏まえつつできるだけ正確に脈拍から心拍数を推定するアルゴリズムを作る必要がありました。アルゴリズムの工夫について詳しくはQiitaの方の記事にそのうち書こうと思います...

作成したプログラムはデフォルトで、1秒ごとに過去5秒のデータを使って心拍数を算出します。この条件で自分の指のデータに対してある程度正しく、リアルタイムに心拍数が推定できていそうでした。

息を止めると止めてすぐに心拍数が下がって、しばらくすると徐々に上がり、呼吸を再開した瞬間に一気に上がるみたいなかなり時間的に素早い変化も取れているようです。

早くこれでVRchatのアバターを操作、いやアバターと一心同体になりたいです。

なお心電図からの心拍推定の研究があってpython用にツールキットとして公開もされているようです。しかし、単にこれを適用するだけでは手元のセンサデータに対してはうまく動作しませんでした。 Welcome to BioSPPy — BioSPPy 0.6.1 documentation

Yamaha FC3AをNORD stageで使う

結論

Yamaha FC3Aのような他社製ペダルを、NORD stageの形式に変換してハーフダンパ―機能を使えるようにするモジュールを作りました。

f:id:semetemo:20211106223336p:plain

できた

背景

キーボード(シンセサイザー)のサステインペダルには大きく分けて2種類あります

  • ペダルの踏み具合(浅く踏んでいるか深く踏んでいるか)もキーボードに入力できるタイプ。例えば Yamaha FC3ARoland DP-10
  • 踏んでいるか、踏んでいないかだけをキーボードに入力できるタイプ。例えばYamaha FC4AYamaha FC5

実際のピアノはペダルを浅く踏んだらちょっとだけ音が伸びて、深めに踏んだら音がより響くようになるという具合に、ペダルの踏み度合に応じて音のなり方が変わります。前者の踏み具合も取れるペダルでは、踏み具合に応じた音の変化も含めて、リアルな演奏ができるというわけです。(もちろん音源側が対応していれば。)この機能はハーフダンパーとか呼ばれます。

余談ですが2種類の見分けかたとしては、たいてい踏み具合を取れるやつは接続端子が3極プラグで、踏んでるか踏んでないかだけのやつは2極プラグです。

 

NORD stageというキーボードのピアノ音源もペダルの踏み具合によって音の響きを変える機能がついています。さらにはペダルを踏みこむスピードに応じて「ペダルノイズ」も鳴ってくれます。これらのハーフダンパー機能はNORDのピアノ音源のよさを最大限に引き出す上でかなり大事です。

通常キーボードのペダルは「極性」というのが合っていれば互換性があるので、他社製のペダルを使える場合もあるのですが、NORDのハーフダンパー機能を使うことのできるペダルは現状、Clavia純正のNORD TRIPLE PEDALに限られています。でもリンク先に飛べば分かるように25,000円くらいするので、3,500円のYamaha FC3Aと比べるとまず高すぎるし、3つペダルがついているので滅茶苦茶デカくて場所をとるし、持ち運びも厳しい。ユーザーとしては6,000円くらいは出すからシングルペダルでハーフダンパ―使えるペダルを売ってくれよ...と願っているわけです。

なぜ他社製のペダルが使えないかというと、それはNORDのペダルのかなり特殊な仕様に依っています。FC3Aなどの一般的なペダルは踏み度合を連続的に取得できるような部品 (ロータリーエンコーダー) を使って、踏み度合を直接取得する仕組みである一方、NORDのペダル(トリプルペダルのうちのサステインペダル部分)は中に4つのスイッチが入っていて、踏み込み度合に応じてスイッチが順番に押されていく仕様になっています。この違いによって、他社製のペダルを直接NORDに挿したり、他社製のペダルを簡単にNORD形式に変換することはできなくなっています。

NORDのMIDI入力端子を使って、他社製のペダル例えばDP-10でNORDのハーフダンパ―を実現する方法は"Nord User Forum"にてすでに先人が実現してくれています。しかし他社製ペダルを直接NORDのペダル端子に挿せるように変換する方法は調べた限りまだインターネットの海に公開されていなかったので、この記事にて実現した方法を公開しようと思います。

www.norduserforum.com

ペダルの仕様

YAMAHA FC3Aの仕様

変換元となるFC3Aの内部の回路はたぶん下記のようになっています。ちゃんと調べていないし、抵抗値を見てみたところどうやらこれとは少し違うようなのですが、多分こういう回路だと想定して作って、踏み具合が正しくとれたのでこういう回路だと思うことにします。

f:id:semetemo:20211106220556p:plain

FC3Aの回路

雑ですみません。Tip, Ring, Sleeveというのがキーボードペダルの3極ジャックの各端子を示しています。ちゃんと調べていないとは言いましたが実質的に踏み具合によって可変抵抗の値が変動する仕組みになっているのは間違いありません。そのためTipとSleeveの間に電圧をかけて, Ringの電位を取れば踏みこみ具合を取得できます。

NORD TRIPLE PEDALの仕様

幸いなことにNord User Forumの多くの先人が知恵を出し合ってNORD TRIPLE PEDALの内部構造を調べてくれています。

www.norduserforum.com

これによると、NORDのsustain pedalはTRSプラグのTipとSleeveだけを使って動作しているようです。前述のようにNORD TRIPLE PEDALの内部には4つのスイッチが入っており、踏み込み具合に応じてスイッチが順におされるのを検知しています。スイッチが全く押されていない状態ではTipーSleeve間は解放されており, スイッチがリンク先の回路図でいうと左から押されていくにつれて、TipーSleeve間が抵抗を介して接続されるようになります。抵抗値はスイッチが押されている数に従って次のように変化していきます。

step 0=open circuit
step 1=R1 = 10K
step 2= R1 // R2 = 3.2K
step 3= R1 // R2 // R3 = 1.3K
step 4= R1 // R2 // R3 // R4 = 0.5K

実際にNORDのペダル端子のTip-Sleeve間に下記のような回路を作ってスイッチを勢いよく順番に押し込んでいくとペダルノイズが鳴ることが確認できました。

f:id:semetemo:20211106222502p:plain

スイッチを勢いよく順番に押すのじゃ

FC3A to NORD ペダル変換器

これを踏まえて、次のような方針でFC3A to NORDペダル変換器を設計しました。

  • マイコン (Arduino) を使ってペダルFC3Aの踏まれ具合を取得し、踏まれ具合に応じて、4つのスイッチを電気的に閉じる
  • 踏まれ具合はマイコンのanalogReadで実現
  • スイッチはMOSFETを用いて実装

非常にシンプルです。

電気回路

配線図は下記の通りになりました。相変わらず手書きですみません。左右にあるのはTRSジャックのつもりで書いています。右手の大きい長方形はArduino ProMicroです。おまけで踏んだ時にLEDが光るようにLEDをつけています。スイッチは4つのMOSFET (2N7000) をGPIOで操作することで実現します。GPIOが全てLOWの状態ではtip-sleeve間は解放ですが、例えばGPIO9がHIGHになると一番下のMOSFETのdrain-source間が (とても小さい抵抗値で実質的に) 短絡して, NORD側のtip-sleeve間の抵抗値が10k ohmになります。8と9が両方HIGHになると, 抵抗値は10kと4.7kの並列でおよそ3.2kになります。

f:id:semetemo:20211106223546p:plain

回路図

材料

必要になった材料は下記のとおりです。価格や購入元は参考です。MOSFETだけ選定して2N7000を使用しました。

部品 購入元 型番 単価 数量 小計 リンク
ProMicro互換 Shigezone   600 1 600  
TRSジャック 秋月   100 2 200 https://akizukidenshi.com/catalog/g/gC-15402/
MOSFET 秋月 2N-7000 20 4 80 https://akizukidenshi.com/catalog/g/gI-09723/
抵抗 820, 2.2k, 4.7k, 10k, 1k(LED用) どこでも   10 1 10  
LED どこでも   10 1 10  
配線 エナメル線 どこでも   10 1 10  
ピンヘッダ どこでも   10 1 10  
両面スルーホール基板 C型 秋月   90 2 180 http://akizukidenshi.com/catalog/g/gP-03231/
C基板用アクリルパネル 透明 秋月   120 2 240 http://akizukidenshi.com/catalog/g/gP-09853/
六角両メネジ FB3-20 秋月 FB3-20 30 4 120 http://akizukidenshi.com/catalog/g/gP-07469/
六角オネジ・メネジ MB3-7 秋月 FB3-7 30 4 120 https://akizukidenshi.com/catalog/g/gP-07472/
なべねじ M3 秋月   30 1 30 https://akizukidenshi.com/catalog/g/gP-07325/
合計         1610  

本当はエフェクターケースなどを筐体にして作ろうと思いましたが、手間の関係でユニバーサル基盤にアクリルパネルを取り付ける形にしています。

パネル取り付け用ステレオジャックをどのようにユニバーサル基盤につけるかという問題がありますが、ピンヘッダを使って無理やりつけています。最後にアクリルパネルで上から押さえつけて固定しています。

マイコンのプログラム

下記のようなプログラムを作成しました

#define LED 3
#define R1 9 // 10k
#define R2 8 // 4.7k
#define R3 6 // 2.2k
#define R4 4 // 880
#define PEDAL A0 // 880

#define THRESHOLD1 120
#define THRESHOLD2 350
#define THRESHOLD3 600
#define THRESHOLD4 850

int sensorValue = 0; // open 0 - closed 1023
int stateValue = 0; // open 0 - closed 4

void setup() {
  // put your setup code here, to run once:
  pinMode(LED, OUTPUT);
  pinMode(R1, OUTPUT);
  pinMode(R2, OUTPUT);
  pinMode(R3, OUTPUT);
  pinMode(R4, OUTPUT);

  digitalWrite(LED, LOW);
  digitalWrite(R1, LOW);
  digitalWrite(R2, LOW);
  digitalWrite(R3, LOW);
  digitalWrite(R4, LOW);
}

void loop() {
// get pedal position   sensorValue = 1023 - analogRead(PEDAL); // pedal position
// convert FC3A pedal position to NORD triple pedal state   if (sensorValue < THRESHOLD1) {     stateValue = 0;   } else if (sensorValue < THRESHOLD2) {     stateValue = 1;   } else if (sensorValue < THRESHOLD3) {     stateValue = 2;   } else if (sensorValue < THRESHOLD4) {     stateValue = 3;   } else {     stateValue = 4;   }
// push switch according to the state   if (stateValue == 0) {     digitalWrite(R1, LOW);     digitalWrite(R2, LOW);     digitalWrite(R3, LOW);     digitalWrite(R4, LOW);     digitalWrite(LED, LOW);   } else if (stateValue == 1) {     digitalWrite(R1, HIGH);     digitalWrite(R2, LOW);     digitalWrite(R3, LOW);     digitalWrite(R4, LOW);     digitalWrite(LED, LOW);   } else if (stateValue == 2) {     digitalWrite(R1, HIGH);     digitalWrite(R2, HIGH);     digitalWrite(R3, LOW);     digitalWrite(R4, LOW);     digitalWrite(LED, LOW);   } else if (stateValue == 3) {     digitalWrite(R1, HIGH);     digitalWrite(R2, HIGH);     digitalWrite(R3, HIGH);     digitalWrite(R4, LOW);     digitalWrite(LED, HIGH);   } else {     digitalWrite(R1, HIGH);     digitalWrite(R2, HIGH);     digitalWrite(R3, HIGH);     digitalWrite(R4, HIGH);     digitalWrite(LED, HIGH);   }   Serial.println(stateValue);   delay(1); }

promicroに上記のプログラムを書きこみます。各1-4のThresholdがペダルの踏み込み具合をNORDペダルの踏み込み具合 (4段階) に変換する閾値です。上記のコードでは自分が快適な値にキャリブレーションしてあります。

完成品

f:id:semetemo:20211106230545p:plain

f:id:semetemo:20211106230708p:plain

横から

こんな感じで完成しました。右側にFC3Aをつないで左側はステレオ標準が両端に付いたケーブルでNORD stageとつなぎます。ちゃんとペダルノイズも鳴ってくれるしハーフダンパーもできました。

プログラムの書き込み時はマイコンのUSB端子をPCに繋ぎますが、使うときには適当なUSBアダプタでコンセントから電源をとってもよいです。

まとめ

NORDが公式にシングルペダルでハーフダンパーに対応しているやつ出してくれればいいんだけどなぁ...

追記

記事の内容はNord user forumにも投稿しました。

www.norduserforum.com