Hacker News
Show HN: What if your synthesizer was powered by APL (or a dumb K clone)?
Live Toolkit: https://octetta.github.io/k-synth/
If you visit the page, here is a quick path to an audio payoff:
- Click "patches" and choose dm-bell.ks.
- Click "run"—the notebook area will update. Click the waveform to hear the result.
- Click the "->0" button below the waveform to copy it into slot 0 at the top (slots are also clickable).
- Click "pads" in the entry area to show a performance grid.
- Click "melodic" to play slot 0's sample at different intervals across the grid.
The 'Weird' Stack:
- The Language: A simplified, right-associative array language (e.g., s for sine, p for pi).
- The Web Toolkit: Built using WASM and Web Audio for live-coding samples.
- AI Pair-Programming: I used AI agents to bootstrap the parser and web boilerplate, which let me vet the language design in weeks rather than months.
The Goal: This isn't meant to replace a DAW. It’s a compact way to generate samples for larger projects. It’s currently in a "will-it-blend" state. I’m looking for feedback from the array language and DSP communities—specifically on the operator choices and the right-to-left evaluation logic.
Source (MIT): https://github.com/octetta/k-synth
jodrellblank
|next
[-]
bradrn
|root
|parent
|next
[-]
octetta
|root
|parent
[-]
bradrn
|root
|parent
[-]
octetta
|root
|parent
[-]
bradrn
|root
|parent
[-]
Yes, I’m very fond of trying out different languages. My main language for personal projects is Haskell.
> How do you like it?
I haven’t used J for a while, actually, but I recall finding it a bit confusing, especially when rank manipuations are involved. It has a larger vocabulary than most array languages, which I felt made it hard to learn. It was great fun though!
octetta
|root
|parent
[-]
Haskell is one I haven't used yet. The closest I've come to that is a weekend fling with OCaml... much respect for the ML work though!
I hear you for the complexities in J though. I've intentionally limited k-synth to single letter upper case variables and the verbs are also one character... I might regret this at some point.
Have fun! It makes the world a better place!
octetta
|root
|parent
|previous
[-]
I'm an APL newb... while I've been writing code-for-cash forever (C, etc.) I've had a long-time interest in APL languages, but I'm just messing around after working on waveform generation for another sound project I have in the works (https://github.com/octetta/skred ... https://youtu.be/L5-3gBpJsAo?si=JdBlntzn4doY-c3s).
While I was working on this I remember the first book I saw in the public library on computer programming was about APL (probably sometime around 1976)... I didn't have access to a "real computer" for another year after that and no APL for decades, but some ideas stick around, LOL.
octetta
|next
|previous
[-]
octetta
|next
|previous
[-]
octetta
|next
|previous
[-]
https://github.com/octetta/k-synth https://github.com/octetta/ksynth-desktop/
it's been a blast to play with... and a great excuse to learn array languages
hmokiguess
|next
|previous
[-]
octetta
|root
|parent
|next
[-]
octetta
|root
|parent
|previous
[-]
xrd
|root
|parent
[-]
octetta
|root
|parent
|next
[-]
hmokiguess
|root
|parent
|previous
[-]
xrd
|root
|parent
[-]
octetta
|root
|parent
[-]
UncleEntity
|next
|previous
[-]
The evaluation order doesn't matter as much as you don't really know what kind of function/operator you have at parse time so have to do a bunch of shenanigans to defer that decision until runtime while still keeping it efficient. Kind of fiddly to get right but once it works, it just works.
Claude and me (and a ton of decades old research) pretty much figured out all the complications in the APL parse/eval stack (https://github.com/dan-eicher/AiPL).
jdontillman
|next
|previous
[-]
https://dl.acm.org/doi/pdf/10.1145/75144.75174
(!!!)
(Wait, what? That Stanley Jordan?) (Yep.)