FAUST(프로그래밍 언어)

FAUST (programming language)
팬스트
원저작자얀 오르레이, 도미니크 포버, 스테판 레츠
개발자GRAME, Centre National de Création Musicale
초기 릴리즈2002(2002년
안정된 릴리스
2.40.0[1] / 2022년 3월 27일 (2022-03-27)
기입처C++
운영 체제Linux, OS X, Windows, Unix
유형오디오 신호 처리를 위한 기능적 프로그래밍 언어
면허증.GPL
웹 사이트faust.grame.프루

FAUST(Functional AUdio STream)는 라이브러리, 오디오 플러그인 또는 스탠드아론 애플리케이션의 형태로 신호 처리 알고리즘구현하기 위한 도메인 고유의 순수 기능 프로그래밍 언어입니다.FAUST 프로그램은 신호 프로세서를 나타냅니다.즉, 일부 입력 신호에 적용되어 공급되는 수학적 함수입니다.

개요

FAUST 프로그래밍 모델은 기능 프로그래밍 접근 방식과 블록 다이어그램 구문을 결합합니다.

  • 기능 프로그래밍 접근법은 신호 처리를 위한 자연스러운 프레임워크를 제공합니다.디지털 신호는 시간의 이산 함수로, 신호 프로세서는 그 위에서 동작하는 2차 함수로, FAUST의 블록 다이어그램 구성 연산자는 3차 함수 등으로 모델링됩니다.
  • 블록 다이어그램은 FAUST에서와 같이 순수하게 텍스트화된 경우에도 사운드 엔지니어 및 오디오 개발자의 습관에 부합하는 신호 처리에 대한 모듈식 접근법을 촉진합니다.

FAUST 프로그램은 소리나 소리 그룹을 설명하는 것이 아니라 신호 프로세서를 말합니다.프로그램 소스는 적어도 키워드의 정의를 가진 정의 세트로 구성됩니다.process(등가)mainC):

과정 = ...; 

FAUST 컴파일러는 FAUST 코드를 C++ 오브젝트로 변환합니다.이 오브젝트는 다른 C++ 코드와 인터페이스하여 완전한 프로그램을 생성할 수 있습니다.

생성된 코드는 샘플레벨에서 동작합니다.따라서 재귀 필터와 같은 낮은 수준의 DSP 기능을 구현하는 데 적합합니다.코드도 포함되어 있을 수 있습니다.이 시스템은 자급자족하며 DSP 라이브러리 또는 런타임시스템에 의존하지 않습니다.이것은 매우 결정론적 행동과 일정한 메모리 크기를 가지고 있습니다.

FAUST의 의미는 단순하고 명확하게 정의되도록 유도된다.이를 통해 FAUST 컴파일러를 의미론적으로 구동할 수 있습니다.문자 그대로 프로그램을 컴파일하는 대신 프로그램이 나타내는 수학적 함수를 컴파일합니다.이로 인해 컴포넌트 재사용이 촉진될 수 있습니다.더욱이, FAUST 프로그램의 정확한 의미론에 접근하면 보존 문제를 단순화할 수 있다.

FAUST는 텍스트 언어이지만 블록 다이어그램 지향입니다.함수 구성을 통해 구성된 함수 프로그래밍과 대수 블록 다이어그램의 두 가지 접근 방식을 결합합니다.이를 위해 FAUST는 5가지 구성 연산의 블록 다이어그램 대수에 의존합니다.

코드 예시

FAUST 프로그램은process수신 데이터에 대해 작동하는 함수입니다.이것은, 다음과 같습니다.main대부분의 프로그래밍 언어에서 작동합니다.다음으로 무음화를 생성하는 예를 나타냅니다.

과정 = 0; 

두 번째 예에서는 입력 신호를 출력에 복사합니다.이 작업은_신호의 아이덴티티 함수를 나타내는 프리미티브:

과정 = _; 

또 다른 예는 스테레오 신호를 모노 신호로 합산하는 것입니다.+원시:

과정 = +; 
일부 간단한 프로그램에서 Faust가 생성한 블록 다이어그램

대부분의 FAUST 프리미티브는 C의 수치와 비슷하지만 신호로 변환됩니다.예를 들어 FAUST 프리미티브는sinC 함수를 적용하여 신호 X에 대해 동작합니다.sin각 샘플 X[t]로 이동합니다.모든 C 수치 함수는 FAUST에 대응합니다.일부 신호 처리 원소는 FAUST에 고유합니다.예를 들어 지연 연산자@는 X(지연 신호)와 D(적용 지연)의 2개의 입력 신호를 받아 Y(t) = X(t - D(t))가 되도록 출력 신호 Y를 생성합니다.

블록 다이어그램 구성

사용자가 수동으로 접속하는 Max와 같은 비주얼 프로그래밍 언어와 달리 FAUST 프리미티브는 일련의 고급 블록 다이어그램 구성 작업을 사용하여 블록 다이어그램에 조립된다.

