トンプソン1とバスティンレベル1をぱらぱら見た感じだとトンプソンのほうが印象が良かったので、こちらを練習してみることに。ただ、トンプソン1は楽譜の読みかたが全く書いてないので他のも参照してる。といっても最初のほうは楽譜は指番号しか見ないような作りなので読めなくてもよさそう。このレベルでは指くぐりみたいなテクニックが必要ないように作られているらしい。独学の場合、前文をちゃんと読んで本の意図を理解してすすめるのがよさそう。

5時間ぐらいでようやく最初の曲が手で覚えてひけるぐらいになった。簡単な曲でも両手になると急に難しくなる。非連続的な成長点があるみたいで、ある時点で急に右手が勝手に動くようになって楽になった。なんでひけてるかわからんけど手で勝手にひけてる、みたいな状態。あんまり良くはない気もする。楽譜と音と音名の対応は全くできてなくて、暗譜して指を動かしてるだけ。

右手だけだとひけても味気なくて、単純とはいえ左手が入ると、音の響きが加わって楽しくなる。左も同時にひけると嬉しいんだ!というモチベーションが湧く。

2曲目に挑戦しはじめるところ。2曲目は右手は単純だけど左手がまたややこしくてうまくひけない。

  1. トップ
  2. piano

2016年8月に買って以来、活躍してきたタブレットを落として、画面のガラスを割ってしまった。

今までスマフォとかでも画面割れを起こしたことはなかったのでショックが大きい。

ぱっといじった感じだと動作がおかしいことはないから、使えないことはないようにみえた。でも悲しい。

新しく買うならまたこれのシリーズかなあと思う。以下のような条件で安いのがほしい

  • 指紋認証
  • Full HD 以上
  • 7〜10インチ
  • メモリ2GB以上

HUAWEI MediaPad M3 lite 8 8.0インチ SIMフリー タブレットLTEモデル 32GB RAM3GB/ROM32GB 【日本正規代理店品】 - HUAWEI(ファーウェイ)

HUAWEI(ファーウェイ)

3.0 / 5.0

子どもが音楽教室行きはじめるので (まだリズム感とかしかやらないみたいだが)、ピアノを買って自分も練習してみるぞという機運。まだ買ってもいないけど、はたして続くだろうか。もちろん独学でやる。現代には YouTube があるため、ある程度は知の高速道路がひかれていることを期待したい。特定の曲がというよりも、販売されてるようなポピュラー楽譜で曲を初見弾きできるようになりたい。3年ぐらい頑張ればいけるかな。クラシックはあまり興味がないけどエリーゼのためには綺麗にひけるようになってみたい (途中の展開がかっこいいし誰でも知っているから)。エリーゼのためにはフルでちゃんと弾くと5年ぐらいかかる難易度らしくて趣味としてはほぼゴールっぽい。きつ

電子ピアノの予定だけど、電子ピアノといえど騒音問題からは逃れられないらしく、ヘッドフォンをつけても打鍵音が問題になる。賃貸集合住宅だと実は選択肢があまりない。高級機になるほど鍵盤のタッチがアコースティックピアノに近付くようだが、そうなると鍵盤と連動するハンマーが重くなるということに直結するため、メカニカルな部分の打鍵音がダダダダダとかなりうるさいようだ。こういった打撃音によって発生する低音成分は減衰することが極めて難しい。よって、静音という点に関していえば必ずしも高級機を選ぶのはベストとはいえない。

そもそも自分はアコースティックピアノをひく機会がないので、別にアコースティックピアノに似ている必要性が薄い。でもキーボードみたいなペコペコなのは嫌だし、子どもはアコースティックピアノに触れる機会もあるだろうしということで電子ピアノが選択肢になる。

こういう体積が大きめの買い物に関してそれなりに金を払って良いものを買ったほうがいいという方針だけど、上記音の問題があるため、いろいろ熟考した結果 KORG の NH 鍵盤採用のものが良いのではないかという結論にいたった。だいぶ安いモデルに採用されているが、そこそこ評判が良い。将来的にこの鍵盤で不満が出たら (違いがわかるようになったら) 買い替えればいいだろう。夜中に練習できなければ意味がないので、とにかく静音性が選択の第一。安い電子ピアノなので、償却期間中に引っ越すことになりそうだし、たぶん十分だろう。

  1. トップ
  2. piano
  3. ピアノ

