Honestly one of the most rewarding builds I’ve done. You finish with an actual playable sampler, not something that just sits on the shelf looking like a science project :)
zeptocore kit
A DIY handmade, handheld sample player.
Details
zeptocore is an open-source handheld device for playing with samples, designed as a simple, tactile, and immediate tool for shaping sound in real time. it plays stereo 16-bit audio at 44.1 kHz from an sd card, organizing up to 256 samples across 16 banks, and pairs this with a set of built-in effects, a realtime sequencer, and a single-cycle wavetable bass voice. the interface is intentionally minimal and hands-on, encouraging experimentation through modes like jump, mash, and bass, while supporting midi, clock sync, and usb connectivity. powered by two aaa batteries or usb-c and built with a small onboard speaker, it’s meant to be portable, hackable, and fun—something you can pick up and play immediately, but also modify and extend as you like.
Videos
Specifications
- manage audio with zeptocore.com
- mono or stereo playback of 16-bit (internal 32-bit) audio files @ 44.1 kHz sampling rate
- SD-card storage for gigabytes of samples, recalling up to 256 audio files across 16 banks
- powered by two AAA batteries for up to 4 hours or powered by USB-C
- tempo-synced with a selectable BPM between 60 and 300
- loaded with 16 real-time effects like timestretching, delay, distortion, fuzz, tapestop, resonant filters, etc.
- realtime sequencer with optional quantization and performance-oriented controls
- MIDI (in + out) over USB for syncing with DAWs and external gear
- sync-compatible with any gear that has a clock input/output signal
- built-in speaker for portable playback
- open-source, wonderfully hackable (GitHub)
Documentation
Zeptocore Guide
The complete guide to the handmade, open-source Zeptocore sample player. This is the shared manual for the assembled instrument and DIY kit, consolidated from the original zeptocore.com documentation.
Demo and overview
Zeptocore plays stereo 16-bit audio at 44.1 kHz from a microSD card, then lets you slice, retrigger, sequence, and process it immediately from the keypad.
Specifications and highlights
- AudioMono or stereo 16-bit files with internal 32-bit processing at 44.1 kHz.
- Sample libraryUp to 256 files arranged as 16 banks of 16 samples on microSD storage up to 32 GB.
- VoicesOne stereo sample voice and one monophonic bass voice with smooth crossfading.
- Effects16 realtime effects plus per-effect parameters and probability.
- SequencingRealtime, optionally quantized sequencing without a required time signature.
- ConnectivityClock sync input, optional sync output, and class-compliant USB MIDI input/output.
- PowerTwo AAA batteries for up to four hours, or USB-C power.
- Portable soundA built-in 8-ohm speaker for immediate standalone playback.
Goals
- Open source: firmware and schematics remain available for study and modification.
- Low learning curve: the instrument is playable immediately, while the manual reveals deeper behavior.
- Unquantized by default: sequences are not forced into a 4/4 grid.
Intentional limits
- Zeptocore is opinionated rather than designed to imitate another sampler.
- Its synthesis is intentionally focused: a monophonic wavetable bass voice complements the sample voice.
- Two carefully crossfaded voices fit the RP2040 processing budget; sync multiple devices for more layers.
Quick start
Download the one-page quick-start PDF, or follow the essentials below.
- Move the top-right power switch up. A preloaded sample starts automatically.
- Press keys 1–16 to jump between slices.
- Hold one slice key and press another to retrigger; the second key sets the rate.
- Hold A and turn Knob Z for volume, Knob X for tempo, or Knob Y for pitch.
- Hold B, press a bank key, then a sample key to choose among 16 × 16 files.
- In Jump mode, hold A and press 1–16 to toggle an effect.