블록 다이어그램 구성의 간단한 예
FAUST에서 사용되는 블록 다이어그램 구성 연산자
f~g 재귀적 구성(우선순위 4)
f,g 병렬 구성(우선순위 3)
f:g 시퀀셜 구성(우선순위 2)
f <:g 스플릿 구성(우선순위 1)
f:>g 머지 구성(우선순위 1)

순차 합성 연산자 사용:의 산출물+입력에 라우팅할 수 있다abs신호의 절대값을 계산합니다.

과정 = + : 복근; 

다음 예시는 를 사용한 병렬 구성입니다.,왼쪽과 오른쪽 식을 병렬로 배열하는 연산자.이것은 스테레오 케이블과 비슷합니다.

과정 = _,_; 

이들 연산자는 임의로 조합할 수 있습니다.다음 코드는 입력 신호에 0.5를 곱합니다.

과정 = _,0.5 : *; 

위의 내용은 큐어 형식으로 다시 작성할 수 있습니다.

과정 = *(0.5); 

재귀 합성 연산자~는 사이클이 있는 블록 다이어그램을 작성하는 데 사용할 수 있습니다(암묵적인 1-샘플 지연 포함).다음은 입력 신호 X를 사용하여 Y(t) = X(t) + Y(t-1)가 되도록 출력 신호 Y를 계산하는 통합기의 예입니다.

과정 = + ~ _; 

완전한 응용 프로그램 생성

특정 아키텍처 파일을 사용하여 FAUST 프로그램을 사용하여 다양한 플랫폼 및 플러그인 형식의 코드를 생성할 수 있습니다.이러한 아키텍처 파일은 래퍼로서 기능하며 호스트 오디오 및 GUI 시스템과의 상호작용을 설명합니다.2021년 현재 30개 이상의 아키텍처가 지원되며 누구나 새로운 아키텍처를 구현할 수 있습니다.

jack-qt 아키텍처를 사용한 mixer.dsp(FAUST 배포에서 사용 가능) 스크린샷
FAUST에 사용할 수 있는 아키텍처 파일 중
alsa-gtk.cpp ALSA 어플리케이션 + GTK
alsa-qt.cpp ALSA 어플리케이션 + QT4
안드로이드.cpp Android 응용 프로그램
au.cpp 오디오 유닛 플러그인
ca-qt.cpp Core Audio 어플리케이션 + QT4
ios-coreaudio.cpp iPhone 및 iPad 응용 프로그램
잭 gtk.cpp JACK 어플리케이션 + GTK
잭qt.cpp JACK 어플리케이션 + QT4
ladspa.cpp LADSPA 플러그인
max-msp.cpp 최대 MSP 플러그인
pd.cpp 푸레다타 플러그인
q.cpp Q언어 플러그인
슈퍼콜라이더.cpp 슈퍼콜라이더 플러그인
vst.cpp VST 플러그인
vsti-module.cpp 모노포닉 VST 계측기 플러그인
vsti-poly.cpp 폴리폰 VST 계측기 플러그인

블록 다이어그램 생성

유용한 옵션은 프로그램의 블록 다이어그램 표현을 하나 이상의 SVG 그래픽 파일로 생성할 수 있도록 합니다.

블록 다이어그램과 생성된 C++ 코드 간의 차이를 알아두면 유용합니다.전술한 바와 같이, 여기서 핵심 아이디어는 문자 그대로 블록 다이어그램을 컴파일하는 것이 아니라 블록 다이어그램이 나타내는 수학적 함수를 구성하는 것입니다.최신 C/C++ 컴파일러는 문자 그대로 프로그램을 컴파일하지 않습니다.그러나 C/C++의 복잡한 의미론(부작용, 포인터 에일리어싱 등으로 인해) 때문에 그 방향으로 멀리 갈 수 없습니다.이는 순전히 기능적인 언어의 뚜렷한 이점입니다. 컴파일러는 매우 고도의 최적화를 수행할 수 있습니다.

화살표와 같은 의미론

파우스트의 의미론은 Haskell의 Arrows 유형 클래스의 의미론과 거의 동일합니다.그러나 Arrow 유형 클래스는 신호 프로세서에 바인딩되지 않습니다.

FAUST와 Arrow 콤비네이터의 동등성
f~g loop ((\(a,b) -> (b,a)) ^>> f >>> id &&& (delay>>>g))어디에delay의 방법이 아닙니다.Arrow유형 클래스이지만 신호 처리 화살표에 고유합니다.
f,g f***g
f:g f>>>g
f<:g f>>^h>>>g적절한 기능을 가지고h(또는&&&특별한 경우)
f:>g f>>^h>>>g적절한 기능을 가지고h

Arrow 조합기는 FAUST 대응 장치보다 더 제한적입니다. 예를 들어, 병렬 구성의 중첩이 보존되고, 피연산자의 입력이 보존됩니다.&&&정확하게 일치해야 합니다.

레퍼런스

외부 링크

  • 공식 웹사이트, 온라인 컴파일러, 지원, 문서, 뉴스 등