MacのプレイリストをWALKMAN NW-A306で再生する方法【完全解決】

Macのミュージックアプリ(旧iTunes)で作成したプレイリストをそのままSONY WALKMAN NW-A306(Android) に転送して再生しようとしても、プレイリストが認識されません。

  • プレイリストが表示されない
  • 曲が読み込まれない
  • アルバムアートが出ない

色々問題はありますが、今回はプレイリストに焦点あててみたいと思います。

アルバムアートが表示されない
プレイリストがない、アルバムアートが表示されない

注意:単純な変換では絶対に解決しない

この「Macで作ったプレイリストをWALKMANで読み込めない問題」の大きな要因は、パスが絶対パスか相対パスかの違いです。しかし「パスを直せばOK」という単純なものではありません。

以下のような複数の要因が絡みます。

  • 絶対パス → 相対パス
  • UNIXパス → Windowsパス
  • URLエンコード(%20)
  • 文字コード(UTF-8 BOM付き・無し)
  • NFD → NFC(Mac特有の濁点問題)

これらの1つでも欠けるとWALKMANは認識しません。

結論(最短手順)

これが最短で解決する方法です。

  1. Macでm3uを書き出す
  2. Windows 11(PowerShell 7)で完全変換
  3. m3u8(UTF-8 BOMなし)で保存
  4. WALKMANに転送後、再スキャン

この手順で100%再生できました。

なぜ起きるのか?

原因はSONYの仕様とMacの仕様がかみ合っていないためです。

WALKMAN側の仕様

  • 相対パスのみ対応(..\Artist\…みたいな感じ)
  • m3uやm3u8対応
  • UTF-8(BOMなし)必須

Mac側の仕様

  • 絶対パスで出力(F:\Music\Artist\…みたいな感じ)
  • UNIX形式
  • URLエンコードあり
  • NFD正規化

もう相対パスか絶対パスかの時点で互換性は皆無と思って良さそうです。

この記事で解決すること

アルバムアートが表示されない問題は困ります。しかし、目下の問題はプレイリストがどうにもならないことです。
この記事ではプレイリストをなるべく省エネでWALKMANで認識できるようにします。

  • プレイリストが表示されない原因
  • WALKMAN対応フォーマットの理解
  • WALKMAN用に成形したプレイリストの作成
  • 再スキャン失敗の回避

アルバムアートについては後日取り組んでみたいと思います。

検証環境

まず、どのような状況下でプレイリストがWALKMANで表示されなかったのかを考えます。

  • macOS+ミュージック.app
  • Windows 11+PowerShell 7
  • SONY WALKMAN NW-306A
  • microSDカード使用

このサイトではプリインストールされているWindows PowerShell 5.1を主に使うようにしています。
しかし今回は5.1のデフォルトがUTF-16LEであったり、URLデコードが.NET Framework依存だったりと、文字周りが危ないのでPowerShell 7を使います。無い場合はインストールしてください。

プレイリストが認識されない原因の究明

ずっとmacOSのミュージック.appで作成したプレイリストをiPod classicやiPhoneで利用していたため、改めて中身を見て驚くばかりでした。

これは他の音楽プレーヤーでは読み込むことができない、と思いました。

Mac絶対パス問題とWALKMAN相対パス問題

macOSのミュージック.appで作成されたm3uを見るとこのような状態です。

Macから書き出したプレイリストは見事に絶対パスでした
Macから書き出したプレイリストは見事に絶対パスでした

見事なまでに絶対パスです。絶対パスは好きですが、これではWALKMANのmicroSDや内部ストレージのフォルダ構造に適合できません。

WALKMANが要求する形式は「..\Artist\Album\track.mp3」という相対パスです。プレイリスト位置からの相対指定が必須です。

さらなるやっかいな問題発見

絶対パスを相対パスにすること自体は簡単にできそう、と思いましたが問題は他にもありました。

  • %20→スペースに復元
  • 濁点分離文字(NFD)
  • ローマ数字(Ⅰ → I)

実は、絶対パスを相対パスに変換するスクリプトを書いたのですが、上の問題に引っかかってしまい、結局は認識できませんでした。

プレイリストを入れて音楽を聴くだけなのに、なんでこんな大変なことになっているのだろう、そう思いました。

