dothikoのカクカクワールド2D REBOOT

プログラミングとかLinux関連(特にOSSのグラフィックツール関連)とかレトロゲームとか色々。

本当に駄目なマウスだろうか?自分の使い方が悪いのでは?と思って足掻く & 中ボタンの凝った使い方

実は買ったのはこのマウスなのですが

f:id:dothiko:20161016165838j:plain

このマウス、微妙である。

(糞WiiUさんのブログ「 俺的糞ゲー処刑ブログ 」様の、真似w)

握り具合自体は悪くないのと、特に変な事をしていないので (一時期、Win8対応!とかいってサイドボタンから迷惑至極なキーコードを吐くマウスがありましたが、そういうことはまったくない)、素直にLinuxでも全ての機能を挿すだけで使用できるのは実に良いのですけども。

なにが悪いってホイールの位置(高さ)なのですね。 実の所、ロジクール以外のサプライ各社のマウスでホイールの位置がマトモな奴を見たことがない気がするのですが。 多分、数ミリレベルの差だと思う。

指の付け根が接しないのでホイールを駆使したとき、指というか指を動かす腱が疲れるのだと思います。

そこで思いました。まずサイズが間違えた(Lサイズを買うべきだったのでしょう…)のと、もうひとつの可能性としては、使い方が根本的に間違っている可能性。

普通の人はそんなホイール動かさない、のではないかという。

ではホイールを動かしたいワタクシと普通の使い方を整合させるにはどうしたらいいのか、と考えていて思い当たりました。

そういえば、昔のLinuxはデフォで3ボタンマウスを挿すと中ボタンが押しているあいだホイールの代わりとなり、マウスを動かした分がスクロールとなる、フォトショなどの「手のひらスクロール」のような挙動を示していました。 当時Windowsユーザーだった自分は、コレ便利じゃん!コレwindowsに欲しいわ〜と思いましたが、まぁいわゆるオートスクロールで代用できるし…と通り過ぎたのでした。

これなら、大量に動かすときはホイール押し込みでマウスを回してスクロールさせ、少しだけ動かすときは指の腹で撫でればいい。

アレはまだ生きていないのだろうか?と思ったわけです。 ぐぐったら、生きてました! 今は、evdevの機能を使うらしい…

unix.stackexchange.com

自分なりの設定

とりあえず実験用として、次のようなスクリプトを書きました。

#!/bin/sh

id=$1

xinput --set-prop $id 'Evdev Wheel Emulation' 1
xinput --set-prop $id 'Evdev Wheel Emulation Button' 2
xinput --set-prop $id 'Evdev Wheel Emulation Axes' 6 7 4 5

xinput --set-prop $id 'Evdev Wheel Emulation Inertia' 3

xinput --set-prop $id 'Evdev Wheel Emulation Timeout' 16

Inertiaは、どれだけマウスを移動させるとイベントを発するかという設定です。高速スクロールを目指して3ピクセルという極短距離で発動するように設定。

Timeoutは、「そのミリ秒内にボタンを離せば、エミュレーションせず単体ボタンの発動とみなす」時間です。 中ボタンとしては使わないと思えばすぐに発動したほうがよいため、1フレームの16msに設定してみました。

やってみて感動、これはすばらしい。

マウスでもいいですが、M570のようなトラックボールでさらに大威力を発揮する設定でしょう…!! でもトラックボールは掃除がめんどい。誰かなんとかして。

さらに思いついた応用

やっているうちに思いついたことがあります。

「機能しないボタンにエミュレーションさせれば、xbindkeys/xvkbdと組み合わせてジェスチャ的にボタンを増やせる」

#!/bin/sh

id=$1

xinput --set-prop $id 'Evdev Wheel Emulation' 1
xinput --set-prop $id 'Evdev Wheel Emulation Button' 2
xinput --set-prop $id 'Evdev Wheel Emulation Axes' 8 9 10 11

xinput --set-prop $id 'Evdev Wheel Emulation Inertia' 64

xinput --set-prop $id 'Evdev Wheel Emulation Timeout' 200

このスクリプトだと今度は、中ボタン押してマウスを動かしても横で8,9ボタン、(進む・戻るボタン)縦では10,11ボタンという誰も使わない高次ボタンの機能を発して、そのままだと何の反応もありません。

そこでxbindkeysで次のように設定します

#mouse-to-top
"xvkbd -text "\[Control_L]\[Home]""
  m:0x10 + b:10

#mouse-to-bottom
"xvkbd -text "\[Control_L]\[End]""
  m:0x10 + b:11

これにより、中ボタン押して左右で「戻る/進む」、上下でページ先頭・ページ末尾というジェスチャ的機能に代わります。

平凡な3ボタンマウスにこういうのを設定すれば、平凡な安マウスが多機能マウスにクラスチェンジです。

