Как я написал парсер для музыки, а потом попросил ChatGPT сделать то же самое.
Итак, я начал доделывать музыку для игры GMO Apple, для чего понадобилось перевести её из музыкального редактора:
в некий формат данных, который понимала бы программа. Напомню, что это ремейк игры Apple с БК-0010, поэтому там не предполагается, что можно просто взять и воспроизвести WAV- или MP3-файл. Это противоречило бы концепции. Всё должно быть сделано вручную, как встарь.
Я мог бы поднять сохранившиеся у меня исходники плеера Scream Tracker или поддержать MIDI-формат, но и они будут здесь избыточны. Нужно что-то ещё проще.
Поэтому я просто вручную перевёл музыку в текстовый формат, придумав для этого свой синтаксис:
Получился фактически формат трекера. Музыкальное произведение это последовательность паттернов, то есть кусков, которые можно составлять в нужном порядке. А сами паттерны представлены как дорожки с нотами, и в каждой дорожке может звучать один инструмент.
В данном случае дорожек в паттернах две, но ноты (пока) присутствуют только в одной. Чтобы это было удобно делать в текстовом виде, я выбрал фиксированный формат данных. В начале идёт "|", это признак начала дорожки для парсера, затем каждые три символа обозначают ноту, октаву, а третий символ может быть чем угодно, он нужен только для читабельности. Таким образом, в первой дорожке у меня есть нота Ре 4-й октавы, затем нота Ре 5-й октавы и т.д. (номера октав считаются просто по порядку как в музыкальном редакторе, а не как принято в академической среде).
Одна трёхсимвольная запись это один минимальный бит (не bit, а beat), длительность которого задаётся отдельно. Если нота продолжает звучать и в следующем бите, там ставятся символы "__", если же ничего не звучит, то "..". Остальное попросту игнорируется. Итак, это крайне простой формат данных, поддерживающий несколько дорожек.
Обозначения нот с диезами типа A# привели бы к появлению лишнего символа, поэтому я записываю обычные ноты маленькими буквами, а ноты с диезами большими.
Парсинг
Опущу неважные детали вроде чтения строк из файлов и разбиения строк на куски. В конечном итоге я должен был получить из обозначений нот конкретные частоты. Именно они будут помещены в игру.
Базовая частота это нота Ля 4-й октавы (A4), равная 440 Герц. Алгоритм был следующий: сначала получить октаву. Если это 5-я октава, то частоту надо умножить на 2, если 3-я, то разделить на 2, и т.д. Затем получить ноту внутри этой октавы. Если эта нота выше чем Ля, то добавить к базовой частоте нужное количество полутонов. Если ниже чем Ля, то аналогично отнять.
Для того, чтобы получать смещения полутонов из названий нот, я построил следующий словарь:
Ну и затем формула вычисления фактической частоты:
Каждый следующий полутон отстоит от предыдущего на множитель, равный корню 12-й степени из 2.
ChatGPT
А затем я подумал – что, если озадачить этим ChatGPT? Честно говоря, думал просто посмеяться, но когда увидел результат:
то чуть не закричал. Я даже не буду приводить весь код, достаточно строчки "C" => -9. Бот написал точно такой же код, как у меня, не считая мелких деталей и оформления.
У меня сначала возникла паника. Думаю, откуда он узнал про мой код? Но потом успокоился.
Очевидно, бот ничего не писал – просто украл уже кем-то написанный код. А так как подобная задача наверняка уже кем-то реализовывалась, то и код под неё найти легко. Почему же я сам это не сделал, ведь можно было просто погуглить?
А вот не догадался.
Ну а то, что код получился одинаковый, говорит лишь о том, что у дураков мысли сходятся великие умы мыслят схоже.
Продолжение: