FAUST (programozási nyelv) - FAUST (programming language)

FAUST
Eredeti szerző (k) Yann Orlarey, Dominique Fober, Stéphane Letz
Fejlesztő (k) GRAME, a National Création Musicale Központ
Első kiadás 2002  ( 2002 )
Stabil kiadás
2.20.2 / 2020. január 14  ( 2020-01-14 )
Beírva C ++
Operációs rendszer Linux , OS X , Windows , Unix
típus Funkcionális programozási nyelv az audiojel feldolgozásához
Engedély GPL
Weboldal faust .grame .fr

FAUST (Funkcionális audio stream) egy domain-specifikus tisztán funkcionális programozási nyelv végrehajtása jelfeldolgozó algoritmusok formájában könyvtárak , audio plug-inek , vagy önálló alkalmazásokat. A FAUST program egy jelfeldolgozót jelöl: egy matematikai függvény, amelyet valamilyen bemeneti jelre alkalmaznak, majd táplálnak.

Áttekintés

A FAUST programozási modell ötvözi a funkcionális programozási megközelítést a blokkdiagram szintaxisával:

  • A funkcionális programozási megközelítés természetes keretet biztosít a jelfeldolgozáshoz . A digitális jeleket az idő diszkrét függvényeként , a jelfeldolgozókat mint másodrendű funkciókat modellezik, amelyek működnek rajtuk, és a FAUST blokkdiagram- összeállítási operátorait , amelyeket a jelfeldolgozók összekapcsolására, harmadrendű függvényként stb.
  • A blokkdiagramok, még ha tisztán szövegesek is, mint a FAUST-ban, elősegítik a jelfeldolgozás moduláris megközelítését, amely megfelel a hangmérnökök és az audiokészítők szokásainak.

A FAUST program nem egy hangot vagy egy hangcsoportot ír le, hanem egy jelfeldolgozót . A program forrása definíciókészletként van szervezve, legalább a kulcsszó meghatározásával process (a main C-ben megegyező értékkel):

process = ...;

A FAUST fordító lefordítja a FAUST kódot C ++ objektummá , amely ezután kapcsolódhat más C ++ kódhoz, hogy teljes programot készítsen.

A létrehozott kód a minta szintjén működik. Ezért alkalmas alacsony szintű DSP funkciók megvalósítására, mint például rekurzív szűrők . A kód beágyazható is . Önálló és nem függ semmilyen DSP könyvtártól vagy futási rendszertől . Nagyon determinisztikus viselkedéssel és állandó memóriamérettel rendelkezik.

A FAUST szemantikája egyszerűvé és jól körülhatárolhatóvá válik. Lehetővé teszi a FAUST fordító szemantikai vezérlését . Ahelyett, hogy a programot szó szerint állítaná össze, összeállítja az általa jelölt matematikai függvényt. Ez elősegítheti az alkatrészek újrafelhasználását. Ezenkívül a FAUST program pontos szemantikájához való hozzáférés egyszerűsítheti a megőrzési kérdéseket.

A FAUST egy szövegnyelv, de blokkdiagram-orientált. Kétféle megközelítést ötvöz: a funkcionális programozást és az algebrai blokkdiagramokat , amelyeket a funkciókompozíció révén építenek fel . Ehhez a FAUST öt kompozíciós művelet blokkdiagram-algebrájára támaszkodik .

Példakód

A FAUST programok meghatároznak egy process funkciót, amely a bejövő adatokon működik. Ez analóg main a legtöbb programozási nyelv funkciójával. A következő példa csendet produkál:

process = 0;

A második példa a bemeneti jelet a kimenetre másolja. Ez magában foglalja a _ primitívumot, amely a jelek azonosságfüggvényét jelöli :

process = _;

Egy másik példa a sztereó jelet mono jellé foglalja össze a + primitív használatával:

process = +;
Image
Blokkdiagramok, amelyeket Faust generált néhány egyszerű programból

A legtöbb FAUST primitív analóg a számok C megfelelőjével, de jelekre emeli őket. Például a FAUST primitív sin az X jelen működik úgy, hogy a C függvényt sin alkalmazza minden X mintára [t]. Az összes C numerikus függvénynek megvan a megfelelője a FAUST-ban. Néhány jelfeldolgozó primitív a FAUST-ra jellemző. Például a késleltetési operátor @ két bemeneti jelet vesz fel: X (késleltetendő jel) és D (alkalmazandó késleltetés), és Y kimeneti jelet állít elő, így Y (t) = X (t - D (t) ).

Blokkdiagram összetétele

A Max-szerű vizuális programozási nyelvekkel ellentétben, ahol a felhasználó manuálisan csatlakoztatja a kapcsolatot, a FAUST primitíveket blokkdiagramokba állítják össze , magas szintű blokkdiagram- összeállítási műveletek segítségével.

