<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Phausto: fast and accessible DSP programming for sound and music creation in Pharo</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Domenico Cipriani</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Nahuel Palumbo</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Sebastian Jordan Montaño</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Stéphane Ducasse</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Pharo Association</institution>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Univ. Lille, Inria</institution>
          ,
          <addr-line>CNRS, Centrale Lille, UMR 9189 CRIStAL, Park Plaza, Parc scientifique de la Haute-Borne, 40 Av. Halley Bât A, 59650 Villeneuve-d'Ascq</addr-line>
          ,
          <country country="FR">France</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>This paper introduces Phausto, a library that generates sounds in Pharo programming language using Faust (Functional Audio Streams), a programming language designed to develop real-time digital signal processors (DSP). In Phausto, DSP programs are created by the composition of Unit Generators written in a MUSIC-N style, like the ChucK programming language, or from a string containing a valid Faust program. We present Phausto's API, implementation details and an overview of its syntax, and of Unit Generators and ToolKit elements. We also analyze the motivations behind the project and identify its target audiences. Finally, we present the conclusions drawn after one year of development and use, and outline the agenda for future work.</p>
      </abstract>
      <kwd-group>
        <kwd>eol&gt;sound synthesis</kwd>
        <kwd>live coding</kwd>
        <kwd>audio</kwd>
        <kwd>DSP programming</kwd>
        <kwd>Pharo</kwd>
        <kwd>Faust</kwd>
        <kwd>ChucK</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>All Unit Generators have default values for their parameters, which are themself Faust boxes, too.
The main contributions of this paper are:
• A description of the Phausto library architecture and implementation details.
• Examples of sound synthesis using Phausto API.</p>
      <p>• An overview of the Phausto Standard Library and ToolKit.</p>
    </sec>
    <sec id="sec-2">
      <title>2. Motivation</title>
      <p>We develop Phausto to generate sound directly from the Pharo environment, without needing external
dependencies to play performance during live coding sessions.</p>
      <p>We have identified three primary target audiences for Phausto:
1. Pharo programmers who want to include sounds or sonic interaction in their Pharo applications,
including procedural audio designed Faust extensive physical modelling synthesis library;
2. Artists with little or no computer literacy who want to design and develop synthesisers and
efects for their music creation fast and easily. Pharo ofers a transparent syntax with a neat IDE
and a browser that enables users to avoid complex library management; Phausto ensures all Faust
libraries are readily accessible as well-documented classes and methods.
3. Students and beginners who want to develop their audio plug-ins, by exporting DSPs developed
in Pharo to Cmajor1 patches thanks to the Faust2CMajor export2. Cmajor is a new C-family
programming language for writing fast and portable audio software, created by Julian Storer
and Cesare Ferrari. Cmajor patches can be exported as native VST/AU/AAX plugins or loaded
directly into a Digital Audio Workstation (DAW) with the Cmajor VST/AU plugin</p>
    </sec>
    <sec id="sec-3">
      <title>3. Phausto Overview and Architecture</title>
      <p>create a Box from
Phausto Objects</p>
      <p>BOX</p>
      <p>API
creates DSP
PHAUSTO from a String</p>
      <p>Unit Generators are</p>
      <p>implemented
in the FAUST libraries
creates a DSP from a Box</p>
      <p>DYNAMIC ENGINE</p>
      <p>LIBFAUST
FAUST LIBRARIES
(stdfaust.lib)
the FAUST generated
prorgam computes
samples for the
underlying audio layer</p>
      <p>PORTAUDIO
fills blocks of
audio bufffers</p>
      <p>PLATFORM</p>
      <p>SPECIFIC
AUDIO DRIVER
outputsacuhdaionntoelleft
outpcuhtasnanuedliotoright</p>
      <p>Phausto is an open-source Pharo library to create synthesisers and audio efects that are converted
into Faust programs by an embedded Faust compiler. Figure 1 shows an overview of its architecture.</p>
      <sec id="sec-3-1">
        <title>1https://cmajor.dev/</title>
        <p>2https://github.com/grame-cncm/Faust/tree/master-dev/architecture/cmajor#Faust2cmajor</p>
        <p>The Dynamic Engine in the backend initialises the PortAudio library and opens a stream for audio