いつのまにか前からあるクロスバイクの乗車距離を上回っていた。もともとそんな走ってないだろというのはあるけど……

もともと体力なさすぎで 25km/h 維持すらきつかったけど、だんだん普通にしてても 30km/h 維持ぐらいはできるようになってきた。

特に多少の向かい風のときとか、ほんの少しの上りとかで一瞬で疲れて速度が落ちるみたいなことがなくなった。うれぴー

100km もなんとか走れるようになった。お尻が痛くなることがあんまりなくなったので、今のポジションは割とちょうどいいのかも。

完全初心者だとやることが多い

  • 楽典 (楽譜のよみかたとか)
  • 運指
  • ソルフェージュ

っていっても同時になんでもできるわけじゃないので、とりあえず子どもの教材といくつか試してみる。どんな感じですすめていくかわかれば今後子どもがやりはじめたときにも役に立つだろう。

よくきく教材に「バイエル」というのがあるが、昨今では流行ってないらしい。退屈だとかヘ音記号の登場が遅いだとかDISられまくってる。いくつか調べた結果以下の教材を買ってみる。

  • トンプソン 現代ピアノ教本1
  • バスティンピアノベーシックス ピアノのおけいこ レベル1
  • 無理のない指のトレーニングのために大人からはじめるハノンピアノ教本

基礎教材はトンプソンかバスティンがとりあえず良さそうなので、買ってみてどっちもやって合うほうの続きを買うつもり。ハノンはまだ必要だとは思えないが、運指の練習がどんなものか興味があるので手に入れる。

あとモチベーション維持のためポピュラーソングの楽譜を一冊買った。やさしく弾ける みんなのピアノ、みたいなやつ。

トンプソン 現代ピアノ教本 1 - ジョン トンプソン

ジョン トンプソン

3.0 / 5.0

Lightroom を使わず、Google Photos に上げた JPEG を Google Photos でレタッチかけてみた。

  1. トップ
  2. photo

6月3日が筆記試験・7月22日が実技試験ということになっている。

筆記試験までかなり時間があるが、参考書をパラパラめくって(特に何か覚えるというわけでもなく)、複線図の書きかただけ覚えたら過去問で合格点を超えてしまった。

しかし3相交流の計算問題など完全に初耳な問題がわからない。今のところ不安なのは重要順にいくと以下の通り

  • 電線径と圧着スリーブの対応
    • これが正確でないと実技試験でも一発不合格なのでキツイ
  • 3相交流
  • 力率
    • リアクタンスにかかる電力が無効電力というのはわかってるつもりなんだけど、問題を解ことすると間違えてしまう。
  • 単相3線
    • 3相と紛らわしい
    • 負荷が平衡かどうかもよく見ないとだめ
  • 電線径と許容電流
    • 覚えてないと答えられない。でも実際覚えて施工しなくない? 内線規定の表を見るんじゃないの?
    • シースの材質で変わってしまう (なぜなら上昇温度に耐えられるかという話だから、シースの耐熱性も要素になる。がいし引き以外では放熱特性が悪化するので許容電流も下がっていくなど)
    • IV単線φ1.6mm 27A (断面積 2.0mm^2程度)
    • IV単線φ2.0mm 35A (断面積 3.1mm^2程度)
    • IVより線 2.0mm^2 27A
    • IVより線 3.5mm^2 37A
  • 分岐回路の許容電流・ブレーカまでの距離
    • 覚えてないと答えられない

あとだいたい常識レベルでもわかる問題が多い。配線図記号は確認表示灯 (●L)と位置表示灯(●H) の L と H ってなんだって感じだったけど解決したので滅多に間違えないはず。

複線図はほとんどの場合は難しくは感じない。3路スイッチ・4路スイッチだけややこしく、最小配線数を問われると自信がない。

もうちょっと覚えるべきことを覚えて筆記はすんなり通りたい。

最近やってるのは

  • MIDI2LR のコントローラ
    • 部品の納品待ち
  • フルバランスのヘッドフォンアンプ
    • DDC -> DAC でアナログにした時点でバランス。4ch 増幅するタイプ
    • だいたいできてるけどモチベーションがない
      • 結局アンバランスで使うやん?

あたり。なんかいまいち魅力に欠ける。

