モダンmacOS向けにGriffin PowerMateを復活させる

2000年代初頭を覚えている人にとって、Griffin PowerMateは単なる周辺機器以上の存在でした。それは、触覚的な贅沢品でした。回したり押したりできるシンプルで頑丈なノブは、もともとオーディオやビデオ制作を効率化するために設計されたものでした。現代のコントローラーは、さまざまな画面やボタンを備えていますが、PowerMateの回転入力に特化しているという「古風な」魅力があります。

長年、これらのデバイスは「ガラクタUSB引き出し」や屋根裏部屋で埃を被ってきました。その主な理由は、現代のmacOSバージョンに、それらを機能させるために必要なドライバーが欠けていたからです。しかし、Griffin PowerMate Driverというオープンソースプロジェクトのリリースにより、その状況は変わりつつあります。このプロジェクトは、このクラシックなハードウェアをmacOS 13以降でシームレスに動作させることを可能にします。

ドライバーの仕組み

Griffin PowerMateは、特定のVendor ID (0x077d) と PID (0x0410) を持つUSB HID (Human Interface Device) です。ドライバーは、USB HIDを介してデバイスを「捕捉」することで動作し、macOSのデフォルトの動作をバイパスして、生のイベントをアプリケーションに直接配信することを可能にします。

データプロトコル

デバイスは6バイトのレポートを介して通信します。ドライバーは主に2つのデータポイントに焦点を当てています:

  • Button State (Byte 0): バイナリ値で、0 はボタンが離されていることを示し、1 は押されていることを示します。
  • Rotation Delta (Byte 1): 回転方向を示す符号付きの値です。正の値は時計回りの回転を表し、負の値は反時計回りの回転を表します。

デバイスは速度を直接報告しないため、ドライバーはレポート間の経過時間に基づいて回転速度(1秒あたりのデルタ値)を計算します。これにより、開発者は速度に依存したマッピングを実装できます。例えば、ノブを素早く回すとスクロールが速くなる、といった具合です。

PowerMate Agent: システム全体への統合

ドライバーをカスタムアプリでライブラリとして使用することもできますが、このプロジェクトにはPowerMate Agentが含まれています。このバックグラウンドユーティリティは、生のUSBイベントを、あらゆるアプリケーションが解釈可能なシステム全体のキーボードおよびマウスイベントに変換します。

主な機能

  • Rotation: 垂直スクロールにマッピングされます。ただし、エージェントはmacOS Accessibility APIを使用して、メニューやサブメニューにフォーカスが当たっているかどうかを検知するほどスマートです。これらの場合、回転は自動的にUp/Down arrow keysにマッピングされます。
  • Clicking: 短い押し込みは左マウスクリックとして機能します。メニューにフォーカスがある場合、ハイライトされた項目を選択するためにReturnキーとして機能します。
  • Long Press: デフォルトでは、長い押し込み(しきい値は0.4秒に設定)は右マウスクリックとして機能します。

権限とセットアップ

エージェントはユーザー入力をシミュレートし、デバイスを監視するため、特定のmacOSセキュリティ権限が必要です:

  • Input Monitoring: エージェントがイベントをキャプチャして送信するために必要です。
  • Accessibility: エージェントがフォーカスされているUI要素(メニューなど)を検知して、スクロールと矢印キーモードを切り替えるために必要です。

ハードウェアのフィードバックのカスタマイズ

PowerMateの最も満足感のある部分の一つは、基部にある青いLEDリングです。ドライバーは、このライトを制御するためのAPIコールを提供しており、システムの状態に基づいた視覚的なフィードバックを可能にします:

  • Static Brightness: 0–255の値を設定します。
  • Pulse Modes: ドライバーは、「スリープ」状態と「ウェイク」状態のための組み込みのパルスパターン、および異なる速度のためのカスタムパルステーブルをサポートしています。

開発者による実装

PowerMateのサポートを自身のSwiftアプリケーションに統合したい開発者は、ドライバーがSwift packageとして利用可能です。実装には、PowerMateDriver クラスを初期化し、クロージャまたはデレゲートを使用してイベントをハンドルします:

import PowerMateDriver

let driver = PowerMateDriver()

driver.onRotate = { delta, rate in
    // Handle rotation (e.g., adjust volume or zoom)
}

driver.onButtonDown = { /* Handle press */ }

driver.start()

コミュニティの視点

このドライバーのリリース発表は、元所有者の間にノスタルジーの波を巻き起こしました。Hacker Newsのユーザーは、このデバイスを「究極のフィidgetツール」として、また「15歳若返る」方法として表現しました。

しかし、このプロジェクトは、レガシーハードウェアの癖についても思い出させてくれます。あるユーザーは、Macがスリープ状態のときにボタンを押すとカーネルパニックが発生する可能性があるという歴史的な問題を指摘しましたが、現代のドライバーがそのような安定性の問題を解決しているかどうかは、まだ分かりません。

物理的なスクロールホイールを探しているビデオエディター、あるいはデスクに触覚的な要素を加えたい開発者、どちらであっても、物理的なハードウェアが長持ちするように作られているこのデバイスに、このドライバーは新たな命を吹き込みます。

Sources