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

Время — важная категория в музыке

Языки программирования и теория компьютерных наук в основном нацелены на как можно более быстрое получение ответа. Большое внимание уделяется созданию алгоритмов, которые позволят минимизировать количество шагов, и разработке оборудования для ускорения этих шагов. Ключевыми показателями качества в традиционной теории информатики являются временная сложность (как долго будет работать программа?) и пространственная сложность (сколько памяти потребуется?).

В случае с музыкой, хоть быстрое вычисление ответов и важно, есть еще одно обстоятельство: сам «ответ» тоже находится во времени, имеет временное измерение. Время музыкальных событий так же важно, как их содержание.

Основные подходы к решению проблемы отображения музыкального времени:

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

• Эксплицитные «вневременные» системы. Не работают в режиме реального времени, а вместо этого учитывают музыкальное время как часть вычислений. Например, автоматическая система для сочинения музыки могла бы генерировать музыкальную партитуру настолько быстро, насколько она способна. Но вместо этого она отслеживает изменение времени в музыке и передает его в вывод программы, который может представлять собой нотную партитуру или аудиофайл.

• Системы с точной синхронизацией. Адаптируют эксплицитный «вневременной» подход к системе «реального времени». Идея состоит в том, чтобы вести точный учет «идеального» времени каждого исходящего события, чтобы даже если время от времени реальные вычисления будут отставать, совокупная ошибка могла быть устранена. Этот подход широко используется. Особенно он полезен, когда необходимо синхронизировать несколько музыкальных процессов.

• Сэмпловые синхронные вычисления. Используются для обработки аудиосигнала. Здесь время эффективно квантуется на периоды дискретизации (обычно 44,100 сэмплов в секунду, это частота дискретизации, используемая в формате Audio CD). Вычисления проходят строго сэмпл за сэмплом заранее определенным образом. На практике операционные системы не могут планировать и выполнять вычисления для каждого сэмпла (например, каждые 22 мкс), поэтому сэмплы вычисляются немного раньше времени в пакетах длительностью от 1 до 20 мс. Таким образом, в то время как вычисления логически протекают синхронно сэмпл за сэмплом, процесс должен фактически идти быстрее и немного опережать реальное время, чтобы избежать каких-либо прерываний в потоке сэмплов на выход.

Время в музыке устроено сложно

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

Некоторые компьютерные языки обладают возможностями для отображения иерархических временных структур. Например, Nyquist оценивает выражения в среде, которая преобразует «логическое время» (доли) в «физическое время» (секунды).

Музыка разнообразна

Итак, мы видим, что существует не только множество музыкальных стилей, но и множество способов выразить музыку компьютерными средствами. Некоторые языки пытаются сосредоточиться только на одном аспекте. Например, Faust — это язык для описания алгоритмов обработки аудиосигнала. Другие языки, такие как Nyquist и Open Music, стремятся быть более универсальными.

Гибкость в создании решений важнее, чем готовые возможности

Трудно выделить один язык, который справлялся бы с большинством задач. Те, которые пытаются соответствовать этим требованиям, часто имеют несколько «подъязыков» для решения отдельных задач. Например, Music V имеет отдельные подразделы — «партитура» и «оркестр», а Max MSP имеет схожий синтаксис, но разную семантику для управления аудиосигналом и обработки изображений. В целом, готовые решения в языках программирования часто бывают чрезмерно специфичными, и в итоге это становится ограничением для их использования. Поэтому более полезными оказываются универсальные языки, обладающие достаточной гибкостью, чтобы создавать новые решения для возникающих задач.

Подробнее: Roger B. Dannenberg. Languages for Computer Music

Прочие источники:
FAUST : an Efficient Functional Approach to DSP Programming
Machine Tongues XIX: Nyquist, a Language for Composition and Sound Synthesis
Computer-aided Composition of Musical Processes