Modes, controls, sequences, and saves
Jump makes the keypad perform slices, Mash makes it control effects, and Bass makes it play notes. Hold an effect key in Mash mode and turn Knobs X/Y to edit its parameters or Knob Z to change its probability.
| Action | Combination | Mode | Behavior |
|---|---|---|---|
| Jump mode | A + B | Any | Return to the default performance mode. Keys 1–16 jump between slices, create short loops, or retrigger audio. |
| Mash mode | A + C | Any | Turn keys 1–16 into effect toggles. Momentary FX mode can make an effect active only while its key is held. |
| Bass mode | A + D | Any | Turn keys 1–16 into notes for the monophonic bass voice. |
| Jump | 1–16; or A + 1–16 in Mash mode | Jump / Mash | Crossfade immediately to the selected slice. Slice positions are prepared in the Zeptocore sample tool. |
| Jump page lock | D | Jump | Cycle the jump keys through the current, first, second, and third slice pages. The C and D LEDs show the selected page. |
| Retrigger | 1–16 + 1–16 | Jump | Hold a slice key, then press a second key to retrigger it. Key 1 is the fastest rate and key 16 the slowest. |
| Loop slices | 1–16 + 1–16 + 1–16 | Jump | Hold three slice keys to loop playback between the selected slice positions. |
| Octave +1 | A + 1–16 | Bass | Play the selected bass note one octave higher. |
| Tempo | A + Knob X; A + repeated B taps; A + B + 1–16 | Any | Turn for half-to-double the sample BPM, tap a tempo from 30–300 BPM, or select a predefined tempo with keys 1–16. |
| Pitch | A + Knob Y | Any | Change pitch independently of tempo. Opposing high-tempo/low-pitch settings can create especially unusual textures. |
| Volume | A + Knob Z | Any | Adjust output volume. Fully counter-clockwise mutes; very high settings can clip some source files. |
| Change bank and sample | B + 1–16 + 1–16 | Any | While holding B, choose a bank and then a sample. The old sample fades out in about 10 ms and the new sample starts at the corresponding position. |
| Change sample with a knob | C + Knob X | Any | Browse and load samples with the knob instead of the two-key bank/sample selection. |
| Filter sweep | B + Knob Y | Any | Sweep the filter cutoff. Turn clockwise to admit more high frequencies and counter-clockwise to restrict them. |
| Realtime stretch | B + Knob Z | Any | The low range bypasses stretching; continue clockwise to increase the realtime stretch amount. |
| Random sequencer | B + Knob X | Any | Choose how many steps a random sequence may use. Fully clockwise rerolls it; B + A rerolls one random step. |
| Mute | B + C | Any | Mute audio while playback and clocking continue. |
| Start / stop | B + D | Any | Stop audio and playback, or restart playback from the first beat. |
| Select sequence | C + 1–16 | Any | Select one of 16 sequence slots for the current mode. Jump, Mash, and Bass each have their own 16 slots. |
| Play / stop sequence | C + B | Any | Toggle playback of the selected sequence; while recording, this ends the recording. |
| Record / delete sequence | C + D | Any | Record actions and the time between them at 1/96-beat resolution. Make one final press to set the last step duration. The same combo deletes an existing selected sequence. |
| Chain sequences | C + empty slot + filled slots | Any | Hold C, choose an empty destination, then press existing sequence slots in order. Release C to create and save the chain. |
| Quantize | C + Knob Z | Any | Increase quantization for the currently playing Jump, Mash, or Bass sequence. |
| Random tunnel | C + Knob Y | Any | Adjust the chance of tunneling, where playback jumps to a neighboring sample in the current bank. |
| Select save | D + 1–16 | Any | Select one of 16 slots for a saved device state. |
| Load save | D + B | Any | Load settings from the selected save slot. |
| Create save | D + C | Any | Store the current settings in the selected save slot. |
| Random jump | D + Knob X | Any | Adjust the probability of random slice jumps. Sequence lock can keep playback aligned to its intended beat. |
| Random effects | D + Knob Y | Any | Adjust the probability that effects from the selected random-effects bank will activate. |
| Random-effects bank | D + Knob Z | Any | Select which prepared bank of effects is used by random effects. Configure the bank contents in the sample tool. |
| One-shot | 5 + 6 + 5 | Any | Toggle one-shot playback for the current sample so it stops at the end instead of looping. |
| Change play mode | 7 + 8 + 7 | Any | Cycle the current sample between its available playback modes. |
| Slice playback | 1 + 2 + 1 | Any | Toggle the current sample's slice-playback behavior. |
| Tempo match | 5 + 6 + 7 + 8 | Any | Match playback speed using the ratio between the sample BPM saved by the tool and Zeptocore's current tempo. |
| Sequence lock | 1 + 2 + 3 + 4 | Any | Keep a sequence synchronized to the global clock so performance jumps return to the intended beat position. Enabled by default. |
| Randomize sequence | 6 + 7 + 10 + 11 | Any | Replace normal playback with a generated sequence. Holding a length key rerolls it; with Random Fill, a new sequence appears every 32 beats. |
| Random fill | 10 + 11 + 15 + 14 | Any | Toggle an automatically generated fill at the end of a sequence. |
| Momentary FX mode | 1 + 4 + 16 + 13 | Any | Switch Mash mode between latched effect toggles and effects that remain active only while held. |
| MIDI through CLOCK | 13 + 10 + 11 + 16 | Any | Toggle MIDI input through the CLOCK jack for use with ittybittymidi. The display confirms MIDI ON. |
| Sync out | 13 + 9 + 5 + 1 + 15 + 11 + 7 + 3 | Any | Toggle a clock pulse on the left output channel for external sync. The display confirms SYNC ON or SYNC OFF. |
| Retrigger pitching | 9 + 10 + 11 + 12 | Any | Toggle random upward or downward pitch movement during retriggers. |
| Retrigger volume ramps | 13 + 14 + 15 + 16 | Any | Toggle volume ramps during retriggers. This behavior is enabled by default. |
| Kick layering | A + D + 1–16; or 13 + 10 + 7 + 16 | Any | Firmware 6.4.0 or later: choose and level one of 16 built-in kicks, then layer it at kick positions detected in the prepared sample. |
| Kicks only | 4 + 7 + 10 + 13 | Any | Restrict sequence playback to detected kick positions. The display changes between KICKS and NORM. |
| Snares only | 13 + 10 + 7 + 4 | Any | Restrict sequence playback to detected snare positions. The display changes between SNARES and NORM. |
Visual control diagrams
























