Одним из первых языков, которые я пытался написать, был язык ассемблера MIDI-файлов.Вы должны определить темп и банк инструментов, а затем множество строк нот (имя ноты, начальный ритм текущего измерения, длительность, необязательный акцент), пунктирные линии («мера \ n») идинамика (ppp, pp, p, mp, mf, f, ff, fff).
На самом деле без макроязыка не было бы возможности повторять последовательности, менять каналы и накладывать новые треки.Для этого потребовалась моя первая хеш-таблица и хитрый перекрестный вызов к qsort для чередования каналов по временной последовательности (неявно передаваемой каждым событием Note-On / Note-Off).
Когда я пришелвернемся к нему год спустя, он стал жертвой гниения.После немалой борьбы я обнаружил, что функция sort-and-output-everything была вызвана явным кодом EOF.Макро-расширенная песня легко составляла 20 000 строк с этой важной строкой EOF, имеющей, следовательно, 1/20000 шанса быть замеченным при попытке выяснить, что, черт возьми, идет не так!Приятно, что все улики благополучно спрятаны в мертвом процессоре под микроволновой тележкой.Ужасы !!
Редактировать: После дальнейшего размышления есть некоторые интересные вещи о формате MIDI.Он имеет целочисленный тип переменной длины (IIRC использует бит знака для сигнализации последнего байта).Он ориентирован на байты и рассчитан на 9 параллельных проводов;и у него есть сумасшедшая вещь с синхронизацией времени, которую я никогда не понимал.Но все, что меня беспокоило, это то, что медиаплеер Windows95 мог интерпретировать вывод (он мог даже использовать встроенный в звуковую карту 8-битный банк MIDI-тонов; тарелки были великолепно искажены).