なお、Inertiaが64なのは、このタイプではあまりイベントを発動しまくってもらっては困るからです。64でも小さすぎるぐらいで、200とかでも良いかも知れません。

また、Timeoutを活かせば中ボタンよりむしろ右クリックでもよいかもしれない…?右クリックって、右ドラッグにはまず使わないです…よね?(オイラだけ?)

最終的なスクリプト

なんか、id周りが上手く処理できなかった(ダブルクォートすると、デバイス名をスペースで区切ってしまって?正常に認識してくれない)ので、必死こいてナントカ動くようにしましたが…無駄でダサい処理をしているのでしょう…。

とにかくユニバーサルな処理を心がけました。

#!/bin/bash
timeout=16
button=2
inertia=3
mapping="6 7 4 5"

#====================#
while [ "$1" != "" ];do

    case $1 in
    -t | --timeout)
        timeout=$2
        shift 1
        ;;
    -b | --button)
        button=$2
        shift 1
        ;;
    -i | --inertia | --length | --pixel)
        inertia=$2
        shift 1
        ;;
    --id)
        id=$2
        shift 1
        ;;
    --name)
        id=\'$2\'
        shift 1
        ;;
    -m | --mapping):
        mapping=$2
        shift 1
        ;;
    -h | --help)
        linenum_start=`cat $0 | grep -n -e '^#==*#' | sed -e 's/:.*//g'`
        linenum_end=`cat $0 | grep -n -e '^#--*#' | sed -e 's/:.*//g'`
        linenum_end=$((linenum_end - 1))
        tail_cnt=$((linenum_end - linenum_start))
        echo "help document of $0"
        echo "-------------------"
        cat $0 | head -n $linenum_end | tail -n $tail_cnt 
        exit 0
        ;;
    * )
        expr "$1" + 1 >/dev/null 2>&1
        if [ $? -le 1 ];then
            id=$1
        else
            id=\'$1\'
        fi
        ;;
    esac

shift 1
done
#--------------------#

function set_xinput {

call="xinput --set-prop $1 '$2' $3"
#echo $call
eval $call

}

if [ "$id" = "" ];then
    echo "ERROR: you must specify id or device name"
    exit 1
fi

set_xinput "${id}" 'Evdev Wheel Emulation' 1
set_xinput "${id}" 'Evdev Wheel Emulation Button' $button
set_xinput "${id}" 'Evdev Wheel Emulation Axes' "$mapping"
set_xinput "${id}" 'Evdev Wheel Emulation Inertia' $inertia
set_xinput "${id}" 'Evdev Wheel Emulation Timeout' $timeout

バッファローのマウスで、ホイールではなく右クリックをエミュレーションスクロールに割り当ててみました。

上記のスクリプト「middle_button_setup.sh」で以下のように設定しますと (全然ミドルボタンじゃないというツッコミはさておき)

./middle_button_setup.sh "SONiX Full-Speed Mouse" -b 3 -t 180

な、なんだこの使いやすさは!!!

大規模スクロールは辛くなく…しかも右クリとも一応共存出来ています。 今の所、右ドラッグを行うソフトの記憶が無いのでこれで十分では…という…

