FAUST (язык программирования) - FAUST (programming language)

FAUST
Оригинальный автор (ы)Янн Орларей, Доминик Фобер, Стефан Летц
Разработчики)ГРЕЙМ, Национальный музыкальный центр
изначальный выпуск2002 (2002)
Стабильный выпуск
2.20.2[1] / 14 января 2020 г. (2020-01-14)
Написано вC ++
Операционная системаLinux, OS X, Windows, Unix
ТипФункциональный язык программирования для обработки аудиосигнала
ЛицензияGPL
Интернет сайтфауст.grame.fr

FAUST (Функциональный AUdio STream) - это специфичный для домена чисто функциональный язык программирования для реализации обработка сигнала алгоритмы в виде библиотеки, аудио плагины, или автономные приложения. Программа FAUST обозначает процессор сигналов: математическую функцию, которая применяется к некоторому входному сигналу и затем выводится.

Обзор

ФАУСТ модель программирования объединяет функциональное программирование подход с блок-схема синтаксис:

  • Подход функционального программирования обеспечивает естественную основу для обработка сигнала. Цифровые сигналы моделируются как дискретные функции времени, сигнальные процессоры как функции второго порядка которые работают с ними, и блок-схема FAUST операторы композиции, используются для объединения сигнальных процессоров вместе, как функции третьего порядка и т. д.
  • Блок-схемы, даже если они чисто текстовые, как в FAUST, продвигают модульный подход к обработке сигналов, который соответствует привычкам звукорежиссеров и разработчиков аудио.

Программа FAUST описывает не звук или группу звуков, а сигнальный процессор. Исходный код программы организован как набор определения хотя бы с определением ключевого слова обработать (эквивалент основной в C):

обработать = ...;

ФАУСТ компилятор переводит код FAUST в C ++ объект, который затем может взаимодействовать с другим кодом C ++ для создания полной программы.

Сгенерированный код работает на уровне образца. Поэтому он подходит для реализации низкоуровневого DSP функции как рекурсивные фильтры. Код также может быть встроенный. Он самодостаточен и не зависит от какой-либо библиотеки DSP или система времени выполнения. Он имеет очень детерминированное поведение и постоянный размер памяти.

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

FAUST - это текстовый язык, но ориентированный на блок-схемы. Он сочетает в себе два подхода: функциональное программирование и алгебраический блок-схемы, которые строятся через функциональная композиция. Для этого FAUST полагается на алгебра блок-схем из пяти операций композиции.

Пример кода

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

обработать = 0;

Во втором примере входной сигнал копируется в выходной. Это включает _ примитив, обозначающий функция идентичности для сигналов:

обработать = _;

Другой пример суммирует стереосигнал в моно сигнал с помощью + примитивный:

обработать = +;
Блок-схемы, сгенерированные Фаустом из некоторых простых программ

Большинство примитивов FAUST аналогичны своим аналогам в C по числам, но превращены в сигналы. Например, примитив FAUST грех работает с сигналом X, применяя C функция грех каждому образцу X [t]. Все числовые функции языка Си имеют аналог в FAUST. обработка сигнала примитивы специфичны для FAUST. Например, оператор задержки @ принимает два входных сигнала: X (сигнал, который должен быть задержан) и D (применяемая задержка), и выдает выходной сигнал Y такой, что Y (t) = X (t - D (t)).

Составление блок-схемы

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

Простые примеры построения блок-схемы
Блок-схема операторы композиции используется в FAUST
f ~ gРекурсивная композиция (приоритет 4)
f, gПараллельная композиция (приоритет 3)
f: gПоследовательная композиция (приоритет 2)
f <: gРазделенная композиция (приоритет 1)
f:> gСостав слияния (приоритет 1)

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

обработать = + : пресс;

Вот пример параллельной композиции с использованием , оператор, который размещает его левое и правое выражения параллельно. Это аналог стереокабеля.

обработать = _,_;

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

обработать = _,0.5 : *;

Вышесказанное может быть переписано на карри форма:

обработать = *(0.5);

Оператор рекурсивной композиции ~ может использоваться для создания блок-схем с циклами (которые включают неявную задержку на один отсчет). Вот пример интегратора, который принимает входной сигнал X и вычисляет выходной сигнал Y такой, что Y (t) = X (t) + Y (t − 1):

обработать = + ~ _;

Создание полных приложений

Использование конкретных файлы архитектуры, программу FAUST можно использовать для создания кода для различных платформ и форматов подключаемых модулей. Эти файлы архитектуры действуют как оболочки и описывают взаимодействие со звуком хоста и системой графического интерфейса. По состоянию на 2015 год, поддерживается более 10 архитектур, новые могут быть реализованы кем угодно.

Снимок экрана mixer.dsp (доступен в дистрибутиве FAUST) с использованием архитектуры jack-qt
Некоторые файлы архитектуры доступны для FAUST
alsa-gtk.cppПриложение ALSA + GTK
alsa-qt.cppПриложение ALSA + QT4
android.cppПриложения для Android
au.cppПлагин Audio Unit
ca-qt.cppПриложение CoreAudio + QT4
ios-coreaudio.cppприложения для iPhone и iPad
jack-gtk.cppПриложение JACK + GTK
jack-qt.cppПриложение JACK + QT4
ladspa.cppПлагин LADSPA
макс-msp.cppПодключаемый модуль Max MSP
pd.cppПлагин Puredata
q.cppПлагин языка Q
supercollider.cppПлагин суперколлайдера
vst.cppПлагин VST
vsti-mono.cppПлагин Monophonic VST Instrument
vsti-poly.cppПлагин Polyphonic VST Instrument

Создание блок-схем

Полезная опция позволяет генерировать представление программы в виде блок-схемы в виде одного или нескольких графических файлов SVG.

Полезно отметить разницу между блок-схемой и сгенерированным кодом C ++. Как уже говорилось, ключевая идея здесь не в буквальном составлении блок-схемы, а в математической функции, которую она обозначает. Современные компиляторы C / C ++ также не компилируют программы буквально. Но из-за сложной семантики C / C ++ (из-за побочных эффектов, сглаживания указателей и т. Д.) Они не могут далеко продвинуться в этом направлении. Это явное преимущество чисто функционального языка: он позволяет компиляторам выполнять очень продвинутую оптимизацию.

Стрелочная семантика

Семантика Фауста почти такая же, как у Haskell's Стрелки type class, однако класс типа Arrow не привязан к сигнальным процессорам.

Эквивалентность комбинаторов FAUST и Arrow
f ~ gпетля (((а,б) -> (б,а)) ^>> ж >>> я бы &&& (задержка>>>грамм)) где задержка это не метод Стрелка класс типа, но специфичен для стрелок обработки сигналов
f, gб *** г
f: gf >>> g
f <: gе >> ^ ч >>> г с соответствующей функцией час (или же &&& в особых случаях)
f:> gе >> ^ ч >>> г с соответствующей функцией час

Комбинаторы Arrow более строгие, чем их аналоги в FAUST, например, вложение параллельной композиции сохраняется, а входные данные операндов &&& должно точно совпадать.

Рекомендации

внешняя ссылка