I/O. It creates a DSP from strings of valid Faust codes or Boxes created with the Phausto API. The
definitions of the Unit Generators are implemented in the Faust libraries, which are accessed by the
Dynamic Engine when DSPs are created.</p>
        <p>The DSP is a Faust program that computes floating point numbers between -1.0 and 1.0 as output.
These values fill the blocks of a PortAudio stream. The platform-specific audio driver transforms the
PortAudio stream into sound, using the sound interface Digital-To-Analog converter.</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>4. Under-the-hood: Faust programming language</title>
      <p>
        Faust (Functional Audio Stream) [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] is a functional programming language tailored to sound synthesis
and audio processing created at the GRAME-CNCM Research Department3. It provides developers
with an alternative to C/C++ for designing and deploying DSPs. One of its key features is a block
diagram-oriented syntax, which eases a modular approach to the creation of synthesisers and efects. A
Faust program describes a signal processor, essentially mapping input signals to output signals, but it
does not outline a connection to the external world4.
      </p>
      <sec id="sec-4-1">
        <title>4.1. Faust dynamic engine</title>
        <p>The dynamic engine implementation describes a straightforward C API for Faust objects including
the audio drivers responsible for rendering the samples computed by the DSP and the library used for
reading audio data files. Faust DSP objects are structures that can be either instantiated from a string of
valid Faust code by calling the createDsp function:
dsp* createDsp (const char* name_app, const char* dsp_content,</p>
        <p>int argc, const char* argv[], const char* target, int opt_level);
or from Boxes (Section 4.3) with the createDspFromBoxes function:
dsp* createDspFromBoxes(const char* name_app, Box box,</p>
        <p>int argc, const char* argv[], const char* target, int opt_level);</p>
        <p>After being created, DSP needs to be initialized by calling the initDSP function with a sampling
rate and bufer size for the audio driver. 5. Finally, start function is called to open the audio stream
and processing audio blocks until stop function is called.
bool initDsp(dsp* dsp, RendererType renderer, int sr, int bsize);
bool startDsp(dsp* dsp);</p>
        <p>The dynamic engine also allows access to and modification of DSP parameters using the
getParamValueDsp and setParamValueDsp functions:
FaustFLOAT getParamValueDsp (dsp* dsp_ext, int p);
FaustFLOAT setParamValueDsp (dsp* dsp_ext, int p, FaustFLOAT val);</p>
        <p>
          The dynamic engine includes the Faust Compiler [
          <xref ref-type="bibr" rid="ref7">7</xref>
          ], libFaust in Figure 1. The compiler generates
bytecode from the Faust Imperative Representation, which is then successively executed by a
stackbased virtual machine. We chose this approach for its lightweight nature and zero dependencies,
although other options with faster execution, as an LLVM [
          <xref ref-type="bibr" rid="ref8">8</xref>
          ] backend6. The Faust compiler meets the
        </p>
        <sec id="sec-4-1-1">
          <title>3https://Faust.grame.fr/</title>
          <p>
            4https://Faustdoc.grame.fr/manual/architectures/
5For a more detailed description of sampling rates, audio bufer size and audio drivers, refer to the first chapters of The Audio
Programming Book [
            <xref ref-type="bibr" rid="ref6">6</xref>
            ]
6Linked with components of the LLVM compiler toolchain, the library allows the deployment of a complete dynamic
compilation chain from source to executable code.
performance needs of Phausto intended goals and audience; as interactions with the Faust program
occur only once it has been created and initialized, the choice between the LLLVM compiler and the
backend interpreter does not afect the control on-the-fly of the DSP parameters.
          </p>
        </sec>
      </sec>
      <sec id="sec-4-2">
        <title>4.2. The PortAudio layer</title>
        <p>
          To maintain compatibility across diferent operating systems and keep the ToolKit as lightweight as
possible, we leverage PortAudio. PortAudio is an Open Source Cross Platform C library7 and API for
audio input and output [
          <xref ref-type="bibr" rid="ref2">2</xref>
          ]. It was designed to simplify the development of real-time audio applications,