ていうか…だとするとえっ…マウスってもしかして3ボタンどころか2ボタンで十分…(汗

まぁ、右ドラッグ要るぞ!という状況が出てくるかもなので、なんとも言えないですけどね。まぁキーボードショートカットでこの機能をトグルすることも原理的には可能なので、とりあえずは大丈夫ではないかと…

あっ、ちなみに先日書いたサイド化M100rは結局、サイドボタン、それも小さいタクトスイッチでのホールドには無理があると判断。シングルワンショットの戻るボタンとして機能させ、右ボタンで上記のスクロール機能を割り当てたところ、これまた結構使いやすいです。(進む機能は、Firefoxのアドイン「Firegestures」のロッカージェスチャ機能で行っています。戻るより頻度が少ないのでこれでok)

どっちも結構良くなってしまった。 うーむどっちを使うべきか悩むなぁ…

問題はコレはWindowsでどう再現できるのか?という点なのですが、まぁ、自分はあんまりWin使わないので良いのですが ますますLinuxから抜け出せなくなりそうです…

M100rマウス故障→改造決行!

まぁ、またもクソマウスを買ってしまうという愚行を繰り返したこともありますが…

M100rの右クリボタンがチャタるようになりました。 保証に出そうかな〜と思ってましたが、保証って送料はどうなってるんですかね。M100rの実売価格を考えると送料のほうが高くね?と思い躊躇しておりましたが、クソマウス購入で吹っ切れました。

これはもう、かねてから考えていた改造を行う他無い、と。

そんなわけで オペを開始する! (仮面ライダーブレイブ風)

計画としては

  • 中スイッチ用のスイッチを取り出し、故障した右スイッチと入れ替える。
  • 中スイッチの場所からワイヤーを伸ばしてその先に新しいスイッチを付け、中スイッチをサイド化

です。

まず、開腹して作業の為にホイールだけ取りました f:id:dothiko:20161015102420j:plain

そしてあっさりとボタン除去。 f:id:dothiko:20161015103236j:plain

これには、はんだシュッ太郎が大活躍です。 一家に一本はんだシュッ太郎!

というぐらいオススメしたい工具です…が、なぜかもうNEOしかない模様? いままでのシュッ太郎は30Wだったと思うのですが、45Wもあって大丈夫なんだろうか…?

まぁともかく。 なおスイッチはタクトスイッチにしました。これを筐体にテキトーに開けた穴に差し込んで固定。 f:id:dothiko:20161015103521j:plain

見て下さい、このものすごいフィット感…まるで最初からついていたかのようだぜ… f:id:dothiko:20161015103659j:plain

なお、現時点での固定はのちのち調整することも考えてホットメルトで行っています。まぁ、ホットメルトで十分な気もしなくもないですが、できればABS材+アクリサンデーで強力合体したいところ。

最終的にはこうなりました。 f:id:dothiko:20161015103749j:plain

そしてブラウザのジェスチャアドオンの起動ボタンを中ボタンに変更。まぁ、これは考え方次第というか、xmodmapで中ボタンを戻るボタンにマップしちゃうのも手かもですね。

いや〜、それにしても、(今の所)実に使いやすい。ホイールの押しこみって前々から嫌いだったんですが。

CAD周りで純3ボタンを探している方も散見されますが、改造してホイールを取っ払ってスイッチ付けちゃうのもありかと。

追記:中ボタンから戻るボタンへの変更について

他のエントリでも書こうと思いますがとりあえず、xmodmap -e ではホイールの中ボタン2を戻るボタン9にマップすることはできないようです。 何故なら、ボタン数を超えるボタンにはマップ出来ない…のだそうです。(evdev emulatewheelはエミュレーションだからokらしい)

そこで、xbindkeys & xvkbdを使うという手も考えて実行したのですが、これにはとんでもない問題点が。 バイスを限定出来ないため、タブレットの中ボタンまで戻るになりペイント系ソフトの中ボタンスクロールが全滅

そこでもしかして、と思ったらやっぱりありました。xinputにそういう機能がある。set-button-mapです。

xinput --set-button-map "Logitech USB Optical Mouse" 1 8 3 4 5 6 7 8 9 10 11 12 13 14 15 16

これにて、M100rのサイド中ボタンのみが、サイド戻るボタンとして機能します。

サイドでは、ジェスチャ起動のようなホールド操作より、ワンショット操作のこっちのが良いかも知れない…

反省などについて

何より、自分がわかっていながらまたも愚行を繰り返したという情けない有様。 ああ、釈迦の教えにきちんと従っていれば…orz

そもそもM100rを買ったのは「足るを知る」ためではなかったのか。自分のバカ!バカバカ!

そんな必要十分なM100rを横目に、クソマウスで2000円を気前よくドブに放り込んでしまったワタクシ… クソマウス2000円ぐらいいいじゃん、という心の広い考え方もあるのでしょうが

  • 「これってつまり、新しいマウスを買うときに2000円追加して買ってるのと同じだよね?」
  • 「それってカカクコム最高値サイトでわざわざ買ってる感じじゃない?」
  • 「てかM100rが3個買えない?」

という心のつぶやきがオイラを責める…脳内嫁に責められてる感じでw

っていうかこれで5個目ですよクソマウス。LS-1Tがイマイチフィットしないのに始まり、サンワサプライナカバヤシエレコム、そしてバッファローか…

ここまでクソマウスに手を出してしまう理由は、ロジクールの有線マウスがもうほとんど放置状態になっているのと、マイクロソフトのマウスが息をしてない状態になっているのが原因なわけでした。

つまり内心焦っていると。

それで「PCが衰退しているのでマウスも売れないので衰退」というありがちな仮説に加えもうひとつ、「マウス界二大巨頭以外の安マウスが使い物になる時代が来ているので衰退しているのでは?」という仮説を脳内で提唱してみたのですが…

しかしまぁ、それはあながち無いわけでもない感じですか。というのも、ここでクソマウス呼ばわりしている安マウスたちは、オイラの手にマッチしないだけで、多分手の小さい人が使えば問題ない気がするからです。ってかワシの手巨大すぎない…?

まぁ、いまやマウス各社の主戦場となっているゲーミングマウスが最後の希望かもしれない…けど、ゲーミングはボタン多いのがちょっと。

ボタンが多いのがなぜいけないのか?と言えば、それに依存するからなのですよ… 間違いなくいろいろな機能を割り当てたくなる。 そして、それに依存しきった頃にディスコンとかで消えてまた右往左往するのですな。それが怖い。

まぁ心をしっかりと持ち、いつ使えなくなっても心が動揺せぬよう執著を離れればゲーミングマウスを使う境地に達するのかも知れない…

ちなみに、無線ではロジクールのm325tは実に使いやすいです。安いし。てか、m325tは有線並の反応速度で持ちやすくてチルトホイールがあり電池一本で軽く、その上電池交換を忘れきるほどに超長持ちで、何一つ言うことないです。

ボディは超小さいんですが、何故かワタスの巨大な手にフィットする不思議な形状。つまみ持ちしやすいのでしょうか。

じゃあそれ使えよ!って感じですけど無線なのがねぇ… Wifiに加えPS4のコントローラとかみんな無線で、2.4GHz帯やばすぎないか?と思ったりしているのです。

LinuxにおけるDualshock3(PS3) & DualShock4(PS4) とMednafen向け設定について

(正確にはDualshock3ではなくホリの「ホリパッド3ターボプラス」なのですが、DualShock4の方は正真正銘のPS4のDualShock4です。)

このDS4をXubuntu 16.04のPCにUSBケーブルで差し込んだ所…(当たり前なのでしょうが)普通にジョイパッドとして認識しました。 面白いことにタッチパッドも対応しています。すごい!! このDS4タッチパッド、jstestで見ると、どうも絶対座標のデバイスとして認識している模様。

それで欲が出て、DualshockエミュレータのMednafenで使えないか?と思ったのですね。まぁ、とりあえず連射機能のあるホリパッドのほうを。眠らせておくのもアレですし。

なんでDualshockをつなげておきたいかというと、いつの日か、両スティックを移動と射撃に利用した今風スタイルの360度シューターで、SNKの「怒」とか洋ゲーの「Smash TV」をインスパイアしたのを作ってみたいという壮大な野望があったりするからでして、まぁ、いつになるかは不明ですが(^^;

さて、Mednafenはユニバーサルなエミュレーターで、将来的には手持ちのROMカセットを全部吸いだしてプレイしたい所(^o^)ですが、現在そんなものがなくてもフリーで公開されているHomebrewなファミコン(NES)ゲームがいくつかありまして、これがまた完成度が高い!のでした。

一方、残念ながらDS3/DS4には十字キーとアナログスティックを切り替える方法が無いようです。いやあるかもですが、とりあえずワタクシは知らない。何も設定しないままだと、アナログスティックでの代用でもっさりなプレイをすることになる…

さてそこで気づいたのですが、必死になって「この十字キーのハットスイッチをmednafenで方向キーに使えないか?」と思ったのですが、よくよくjstestの出力を見てみると、今までハットスイッチと思い込んでいたこのDS3/DS4の十字キー実はハットスイッチではない

他の軸のデバイなのですね。axis 0/1が左スティック、axis 2/3が右スティックで、 axis 4/5が方向キーです。

注:しかし、何故かopenmsxではaxis4/5ではなくhat0として認識する模様…

あとDS4は面白いことに、L2/R2を押すと、専用のアナログ軸と同時にボタンとしてもON/OFFされます。

ともかく、かなり時間を無駄にしてしまいましたが…

Mednafen側から設定も出来るようですが、物凄くわかりづらいUIだったので~/.mednafen/mednafen-09x.cfgを手動設定しました。

;nes, Port 1, Gamepad: A
nes.input.port1.gamepad.a joystick 0cb8f90ec3ed0f96 00000003

;nes, Port 1, Gamepad: B
nes.input.port1.gamepad.b joystick 0cb8f90ec3ed0f96 00000000

;nes, Port 1, Gamepad: DOWN ↓
nes.input.port1.gamepad.down joystick 0cb8f90ec3ed0f96 00008005

;nes, Port 1, Gamepad: LEFT ←
nes.input.port1.gamepad.left joystick 0cb8f90ec3ed0f96 0000c004

;nes, Port 1, Gamepad: Rapid A
nes.input.port1.gamepad.rapid_a joystick 0cb8f90ec3ed0f96 00000002

;nes, Port 1, Gamepad: Rapid B
nes.input.port1.gamepad.rapid_b joystick 0cb8f90ec3ed0f96 00000001

;nes, Port 1, Gamepad: RIGHT →
nes.input.port1.gamepad.right joystick 0cb8f90ec3ed0f96 00008004

;nes, Port 1, Gamepad: SELECT
nes.input.port1.gamepad.select joystick 0cb8f90ec3ed0f96 00000008

;nes, Port 1, Gamepad: START
nes.input.port1.gamepad.start joystick 0cb8f90ec3ed0f96 00000009

;nes, Port 1, Gamepad: UP ↑
nes.input.port1.gamepad.up joystick 0cb8f90ec3ed0f96 0000c005

ジョイスティックは/dev/input/js1のような変わりうるノードではなく、GUIDで設定できるので極めて便利です。 GUIDはコンソールからmednafenを起動した時に一覧が表示されるため、そこからコピペすればよいです。

つーか、この方式ならば、余ってる昔のシンプルなUSBパッドをDualshockと同時挿しで全く問題ないわけで、極めて便利でナイスな設計ですが、それをやったら今回のエントリの意味が完全に消失してしまうのでこのまま参ります。

Mednafen特有の方向キーの設定がミソで 00008004 というのは、「jstestで見える4番目の軸が正方向の値の時」と言う意味で、 0000c004とは、「jstestで見える4番めの軸が負方向の値の時」という意味だそうです。

その他は、jstestで見えるボタン番号となります。

f:id:dothiko:20161009000314j:plain

Bladebusterが動いてるっ! 楽しいィィィッ!

それはともかく、MednafenはLYNXにも対応しているのです。 なんとかしてATARI LYNXのカートリッジのイメージを吸い取りたいところです…

ていうかコレ、PCEngineにも対応してるんですね? ライザンバー2とか駿河屋で買ってきてDVD-Rドライブから即プレイ出来たりしたら嬉しいのですが…

MednafenとPulseaudioでの問題

書き忘れていましたがどうも、Pulseaudio環境下ではalsaがbusyということで音が鳴らないっぽいです。この解決方法はいくつかありまして

  • -sounddevice sdl オプションで起動する
  • mednafen-09x.cfgのsound.driverエントリをsdlにする
  • sound.driverはdefaultもしくはalsaのままにして、pasuspenderコマンドを利用する

しかし、sdlは非推奨とのことです。内部的な処理の問題か?CPUにどれだけ余裕があってもsdlオプションだと描画がもたつく場合があるっぽいです。

そこで、Pulseaudioのpasuspenderコマンドを利用して、

pasuspender mednafen ~/roms/bladebuster.zip

のように起動すると、その時だけpulseaudioがサスペンドされmednafen実行終了とともに復帰します。このため、alsaで問題なく動くようです。

なお、pasuspenderでは、たとえばAudaciousなどのアプリで音楽を鳴らしていると、pasusupender実行中は音楽が停止します。この方が便利でよいかもしれない…

mayu向けにsystemdのserviceを書いてみた件

考えてみると半年ぶりのエントリだったのか… 三ヶ月ぶりぐらいの気分でいたわけですが…恐ろしい時間の速さ。 どこぞの神父のスタンド攻撃でも喰らっているのでしょうか。それはともかくsystemdだ。

ubuntu 16.04ではsystemdになっているので、daemonも書き直しな感じです。いや、多分なんか互換レイヤ的なものはあるのでしょうが、せっかくなので書きなおして見たかった。前に書いたのは、かなりとんでもなくやっつけだったし。

そんなわけで、mayu(linux窓使いの憂鬱)を自動起動させるべくsystemdのserviceを書いてみたのです。

serviceファイル

ググッて出たサイトの皆様を参考にしました。本当にありがとうございました。

[Unit]
Description=run mayu command
After=basic.target

[Service]
Type=simple
RemainAfterExit=yes
User=root
ExecStart=/usr/local/bin/mayu

[Install]
WantedBy=multi-user.target

とはいえ、全て完全にオイラのやりたいことに合致しているサンプルというものは中々見つからず…

正しいかどうかはイマイチ良くわからないのですがこれをmayu-call.serviceとし、/etc/systemd/systemに直接投入。 シンボリックリンクで置いたら、systemctl enable mayu-call.serviceとしたとき「リンク多すぎてわかんねーよ(意訳)」的なエラーが出たのでそうしました。他のは全部シンボリックリンクなのに何故…

User指定が無いと何故かmayuが動いてくれなかった気がします。(試行錯誤の末なので、不確か)

あと.mayuファイルがどうもrootのしか見てくれないっぽいんで/root/にコピー。シンボリックリンクでも良い気がするのですが、とりあえず試行錯誤中なので不確定要因を排除する意味で…まぁ、.mayuを書き換えることももはや無い感じですし。

後はよくある

sudo systemctl daemon-reload
sudo systemctl enable mayu-call.service
sudo systemctl start mayu-call.service

で、リブート後も一応動いているのです。

うーむ、良いのではないですかねsystemd?? なぜあんなにアンチが多いのか不思議。

PCのサウンド環境とオーディオ沼の恐怖

新マシン建造直前に、唐突にPCのサウンド周りを改良し始めました。

これは特に音質の改善を目論んだものではなく、単に3.5mmミニプラグの接触が時折悪くなりサウンドが出ない、片方のチャンネルが出ない…ということがよくあったため、接触を改善するにはいくつかの候補がありました。

SPDIFでD/Aコンバータに接続する

これは完璧なわけです。しかし現在ブルーレイプレイヤーに接続してるD/Aコンバータを使って以前やってみましたが、音が痩せるというのを実感した感(安物D/Aゆえ?)。そしてブルーレイプレイヤーは同軸なので、光出力のH77Mとはセレクターを共用できない…等の問題がありまして。 まぁ、同軸→光コンバータを購入もしくは自作すればいいのでしょうが…これはこれでまた、無意味にコストが上がるというか、DAコンバータをもう一個買うのと全然変わらないですよね。どうしたもんだか。

あと思いついたのが光出力を同軸化し、機械式のAVセレクタを切替器にするというところでしょうか。可能であれば。これならアナログの機械式切り替えと違い音質劣化もないと思えます。

ただしかし、ともかくそれより何より、どういうわけか、skylake世代のマザボにはSPDIF端子がほとんど存在しない。辛うじてASUSのものにはヘッダが存在するぐらい。

今や、HDMIやDPでデジタル接続がデフォで普通なのでしょうね。デジタル高音質接続が究極に一般化した結果こうなるとは、なんだか時代の流れを感じて寂しくなりました(´・ω・`)

RCAピンプラグで接続する

通常のオンボードオーディオにはRCAピンプラグは存在しません。そこで思いついたのがフロントパネルオーディオをRCAピンプラグに変換するブラケット。 売ってないかな〜と思いましたが売ってない。

この解決方法が最もローコストかつ、今使用しているシステムと最も親和性が高い。

そういうわけで古いビデオキャプチャカードからブラケットを外して自作しますた。参考にしたのは

Want to use Intel HD Audio Header for Line In and Line Out, Any Suggestions? - MP3Car.com

です。ここではEMIフィルタを提示していますが、めんどくさいのと普通のATXケースのフロントオーディオにこんな立派な回路が付属しているのを見たことがない気がするので、まぁ多分いらんだろという感じで無視してみました。

f:id:dothiko:20160906205315j:plain

f:id:dothiko:20160906205319j:plain

こんな感じですね。ピンヘッダに抵抗ポン付けして適当な同軸ケーブルでひっつけただけという…ちなみにビデオがアナログRGBで接続されているのは、Xubuntu 16.04インスト移行時の一時的措置です。

こ、これがPCオーディオの実力なのか!

んで接続してみたらもうなんですか、音の太さが違うんですよ。

今まで聞いていた音はなんだったのか…と言う感じで。

ちなみにAsrock H77Mの時点で既にこんな感じの違いを感じました。ASUSのH110にして更にちょっと良くなったか?ような?気分ですがw

特に、自作のヘッドフォンアンプから聞こえる音は凄い良くなったというか、「これがハイレゾだ!」とか嘘つかれたら信じてしまうぐらいに。

結論としてはケーブルで音が変わるというのは本当にあるんだなと。とてつもなく低いレベルで。

要するに聞こえるべき音を1.0とすると、 それを0.3とか0.1にしてしまうケーブルが世の中には氾濫していて、それが0.7とか0.8になると人は「ケーブルで音が良くなった!」と思っているのではないかという仮説を思いつきました。

んでもって中華アンプ+スピーカーまで買ってしまった

そんなわけで昨今話題になってた中華アンプを今更手にしてみました。 そう、デジタルと勘違いしてフルアナログのLP-V3Sをゲット!(涙

…1700円ぐらいだったから許そうというか、まぁそんなに劣るものでもないどころかデジタルのLP-2020Aなどより良い場合もあったりするようです。ググッて読んでいる間に知ったのですが、なんでもそのLP-202X系のウリであるTripathのICはもうない?っぽいんで、多分Lepyとしても今後の展開を考えているのでしょうねぇ…

しかしやっぱり微妙に理不尽に感じたので改造だ。といっても知識は殆どないので出来ることはコンデンサオペアンプの載せ替えだけですが。コンデンサを余っていたオーディオグレードのものに変え、オペアンプはOPA2134に交換。

f:id:dothiko:20160906205322j:plain

なんか、音が良くなった感がします。特にトーンコントロールをしても音質悪化があまり感じられないというか。

スピーカーはヤマハのNS-BP200を考えていたのですが、サイズが微妙に大きいのと、設置場所が壁が近いので後面バスレフはまずいか?と思い、ONKYOのD-55EXにしました。いずれ、BP200も買ってみちゃうかもですけどね(汗

今まで使ってたBoseのCompanion2 series2との比較になりますが… LP-V3Sは電源切った時のポップノイズも有りませんし(Companion2は小さいポップノイズがあった)、また、経年劣化でCompanion2は小音量だとギャングエラーを発するようになってたんで、この新しい中華アンプ+スピーカーシステム、結構気に入ってます。

今思えば、かつて「鎌ベイアンプ」を使ってた時、このように手元に設置しておればよかったのでは?と思いましたが既に処分してしまったわけで、後の祭りナリ…

今まで使ってたBoseのCompanion2 series2との比較は…正直もうしあげて現時点ではやや微妙ですが、コストを考えると半額ぐらいで同等のレベルになったのと、アンプを手元に設置して即座に制御できるので操作性が向上しました。

逆に言うとあのサイズとあの価格であの音を出すBoseってすごいなーと思います。

まぁしかしちょっとエージングが進んできたのか?なかなか良い音を奏ではじめました。 このシステム、特にクラシックやサウンドトラックでは解像感と広がりがあっていい音を出します。このへんはCompanion2より向いてる感。 キングゲイナーの「オーバースキル・スムース!」なんかとても良いです。 そしてこの曲もいい音を出しますぞ〜

実はプリキュアとか見ないんですけどスイプリは音楽が良いですね。 それに空間構成というんでしょうか?実によい動きをしている。

新規skylakeマシンを建造しXubuntu 16.04.1をインストール & mayuをコンパイルできた!

Linuxに最新のデバイスは全く良くない… そんなふうに考えていた時期が 僕にもありました

しかしながら、あまりにも32GBメモリが安いのでついつい、まぁ、どうせ将来的にはこれも古くなるんだし…的な発想で。 ASUSのH110M-A M.2とPentium G4500で作ってみました。

今まで使ってたのがCore i5の3470Sという微妙なヤツということもありますが、実際、実家マシンのPentium G2030を使っていて、Pentiumだからおっせーわと思ったことは、ほぼ思い出せないのです。大抵忘れきってる。 つまり、おいらの用途(ネットとお絵かきとライトなプログラミング)では、i5はオーバースペックというわけです。

さらに言えば、まぁなんつーか釈迦や老子の教えに少し従ってみたというか、せめてスペックに対してだけでも、少しづつ無意味な執著を減らしていけたらなぁと…それで、i3よりPentiumを選んでみました。

貼ってみたらなんかG4500の値段が高い感。Amazonのが売り切れてるせいでマーケットプレイスのが出てるようですね。コスパ高くて人気なんですかね?

さすがにまだ新しいためグラフィック周りはデュアルモニタなど現時点では宜しくないとのことなので、HWEを待つというのもなんなので前々から欲しかったNVidiaのGTX750Tiを買ってみました。ツクモ特価で10500円ぐらい。 念願のDisplayportがついたやつなのですが、このDisplayportは4K出来ないので実質あまり意味がないという。

今時950との価格差も詰まってきて750というのも躊躇したのですが、どうも安い950はファンが煩いのばかりのようで時期尚早と判断しました。結構長い人生で、特にパソコン関連では、将来を見据えた購入がろくな結果をもたらした記憶がないのですな。 4Kについてもどうせ、それが主流になる時はインテルオンボードで十分とか、超ローエンドでデスクトップならサクサクになるわけですから。

そういう意味では32GBのDDR4とかもどうなのか?と思わなくもないのですが、まぁこれはいいだろうということで。

信頼のブランドクルーシャルを購入しました。

何よりもまず、memtestでハマる

しかしながら最近はEFIが当たり前だそうで、それでmemtestはEFIではgrub2の起動リストに出ないということを知らず。 memtestが出ないため焦りまくりました。 これは結局のところ、

  1. XubuntuのUSBブートスティックを挿してUEFIセットアップ画面に入る
  2. Boot Menu(F8) を選択してブート選択、この時USBスティックはEFIとそうでないほうがでるので、EFIでないほうの項目を選ぶ。
  3. Failed to load COM32 file menu.c32 みたいなメッセージを出してコケるので、tabキーを押して候補を出してみる。
  4. たしかこのときmemtestがあるはずなので、memtestと入力してやるとmemtestが起動する

というわけでした。個人的に2パスでokということにしているので問題なく通過。6時間かかりました…

Xubuntu 16.04.1 をインストール

ここでもハマりました。普通に起動はしてインストーラーが立ち上がるのですが、mp3のプロプラソフトとかをインストールするかという項目にチェックを入れると、延々そこで止まってしまいます。 後にlameとか入れれば不要なんでここはチェック無しで!

ここでX(U)buntuとは関係ない個人的ハマりを迎える

気分転換でユーザー名を変えてみたんですよ。そしたらもうひどいめにあいました! chown -R で大丈夫だろとか思ったら、設定各所に自分のユーザー名を決め打ちしているので全部書き直しですわ… そしてシンボリックリンクも全部張替え…何か、自動で張り直してくれる方法はあるのでしょうか… 結局、自動張り直しソフトをpythonで自作するという有様です。

最後にmayuがコンパイルできず…しかし!ついにコンパイル

さて、mayuです。これがboost絡みと言う実にどうでもいいところで./configureすらできず… ここはまずこれで回避

 ./configure --with-boost-libdir=/usr/lib/x86_64-linux-gnu/

次にmakeすると以下のようなエラーで止まります

msgstream.h:205:7: error: ‘setp’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
   setp(m_buf, m_buf + SIZE);

ググったら似たようなエラーを出す別のソフトのコンパイルの例があり、それではthisポインタを指定してやればいいと出たのでmsgstream.hの全部のsetpをthis->setpに書き換え。 そうしたらコンパイルが通りました。

なお、確か14.04の時も何かコンパイルが通らなくて書き換えた記憶があるんで、大元のソースからコンパイルするにはいろいろ書き換えないとダメかもですね… たしか、そういう内容の記事を以前書いたような記憶もあるのですが。

正直、OSアップグレードの度にmayuが動かなかったらどうしよう…とビビリ上がっているので、ここまで高機能でなくていいのでわかりやすいソースで自作したいという気持ちがフツフツと湧いてきたり。

あと変えたとこ

相変わらずfcitxのmozcアイコンがでかすぎるので、20x20pxぐらいにリサイズしたもので/usr/share/fcitx/mozc/icon/mozc.pngのショートカットを置き換えました。そうしないと日本語入力のたびにリサイズが毎回入るのでうざくてかなわないのです。

新マシンの感想

以前使っていたi5 3470Sと比べると、グレードダウンになるわけですから多少覚悟はしていたのですが、意に反してなかなかサクサクです。シングルスレッド性能では上回ってるっぽいのでそういうことなんでしょうか?それともメモリの速度が上がったからなのでしょうか? あるいはグラボをプロプラではなくそのままのnuveauドライバで使ってるからでしょうか。 心配していたサウンドもネットも全く問題ありません。昔は、新しいマザボなんぞにLinux入れようもんなら運良く動いても、オンボLANが使えない音が鳴らないは普通でしたけどね…いい時代になりました。

Xubuntuも日本語関連殆ど何もいじってないのですが、何も考えずとも日本語がこうしてバリバリ書けています。恐ろしい時代だ。

気が大きくなって、/tmpにtmpfsなラムディスクを1GB、ブラウザのキャッシュに2GB割り当てるという豪勢過ぎる構成。こういうことが簡単にできるからLinuxはやめられない…

ともかく、大満足の新型ローコストマシンとなりました。(今のところ)

MyPaintにPolyfilltoolを実装しています

MyPaint私家版にさらにPolyfilltoolを実装ッ!(途中)

イデアとしてはこうです。

「brushlibを弄ってポリゴンフィルを付けるのは面倒だが、pycairoで描いてそのサーフェスをgdk.pixbufに変換しさらにそれをmypaintのレイヤのメソッドload_surface_from_pixbufで流しこめば簡単に出来るのではないか?」

…と思って、思い立ったらガマンできない堪え性のないワタクシ *1は早速着手しました。

と思ったんですが、着想はよかったものの、中々上手く行かず。pycairo、gtk、そしてmypaintのクラス群と、分からない要素の数々がオイラを責め立てる…

しかし数日間の苦闘の後!!

遂に!!

遂にレイヤに描画することに成功しました!!!

f:id:dothiko:20160313141327j:plain

まだUIは作ってないけどグラデも出来る!

f:id:dothiko:20160313143914j:plain

Cairoにはメッシュグラデも実装されており、UIさえ作ればグフフのフっと…*2

とりあえず描画部分のコードだけ置いときますね(´・ω・`)

MyPaintソースの様々な部分からのコピペ多し…

            sx, sy, ex, ey = self._get_maximum_rect(None)
            sx = int(sx)
            sy = int(sy)
            w = int(ex-sx+1)
            h = int(ey-sy+1)
            surf = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h)
            cr = cairo.Context(surf)
            _draw_node_polygon(cr, None, self.nodes, ox=sx, oy=sy,
                    color=self.foreground_color)
            surf.flush()
            pixbuf = Gdk.pixbuf_get_from_surface(surf, 0, 0, w, h)
            layer = lib.layer.PaintingLayer(name='')
            layer.load_surface_from_pixbuf(pixbuf, int(sx), int(sy))
            del surf, cr

            tiles = set()
            tiles.update(layer.get_tile_coords())
            rootstack = self.doc.model.layer_stack
            dstlayer= rootstack.deepget(rootstack.current_path)
            dstsurf = dstlayer._surface
            for tx, ty in tiles:
                with dstsurf.tile_request(tx, ty, readonly=False) as dst:
                    layer.composite_tile(dst, True, tx, ty, mipmap_level=0)

            bbox = tuple(dstlayer.get_full_redraw_bbox())
            dstlayer.root.layer_content_changed(dstlayer, *bbox)

これが出来ると何が良いのか?と申しますと、かつてgimpがメインだった頃一時期凝っていた「パス塗り」が、gimpよりも遥かに簡単に手間なく出来てしまう点。

あと、このpixbuf変換 + レイヤ操作をマスターすれば…OpenCVを使った何らかの操作すら可能だろう…ということ…!!(利根川幸雄風

*1:いや〜この性格、マジに物理学者とかでなくてよかったですな…地球破壊爆弾とか思いついたらどうなっちゃうんだろ。オイラの頭が悪かったことに地球人類は感謝しなければならないと思う

*2:思ったんだけどまだpycairoでは対応してないみたい orz