vansickle's shared items

Sunday, September 13, 2009

Crazy little thing сalled LosslessCooker / Functional programming

Музыка без потери качество распространяется в разных форматах – .flac, .ape, wav-pack, но в отличие от форматов с потерей качества (.mp3 n etc.) альбомы редко бывают разбиты на треки. Т.е. вот такой вариант – представлен нечасто:

image

Как правило диски представлены в виде двух файлов (не считая логов и обложек) – образа (*.ape, *.flac), в котором находится непосредственно запись, + *.cue файла.

image

В cue описаны начало треков, название, исполнителя, что позволяет прослушивать из образа диски по-треково, а не в виде одной большой записи а-ля магнитофонная кассета. Вот пример содержимого файла *.cue:

REM GENRE Blues-Rock
REM DATE 2002
REM DISCID 530E2807
REM COMMENT "ExactAudioCopy v0.99pb3"
PERFORMER "Allman Brothers Band"
TITLE "American University 12-13-70"
FILE "Allman Brothers Band - American University 12-13-70.wav" WAVE
  TRACK 01 AUDIO
    TITLE "Statesboro Blues"
    PERFORMER "Allman Brothers Band"
    ISRC GBAJE0503080
    INDEX 01 00:00:00
  TRACK 02 AUDIO
    TITLE "Trouble No More"
    PERFORMER "Allman Brothers Band"
    ISRC GBAJE0503081
    INDEX 01 04:34:10
….

Преимуществом такого подхода к распространению альбомов, в том что он в таком случае можно восстановить оригинальный альбом из образа 1:1.

Но есть в таком случае одно неудобство – как правило – и как видно в примере выше – cue сделан на сырой формат – *.wav, и чтобы прослушать альбом на компьютере приходится:

1) распаковать каждый файл, если он архивирован (а обычно это так) – причем до сих пор примерно поровну архивов внутри содержат папку с файлами и только файлы, т.е. поскольку хочется чтобы все альбомы были одноуровневыми, нельзя просто выбрать все файлы и распаковать одной командой, приходится отбирать те, которые надо распаковать с создание папки по названию файла и те в которых папка уже есть и надо распаковать в текущую.

2) Просмотреть все *.cue на предмет того какое расширение для образа указано в файле – и если надо переименовать (бывают случаи когда релизер подумал об этом и создал оба файла – но это редкость).

Соответственно делать это все руками основательно надоело. Когда у меня уже был скрипт, который это делал, но вышел он каким-то не очень удобным, не все учитывавшим да и потерялся за давностью лет.

Соответственно имея такую маленькую, но нужную задачу, решать ее с помощью знакомого инструмента неинтересно. Пожалуй мне хочется расширить свой опыт работы с функциональными языками, поэтому список претендентов следующий:

Real World HaskellProgramming Clojure (Pragmatic Programmers)Programming in Scala: A Comprehensive Step-by-step Guide

Programming Erlang: Software for a Concurrent World

 

 

 

 

 

 

 

Все что сюда вошла – популярные языки, о которых много шума было в последнее время. Поэтому мой выбор больше на основании своих и чужих впечатлений, поэтому с первых слов многое вероятно будет неправдой.

F# в список не вошел, поскольку его возможно удастся ему быть может найдет удобное применение и в production у нас. Scala не столько функционален сколь “multiparadigm” в том смысле что функции – first-class citizen, собственно так его можно приравнять к python, ruby, C# и пр. возможно и в список то его зря, поэтому он тоже выбывает. Поскольку приложение у меня будет локальное, консольно-интерфейсно (а потом может и GUI) то Erlang также выбывает – большая часть виденных материалов о нем касалась разработки многопоточных высоконагруженных сетевых приложений.

Итого остались Haskell и Clojure. Clojure – LISP-подобный язык для JVM, что есть плюс, поскольку больше удастся сосредоточиться на самом языке, чем на библиотеках – они знакомы. Но язык очень молодой (2007) – в территории бывш. СССР пока еще мало известен, да и LISP синтаксис  - вещь которую в + я не запишу. 

Haskell же более известен, появился в 1990, при этом до сих пор активно развивается, cutting edge  программирования, язык чисто функциональный - самое оно для моих исследований. Из минусов – под JVM/CLR приличных реализаций нет, т.е. использовать накопленный опыт напрямую в работе вряд ли получится.

Кстати, эта книжка Real World Haskell доступна бесплатно онлайн - http://book.realworldhaskell.org/read/. Ну понятно что я бы и так ее нашел, но все равно замечательно.

Еще по теме:

http://ru.wikipedia.org/wiki/Сравнение_языков_программирования

На этом пока все, посмотрим что у меня получится.

No comments:

Post a Comment