Mac 向けの音楽プレイヤーは不足していませんが、その多くは同じ三つの理由で物足りません。開発が放棄されている、ウインドウの中身が Web アプリである、あるいは FLAC の入ったフォルダを例外扱いするストリーミングクライアントである、のいずれかです。Bòcan が狙っているのはまさに三つ目の問題です。自分で持っているライブラリを中心に据えたネイティブな Swift 6 / SwiftUI アプリであり、README はプロジェクト全体を説明する一文、つまり Electron なし、Catalyst なし、サブスクリプションなし、クラウドなし、で始まります。
この規模のプロジェクトとしては異例なほどドキュメントが充実しています。リポジトリは 2026 年 4 月に作成され、現在のリリースは 2.16.0、ライセンスは Apache-2.0 です。今日すぐ導入できる実際のリリース版と、読むことも自分のコードに取り込むこともできるソースの両方が揃っている。この組み合わせこそ、ブックマークではなく記事にする価値がある理由です。
何ができるのか
フォルダを指定すると、そこにある音楽をインデックス化します。ブラウザは三つのペインで構成されます。左にソースとプレイリスト、中央にグリッドまたはリスト、右にトラック一覧です。アルバム、トラック、アーティスト、ジャンル、作曲家、最近追加した項目にそれぞれビューがあり、どこでも入力を始めれば検索に飛びます。一文字、単語、あるいは 1984 のような年号を入力すれば、その年にリリースされたアルバムだけに壁面表示が絞り込まれます。
フォーマット対応の広さは、多くの人が驚く部分です。AVFoundation が FLAC、ALAC、AAC、MP3、WAV、AIFF、CAF、M4A をネイティブに処理します。扱いの難しい形式は統合された FFmpeg ブリッジが引き受けます。Ogg Vorbis、Opus、Monkey's Audio、WavPack、DSD、DTS、Dolby Digital と Dolby Digital Plus、そして中身が何であれ Matroska (TrueHD を含む) です。追加のプラグインは不要です。サラウンドはチャンネルの半分だけが鳴るようなことはなくステレオに折り込まれ、CUE シートはチャプターマーカーになるので、1 ファイルのリッピングでもトラック一覧が保たれます。
ライブラリ自体は読み取り専用として扱われます。スキャンがファイルを書き換えることはなく、FSEvents の監視が変更を拾い、重複は更新時刻とフィンガープリントで弾かれます。タグが欠けている、あるいは間違っている曲には、MusicBrainz に対する AcoustID フィンガープリント識別があります。変更案を提示し、現在のタグと並べて表示し、書き込む前に取り込むフィールドにチェックを付けられます。一括タグ編集 (取り消し付き)、サイドカーアートワークの自動検出、そしてシャッフルから除外フラグもあり、環境音アルバムがプレイリストに乱入してくるのを防げます。
ローカルファイルの先にも、さらに三つのプロトコルに対応します。Subsonic、Navidrome、Airsonic のサーバーは第一級のソースとして表示され、横断検索ができます。ポッドキャストは RSS、Atom、Podcast Index、iTunes 検索から取得し、Podcasting 2.0 のチャプター、文字起こし、ホスト情報も扱います。インターネットラジオはサイドバーのカタログになり、.pls や .m3u の URL を貼り付ければ中のストリームが局として展開されます。スクロブリングは Last.fm、ListenBrainz、Rocksky に対応し、オフライン時はキューに積まれます。
導入方法
macOS 15.0 Sequoia 以降が必要です。まずは GitHub Releases から署名・公証済み DMG を入手してください。公式ダウンロードページ も別の直接ダウンロード経路です。Homebrew は利用できる別ルートですが、最初に案内する配布経路ではありません。各リリースにはビルド証明も付属するため、ダウンロードした DMG がこのリポジトリのリリースワークフローで生成されたものか確認できます。
# Open GitHub Releases and download the signed and notarized DMG:
open https://github.com/bocan/bocan-music/releases更新はアプリ内の Sparkle から届きます。Homebrew を使う場合は brew upgrade --greedy bocan も利用できます。ソースからのビルドは別のコントリビューター向け手順で、前提条件は DEVELOPMENT.md に記載されています。
使い方
初回起動ではフォルダを選びます。あとは想像どおりの操作です。アルバムのカバーをダブルクリックすれば再生され、カラムヘッダをクリックすれば並べ替えられ、入力を始めれば絞り込まれます。移動はブラウザのように働きます。戻る・進むのシェブロン、多ボタンマウスのサイドボタン、⌘[ と ⌘]、そして Esc でドリルダウンから抜けられ、戻ったときにはスクロール位置も検索文字列もそのまま復元されます。
覚えておきたいショートカットは、ビジュアライザ全画面の ⌘⇧F、実験的なイマーシブモードの ⌘⇧I、ライブラリサマリーの ⌘⇧Y、ログコンソールの ⌘⇧L です。中でもライブラリサマリーは他に代わりがありません。自分のマシンの中だけで計算される六つのタブの統計で、ライブラリの衛生状態、音質、コレクションの形、視聴行動、ポッドキャストの未消化分までを扱い、番組の CM の位置まで完了率から教えてくれます。
スマートプレイリストはルールエディタで組み立てられ、ライブ SQL にコンパイルされるため、ライブラリが変われば内容も自動的に更新されます。手動プレイリストは再生中にも同期します。トラックを削除すれば Up Next が即座に調整されます。GPU 描画のビジュアライザが六種類、ミニプレイヤーのレイアウトが四種類、そして Phone Sync ペインでは、ローカルネットワーク経由でペアリングした Android 端末にライブラリの読み取り専用コピーを配信し、指定すれば MP3 や Opus に変換もします。
デモ
README には曲ビューとビジュアライザのスクリーンショットがありますが、リポジトリにデモ動画はありません。スクリーンショットで伝わらないのは、日々効いてくる部分です。アルバムから戻っても検索フィルタが残ること、再生中のプレイリストを編集しても再生位置が保たれること、並べ替えとスクロール位置が元の場所に戻ること。最初の十分間で試す価値があるのはそこです。
音声はどう処理されているか
ギャップレス再生は目玉の機能であり、その仕組みを知る価値があります。再生は AVAudioTime にナノ秒精度でアンカーされているため、ライブアルバムや DJ ミックスがトラック境界をまたいでも、通常の遷移で生じる無音やクリック音が入りません。その上に、デコーダと出力の間に DSP チェーンが載ります。10 バンドのグラフィック EQ、低音ブースト、ステレオエキスパンダー、バイノーラル・クロスフィード、ピークリミッターです。
ReplayGain はファイルに焼き込むのではなく再生時に適用され、ゲインタグのない曲はバックグラウンドで EBU R128 ラウドネス規格に従って解析されます。解析は再生と同じ経路でデコードを行うため、FFmpeg 専用のフォーマットにも値が付き、サラウンドファイルも実際に聴いているステレオ折り込みで測定されます。クロスフェードは 0 から 12 秒、再生速度はピッチ補正付きで 0.5 倍から 2 倍、スリープタイマーは音の途中で切らずにフェードアウトします。
デコーダは二つ、グラフは一つです。AVFoundation が得意なものを AVFoundation が扱い、残りを FFmpeg ブリッジが引き継ぎます。MP4 コンテナの Opus のように、システムデコーダが開けるのに再生できないファイルもそこに含まれます。プレイヤーバーは実際にデコードしている内容、つまりコーデック、ビットレート、サンプリングレート、ビット深度、チャンネルレイアウトを表示します。拡張子からの推測ではなく開いているデコーダから読むため、.m4a は AAC、ALAC、E-AC-3 のいずれかとして正しく表示されます。
コードはどう構成されているか
リポジトリは上方への依存を持たない十二の Swift Package モジュールに分割されています。Swift 開発者がまず読むべきはここです。AudioEngine はデコーダグラフと再生アクターを、Metadata は TagLib を、Acoustics は Chromaprint のフィンガープリントと AcoustID / MusicBrainz の参照を、Library はフォルダスキャナと FSEvents の監視を、Playback はキュー、シャッフル、ギャップレスのスケジューラを、SyncServer は相互 TLS による電話のペアリングを担当します。永続化は GRDB 7 で、FTS5 の全文検索とリアクティブな ValueObservation ストリームを備えます。
規律は目標ではなく要件として書かれています。@MainActor 分離と Sendable 準拠による Swift 6 の厳格な並行処理、下回るとビルドが失敗する 80 パーセントの行カバレッジ基準、実際の UI を操作する E2E テストスイート、そして .pbxproj を手編集しないための XcodeGen です。SwiftLint、SwiftFormat、gitleaks、Snyk がすべてのプルリクエストで走り、更新は署名されたフィードに対応する Sparkle から配信されます。
足りないところ
まず下限から。macOS 15.0 より下は対象外で、古いリリースに留まっている Mac はすべて除外されます。Phone Sync は Android 限定であり、方向も一方向です。Mac が配信し、電話がコピーを保持し、あなたのファイルやデータベースには何も書き戻されません。iPhone アプリはなく、電話から Mac を操作する機能は「実装済み」ではなく「今後」に挙げられています。
もう一つの穴がファイル管理です。Bòcan はインデックス化もタグ付けも識別もしますが、ファイルの移動やリネームはしません。アプリの中からライブラリを整理する機能はロードマップ上です。イマーシブモードは README で実験的と明記されており、形が変わるか廃止される可能性があります。MusicBrainz と Wikipedia からレポートを生成する Deep Dive は既定で無効で、大きなライブラリに対する最初のパスは 1.5 秒に 1 リクエストのペースで進むため、数分ではなく数時間かかります。
ライセンス: 何ができるか
Bòcan は Apache License 2.0、© 2026 Chris Funderburg の下で公開されています。Apache-2.0 は MIT と同じく寛容なライセンスですが、文書は長く、読むだけでなく出荷するつもりなら違いが効いてきます。
商用利用もクローズドソースの製品への組み込みも可能です。改変して、自分で選んだ条件で再配布することも、より大きなプロプライエタリアプリの一部として配布することもできます。MIT と違い、Apache-2.0 は各コントリビューターから、その貢献が必然的に侵害する特許についての明示的な特許ライセンスを付与します。ただし、その成果物が特許を侵害すると主張して特許訴訟を起こした場合、このライセンスは終了します。
義務は公開ではなく通告に関するものです。配布するものにはライセンスの写しを同梱し、変更したファイルにはその旨を明記し、ソースにある著作権、特許、商標の通告を保持し、プロジェクトの NOTICE ファイルの帰属表示を再現してください。コピーレフトではありません。変更点の公開も、自分のアプリを同じライセンスにすることも一切求められません。
Apache-2.0 が与えないものが二つあります。コードの出所を説明する範囲を超えて、プロジェクトの名称、ロゴ、商標を使う権利は与えられません。そしてすべての保証を否認します。ソフトウェアは現状のまま提供され、コントリビューターは損害に対して責任を負いません。実務的には、通告を保持して変更を明示すれば自由に使えます。
導入すべきか
Sequoia 以降の Mac にローカルのライブラリがあるなら、ダウンロードにコストはなく、設定といえば音楽フォルダを指定するだけです。Swift 開発者にとっての価値はアプリよりもリポジトリにあります。十二のモジュール、実際に動く FFmpeg から AVAudioEngine へのデコーダグラフ、FTS5 を使った GRDB、カバレッジ基準で守られた厳格な並行処理の Swift 6。しかも販売する製品にでも持ち込めるライセンスです。限界は隠さず書かれています。Android 限定の電話同期、未実装のファイル管理、macOS 15 という下限。それは但し書きのない機能一覧より、ずっと良い兆候です。
プロジェクト情報
- ライセンス
- Apache-2.0
- 対応環境
- macOS 15.0 以降 (Sequoia)
- 実装言語
- Swift 6、SwiftUI
- 確認したバージョン
- v2.16.0 (2026-09-16)
インストール
# Open GitHub Releases and download the signed and notarized DMG:
open https://github.com/bocan/bocan-music/releasesライセンスの概要
Apache-2.0 は寛容なライセンスです。ライセンスとその通告を同梱し、変更したファイルを明示し、プロジェクトの NOTICE ファイルの帰属表示を引き継ぐ限り、商用アプリやクローズドソースのアプリでの利用、改変、再配布が認められます。明示的な特許ライセンスも含まれます。保証はなく、商標の使用許可もありません。



