Я большой поклонник продюсера электронной музыки Богдан Рачински. Он познакомил меня с электронной музыкой благодаря песне Bog's Basil & Curry Powder Potatos Recipe, которую он записал на компакт-диске Ulver 1993–2003: 1st Decade in the Machines, вы можете ее послушать. здесь, если хотите.

Когда я учился в университете, я лихорадочно искал способы купить его музыку, что в то время было довольно сложно (теперь он на bandcamp…), и я хотел оригинальный физический материал, а не mp3, где-то сорванный… Так что я закончилось тем, что я купил винилы на ebay, компакт-диски на discogs или везде, где я мог найти вещи, которых у меня еще не было. Я думал, что у меня есть полная коллекция, но потом я наткнулся в сети на архив, в котором было около сотни его работ в оригинальном формате. Этот архив был для меня золотой жилой, поскольку я играл с трекерной музыкой, и он дал мне редкое понимание того, как были созданы его треки.

Что такое трекер?

Здесь интерлюдия для тех, кто может не знать, что такое трекер, вот первый абзац из Википедии:

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

Понимание всего этого

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

Архив состоял из 76 файлов .it (Impluse Tracker), 10 файлов .xm (расширенный модуль) и 13 файлов .s3m (Scream Tracker), я разумно начал с разбора файлов .it.

Настройка для разбора бинарных файлов в Go

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

Вот моя установка, которую я рекомендую, если вы собираетесь анализировать двоичные файлы.

  • Слева вверху: хром с открытыми спецификациями (лучше было бы их распечатать, но мне было лень и не хотелось тратить бумагу…)
  • Вверху справа: редактор Atom с установленным плагином go-plus (запускает тесты при сохранении, автоматическом форматировании, автоматическом импорте и т. д.)
  • Внизу слева: Терминал
  • Внизу справа: HexFriend, бесплатный шестнадцатеричный редактор, который мне очень нравится.

Посмотрите, как можно изменить размер HexFriend, чтобы он соответствовал текстовому формату спецификации? это сделало мой первый синтаксический анализ файлов .IT действительно гладким, я мог посмотреть спецификацию, выбрать несколько байтов в HexFriend и проверить, имеют ли значения смысл (всегда доверяй, но проверяй, спецификации никогда не бывают точными на 100% в зависимости от опыта…).

Разбор бинарных данных в Go

Так как же в Go разобрать простой заголовок, подобный приведенному выше? Сначала я подумал, что функция binary.Read не работает для структур, и начал писать свою версию, реализуя несколько типов, которые, как я знал, мне понадобятся, но оказалось, что я просто использовал неэкспортируемые поля структуры ( строчными буквами…) 🤦, чтобы разобраться, что вам нужно сделать, это определить структуру с полями, которые сопоставляются с двоичными данными, используя правильную длину и подпись, а затем просто используйте binary.Read, чтобы распаковать данные в эту структуру:

Обратите внимание, что вы можете игнорировать определенные части спецификации, используя имя поля _, и программа чтения перейдет к размеру шрифта.

Это в основном суть, я только что просмотрел спецификации файлов .it и .xm, файл .xm не был определен структурированным образом, как файл .it, что сделало использование HexFriend менее удобным, но его все равно было легко разобрать .

Понимание всего этого

Когда это было сделано, все метаданные были доступны, и я просто визуализировал их в простом html-шаблоне, все еще используя Golang, импортировав CSS Material Design Lite из Google, чтобы он выглядел красиво, и я мог просматривать свою библиотеку удобным способом: -)

Осталось сделать несколько вещей, а именно:

  • разбирая файлы .s3m, мне не очень нравятся песни в этом формате, поэтому не чувствовал необходимости разбирать их…
  • получение общей длины песни (для чего требуется анализ всего файла и интерпретация изменений темпа и т. д.)
  • также визуализируйте метаданные инструментов, часто художники оставляли сообщения в названиях инструментов, потому что их макет делал его похожим на текстовый файл, поэтому он был подвержен комментариям…

  • снова делайте трекерную музыку!

Процесс создания песен в трекере сильно отличается от DAW (теперь гораздо более используемых), но из-за этого вы получаете совершенно другие песни, и это упрощает использование некоторых сбоев и эффектов, поэтому он полностью адаптирован для Drum'n. Например, Bass, IDM или Jungle. Я, как обычно, размещаю весь код на github, не стесняйтесь проверить его, отправить PR или просто использовать его, если вы хотите посмотреть на коллекцию модулей!



Приложение

Вы хотите начать делать трекерную музыку? Я рекомендую Renoise на сегодняшний день, интерфейс самый приятный и находится в активной разработке.

Вы просто хотите слушать такую ​​музыку? в Windows я использую foobar2000 в качестве плеера, иначе VLC тоже может прочитать их все.

Вы хотите увидеть невероятное использование трекера? смотреть Vache made by Venetian Snares и плакать.