500 Can't connect to lowreal.net:443 (certificate verify failed) とか先に書いていたが、掃除機を買っていた。

今まで 10.8V スライド対応の工具としてドライバドリルを持っていたので、掃除機はバッテリなしのモデルを買った。

マキタ(Makita) 充電式ドライバドリル 1.5Ah (バッテリー・充電器・ケース付) DF031DSHX - マキタ(Makita)

マキタ(Makita)

5.0 / 5.0

ドライバドリル側はバッテリ2個と急速充電器付き。コードレスドライバドリルはほんと便利なので、持ってないなら電池2個セット付きのを今すぐ買いましょう。

マキタ コードレス掃除機CL107 紙パック式 標準25分稼働 軽量定番モデル 10.8Vバッテリ充電器別売 CL107FDZW - マキタ(Makita)

マキタ(Makita)

5.0 / 5.0

掃除機はバッテリなしで紙パック式のものにした。紙パック式とはなってるが、洗って使えるダストカップも付属するので、基本的にはカプセル式の上位互換となっている。電池付属のも当然売ってます。

バッテリーを共有できるのは便利。共通バッテリーのシリーズラインナップは結構あるけど、家庭で最も使うのは掃除機とドリルドライバぐらいでしょう。

使い勝手

まずホースがないのと本体が小さいので、場所をとらずすっきり置いておけるこころに価値がある。露出した場所に突っ張り棒にフックをかけて、そこからこの掃除機をぶら下げておいてるけど、邪魔にならず気にならない。すぐに使えるのは便利。

うちの用途だと充電頻度も高くないので、あんまりバッテリーを気にせずコードレス化されたという感じがする。

バッテリの持ち

1.5Ah のバッテリでの掃除機は連続可動時間は強 (スイッチを入れて最初のモード) で12分となっている。

結構スペック的には短く思えるが、実際使ってみると1日あたり1分もあれば十分に気になるところを吸いこめるので、1週間ほど無充電でいける。まぁルンバも併用しているので、広いところはおおむね綺麗というのはある。ルンバがカバーできないような、扉の裏とか、狭い洗面所とか、作業後のゴミの吸いこみとかの用途が多い。

バッテリーにはどうしても寿命があるので、交換式なのは嬉しい。掃除機なんて滅多に壊れるものではないので、内蔵型だとバッテリー寿命で製品寿命が決まるのが悲しい。

充電

そもそも充電頻度が高くないけど、22分で充電が終わるのでだいぶ早い。そして標準モードでは25分稼動できるので、2つバッテリーで交互にずっと掃除できることになる。すごい。

  • L は Pilot Lamp の L らしい
  • H はホタルの H らしい

ということで、最も覚えやすいのは以下の通り

  • H がホタルの略
  • ホタルは暗いところで光る
  • ホタルが光っていると位置がわかる (暗いところでの位置表示)

だけ覚えておけば、●H が即座にどちらかわかるようになるので、おのずと●Lは逆で覚えられる。

図記号との対応は上記を覚えていれば簡単に導ける。●H ではスイッチと並列でランプがついているだけなので2接点ですむのに対し、●L は「常時点灯」と「同時点灯」と「異時点灯 (挙動はホタルスイッチと同じ)」で配線が変わるため3接点必要。

備考

Low と High かと思って接点回路図を見つめて考えてみたけど、これではどっちがどっちだかわからず困った。参考書は暗記しろではなく、ちゃんと何の略称なのか書いておいてほしい…… 略称だけわかっていれば暗記する必要ないんだから。

「らしい」と書いたけど、根拠となる JIS C 0303 には何の略かは書いてないので、これが確かとはいえない。しかしこれで覚えやすいことは確かである。

ABS と PLA も試したけど PETG (Polyethylene terephthalate glycol-modified) が最良と思っている。

  • ABS のような反りがなく・寸法安定性が良い
  • PLA ほど耐熱性が低くない
  • ベッドへの接着性が高い・層間の接着性が高い
    • 造形中に剥れて失敗することが少ない
    • ベッドを必要以上に綺麗にする必要もない (基本的にスプレーのりもいらない)
  • 価格的にもABS・PLAとそれほど変わらないか少し高価な程度
  • 強度もあるが硬すぎるというほどでもなく割れにくい (靭性がある)
  • プリント後の加工も可能
    • ABS よりは加工性が悪いが、PLAのような苦労はしない
  • 臭いがほとんどない (ABS みたいな臭さもないし、PLA みたいな甘い臭いもしない)
  • ノズルが詰まりにくい気がする (PLA は詰まりやすい)

