This is a transcription of this video from Revision 2012.
Requirements for a 64k synth
- small
- flexible
- somewhat usable
The Idea: Runtime Code Generation
- Theory
- Write synths & effects, hear changes instantly
- JIT compiler in editor, store compiled data in intro
- your synth is no longer limited to your own dsp routines
- host language independently (?)
-
Implementation Challenges
- How to implement this in my synth?
- How to make this usable for non-coders?
- Instansing
- When writing runtime code, you want to contentrate on the good parts
-
Implementation: Compiler (bero)
- designed a language (aulan)
- supports integer, boolean, float, arrays, structs, functions, procedures, pointers, inline asm
- translates to assmebler/native code
- special feature: instance variables
- language features:
- mixture of basic, pascal and c
- newline = end of block statement
- compile to native code and links during runtime (Editor)
- in your intro:
- use generated assembly files
- use bero's runtime linker code for object files as constant byte arrays etc.
- use your normal linker if it supports COFF
Lets take a look at synth design
- a (64k) synth has multiple layers
- Voice layer
- code that gets executed per active note
- classic synth: fixed pipeline
- most timecritical code
- Channel Layer
- code that processes the sum of all active notes of a single instrument
- Global Layer
- code that processes the output multiple instruments
- e.g. sendto-effects, mastering chain
- example: Buzz - generator & effect concept
- Voice layer
Fixed Pipeline vs Dynamic Pipeline
- Fixed Pipeline
- A good fixed pipeline can be very versatile
- It's small
- Drawback: you need a good fixed pipeline (ask your musician :-)
- global hardcoded effect-chain / sendto-effects
- Dynamic pipeline
- not all "modular" synths provide modularity on each level (like Buzz)
- if done on voice level:
- allows more complex synth patches
- more implementation
- the more granular, the more complex
- GUIs for modular synths either require a bit of work or they are slightly challenging to use
- custom mastering/effect chain for free
- Hybrid / Semi-Dynamic pipeline
- Some parts static, some parts dynamic
Parameter Automation / Envelopes
- WOBWOBWOBWOBWOBWOBWOBWOBWOBWOBWOBWOB
- very important to make instruments sound "alive"
- Different approaches:
- Modulation matrix (fixed pipeline)
- modular: e.g. node based, operator stacking
- LFO with fixed targets as volume, filter, pitch
- if you implement this wrong:
- bad performance
The Synth
- What is it?
- Concept blatantly stolen from buzz
- You create machines, write code for thm
- machines can be assigned to a midi channel
- variables can be exported as parameters
- parameters can be bound to midi-controllers