The 16 effects
From Jump mode, hold A and press the numbered effect key. From Mash mode, press the key directly. While holding that key, turn Knobs X/Y for parameters and Knob Z for activation probability.
| Effect | Key | Knob X | Knob Y | Sound |
|---|---|---|---|---|
| Saturation | 1 | Preamp | — | Adds warmth, depth, and loudness with a double-sine shaping technique. |
| Loss | 2 | Loss type | Loss amount | Simulates worn tape or faulty radio transmission with controllable character and degradation. |
| Fuzz | 3 | Preamp | Postamp | Adds rich fuzz-like distortion with gain control before and after the effect. |
| Bitcrush | 4 | Bits | Frequency | Reduces bit depth and sample frequency for early-digital textures. |
| Timestretch | 5 | — | — | Slows playback by roughly eight times without changing pitch. |
| Delay | 6 | Feedback | Duration | Adds a feedback delay that can be driven into intense clipped textures. |
| Comb filter | 7 | Left spread | Right spread | Uses a very short delay to create metallic resonance and stereo movement. |
| Repeat | 8 | Duration | — | Loops audio around suitable zero crossings and can reach audio-rate repetition. |
| Tighten | 9 | Duration | — | Gates the end of each step for a shorter, more defined sound. |
| Expand | 10 | Expanse | Dry / wet | Creates a reverberant expansion; combining it with many effects can tax the processor. |
| Circulate | 11 | Rate | Depth | Moves audio dynamically between the left and right channels. |
| Scratch | 12 | Rate | — | Simulates a record scratch by changing playback speed rapidly. |
| Lower | 13 | Duration | Depth | Sweeps a low-pass filter to emphasize lower frequencies. |
| Pitch | 14 | Duration | Depth | Moves pitch independently of tempo, allowing split or doubled beats at speed extremes. |
| Reverse | 15 | — | — | Reverses audio playback and, outside a running sequence, its playback direction. |
| Tapestop | 16 | Duration | — | Drops pitch gradually and halts playback like a stopped tape machine. |
Preparing and uploading samples
Samples must be prepared as 44.1 kHz, 16-bit audio. Use the online Zeptocore sample tool in Chrome or Firefox, or download an offline build from the current _core release. The importer accepts WAV, AIFF/OP-1 kits, FLAC, MP3, Renoise XRNI splices, and Morphagene WAV reels.