一方でPETG独特の問題もある

  • 条件によって糸ひきが多い
    • ノズル付近にゴミが溜りやすく、気をつけないと造形物を破壊する
      • ノズルにシリコンカバーをつけると良い
    • フローが多すぎると危険
      • 100% インフィルとかだと失敗しやすい
  • 適切な温度の範囲が狭い
    • 低すぎると接着性が悪い
    • 高すぎると猛烈に糸をひく

ということで、設定は

  • ノズル 235〜240℃ ヒートベッド 80℃
    • 235℃あたりの低めから徐々にあげて調整するのが良い。糸がひきはじめたら下げる
  • プリント速度は気持ち早め、フローは気持ち低め (98%とか微調整)

にするとうまくいきやすかった。フローは温度を決めてからテストプリントで見極める。接着性が高いのでサポート材の使用量に注意が必要。あんまり細かいところにサポートを入れると外すことができない (Simplify3D はサポート材が剥しやすいほうだけど、それでも)。

まぁとにかく PETG がおすすめ。

RepRapper 1kg PETG 3Dプリンターフィラメント ブラック 1.75mm - RepRapper

RepRapper

5.0 / 5.0

備考:ABS のプリントはヒートベッドがあっても難しい

とにかく反り対策が難しい。

特に冬は絶対やめたほうがいい。膨張率が高いおかげで反りが激しいので、設計時にすら気を使う必要がある。当然スライサでプリント方向も気をつけないといけない。

ある程度大きなパーツを作るのはとても難しい。小さなパーツでもベッドとの接着が甘いと剥れてくるし、層を重ねると反ってくる。設計通りに寸法を出すのは、設計段階から気をつけるレベルでないとかなり難しい。つまり構造的に反りにくいようなリブをつけたりする必要がでてくる。

ヒートベッドは万能ではなくて、下層の反りを軽減してベッドから剥離することは防止することはできても、高さがある造形物が途中から反っていくのにはあまり効果がない。これを抑えるには室温を上げる必要があるが、実際はなかなか難しい。冬でも箱があれば30℃程度まで室温を上げられるが、この程度では反り対策にはあまり効果を感じない。

そもそもヒートベッドを100℃前後まで過熱するのは80℃前後まで過熱するよりも、余計にかなり時間がかかる。プリント開始されずもどかしい。ここで時間がかかるとそもそも試行錯誤しにくいということも罠のひとつ。

備考:PLA はプリント後に微調整がしにくい

PLA はとても硬いのでやすりで微調整したり、ニッパーで強引にパーツの一部を切り取るとかがやりにくい。試行錯誤しようと思うとプリントしなおす前にプリント部品を修正してモデルに反映させてとやりたくなるけど、やりにくい。諦めてプリントしなおしたほうが精神的に楽に思えるぐらい。そうすると時間的にもフィラメント的にもコスト増である。

また耐候性がないので屋外で使えず、耐熱性が低いので高温になる場所 (高温といっても60℃ぐらい) では使えないので、用途が限られる。「プリントしやすい」以外は利点があまりないと感じる。けど肝心のプリントしやすさも、ノズルの詰まりやすさでスポイルされる部分がある (フィラメントに少量油を塗るオイラーが必要)。

  1. トップ
  2. tech
  3. 3Dプリント用の素材のオススメは圧倒的にPETG

工具用のバッテリーを流用する場合、以下のようなメリットがある。

  • 出力電流がそれなりとれると期待できる
  • 入手性が良く、性能が安定している。サードパーティの互換バッテリーがあったりもする
  • 充電時間が短い

工具用バッテリーは工事現場で使われるようなものなので、モバイルバッテリーのようなものより要求仕様が高い。サイズも容量にしては大きめで価格も高めだが汎用性が高い。

マキタの 10.8V リチウムイオンバッテリーシリーズには BL1015 (1.5Ah) BL1040B (4Ah) がある。Ah 表記だが、10.8V での Ah だとすると、それぞれ、16.2Wh、43.2Wh になる。このバッテリーは一般向け充電掃除機で使われているので工具以外でも馴染がある人は多いだろう。

