The documentation on faust for teensy
https://faustdoc.grame.fr/tutorials/teensy/ states that the
command run with the truck icon is:
faust2teensy -lib FaustTriangle.dsp
The git
https://github.com/grame-cncm/faust/tree/master-dev/architecture/teensy
doesn't mention -uim as an available option for faust2teensy,
though it is available for faust in general
https://faustdoc.grame.fr/manual/options/
This means that more than 3 instances are really not possible
with the current state of faust2teensy.
Thank you all for helping with this!
Tejas
On Thu, Mar 5, 2026 at 2:24 PM Tejas Rode <[email protected]>
wrote:
Great conversation and inputs!
Tommy, is the -uim flag implicitly used when I click on the
'truck' icon and select 'teensy' in fausteditor online? If
not, how could I enable it? Since I'm new to faust, I'll need
some direction there.
If, in the end, the upper limit on the number of instances of
alias-suppressed triangle acts as a roadblock, I'll have to
unfortunately move away from faust, and rely on what native
teensy functions can do.
Thanks,
Tejas
On Thu, Mar 5, 2026 at 10:22 AM Tommy Rushton
<[email protected]> wrote:
The -uim option already generates lightweight C macros
as an alternative, but no embedded architecture
currently uses it.
On the contrary, faust2teensy uses this flag...
if [ $LIB -eq1 ];then mkdir -p $MODULENAME
faust $OPTIONS -uim -a $FAUSTARCH/teensy/teensy.cpp -i $FILE
-o $MODULENAME/$MODULENAME.cpp
etc.
Cheers,
Tommy
Le 05/03/2026 à 16:28, Julius Smith a écrit :
> Can Gemini help ((-: ?
Absolutely! However, for software development, I prefer
Claude Opus 4.6 (with "thinking" enabled liberally).
Here is Claude's first take:
Prompt:
> Research existing Faust architecture files for
embedded targets to understand what currently exists
Reply:
Here is an overview of existing Faust architecture files
for embedded platforms, compiled by browsing the Faust
GitHub repo and documentation site.
OVERVIEW OF EXISTING FAUST ARCHITECTURE FILES FOR
EMBEDDED PROCESSORS
=====================================================================
THE CURRENT LANDSCAPE
Faust currently targets seven embedded/microcontroller
platforms through dedicated architecture files and
faust2xx scripts. Each has its own directory under
architecture/ in the Faust repo, plus a corresponding
faust2xx script in tools/faust2appls/. Here is what exists:
1. TEENSY (architecture/teensy/)
Files: teensy.cpp, teensy.h, README
Last updated: Nov 2023 (3 years ago)
Script: faust2teensy [-lib] [-midi] [-nvoices <num>]
Generates objects compatible with the PJRC Teensy Audio
Library. The generated C++ class derives from
AudioStream and uses setParamValue with string-matching
metadata tables to expose hslider/nentry/vslider
controls. Supports Teensy 3.6 and 4.x (FPU required).
Has a tutorial on the Faust documentation site. Key
limitations (as exposed in this email thread): the UI
metadata/control structure (string-matching table for
setParamValue) creates substantial overhead, limiting
the number of instances that can run concurrently. No
-mem or -sdram option support.
2. DAISY (architecture/daisy/)
Files: ex_faust.cpp, Makefile, faust_daisy_mem.py, README
Last updated: Dec 2025 (3 months ago, actively maintained)
Script: faust2daisy [-patch] [-pod] [-patchsm] [-sdram]
[-mem-thresh <num>] [-midi] [-nvoices <num>] [-sr <num>]
[-bs <num>] [-sram] [-qspi]
Supports Electrosmith Daisy Seed, Pod, Patch, and
Patch.Init() boards. Has the most sophisticated embedded
memory handling: a Python script (faust_daisy_mem.py)
post-processes generated C++ to move large buffers to
SDRAM. Supports multiple flash modes (FLASH, SRAM,
QSPI). Uses custom DaisyControlUI.h and daisy-midi.h
headers. The README notes an active refactoring
underway, with planned features including more compact
code, static memory allocation, and MIDI polyphonic
support. No tutorial on the Faust documentation site.
3. ESP32 (architecture/esp32/)
Re. the latter, since si.smoo works on a per-sample
basis it's way too heavy for the Teensy's CPU (picture
trying to smooth the XY-coordinates of 16 virtual sound
sources), so I take a hybrid approach and do my
parameter smoothing outside of Faust
Script: faust2esp32 [-lib] [-gramophone] [-multi]
[-midi] [-nvoices <num>] [-wm8978 or -ac101]
Targets the Espressif ESP32 family. Generates a C++
class and audio codec configuration objects. Currently
supports the Wolfson WM8978 (TTGO T-Audio) and AC101
codecs. Has a dedicated GRAME "Gramophone" mode. Has a
tutorial on the Faust documentation site. Includes a
drivers/ folder with codec-specific documentation.
4. HOTHOUSE (architecture/hothouse/)
Script: faust2hothouse [-midi] [-nvoices <num>] [-sr
<num>] [-bs <num>]
Targets the Cleveland Music Co. Hothouse DIY Pedal
(Daisy-based). Supports 6 knobs, 3 toggle switches, and
2 foot switches via [knob:N], [toggle:N], [foot:N]
metadata. Uses a Python script for SDRAM placement of
large buffers (same approach as Daisy). Uses custom
HothouseControlUI.h and shares daisy-midi.h with the
Daisy architecture. Relatively recent addition.
5. BELA (architecture/bela.cpp)
Script: faust2bela
A single architecture file for the Bela platform
(BeagleBone Black-based). Bela is more of an embedded
Linux system than a bare-metal microcontroller, so it
has more resources available. Architecture file was last
touched in April 2024.
6. OWL (architecture/owl.cpp)
Script: faust2owl
Targets the Rebel Technology OWL platform. Notable
because it already implements a custom OwlMemoryManager
(using the Faust -mem memory manager API), making it one
of the few embedded architectures that leverages the
custom memory allocation infrastructure. Single file
architecture.
7. CHAOS STRATUS (architecture/chaos-stratus/)
Script: faust2stratus
Targets the Chaos Audio Stratus guitar pedal. Uses a
Linux-based embedded system with SSH/SCP deployment.
Architecture includes build scripts, Docker support for
cross-compilation, and a stratus.cpp file. Relatively
sophisticated deployment pipeline.
8. SAM (architecture/sam/)
An older, apparently less-maintained architecture (last
commit from 2019).
CROSS-CUTTING INFRASTRUCTURE ALREADY AVAILABLE
===============================================
The Faust compiler already provides several features
that are relevant to embedded targets but are NOT
uniformly exploited across all embedded architectures:
The -mem / --memory-manager option: Generates code where
large arrays become pointers allocated via an external
dsp_memory_manager. This enables distributing DSP memory
across SRAM/SDRAM/DTCM. The memoryInfo() method provides
detailed information about each zone's size and
read/write access patterns. Currently only the OWL
architecture actually uses this. The Daisy architecture
works around the same problem with a Python
post-processing script instead.
The -uim option: Generates static C preprocessor macros
(FAUST_ADDHORIZONTALSLIDER, FAUST_LIST_ACTIVES, etc.)
that describe control parameters without requiring the
full UI class hierarchy. This is ideal for embedded
platforms where you don't need a graphical UI and want
to avoid the overhead of buildUserInterface and its
metadata tables. Demonstrated in minimal-static.cpp but
not used by any current embedded architecture.
The -inpl (in-place) option: Generates code where input
and output buffers can be the same memory -- noted in
the docs as being "typically needed in some embedded
devices." Only works in scalar mode.
The C backend (-lang c): Can generate pure C code
instead of C++, avoiding C++ runtime overhead (vtables,
exceptions, RTTI, stdio, etc.). Uses CGlue.h and
CInterface.h. Not currently used by any embedded
architecture.
Metadata conventions: A common set of [switch:N],
[knob:N] metadata has been defined for devices without
screens. The Hothouse extends this with [toggle:N] and
[foot:N]. The documentation notes that this set "will
probably have to be progressively defined and standardized."
JSON memory layout: When using -mem -json, the complete
memory layout is emitted in JSON, allowing compile-time
memory planning (e.g., using #pragma directives for
memory segments). This enables hybrid static/dynamic
memory management.
GAPS AND OPPORTUNITIES (What Stephane Is Calling For)
=====================================================
Based on this survey, the key gaps that new "embedded
hardware aware" architecture files could address:
UI overhead problem: The Teensy thread exposed this
directly -- the standard buildUserInterface /
setParamValue / string-matching metadata table approach
creates significant memory and code overhead. The -uim
option already generates lightweight C macros as an
alternative, but no embedded architecture currently uses it.
No uniform memory management: Each platform handles
memory constraints differently -- Daisy uses a Python
post-processor, OWL uses -mem with a custom allocator,
Teensy has no solution at all. A unified approach using
-mem with platform-specific allocators would be cleaner.
C++ library bloat: As Stephane noted, even using stdio
can produce huge binaries. The C backend (-lang c) could
help, but there are no architecture files that use it
for embedded targets. Raw C output combined with -uim
macros could produce dramatically smaller binaries.
Inconsistent feature support: The Daisy architecture is
the most complete (SDRAM support, multiple board
variants, flash modes, active refactoring), while Teensy
hasn't been touched in over 3 years. No embedded
architecture supports the -mem option uniformly.
No Pico DSP architecture: Despite being mentioned in the
Faust documentation's embedded platforms section, there
is no faust2pico or Pico architecture directory.
Limited documentation: Only Teensy and ESP32 have
tutorials on the Faust documentation site. No Daisy
tutorial exists despite it being the most actively
developed embedded target.
_______________________________________________
Faudiostream-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/faudiostream-users
_______________________________________________
Faudiostream-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/faudiostream-users