_(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
   |
   |
{}-|
   |
 _(_)_
(_)@(_)
  (_)
   |
   |-{}
   |
   |
  ---
        

Forth Sampler

WORK-IN-PROGRESS

Written in C99, raylib for visuals.

A live-coding tool for sound collage. Audio clips can be added, split, and moved around. The playhead can be manipulated. A Forth program can be attached to each clip. To compute which sample should be played, it is pushed onto the clip's stack, and the clip's Forth program is run. The top of the stack is popped and that sample is played. This leads to elegant expressions of certain audio transformations, e.g. a delay of 2000 samples is 2000 PICK + 2 / DUP, and a simple IIR low pass filter is 0.01 * SWAP 0.99 * + DUP.

 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---
   |
   |
   |-{}
   |
 _(_)_
(_)@(_)
  (_)
   |
{}-|
   |
   |
  ---