マキタ リチウムイオンバッテリBL1015 10.8V 1.5Ah A-59841 - マキタ(makita)

マキタ(makita)

5.0 / 5.0

マキタ コードレス掃除機CL107 紙パック式 標準25分稼働/充電22分 軽量定番モデル 10.8Vバッテリ充電器付 CL107FDSHW - マキタ(Makita)

マキタ(Makita)

5.0 / 5.0

ニッケル水素 1900mAh 1.2V 10本直列だと 22.8Wh なので、1.5Ah のモデルはちょっと少なめに感じる。が、リチウムイオン電池は重量効率が良いのと、工具用バッテリーは上記の通り充電器が良くできていて充電速度が早いので、これを汎用的に使えると便利でしょう。

みてみるとバッテリー側には5端子ある。工具側には3端子。残り2つは充電器用っぽい。バッテリー側の表面をよく見てみるとプラスとマイナスの表示が書いてあり、普通に出力が常にされている。おそらく工具用にはプラス・マイナス・サーミスタの3端子だと思う。充電器用についてる2つの端子は何かわからない。(バッテリーの充電バランス用かもしれない)

マキタのリチウムイオンバッテリーは 10.8V のほか、 36V 18V 14.4V 7.2V のラインナップがある。14.4V 以上は価格が非常に高くなり、7.2V は小型工具しかない。基本的に家庭向けには 10.8V 一択に見える。10.8V には差し込み式のバッテリーもラインナップされてるが、スライド式のほうが良い(接点不良が起きにくいので)。

10.8V でもそこそこ電圧が高いので、もしさらに DC/DC コンバーターをつけてもスイッチング電流はそれほど大きくならずにすむ。

10.8V スライド式バッテリーを汎用的に使う


当然メーカー推奨の方法ではないが、バッテリー端子を直接引き出しで独自に使う。

バッテリーに合致する端子を作って、任意の汎用コネクタに変えることを考える。とりあえずは手元の無線機 (KX3) 用に DC φ 2.5mm センタープラスコネクタとして引き出す。

導体を扱うので 3Dプリンタだけではどうにもならない。接点として、今回はt=1mmの SUS430 の板を使うことにしてみた。SUS430 はステンレスの中でフェライト系というもので、比較的加工性が良いらしい。けど真鍮とかのほうがもっと加工性良さそうだし導体抵抗的にもいいかもしれない。

SUS430 板は CNC ミリングで加工した。あまり複雑な形にせず、最悪手で加工しても作れるような形とした。

端子を保持してスライドしてバッテリーと接続する部分は3Dプリンタで作成した。何度か出力しなおしてうまくマッチするようにした。

パーツは2つに分かれていて、ショート防止のため金属の露出部分を減らしてある。

Thingverse に STL をあげた。https://www.thingiverse.com/thing:2841303

電圧

リチウムイオンバッテリー直結だと思うので、素子素性そのままだと思うが念のため。

リチウムイオンバッテリーは1セルあたり3.6V。10.8V は3本直列ということになる。

公称3.6Vで、満充電4.2V、放電ぎりぎりでは2.75V 付近まで下がる。3本直列なら 8.25V〜12.6V。実用的には下限を9Vぐらいにしたほうが安心。

  • 充電直後 12.43V (セルあたり4.14V)
  • 放電後 (マキタの掃除機でLEDが点滅するまで) 10.3V (セルあたり3.43V)

放電直前の電圧はそのうち追試

どれぐらい電流がとれるか

無線機に直結できるように配線してみたので、KX3 で実際に送信してみたところ、充電直後で 2A 程度は全く問題なくとれるようだった。

過電流保護がどこでかかるのか興味が湧いたので、電子負荷でさらに負荷をかけてみることとした。4.3Aまで出ることがわかった。

  1. トップ
  2. tech
  3. マキタ 10.8V スライド バッテリーを活用する (無線機の電源に)

Original Prusa i3 MK2S Kit (3Dプリンタ) を買ってた | tech - 氾濫原 と書いたすぐ1ヶ月ほどあとに MK3 というメジャーアップグレードバージョンが販売されてしまってガックリきたが、部分的に MK3 からアップグレードを取り入れた MK2.5 Upgrade Kit というのが同時に用意され、直近購入ユーザ向けに割引の案内があったため、申し込んでおいていた。それが先日届いたのでアップグレード作業を行なった。