実際の解決手順

まずは絶対に必要なPowerShell 7を手に入れてください。

手順①:PowerShell 7をインストール

Windows PowerShellでは不可能なので、PowerShell 7を手に入れます。
https://github.com/PowerShell/PowerShell

緑色をした[<>Code]からDownloadしてください。

手順②:変換スクリプトの実行

一応書いてみました。D:\にMusic\Playlistsというディレクトリを作り、そこに複数のmacOSで出力したプレイリストを配置してください。
便宜上、microSDカードのドライブはF:\にしています。環境で違う場合は実態に合ったドライブ名にしてください。

次のスクリプトをメモ帳などに書き込みます。名前は適当にconvert.ps1として、D:\Music\Playlistsにでも保存します。

※PlaylistDir、MacMusicRoot、WalkmanMusicRoot、WalkmanArtistRoot、WalkmanPlaylistsは適宜環境に合わせて変更してください※

$PlaylistDir = "C:\Music\Playlists"
$MacMusicRoot = "/Users/username/Media.localized/Music/"

$WalkmanMusicRoot   = "F:\Music"
$WalkmanArtistRoot  = Join-Path $WalkmanMusicRoot "Artist"
$WalkmanPlaylists   = Join-Path $WalkmanMusicRoot "Playlists"

$Utf8NoBom = New-Object System.Text.UTF8Encoding($false)

# ローマ数字からASCII
$RomanMap = @{
    "Ⅰ"="I"; "Ⅱ"="II"; "Ⅲ"="III"; "Ⅳ"="IV"; "Ⅴ"="V"; "Ⅵ"="VI";
    "Ⅶ"="VII"; "Ⅷ"="VIII"; "Ⅸ"="IX"; "Ⅹ"="X"; "Ⅺ"="XI"; "Ⅻ"="XII"
}

function Convert-RomanToAscii([string]$text) {
    foreach ($k in $RomanMap.Keys) {
        $text = $text -replace [regex]::Escape($k), $RomanMap[$k]
    }
    return $text
}

function Normalize-Text([string]$text) {
    if ([string]::IsNullOrEmpty($text)) { return $text }
    $normalized = $text.Normalize([Text.NormalizationForm]::FormC)
    $normalized = Convert-RomanToAscii $normalized
    return $normalized
}

# メイン処理

if (-not (Test-Path $WalkmanPlaylists)) {
    New-Item -ItemType Directory -Path $WalkmanPlaylists -Force | Out-Null
}

$m3uFiles = Get-ChildItem -Path $PlaylistDir -Filter *.m3u

foreach ($m3u in $m3uFiles) {

    $inputM3U   = $m3u.FullName
    $baseName   = $m3u.BaseName
    $outputM3U8 = Join-Path $WalkmanPlaylists ($baseName + ".m3u8")

    Write-Host "=== 変換中です: $($m3u.Name) → $($baseName).m3u8 ==="

    $lines = Get-Content -Path $inputM3U -Encoding UTF8
    $out   = @()

    foreach ($line in $lines) {

        if ($line.StartsWith("#") -or [string]::IsNullOrWhiteSpace($line)) {
            $out += $line
            continue
        }

        $work = $line.Trim()

        $idx = $work.IndexOf($MacMusicRoot)
        if ($idx -ge 0) {

            # MacのMusicルート以降を抽出する
            $relativeFromMacRoot = $work.Substring($idx + $MacMusicRoot.Length)

            # UNIXパスからWindowsパス
            $relativeFromMacRoot = $relativeFromMacRoot -replace "/", "\"

            # URLデコード(日本語に復元)
            $relativeFromMacRoot = [System.Web.HttpUtility]::UrlDecode($relativeFromMacRoot)

            # NFDからNFCとローマ数字からASCII
            $relativeFromMacRoot = Normalize-Text $relativeFromMacRoot

            # WALKMAN側の絶対パス
            $walkmanAbs = Join-Path $WalkmanArtistRoot $relativeFromMacRoot

            # PowerShell 7の相対パス生成
            $relativeForPlaylist = [System.IO.Path]::GetRelativePath($WalkmanPlaylists, $walkmanAbs)

            $out += $relativeForPlaylist
        }
        else {
            $out += (Normalize-Text $work)
        }
    }

    [System.IO.File]::WriteAllLines($outputM3U8, $out, $Utf8NoBom)
    Write-Host " → 出力: $outputM3U8"
}