and it is part of a larger initiative called PortMusic8 that also includes MIDI9 capabilities.
        </p>
        <p>PortAudio renders the samples computed by the Faust interpreter with the PortAudio and Faust’s
native library10. This approach ensures all the dependencies (including all Faust libraries) to be less
than 10 MB.</p>
        <p>PortAudio handles the connection with the audio input and audio ports on the host platform. It
internally manages audio stream bufers and requests audio processing from the client application via a
callback that is associated with an opened stream. In the dynamic engine, this association is managed
by the following function:
bool initDsp(dsp* dsp, RendererType renderer, int sr, int bsize);</p>
        <p>For instance, in Phausto we initialise a DSP by calling:
initDsp(aDSP, 0, 44100, 512);</p>
        <p>This function sets the sampling rate and the bufer size and allows one to choose a diferent renderer
from PortAudio if needed.
4.3. The Box API
The Faust C box API11 allows for the programmatic creation of a box expression, which is used to create
a DSP object. This stage is an intermediate public entry point created in the Semantic Phase of Faust’s
compilation chain. The Semantic Phase is the first step of Faust’s compilation chain; starting from the
DSP source code written in Faust, the Semantic Phase produces signals that are (conceptually) infinite
streams of samples. Boxes can be created by calling a specific function defined in libFaust-box-c. e.g., for
creating a UI button:
Box CboxButton(const char* label);</p>
        <p>Or from a string of Faust code by calling:
Box CDSPToBoxes(const char* name_app, const char* dsp_content,</p>
        <p>
          int argc, const char* argv[], int* inputs, int* outputs, char* error_msg);
The Box API also supplies methods to convert numbers into Boxes and to connect Boxes via the five
binary composition operators of the language12
7https://github.com/PortAudio/portaudio
8https://www.cs.cmu.edu/~music/portmusic/
9https://midi.org/
10https://github.com/grame-cncm/Faust/blob/master-dev/architecture/Faust/gui/Soundfile.h
11https://Faustdoc.grame.fr/tutorials/box-api/
12In Faust there are five binary composition operations to combine block diagrams: sequential( :) , parallel( , ) , split( &lt;: )
merge (:&gt;) , recursive ( ~ ) . For a detailed description of Faust binary operators see [
          <xref ref-type="bibr" rid="ref1">1</xref>
          ].
        </p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>5. Phausto programming by example: Fast and easy sound synthesis</title>
      <p>
        Programming DSP with Phausto is fast and easy because it combines the modular synthesiser [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ]
creative and flexible mindset with the Pharo Object Oriented Programming paradigm. Phausto takes
advantage of Pharo’s concise and iconic syntax, the reflectiveness of the environment, and the ease of
developing reusable code. With Phausto, Pharo becomes a fully-fledged IDE for audio synthesis and
algorithmic composition without needing additional extensions (in contrast to other IDEs and code
editors in mainstream programming languages). Moreover, manipulating the DSP parameters using
Pharo syntax provides musicians with a tool ofering unnoticeable latency 13 for their live performances
and compositions.
5.1. Start your engine
pulse := PulseOsc new. "Instantiate an Unit Generator"
dsp := pulse stereo asDsp. "Create the DSP in stereo mode"
dsp init. "Initialize the DSP"
dsp start. "Start the sound"
dsp stop. "Stop the sound"
dsp destroy. "Destroy the DSP"
      </p>
      <p>Listing 1: Simple example using Phausto</p>
      <p>Listing 1 shows a simple example using Phausto playing a Pulse Oscillator. First, we instantiate the
UGen to play, in this case, a Pulse Oscillator. Then we create a stereo DSP by sending the messages
asDSP to our Pulse Oscillator. (To change the mono output of a synth to stereo, we send the stereo
message to the Box that is the result of the multiplication).</p>
      <p>Once our DSP is created, we initialize and start it to hear the sound it generates. We can stop the
DSP whenever we want. If we are finished with our DSP programming, it would be a good practice to
destroy it.</p>
      <sec id="sec-5-1">
        <title>5.2. Taking Control of Configuration and Parameters</title>
        <p>Each UGen has diferent configuration parameters with default values, each of them documented in the