何が変わるか

MK2S -> MK2.5 で以下がアップグレードされる。

  • フィラメントセンサー
  • エクストルーダーまわりが大幅に変わった
    • フィラメントの引き込みがより滑らなくなった
    • ホットエンドファン径が大きくなり静音のファンに
  • ヒートベッドが2重構造に
    • ベース+鉄のプレートで、磁石でくっつくシートが付くようになった
    • 特に大きな造型物を取り外しが楽に

MK2S でも割と十分なので、そんなにものすごく魅力的というほどではないが、フィラメントセンサーは便利で良さそう。

なお MK3 は MK2S から上記以外にも大幅に変わっていてもっと良さそうなんだけど、あいくにもう一台買うような余裕はない。

手順

Prusa Knowledge Base に従ってやった。

キット内に PETG のフィラメントが入っていて、オマケかな?と思ったら、Gcode は用意してあるので、必要な 3D プリントパーツをまず今のでプリントしてください、という感じだった。そういえば確かに、既に動くプリンタがあるなら部品供給じゃなくて材料供給のほうが効率良いが、予想外だったのでちょっとびっくりした。

X軸はE軸と結合するパーツが全置き換え。E軸は完全に置き換え。地味に大変。

PINDA プローブやキャリブレーションがやりなおしなのも地味に大変だが、勘所は覚えてたので割とすぐ終わったっぽい。まだあまりプリントしてないのでこれからかな。

ファームが新しくなってウィザード形式で初回テストを行ったけど、ちょっとつまづくところがあった。

  • ファンが回ってるのに Selftest failed で終わる
    • Selftest 開始直後にキー入力してしまうと、プリントファンがまわったあとの「プリントファンがまわってますか?(意訳)」というデフォルトで「いいえ」が選択されている質問を一瞬で飛ばして Selftest failed になる
    • 余計なキー入力をしなければ問題なかった
  • Motor - X, Endstop Z エラー
    • X軸とZ軸のエンドストップが入れ替わっているという旨のエラー
    • Z軸のエンドストップって何かというとPINDAプローブだが、X軸を動かしている最中にPINDA プローブが反応する位置にきてしまうと、配線が正しくてもこのエラーが出てしまう
    • Y軸をちょっと動かしてやれば解決
  • First Layer Calibration
    • PLA でやることになっているが、手元に PLA がなくて焦った
    • 余った (巻かれてない) PLAを発見したので手差しで供給して行った
  • プリントファンのファンノズルが割れた
    • この部品はABSでプリントされたものが付属するが、ネジ止めするところを割ってしまった。
    • プリントレイヤー間で割れたので接着剤でつけた。ここはネジを締めること自体にトルクが必要なので、いまいちどこまでやれば止まっているのかわかりにくい
  1. トップ
  2. tech
  3. Original Prusa MK2.5 Upgrade がきたので作業した

MIDI デバイスを Lightroom のコントローラとして使えるプラグインとして MIDI2LR というのがある。市販のMIDIコントローラを使ってLightroomの現像パラメータなどを可変できるというもの。

しかし意外と市販のMIDIコントローラでちょうどいいのがないという問題がある。インターフェイス上の制限から、最適なコントローラは単純なロータリーエンコーダとスイッチの組合せで、常にインクリメンタルな値を送るものとなる。

ちょうどいいのがないなら専用品を作れば良いので、まずブレッドボードレベルで実装してみる。

コード

ロータリーエンコーダを処理するコードがあるのでちょっと長く見えるが main は短い。mbed の USBMIDI ライブラリのおかげ。

LPC11U35 で動かすことを前提として、ロータリーエンコーダのA相・B相を、それぞれ P0_11, P0_12 に繋ぐコードになっている。時計周りのときB相が先行するコードなので、逆のロータリーエンコーダの場合は逆にする。(ロータリーエンコーダの位相方向って決まってないっぽい?)

ロータリーエンコーダのチャタリング対策も入れてる。ググってみるとあんまりやってるコードを見ないけど必要ないのかな?

#include "mbed.h"
#include "config.h"
#include "USBMIDI.h"

