Content deleted Content added
Removed as Faust algebra also prevents from combining signal processors that don't match |
Add category |
||
(41 intermediate revisions by 30 users not shown) | |||
Line 1:
{{Short description|Audio programming language}}
{{redirect|FAUST|other uses|Faust (disambiguation){{!}}Faust}}
{{More footnotes needed|date=March 2015}}
{{Infobox software
| name
| developer
| author
| released
| latest release version =
| latest release date
| operating system
| genre
| repo = {{URL|https://github.com/grame-cncm/faust/}}
| programming language = [[C++]]
| license = [[GNU General Public License|GPL]]
| website = {{URL|faust.grame.fr}}
}}
{{Portal|Free and open-source software}}
'''FAUST''' (Functional AUdio STream) is a [[___domain-specific language|___domain-specific]] [[purely functional programming|purely functional]] [[programming language]] for implementing [[signal processing]] [[algorithms]] in the form of [[Library (computing)|libraries]], [[audio plug-ins]], or standalone applications. A FAUST program denotes a signal processor: a mathematical function that is applied to some input signal and then fed out.
==Overview==
The FAUST [[programming model]] combines a [[functional programming]] approach with a [[block diagram]] syntax:
* The functional programming approach provides a natural framework for [[signal processing]]. Digital signals are modeled as [[Sequence|discrete functions]] of time, signal processors as [[Higher-order function|second order functions]] that operate on them, and FAUST's block diagram ''composition operators'', used to combine signal processors together, as third order functions, etc.
* Block diagrams, even if purely textual as in FAUST, promote a modular approach to signal processing that complies with sound engineers' and audio developers' habits.
A FAUST program doesn't describe a sound or a group of sounds, but a [[Digital signal processing|signal processor]]. The program source is organized as a set of ''definitions'' with at least the definition of the keyword <code>process</code> (the equivalent of <code>main</code> in C):
<syntaxhighlight lang=haskell>
process = ...;
</syntaxhighlight>
The FAUST [[compiler]] translates FAUST
The generated code works at the sample level. It is therefore suited to implement low-level [[Digital signal processing|DSP]] functions like [[Infinite impulse response|recursive filters]].
The
FAUST is a textual language but
==
<
process = 0;
</syntaxhighlight>
The second example
<
process = _;
</syntaxhighlight>
Another
<
process = +;
</syntaxhighlight>
[[File:Faust-simple-block-diagram.jpg|thumb|Block
Most FAUST primitives are analogous to their C counterpart on numbers, but lifted to signals. For example, the FAUST primitive <code>sin</code> operates on a signal X by applying the [[C (programming language)|C]] function <code>sin</code> to each sample X
Some [[signal processing]] primitives are specific to FAUST. For example, the delay operator <code>@</code> takes two input signals: X (the signal to be delayed) and D (the delay to be applied), and produces an output signal Y such that Y
==Block
Contrary to [[Max (software)|Max-like]] [[visual programming languages]] where the user does manual connections, FAUST primitives are assembled in [[block
[[File:Faust-simple-block-diagrams.jpg|thumb|upright=1.75|Simple examples of block
{| class="wikitable"
|+ The block
| f~g || Recursive composition (precedence 4)
|-
Line 69 ⟶ 71:
|}
<
process = + : abs;
</syntaxhighlight>
Here is an example of parallel composition
<
process = _,_;
</syntaxhighlight>
These operators can be combined arbitrarily
<
process = _,0.5 : *;
</syntaxhighlight>
The above may be rewritten in [[currying|curried]] form:
<
process = *(0.5);
</syntaxhighlight>
The recursive composition operator
<
process = + ~ _;
</syntaxhighlight>
==Generating full applications==
[[File:Faust-mixer-jackqt.jpg|thumb|Screenshot of mixer.dsp (available in the FAUST distribution) using the jack-qt architecture]]
Line 97 ⟶ 99:
{| class="wikitable"
|+ Some architecture files available for FAUST
! File
! Architecture
|-
| alsa-
|-
| alsa-qt.cpp || ALSA application + [[Qt (software)|Qt]] 4
|-
| android.cpp || Android applications
Line 105 ⟶ 110:
| au.cpp || Audio Unit plug-in
|-
| ca-qt.cpp || CoreAudio application +
|-
| ios-coreaudio.cpp || iPhone and iPad applications
Line 111 ⟶ 116:
| jack-gtk.cpp || JACK application + GTK
|-
| jack-qt.cpp || JACK application +
|-
| ladspa.cpp || LADSPA plug-in
Line 117 ⟶ 122:
| max-msp.cpp || Max MSP plug-in
|-
| pd.cpp ||
|-
| q.cpp || Q language plug-in
|-
| supercollider.cpp ||
|-
| vst.cpp || VST plug-in
Line 130 ⟶ 135:
|}
==Generating block diagrams==
A useful option makes it possible to
It is useful to note the difference between the block diagram and the generated C++ code. As stated, the key idea here is not to compile the block diagram literally, but the mathematical function it denotes. Modern C/C++ compilers also don't compile programs literally. But because of the complex semantics of C/C++ (due to side effects, pointer aliasing, etc.) they can't go very far in that direction. This is a distinct advantage of a purely functional language: it allows compilers to do very advanced optimisations.
==Arrows-like semantics==
The Faust semantics is almost the same as that of [[Haskell (programming language)|Haskell's]] [[Arrow (computer science)|Arrows]] type class.
However, the Arrow type class is not bound to signal processors.
{| class="wikitable"
|+ Equivalences between FAUST and Arrow combinators
| <code>f~g</code> ||
|-
| <code>f,g</code> || <code>f***g</code>
Line 152 ⟶ 157:
|}
The Arrow combinators are more restrictive than their FAUST counterparts, e.g., the nesting of parallel composition is preserved, and inputs of the operands of <code>&&&</code> must match exactly.
==References==
{{Reflist}}
{{Refbegin}}
* {{cite journal
| first1 = Romain
| last1 = Michon
Line 170 ⟶ 172:
| pages = 199–204
| year = 2011
}}
* {{cite journal
| first1 = Dominique
| last1 = Fober
Line 184 ⟶ 185:
| pages = 213–216
| year = 2011
}}
* {{cite journal
| first1 = Julius O. III
| last1 = Smith
Line 196:
| pages = 361–364
| year = 2011
}}
* {{cite journal
|first1=Pierre
|last1=Jouvelot
|first2=Yann
|last2=Orlarey
|title=Dependent Vector Types for Data Structuring in Multirate Faust
|journal=Computer Languages, Systems & Structures
|url=http://faust.grame.fr/images/faust-doc/papers/faust-elsevier2011.pdf
|year=2011
|volume=37
|issue=3
|pages=113–131
|doi=10.1016/j.cl.2011.03.001
}}{{dead link|date=December 2016 |bot=InternetArchiveBot |fix-attempted=yes }}
* {{Cite web
| first = Julius O.
Line 215 ⟶ 217:
| url = https://ccrma.stanford.edu/~jos/spf/aspf.pdf
| year = 2011
}}
* {{cite journal
|first3=Dominique
|last3=Fober
|first1=Yann
|last1=Orlarey
|first2=Stéphane
|last2=Letz
|title=Automatic Parallelization of Audio Applications with Faust
|journal=Proceedings of the Congrès Français d'Acoustique
|url=http://faust.grame.fr/images/faust-doc/papers/faust-CFA-2010.pdf
|year=2010
}}{{dead link|date=December 2016 |bot=InternetArchiveBot |fix-attempted=yes }}
* {{cite journal
| first3 = Dominique
| last3 = Fober
Line 241:
| url = http://lac.linuxaudio.org/2010/papers/17.pdf
| year = 2010
}}
* {{cite journal
| first = Albert
Line 251 ⟶ 250:
| page = 117
| year = 2010
}}
* {{cite journal
|first1=Jérôme
|last1=Barthélemy
|first2=Alain
|last2=Bonardi
|first3=Yann
|last3=Orlarey
|first4=Serge
|last4=Lemouton
|first5=Raffaele
|last5=Ciavarella
|first6=Karim
|last6=Barkati
|title=First Steps Towards an Organology of Virtual Instruments in Computer Music
|journal=Proceedings of the 2010 International Computer Music Conference (ICMA-2010)
|url=http://faust.grame.fr/images/faust-doc/papers/astree-icmc2010.pdf
|pages=369–372
|year=2010
}}{{dead link|date=December 2016 |bot=InternetArchiveBot |fix-attempted=yes }}
* {{cite journal
| first1 = Pierre
Line 279 ⟶ 276:
| last2 = Orlarey
| title = Depandant Vector Types for Multirate Faust
| journal = Proceedings of the 7th Sound
| url = http://smcnetwork.org/files/proceedings/2010/51.pdf
| pages = 345–352
| year = 2010
| access-date = 2011-10-11
| archive-url = https://web.archive.org/web/20120407043121/http://smcnetwork.org/files/proceedings/2010/51.pdf
| archive-date = 2012-04-07
|
}}
* {{cite journal
|first3=Dominique
|last3=Fober
|first1=Yann
|last1=Orlarey
|first2=Stéphane
|last2=Letz
|title=Adding Automatic Parallelization to Faust
|journal=Proceedings of the Linux Audio Conference (LAC-2009)
|url=http://faust.grame.fr/test/images/faust-doc/papers/faustLAC09.pdf
|year=2009
}}{{dead link|date=December 2016 |bot=InternetArchiveBot |fix-attempted=yes }}
* {{cite book
| first1 = Pierre
Line 307 ⟶ 306:
| url = http://faust.grame.fr/images/faust-doc/papers/multirate-faust.pdf
| year = 2009
}}{{Dead link|date=December 2019 |bot=InternetArchiveBot |fix-attempted=yes }}
* {{cite journal
| first2 = Dominique
Line 319 ⟶ 317:
| url = http://smc2009.smcnetwork.org/programme/pdfs/232.pdf
| year = 2009
| archive-date = 2012-04-25
| access-date = 2011-10-11
| archive-url = https://web.archive.org/web/20120425061241/http://smc2009.smcnetwork.org/programme/pdfs/232.pdf
| url-status = dead
}}
* {{cite book
| first2 = Dominique
Line 334 ⟶ 335:
| isbn = 978-2-7521-0054-2
| year = 2009
}}{{Dead link|date=December 2019 |bot=InternetArchiveBot |fix-attempted=yes }}
* {{cite journal
|first3=Dominique
|last3=Fober
|first1=Yann
|last1=Orlarey
|first2=Stéphane
|last2=Letz
|title=Multicore Technologies in Jack and Faust
|journal=Proceedings of the 2010 International Computer Music Conference (ICMC-2008)
|url=http://faust.grame.fr/images/faust-doc/papers/jack-faust-multicore.pdf
|year=2008
}}{{dead link|date=December 2016 |bot=InternetArchiveBot |fix-attempted=yes }}
* {{cite journal
| first = Albert
Line 357 ⟶ 356:
| page = 24
| year = 2007
}}
* {{Cite book
| first = Julius O.
| last = Smith III
| title = Introduction to Digital Filters: With Audio Applications
| chapter = Appendix K.
| publisher = W3K Publishing
| year = 2007
| isbn = 978-0-9745607-1-7
| chapter-url =
| pages =
}} * {{cite journal
| first1 = Albert
Line 381 ⟶ 379:
| url = http://lac.zkm.de/2006/papers/lac2006_orlarey_et_al.pdf
| year = 2006
}}
* {{cite journal
| first1 = Robert
Line 394 ⟶ 391:
| url = http://www.dafx.ca/proceedings/papers/p_287.pdf
| year = 2006
}}
* {{Cite book
| first1 = Yann
Line 408 ⟶ 404:
| publisher = Computer Music Association
| url = http://quod.lib.umich.edu/cgi/t/text/text-idx?c=icmc;idno=bbp2372.2005.*
|
| year = 2005
| page = 286
}}
* {{cite book
| first2 = Dominique
Line 424 ⟶ 419:
| url = http://faust.grame.fr/images/faust-doc/papers/faust-soft-computing.pdf
| year = 2004
}}{{Dead link|date=December 2019 |bot=InternetArchiveBot |fix-attempted=yes }}
* {{cite journal
|first1=Nicolas
|last1=Scaringella
|first3=Dominique
|last3=Fober
|first2=Yann
|last2=Orlarey
|title=Automatic Vectorization in Faust
|journal=Journée de l'Informatique Musicale (JIM-2003)
|url=http://faust.grame.fr/images/faust-doc/papers/JIM2003vect.pdf
|year=2003
}}{{dead link|date=December 2016 |bot=InternetArchiveBot |fix-attempted=yes }}
* {{cite journal
|first3=Stéphane
|last3=Letz
|first2=Dominique
|last2=Fober
|first1=Yann
|last1=Orlarey
|title=An Algebraic Approach to Block Diagram Constructions
|journal=Journée de l'Informatique Musicale (JIM-2002)
|url=http://faust.grame.fr/images/faust-doc/papers/faust-jim2002.pdf
|year=2002
}}{{dead link|date=December 2016 |bot=InternetArchiveBot |fix-attempted=yes }}
* {{cite journal
|first3=Stéphane
|last3=Letz
|first2=Dominique
|last2=Fober
|first1=Yann
|last1=Orlarey
|title=An Algebra for Block Diagram Languages
|journal=Proceedings of International Computer Music Conference (ICMA-2002)
|url=http://faust.grame.fr/images/faust-doc/papers/faust-icmc2002.pdf
|year=2002
}}{{dead link|date=December 2016 |bot=InternetArchiveBot |fix-attempted=yes }}
{{Refend}}
==External links==
{{Commons category|FAUST (programming language)}}
* {{Official website|faust.grame.fr}}, online compiler, support, documentation, news, etc.
* {{GitHub|grame-cncm/faust}}
[[Category:Audio programming languages]]
[[Category:Programming languages created in 2002]]
|