class comments. For example, to control the parameters of a Pulse Oscillator we need to specify the
freq - for frequency in Hertz, and duty - to change the oscillator duty cycle (between 0 and 1).
pulse := PulseOsc new freq: 220; duty: (LFOTriPos new freq: 4).
dsp := pulse stereo asDsp.
dsp init.
dsp start.</p>
        <p>Listing 2: Configuring UGen parameters
13The latency time refers to the duration required to execute the message setValue:parameter: (which is is an FFI call),
to execute. If we run a simple benchmark:
[1000 timesRepeat: [dsp setValue: (Random new nextIntegerBetween: 90 and: 900) parameter:
’SquareOscFreq’ ]] timeToRun.</p>
        <p>The results show that a single call takes approximately 0.007 milliseconds. At a 192 kHz sample rate, this latency is slightly
more than 1 sample, making it efectively instantaneous compared to the rate at which the computer can generate sound.
However, it’s important to consider that the latency of calling the function void setParamValueDsp(dsp* dsp_ext,
int p, FaustFLOAT val); through the dynamic engine primarily depends on the bufer size and sample rate parameters
used in the Phausto audio layer. By default, Phausto initialize its DSPs with a 44100 sample rate and a bufer size of 512
samples. This corresponds to a latency of approximately 11.6 ms, which is below the 20 ms threshold generally considered
to be imperceptible or minimally disruptive for human perception, as demonstrated by the Haas efect.</p>
        <p>The code in Listing 2 sets the frequency of the Pulse Oscillator to 220 Hz (default frequency is 440 Hz)
and assigns the value of the duty cycle to a Low-Frequency Oscillator (LFO) with a Triangular Positive
Waveform (LFOTriPos oscillates between 0 and 1).</p>
      </sec>
      <sec id="sec-5-2">
        <title>5.3. Live programming</title>
        <p>To modify a parameter of a UnitGenerator in real time, while the DSP is playing, we create a PhHSlider
by sending the message init: initialValue to a ByteSymbol. This creates a PhHSlider with
the ByteSymbol as a label and the required initial value. Then, we control the parameter on live by
sending the message setValue: parameter: to our DSP.
lfoFreq := #lfoFreq init: 2.
pulse := PulseOsc new freq: 220; duty: (LFOTriPos new freq: lfoFreq ).
dsp := pulse asDsp.
dsp init.
dsp start.
"Change the value of a parameter while the sound is playing"
dsp setValue: 8 parameter: ’lfoFreq’.
... "Continue using the DSP until the end"</p>
        <p>Listing 3: Changing UGen parameters while playing</p>
        <p>Listing 3 shows an example of changing the frequency of the LFO from 2 to 8 Hz after the DSP is
started.</p>
      </sec>
      <sec id="sec-5-3">
        <title>5.4. Music composition with Pharo Processes</title>
        <p>Once we have started our DSP we can create music compositions using Pharo Processes, Blocks and
