github ↗

First foray into vibe programming. VIBESMART2 — internally the SOM Dubstep Generator — turns images into generative beats. It vectorizes a picture, lets a self-organizing map learn that picture's structure, and then uses the organized map to drive a full software synth and beat sequencer. The visual becomes the seed; the music is what grows out of it.

It is a JavaFX desktop application with its own from-scratch audio engine — no samples, just synthesis. The noise is intentional; the exploration is the point.

the pipeline — what actually happens
  1. 01Vectorize. Each image is sliced into a grid of blocks; every block becomes a 5-dimensional feature vector — mean red, mean green, mean blue, brightness, and brightness variance (local contrast/texture). A picture becomes a cloud of vectors. Add several images to build one dataset.
  2. 02Self-organize. A Self-Organizing Map (configurable grid size and learning rate) trains on those vectors, folding the high-dimensional cloud onto a 2-D map where similar visual textures end up near each other. You can reset it, or continue training without re-initializing.
  3. 03Generate. The organized map drives a pattern generator that composes a beat — at your chosen BPM and complexity (simple / medium / complex).
  4. 04Synthesize. A custom audio engine + sequencer renders the pattern live: kick, snare, hi-hat, and bass voices built from ADSR envelopes, an LFO, a biquad filter, and scratch FX — a dubstep-leaning kit, all generated, no samples.
  5. 05Keep & export. Audition beats, hold a history of them, swap/rename/delete, and export a pattern to .json (or images to .png).
controls

Image dataset — Load Image, Add Image, Clear Dataset (PNG/JPG/BMP/GIF). SOM — SOM Grid Size, Learning Rate, Train SOM, Continue training, Reset SOM. Generation — Pattern Complexity, BPM, Generate Beats. Playback — Play, Stop, Test Scratch, Visual Offset (ms). Beat history — Preview, Swap In, Rename, Delete, Export Selected…. A beat-grid view with a playhead visualizes the running pattern.

what it means to run it

Running VIBESMART2 is less "play a song" and more "watch an image become a rhythm." You are not arranging notes — you are feeding the machine a picture and letting an unsupervised map decide what that picture sounds like. Two different images give two different grooves; the same image trained twice can drift. It is a small instrument for turning seeing into hearing.

build & run locally

A Maven project. Needs JDK 21; Maven pulls JavaFX 21 and the audio/webcam libraries automatically. The JavaFX Maven plugin runs it directly:

# clone git clone https://github.com/brackishbert-coder/VIBESMART2 cd VIBESMART2 # build mvn compile # run the GUI (entry point: com.somdubstep.ui.AppFX) mvn javafx:run

The codebase also carries a command-line argument layer for batch generation — --image <path>, --bpm, --complexity s|m|c, --steps, --export <files>, --play, --no-train, --seed, --help — though the shipped entry point opens the JavaFX window. Or import the folder into Eclipse (.project / .classpath included) and run AppFX.

audio image processing vectorization self-organizing maps synthesis javafx
active
01 screenshot
02 screenshot
03 screenshot

every image is already a song; vectorization is only the act of learning to listen to it.

a pixel knows nothing. five numbers about a pixel know a little. a map of those numbers begins to remember.

the self-organizing map is not told what matters — it decides. that is the whole future, hiding in a small grid.

we taught machines to see before we taught them to hear. this turns the seeing back into hearing, and asks which came first.

noise is not the failure of the signal. noise is the signal before it has agreed on a meaning.

soon the instruments will play the player. feed it your face, your room, your sky — and listen to what it thinks you are.

the music of the next century will not be composed. it will be grown from whatever we point the lens at.