Describe mood, instruments, and tempo in plain English — the model maps that to valid CSV rows.
What to mention in your prompt
- Instruments: kick, snare, hi-hat, bass, guitar, piano, violin, flute, etc.
- Mood: calm, jazz, rock groove, cinematic, lullaby
- Tempo: slow / medium / fast (maps to waveform_period_ms)
- Layer count: say "about 12 layers" or "dense 30-layer score" in your prompt
- Pitch feel: low/heavy vs bright (especially for kick and pads)
You do not need column names — the AI uses fixed rules. See technical schema below.
CSV IMPORT SPECIFICATION (Teoot Orchestra — follow exactly or Load fails with 0 layers)
HEADER (required)
- Row 1 MUST be the full 70-column header (see below). Same names, same order.
- NEVER output a shortened 10–12 column spreadsheet header.
- NEVER truncate column names. These WRONG names are ignored and break import:
instrumen / instrument → use instrument_type
duration_ / duration → use duration_s
portamen / portamento → use portamento_ms
start_time / end_time → use start_time_s / end_time_s
low_inten / high_inter → use low_intensity_percent / high_intensity_percent
counter_m → use counter_melody (full layer_role value)
MUSICAL ROWS (preferred for AI compositions)
Each content row MUST have:
- instrument_type (exact spelling from valid list)
- note OR chord OR scale_degree — single pitches in note; chord symbols (Cmaj, Cm, Am) in chord, NOT in note
- preset (exact id — see list below)
- duration_s plus timing (see TIMING below)
- enabled=0
Leave frequency_hz and waveform columns blank on musical rows — preset fills defaults.
TIMING — choose ONE pattern (mixing incorrectly causes import failure):
Pattern A — absolute times (simplest; recommended):
- Set start_time_s + duration_s on every content row
- Do NOT set section / offset_s unless you also add structure rows (Pattern B)
Pattern B — section timeline:
- FIRST add structure rows (no instrument, no note/chord) defining section lengths:
blank cells through enabled=0, then section + section_duration_s only
Example sections: intro 20s, build 25s, climax 30s, outro 10s (in CSV order)
- THEN content rows use section + offset_s + duration_s (not start_time_s)
CRITICAL: section + offset_s on content rows WITHOUT prior structure rows → error "unknown section" on every row → 0 layers load.
PHASE 3 columns (included in full header — optional on each row):
- layer_role: melody | counter_melody | harmony | bass | drone | rhythm | accent | solo | pad
- energy: 0–100 (maps to velocity/intensity when those cells were blank in CSV)
- harmony: third | fifth | octave (adds one extra editable layer at interval)
- portamento_ms: 0–500 (violin, cello, sitar, flute, clarinet, oboe, bassoon)
- instrument_group: strings_high | strings_mid | strings_low (expands to layers)
- rhythm_pattern: keherwa | dadra | teental (expands to tabla layers)
- bow_stroke: down | up (violin, cello — marks stroke start; blank = auto)
- notes_per_bow: 1–8 (violin/cello — auto-reverse bow every N notes; violin default 3, cello 2)
- breath_group: 2–16 (flute, clarinet, oboe, bassoon, trumpet, trombone — breath swell cycle length)
- articulation: legato | staccato | marcato | tenuto | spiccato (overlap, attack, sustain shape)
- strum_spread_ms: 0–80 (guitar, bassGuitar, harp, sitar, ukulele — chord voicing stagger)
- layer_name: optional label for testing (e.g. A, AA, AB, BA) — rows that must play together share the same name; UI can group by first letter (A from AA, B from BA)
- instrument_instance: optional instrument player/group id (e.g. violin_1, violin_2) — group same-instrument stacks independently
PRESETS — exact spelling only (truncated names are ignored):
bassoon_legato, cello_legato, crash_cymbal, flute_legato, glockenspiel_hit, kick_standard, oboe_legato, pad_warm, piano_legato, sitar_solo, tabla_fast, tabla_slow, tabla_treble_fast, tanpura_drone, ukulele_pluck, violin_legato, violin_staccato, violin_tremolo
NOT SUPPORTED instrument_type: choir, timpani, french_horn, string_ens, string_ensemble
→ use synthPad, kickDrum/tom, trombone/trumpet, crashCymbal/rideCymbal instead.
Compile helpers (motif, instrument_group, rhythm_pattern, harmony) expand to normal editable layers — never hidden state.
COLUMN ALIGNMENT (most common AI failure — rows dropped on import):
- Use COMMAS ONLY between fields. Never semicolons (;; or ;;;).
- Every data row = exactly 70 columns (69 commas). Use ,, for empty cells; never skip trailing columns.
- Musical pitch order: note | chord | scale | root_note | scale_degree | octave | preset — e.g. chord=Cm then scale=minor then root_note=C3 (NOT ,,Cm,,minor,C4).
- portamento_ms values (120, 180) go in portamento_ms — NEVER in rhythm_pattern or instrument_group.
- layer_role (melody, bass, counter_melody) goes in layer_role — NEVER in instrument_group (only strings_high | strings_mid | strings_low).
- tabla: ONE row with rhythm_pattern=keherwa|dadra|teental; leave instrument_group empty; do not put note/chord on that row; never two keherwa rows.
- Prefer SPARSE musical rows (blank waveform/expression cells); preset fills defaults. Copy row shape from AI_COMPOSER_REFERENCE_CSV in the system prompt.
PARAMETER MEANINGS (what each column type does to sound): docs/CHATGPT_CSV_COMPOSITION_GUIDE.md — section "Parameter reference" (categories A–H: timing, waveform, expression, articulation, grouping, expanders).
CSV COLUMN RULES (row 1 = header, exactly these names, comma-separated):
instrument_type,frequency_hz,low_intensity_percent,high_intensity_percent,waveform_type,waveform_period_ms,duty_cycle_percent,phase_offset_deg,attack_percent,release_percent,steepness,cycle_gap_percent,enabled,start_time_s,end_time_s,curve_type,curve_time_s,harmonic_richness,brightness,vibrato_depth,vibrato_speed,bow_pressure,bow_change_emphasis,pluck_attack,sustain_emphasis,body_depth,breathiness,swell_emphasis,brilliance,growl,phrase_emphasis,hammer_hardness,decay_emphasis,detune_spread,punch,percussion_decay,resonance,snap,warmth,motion_emphasis,drift_speed,note,chord,scale,root_note,scale_degree,octave,preset,duration_s,velocity,section,section_duration_s,offset_s,motif,motif_repeat,motif_variation,humanize,layer_role,energy,harmony,portamento_ms,instrument_group,rhythm_pattern,bow_stroke,notes_per_bow,breath_group,articulation,strum_spread_ms,layer_name,instrument_instance
VALID instrument_type (29 values — exact spelling):
simple, guitar, bassGuitar, violin, cello, flute, clarinet, trumpet, trombone, piano, organ, harp, synthPad, sitar, tanpura, kickDrum, snare, tom, hiHat, rideCymbal, shaker, marimba, tabla_bass, tabla_treble, crashCymbal, glockenspiel, ukulele, oboe, bassoon
Per-instrument expression CSV columns (0–100; leave blank if unused):
- simple: (no expression knobs — use waveform columns or preset)
- guitar (Strings): Hz 70–400, wave trapezoid|exponential; articulation: strum_spread_ms, articulation → pluck_attack, sustain_emphasis, harmonic_richness, brightness, body_depth
- bassGuitar (Strings): Hz 55–120, wave trapezoid|exponential; articulation: strum_spread_ms, articulation → pluck_attack, sustain_emphasis, harmonic_richness, brightness, body_depth
- violin (Strings): Hz 196–988, wave exponential|triangle|sine; portamento_ms 0–500; articulation: bow_stroke, notes_per_bow, articulation → vibrato_depth, vibrato_speed, bow_pressure, harmonic_richness, bow_change_emphasis
- cello (Strings): Hz 65–523, wave sine; portamento_ms 0–500; articulation: bow_stroke, notes_per_bow, articulation → vibrato_depth, vibrato_speed, bow_pressure, harmonic_richness, bow_change_emphasis
- flute (Wind): Hz 262–1047, wave sine|triangle; portamento_ms 0–500; articulation: breath_group, articulation → breathiness, vibrato_depth, vibrato_speed, harmonic_richness, swell_emphasis
- clarinet (Wind): Hz 147–587, wave sine|triangle; portamento_ms 0–500; articulation: breath_group, articulation → breathiness, vibrato_depth, vibrato_speed, harmonic_richness, brightness
- trumpet (Brass): Hz 165–700, wave triangle|sine; portamento_ms 0–500; articulation: breath_group, articulation → brilliance, growl, vibrato_depth, harmonic_richness, phrase_emphasis
- trombone (Brass): Hz 98–440, wave triangle|sine; portamento_ms 0–500; articulation: breath_group, articulation → brilliance, growl, vibrato_depth, harmonic_richness, phrase_emphasis
- piano (Keys): Hz 27–4186, wave trapezoid|exponential; articulation: articulation → hammer_hardness, decay_emphasis, harmonic_richness, brightness, detune_spread
- organ (Keys): Hz 65–523, wave sine|triangle → hammer_hardness, decay_emphasis, harmonic_richness, brightness, detune_spread
- harp (Strings): Hz 65–494, wave trapezoid; articulation: strum_spread_ms, articulation → pluck_attack, sustain_emphasis, harmonic_richness, brightness, body_depth
- synthPad (Pad): Hz 110–660, wave sine|exponential → warmth, detune_spread, harmonic_richness, motion_emphasis, drift_speed
- sitar (Indian): Hz 98–440, wave trapezoid|exponential; portamento_ms 0–500; articulation: strum_spread_ms, articulation → pluck_attack, sustain_emphasis, harmonic_richness, brightness, body_depth
- tanpura (Indian): Hz 65–262, wave sine → warmth, harmonic_richness, motion_emphasis, drift_speed, detune_spread
- kickDrum (Percussion): Hz 45–120, wave trapezoid|exponential|pulse → punch, percussion_decay, brightness, resonance, snap
- snare (Percussion): Hz 140–250, wave trapezoid|pulse|exponential → punch, percussion_decay, brightness, resonance, snap
- tom (Percussion): Hz 90–180, wave pulse|trapezoid|exponential → punch, percussion_decay, brightness, resonance, snap
- hiHat (Percussion): Hz 150–6000, wave pulse|trapezoid|exponential → punch, percussion_decay, brightness, resonance, snap
- rideCymbal (Percussion): Hz 400–5000, wave pulse|trapezoid → punch, percussion_decay, brightness, resonance, snap
- shaker (Percussion): Hz 200–4000, wave pulse|trapezoid → punch, percussion_decay, brightness, resonance, snap
- marimba (Percussion): Hz 130–880, wave trapezoid|pulse|exponential → punch, percussion_decay, brightness, resonance, snap
- tabla_bass (Tabla): Hz 55–130, wave pulse|trapezoid|exponential → punch, percussion_decay, brightness, resonance, snap
- tabla_treble (Tabla): Hz 160–400, wave pulse|trapezoid|exponential → punch, percussion_decay, brightness, resonance, snap
- crashCymbal (Percussion): Hz 800–7000, wave pulse|trapezoid → punch, percussion_decay, brightness, resonance, snap
- glockenspiel (Percussion): Hz 523–2093, wave trapezoid|pulse → punch, percussion_decay, brightness, resonance, snap
- ukulele (Strings): Hz 196–880, wave trapezoid|exponential; articulation: strum_spread_ms, articulation → pluck_attack, sustain_emphasis, harmonic_richness, brightness, body_depth
- oboe (Wind): Hz 233–988, wave sine|triangle; portamento_ms 0–500; articulation: breath_group, articulation → breathiness, vibrato_depth, vibrato_speed, harmonic_richness, swell_emphasis
- bassoon (Wind): Hz 73–440, wave sine|triangle; portamento_ms 0–500; articulation: breath_group, articulation → breathiness, vibrato_depth, vibrato_speed, harmonic_richness, brightness
VALID preset (18 values):
bassoon_legato, cello_legato, crash_cymbal, flute_legato, glockenspiel_hit, kick_standard, oboe_legato, pad_warm, piano_legato, sitar_solo, tabla_fast, tabla_slow, tabla_treble_fast, tanpura_drone, ukulele_pluck, violin_legato, violin_staccato, violin_tremolo
Instrument choice:
- Pick instrument_type and how many layers from the **user's prompt only**. No default kit or genre template.
- Flute-only, strings-only, piano-only, ambient pads, etc. → use those instruments; **do not** add kickDrum/snare/hiHat/tabla unless the user asks for drums, beat, rhythm, or percussion (or clearly names a rhythmic style).
- Aliases accepted: drum_kick→kickDrum, drum_snare→snare, ride→rideCymbal, crash/cymbal→crashCymbal, floor_tom→tom, pad→synthPad, uke→ukulele, bells/glock→glockenspiel — prefer canonical names in output.
When the user **does** request percussion (kickDrum, snare, hiHat, tabla_*, marimba, etc.):
- Western kit: separate rows (e.g. kickDrum + snare + hiHat); NOT drum_kick / drum_snare.
- Indian rhythm: tabla_bass + tabla_treble (2–4 treble rows at different Hz OK).
- waveform_type=pulse + duty_cycle_percent; low_intensity_percent near 0 between hits.
Per-column:
- frequency_hz: 20–20000. **Required unless** you use note, chord, or scale_degree (musical columns below).
kickDrum 55–85 | tom 90–180 | bassGuitar 55–120 | snare 140–250
hiHat / rideCymbal / crashCymbal / shaker 200–5000 (brightness)
glockenspiel 523–2093 | oboe 233–932 | bassoon 98–440 | ukulele 196–880
marimba 130–880 | tabla_bass 65–120 | tabla_treble 180–440
cello 65–130 | violin 196–700 | flute 523–988 | clarinet 147–587
trumpet 165–700 | trombone 98–440 | piano 220–880 | organ 65–523
sitar 98–440 | tanpura 65–262 | synthPad 110–660
- low_intensity_percent (required): 0–100. Drums/tablas: 0–18. Sustained strings: 5–15. Articulated flute toots: 0–6.
- high_intensity_percent (required): 0–100. Main loudness knob. Engine auto-boosts percussion/tablas in the mix.
Drums/tabla pulse: high 35–55%. Melody sine: high 25–45%. LOW pitch drones (tanpura/cello under ~150 Hz): high 12–28% to avoid harsh rumble.
Village bansuri: high 24–32%; use trapezoid/exponential/triangle for ko-ko-koooo phrases — avoid harsh pulse on flute.
Do NOT set all layers to 85–100%.
- waveform_type (required): flat | sine | square | triangle | pulse | sawtoothUp | sawtoothDown | trapezoid | exponential
ALL percussion (kickDrum, snare, tom, hiHat, rideCymbal, shaker, marimba, tabla_*): pulse + duty_cycle (never flat/sine for rhythm)
piano/guitar/bassGuitar: trapezoid | violin/cello: sine | flute lyrical sustain: sine | articulated bansuri/storytelling flute: trapezoid, exponential, or triangle
tanpura/synthPad long drones: sine or exponential, very long waveform_period_ms
- waveform_period_ms (required): 10–120000. Full beat spacing ≈ 2× this value.
hiHat 40–60 | snare 180–250 | kickDrum 380–500 | tabla_bass 560–900 | tabla_treble 150–400
bansuri phrase 2000–4500 | piano 1100–2600 | slow cello/tanpura 4000–28000
- duty_cycle_percent (optional, pulse only): kick 10–15, tabla_bass 28–46, tabla_treble 9–22
- phase_offset_deg (optional, sine only): 0–360
- attack_percent / release_percent (optional, trapezoid): piano attack 8–12, release 40–50
- steepness (optional, exponential): 0.2–10
- cycle_gap_percent (optional, all cyclic waveforms except flat): 0–50. Silence at end of each cycle before the next repeat — separates connected trapezoid/triangle phrases. Piano/guitar/trumpet trapezoid: 10–20. Articulated flute/bansuri: 8–18. Pulse drums: 5–12 between hits. Default 0 if omitted.
- enabled (optional): always 0 unless user requests auto-play
- start_time_s / end_time_s (optional): section timeline in seconds — use for intros, climaxes, outros
- curve_type (optional): linear | exponential | logarithmic
- curve_time_s (optional): 0.1–5
- Expression columns (optional, 0–100 each; leave blank when irrelevant to that instrument_type):
harmonic_richness, brightness, vibrato_depth, vibrato_speed, bow_pressure, bow_change_emphasis,
pluck_attack, sustain_emphasis, body_depth, breathiness, swell_emphasis, brilliance, growl, phrase_emphasis,
hammer_hardness, decay_emphasis, detune_spread, punch, percussion_decay, resonance, snap, warmth, motion_emphasis, drift_speed
bow_* → violin, cello | pluck_* / body_depth → guitar, bassGuitar, harp, sitar, ukulele
breathiness / swell_emphasis → flute, clarinet, oboe, bassoon | punch / snap / percussion_decay → drums, tabla, marimba, crashCymbal, glockenspiel
warmth / motion_emphasis / drift_speed → synthPad, tanpura
vibrato_speed = pitch wobble rate (~3–9 Hz), NOT waveform_period_ms (volume swell).
Percussion behavior: pulse triggers short HITS; low% ≈ silence between hits. Melodic layers swell between low% and high%.
MUSICAL AUTHORING (preferred for melodies, chords, AI — compiles to frequency_hz on import):
- note: Western pitch — C4, F#5, Bb3 (instead of frequency_hz). Optional scale snaps note to scale tones.
- chord: Cmaj, Am, G7, Csus4 — one row expands to one layer per chord tone (same timing/preset).
- scale: major | minor | yaman | bhairavi | pentatonic_major — use with note or scale_degree.
- root_note: scale/chord root (default C4).
- scale_degree: 1–7 with scale + octave (instead of note).
- preset: bassoon_legato, cello_legato, crash_cymbal, flute_legato, glockenspiel_hit, kick_standard, oboe_legato, pad_warm, piano_legato, sitar_solo, tabla_fast, tabla_slow, tabla_treble_fast, tanpura_drone, ukulele_pluck, violin_legato, violin_staccato, violin_tremolo — fills waveform/expression defaults; leave those columns blank.
- duration_s: with start_time_s sets end_time_s when end is blank.
- velocity: 0–100 loudness if high_intensity_percent omitted.
- Musical rows: fill instrument_type, start_time_s, note OR chord OR scale_degree, preset, duration_s/velocity — leave frequency_hz and waveform columns blank.
- Expert rows: frequency_hz + waveform columns still work (override musical columns if both set).
STRUCTURE & MOTIFS (optional — compile before note/chord rows):
- section + section_duration_s: structure row (no instrument) — defines intro/build/peak lengths in CSV order.
- section + offset_s on content rows: auto-sets start_time_s / end_time_s within that section.
- motif: ascending_phrase | descending_phrase | ascending_taan | descending_taan | question | answer | arpeggio_up | arpeggio_down | yaman_swell — one row expands to many notes.
- motif_repeat: 1–8 (default 1). motif_variation: 0–100 timing/velocity drift per motif note.
- humanize: 0–100 subtle timing/dynamics/vibrato jitter on any row.
- Prefer structure rows + motifs for longer pieces; use start_time_s directly for short sketches.
PHASE 3 (optional — musician-friendly metadata & compile helpers):
- layer_role: melody | counter_melody | harmony | bass | drone | rhythm | accent | solo | pad — stored on layer for UI grouping (no audio effect).
- energy: 0–100 — maps to velocity, high/low intensity, attack, brightness when those columns were blank in the CSV row.
- harmony: third | fifth | octave — on a single-note row, adds one extra editable layer at that interval.
- portamento_ms: 0–500 — pitch glide at note start (violin, cello, sitar, flute, clarinet, oboe, bassoon).
- instrument_group: strings_high | strings_mid | strings_low — expands to multiple editable string layers.
- rhythm_pattern: keherwa | dadra | teental — expands to editable tabla_bass + tabla_treble layers.
- bow_stroke: down | up — violin/cello stroke start (blank = auto from notes_per_bow).
- notes_per_bow: 1–8 — violin/cello auto bow reversal (default 3 violin, 2 cello).
- breath_group: 2–16 — winds/brass breath swell grouping (default 4–6).
- articulation: legato | staccato | marcato | tenuto | spiccato — phrase overlap & note shape.
- strum_spread_ms: 0–80 — plucked chord stagger in ms.
- layer_name: optional short label (A, AA, AB, BA, …) — rows that belong together share the same name; for violin down+up pairs use two rows with same layer_name and same start_time_s/end_time_s, bow_stroke down/up.
- instrument_instance: optional short id (violin_melody, drum_kit, …) — group layers by logical part in UI; beds can run 0→end while melody uses shorter overlapping windows.
- All helpers expand to normal layers users can edit, duplicate, or delete after import.