BOP SOUND DESIGN & MIXING — shared by humans and agents Find sounds: https://sahildev.com/bop/api/sounds Find controls and synthesis choices: https://sahildev.com/bop/api/schema Full instrument settings: https://sahildev.com/bop/api/sounds/ Human controls: open Bop, choose Sounds & mixer below the instrument selector. SOUND CHOICES 192 named sounds include pianos, electric pianos, organs, mallets, guitars, strings, brass, woodwinds, synth leads/pads/basses, percussion and sound effects. The Atmosphere category adds felt-room-piano, night-electric-piano, wide-velvet-pad, distant-strings, glass-echo-keys, dream-marimba, intimate-nylon, tape-guitar, soft-triangle-bass, gritty-mono-bass, hazy-saw-lead, arcade-echo-lead, hollow-bells, slow-bloom-flute, dusty-clavinet and wide-soft-choir. Sound IDs are stable names; do not substitute General MIDI program numbers. Read channelType: drum sounds require D0–D11 slots, not melodic pitch names. These are synthesized approximations, not sampled acoustic instruments. ACOUSTIC DEPTH Bowed strings and woodwinds use a note-local excitation model before the pressure filter and body EQ. Bow friction sustains, reed turbulence emphasizes the onset, air instruments retain breath texture, and pluck contact decays. Harmonic motion gives an attack-to-sustain color change and restrained irregular movement in the upper partials. Body curves and partial balances distinguish violin/viola/cello/bass and reed/air families. These are voicing approximations, not measured instrument bodies or samples. Controls for harmonics and Picked String engines: - stringSustainType: "bright" or "acoustic" on Picked String. Acoustic enables register-dependent string damping; the catalog acoustic strings use it. - acousticMode: "none", "bow", "reed", "air", "pluck" or "bowed" for the legacy excitation models. None bypasses the model. Harmonics instruments additionally support "spectral-violin", "spectral-viola", "spectral-cello", "spectral-flute", "spectral-clarinet" and "spectral-sax". - acousticTexture: 0-100, integer; amount of filtered excitation noise. - acousticMotion: 0-100, integer; evolving harmonic balance, not pitch detuning. Catalog defaults are restrained. Raise texture modestly before adding reverb; use motion to make held notes less static. Zero texture keeps motion available; zero motion keeps texture available. Both are shaped by the note and pressure filter. Do not put bow mode on a plucked part unless that is intentional. Example local edit (same v3 revision/edit workflow): {op:"performance",track:"lead",section:"bridge", controls:{acousticTexture:25,acousticMotion:60,brightnessHz:7000}} Bowed adds independently moving body-frequency bands; bow preserves the earlier voice. Fiddle uses bowed. Violin, viola, cello, flute, clarinet and tenor-sax now use spectral sources. Their individual partials evolve across attack/sustain, register and note intensity using envelopes derived from CC0 recordings. Pitch/vibrato remain controlled by Bop, not by recorded pitch modulation. These are magnitude reconstructions, not full physical simulations or waveform sample playback. Viola/cello profiles derive from ensemble recordings. For spectral sources, settings.harmonics is a 28-value attenuation mask: 100 preserves the reference partial, 0 removes it. Start with all values at 100. The last value also controls partials above 28. Brightness, body EQ, texture, motion, local expression and mix controls remain independently editable. Selecting a named sound sets the whole profile; changing acousticMode alone retains your existing harmonic mask and filters, which may obscure its character. An old instrument may have no mode; add acousticMode:"bowed" or "air" explicitly. Existing native songs and pinned revisions preserve their embedded settings. For the new full voicing, select a fresh catalog sound in Sounds & mixer. On a pinned API project, fetch /bop/api/sounds/ and apply its settings with a sound edit; selecting the same pinned sound ID alone retains its previous definition. Exact score/native exports retain excitation; MIDI approximates instrument tone. Dry, matched-average-level before/after phrases and held-out reference plots: https://sahildev.com/bop/instrument-review/ MIX LEVELS Use controls.level from 0 to 100 on each part. Zero mutes; 100 is the highest instrument gain. Native steps are 0,14,29,43,57,71,86,100. Intermediate requests snap to the nearest step. The response reports level and linear gain. These percentages are a control scale, not equal perceived loudness across instruments, and not a master loudness target. The editor's master volume is a listener preference and is separate from these saved per-part levels. Start with a lead near 71–86, harmony near 43–57 and bass/percussion near 57–71, then balance in context. Those are starting hypotheses, not guaranteed mixes. Pads with long release/reverb accumulate energy; lower their level and leave space. Keep bass and kick near center, usually with less ambience. Pan supporting parts modestly left/right rather than moving every instrument to the extremes. For multiple instruments on one channel, edit each instrument explicitly when their relative balance matters. Omitting instrument in Bop edit sets all of them. ATMOSPHERE RECIPES Use atmosphere:"dry", "intimate", "spacious", "dreamy", "echoing" or "gritty". Read /bop/api/atmospheres for exact settings and descriptions. A recipe changes only its listed controls; it does not reset every previous effect, change the instrument, alter level/pan or create notes. Explicit controls override recipes. For a fully fresh sound, choose a sound preset first, then a recipe/overrides. BRIGHTNESS AND EXPRESSION The acoustic palette retains body resonances while letting upper partials through. Note intensity drives both volume and brightness; mix level changes gain only. Use controls.brightnessHz to open or close the note low-pass filter without replacing body EQ or pressure envelopes. This reveals existing harmonics; it does not add missing excitation or bow/breath noise. Saved songs and pinned revisions retain their original sound settings. Apply a brightness edit to revise them. API v3 performance edits can target a section, repeat or bar range; see https://sahildev.com/bop/agent-guide.txt for local mix and expression examples. EVERYDAY CONTROLS (put these inside controls) brightnessHz: 62.5–16000 Hz; quantized first note low-pass cutoff. level: 0–100; 0 mutes. pan: -100 left to +100 right; 0 is center. reverb: 0–100; 0 off, 33 small, 67 spacious, 100 long. chorus: 0–100; 0 off, 33 gentle width, 67 wide, 100 strong. echoSustain: 0–100 repeat feedback; 0 disables echo. echoDelayBeats: approximately 0.083–2 quarter-note beats, in 1/12-beat steps. .5=eighth-note echo, .75=dotted-eighth echo, 1=quarter-note echo. A delay value alone may retain a zero feedback amount; specify echoSustain. fadeInSeconds: 0–0.1575; soften the onset (not applicable to drumset). releaseBeats: -0.5–2; positive rings after the note, negative ends early. This convenient value is in beats, distinct from native fadeOutTicks. detuneCents: -45–45. transpose: -12–12, nearest native just-intonation interval; inspect the applied value (a requested +7 is approximately +7.020). vibrato, transition, chord and unison: exact enum names from the schema. "continue" transition and "arpeggio" chord mode are intentional musical tools. Unison applies to chip, harmonics and Picked String instruments only. distortion, bitcrusherQuantization: 0–100. bitcrusherOctave: 0–6.5. These affect timbre strongly. Start low, especially on bright lead sounds. pulseWidth: PWM/supersaw only; dynamism, spread, shape: supersaw only. stringSustain: 0–100, Picked String only. All actual ranges and compatibility are in /bop/api/schema. Controls enable their needed effects automatically; setting an effect amount to zero disables it. Use both bitcrusher controls at zero to remove both reduction dimensions. NATIVE SYNTHESIS — full access without guessing hidden settings Use settings with a named sound to override native properties, or use a complete instrument object to start a custom sound. The API supports chip, FM, noise, spectrum, drumset, harmonics, PWM, Picked String and supersaw. /api/schema lists wave names, FM algorithms/frequencies/feedback, filter types, envelopes and compatible targets. /api/schema/instrument is the JSON Schema. Each catalog detail includes a complete editable settings object. - eqFilter / noteFilter: arrays of up to 8 {type,cutoffHz,linearGain} points. type is low-pass, high-pass or peak. The schema gives numeric limits. - harmonics: exactly 28 values from 0–100; spectrum: exactly 30. - drums: 12 objects with filterEnvelope and a 30-value spectrum. Check len(spectrum) == 30 before submitting custom drums. For example, [0]*14 + [14,29,43,57,71,71,86,86,100,100,100,100,100,86,71,57] has 30 values; [0]*13 with the same tail has only 29 and is invalid. Validation paths use zero-based drum indices: drums[9] is slot D9. - FM: algorithm, feedbackType, feedbackAmplitude, and exactly four operators with frequency (schema enum) and amplitude (0–15). - envelopes: up to 12 {target,envelope,index?}; use schema target compatibility and index limits. This is per-note synthesis modulation, not track automation. - effects: exact array of enabled effect names. With settings overrides, effect parameters activate their effects if effects is omitted. When explicitly supplying effects (including []), it is authoritative; inactive parameters are rejected rather than silently ignored. Full Bop score objects require explicit effect activation too. Zero/off controls remove unused native parameters. - settings arrays replace whole arrays; they do not merge filter points or operators. Omitted fields retain the named sound's settings. - preset numbers are compatibility metadata. Choose sounds by ID. Changing the number alone does not recreate the sound; use sound or full settings. Native fadeOutTicks use 48 synth ticks per beat. Native pitchShiftSemitones is an index with center 12, not a signed interval; prefer controls.releaseBeats and controls.transpose. Legacy native volume is -40–100, not the friendly level scale; prefer controls.level. Reported normalization warnings reveal any change from the requested values, including inactive build-specific options. INSTRUMENT RESPONSE Acoustic presets include their own body/bore color and intensity-dependent brightness. Violin-family sounds sustain energy under the bow; piano, guitars and bass use the dispersive string engine; mallets and bells decay after a strike. Softer note expression changes brightness as well as level. Choirs use vowel-formant colors. These are synthesized approximations, not recordings. Use a named sound plus expression before adding custom filters. Wind/bowed phrases can use swell; piano, guitar and mallet phrases should usually taper. Leave breath rests. Avoid pitch scoops on piano or fixed-pitch percussion. Keep contact/breath noise quiet and tied to a relevant gesture if adding a separate noise part; the base sound does not create extra tracks automatically. Fetch the current sound detail before overriding engine-specific fields: some acoustic presets now use a different engine while keeping the same ID. Saved native song links keep their embedded settings; reselect a preset to adopt its current voicing. Explicit custom settings remain under your control. WORKFLOW Choose a small sound palette. Set per-part level and pan. Add atmosphere with a musical purpose, keeping the lead readable. Compile, inspect mix and warnings, and use focused edits to revise. Humans can audition a sound on a reference phrase or preview the song, solo a channel, reset, cancel or apply all changes as one undo step. The mixer does not write notes. For detailed wave/filter/ envelope editing in the browser, use Customize Instrument after applying. Do not equate a text or numeric review with actually hearing the result. API 3.5.0 SECTION MIX WORKFLOW Save a named mix with {"op":"mixPreset","id":"back","value":{"level":43,"reverb":67}}. Then {"op":"mix","tracks":["violin","sax"],"section":"chorus","use":"back"}. Add inline controls to override that preset. Presets copy on use; redefining one does not alter previous applications. See agent-guide.txt for selectors and limits. REFERENCE TIMBRE ATLAS https://sahildev.com/bop/timbre-atlas/catalog.json Follow each preset's details URL for real recording sources, measurements and control directions. Versioned instrument history: https://sahildev.com/bop/instrument-review/ Coverage distinguishes matching instruments, related instruments/techniques, and contextual performance excerpts. Some presets have fewer than three independent recordings. These are examples, not a perceptual score or a fitted physical model. Read https://sahildev.com/bop/timbre-atlas/method.txt first.