Transfer to the SD card
- Finish arranging samples, then choose Download .zip in the tool.
- Unzip the download and copy its
bankXfolders to the microSD card. - Banks are zero-indexed:
bank0is the first bank. Rename a folder to move it to another slot.
Restore the factory library with the drum sample pack (393 MB) or melodic + drum pack (853 MB). These packs require firmware v5 or newer.
Offline sample tool and source build
Release assets provide Windows x64, macOS Intel/Apple Silicon, and Linux x64 builds. On macOS, make the downloaded file executable and clear its quarantine metadata before running it:
chmod +x core_macos
xattr -c core_macos
./core_macos
To build the tool, install Go, clone the repository, and run:
cd _core/core
go build
Kick detection and layering
The v4+ sample tool estimates kick and snare positions with a drum-separation model. Unlike interval or manually placed slices, those transients drive the Kicks/Snares playback modes and firmware 6.4+ kick-layering feature.
MIDI, clock, and computer keyboard
Zeptocore is class-compliant USB MIDI. It sends button, knob, timing-clock, start, and stop data, and follows incoming start/stop/continue and timing clock. Connect it to a computer for DAW sync or route a controller with midi2midi. An ittybittymidi can feed MIDI through the CLOCK jack after enabling the CLOCK-input MIDI combo.
| Function | Sent | Received | Notes |
|---|---|---|---|
| Basic channel | 1–6 | 1 | 1–3: Jump/Mash/Bass buttons; 4–6: their sequencers |
| Note On / Off | Yes | No | Notes 0–31; velocity 127/0 |
| CC 7 | Yes | USB* | Volume |
| CC 12 / 13 / 14 | Yes | No | Knobs X / Y / Z |
| CC 15 / 16 | Yes | USB* | Tempo / pitch |
| CC 18 | Yes | USB* | Random sequence |
| CC 19 / 20 | Yes | USB* | DJ filter / realtime stretch |
| CC 21 / 22 | Yes | USB* | Sample select / random tunnel |
| CC 23 / 24 | Yes | USB* | Sequencer quantize / random jump |
| CC 25 / 26 | Yes | USB* | Random-effects probability / random-effects bank |
| System Exclusive | Yes | No | USB status and debug text |
| Timing Clock | Yes | Yes | 24 pulses per quarter note |
| Start / Continue / Stop | Start, Stop | All | MIDI realtime transport |
* These CC messages are received over USB MIDI only. The CLOCK input accepts MIDI after MIDI mode is enabled.
Computer keyboard
Connect Zeptocore over USB and open the sample tool in Chrome. Its MIDI layer shows the current bank, sample, volume, and tempo and lets a computer keyboard control the instrument.

Firmware and updates
Use the store’s zeptocore kit firmware selector for the current normal-, low-, or ultra-low-latency build. Release notes, desktop tools, Zeptoboard firmware, and source archives are on the _core releases page.
Upload a UF2
- Connect USB-C while holding the BOOTSEL button beside the USB-C jack.
- Continue holding BOOTSEL and press the nearby NRST button.
- Wait for a drive named
RPI-RP2to appear. - Drag the downloaded
zeptocore_vX.Y.Z.uf2onto that drive. - When the drive disappears, the update is complete and Zeptocore restarts.
Build firmware from source
Install CMake, Python, Git, a C++ compiler, and the Arm GNU embedded toolchain. The repository Makefile retrieves the Pico SDK 2.2.0 dependencies and builds the current target:
git clone https://github.com/schollz/_core
cd _core
make zeptocore
Use make zeptoboard, make ectocore, or make ezeptocore for another hardware target. Windows users can run the Linux workflow through WSL 2.
DIY build, schematic, and source
Firmware and hardware source live in the canonical _core repository.
The schematic is open source and may be adapted; commercial derivative boards should help support continued development and must not use the Infinite Digits or Ectocore trademarks.
Download the Zeptocore v28 schematic PDF.
Open the full schematic
Cases, Zeptoboard, and Zeptocade
Cases
The exposed-PCB form is durable by design, but several community enclosures are available.



