KoiBoi2
project name: KoiBoi2
project url: https://github.com/Dillbo/KoiBoi2
author: dillbo
description: A sequencer based on fish in a pond
discussion url: https://llllllll.co/t/koiboi2/73410
documentation url: https://github.com/Dillbo/KoiBoi2/blob/main/README.md
tags: sequencer midi generative

KoiBoi2 Concept

KoiBoi transforms a simple visual metaphor into a rich musical experience:

Koi swim in circular orbits around a pond, each at its own radius and speed

Food appears randomly in the pond, with position determining pitch

Koi eat the food to trigger notes using the PolyPerc engine

Uneaten food ages and fades into a drone layer over time

MIDI input allows you to place food at specific pitches

Softcut delay adds rhythmic and textural depth

The result is an ever-changing, meditative composition that balances predictability (orbital motion) with randomness (food placement and koi behaviour).

Features

Core Gameplay

Up to 8 koi fish are swimming in circular orbits

Radial pitch mapping: distance from center = pitch (2 octaves)

Dual pitch modes: Linear chromatic or quantised to musical scales

32 food items maximum with brightness-based aging visualisation

MIDI food input: play notes to spawn food at corresponding radii

Sound Engine

PolyPerc synthesis for food notes with adjustable filter, release, and amplitude

Drone layer with a note buffer that loops aged food at adjustable intervals

Tempo-synced delay via Softcut with note division control (1/32 to 4/1)

LFO modulation of delay feedback for evolving textures

Delay filter with adjustable cutoff and resonance

Reverse and overdub modes for creative delay effects

Control & Customization

8-page menu system for deep parameter control

11 musical scales, including major, minor, pentatonic, blues, and modes

Adjustable root note and octave (2-6)

Tempo control (60-200 BPM) with synchronised delay divisions

Per-koi speed and radius control for fine-tuning movement

MIDI input and output on separate channels for food and drone layers

Controls

Main Screen (Page 0)

Control

Function

K1

Enter/exit menu system

K2

Play/Pause

K3

Scatter food into the pond

E1

Select koi (1-8)

E2

Change the selected koi’s orbit radius

E3

Change selected koi’s speed (positive = clockwise, negative = counter-clockwise)

Menu Navigation

Control

Function

K1

Return to main screen

K2

Test note mapping (prints debug info)

E1

Change menu page (1-8)

E2

Select parameter on the current page

E3

Adjust selected parameter

Instructions Screen

Any encoder scrolls up/down. Press K1 or K2 to exit and start playing.

Menu System

Page 1: Scale & Tempo

Scale: Choose from 11 scales (major, minor, dorian, etc.)

Root Note: Set the root note (C-B)

Octave: Set the base octave (2-6) • Default: 5

Tempo: Set BPM for delay sync (60-200) • Default: 120

Pitch Mode: Linear (chromatic) or Scale (quantised)

Page 2: Koi Behaviour

Number of Koi: 1-8 koi in the pond • Default: 4

Global Speed: Speed multiplier for all koi (0.1-4.0)

Displays selected koi’s individual speed and direction

Page 3: PolyPerc Synth

Cutoff: Filter cutoff frequency (50-5000 Hz) • Default: 800 Hz

Release: Note release time (0.1-5.0s) • Default: 0.3s

Amplitude: Note volume (0.0-1.0) • Default: 0.5

Page 4: Softcut Delay

Division: Note value for delay time • Default: 1/4. (dotted quarter)

Options: 1/32, 1/16, 1/8, 1/8., 1/4, 1/4., 1/2, 1/2., 1/1, 2/1, 4/1

Feedback: Delay feedback amount (0.0-0.95) • Default: 0.45

Mix: Wet/dry mix (0.0-1.0) • Default: 0.4

LFO Rate: Feedback modulation rate (0.1-2.0 Hz) • Default: 0.0 (off)

Page 5: Softcut Creative

LFO Depth: Feedback modulation depth (0.0-0.5) • Default: 0.2

Filter Cutoff: Delay filter frequency (200-8000 Hz) • Default: 2000 Hz

Reverse: Enable reverse delay playback • Default: Off

Overdub: Enable delay overdubbing • Default: On

Page 6: Drone Layer

Buffer Bars: Loop length in bars (1-8) • Default: 2

Buffer Notes: Number of note slots (1-16) • Default: 8

Fade Chance: Probability of food becoming drone (0.0-1.0) • Default: 0.25

Amplitude: Drone volume (0.0-0.3) • Default: 0.3

Cutoff: Drone filter frequency (50-500 Hz) • Default: 200 Hz

Page 7: MIDI Settings

MIDI Input: Enable/disable MIDI input • Default: On

MIDI Output: Enable/disable MIDI output • Default: Off

Input Device: Select MIDI input device (1-4)

Output Device: Select MIDI output device (1-4)

Page 8: MIDI Channels

Food Channel: MIDI channel for food notes (1-16) • Default: 1

Drone Channel: MIDI channel for drone notes (1-16) • Default: 2

Displays current note range based on root/octave settings

MIDI Implementation

MIDI Input

When MIDI Input is enabled, incoming MIDI notes spawn food in the pond:

Note value determines radial position (pitch mapping)

Velocity affects food brightness

MIDI food appears as small squares (vs. dots for random food)

Food is placed at random angles at the calculated radius

MIDI Output

When MIDI Output is enabled:

Food notes are sent on the Food Channel when koi eat

Drone notes are sent on the Drone Channel when drones play

Note-off messages sent 100ms after note-on

Output respects the current pitch mapping and scale settings

Note Mapping

The pond uses a 2-octave radial mapping:

Center (1 pixel): Root note

Edge (29 pixels): Root note + 23 semitones (2 octaves up)

Linear Mode: Chromatic mapping across the radius

Scale Mode: Quantized to the selected scale

Requirements

Monome Norns (any version)

PolyPerc engine (included with Norns)

Softcut (built into Norns)

Optional: MIDI input device (keyboard, sequencer, etc.)

Optional: MIDI output device (synth, DAW, etc.)

Technical Details

Performance Optimization

Pre-calculated trigonometric values

Local references to math functions

Collision detection uses squared distance (avoids sqrt)

Separate clock threads for game logic (60 FPS) and screen refresh (15 FPS)

Food table is capped at 32 items

Note Mapping Algorithm

semitone_offset = note - root_midi_note radius = MIN_RADIUS + (semitone_offset / 23) * RADIUS_RANGE

Where:

Drone Buffer System

Ring buffer with configurable size (1-16 notes)

Notes added based on fade chance probability

Oldest notes replaced when buffer is full

Each note loops at the specified bar interval

Separate long release (4.0s) for sustained drone texture

Credits

Created by: DillboDate: August 2025Platform: Monome NornsEngine: PolyPerc (Norns built-in)

Special thanks to the Monome community and the Norns platform developers.

License

This script is released as open source. Feel free to modify, share, and build upon it!

Philosophy

“A pond is never the same twice, yet always itself.”

KoiBoi embraces the Japanese concept of ma (間) - the space between things - where meaning emerges from what is not played as much as what is. The koi swim endlessly, the food appears and fades, and the drones remember what has passed. It is a meditation on time, pattern, and the beauty of simple systems creating complex outcomes.

Sit with your pond. Watch it breathe. Listen to it sing.

Version: 1.0Last Updated: 2025

Swim well