↑ The header is not a picture. It is the waveform of the loop you can edit further down; redrawn every time someone adds a note to the sequencer.
I'm an AI expert and technology coach with a long background in data science; working with AI since before the hype. I love building intelligent systems, creating playful digital experiences, and designing sound with a story. Through hands-on workshops, I help curious humans become makers.
For me, technology is a tool; human connection is the goal. The best algorithms have a heartbeat.
Inspired by my website, this profile follows one rule: no static pixels. Wander through the commit tree, add a note to the sequencer, and make yourself at home in the code.
A single tree of commits, grown from my public commit contributions across GitHub, including repositories I contribute to. Each active season-year grows a limb, with the oldest at the roots and the newest in the crown. Its foliage follows the seasons: winter frost, spring greens and blossoms, summer greens, and autumn colours. Empty seasons grow no foliage, and years without public commits leave knots. The tree refreshes nightly rather than inventing growth. It is generated entirely from history, with no visitor controls.
1,951 public commit contributions | 2016-2026 season-years
Grown from public commit history · refreshed nightly
how does this work?
An L-system is a tiny grammar: start from an axiom (X), apply rewrite rules (X → F+[[X]-X]-F[-FX]+X, F → FF)
a few times, then let a turtle draw the result — F steps forward, +/- turn, [/] push and pop a branch.
Lindenmayer invented them in 1968 to describe algae; they also happen to make lovely plants and, if you map the
same symbols to pitches, lovely music. Here they draw the seasonal foliage attached to each year's limb.
Limb length and foliage size reflect activity on a logarithmic scale, with limb lengths adjusted to shape the crown.
Leaves are illustrative, not one per commit; foliage detail can simplify as history grows to keep the image manageable.
Exact seasonal counts and repository totals live in the public history cache; the SVG also contains season counts
as metadata, though GitHub's embedded image does not expose them as tooltips.
Seasons use UTC and Northern Hemisphere months. Winter 2019 means December 2018 through February 2019; spring is March–May, summer June–August, autumn September–November. December starts the following year's winter. All years from account creation are retained; seasons without public commits leave no foliage, and empty years leave knots.
Counts use GitHub's commit contribution rules (linked author email and eligible default/gh-pages branches),
not every commit on every branch. Private activity, issues, reviews and pull-request counts are excluded.
GitHub attribution rules, deleted repositories and API visibility can limit what history is available.
A refresh fails explicitly if GitHub's 100-repositories-per-year query limit is reached, instead of silently
publishing an incomplete tree. In-progress seasons show only activity recorded so far.
The cached public data lives in generators/garden/history.json; it contains
seasonal totals and public repository counts. Tree structure and colour are generated deterministically from
that history, with no visitor-controlled garden state.
Refresh with authenticated gh (or GH_TOKEN):
python generators/playground.py --refresh-history --render-only.
Rebuild offline: python generators/playground.py --render-only.
Sources: forest.py, tree.py,
lsystem.py.
Sixteen steps, C minor pentatonic over two octaves, 120 BPM. Pick a note and it lands on the next free step (then wraps around and overwrites). A workflow re-renders the piano roll, synthesises a WAV and a MIDI file, and redraws the header from the new audio.
| ♪ C4 | ♪ E♭4 | ♪ F4 | ♪ G4 | ♪ B♭4 | 𝄽 rest |
| ♪ C5 | ♪ E♭5 | ♪ F5 | ♪ G5 | ♪ B♭5 | ▶ listen · ⬇ MIDI |
12/16 steps filled · next free step: 3 · 2 notes placed by visitors
recent composers: @MarieLynneBlock
latest: @MarieLynneBlock placed Bb5 on step 2
why does it always sound fine?
Pentatonic scales have no semitone clashes, so any combination of these ten pitches is consonant —
it is the same trick behind the black keys on a piano and most crowd-sourced music toys. The audio is
synthesised with NumPy (a sine with two harmonics, an exponential envelope and a dotted-eighth delay),
written with the standard-library wave module, and the MIDI file is hand-rolled bytes. No audio libraries, no services.
Source: generators/sequencer/sequencer.py ·
header: generators/waveform/waveform.py.
one SVG, generated from a YAML file — not two hundred badge requests.
🔬 Science · 💡 Technology · 🏗 Engineering · 🎨 Art · 📈 Maths
a happy advocate of the full STEAM 💨
Professionally — I'm an AI expert and data scientist at CM/MC, with almost a decade of turning messy data into decisions, products and (ethical, interpretable) models. I hold a BSc (Hons) Creative Computing from the University of London (magna cum laude), an MBA in Health, and I did Berklee's AI for Music & Audio summer programme because I could not help myself. Healthcare, NLP/OCR and human–machine interaction are the problems that keep me up at night — in a good way.
Creatively — my programming started in sound engineering and sound design, and it never left: MIR, DSP, generative music, L-systems that draw and play, live algorithms on stage. I research with the Sound of AI community, shoot photos and music videos on mirrorless cameras, and run The Munchkin Algorithm — a studio for intelligent systems, creative code, sound and workshops.
As a human — I coach at Django Girls (since 2018), beta-test courses for Coursera, speak several languages and collect more, read everything, and split my time between Belgium and Sweden with a junior programmer who commandeers my keyboard and two feline QA engineers who sleep on it.
a few more things
- Theme purist — I cannot look at an unstyled Matplotlib plot. Nord on everything (yes, this page too).
- Live coding — I would love to perform live-coded music more often. Encouragement and tips from fellow algoravers welcome.
- Teaching — I learn fastest when I have to explain it; workshops are my favourite excuse.
- Most of the code here is me monkeying around 🐒 — experiments, courses, hobby projects. A glimpse into my exploration 🧪, not a testament to my day job 🦸.
Creative computing, sound & generative art (click to expand)
- 🧪 sonic-alchemy-lab — Jupyter notebooks for sound analysis: waveforms, spectra, Fourier, MIR features.
- 🎼 Harmony in Algorithmic Beauty — bachelor thesis: L-systems driving simultaneous visual and musical generation.
- 🥁 digital-sound-playground — algorithmic patterns that generate music samples.
- 🪼 TheMunchkinAlgorithm_website — my website, made of separately programmed pixels (p5.js).
- 🌊 animated-banner_github — the previous animated banner of this very README.
- 🎹 RealTimeAudioSignalProcessing-Faust — functional DSP in Faust.
AI, data & agents (click to expand)
- 🧙🏻♀️ arcanum-artifex — prompts, skills and agents that survive contact with real workflows. No vendor loyalty. Occasionally heretical.
- 📖 claude-lab — everything I actually know about Claude Code; tested, verified, opinionated.
- 🔍 LearnLab_OCR — material to teach basic OCR concepts.
- 🏥 AI-in-healthcare_KULeuvenX · 🧠 nanodegree_generative-AI · 📦 nanodegree_AI-product-management
Studies (click to expand)
- 🎓 BSc (Hons) Creative Computing — University of London · magna cum laude (GPA 3.9)
- 🎓 MBA, Healthcare Management
- 🎓 AI for Music & Audio — Berklee College of Music summer programme · summa cum laude (GPA 4.0)
- 🎓 Music Information Retrieval — UVic professional programme
- 🎓 Generative Art & Computational Creativity — SFU professional programme
Open source & community (click to expand)
- 🍪 api-bakery — a Cookiecutter template for well-behaved APIs.
- 🎧 Sound of AI — research collaborator since 2021 (NSynth dataset work, open-source audio ML).
- 👩💻 Django Girls — code coach and guest speaker since 2018.
show stats (click to expand)
rendered daily by lowlighter/metrics running in this repo's Actions — self-hosted, so it does not vanish when a free service does.
I'm always up for learning something new, collaborating on odd projects or talking shop about sound, AI and everything in between.
🪼 Website · 💼 LinkedIn · 🤗 Hugging Face · 🎧 Bandcamp · 🎮 Steam
🔧 how this page is built
| piece | source | trigger |
|---|---|---|
| header waveform | generators/waveform/waveform.py |
whenever the sequencer changes |
| social buttons | generators/social.py |
manually: python generators/social.py |
| commit tree | generators/garden/forest.py · tree.py · lsystem.py |
nightly history sync |
| step-sequencer (SVG, WAV, MIDI) | generators/sequencer/sequencer.py |
visitor issues |
| toolbox | generators/toolbox/toolbox.py |
on push to its config |
| metrics | lowlighter/metrics | daily |
| glue | generators/playground.py · .github/workflows/ |
— |
Every SVG exists in a dark and a light variant, picked with <picture> and prefers-color-scheme.
The header and tree generators update their image URL versions whenever their SVGs change, avoiding stale caches.
When a social button's artwork changes, bump its asset key and README paths to avoid stale image caches;
older assets remain available for existing links.
Fork it, change the owner in forest.py and playground.py, refresh the history, and customise
toolbox.yaml and the sequencer state.json for your own living README.
Created with 🫀 and 🧠 by Marie-Lynne Block · ©2026 · nothing on this page is a static image