class QEI {
	static const int8_t INVALID = 2;
	static uint8_t decode(const uint8_t prev, const uint8_t curr) {
		/**
		 * 4bit decode table
		 *       bit3      bit2      bit1     bit0
		 * [ prev A ][ prev B ][ curr A ][ curr B]
		 *
		 */
		switch ( (prev << 2) | curr) {
			case 0b0000: return  0;
			case 0b0001: return  1;
			case 0b0010: return -1;
			case 0b0011: return  INVALID;
			case 0b0100: return -1;
			case 0b0101: return  0;
			case 0b0110: return  INVALID;
			case 0b0111: return  1;
			case 0b1000: return  1;
			case 0b1001: return  INVALID;
			case 0b1010: return  0;
			case 0b1011: return -1;
			case 0b1100: return  INVALID;
			case 0b1101: return -1;
			case 0b1110: return  1;
			case 0b1111: return  0;
		}
		return INVALID;
	}

	volatile uint8_t prev;
	Timeout timeout;

	void interruptSample() {
		uint8_t ok = sample();
		if (!ok) error = 1;
	}
	
	void interruptDelay() {
		// avoid chattering
		timeout.attach(callback(this, &QEI::interruptSample), delay);
	}
public:
	volatile int position;
	volatile uint8_t error;
	InterruptIn phaseA;
	InterruptIn phaseB;
	float delay;

	QEI(PinName _a, PinName _b, float _delay = 0.005) :
		prev(0),
		position(0),
		error(0),
		phaseA(_a),
		phaseB(_b),
		delay(_delay)
	{
		phaseA.mode(PullUp);
		phaseB.mode(PullUp);
	}

	void enableInterrupt() {
		phaseA.rise(callback(this, &QEI::interruptDelay));
		phaseA.fall(callback(this, &QEI::interruptDelay));
		phaseB.rise(callback(this, &QEI::interruptDelay));
		phaseB.fall(callback(this, &QEI::interruptDelay));
	}

	/**
	 * sample digital input and return ok
	 */
	uint8_t sample() {
		uint8_t curr = phaseA.read() << 1 | phaseB.read();
		int8_t incr = decode(prev, curr);
		prev = curr;

		if (incr == INVALID) {
			return 0;
		}

		position += incr;

		return 1;
	}
};

void show_message(MIDIMessage msg) {
	switch (msg.type()) {
		case MIDIMessage::NoteOnType:
			printf("NoteOn key:%d, velocity: %d, channel: %d\r\n", msg.key(), msg.velocity(), msg.channel());
			break;
		case MIDIMessage::NoteOffType:
			printf("NoteOff key:%d, velocity: %d, channel: %d\r\n", msg.key(), msg.velocity(), msg.channel());
			break;
		case MIDIMessage::ControlChangeType:
			printf("ControlChange controller: %d, data: %d\r\n", msg.controller(), msg.value());
			break;
		case MIDIMessage::PitchWheelType:
			printf("PitchWheel channel: %d, pitch: %d\r\n", msg.channel(), msg.pitch());
			break;
		default:
			printf("Another message\r\n");
	}
}


USBMIDI midi;
QEI encoder1(P0_11, P0_12);

int main() {
	printf("init\r\n");
	encoder1.enableInterrupt();

	midi.attach(show_message);
	while (1) {
		if (encoder1.position) {
			int8_t val = encoder1.position;
			printf("send CC 1 %d 0\r\n", val);
			midi.write(MIDIMessage::ControlChange(1, val, 0));
			encoder1.position = 0;
		}
	}
}

MIDI2LR の設定

MIDI2LR の設定画面を開いた状態でロータリーエンコーダを動かすと、以下のように表示されるので、ここでは Exposure (露出) に割り当てている。

さらにこのボタンの部分を右クリックして、Adject CC dialog を出し、CC Message Type を Two's complement に設定する。

備考

これですんなり動く。ロータリーエンコーダのA相・B相の仕様を確認しないと回転方向が逆になったりするのだけ注意が必要 (ソフトウェア側でなんとでもなるけど)

この調子でエンコーダーを増やしていけば実装上は良いことになる。しかしロータリーエンコーダ1つあたり2ピンのIOを使うので、実際は GPIO 拡張が必要になる気がする。

  1. トップ
  2. tech
  3. mbed USBMIDI で Lightroom 用の MIDI インターフェイスを作る