FAUST(프로그래밍 언어)
FAUST (programming language)![]() |
원저작자 | 얀 오르레이, 도미니크 포버, 스테판 레츠 |
---|---|
개발자 | GRAME, Centre National de Création Musicale |
초기 릴리즈 | 2002 |
안정된 릴리스 | 2.40.0[1] / 2022년 3월 27일 ( |
기입처 | C++ |
운영 체제 | Linux, OS X, Windows, Unix |
유형 | 오디오 신호 처리를 위한 기능적 프로그래밍 언어 |
면허증. | GPL |
웹 사이트 | faust |
FAUST(Functional AUdio STream)는 라이브러리, 오디오 플러그인 또는 스탠드아론 애플리케이션의 형태로 신호 처리 알고리즘을 구현하기 위한 도메인 고유의 순수 기능 프로그래밍 언어입니다.FAUST 프로그램은 신호 프로세서를 나타냅니다.즉, 일부 입력 신호에 적용되어 공급되는 수학적 함수입니다.
개요
FAUST 프로그래밍 모델은 기능 프로그래밍 접근 방식과 블록 다이어그램 구문을 결합합니다.
- 기능 프로그래밍 접근법은 신호 처리를 위한 자연스러운 프레임워크를 제공합니다.디지털 신호는 시간의 이산 함수로, 신호 프로세서는 그 위에서 동작하는 2차 함수로, FAUST의 블록 다이어그램 구성 연산자는 3차 함수 등으로 모델링됩니다.
- 블록 다이어그램은 FAUST에서와 같이 순수하게 텍스트화된 경우에도 사운드 엔지니어 및 오디오 개발자의 습관에 부합하는 신호 처리에 대한 모듈식 접근법을 촉진합니다.
FAUST 프로그램은 소리나 소리 그룹을 설명하는 것이 아니라 신호 프로세서를 말합니다.프로그램 소스는 적어도 키워드의 정의를 가진 정의 세트로 구성됩니다.process
(등가)main
C):
과정 = ...;
FAUST 컴파일러는 FAUST 코드를 C++ 오브젝트로 변환합니다.이 오브젝트는 다른 C++ 코드와 인터페이스하여 완전한 프로그램을 생성할 수 있습니다.
생성된 코드는 샘플레벨에서 동작합니다.따라서 재귀 필터와 같은 낮은 수준의 DSP 기능을 구현하는 데 적합합니다.코드도 포함되어 있을 수 있습니다.이 시스템은 자급자족하며 DSP 라이브러리 또는 런타임시스템에 의존하지 않습니다.이것은 매우 결정론적 행동과 일정한 메모리 크기를 가지고 있습니다.
FAUST의 의미는 단순하고 명확하게 정의되도록 유도된다.이를 통해 FAUST 컴파일러를 의미론적으로 구동할 수 있습니다.문자 그대로 프로그램을 컴파일하는 대신 프로그램이 나타내는 수학적 함수를 컴파일합니다.이로 인해 컴포넌트 재사용이 촉진될 수 있습니다.더욱이, FAUST 프로그램의 정확한 의미론에 접근하면 보존 문제를 단순화할 수 있다.
FAUST는 텍스트 언어이지만 블록 다이어그램 지향입니다.함수 구성을 통해 구성된 함수 프로그래밍과 대수 블록 다이어그램의 두 가지 접근 방식을 결합합니다.이를 위해 FAUST는 5가지 구성 연산의 블록 다이어그램 대수에 의존합니다.
코드 예시
FAUST 프로그램은process
수신 데이터에 대해 작동하는 함수입니다.이것은, 다음과 같습니다.main
대부분의 프로그래밍 언어에서 작동합니다.다음으로 무음화를 생성하는 예를 나타냅니다.
과정 = 0;
두 번째 예에서는 입력 신호를 출력에 복사합니다.이 작업은_
신호의 아이덴티티 함수를 나타내는 프리미티브:
과정 = _;
또 다른 예는 스테레오 신호를 모노 신호로 합산하는 것입니다.+
원시:
과정 = +;
대부분의 FAUST 프리미티브는 C의 수치와 비슷하지만 신호로 변환됩니다.예를 들어 FAUST 프리미티브는sin
C 함수를 적용하여 신호 X에 대해 동작합니다.sin
각 샘플 X[t]로 이동합니다.모든 C 수치 함수는 FAUST에 대응합니다.일부 신호 처리 원소는 FAUST에 고유합니다.예를 들어 지연 연산자@
는 X(지연 신호)와 D(적용 지연)의 2개의 입력 신호를 받아 Y(t) = X(t - D(t))가 되도록 출력 신호 Y를 생성합니다.
블록 다이어그램 구성
사용자가 수동으로 접속하는 Max와 같은 비주얼 프로그래밍 언어와 달리 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년 현재[update] 30개 이상의 아키텍처가 지원되며 누구나 새로운 아키텍처를 구현할 수 있습니다.
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 유형 클래스는 신호 프로세서에 바인딩되지 않습니다.
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 대응 장치보다 더 제한적입니다. 예를 들어, 병렬 구성의 중첩이 보존되고, 피연산자의 입력이 보존됩니다.&&&
정확하게 일치해야 합니다.
레퍼런스
- Michon, Romain; Smith, Julius O. III (2011). "Faust-STK: a Set of Linear and Nonlinear Physical Models for the Faust Programming Language" (PDF). Proceedings of the 11th Int. Conference on Digital Audio Effects (DAFx-11): 199–204.
- Fober, Dominique; Orlarey, Yann; Letz, Stéphane (2011). "Faust Architectures Design and OSC Support" (PDF). Proceedings of the 11th Int. Conference on Digital Audio Effects (DAFx-11): 213–216.
- Smith, Julius O. III; Michon, Romain (2011). "Nonlinear Allpass Ladder Filters in Faust" (PDF). Proceedings of the 11th Int. Conference on Digital Audio Effects (DAFx-11): 361–364.
- Jouvelot, Pierre; Orlarey, Yann (2011). "Dependent Vector Types for Data Structuring in Multirate Faust" (PDF). Computer Languages, Systems & Structures. 37 (3): 113–131. doi:10.1016/j.cl.2011.03.001.[영구 데드링크]
- Smith III, Julius O. (2011). "Audio Signal Processing in Faust" (PDF).
- Orlarey, Yann; Letz, Stéphane; Fober, Dominique (2010). "Automatic Parallelization of Audio Applications with Faust" (PDF). Proceedings of the Congrès Français d'Acoustique.[영구 데드링크]
- Letz, Stéphane; Orlarey, Yann; Fober, Dominique (2010). "Work Stealing Scheduler for Automatic Parallelization in Faust" (PDF). Proceedings of the Linux Audio Conference (LAC-2010).
- Gräf, Albert (2010). "Term rewriting extension for the Faust programming language" (PDF). Proceedings of the 8th International Linux Audio Conference (LAC-2010): 117.
- Barthélemy, Jérôme; Bonardi, Alain; Orlarey, Yann; Lemouton, Serge; Ciavarella, Raffaele; Barkati, Karim (2010). "First Steps Towards an Organology of Virtual Instruments in Computer Music" (PDF). Proceedings of the 2010 International Computer Music Conference (ICMA-2010): 369–372.[영구 데드링크]
- Jouvelot, Pierre; Orlarey, Yann (2010). "Depandant Vector Types for Multirate Faust" (PDF). Proceedings of the 7th Sound and Music Computing Conference (SMC-2010): 345–352. Archived from the original (PDF) on 2012-04-07. Retrieved 2011-10-11.
- Orlarey, Yann; Letz, Stéphane; Fober, Dominique (2009). "Adding Automatic Parallelization to Faust" (PDF). Proceedings of the Linux Audio Conference (LAC-2009).[영구 데드링크]
- Jouvelot, Pierre; Orlarey, Yann (2009). "Semantics for Multirate Faust". Technical Repports of Centre de Recherche en Informatique de MINES ParisTech (PDF).[영구 데드링크]
- Orlarey, Yann; Fober, Dominique; Letz, Stéphane (2009). "Parallelization of Audio Applications with Faust" (PDF).
{{cite journal}}
:Cite 저널 요구 사항journal=
(도움말) - Orlarey, Yann; Fober, Dominique; Letz, Stéphane (2009). "Faust: an Efficient Functional Approach to DSP Programming". New Computanionals Paradigms for Computer Music (PDF). Edition Delatour. ISBN 978-2-7521-0054-2.[영구 데드링크]
- Orlarey, Yann; Letz, Stéphane; Fober, Dominique (2008). "Multicore Technologies in Jack and Faust" (PDF). Proceedings of the 2010 International Computer Music Conference (ICMC-2008).[영구 데드링크]
- Gräf, Albert (2007). "Interfacing Pure Data with Faust" (PDF). Proceedings of the 5th International Linux Audio Conference (LAC2007): 24.
- Smith III, Julius O. (2007). "Appendix K. Digital Filtering in Faust and PD". Introduction to Digital Filters: With Audio Applications. W3K Publishing. pp. 417–?. ISBN 978-0-9745607-1-7.
- Gräf, Albert; Kersten, Stefan; Orlarey, Yann (2006). "DSP Programming with Faust, Q and SuperCollider" (PDF). Proceedings of the 4th International Linux Audio Conference (LAC2006).
- Trausmuth, Robert; Dusek, Christian; Orlarey, Yann (2006). "Using Faust for FPGA Programming" (PDF). Proceedings of the 9th Int. Conference on Digital Audio Effects (DAFx-09).
- Orlarey, Yann; Fober, Dominique; Letz, Stephone (2005). "Demonstration of Faust Signal Processing Language". Proceedings of the International Computer Music Conference. Vol. 2005. Computer Music Association. p. 286.
- Orlarey, Yann; Fober, Dominique; Letz, Stéphane (2004). "Syntactical and Semantical Aspects of Faust". Soft Computing (PDF).[영구 데드링크]
- Scaringella, Nicolas; Orlarey, Yann; Fober, Dominique (2003). "Automatic Vectorization in Faust" (PDF). Journée de l'Informatique Musicale (JIM-2003).[영구 데드링크]
- Orlarey, Yann; Fober, Dominique; Letz, Stéphane (2002). "An Algebraic Approach to Block Diagram Constructions" (PDF). Journée de l'Informatique Musicale (JIM-2002).[영구 데드링크]
- Orlarey, Yann; Fober, Dominique; Letz, Stéphane (2002). "An Algebra for Block Diagram Languages" (PDF). Proceedings of International Computer Music Conference (ICMA-2002).[영구 데드링크]
외부 링크
- 공식 웹사이트, 온라인 컴파일러, 지원, 문서, 뉴스 등