Write-Host " すべてのm3uをm3u8に一括変換できました "

なんだろう、これだけの行数なのに1日以上かかりました。MacとWindowsとWALKMAN、相性悪すぎでしょう。

スクリプト実行前のリストはこのようになっています。

楽曲は旧NASに保存していたため、/Volumes/disk1/Family-Music/メディア/Music/と絶対パスになっています。

そこでスクリプトを実行します。convert.ps1を作った際、D:\Music\Playlistsに保存したとします。

PowerShell 7を起動し、「cd D:\」「cd D:\Music\Playlists」で移動したら「pwsh ./convert.ps1」で実行してください。

スクリプト実行後は、見にくいですが、相対パスになっていることがわかります。一応拡張子も.m3u8になって文字化けも安心です。

私のWALKMANはMusicフォルダに「Artist」と「Playlists」という二つのフォルダがあります。楽曲はArtistフォルダにあり、プレイリストはPlaylistsフォルダにあるため、このような変則的なパスになっています。

注意点と改善したいところ

  • ローマ数字の際限の無さ:現在XIIで力尽きましたが、「第XIII番」などの曲がある場合は追加してください。
  • 大文字と小文字:Windows(WALKMAN)はパスの大文字小文字を区別しません。Macは設定により区別する場合があります。パス比較で稀に不一致が起きるかもしれません。
  • パフォーマンス:大量の曲がある場合は重くなると思います。

手順③:変換内容の確認

  • Mac絶対パスは抽出されているか
  • UNIXからWindowsへ変換されているか
  • URLデコードはされているか
  • Unicode正規化はうまくできているか(NFC)
  • ローマ数字変換はできているか
  • 相対パスとして生成されているか
  • UTF-8(BOMなし)で保存されているか

これら7つを確認できたところで、プレイリストの変換は完了したと思っていいです。

結果:完全動作を確認

実際に検証した結果、望んでいたように変換がなされました。

  • プレイリスト表示できている
  • 曲順がめちゃくちゃではない
  • 再生もできる

苦労はしましたが、なんとかWALKMANでのプレイリスト変換については完了したように思えます。

失敗ポイントと対処

  • 失敗①:相対パスだけ直す。確実に失敗します。
  • 失敗②:PowerShell 5.1を使う。相対パスの生成ができない。
  • 失敗③:UTF-8(BOMあり)。読み込まれない。

チェックポイント

  • m3u8形式になっている
  • UTF-8(BOMなし)になっている
  • 相対パスになっている
  • URLデコードが済んでいる
  • NFC正規化が済んでいる
  • ファイルは本当に存在している

よくある質問(FAQ)

Q
Mac標準のミュージック.appで書き出したプレイリストは使えますか?
A

そのままでは正しく動作しないケースが多いため、上記変換手順が必要です。

Q
Macだけで完結できますか?
A

無理とは言いませんが大変だと思います。Windowsで変換した方が楽だと思います。

Q
プレイリストのm3uとm3u8の違いは?
A

文字コードが違います。m3uは文字化けを起こします。日本語はm3u8形式準拠です。

Q
Music Centerは使えますか?
A

Windows版のみ推奨されています。

まとめ

この問題の本質は、仕様の不一致にあります。

  • Mac:独自仕様の絶対パス
  • WALKMAN:厳格仕様の相対パス

このままでは何をどうしようとも絶対に動きません。
そこでパスだけではなく、様々な整理整頓する必要がうまれました。

  • パス変換
  • 文字正規化
  • エンコード統一

何がおかしいのかを少しずつ考えると、結構単純なところに行き着くものです。
これらを処理すれば、確実に動作します。

リファレンス

SONY公式ヘルプ:
https://helpguide.sony.net/gbmig/44666681/v1/eng/contents/03/01/04/04.html

SONY公式プレイリスト仕様:
https://helpguide.sony.net/gbmig/44666681/v1/eng/contents/03/01/04/04.html

SONY公式サポートQ&A
https://knowledge.support.sony.jp/electronics/support/articles/S1304100048930

PowerShell公式
https://github.com/PowerShell/PowerShell

コメント