BounceBud is an iOS physics-based MIDI sequencer available as a standalone app and an AUv3 MIDI plugin. It turns a bouncing-ball scene into a MIDI instrument: balls move around a framed playfield, hit note keys on the four edges, and each collision sends a MIDI note.
BounceBud outputs MIDI. The standalone app includes an optional internal sampler so you can hear the result immediately, but the main purpose of BounceBud is to drive other synths, drum machines, samplers, and instrument apps.
BounceBud is built around a simple feedback loop.
The result is a sequencer that feels more like a playable physics system than a step grid. Small changes to ball speed, size, note selection, wall input, or pattern setup can produce very different musical behavior.
| Edge | Output cable in AUv3 | Standalone virtual output |
|---|---|---|
| Top | BounceBud Top | BounceBud Top Keyboard |
| Bottom | BounceBud Bottom | BounceBud Bottom Keyboard |
| Left | BounceBud Left | BounceBud Left Keyboard |
| Right | BounceBud Right | BounceBud Right Keyboard |
Each edge can drive a different destination or synth part. For example, Bottom can play a bass synth, Top can play a lead, Left can trigger percussion, and Right can play chords or textures, depending on your note selections and MIDI routing.
The main area is the SpriteKit playfield. The four sides display note keys. Balls bounce inside the frame and flash keys when they collide with them.
| Control | Description |
|---|---|
| Patterns | Numbered pattern slots. Tap a number to select it. Tap + to add a copied pattern. Long-press a pattern to copy, paste, or delete. The label shows the pattern MIDI CC number. |
| Ball Count | Adds or removes balls in the current pattern. |
| Speed | Controls ball speed for the current pattern. |
| Size | Controls ball size for the current pattern. |
| Key | Opens the key picker for the current pattern. |
| Scale | Opens the scale picker for the current pattern. |
| Play | Starts or stops the sequencer. Ball collisions only send MIDI notes while it is playing. |
| Settings | Opens MIDI, keyboard, ball, aspect ratio, knob, sampler, and support settings. |
The in-app Tutorial is available from Settings. It walks through the same core ideas: the four keyboards, wall shooting, patterns, ball controls, scale settings, keyboard settings, ball settings, and MIDI routing.
Ball collisions only create MIDI notes while the sequencer is playing. If balls are moving but no MIDI is sent, make sure the Play button is active. In AUv3 mode, BounceBud's own Play button always works; the Sync To Host Transport setting additionally lets the host transport's start/stop also drive Play state — see Settings and AUv3 MIDI Plugin Support.
You can flick a ball by pressing, dragging, and releasing it. A flick throws the ball in the drag direction with a speed boost. After the next wall or edge collision, the ball decelerates back toward its configured speed.
When a ball hits an edge keyboard, BounceBud finds the key under the contact point and sends that key's MIDI pitch. If the same note is already active on the same cable, BounceBud turns the old note off before retriggering it. Note-off timing follows the Note Length setting of that edge keyboard.
Open Settings, then use the Keyboard Settings section to edit Top, Bottom, Left, or Right.
| Setting | Description |
|---|---|
| Note Length | Duration of notes triggered from this edge. |
| Minimum Octave | Lowest octave used by this edge keyboard. |
| Maximum Octave | Highest octave used by this edge keyboard. |
| Minimum Velocity | Lowest random velocity sent by this edge. |
| Maximum Velocity | Highest random velocity sent by this edge. |
| MIDI Out Channel | MIDI channel used for notes generated by ball collisions on this edge. |
| MIDI In Channel | MIDI channel that can shoot walls from this edge. |
| Select Notes | Choose exactly which scale notes appear on this edge. |
The current pattern's key and scale are shared by all four edge keyboards, but each keyboard has its own octave range and selected notes. Changing key, scale, or octave range rebuilds the available note list.
Select Notes opens a note picker for the currently selected edge keyboard. Use it to thin out an edge, create repeating motifs, isolate percussion trigger notes, or make each edge cover a different register.
If every note is selected, the row shows All Notes. Otherwise it shows the number of selected notes.
Each edge chooses a random velocity between its minimum and maximum values for every hit. Set both values the same for fixed velocity. Use a wider range for more variation.
Ball behavior is stored per pattern.
| Control | Range | Description |
|---|---|---|
| Ball Count | 0 to 100 | Number of balls in the current pattern. More balls produce denser MIDI. |
| Speed | 1 to 100 display scale | Controls the configured ball speed. Faster balls create more frequent hits. |
| Size | 1 to 100 display scale | Controls ball size. Larger balls change collision timing and contact positions. |
| Size Variety | 0 to 100 percent | Randomizes ball sizes around the Size value. |
| Speed Variety | 0 to 100 percent | Randomizes ball speeds around the Speed value. |
| Collision with other balls | On or Off | Enables physical ball-to-ball collision. |
| Color Theme | Theme list | Changes ball and wall colors. |
When Collision with other balls is off, balls pass through each other and only react to edges, bounds, and shot walls. When it is on, balls collide with each other too, which can create more chaotic movement.
Variety values are applied when balls are created or their physics is refreshed. Use low variety for predictable patterns and higher variety for more organic motion.
BounceBud supports multiple independent patterns. Each pattern stores its own ball setup, key, scale, and all four keyboard configurations.
The Patterns label shows the assigned CC number, default CC#10. Change it in Settings under MIDI Settings.
Send that CC on the global MIDI In Channel with a value from 1 upward to select a pattern. Value 1 selects pattern 1, value 2 selects pattern 2, and so on. Value 0 is ignored.
Incoming MIDI note-on messages can shoot walls from the edge keyboards. This is one of BounceBud's main performance features.
| Edge | Wall movement |
|---|---|
| Bottom | Shoots upward |
| Top | Shoots downward |
| Left | Shoots right |
| Right | Shoots left |
Wall count is limited so the scene does not fill indefinitely. Older walls are removed as needed.
Each edge has its own MIDI In Channel in Keyboard Settings. By default, the Bottom, Top, Left, and Right keyboards use different input channels, making it easy to shoot walls from one side at a time.
Program Change 69 triggers BrainBud key and scale sync from the shared Bud app group. When BrainBud universal MIDI channel is disabled, the program change must arrive on the global MIDI In Channel.
BounceBud produces MIDI notes from ball collisions. It does not require an audio instrument internally, although the standalone app includes an optional sampler for monitoring.
The standalone app creates four virtual MIDI outputs:
| Output | Source |
|---|---|
| BounceBud Top Keyboard | Top edge |
| BounceBud Bottom Keyboard | Bottom edge |
| BounceBud Left Keyboard | Left edge |
| BounceBud Right Keyboard | Right edge |
Open Settings to enable or disable Virtual MIDI Out, Virtual MIDI In, connected MIDI inputs, connected MIDI outputs, and MIDI Panic.
Standalone MIDI events are sent to enabled CoreMIDI destinations and through the matching virtual output port. Route those outputs to synth apps, DAWs, hardware interfaces, or MIDI processors.
MIDI Panic sends note-off cleanup for stuck notes. Use it if a destination synth keeps sounding after transport changes or routing changes.
| Setting | Description |
|---|---|
| Patterns CC# | CC number used for pattern switching. |
| MIDI In Channel | Global input channel for pattern switching and optional BrainBud channel filtering. |
| Sync To Host Transport | AUv3 only. When enabled (default), the host transport's start/stop transitions also update BounceBud's Play state, matching classic AUv3 behavior. When disabled, host transport changes are ignored. Either way, BounceBud's own Play button and the isPlaying AU parameter always control playback directly — enabling sync does not lock them. Has no effect in the standalone app. |
Use the Top, Bottom, Left, Right selector to edit each edge keyboard. See Section 5 for details.
Ball settings include ball-to-ball collision, size variety, speed variety, and color theme.
Apply Aspect Ratio constrains the playfield to a selected ratio. Available ratios are 1:1, 4:3, 16:9, 16:10, and 14:9. This can make BounceBud behave more consistently across devices and hosts.
Knob Control Style changes how the app's knobs respond to touch gestures.
The Support section includes Tutorial, Review, Other Apps, and Feedback.
BounceBud is available as an AUv3 MIDI Processor plugin.
The AUv3 plugin sends MIDI only. It does not produce audio by itself. Route one or more BounceBud MIDI outputs to instrument tracks in your host.
| AUv3 MIDI output | Source |
|---|---|
| BounceBud Top | Top edge |
| BounceBud Bottom | Bottom edge |
| BounceBud Left | Left edge |
| BounceBud Right | Right edge |
In AUv3 mode, BounceBud always follows the host's tempo and beat position when the host provides them. Whether the host transport's start/stop also drives Play state depends on the Sync To Host Transport setting in Settings — either way, BounceBud's own Play button and the isPlaying AU parameter always work:
isPlaying AU parameter, control playback. Useful for auditioning or free-running a pattern independently of the host's transport.BounceBud exposes these AU parameters:
| Parameter | Effect |
|---|---|
| Pattern | Selects the active pattern. |
| Ball Count | Changes the current pattern's ball count. |
| Ball Speed | Changes the current pattern's ball speed. |
| Speed Variety | Changes speed randomization. |
| Ball Size | Changes the current pattern's ball size. |
| Size Variety | Changes size randomization. |
| Ball Collision Enabled | Toggles ball-to-ball collision. |
| Play | Starts or stops the sequencer, same as the Play button. |
| Sync To Host Transport | Toggles whether host transport start/stop also updates the Play state, same as the Settings switch. |
The AUv3 plugin saves and restores the full BounceBud state, including patterns, settings, keyboard data, and the current Play state, through the host's plugin state and user preset system. Restoring a preset that was saved while playing resumes playback immediately. The included factory preset restores the default state (not playing).
The standalone app includes an optional sampler so you can hear BounceBud without setting up another instrument.
| Control | Description |
|---|---|
| Sampler Enabled | Turns the internal sampler on or off. |
| Volume | Sets sampler output level. |
| Preset | Selects a soundfont preset. |
The sampler receives BounceBud MIDI output internally. It is useful for quick auditioning, but external MIDI output continues to work independently.
The sampler is only available in the standalone app. In AUv3 mode, use an instrument track in the host.
BounceBud is primarily a MIDI app. Enable the built-in sampler in Settings or route a BounceBud MIDI output to another synth app. Also check device volume and sampler volume.
Press Play first. Ball collisions only send MIDI while BounceBud is playing. In AUv3 mode, if pressing the host's play button does not start BounceBud, check that Sync To Host Transport is enabled in Settings — when it is disabled, only BounceBud's own Play button or the isPlaying AU parameter controls playback. Then check that the destination app or host is listening to the correct BounceBud output and MIDI channel.
This is expected if no instrument is connected. Route BounceBud Top, Bottom, Left, or Right to an instrument track in the host.
Confirm the incoming note exists on the target edge keyboard and the incoming channel matches that edge's MIDI In Channel. Also verify Virtual MIDI In or the relevant host MIDI input route is enabled.
Check the Patterns CC# value in Settings and send that CC on the global MIDI In Channel. Values start at 1: value 1 selects pattern 1.
Make sure the sequencer is playing. If an edge has no selected notes, it cannot render keys for collisions. Reopen Select Notes or change the octave range to rebuild the notes.
Use MIDI Panic from the standalone settings, or stop and restart host transport in AUv3 mode. Also check that the destination synth is listening on the same MIDI channel that generated the note-on.
Begin with one or two balls, one edge routed to a synth, and a small note selection. Once the timing feels musical, add the other edges, raise ball count, and use MIDI wall shots to perform variations.