Zeptoboard
Zeptoboard is the breadboard version of Zeptocore. It uses a browser keyboard/MIDI interface in place of the handheld keypad and is intended for learning and firmware experimentation. Build it with a Raspberry Pi Pico-compatible board, PCM5102 DAC, and SDIO microSD breakout using the source and Zeptoboard firmware. On common PCM5102 boards, solder the rear configuration pads as shown so the audio connections are correct.
- WeAct Raspberry Pi Pico-compatible board (other RP2040 Pico boards should also work)
- PCM5102 audio DAC board
- SDIO microSD breakout


Zeptocade
Zeptocade is the open-source arcade enclosure: 20 illuminated buttons and 11 dedicated knobs provide a larger tactile interface for an installed Zeptocore. Its BOM, Gerbers, schematic, and source remain in the Zeptocade project archive.
Install or remove Zeptocore in a Zeptocade
- Separate the Zeptocore top board from its bottom plate.
- Use an M4 hex key to remove the four top screws and open the Zeptocade.
- Remove the rear top-corner screw and standoff to make room.
- Slide Zeptocore into the top-left position, align its knobs with the three holes, and press it evenly onto every header pin. Reverse these steps to remove it.



Troubleshooting and common questions
Why does Zeptocore shut down unexpectedly?
Replace both batteries with fresh, high-quality alkaline cells, then test on USB-C power. Carbon-zinc cells lose usable voltage sooner and can cause unstable operation.
Why do I hear occasional glitches or dropouts?
MicroSD latency varies greatly, regardless of A1/U3 or “high speed” labels. Known good families include Gigastone 16/32 GB, SP Elite, SanDisk Extreme, Samsung EVO, PNY Elite, and MicroCenter. Avoid Lexar, Kootion, SanDisk Ultra, Kingston, and unreliable cards. Zeptocore usually recovers from a delayed read, but a severe stall can require a restart.
Why does the sample tool not show waveforms?
Use a current Chrome browser for the most reliable waveform and Web MIDI support. Firefox can prepare samples, but does not provide the same MIDI integration.
Why is USB MIDI not working on macOS?
Use a USB-A data path or adapter rather than a direct USB-C/Thunderbolt bus if the device is not detected. In System Settings → Privacy & Security, set Allow accessories to connect to Automatically When Unlocked.
How do I identify my firmware version?
At power-on, the display flashes a Z followed by the installed version number.
What is the residue beneath the battery holder?
It is cured, non-conductive epoxy used to keep the holder from moving when batteries are inserted or removed.

How does Zeptocore compare with similar samplers?
| Feature | Zeptocore | Pikocore | PO-33 K.O. | Volca Sample |
|---|---|---|---|---|
| Open source | Yes | Yes | No | No |
| Voices | 1 stereo + 1 mono | 1 mono | 4 mono | 8 mono |
| Audio | 16-bit / 44.1 kHz | 8-bit / 33 kHz | 8-bit / 23 kHz | 12-bit / 32 kHz |
| Sample limit | 256 | 100 | 16 | 100 |
| Storage | 32 GB | 16 MB | 1 MB | 4 MB |
| Record audio | No | No | Yes | No |
| Sync | In / out | In / out | In / out | In / out |
| MIDI | In / out | In | No | In |
For help not covered here, email zack@infinitedigits.co or join the community Discord.
Friends and further instruments
If Zeptocore appeals to you, these independent instruments share a similarly compact, exploratory spirit:
- Prismatic Spray and Phantasmal Force by Distropolis Goods
- Bitty by Curious Sound Objects
- OMX-27 by Denki Oto
- Joydrums by yzhk instruments
- HSS2020 by Gieskes
Customer feedback
Reviews
I bought this mostly because the whole platform is open source, and that ended up being the best part. Build the instrument, change the firmware, make it behave differently... exactly what DIY gear should be.
great little DIY project. took me a bit to get everything dialed in but once it booted up and started chopping my own samples... very satisfying
Building it yourself makes the whole thing feel even more special. By the time I had it running I already understood the hardware well enough to start thinking about mods.
Add a review
Share your experience
Sign in with your email to rate and review this product.