차에서 음악듣기 3
#1: 차에서 아이팟으로 음악듣기 #2: 순정AV에 아이팟 연결하기 위의 두번째 방법으로 한동안 차에서 음악을 잘 듣고 있었는데, 얼마전부터 문제가 생겼다. 아이팟이 충전이 되지 않아 배터리가 다 방전되어버리는 것이었다. HomeDock Deluxe의 문제로 판단되었으나, 해외에서 직접 주문하여 하드웨어를 개조한 것이라 AS를 받을 수 없었다. 같은 제품을 다시 구입하긴 싫고, 찾아봐도 유사한 기능의 다른 제품도 없어서 이번엔 다른 방식을 사용해보기로 했다. Criteria는 다음과 같다:
- 아이팟을 이용하거나 또는 iTunes의 음원 관리 방식을 그대로 사용할 수 있어야 한다.
- 차 순정 오디오의 AV 입력을 이용해야 하므로 메뉴 브라우징과 음악 재생 화면이 비디오로 출력되어야 한다.
iPod은 동영상을 재생할 때에만 비디오 신호를 출력하기 때문에 HomeDock Deluxe와 같은 제품을 이용하지 않으면 차의 AV 입력 방식에 직접 연결하여 메뉴를 TV 화면을 보면서 브라우징하거나 음악을 재생할 수 없다. 포터블 DivX 플레이어가 바로 이러한 기능을 지원하나 iTunes와 연동되지 않는다는 점이 문제였다. 그동안 모은 음원은 거의 대부분 DRM 없는 MP3 파일이었기 때문에 굳이 iPod이 아니더라도 음원의 재생 자체는 문제가 없었으나, iTunes로 관리하고 있는 메타DB나 플레이리스트를 사용할 수 없으면 음원 관리 방식이 다중화되고 불편해진다. 그래서 꽤 예전부터 생각만 하던 방식을 구현해보기로 했다. 이 방식은 폴더 방식의 플레이어에 MP3 파일을 넣고, 메타DB 방식의 브라우징 메뉴에 해당하는 서브 디렉토리와 M3U 파일을 자동 생성해서 이를 통해 원하는 방식으로 음악을 액세스하는 것이다. 폴더 방식의 MP3 플레이어에서는 한가지 방식으로 폴더를 관리하면 다른 방식으로는 접근할 수 없다. 예를 들어, 아티스트-앨범별로 2레벨의 디렉토리를 만드는 경우 장르나 작곡가, 또는 곡 제목에 의해 접근할 수는 없는 것이다. 그런데 MP3 플레이어가 M3U 파일을 지원하는 경우, 여러 접근 방식에 해당하는 디렉토리를 다 만들어놓고 마지막 레벨의 디렉토리에 실제 MP3 파일이 아니라 MP3 파일을 가리키는 M3U 파일을 만들어 놓는 방법으로, 용량이 큰 MP3 파일을 여러 벌 두지 않으면서 여러 경로에 의해 음악을 액세스하도록 할 수 있다. iTunes의 라이브러리에 접근하는 것은 어렵지 않다. 윈도우스 버전의 경우, COM API와 XML 파일이 모두 애플에 의해 공식적으로 제공된다. 이를 이용하여 iTunes의 라이브러리 DB를 읽은 후 iPod와 동일하게
All Songs
Playlist
Artist - Album - Song
Album - Song
Genre - Artist - Album -Song
Composer - Album - Song
의 메뉴 체계에 따르는 디렉토리들을 생성하고, 마지막 레벨의 곡 리스트는 M3U 파일로 만들어내는 것은 간단할 것 같았다. 일단 Python을 사용하여 구현을 시작했다. win32com 덕분에 iTunes COM API를 사용하는 것은 매우 쉽다. 하지만 곧 두가지 문제에 부딪혔다.
- 메타 데이터의 유니코드 문제. 음원의 메타 정보에는 여러 언어의 문자가 사용된다. 예를 들어 Frédéric Chopin과 같이, 아티스트 이름에 umulaut가 있는 문자가 들어있는 경우는 흔하다. 이 이름으로 디렉토리를 만드는 것은 문제가 없는데, 문제는 M3U 파일에서 이 디렉토리 내의 MP3 파일의 경로를 표현하는 것이다. 우리나라의 DivX 플레이어는 유니코드를 지원하지 않는 M3U 파일을 KSC-5601로 간주하기 때문에 유니코드로 된 경로를 제대로 나타낼 수 없는 경우가 생긴다.
- 이건 기존 방법에서도 문제가 되었으나 포기했던 것인데, 아티스트나 앨범의 수가 많을 때 터치휠이 아닌 일반 리모컨으로 리스트의 아래 쪽까지 스크롤하기가 어렵다는 점.
첫번째 문제는 Frédéric 을 Fre’de’ric과 같은 식으로 변환하여 DivX 플레이어에 넣기로 했다. 다행히 검색해보니 유사한 코드를 찾을 수 있어서 약간만 수정하여 사용할 수 있었다. 두번째는 하나의 분류 기준(e.g. 아티스트)을 둘 이상의 서브 디렉토리 레벨로 나누는 것으로 해결했다. 내 iTunes 라이브러리에는 현재 127명의 아티스트가 있는데, 이를 한 디렉토리의 서브 디렉토리로 나열하면 예를 들어 Wagner나 Webber는 선택하기 어렵게 되지만아티스트 이름들을 알파벳 순서에 의해 10개 이내의 그룹으로 분류하고, 각 그룹에 해당하는 서브 디렉토리를 만든 후 다시 그 밑으로 아티스트 별 서브 디렉토리를 만드는 것이다. 이런 문제를 일반화시켜 해결하려다보니 생각보다 시간이 많이 걸렸으나, 일단 ver 1.0을 완성했다. 하드웨어로는 DViCO사의 TViX mini 2000 lite를 사용하기로 했다. 리모컨 연장 수신부를 포함, 자동차용 패키지를 제공하고 있고, M3U 파일의 지원 여부를 메뉴얼에서 미리 확인할 수 있었다. 예전에 노트북 HDD를 업그레이드하면서 떼어놓은 2.5" HDD가 있었기에, 하드 없이 케이스만 있는 제품을 구입하면 되었다. 실제 MP3 파일을 복사하는 것을 제외하면 iTunes 라이브러리를 읽어 메뉴 폴더를 생성하는 데에 1분 남짓 소요되었는데, 좀 더 코드를 최적화할 여지가 있기는 하나 일단 크게 문제될 정도는 아니었다. 앨범 아트를 음원이 있는 디렉토리에 folder.jpg라는 이름으로 저장해두면 해당 음원이 재생될 때 배경화면으로 디스플레이가 되지만 곡 목록의 텍스트가 오버레이되어 지저분해 보여서 앨범 아트의 표시는 포기하기로 했다. iPod처럼 최상위 메뉴에 전곡을 재생할 수 있는 m3u를 만들었는데, TViX mini 2000 lite의 경우 m3u 파일을 선택하면 목록만 읽어들이는 것이 아니라 목록에서 참조하는 모든 MP3파일을 먼저 확인한 후에야 재생을 시작할 수 있어서 천수백곡 정도의 내 라이브러리의 경우 이에 1분 이상 시간이 지체되었다. 그동안 전체 재생을 shuffle로 듣는 경우가 많았는데, 이런 식으로는 듣기가 어려울 것 같다. 그래도 플레이리스트를 선택한 후 이를 랜덤재생할 수 있는 것은 장점. 아티스트, 앨범, 곡의 수에 따라 각각을 몇 레벨의 서브 디렉토리로 만들고 몇 개씩 grouping을 할 것인지가 쉽지 않은 문제였다. 일단 한 레벨에서 10개 이상의 서브디렉토리가 나오지 않도록 레벨의 수와 레벨 당 평균 서브디렉토리의 수를 결정한 후 가급적 이름이 많이 달라지는 부분에서 그룹이 나뉘도록 하는 알고리즘을 구현했다. 그룹 범위의 표현에서 “—“의 줄을 맞추고 싶었으나 TViX 플레이어가 variable width font를 사용하는 바람에 그렇게 하지 못했다 (물론 각 문자별 폭을 다 확인하면 구현 가능하겠지만…). 예전에 AV 입력에 HomeDock Deluxe를 연결했을 때에도 볼륨을 꽤 많이 올려야 했었는데 TViX의 경우도 그랬다. 아무래도 내 차의 AV 입력이 감도가 낮은 듯 하다. 그래도 차량용 패키지에 포함된 DC-DC 컨버터에 의해 그라운드가 분리된 덕분인지 화이트노이즈나 험은 없었다.