Wind Chimes is a playable generative MIDI instrument for iPhone and iPad. A simulated wind field moves a graduated row of hanging chimes. When the chimes collide, Wind Chimes creates MIDI notes whose pitch, velocity, and timing come from the row's tuning and physical motion.
Use the standalone app as an immediately audible instrument with its built-in sampler, send MIDI to other apps or hardware, or load the included AUv3 MIDI Generator in a compatible host.
Wind Chimes models a direct-knock chime set: there is no central clapper. The hanging bodies ring by touching one another. Every chime can collide with any other chime it can physically reach, not only the one beside it.
The row is musical as well as physical:
The animated wind ribbons, drifting debris, sky, and strike flashes show the same wind and collision state that drives the MIDI. They are not a separate decorative simulation.
For AUv3 use, insert Wind Chimes as a MIDI Generator and route Wind Chimes Out to an instrument track. The plug-in itself intentionally generates no audio.
The large scene contains the rail, the chimes, and the animated wind. Bright strike effects identify collisions that became MIDI triggers. A hold ring identifies a chime currently under your finger.
Small perch marks above the rail select individual chimes for editing. The bird is the current selection marker: it flies to the selected perch, moves when you select another chime, and leaves when you clear the selection.
When no individual chime is selected, the control panel shows six knobs:
From left to right, the toolbar contains a left group and a right group, separated by flexible space:
(flexible space)
Drag a knob vertically to change it. Key, Transpose, Chimes, and Spread also open a list when tapped.
Tap the diagonal Expand arrows at the left edge of the toolbar to animate the live performance scene out of the normal layout and across the entire available app or plug-in view. The scene draws to the outer edges rather than stopping at the safe area, while its Collapse button remains safely positioned in the lower-left corner.
Tap the opposing diagonal Collapse arrows to animate the scene back into its original place above the controls. Expanding and collapsing do not restart the wind, clear the selected chime, or create a second scene—the current performance continues through the transition. In an AUv3 host, full-screen mode fills the plug-in view supplied by that host; it does not cover the host application's own interface.
Wind Chimes draws the row at whatever size the performance scene actually is on screen, and the chimes' physical behavior—not just their drawn size—follows that scene size directly. A larger drawn scene gives the chimes physically longer cords: they swing more slowly and collide less often. A smaller drawn scene gives them physically shorter cords: they swing faster and collide more often. The row's tuning, notes, and every musical setting stay exactly the same either way—only the pace of the physical motion changes.
This means the same setup can feel different depending on how the scene is currently drawn:
This is intentional rather than a bug: a chime's on-screen size and its physical behavior always agree with each other, at any scene size, so what you see swinging is always exactly what is colliding and sounding. It also means a preset is not guaranteed to strike at exactly the same rate in every context—see Spread for the one control that still shapes density independently of scene size, by changing how tightly the row is packed within whatever scene is currently drawn.
The default workflow is generative. Set the wind controls, then let the row evolve. Wind moves across the row with local variation, so chimes do not swing in perfect lockstep. Gusts travel through the row and create changes in density and dynamics.
At Strength = 0, the wind is silent by design. A row can also be quiet at low-energy settings simply because no bodies are reaching one another. Increase Strength, Turbulence, Gust Frequency, or Gust Strength; make the row more compact with Spread; or play a chime by touch.
The touch target is intentionally larger than the narrow drawn bell. Multi-touch is supported; separate fingers can hold separate chimes.
Tap the small perch mark directly above a chime. The per-chime editor replaces the wind controls. Tap the selected perch again to clear the selection and return to the wind panel. Perch taps are resolved before bell touches, so selecting a chime does not also strike it.
| Control | Range | Default | Effect |
|---|---|---|---|
| Overall Strength | 0–1 | 0.45 | Sets the total wind drive. Zero prevents wind-generated strikes. |
| Direction | −1–1 | 0.00 | Reverses and biases the prevailing wind across the row. |
| Turbulence | 0–1 | 0.35 | Adds faster, irregular local motion and helps chimes separate and collide. |
| Gust Frequency | 0–1 | 0.25 | Sets how often discrete gusts tend to arrive. |
| Gust Strength | 0–1 | 0.35 | Sets the size of each gust impulse. |
| Inertia | 0–1 | 0.55 | Higher values produce slower, smoother, more damped movement. |
These controls interact. High Strength with low Turbulence can create broad coordinated sways, while more Turbulence breaks the row into busier local motion. Gust Frequency controls event density; Gust Strength controls how disruptive each event is.
New Wind changes the runtime seed and restarts the simulation. It keeps every visible control, chime setting, key, scale, and preset value unchanged. Use it when you like the setup but want a different performance.
Randomize goes further: it rolls a brand-new chime layout, harmonic pattern, and every wind parameter together, replacing the current design rather than just its wind sequence. Rolls stay musical — the randomizer samples from a set of named wind characters (still air, gentle breeze, playful, gusty, ceremonial, storm, and machine, weighted toward the calmer characters) rather than choosing every value independently, so a roll never lands silent or floods with strikes. Use New Wind when you like the design and only want a new performance of it; use Randomize when you want a new design.
Choose between 2 and 16 chimes. Two is the minimum because a collision needs a pair.
Changing the count rebuilds the physical silhouette from longer bodies on the left to shorter bodies on the right. For positions that survive the resize, Wind Chimes preserves edited weight, pitch, MIDI channel, CC settings, and enable states. Length is regenerated, but preserved pitch edits are not forced back into ascending order.
Spread is displayed from 0% to 100%:
A compact row generally makes contact easier. A wide row allows more independent movement before collisions. At very wide settings, outer chimes can swing partly beyond the scene edge; this does not stop the simulation.
Spread reshapes the row within whatever scene is currently drawn; it does not change how large that scene is. For the separate effect of the scene's own size—full screen versus inline, portrait versus landscape, device, or an AUv3 host's window—see Scene size and physical behavior.
The Key control steps through available note names. The note icon opens the searchable scale picker, which also supports favoriting scales for quick access. Changing either retunes the entire row immediately.
Each chime stores a position in the current key/scale note pool rather than a permanently fixed MIDI note. Retuning therefore preserves the chime's musical role while moving it into the new key or scale. Length, weight, and spacing do not change when you retune.
The default row begins around C4/MIDI note 60 and ascends by scale steps from left to right. You can override each chime's pitch in its individual editor.
Transpose shifts every chime together by scale-pool positions, from -24 to +24. A positive value moves upward through the current scale; a negative value moves downward. Because the control advances through the current Key and Scale's pitch pool, it stays in-scale instead of applying a fixed semitone offset.
Transpose is a global offset: each chime keeps its own stored pitch choice, so returning Transpose to 0 restores the original tuning. If the offset would pass below MIDI 0 or above MIDI 127, the affected notes clamp to the nearest available pitch.
Tap a perch mark to open the selected chime's editor. Its header shows Chime N, the current pitch, and two toggles.
| Control | Display range | Meaning |
|---|---|---|
| Length | 0–100% | Total cord-plus-bell drop. It changes swing period, reach, and contact geometry, but does not select the MIDI pitch. |
| Weight | 0–100% | Bell proportion and mass. It changes visible bell length, damping, momentum, and collision response, but does not select the MIDI pitch. |
| Channel | 1–16 | MIDI channel for this chime's notes and CC. |
| CC# | 0–127 | Controller number used for swing-angle output. |
| CC Min | 0–127 | Value sent at the negative swing extreme. |
| CC Max | 0–127 | Value sent at the positive swing extreme. |
The MIDI mapper chooses the note from the struck chime's configured Pitch: its normal pitch for an ordinary strike or the next in-scale pitch for a hard strike. Length and Weight are not part of that note lookup. Because they change the physics, however, they can indirectly affect whether and when collisions happen, which chime is considered struck, and the collision force used for velocity.
CC#, CC Min, and CC Max are dimmed until the CC toggle is enabled. Set CC Min above CC Max to invert the movement mapping.
Factory/default rows start on channel 1, assign CC numbers upward from CC 20, use a 0–127 CC range, and leave CC output disabled.
Open Settings → Chimes → MIDI Chime Tuning to retune the whole row from an external MIDI keyboard or controller, one chime at a time, instead of adjusting each chime's Pitch knob individually. This works the same way in the standalone app and inside the AUv3 plug-in.
Tuning always happens on a Chromatic draft with Transpose reset to 0 for the session, so every note you play maps directly onto the chime's sound with no scale-degree math in the way. A note far enough below the current Key's root clamps to the lowest available pitch, the same way an extreme Transpose value does.
Each numbered cell shows:
The cell with the accent-colored border is the cursor: the chime the next note you play will retune.
Open Settings → Quantization.
The grid appears when Timing Mode is Quantized. Available values are:
In the AUv3 plug-in, Quantized mode follows the host's real tempo and playhead whenever the host reports them, so quantized output locks to the DAW's tempo grid. The standalone app has no host to query and always uses an internal free-running 120 BPM clock instead; the AUv3 plug-in falls back to the same 120 BPM clock only if a host doesn't report musical context/transport state.
New Wind, Randomize, preset loading, and state resets restart the generated run. If you need DAW-synchronous rhythm, use Free mode and quantize the recorded MIDI in the host, or use a host-side MIDI timing tool after Wind Chimes.
Each sounding collision produces:
This short gate is intentional. Wind Chimes is a trigger generator; the receiving sampler or synthesizer's release envelope determines how long the sound rings.
All generated messages use MIDI cable/bus 0.
When a chime's CC toggle is enabled, its current swing angle is mapped continuously between CC Min and CC Max and evaluated at 60 Hz. Repeated identical values are suppressed. The short smoothing applied to this stream keeps motion fluid without disconnecting it from the chime.
CC output uses the same per-chime channel as notes. It is independent of the built-in sampler, which ignores these controller messages.
Open Settings in the standalone app:
The standalone MIDI In section lists a Virtual MIDI In switch plus one switch per available CoreMIDI input port. Outside of MIDI Chime Tuning, this is not a surface for playing or retriggering the chimes: incoming notes and CC do not drive the instrument during normal performance, and the current input path only passes incoming pitch-wheel data through to connected outputs.
The standalone app includes an Apple sampler so you can hear the generated notes without connecting another instrument.
Open Settings → Sampler:
The sampler receives the same notes that are sent to CoreMIDI, but it plays all notes on its own channel 1. Per-chime channel differences still apply to external MIDI destinations. Swing-angle CC messages do not control the sampler.
The app's audio session mixes with other audio. If you want Wind Chimes only as a MIDI source, disable the sampler while leaving MIDI outputs enabled.
Tap the folder button to open two tabs.
Wind Chimes includes 21 factory choices including Init: a curated set of 20 presets grouped into calm and airy rows, nocturnal and ceremonial bells, bright and geometric tunings, and rhythmic and propulsive quantized weather. Examples include Morning Dew, Sunken Cathedral, Obsidian Bells, Crystal Orbit, Silver Machine, Harmonic Spire, Monsoon Pulse, Prayer Wheels, and Aurora Drift.
Tap a preset to apply it. Use the previous and next arrow buttons to audition neighboring entries.
Open User Presets and tap + to save the current setup under a name. A user preset stores:
Swipe a user preset to Rename or Delete it. User presets use iCloud Documents when available and otherwise use the app's shared container. The standalone app and AUv3 extension share that preset location.
Presets intentionally do not preserve an exact wind sequence. Loading any preset starts it with a fresh runtime seed, so the controls and chime design return but the motion unfolds differently.
The appearance theme is part of the preset. If you choose a theme in Settings and save a user preset, loading that preset restores the theme along with its wind, tuning, and chime design. The theme also applies to the preset browser and the complete animated scene. New documents use the last selected theme, and older theme-less documents use it as a fallback; a saved preset keeps its own theme afterward.
Wind Chimes includes an AUv3 component registered as a MIDI Generator. In a compatible host, look for Cem Olcay: Wind Chimes or Wind Chimes among MIDI effects/generators.
The AUv3 produces silence on its audio output by design and has no built-in sampler. Hearing nothing from its audio bus is expected; the host must route its MIDI output to an instrument.
The host-visible parameter tree contains eleven parameters:
Key, Scale, and Transpose are discrete indexed choices. Per-chime fields, Chime Count, Spread, and the selected theme are not AU parameters, but they are included in the plug-in's saved full state along with all other preset data.
Wind Chimes exposes factory presets and supports host user presets. Compatible hosts should restore the full row, tuning, per-chime configuration, Spread, and parameters with the session. Each plug-in instance owns its own running simulation and state.
The AUv3 accepts parameter automation but does not process incoming MIDI notes or CC during normal performance. The one exception is MIDI Chime Tuning: while that screen is open, note-on messages the host sends into the plug-in retune the row instead of being ignored. Host tempo/transport IS connected to quantization when the host reports them; see Timing and Quantization.
The AUv3 Settings screen contains Appearance, Quantization, and Support. Standalone-only features—CoreMIDI input/output selection, MIDI Panic, and the built-in sampler—do not appear inside the plug-in. Note that the Support section's Tutorial button opens a URL only the standalone app can handle, so it will not do anything inside a host.
The Accented Notes switch, in both standalone and AUv3 settings, turns the accent-note behavior described in Overview on or off for the whole row. On (the default), a hard strike sounds one scale step above the struck chime's normal pitch. Off, every strike sounds the chime's normal pitch regardless of force—velocity still rises with a harder hit, only the pitch stays fixed.
This is a per-preset setting: it saves with a user preset and restores with it, the same as Key, Scale, or Transpose.
The Theme picker changes the app chrome and the complete animated scene. Eighteen themes are available, with Sakura as the default:
The chosen theme belongs to the current preset/document and is applied to both the UIKit controls and the complete SpriteKit scene. Saving a user preset captures it; loading a preset restores its own theme. The last selected theme is also remembered as the default for new documents and as a compatibility fallback for older presets that do not contain a theme yet.
Timing Mode and Grid Subdivision are available in both standalone and AUv3 settings. See Timing and Quantization for the grid and the host-tempo/120 BPM behavior.
Both the standalone app and the AUv3 plug-in include a Support section with:
The standalone Settings screen also provides Sampler, MIDI In, MIDI Out, and MIDI Panic controls. Tap Done to close Settings. The version number appears at the bottom.
This is expected. See Scene size and physical behavior: the chimes' physical swing speed and strike rate follow the actual size of the drawn performance scene, so full screen versus inline, portrait versus landscape, device, and (in AUv3) plug-in window size can all change the pace of a preset even though every musical and wind setting is unchanged. If the new pace is not what you want, adjust Spread or the wind controls rather than looking for a setting that "fixes" the size dependency—there isn't one, by design.
Wind Chimes is a MIDI Generator, not an audio instrument. Route its MIDI output to a synth or sampler. The plug-in's own audio output is intentionally silent, and the standalone built-in sampler is not included inside AUv3.
Quantized mode follows the host's tempo/playhead automatically in a host that reports musical context and transport state each render call. If a host doesn't report either, Wind Chimes falls back to its internal 120 BPM clock and quantized output no longer tracks the DAW. Use Free mode and quantize after recording if that fallback doesn't match what you need.
This is intentional. Presets save the instrument design, not the random seed. Every load begins a fresh wind sequence.
Selection is temporary UI state and is not stored. A resize or preset can remove the selected chime, so Wind Chimes clears the selection and returns to the global wind controls. Tap a perch to select again.
Wind Chimes is generated by its own wind simulation and touch surface, not by incoming MIDI. The one exception is MIDI Chime Tuning (Settings → Chimes → MIDI Chime Tuning): while that screen is open, incoming note-on messages retune the row instead of triggering playback. Outside that screen, in the standalone app the only implemented MIDI-input behavior is pitch-wheel pass-through; the AUv3 ignores incoming MIDI during normal performance and accepts parameter automation only.
| Item | Behavior |
|---|---|
| Direction | MIDI output from Wind Chimes to destinations/host |
| Note channel | Per chime, displayed as 1–16; stored on the wire as 0–15 |
| Note number | Per-chime pitch in the selected key/scale; hard strikes use the next in-scale pitch when Accented Notes is on (see Accented Notes) |
| Velocity | Collision force mapped to 1–127 |
| Gate | Fixed trigger of approximately 20 ms |
| CC enable | Per chime; off by default |
| Default CC numbers | CC 20 upward by row position |
| CC range | 0–127; CC Min above CC Max inverts the mapping |
| CC update rate | 60 Hz with smoothing and duplicate suppression |
| Cable/bus | 0 |
| Panic | Standalone only: CC 123 and CC 120 on all 16 channels, plus sampler note stop |
| AUv3 output name | Wind Chimes Out |
| AUv3 component role | MIDI Generator (aumi); silent audio output |
| Quantization clock | AUv3: host tempo/transport when the host reports them; standalone and unreporting hosts: internal 120 BPM |