qtamp
私は Winamp のように見えるプレイヤーが欲しかったわけでは決してありません。Winamp のスキンが本当に動くプレイヤーが欲しかったのです。この違いは、聞こえるよりずっと大きい。Modern Skin はビットマップテーマではなく、プログラムです。XML がウィジェットツリーを宣言し、コンパイル済みの Maki バイトコードが振る舞いを駆動します。引き出しが滑り出し、タブが切り替わり、ウィンドウが形を変える。そのすべてがスキン自身によってスクリプトされています。それを模写した人が手にするのは、きれいなポスターです。私が欲しかったのは本物でした。
だから qtamp はスキンを本物のプログラムとして実行します。qtamp は私の Qt6 ネイティブな音楽プレイヤーであり、Modern Skin エンジンの独立した再実装である qtWasabi のリファレンスプレイヤーでもあります。スキンは自身のコンパイル済み Maki バイトコードを同梱しており、qtWasabi はそれを自前の Maki VM で実行します。スキンのロジックが、2002年当時とまったく同じようにインターフェースを制御します。
名前は言葉遊びです。フレームワークとしての "Qt"、そして cute としての "qt"。Qt ネイティブな Amp、そして願わくは可愛いやつ。
どう始まったか
始まりは私ではありませんでした。qtamp は lord3nd3r による Qt ネイティブ移植である winamp-linux から生まれました。彼のリポジトリには "make the Modern skins work" という Issue があり、この一文が私の頭から離れなくなったのです。
というのも、Modern Skin を動かすというのは、グラフィックをいくつか読み込むという話ではないからです。2002年に Winamp3 が Wasabi エンジンを世に出し、Winamp 5 がそれを Modern Skins(.wal)として引き継ぎました。この種のスキンは何千と作られ、そのどれもが独自のロジックを持っています。それらを1つずつ作り直すのは選択肢になりませんでした。残ったのは妥協のない道だけです。完全な Maki VM を作り、それぞれのスキンを、それがまさにそうであるところのプログラムとして実行することです。
忠実さへの執着
この決断から、私が早い段階で自らに課したルールが生まれました。スキンごとのコードは存在しない。あるスキンの描画や振る舞いが間違っているなら、それはエンジンのバグであり、qtWasabi で修正されます。世に出ている何千ものスキンが、そのまま仕様書でありテストスイートでもあるわけです。正しく描画されないものは、qtWasabi の忠実度監査で公開して追跡しています。qtamp.org のショーケースには、作者が作ったとおりに寸分違わず描画されるスキンだけを載せています。
この執着がどれほど深いかは、カラーパイプラインが物語ります。Modern Skin はカラープリセットを持ち込みます。ガンマセットのテーブルが、スキングラフィックの各要素グループを実行時に塗り替えるのです。qtWasabi はこのパイプラインをバイト単位で再現し、Winamp の GammaFilter と同じ整数演算を使います。だからスキンのプリセットは、その作者が調整したとおりの見た目になります。独自のプリセットを持たないスキンのために、エンジンはカラーテーマを合成することもできます。これは厳密にオプトインで、独自のプリセットを持つスキンには手を触れません。
それでも、いちばん美しい瞬間は毎回同じです。20年以上前のスキンが読み込まれ、その引き出しが滑り出し、そのタブが切り替わる。そしてそのどれ1つとして、私がプログラムしたものではない。それを書いたのは、当時のスキンの作者です。
Classic と Modern
Modern Skin で終わりではありません。クラシックな Winamp スキン(.wsz)も qtamp は同じように鳴らします。winamp-linux 由来として受け継ぎ、私が引き続き手入れしている Qt ネイティブの Classic レンダラーを通じて、イコライザーのスキン対応も含めてです。Modern Skin が用意されていなければ、qtamp は自動的に Classic の経路へフォールバックします。
日常のためのプレイヤー
その周りで、qtamp はちゃんとしたプレイヤーになりました。FLAC、MP3、OGG、Opus を再生し、10バンドのイコライザーと、スキン自身が描画する本物のプレイリストエディターを備えています。メディアライブラリは音楽フォルダーのタグから DuckDB と Parquet でインデックスを構築し、アーティスト、アルバム、タイトルによるドリルダウンとライブフィルタリングができます。さらにビジュアライゼーションとして projectM、Linux では MPRIS2 も加わります。
その中で1つ、私にとって特に重要だったことがあります。すべてが Apple Silicon と Asahi Linux 上でネイティブに動くことです。それが私の日常のプラットフォームだからです。Wine もなし、x86 エミュレーションもなし、スタック全体を通して aarch64 です。それに加えて qtamp は主要な Linux ディストリビューション、macOS、そして WebAssembly ビルドとして Chromium 上のブラウザーでも直接動きます。Windows は計画中ですが、まだありません。
ウィンドウのないプレイヤー
私のビジョンはデスクトップの外に広がっています。私は qtWasabi を Winamp 的なプレイヤーのためのフロントエンドフレームワークへと作り替えているところです。ちょうど React が Node サーバーに対して持つような関係です。その中でプレイヤーは独立したバックエンドサービスであり、インターフェースは接続して描画するだけのヘッドにすぎません。ヘッドはプレイヤーと GraphQL だけで会話します。これにより qtamp はウィンドウなしのヘッドレスでも動き続け、デスクトップ、ブラウザー、あるいは別のマシンにあるヘッドが同じ状態に接続します。全員がすべてにおいて同期を保ちます。タイトルからイコライザー、プレイリストに至るまで。
その基礎はもう着地しています。フロントエンドは内部で GraphQL を話し、WebAssembly ヘッドも同じ道を使い、プレイヤーとインターフェースの分離はコード上で完了しています。遠隔操作可能なプレイヤーやボットへの拡張は進行中です。そして qtamp 自身は qtWasabi の一利用者にすぎないので、他のどんな Qt ベースのプレイヤーでも、同じようにエンジンを組み込めます。
qtamp ではないもの
qtamp は意図的に、機能てんこ盛りのプレイヤーではありません。インターネットラジオのディレクトリも、ポッドキャストマネージャーも、音楽ストアとの連携もありません。あなたが qtamp に自分の音楽フォルダーを指し示せば、あなたの音楽が鳴る。私のエンジニアリング予算はスキンの忠実さに置いたままです。今日、機能的に完全な Winamp の後継を探している人には、WACUP か Audacious のほうが向いています。Winamp のスキンを Apple Silicon と Asahi Linux でネイティブに動かしたい人には、ここが正解です。
もう少し線引きをしておきます。Qmmp や QAmp とは名前が似ていても qtamp は無関係で、qtamp は一から新たに書かれています。古い Win32 の Winamp プラグインは読み込めません。qtamp はクラシックな Winamp プラグイン種別を手本にした、独自の Qt ネイティブなプラグインプロトコルを話します。そして qtamp のリポジトリに Winamp のソースコードは1行もありません。
クレジットとライセンス
始まりは lord3nd3r と彼の winamp-linux のものです。ショーケースのスキンは 0x5066 によるものです。qtamp.org に掲載しているスキンはすべて MIT ライセンスで、クレジットを付けたフォークとして github.com/qtamp で管理しており、私が変更したのはタイトルバーのブランディング文字列だけです。プロプライエタリな Nullsoft のスキンは意図的に掲載していません。
qtamp と qtWasabi のうち私が書いたコードは MIT ライセンスで公開しています。qtWasabi は独立した再実装であり、フォークではありません。他者のコードは同梱もしませんし、再配布もしません。ビルドのために他者のオリジナルソースが必要な人は、自分で入手し、自分に適用されるライセンス条件を確認してください。qtamp は Winamp LLC とは関係がなく、Winamp はその権利者の商標です。
さらに読む
- ウェブサイトとブラウザープレイヤー: qtamp.org
- ソースコード: github.com/qtamp/qtamp
- スキンエンジン: github.com/qtWasabi/qtWasabi
- qtamp をインストールする