Delays.
synth := (SquareOsc new freq: #SquareNote) * (AREnv new trigger: #SquareGate).
dsp := (synth =&gt; SatRev new) stereo asDsp.
dsp init.
dsp start.
note := 72.
time := 2.</p>
        <p>Essentially, the playNote:prefix:dur: the method simulates the action of playing a key on a
MIDI keyboard. For this operation, our DSP needs a parameter with the gate sufix to trigger its envelope
and a parameter named Note for controlling the frequency. Both parameters must share the same prefix,
which is ’Square’ in this example.</p>
      </sec>
    </sec>
    <sec id="sec-6">
      <title>6. Core Implementation</title>
      <p>
        Phausto allows Pharo users to use functions and data structures from the Faust programming language
via Foreign Function Interface (FFI) [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ]. The library contains the API to instantiate, access and modify
DSP and create Faust Boxes as described in Section 4.
      </p>
      <p>To use Phausto, the librariesBundle folder must be downloaded from the GitHub repository and placed
next to the current Pharo image14. The libraries bundle includes hundreds of functions for synthesis
and processing audio written in Faust (see Section 7).</p>
      <sec id="sec-6-1">
        <title>6.1. DSP creation from Phausto Boxes</title>
        <p>We create UnitGenerators objects in Phausto using the Faust Box API (described in Section 4.3). It
enables writing DSP in Pharo with a dedicated API that hides Faust syntax from the user.</p>
        <p>The Box API class provides the connection to over 50 functions that we have considered fundamental
for developing the Phausto API. These functions include those to create Faust primitives, composition
operators and mathematical expressions. The methods that create or combine boxes return a new Box.
If the operation fails, a null pointer is returned.</p>
      </sec>
      <sec id="sec-6-2">
        <title>6.2. The lifecycle of a DSP</title>
        <p>A DSP object is originally initialised (i.e., connected to the PortAudio layer) and subsequently started,
stopped, and at the end of its use destroyed to avoid dangling pointers. All these methods call to the
corresponding function defined in the dynamic engine.</p>
        <p>Once a DSP is initialised we can check its parameters on a Transcript (traceAllParams) and modify
the value of its parameters sending the message setValue: aParameter with a Number or a Box as
the first argument and with a String as the second argument.</p>
      </sec>
      <sec id="sec-6-3">
        <title>6.3. Managing the global compilation context</title>
        <p>To use the Faust Box API we create a singleton global compilation context before we create a Box, and
destroy this context after the Box has been used to create a DSP. For this reason, the Box class has a
shared variable called libContext not initialised when the Pharo image is opened. Every call to the
BoxAPI class in Phausto first ensures the creation of the context by calling createLibContextFFI if
not exist. At the same time, every time a DSP is created, the compilation context is destroyed by calling
BoxAPI unique instance destroyLibContext.</p>
      </sec>
    </sec>
    <sec id="sec-7">
      <title>7. Phausto Standard Library and the ToolKit</title>
      <p>The Phausto Standard Library includes the bindings to functions in the standard Faust library stdFaust.lib
15. They are implemented as subclasses of UnitGenerator and organised in package tags, while the
ma.lib (which includes mathematical operations) is ported as methods of the PhBox superclass.
14https://github.com/lucretiomsp/phausto
15https://faustlibraries.grame.fr/</p>
      <p>The design of the Phausto API exposes all original arguments as instance variables of the UGen
object and default values are set during initialisation16. The setters convert their arguments into a Box,
allowing the user to use both, fixed numbers or other boxes ( e.g., other UnitGenerators, or a UIPrimitive
to control the variable in real-time).</p>
      <p>One specific UnitGenerator is created by sending the asBox message. This method first creates an
intermediateBox from a Faust code string without parameters and returns a finalBox from the connection
of the instance variables to the intermediateBox. Listing 5 presents the binding between the djembe
function in Faust and the Djembe class in Phausto.
"djembe function in physmodels.lib"
pm.djembe(freq, strikePosition, strikeSharpness, gain, trigger) : _
"Djembe class Phausto"
Djembe &gt;&gt;&gt; initialize
super initialize.
processExpression := ’process = pm.djembe;’.
self freq: 440.
self strikePosition: 0.5.
self strikeSharpness: 0.8.
self gain: 0.5.</p>
      <p>self trigger: 0.0
Djembe &gt;&gt;&gt; asBox
| intermediateBox finalBox |
intermediateBox := super asBox.</p>
      <p>finalBox := (freq , strikePosition , strikeSharpness , gain , trigger )
connectTo: intermediateBox.</p>
      <p>^ finalBox</p>
      <p>Listing 5: Pharo Djembe binding</p>
      <p>The ToolKit17 tag of the Phausto package includes a set of classes that do not have a corresponding
function in the standard Faust library. These classes encompass units for sound generations that
combine one or more UnitGenerators.</p>
      <p>The ToolKit includes a combination of efects and modulators ( e.g., FIlterEnvelope or FilterLFO),
efects and synthesizers with a custom design ( e.g., DelayFeedBack or SamplePlayer) or ‘utilities’ as the
Incrementer (that increments its output by an increment value at every step).</p>
    </sec>
    <sec id="sec-8">
      <title>8. Related work</title>
      <p>
        One of the primary sources of inspiration for Phausto is Kyma [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ], an object-oriented environment for
music composition written in Smalltalk-80, created by Carla Scaletti in the mid of 1980. The first version
of Kyma ran on a Macintosh 512k computer and could not manipulate sound in real time. This is why
Scaletti and Kurt J. Hebel collaborated to integrate a separate multiprocessor to compute and process
audio [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ]. Although there is no direct connection between Phausto and Kyma, we share Scaletti’s
desire to make music programming more accessible to composers without a strong background in
computer science. Our goal is also to make music creation more accessible to programmers without a
strong background in music and sound synthesis.
      </p>
      <p>Pharo programmers could play sound samples in Pharo since Pharo 9.0 using the Sound package18.
16The default values have been an arbitrary choice, influenced by other programming languages such as ChucK, PureData,</p>
      <p>
        SuperCollider, as well as our direct experience and by empirical audio tests during development.
17The ToolKit name is a homage to the Synthesis ToolKit [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] in C++(STK)by Perry R. Cook and Gary Scavone, as its primary
goal is to facilitate faster development of synthesisers and efects.
18https://github.com/pharo-contributions/Sound
Pharo Sound plays samples and sounds by FFI calls to the SDL2 library19. This package is poorly
documented and ofers very few audio generators and efects based on a Pharo implementation of
low-level C techniques for computing samples. Consequently, its API is dificult to access and complex
to expand, it does not use terminology consistent with modern audio programming practices.
      </p>
      <p>FaustPy20 is a Python wrapper for Faust implemented using CFFI that works with Python 2.7 and
3.2+. It is the only wrapper for a high-level general-purpose programming language supporting
objectoriented programming.</p>
    </sec>
    <sec id="sec-9">
      <title>9. Future Work</title>
      <p>In its first year of development, Phausto has become a cross-platform stable library and we have been
able to provide bindings to more of the 30% of the Faust Box API. Additionally, 25% of the functions of
the Faust standard library has been implemented as classes and tested. In the following months, our
focus will be on porting all the functionalities of the Faust programming language. This includes the
ability to visualize the DSP block diagram as a .svg file and the possibility to save DSP written in Pharo
as a file, which can be exported to diferent target languages, such as CMajor, C++ and WAST 21.</p>
      <p>Along with the implementation of all the UnitGenerators, the new ToolKit classes will be designed
and implemented to meet the needs of musician and sonic artists. As Phausto expands, more efort will
be required to prepare valid tests for all the UnitGenerators, which include an inquiry into how to write
valid tests for audio generators.</p>
      <p>In addition, we have planned to develop a new package called TurboPhausto is specifically designed
to program music on the fly with Coypu. TurboPhausto is inspired by the SuperDirt engine for
SuperCollider. It provides a set of ready-to-use synthesizers and efects and an API to easily play a
collection of audio samples located in subfolders of a specific folder. We will include a substantial
amount of high-quality samples for instant gratification and the option to expand the collection.</p>
      <p>Finally, in collaboration with the Evref team, we are working on a live programming development
environment. It encompasses a custom Playground and a set of custom UI elements (faders, rotary
sliders, buttons, and more) for Phausto made with Toplo22.
10. Conclusion
After ten months of development, Phausto is a comprehensive solution for enabling sound synthesis
into Pharo applications. Phausto ofers a diverse ToolKit that includes sample players, basic oscillators,
envelopes, various physical models, resonant filters, reverbs, and delays. The extensive list of Unit
Generators features a streamlined API for parameter manipulation.</p>
      <p>Additionally, TurboPhausto’s synthesizers and efects were showcased in a 30-minute live
performance titled "Riding the MoofLod" during the ESUG2024 conference at Lille.</p>
    </sec>
    <sec id="sec-10">
      <title>Acknowledgments</title>
      <p>We would like to thank Stephane Sletz, Yann Orlarey, Guillermo Polito, Esteban Lorenzano and Pablo
Tesone, for their invaluable support, push and assistance throughout the development of Phausto.</p>
      <p>We express our gratitude to the organisation of the ESUG for the inspiration and the knowledge we
gained during the conferences. In particular, the meetings with the members of the Pharo team and
GRAME in Lyon 2023. It was instrumental in the birth of Phausto.
19SimpleDirectMedia is a cross-platform development library designed to provide low-level access to audio, keyboard, mouse
and graphics hardware.
20https://github.com/marcecj/Faust_python
21https://webassembly.js.org/docs/contrib-wat-vs-wast.html
22https://github.com/pharo-graphics/Toplo</p>
      <p>Special thanks to Carla Scaletti and Kurt J. Hebel at Symbolic Sound Corporation fo their lifelong
efort to spread love for Smalltalk and computer music, and to Cristian Vogel for pushing Kyma into the
world of electronic dance music.</p>
      <p>This work has been supported by the Pharo Consortium.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>E.</given-names>
            <surname>Gaudrain</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Orlarey</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A FAUST</given-names>
            <surname>Tutorial</surname>
          </string-name>
          ,
          <year>2003</year>
          . URL: https://hal.science/hal-02158895, manual.
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>R.</given-names>
            <surname>Bencina</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Burk</surname>
          </string-name>
          ,
          <article-title>Portaudio-an open source cross platform audio api</article-title>
          , in: ICMC,
          <year>2001</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>G.</given-names>
            <surname>Wang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Cook</surname>
          </string-name>
          ,
          <article-title>Chuck: A concurrent, on-the-fly audio programming language</article-title>
          ,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <surname>G. Wang,</surname>
          </string-name>
          <article-title>The chuck audio programming language. "a strongly-timed and on-the-fly environ/mentality"</article-title>
          ,
          <source>Ph.D. thesis, USA</source>
          ,
          <year>2008</year>
          . AAI3323202.
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>C.</given-names>
            <surname>Roads</surname>
          </string-name>
          , The Computer Music Tutorial, MIT Press, Cambridge, MA, USA,
          <year>1996</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>R.</given-names>
            <surname>Boulanger</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Lazzarini</surname>
          </string-name>
          ,
          <source>The Audio Programming Book</source>
          , The MIT Press,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>S.</given-names>
            <surname>Letz</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Orlarey</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Fober</surname>
          </string-name>
          ,
          <article-title>An Overview of the FAUST Developer Ecosystem</article-title>
          , in: International Faust Conference, Mainz, Germany,
          <year>2018</year>
          . URL: https://hal.science/hal-02158929.
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>C.</given-names>
            <surname>Lattner</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Adve</surname>
          </string-name>
          ,
          <article-title>Llvm: a compilation framework for lifelong program analysis and transformation</article-title>
          ,
          <source>in: International Symposium on Code Generation and Optimization</source>
          ,
          <year>2004</year>
          .
          <source>CGO</source>
          <year>2004</year>
          .,
          <year>2004</year>
          , pp.
          <fpage>75</fpage>
          -
          <lpage>86</lpage>
          . doi:
          <volume>10</volume>
          .1109/CGO.
          <year>2004</year>
          .
          <volume>1281665</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>M.</given-names>
            <surname>Vail</surname>
          </string-name>
          ,
          <article-title>The synthesizer: a comprehensive guide to understanding, programming, playing, and recording the ultimate electronic music instrument</article-title>
          , Oxford University Press,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>G.</given-names>
            <surname>Polito</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Ducasse</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Tesone</surname>
          </string-name>
          , T. Brunzie, Unified fi - calling
          <source>foreign functions from pharo</source>
          ,
          <year>2020</year>
          . URL: http://books.pharo.org/booklet-ufi/ .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>P. R.</given-names>
            <surname>Cook</surname>
          </string-name>
          ,
          <string-name>
            <given-names>G. P.</given-names>
            <surname>Scavone</surname>
          </string-name>
          ,
          <article-title>The synthesis toolkit (stk</article-title>
          ),
          <year>1999</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>C.</given-names>
            <surname>Scaletti</surname>
          </string-name>
          ,
          <article-title>Composing sound objects in kyma, Perspectives of New Music (</article-title>
          <year>1989</year>
          )
          <fpage>42</fpage>
          -
          <lpage>69</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>M.</given-names>
            <surname>Heying</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A</given-names>
            <surname>Complex</surname>
          </string-name>
          and
          <article-title>Interactive Network: Carla Scaletti, the Kyma System, and the Kyma User Community</article-title>
          , University of California, Santa Cruz,
          <year>2019</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>