Image
Egyszerű példák a blokkdiagram összeállítására
A FAUST-ban használt blokkdiagram- összetétel operátorok
f ~ g Rekurzív kompozíció (4. prioritás)
f, g Párhuzamos összetétel (3. prioritás)
f: g Szekvenciális összetétel (2. prioritás)
f <: g Osztott összetétel (1. prioritás)
f:> g Összevonás egyesítése (1. prioritás)

A szekvenciális összetevő operátor segítségével : a kimenet + átirányítható a bemenetre a jel abszolút értékénekabs kiszámításához :

process = + : abs;

Íme egy példa a párhuzamos kompozícióra az , operátor segítségével, amely párhuzamosan rendezi a bal és a jobb kifejezést. Ez analóg a sztereó kábellel.

process = _,_;

Ezek az operátorok tetszőlegesen kombinálhatók. A következő kód megszorozza a bemeneti jelet 0,5-tel:

process = _,0.5 : *;

A fentieket curried formában lehet átírni :

process = *(0.5);

A rekurzív kompozíció operátor ~ felhasználható ciklusokkal rendelkező blokkdiagramok létrehozására (amelyek implicit egymintás késleltetést tartalmaznak). Itt van egy példa egy integrátorra, amely felveszi az X bemeneti jelet és kiszámítja az Y kimeneti jelet úgy, hogy Y (t) = X (t) + Y (t − 1):

process = + ~ _;

Teljes alkalmazások generálása

Meghatározott architektúra fájlok használatával a FAUST program felhasználható kódok előállítására különféle platformokhoz és beépülő modulokhoz. Ezek az architektúra fájlok burkolóként működnek, és leírják a kölcsönhatásokat a gazdagép audio és GUI rendszerével. 2015-től több mint 10 architektúra támogatott, és újakat bárki megvalósíthat.

Image
A mixer.dsp (a FAUST terjesztésben elérhető) képernyőképe a jack-qt architektúrával
Néhány architektúra fájl elérhető a FAUST számára
alsa-gtk.cpp ALSA alkalmazás + GTK
alsa-qt.cpp ALSA alkalmazás + QT4
android.cpp Android-alkalmazások
au.cpp Audio egység plug-in
ca-qt.cpp CoreAudio alkalmazás + QT4
ios-coreaudio.cpp iPhone és iPad alkalmazások
jack-gtk.cpp JACK alkalmazás + GTK
jack-qt.cpp JACK alkalmazás + QT4
ladspa.cpp LADSPA plug-in
max-msp.cpp Max MSP plug-in
pd.cpp Puredata plug-in
q.cpp Q nyelvű plug-in
supercollider.cpp Supercollider plug-in
vst.cpp VST plug-in
vsti-mono.cpp Monofonikus VST eszköz plug-in
vsti-poly.cpp Polifonikus VST Instrument plug-in

Blokkdiagramok generálása

Egy hasznos opció lehetővé teszi a program blokkdiagramjának ábrázolását egy vagy több SVG grafikus fájlként.

Hasznos megjegyezni a blokkdiagram és a létrehozott C ++ kód közötti különbséget. Mint elhangzott, a legfontosabb ötlet itt nem a blokkdiagram szó szerinti összeállítása, hanem az általa jelölt matematikai függvény. A modern C / C ++ fordítók szintén nem szó szerint állítják össze a programokat. De a C / C ++ komplex szemantikája miatt (mellékhatások, mutatóaliasítás stb. Miatt) nem tudnak nagyon messzire menni ebben az irányban. Ez a tisztán funkcionális nyelv kifejezett előnye: lehetővé teszi a fordítók számára, hogy nagyon fejlett optimalizálásokat végezzenek.

Nyilaszerű szemantika

A Faust szemantika majdnem megegyezik a Haskell Arrows típusú osztályéval. Az Arrow típusú osztály azonban nincs kötve a jelfeldolgozókhoz.

A FAUST és az Arrow kombinátorok egyenértékűsége
f~g loop ((\(a,b) -> (b,a)) ^>> f >>> id &&& (delay>>>g)) ahol delay nem a típusosztály módszere Arrow , hanem a jelfeldolgozó nyilakra jellemző
f,g f***g
f:g f>>>g
f<:g f>>^h>>>g megfelelő funkcióval h (vagy &&& különleges esetekben)
f:>g f>>^h>>>g megfelelő funkcióval h

A nyílkombinátorok szigorúbbak, mint a FAUST társaik, pl. A párhuzamos kompozíció fészkelése megmarad, és az operandus bemeneteinek &&& pontosan meg kell egyezniük.

Hivatkozások

Külső linkek